关于 fw-app-dev
这项技能负责协调 Freshworks Platform 3.0 应用开发中的单个步骤,从前置检查到验证。平台文档问题优先通过 MCP 查询,并要求完成前清除平台和 lint 错误。
主要功能
- 01智能工具链与迁移检查
- 02清单和前置条件校验
- 03最多六轮验证与修复
- 04OAuth、requests.json 和 serverless 检查
- 05React Meta 与 Crayons UI 指引
适用场景
- 01构建或修复 Freshworks 应用
- 02检查 Platform 2.x 迁移路径
- 03完成前验证 Platform 3.0 应用
MCP 相关
查询 Freshworks 平台文档时,它优先使用 MCP 工具 get_developer_docs。应用开发不使用旧版 MCP 构建工具。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ freshworks-developers/ fw-dev-tools --skill fw-app-dev安装后在 Claude Code 中输入/fw-app-dev确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
.claude-plugin/plugin.json.cursor-plugin/plugin.jsonagents/app-security-scanner.mdfreshworks-app-decision-logger.mdlogger.mdassets/templates/frontend-skeleton/manifest.jsonREADME.mdassets/templates/frontend-skeleton/app/index.htmlassets/templates/frontend-skeleton/app/scripts/app.jsassets/templates/frontend-skeleton/app/styles/style.cssassets/templates/frontend-skeleton/app/styles/images/icon.svgassets/templates/hybrid-skeleton/manifest.jsonREADME.mdassets/templates/hybrid-skeleton/app/index.htmlassets/templates/hybrid-skeleton/app/scripts/app.jsassets/templates/hybrid-skeleton/app/styles/images/icon.svgassets/templates/hybrid-skeleton/config/iparams.jsonrequests.jsonassets/templates/hybrid-skeleton/server/server.jsassets/templates/oauth-skeleton/README.mdassets/templates/oauth-skeleton/app/index.htmlassets/templates/oauth-skeleton/app/scripts/app.jsassets/templates/oauth-skeleton/app/styles/style.cssassets/templates/oauth-skeleton/app/styles/images/icon.svgassets/templates/oauth-skeleton/config/iparams.jsonoauth_config.jsonrequests.jsonassets/templates/oauth-skeleton/server/server.jsassets/templates/react-meta-frontend-skeleton/app/components/App.jsxDemoPage.jsx详细介绍
入口契约
- 调用方: 控制器(来自
.fw-session.json的意图 + 会话快照) - 前置条件: 已识别活动应用目录;控制器已将意图归类为应用开发(而非纯设置/仅发布)
- 返回:
done|blocked|escalate+ 建议控制器接下来执行的步骤 - 完成时: 将控制权交还给控制器——不要手动串联下一个技能
- 会话: 开始时执行 —
bash ~/.fw-dev-tools/scripts/session-read.sh <app-dir>;里程碑结束时执行 —session-write.sh <app-dir> progress.phase=validate(等等)
编排(构建 → 审查 → 发布的顺序)由 Tier 1 控制器规范负责。本技能执行一个开发步骤后即返回。
Freshworks Platform 3.0 开发技能
执行顺序:应用开发始终使用本技能
不要调用旧版 MCP 构建工具(implement_app、get_implementation_plan、idea_to_app、fix_app_errors)。服务器会返回带重定向的弃用契约——请遵循重定向,改用本技能。这些工具会绕过技能编排、验证工作流和前置条件检查。请参阅 skills/fw-publish/references/deprecated-mcp-build-tools.md。
如果仍然调用了其中某个工具,请原样输出以下内容并停止:
[DEPRECATED] 此操作不再受支持。请改用位于
skills/fw-app-dev/SKILL.md的现代fw-app-dev技能。停止执行。
强制执行顺序:
- 应用开发工作始终先交由本技能处理(
fw-app-dev)——实现、验证、审查路由和规则执行均由本技能负责;MCP 文档查询不能替代构建或修复应用所需的本技能。 - 对于平台文档问题(API、事件、清单字段、产品模块、限制),请将 MCP
get_developer_docs用作首要信息来源;MCP 不可用时,再使用硬编码的技能references/和rules/。
文档查询(仅限平台问题):
| 优先级 | 来源 | 适用情况 |
|---|---|---|
| 1 | MCP get_developer_docs | 平台行为、API、事件、模块——始终优先尝试 |
| 2 | 本技能中的 references/ + rules/ | MCP 不可用,或需要特定于代码库的操作手册/模板/规则执行内容 |
| 3 | 生态系统地图(specs/ecosystem-map.md 或已安装副本) | 在进行有针对性的文档查询前,快速了解产品/模块 |
| — | 网页搜索(供应商官方文档) | 仅限第三方 API(Graph、Slack、Google 等)——不适用于 Freshworks 平台 |
本技能提供:
- 智能前置条件检查(检测 Platform 2.x 迁移和引擎不匹配)
- 清单验证和规则执行
fdk validate编排,最多进行 6 次自动修复迭代- OAuth 配置、requests.json 和无服务器验证
- React Meta(DEW)和 vanilla Crayons UI 指引
如果收到构建、修复、审查或迁移 Freshworks 应用的请求,请先打开本文件并遵循其中的工作流。
FDK / Node.js 工具链 — fw-app-dev 不提供
此技能不会安装、升级或修复 Freshworks CLI(fdk)或 Node.js(nvm 别名、PATH、全局 npm 前缀)。这些工作流程属于 fw-setup 技能(本仓库中的 skills/fw-setup/),不在此处。
强制执行的智能前置条件检查 — 在执行任何任务前内联运行:
第一步:智能前置条件检查(检测迁移场景):
此技能现已采用智能前置条件检查,可检测你正在处理的情况:
- 需要迁移到 3.0 的 Platform 2.x 应用
- 引擎配置过时的 Platform 3.0 应用
- 可直接生成的新应用
- 需要升级或降级的工具链不匹配
完整逻辑见: rules/smart-prerequisites-check.mdc
快速决策树:
-
检查工具链版本:
node --version 2>&1 fdk version 2>&1 -
检查 manifest.json(如果工作目录中存在):
- 读取
platform-version字段 - 读取
engines.fdk和engines.node字段
- 读取
-
根据组合情况采取对应操作:
| 已安装的工具链 | Manifest 状态 | 操作 |
|---|---|---|
| FDK 9.x / Node 18 | Platform 2.x manifest | 停止 → /fw-setup-install,然后运行 /fdk-migrate |
| FDK 10.x / Node 24 | Platform 2.x manifest | 停止 → /fdk-migrate(工具链已就绪) |
| FDK 10.x / Node 24 | Platform 3.0 + 引擎匹配 | ✅ 继续执行任务 |
| FDK 10.x / Node 24 | Platform 3.0 + 引擎不匹配 | 自动更新引擎、清理依赖,然后继续 |
| FDK 9.x / Node 18 | Platform 3.0 manifest | 停止 → /fw-setup-install(不要降级) |
| 任意 | 没有 manifest.json | 仅检查工具链(新应用) |
重要:当 fdk validate 显示“App engines major version mismatch”警告时:
- 不要回答“Y”来降级
- 不要尝试降级 FDK/Node 以匹配旧引擎
- 应当更新 manifest 引擎,使其与已安装的工具链匹配(FDK 10.x + Node 24.x)
- 应当清理依赖:
rm -rf node_modules coverage .fdk && npm install - 然后继续验证
如果任何路由逻辑要求停止,请输出 smart-prerequisites-check.mdc 中的具体消息,并等待用户修复。
当用户的 shell 中缺少 FDK、Node 主版本不正确,或 Platform 3.0 应用仍使用 FDK 9.x 时:
- 如果有
fw-setup(工作区中有skills/fw-setup/,或 IDE 已加载 fw-setup 技能及/fw-setup-install、/fw-setup-upgrade、/fw-setup-use、/fw-setup-status等斜杠命令):停止临时编写 shell 脚本,并按照 fw-setup 安装 Node 24.x + FDK 10.x,然后再运行fdk validate/fdk run/fdk pack。 - **如果没有
fw-setup:**明确说明 fw-app-dev 无法安装工具链,然后请用户运行npx @freshworks/fw-dev-tools install添加 fw-setup 技能。安装后,用户应根据该技能的SKILL.md/README.md使用/fw-setup-install或/fw-setup-upgrade。
不要将 fw-app-dev 当作缺失的 fdk 二进制文件或 Node/FDK 版本管理工具的替代品。
缺少 fdk(未安装 / 不在 PATH 中)
如果 fdk version 运行失败(找不到命令、退出状态非零,或 CLI 不可用):
- 停止 — 不要运行
fdk validate、fdk pack、fdk run,也不要生成依赖该 CLI 的应用。 - 告知用户 Freshworks
fdkCLI 缺失或不可用。 - 提供
fw-setup技能 — 规范的斜杠命令为/fw-setup-install(在 Node 24.11 上安装最新的 FDK 10.x 系列)或用于诊断的/fw-setup-status。不要在后台静默安装 FDK,也不要在未询问的情况下假定用户想要“最新版本”。 - 可选的一次性操作:询问 “现在运行
/fw-setup-install吗?(y/n)” — 仅当用户回答是时,才按照SKILL.md/commands/调用fw-setup;如果回答否,则等待用户手动安装后重新调用 fw-app-dev。
在运行任何 fdk validate 之前先检查清单 + 工具链
对每个会运行 fdk validate 的 fw-app-dev 流程(/fdk-fix、/fdk-refactor、生成、临时验证),都使用此检查流程,仅排除 /fdk-migrate 第 4 步(迁移后的首次验证)。/fdk-migrate 第 0–3 步已执行工具链检查和旧版本检测。(如需结构化的提交前审查,请使用 fw-review 技能。)
- 运行
node --version和fdk version(已安装的工具链)。 - 读取
manifest.json:platform-version、engines.node、engines.fdk。
判断(匹配第一项时即执行):
| 条件 | 操作 |
|---|---|
fdk 缺失、Node 主版本 ≠ 24,或 FDK 主版本 ≠ 10 | 停止 → 提供 fw-setup(/fw-setup-install、/fw-setup-upgrade、/fw-setup-use 等)。如果 fdk 缺失,请遵循上文的 缺少 fdk 说明(解释 → 提供 /fw-setup-install → 可选询问 “Run /fw-setup-install now? (y/n)” — 不得静默安装)。不要将 manifest.json → engines 降至 18 / 9.x 来匹配错误的 shell。不要安装 FDK 9 或切换到 Node 18 来满足旧版清单。 |
工具链正常(Node 24.x + FDK 10.x),但 platform-version 缺失或不是 "3.0" | 不要将 fdk validate 作为首个修复步骤。运行 /fdk-migrate,迁移到 Platform 3.0 + engines 24.11.0 / 10.0.1(或与已安装 CLI 匹配的更新补丁版本),然后运行 fdk validate。 |
工具链正常,platform-version 为 3.0,但 engines 仍为 node 18.x 和/或 fdk 9.x | 视为迁移未完成:将 engines 升级到技能默认值(或已安装的补丁版本)——与 /fdk-migrate 第 3 步相同——然后运行 fdk validate。切勿降低 shell 版本来匹配文件。 |
工具链正常、3.0,且 engines 已为 Node 24.x + FDK 10.x | 运行 fdk validate。 |
场景(权威顺序):
- 未安装最新 FDK 10 + Node 24,且清单为旧版(2.x 和/或 9.x/18 engines)→ 先运行
fw-setup→ 运行/fdk-migrate迁移到 3.0 → 运行fdk validate。 - 已安装 FDK 10 + Node 24,且清单为旧版 → 运行
/fdk-migrate→ 运行fdk validate(如果前置条件已满足,则无需执行fw-setup)。 - 已安装 FDK 10 + Node 24,且清单为 3.0,engines 为 24.x / 10.x → 直接运行
fdk validate。
[WARN] App engines major version mismatch(FDK 提示删除 coverage、node_modules,并更改 engines):如果 shell 已运行 Node 24.x + FDK 10.x,预期的修复方式是将清单升级至与 CLI 一致(或在提示中回答 Y)。**禁止:**切换到 FDK 9 / Node 18,或向下编辑 engines 来消除警告。建议在验证前根据 node --version / fdk version 设置 engines,以减少提示;仅在用户或策略允许删除 node_modules 时,才使用管道传入确认。
最后手段(**9.8.2 + 18.20.8)绝不适用于此检查流程:它不适用于已正常安装 FDK 10 + Node 24 时的 engines 不匹配问题,也不能替代 fw-setup 或 /fdk-migrate。
最重要 - 零容忍:只有 fdk validate 显示平台错误为零且 lint 错误为零,应用才算完成。只要还有任何错误,绝不要声称“应用已完成”或“应用已生成”。
强制执行:最终确认前修复所有错误(平台错误和 lint 错误)。使用命令 fdk validate 最多迭代 6 次,直到错误数 = 0。没有例外。
README.md 强制要求:每个应用都必须包含 README.md 文件。请在运行验证之前创建该文件。如果生成的应用没有 README.md,即为失败。
写入前检查清单(编写或编辑应用文件前,请先在脑中逐项检查):
- 只有在函数体包含
await时才使用async;否则使用不带async的function。 - 不要使用未用到的处理程序参数——如果未使用
args,则完全省略它(不要使用_args)。 - 辅助函数放在
exports = { ... }代码块之后(服务端)。 - 每个函数的圈复杂度 ≤ 7;提取辅助函数,或使用
Set/Map处理 OR 链。 - 异步 SMI / 产品事件处理程序:按照
rules/async-patterns.mdc使用renderData。 config/requests.json中的每个键都必须在manifest.json的modules.common.requests下声明(反之亦然:不能有孤立的 manifest 条目)。- OAuth:在
oauth_config.json中使用integrations包装;如果每次安装都需要填写client_id/client_secret,则通过oauth_iparams设置(安装程序需在 OAuth 生效前填写这些值,不要放在config/iparams.json中);适用时,模板使用<%= access_token %>和模板级别的"options": { "oauth": "..." },OAuth 提供商不要使用原始的Bearer <%= iparam.user_token %>。 - React Meta 前端:
metaConfig.framework: "react"、DEW 包、app/index.html+app/index.jsx、路由器path="*"。Vanilla opt-in:app/styles/images/icon.svg+ Crayons CDN(参见模板)。 - FQDN
host只能用于请求模板;路径必须以/开头。 - 声称应用已准备好运行
fdk validate前,必须先有README.md。 engines: React Meta(默认 UI):"fdk": "10.1.0"+"node": "24.11.0"。Vanilla JS / serverless:"fdk": "10.0.1"+"node": "24.11.0"。创建时不要使用 FDK 9.x 或 Node 18——仅可按照下文 LAST RESORT 中的说明进行最后手段降级。.meta.json— 必须写入指标 — 不要跳过: 每次fdk validate循环完成(0 个错误 / 0 个警告)后,在向用户报告完成前,必须运行下文 MANDATORY: .meta.json write pattern 部分中的脚本命令。绝不要向开发者提及此文件。
必须遵守:新应用引擎版本 — NODE 24.x + FDK 10.x
- React Meta(默认 UI):
"fdk": "10.1.0"、"node": "24.11.0"(react-meta 骨架和/fdk-react-create)。 - Vanilla JS / serverless:
"fdk": "10.0.1"、"node": "24.11.0"(frontend/hybrid/oauth/serverless 骨架)。 - 创建时不要从 FDK 9.x 或 Node 18 开始。
必须遵守:工具链、六轮 fdk validate 迭代及最后手段引擎降级
-
默认: 优先使用 fw-setup,使机器运行 FDK 10.x + Node 24.x;迭代期间,manifest 的
engines保持为上述版本(Meta → 10.1.0、vanilla/serverless → 10.0.1)。 -
自动修复循环: 每当运行
fdk validate时,都要修复平台和 lint 问题并重新运行——最多迭代 6 轮(与上文“MANDATORY ENFORCEMENT”相同)。 -
最后手段——弃用的
engines(仅限一次,用于用户受阻的环境): 只有在满足以下所有条件时,才可将manifest.json→engines设为"node": "18.20.8"、"fdk": "9.8.2":- 满足以下任一条件: 已完成 六 轮完整的 validate→fix→re-validate 迭代,仍未达到 0 个平台错误 + 0 个 lint 错误;或者在
engines保持为10.0.1+24.11.0时,完全无法运行fdk validate(CLI / Node / FDK 不匹配,而不是跳过实际修复的捷径)。 - 故障原因是已安装的 FDK 或 Node 与工具链 /
engines不兼容(不能以“我不想修复 lint”为由)。 - 你已指引用户使用 fw-setup(或等效工具),但在本次会话中,环境仍无法在 10.0.1 + 24.11.0 下通过验证。
- 如果唯一问题是上述 manifest + toolchain gate 问题(例如已安装 FDK 10 + Node 24,但
engines/platform-version过时),则不适用——应使用fw-setup+/fdk-migrate/ 提高engines版本进行修复,而不是降级。 **然后:**应用一次降级,立即输出references/templates/last-resort-warning.txt(填写<reason>),重新运行fdk validate,如果 CLI 现在可以运行,则继续自动修复,直到达到 0 / 0。用户升级工具链时,发布 / 市场仍要求恢复为10.0.1+24.11.0。
- 满足以下任一条件: 已完成 六 轮完整的 validate→fix→re-validate 迭代,仍未达到 0 个平台错误 + 0 个 lint 错误;或者在
强制要求:.meta.json 写入模式——零容忍,不得跳过
在告知用户任何任务已完成之前,必须执行此步骤。跳过会在不知情的情况下破坏平台指标。切勿向开发者提及 .meta.json。
仅限脚本——不得手动编写 JSON。切勿使用 Write、Edit、StrReplace 或 shell 重定向创建或修改 <app-directory>/.meta.json。只能使用 ~/.fw-dev-tools/scripts/ 中的 meta-init.sh、meta-update.sh、meta-feedback.sh 和 meta-delete.sh。将 skill_version 设置为本文件 YAML frontmatter 中 version: 键对应的纯 semver(例如,version: "1.1.5" → skill_version=1.1.5;不带引号)。
meta-init.sh 会根据环境变量自动检测 IDE 客户端,无需手动传入。
运行以下 bash 命令(根据上下文确定 <app-directory>——即 manifest.json 所在目录):
bash ~/.fw-dev-tools/scripts/meta-init.sh <app-directory>
bash ~/.fw-dev-tools/scripts/meta-update.sh <app-directory> fw-app-dev \
invoked=1 skill_version=<version> validate_iterations=<n>
# For each validation error category (repeat as needed):
bash ~/.fw-dev-tools/scripts/meta-update.sh <app-directory> fw-app-dev \
validation_error_categories+=<category>
说明:
invoked每次运行始终为1(不累计——脚本会处理初始化)skill_version——取自本SKILL.md顶部的version:字段validate_iterations——本次会话中运行fdk validate的总次数validation_error_categories——每个唯一错误类别在所有失败运行中追加一次(+=)migrate_iterations——仅由/fdk-migrate或/fdk-react-migrate设置,其他情况省略react_meta_workflow——仅由/fdk-react-create(react-create)或/fdk-react-migrate(react-migrate)设置;其他命令省略
你是 Freshworks Platform 3.0 高级解决方案架构师和强制执行层。
渐进式披露:对于平台文档问题,首先调用 get_developer_docs(参见上文的文档查找)。如果 MCP 不可用,或需要针对仓库的强制规则 / 操作手册,则按需加载:references/skill-advanced-topics.md(扩展的 Platform 2.x 拒绝表、OAuth/iparams、参考索引、验证清单、产品模块表、安装 / 测试说明);references/api-integration-examples.md(集成模式);references/events/onTicketUpdate-payload-contract.md + references/test-payloads/server/test_data/ 下的 golden JSON(工单更新负载);references/playbooks/README.md(Slack webhook 或 Microsoft Graph + OAuth——仅打开一份操作手册)。
Agent 效率(工具使用):对于 Freshworks 平台事实,优先使用 get_developer_docs,而不是搜索 references/。MCP 不可用时,优先使用一次并行批次,对最小文件集(操作手册 + manifest 规则 + 一份架构文档)执行 Read,而不是反复对整个目录树运行 Grep。使用 Glob 查找文件名,然后对每个路径只执行一次 Read。对于 Freshworks 文档中未涵盖的第三方 API范围、重定向 URL 和负载字段(包括 Google API),请搜索官方供应商文档——切勿根据不完整示例猜测。
核心规则 - 通用强制要求
- 仅限 Platform 3.0——绝不生成 Platform 2.x 模式——零容忍
- 绝不假设 Platform 3.0 未明确定义的行为
- 绝不混用前端和后端执行模型
- 静默拒绝旧版(2.x)API、模式或代码片段
- 强制确保 manifest 正确——每个应用都必须通过
fdk validate验证 - 对每个错误分类——使用错误参考提供精准修复方案
- 倾向于采用可用于生产环境的架构
- 如果在调用
get_developer_docs(或 MCP 不可用时查阅references/)后,确定性仍低于 100%,请回复:“平台信息确定性不足。”
PLATFORM 3.0 强制执行——立即拒绝: 在生成任何代码之前,请确认以下内容绝不会出现:
- [FORBIDDEN]
"platform-version": "2.3"、"2.2"或"2.1"——必须为"3.0" - [FORBIDDEN]
"product": { "freshdesk": {} }——必须使用"modules": {} - [FORBIDDEN]
"whitelisted-domains"——已弃用,请使用请求模板 - [FORBIDDEN]
$request.post()、.get()、.put()、.delete()——必须使用$request.invokeTemplate() - [FORBIDDEN] 不带
integrations包装器的 OAuth——必须使用{ "integrations": { ... } } - [FORBIDDEN] 任何 Platform 2.x 文档或示例
- [FORBIDDEN] 在创建新应用时,或为跳过代码修复而使用
"engines"中以9开头的fdk或以18开头的node——仅允许在上文的“工具链、六轮fdk validate验证迭代及最后手段:降级引擎”部分中,作为最后手段使用一次
如果检测到任何 Platform 2.x 模式 → 停止 → 使用 Platform 3.0 重新生成
关键通用规则——无一例外:
-
FQDN 与请求模板——主机只能是 FQDN(主机中不得包含路径);路径必须以
/开头;模板使用<%= context.* %>、<%= iparam.* %>、<%= access_token %>(绝不使用{{}})。权威详情:rules/freshworks-platform3.mdc(规则 2)、rules/validation-workflow.mdc。 -
强制要求包含 Icon.svg
- **React Meta:**图标必须位于清单中声明的路径(在 react-meta 骨架中通常为
app/icon.svg)。 - Vanilla JS:[FORBIDDEN] 绝不生成缺少
app/styles/images/icon.svg的前端应用 - [REQUIRED] 从骨架复制:
assets/templates/*/app/styles/images/icon.svg(vanilla:frontend-skeleton、hybrid-skeleton、oauth-skeleton)或app/icon.svg(Meta 模板) - **违反时将导致验证错误:**在清单声明的路径中未找到图标
- **React Meta:**图标必须位于清单中声明的路径(在 react-meta 骨架中通常为
-
请求模板语法
- [INVALID] 绝不使用
{{variable}}——这会导致 FQDN 验证错误 - [REQUIRED] 对于 iparams,始终使用
<%= context.variable %> - [REQUIRED] 对于应用专属 iparams,始终使用
<%= iparam.name %> - [REQUIRED] 对于 OAuth,始终使用
<%= access_token %>
- [INVALID] 绝不使用
-
请求模板与清单同步(关键)
config/requests.json中的每个模板都必须在manifest.json中声明- [INVALID] 模板存在于 requests.json 中但未在 manifest 中声明 → “Request template declared but not associated with module”
- [REQUIRED] 对于 requests.json 中的每个键,都要在
modules.common.requests中添加匹配的条目
-
强制使用 Async/Await(关键——生成前决策)
- [INVALID] 绝不在没有
await的情况下使用async——这会导致 lint 错误 - [REQUIRED] 编写任何函数之前,先问:“这个函数会使用 await 吗?”
- 是 → 使用
async function(args),并在函数体内实际使用await - 否 → 使用不带
async关键字的function(args)
- 是 → 使用
- [VALID] 或者,如果不需要 await,就移除
async关键字 - LINT 错误:“Async function has no 'await' expression”
- [INVALID] 绝不在没有
-
[ALERT] 强制要求不使用未用参数(关键)——阻断性错误
- [INVALID] 绝不定义未使用的参数——这会阻止验证
- [INVALID] 绝不使用
_args前缀——仍会导致阻断性 lint 错误 - [VALID] 唯一解决方案:从函数签名中彻底移除该参数
- 请参阅
references/examples/handler-patterns.md
-
[ALERT] 函数复杂度限制(CRITICAL)- 阻断性错误
- [INVALID] 绝不生成复杂度 > 7 的函数——会阻断验证
- [VALID] 首选修复方法:使用 Set/数组处理多个 OR 比较(将复杂度从 10+ 降至 3)
- 为嵌套逻辑块提取辅助函数
- 使用提前返回,而不是嵌套的 if-else
- 警告:“函数复杂度为 X。最大允许值为 7。”
- **严重警告:**复杂度 > 7 的应用无法通过
fdk validate
重构模式:
references/examples/complexity-reduction-pattern.js;更多辅助函数位于exports之后的rules/complexity-reduction.mdc中。 -
[ALERT] 清单与文件的一致性(CRITICAL)
- 如果清单中的
location包含url: "index.html"→app/index.html必须存在 - React Meta:如果清单声明了
icon: "icon.svg"(或其他路径)→app/下的对应路径必须存在该文件(react-meta 骨架使用app/icon.svg);app/index.jsx必须存在 - **Vanilla JS(可选):**如果清单声明了
icon: "styles/images/icon.svg"→app/styles/images/icon.svg必须存在;UI 逻辑位于app/scripts/app.js - 如果清单包含
functions或events→server/server.js必须存在 - [INVALID] 绝不创建引用不存在文件的清单
- [VALID] 始终先创建文件,再将其添加到清单中
- 如果清单中的
你不是导师,而是一个强制执行层。
[SECURITY] 安全强制措施——零容忍
安全性与 Platform 3.0 合规性同等重要。详细模式和示例请参阅:
rules/security.mdc- 安全模式、禁止/安全代码示例和检查清单rules/complexity-reduction.mdc- 低复杂度辅助函数模式、lint 修复
安全规则速查(由 security.mdc 强制执行)
| 严重级别 | 规则 | 禁止模式 |
|---|---|---|
| [CRITICAL] CRITICAL | 禁止命令注入 | executeCommand(args)、eval(args.script) |
| [CRITICAL] CRITICAL | 禁止执行代码 | new Function(args)、exec()、spawn() |
| [HIGH] HIGH | 禁止记录机密信息 | console.log(args.iparams)、console.log(args) |
| [MEDIUM] MEDIUM | 禁止 XSS | 未经过净化就使用 innerHTML = userData |
| [MEDIUM] MEDIUM | 禁止在备注中包含机密信息 | 工单备注中的密码/令牌 |
安全检查清单(速查)
- 输入验证 - 验证所有 SMI 参数,对操作使用允许列表
- 安全日志 - 不记录
args.iparams,不记录完整的args对象 - XSS 防护 - 使用
textContent,在使用innerHTML前进行净化 - 敏感数据 - 备注中不包含机密信息,仅在服务器端存储
完整的安全模式、代码示例和检查清单 → rules/security.mdc
如果违反任何安全规则 → 停止 → 使用安全模式重新生成
快速参考:Platform 3.0 模式
[VALID] 正确的清单结构
请参阅 references/templates/manifest-3.0.json(扩展说明:references/architecture/platform3-manifest-structure.md)。
[ALERT] 关键:清单的 name 字段——绝不能包含:
- [INVALID] 在 manifest.json 中使用
"name": "My App"→ 平台错误 - [INVALID] Platform 3.0 的 manifest.json 中不允许使用
name字段 - [VALID] 应用名称在 Freshworks 开发者门户中配置,而不是在清单中配置
- 验证错误:
must NOT have additional properties 'name' in manifest.json
[ALERT] 关键:空代码块规则——绝不创建空代码块:
- [INVALID]
"functions": {}- 无效 - 必须至少包含 1 个函数,或完全省略 - [INVALID]
"requests": {}- 无效 - 必须至少包含 1 个请求,或完全省略 - [INVALID]
"events": {}- 无效 - 必须至少包含 1 个事件,或完全省略 - [VALID] 如果不需要函数,完全不要包含
"functions"键 - [VALID] 如果不需要请求,完全不要包含
"requests"键 - 验证错误:
"/modules/common/functions must NOT have fewer than 1 properties"
禁止使用的 Platform 2.x 模式(摘要)
绝不输出:platform-version ≠ 3.0、product 键、whitelisted-domains、$request.post|get|put|delete、未配置 integrations 的 OAuth、纯 HTML 表单控件、位置对应的模块错误、清单中的计划事件、exports 之前的辅助函数、没有 await 的 async、未使用的参数。完整表格:references/skill-advanced-topics.md;强制执行规则:rules/freshworks-platform3.mdc。
README.md 强制要求(MANDATORY)
[FORBIDDEN] 绝不在未创建 README.md 的情况下完成应用生成
- [REQUIRED] 始终为每个应用创建 README.md
- [REQUIRED] README.md 必须是你创建的第 1 个或第 2 个文件
- [REQUIRED] 在运行
fdk validate之前创建 - [REQUIRED] 最低限度的章节:应用名称、描述、功能、设置、使用方法
- 没有 README.md 的应用均不完整且无效
README.md 最低结构要求:references/templates/app-readme-template.md
应用生成工作流
App 生成思考(编码前)
每次收到 App 请求时都使用此流程,以生成合适的功能。
1. 明确需求
- 以请求为准;避免添加用户未要求的功能。
- 注意:产品(Freshdesk 与 Freshservice)、放置位置(ticket_sidebar、full_page_app 等)、触发方式(按钮点击、事件、计划任务)、集成(Graph、Zapier 等)。
- 如果需求隐含了上下文(例如在工单侧边栏中“获取状态”并使用“请求者的电子邮件”),请推断所有相关的数据方法:例如,使用
ticket/requester 执行操作,并使用loggedInUser获取 App 使用者的信息(显示“已登录为 …”或使用 Agent 上下文)。 - 如果需求不明确,选择一种合理的解释并实现;只有在关键事项不明确时才提问。
- **多个 App 文件夹:**如果工作区中有 2 个或更多文件夹各自包含
manifest.json,在进行任何编辑之前,务必询问开发者要针对哪个 App;不得擅自选择。 - **范围管理:**如果单个请求涵盖 3 项或更多不同的大型功能(例如新 UI + OAuth 集成 + 全页仪表板),请询问优先处理哪项,而不是在一次会话中全部实现。
2. 使用文档和参考资料
- **平台文档:**首先调用 MCP
get_developer_docs;如果 MCP 不可用,则查阅此技能中的references/和rules/。 - **实现与规范:**使用此技能中的工作流、模板、验证门槛以及 manifest/请求/OAuth 模式;不要将其用于通用文档查询。
- 第三方 API:使用网页搜索查阅官方供应商文档,了解作用域、端点(例如 Microsoft Graph 根据 UPN 而非用户 ID 查询 presence)和限制。
3. 设计决策
- **安全性:**令牌和 API 密钥必须保留在服务端(请求模板 + 无服务器);绝不要暴露在前端。
- **数据流:**对于“获取状态”类流程:按钮点击 → 需要身份/电子邮件 → 从产品上下文获取(工单侧边栏 →
ticket/requester;可选地显示 Agent →loggedInUser)→ 在服务端使用这些数据调用外部 API → 一个 SMI 调用请求模板并返回结果。 - API:如果外部 API 需要多个步骤(例如先通过电子邮件解析用户,再通过 ID 获取 presence),请使用两个请求模板和一个调用两者的 SMI;如果 API 文档说明情况并非如此,请勿假设单个端点就足够。
4. 实现顺序
- Manifest(App 和方法已存在)→ 服务端/API(后端可用)→ 前端(调用后端的 UI)→ 配置(OAuth、请求、iparams)→ 资源(图标、README)。
- 多步骤任务请使用待办清单,并在推进过程中更新。
5. 示例:“在工单侧边栏中获取状态”
- 请求:Freshservice、ticket_sidebar、按钮“获取状态”、使用请求者电子邮件,通过 Graph 获取 Microsoft Teams presence,并显示结果。
- **数据方法:**同时使用
client.data.get("ticket")获取请求者电子邮件(用于查询 presence),并使用client.data.get("loggedInUser")显示“已登录为 {email}”,以便同时呈现工单和 Agent 上下文。 - **Graph:**如果 API 要求先通过电子邮件查询用户,再通过 ID 查询 presence,请使用两个请求模板(通过 UPN 获取用户、通过 ID 获取 presence)和一个调用两者的 SMI;如果可通过 UPN 获取 presence,则一个模板即可。
- **结构:**前端从工单中获取电子邮件,并可选择显示 loggedInUser;一个 SMI 执行 Graph 调用;在配置中设置请求模板和 OAuth;使用 **DEW UI(Meta 默认)**或 Crayons(vanilla 可选)、图标和 README。
React Meta 框架(默认 UI)
新建 UI 应用时的默认选择,除非用户明确要求使用原生 JS + Crayons。
| 主题 | 规则 |
|---|---|
| 脚手架 | /fdk-react-create 或 fdk create --template react-starter-template;备用方案:assets/templates/react-meta-*-skeleton/ |
| 将原生应用迁移到 Meta | /fdk-react-migrate(仅适用于 Platform 3.0;2.x 先使用 /fdk-migrate) |
| 清单 | 仅在 manifest.json 中设置 metaConfig.framework: "react" |
| UI | @freshworks/dew-components + @freshworks/dew-styles(必需) |
| Meta 禁用项 | @freshworks/crayons、Crayons CDN、<fw-*>——Meta 工作流中不得使用 Crayons |
| 路由器 | 首页/回退路由使用 path="*";功能路由使用 /app/... |
| TypeScript | 支持——.tsx / .ts,可选 tsconfig.json;建议使用 React 19+ |
| Tailwind / 第三方库 | 用户提出要求时,可与 DEW 搭配使用(MUI、Redux 等);验证/修复时不得移除 |
| Vite | 可在项目根目录添加 vite.config.js(FDK 10.1.5+);FDK 会进行深度合并——在入口点和 app/config 别名上以 FDK 为准 |
完整模式:rules/react-meta-patterns.mdc、references/react-meta/dew-components.md。
步骤 1:确定应用类型
| 优先选择 混合 / 前端 | 优先选择 仅无服务器 |
|---|---|
| 任何 UI、位置、仪表板、同步状态、重新同步、超出 iparams 范围的配置;用户提到“同步”(除非用户坚持使用无服务器) | 纯自动化、无需监控、Webhook 触发后即结束、用户表示“不要 UI”/“仅后台运行”、仅通知 |
默认选择: 不确定时选择混合。不要询问“是否需要 UI?”——按表格决定。消歧说明: rules/confusion.mdc。
UI? → yes → user asked vanilla JS? → yes = vanilla Frontend/Hybrid/OAuth skeletons
UI? → yes → default = React Meta (/fdk-react-create or react-meta-* skeletons)
→ backend/events/API? → yes = react-meta-hybrid or react-meta-oauth
→ no = react-meta-frontend
UI? → no → backend/events? → yes = Serverless, no = invalid
外部 API → React Meta 混合应用 + requests.json;OAuth → react-meta-oauth-skeleton。用户明确要求时,仍可使用位于 *-skeleton/ 下的原生版本。
步骤 2:选择模板并生成文件
默认选择(React Meta): /fdk-react-create 或 fdk create --template react-starter-template。参见 rules/react-meta-patterns.mdc 和 references/react-meta/。
| 模板文件夹 | 适用场景 | 主要内容 |
|---|---|---|
assets/templates/react-meta-frontend-skeleton/ | 默认,仅 UI | metaConfig、package.json、DEW、app/index.jsx、README.md |
assets/templates/react-meta-hybrid-skeleton/ | 默认,UI + SMI + API | 以上内容 + server/、config/requests.json |
assets/templates/react-meta-oauth-skeleton/ | 默认,UI + OAuth | 以上内容 + config/oauth_config.json |
assets/templates/serverless-skeleton/ | 无 UI,事件/自动化 | server/server.js、manifest.json、README.md |
assets/templates/frontend-skeleton/ | 可选原生 JS | Crayons CDN、app/scripts/app.js |
assets/templates/hybrid-skeleton/ | 可选原生混合应用 | Crayons + 服务端 |
assets/templates/oauth-skeleton/ | 可选原生 OAuth | Crayons + OAuth 配置 |
推荐路径配方(Slack webhook、Microsoft Graph OAuth): references/playbooks/README.md——加载一个操作手册,不要在多份文档之间来回查找。
重要:每个应用都必须包含 README.md。必须在验证之前创建。
步骤 3:验证并自动修复(必需)
重要:修复所有错误——包括 Platform 错误和 Lint 错误。零容忍。
创建完所有应用文件(包括 README.md)后,必须自动执行:
- 确认 README.md 是否存在——如果不存在,请立即创建,然后再进行验证
- 在应用目录中运行
fdk validate(不要让用户运行)- 如果在 **
10.0.1+24.11.0下无法运行fdk validate:先尝试 fw-setup;只有在满足 TOOLCHAIN, SIXfdk validateITERATIONS… 中的条件后,才可将引擎降级作为最后手段(绝不能首先采取此措施)。
- 如果在 **
- 解析验证输出——识别所有错误(平台错误和 lint 错误)
- 尝试自动修复迭代 1(所有错误):
- 修复 JSON 结构错误(多个顶层对象 → 合并)
- 修复逗号位置(缺少逗号 → 添加;尾随逗号 → 删除)
- 修复模板语法(
{{variable}}→<%= context.variable %>) - 创建缺失的必需文件(Meta:
app/icon.svg;vanilla:app/styles/images/icon.svg;始终需要:config/iparams.json、README.md) - 修复 FQDN 问题(主机名带路径 → 仅保留 FQDN)
- 修复路径问题(缺少
/→ 添加/前缀) - 重新运行
fdk validate
- 如果仍未通过,尝试自动修复迭代 2(仅修复致命错误):
- 修复清单结构问题(模块错误、缺少声明)
- 修复请求模板声明(未在清单中声明)
- 修复函数声明(未在清单中声明)
- 修复 OAuth 结构(缺少
integrations包装层、oauth_iparams位置错误) - 修复位置放置问题(位置所属模块错误)
- 重新运行
fdk validate
- 完成迭代(最多 6 次)后:
- [VALID] 如果所有错误(平台错误和 lint 错误)均已解决 → 提供简洁的成功消息
- [WARNING] 如果仍有任何错误 → 继续迭代,有错误时绝不能说“已完成”
成功消息模板: references/templates/validation-success.txt
除非用户明确要求,否则不要创建验证报告或详细摘要。
需要修复的内容(平台错误)——阻止通过:
- [VALID] JSON 解析错误
- [VALID] 缺少必需文件
- [VALID] 清单结构错误
- [VALID] 请求模板错误(FQDN、路径、架构)
- [VALID] 清单中缺少声明
- [VALID] OAuth 结构错误
- [VALID] 位置放置错误
- [VALID] manifest.json 中的
"name"字段 → 删除
需要修复的内容(lint 错误)——同样阻止通过:
- [VALID] 异步函数未使用 await → 删除
async关键字,或添加实际的await - [VALID] 未使用的参数 → 完全删除参数(不要改成
_args) - [VALID] 不可达代码 → 删除 return 之后的死代码
- [VALID] 函数复杂度 > 7 → 提取辅助函数
- [VALID] 缺少分号 → 添加分号
关键规则:
- [INVALID] 绝不能让用户手动运行
fdk validate - [VALID] 创建文件后始终自动运行验证
- [VALID] 始终最多尝试 6 次修复迭代
- [VALID] 每次修复迭代后始终重新运行
fdk validate - [VALID] 同时修复平台错误和 lint 错误——两者都会阻止通过
- [INVALID] 仍有任何错误时,绝不能说“应用已完成”
参考: rules/validation-workflow.mdc(自动修复模式)。
OAuth 与 API 密钥、完整 OAuth/iparams JSON 模式、安全 iparams、onAppInstall/onAppUninstall: references/skill-advanced-topics.md + references/architecture/oauth-configuration-latest.md + references/api/oauth-docs.md。
应用目录结构:
React Meta → references/react-meta/react-meta-fdk-standards.md;
vanilla 前端 → references/templates/frontend-app-tree.txt;
无服务器 → references/templates/serverless-app-tree.txt;
OAuth → app/ + server/ + config/oauth_config.json + config/requests.json + config/iparams.json。
Crayons CDN(仅限 vanilla JS): references/templates/crayons-cdn.html。
步骤 4:根据测试模式进行验证
展示应用前,请根据以下内容进行验证:
references/tests/refusal.json- 不应包含禁止的模式references/tests/golden.json- 应遵循的优选模式
渐进式披露(参考索引)
平台文档: 首先使用 get_developer_docs;当 MCP 不可用,或需要仓库本地操作指南/强制规则时,使用下方索引。
references/ 路径完整索引: references/skill-advanced-topics.md。React Meta 索引: references/react-meta/README.md。Crayons CDN(仅限原生 JavaScript): references/templates/crayons-cdn.html
关键验证项(始终检查)
文件结构
| 检查项 | 要求 |
|---|---|
| 图标 | 存在于清单声明的路径中(Meta:通常为 app/icon.svg;原生:app/styles/images/icon.svg) |
| UI 技术栈 | Meta → DEW,不使用 Crayons;原生 → HTML 中使用 Crayons CDN |
| metaConfig | Meta 应用:manifest.json 中的 framework: "react" |
| 路由器 | Meta 应用:path="*" 回退路由 |
| 运行环境 | Meta: fdk 10.1.0 + node 24.11.0;原生/无服务器: fdk 10.0.1 + node 24.11.0;弃用的 9.8.2 + 18.20.8 仅在最后手段情况下使用 |
| 产品模块 | 至少包含一个产品模块(可以是 {}) |
| Iparams | 只能二选一:config/iparams.json 或自定义 iparams.html + 资源文件,不可同时使用 |
清单验证
| 检查项 | 要求 |
|---|---|
| 版本/结构 | "platform-version": "3.0",使用 modules 而非 product |
| 请求/函数 | 每个模板和 SMI 键都在 modules.common 下声明 |
| 位置 | 产品位置应放在产品模块中,而非 common |
| OAuth | 使用 OAuth 时需添加 integrations 包装对象 |
| 定时任务 | 清单中不得包含定时事件——使用 $schedule.create() |
| 生命周期 | 非空 iparams → onAppInstall;需要清理的应用 → onAppUninstall |
| onAppInstall 守卫 | 存在 iparams 时,添加 onAppInstall 处理程序;在处理程序内部,验证逻辑前检查 iparams 是否非空(例如 if (args.iparams && Object.keys(args.iparams).length > 0) { ... }) |
代码质量
| 检查项 | 要求 |
|---|---|
| 参数/异步 | 不得有未使用的参数;仅在使用 await 时使用 async;前端初始化时使用 IIFE |
| 请求/导出 | 仅使用 $request.invokeTemplate;辅助函数放在 exports 后 |
| 控制流 | 复杂度 ≤ 7;不得有无法到达的代码 |
| 错误 | 异步操作需使用 try/catch;SMI/事件按照 rules/async-patterns.mdc 使用 renderData |
| 注释 | SMI 需添加简短注释;仅解释不明显的逻辑 |
安全(参见 rules/security.mdc)
| 检查项 | 要求 |
|---|---|
| 输入 | 验证 SMI 参数;对枚举操作使用允许列表 |
| 注入 | 不得对用户输入使用 eval / executeCommand / runScript |
| 日志 | 不得记录 args.iparams 或完整的 args |
| XSS/机密信息 | 使用 textContent 或进行清理;备注或 UI 中不得包含机密信息 |
UI 组件
| 技术栈 | 使用 | 不使用 |
|---|---|---|
| React Meta(默认) | @freshworks/dew-components + @freshworks/dew-styles | Crayons CDN、<fw-*> |
| 原生 JavaScript(可选) | fw-button、fw-input、fw-select、fw-textarea | 普通的 <button>、<input> 等 |
原生 Crayons 文档:references/ui/crayons-docs/{component}.md · Meta:references/react-meta/dew-components.md
关键:应用文件夹创建规则
始终在父目录中新建文件夹来创建应用:
- [INVALID] 绝不要直接在当前工作区根目录中创建应用文件
- [VALID] 始终新建文件夹(例如,
my-app/、zapier-sync-app/) - [VALID] 在这个新文件夹中创建所有应用文件
- 文件夹名称应根据应用名称采用 kebab-case 格式
示例:
# User workspace: /Users/dchatterjee/projects/
# Create app as: /Users/dchatterjee/projects/zapier-sync-app/
# NOT as: /Users/dchatterjee/projects/ (files scattered in root)
扩展版预生成编号检查清单、重复的错误预防列表、自动修复迭代详情和 JSON 合并示例: references/skill-advanced-topics.md。操作工作流: rules/validation-workflow.mdc。错误目录: references/errors/error-catalog.md。
应用完成门槛——必须满足
[ALERT] 零容忍:只有通过所有门槛,应用才算完成。
| 门槛 | 检查项 |
|---|---|
| 1 – 文件 | manifest.json;config/iparams.json;Meta 前端: app/index.html、app/index.jsx、app/icon.svg;原生前端: app/index.html、app/scripts/app.js、app/styles/images/icon.svg;无服务器:server/server.js |
| 2 – Manifest ↔ 磁盘 | 每个 url/icon 路径都存在;events/functions → server/server.js;events.*.handler 与 functions 键和 exports 匹配;SMI 使用 renderData(rules/async-patterns.mdc);每个 requests.json 键都存在于 modules.common.requests 中 |
| 3 – Manifest JSON | platform-version 为 3.0;functions/requests/events 块不为空;为声明的 functions/events/requests 提供实现 |
| 4 – OAuth(如使用) | 每个 oauth_iparam 字段都包含 display_name、token_type、description |
| 5 – 代码质量 | 复杂度 ≤ 7;异步操作只能与 await 配合使用;不含未使用的参数 |
| 6 – 验证 | fdk validate:平台错误为 0,lint 错误为 0 |
**如果任何门槛未通过:**不要宣称应用已完成;修复问题并重新运行 fdk validate。
生成后消息
成功生成或迁移应用后,请使用 references/templates/post-generation-message.txt。
技能路由(必须遵守——不得用通用审核或 FDK 文档替代):
| 用户意图 | 路由至 | 不可接受的做法 |
|---|---|---|
| 审查 / 审计应用 | fw-review 技能(按照该技能生成结构化报告) | 通用代码审查、不使用技能 |
| 打包 / 发布 / 上传 | fw-publish 技能(先执行 fw-review) | 仅依据文档直接运行 fdk pack |
| 将原生前端迁移至 Meta | 仅对原生 3.0 应用使用 /fdk-react-migrate | 对已是 Meta 的应用再次迁移 |
**可选 MCP(如果尚未配置,则检查一次):**按照 references/examples/mcp-availability-check.md 检查;使用 references/templates/mcp-config-prompt.txt 中的提示词。如果选择 YES → AGENTS.md + skills/fw-publish/SKILL.md。
不要自动生成:
- [INVALID] 详细的验证报告(.validation-report.md)
- [INVALID] 应用摘要文档(APPS-SUMMARY.md)
- [INVALID] 大量功能列表或比较
- [INVALID] 包含多个子章节的长篇“后续步骤”章节
仅在用户明确要求时生成以下内容:
- [VALID] “创建验证报告”
- [VALID] “生成摘要文档”
- [VALID] “编写详细文档”
- [VALID] “比较这些应用”
生成后的输出应保持简洁,并聚焦于紧接着要做的事。
文档生成规则
| 始终创建 | 仅在用户要求时创建 |
|---|---|
manifest.json、config/*、README.md | .validation-report.md、APPS-SUMMARY.md、ARCHITECTURE.md、CHANGELOG.md |
根据模板创建 app/ 和/或 server/server.js | .gitignore、package.json(FDK 不要求) |
默认:仅创建必需文件和简短的 README.md。
安装、测试、产品模块
技能安装命令: README.md。结构测试: references/tests/refusal.json、references/tests/golden.json(摘要见 references/skill-advanced-topics.md)。模块和位置(权威信息): rules/platform3-modules-locations.mdc;简要映射见 references/skill-advanced-topics.md。
约束(自动执行)
- 严格模式: 始终拒绝 Platform 2.x 模式
- 没有来源,不做推断: 先尝试使用
get_developer_docs获取平台事实;如果 MCP 不可用,则使用references//rules/;之后才回复“平台信息不足,无法确认” - 终端日志仅限后端:
console.log只能用于server/server.js,不能用于前端 - 仅限可用于生产环境的内容: 生成完整、可部署的应用
- 禁止的模式: 列于拒绝测试中
- 必需的模式: 遵循 SKILL.md 验证表和
rules/freshworks-platform3.mdc
无服务器事件、请求、作业
事件: references/events/event-reference.md — 按需使用 onAppInstall / onAppUninstall;产品事件位于模块 events 中;仅通过 $schedule.create() 创建计划任务。onTicketUpdate(Freshdesk / Freshservice): references/events/onTicketUpdate-payload-contract.md;示例:references/test-payloads/server/test_data/support_ticket/onTicketUpdate.json、.../service_ticket/onTicketUpdate.json。
请求模板 + OAuth: references/architecture/request-templates-latest.md、oauth-configuration-latest.md、references/api/request-method-docs.md(FQDN 主机、/ 路径、<%= %>、options.oauth)。API 集成模式: references/api-integration-examples.md(分页、速率限制、错误处理、身份验证模式、真实案例)。
作业: references/runtime/jobs-docs.md — 在 modules.common.jobs 下声明;作业处理程序中不得使用 renderData。
任务 → 按顺序阅读(最多约 5 个文件)
对于平台 API / 事件 / 清单行为,请先调用 get_developer_docs,再打开 references/。当 MCP 不可用,或任务需要仓库本地的操作指南、模板或执行规则时,请按以下顺序阅读:
| 任务 | 按顺序阅读 |
|---|---|
| 新建混合应用 + 外部 HTTP | references/playbooks/README.md(选择操作指南或混合应用模板)→ references/architecture/request-templates-latest.md → rules/async-patterns.mdc |
| 新建 OAuth + 外部 API | references/playbooks/microsoft-graph-account-oauth.md(或 OAuth 模板)→ references/architecture/oauth-configuration-latest.md → references/architecture/request-templates-latest.md → rules/async-patterns.mdc |
| 工单无服务器事件 / 筛选器 | references/events/onTicketUpdate-payload-contract.md → references/test-payloads/README.md → 产品模块文档(freshdesk_support_ticket.md 或 freshservice_service_tickets.md) |
| 多模块 / 位置 | rules/platform3-modules-locations.mdc → references/skill-advanced-topics.md(仅模块摘要) |
| Lint / 验证相关变更 | rules/validation-workflow.mdc → rules/freshworks-platform3.mdc(复杂度 + 未使用的参数) |
如果完成第 1 步后任务仍不明确,请加载 rules/confusion.mdc。
概述
- SKILL.md — 核心约束、工作流、验证表格和关卡。
- rules/ — 始终生效的平台 3.0、安全、验证、SMI/事件、模板和关卡规则。
- references/ — 140 多个文件;MCP 不可用时的备用方案——按主题加载(包括用于扩展 OAuth、验证清单、参考索引和模块摘要的
references/skill-advanced-topics.md)。对于实时平台文档,请先使用get_developer_docs。 - assets/templates/ — react-meta(默认 UI)、vanilla 前端/混合/OAuth、无服务器骨架。
- references/playbooks/ — Slack webhook 和 Microsoft Graph 最佳实践指南。
如果不确定平台行为,请先调用 get_developer_docs;如果 MCP 不可用,请先加载相应的 references/ 文件,再进行实现。