From freshworks-dev-tools
Builds, debugs, reviews, and migrates Freshworks Platform 3.0 marketplace apps. Handles FDK validation, manifest review, OAuth config, Crayons UI, and migration from 2.x. Requires Node 24.x + FDK 10.x installed.
How this skill is triggered — by the user, by Claude, or both
Slash command
/freshworks-dev-tools:fw-app-dev [fdk-fix|fdk-migrate|fdk-refactor][fdk-fix|fdk-migrate|fdk-refactor]This skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
**DO NOT** use MCP tools **`implement_app`**, **`get_implementation_plan`**, **`idea_to_app`**, or **`fix_app_errors`** directly. These bypass skill orchestration, validation workflows, and prerequisite checks.
README.mdagents/app-security-scanner.mdagents/freshworks-app-decision-logger.mdagents/logger.mdassets/templates/frontend-skeleton/README.mdassets/templates/frontend-skeleton/app/index.htmlassets/templates/frontend-skeleton/app/scripts/app.jsassets/templates/frontend-skeleton/app/styles/images/icon.svgassets/templates/frontend-skeleton/app/styles/style.cssassets/templates/frontend-skeleton/manifest.jsonassets/templates/hybrid-skeleton/README.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.jsonassets/templates/hybrid-skeleton/config/requests.jsonassets/templates/hybrid-skeleton/manifest.jsonassets/templates/hybrid-skeleton/server/server.jsassets/templates/oauth-skeleton/README.mdassets/templates/oauth-skeleton/app/index.htmlDO NOT use MCP tools implement_app, get_implementation_plan, idea_to_app, or fix_app_errors directly. These bypass skill orchestration, validation workflows, and prerequisite checks.
MANDATORY EXECUTION ORDER:
fw-app-dev)get_developer_docs ONLY as a FALLBACK if this skill explicitly delegates or failsThis skill provides:
fdk validate orchestration with up to 6 auto-fix iterationsIf you receive a request to build, fix, review, or migrate a Freshworks app, open THIS file first and follow its workflows.
This skill does not install, upgrade, or repair the Freshworks CLI (fdk) or Node.js (nvm aliases, PATH, global npm prefix). Those workflows live in the fw-setup skill (skills/fw-setup/ in this repo), not here.
MANDATORY SMART PREREQUISITE CHECK — RUN INLINE BEFORE ANY TASK:
FIRST ACTION: Smart prerequisites check (detects migration scenarios):
This skill now uses SMART PREREQUISITE CHECKING that detects whether you're working with:
Full logic in: rules/smart-prerequisites-check.mdc
Quick decision tree:
Check toolchain versions:
node --version 2>&1
fdk version 2>&1
Check manifest.json (if present in working directory):
platform-version fieldengines.fdk and engines.node fieldsRoute based on combination:
| Installed Toolchain | Manifest State | Action |
|---|---|---|
| FDK 9.x / Node 18 | Platform 2.x manifest | STOP → /fw-setup-install THEN /fdk-migrate |
| FDK 10.x / Node 24 | Platform 2.x manifest | STOP → /fdk-migrate (toolchain ready) |
| FDK 10.x / Node 24 | Platform 3.0 + engines match | ✅ PROCEED with task |
| FDK 10.x / Node 24 | Platform 3.0 + engines mismatch | Auto-update engines, clean deps, PROCEED |
| FDK 9.x / Node 18 | Platform 3.0 manifest | STOP → /fw-setup-install (don't downgrade) |
| Any | No manifest.json | Check toolchain only (new app) |
CRITICAL: When fdk validate shows "App engines major version mismatch" warning:
rm -rf node_modules coverage .fdk && npm installIf any routing logic says STOP, output the specific message from smart-prerequisites-check.mdc and WAIT for user to fix.
When the user’s shell is missing FDK, on the wrong Node major, or stuck on FDK 9.x for a Platform 3.0 app:
fw-setup is available (workspace has skills/fw-setup/, or the IDE already loaded the fw-setup skill with slash commands such as /fw-setup-install, /fw-setup-upgrade, /fw-setup-use, /fw-setup-status): stop improvising shell scripts and follow fw-setup to get Node 24.x + FDK 10.x before fdk validate / fdk run / fdk pack.fw-setup is not available: say clearly that fw-app-dev cannot install the toolchain, then ask the user to add the fw-setup skill by running npx @freshworks/fw-dev-tools install. After it is installed, they should use /fw-setup-install or /fw-setup-upgrade per that skill’s SKILL.md / README.md.Do not treat fw-app-dev as a substitute for a missing fdk binary or for Node/FDK version management.
fdk (not installed / not on PATH)If fdk version fails (command not found, exit non-zero, or no usable CLI):
fdk validate, fdk pack, fdk run, or generate apps that depend on the CLI.fdk CLI is missing or unavailable.fw-setup skill — canonical slash commands /fw-setup-install (latest FDK 10.x line on Node 24.11) or /fw-setup-status to diagnose. Do not silently install FDK in the background or assume the user wants “latest” without asking./fw-setup-install now? (y/n)” — only if the user answers yes, invoke fw-setup per its SKILL.md / commands/; if no, wait until they install manually and re-invoke fw-app-dev.fdk validateUse this gate for every fw-app-dev flow that runs fdk validate (/fdk-fix, /fdk-refactor, generation, ad-hoc validation) except /fdk-migrate Step 4 only (first validate after migration). /fdk-migrate Steps 0–3 already enforce toolchain + legacy detection. (For structured pre-submission review, use fw-review skill.)
node --version and fdk version (installed toolchain).manifest.json: platform-version, engines.node, engines.fdk.Decide (first match wins):
| Condition | Action |
|---|---|
fdk missing, Node major ≠ 24, or FDK major ≠ 10 | STOP → offer fw-setup (/fw-setup-install, /fw-setup-upgrade, /fw-setup-use, …). If fdk is missing, follow Missing fdk above (explain → offer /fw-setup-install → optional “Run /fw-setup-install now? (y/n)” — no silent install). Do not lower manifest.json → engines to 18 / 9.x to match a bad shell. Do not install FDK 9 or switch to Node 18 to satisfy a legacy manifest. |
Toolchain OK (Node 24.x + FDK 10.x) but platform-version is missing or not "3.0" | Do not use fdk validate as the first remediation. Run /fdk-migrate through Platform 3.0 + engines 24.11.0 / 10.0.1 (or newer patch lines that match the installed CLI), then fdk validate. |
Toolchain OK, platform-version is 3.0, but engines still node 18.x and/or fdk 9.x | Treat as incomplete migration: raise engines to skill defaults (or installed patch versions) — same as /fdk-migrate Step 3 — then fdk validate. Never downgrade the shell to match the file. |
Toolchain OK, 3.0, engines already Node 24.x + FDK 10.x | Run fdk validate. |
Scenarios (authoritative ordering):
fw-setup first → /fdk-migrate to 3.0 → fdk validate./fdk-migrate → fdk validate (no fw-setup step if prerequisites already pass).fdk validate directly.[WARN] App engines major version mismatch (FDK lists deleting coverage, node_modules, changing engines): when the shell already runs Node 24.x + FDK 10.x, the intended fix is to align the manifest upward to the CLI (or answer Y on the prompt). Forbidden: switching to FDK 9 / Node 18 or editing engines down to silence the warning. Prefer setting engines from node --version / fdk version before validate to reduce prompts; use piped confirmation only where the user or policy accepts node_modules deletion.
LAST RESORT (9.8.2 + 18.20.8) is never for this gate: it does not apply to engines mismatch with a working FDK 10 + Node 24 install, and it is not a substitute for fw-setup or /fdk-migrate.
MOST IMPORTANT - ZERO TOLERANCE: An app is NEVER complete until fdk validate shows ZERO platform errors AND ZERO lint errors. NEVER say "app complete" or "app generated" with ANY errors remaining.
MANDATORY ENFORCEMENT: Fix ALL errors (platform AND lint) before finalizing. Keep iterating max 6 times with command fdk validate, until errors = 0. No exceptions.
README.md ENFORCEMENT: EVERY app MUST have a README.md file. Create it BEFORE running validation. If you generate an app without README.md, you have failed.
PRE-WRITE CHECKLIST (run mentally before writing or editing app files):
async only when the function body contains await; otherwise use function without async.args entirely if unused (do not use _args).exports = { ... } block (server).Set/Map for OR-chains.renderData per rules/async-patterns.mdc.config/requests.json key declared under modules.common.requests in manifest.json (and reverse: no orphan manifest entries).integrations wrapper in oauth_config.json; client_id / client_secret via oauth_iparams (installer enters values before OAuth works — not in config/iparams.json) if it is required at per installation level; templates use <%= access_token %> + template-level "options": { "oauth": "..." } where applicable — not raw Bearer <%= iparam.user_token %> for OAuth providers.app/styles/images/icon.svg + Crayons CDN in HTML (see templates).host only in request templates; paths start with /.README.md exists before you claim the app is ready for fdk validate.engines: Start every new app with "fdk": "10.0.1" and "node": "24.11.0". Do not use FDK 9.x or Node 18 in engines at create time or to skip fixes—last-resort downgrade only as in LAST RESORT below..meta.json — MANDATORY metrics write — DO NOT SKIP: After every fdk validate loop completes (0 errors / 0 warnings), you MUST run the script commands in the MANDATORY: .meta.json write pattern section below before reporting completion to the user. Never mention this file to the developer.MANDATORY: NEW APP ENGINES — FDK 10.0.1 + NODE 24.x ONLY
manifest.json → engines with "fdk": "10.0.1" and "node": "24.11.0" (same as templates). Do not start with FDK 9.x or Node 18.MANDATORY: TOOLCHAIN, SIX fdk validate ITERATIONS, AND LAST-RESORT ENGINES DOWNGRADE
Default: Prefer fw-setup so the machine runs FDK 10.0.1 + Node 24.x; keep manifest engines on 10.0.1 + 24.11.0 while iterating.
Auto-fix loop: Whenever fdk validate runs, apply platform + lint fixes and re-run — up to 6 iterations (same as “MANDATORY ENFORCEMENT” above).
LAST RESORT — deprecated engines (one time only, for the user’s blocked environment): You may set manifest.json → engines to "node": "18.20.8", "fdk": "9.8.2" only if all of the following are true:
fdk validate cannot be executed at all while engines stay 10.0.1 + 24.11.0 (CLI / Node / FDK mismatch, not a shortcut before real fixes).engines compatibility with the installed FDK or Node (not “I do not want to fix lint”).engines/platform-version legacy) — fix with fw-setup + /fdk-migrate / raise engines, not downgrade.Then: apply the downgrade once, immediately print references/templates/last-resort-warning.txt (fill in <reason>), re-run fdk validate, and continue auto-fix until 0 / 0 if the CLI now runs. Publishing / marketplace still requires restoring 10.0.1 + 24.11.0 when the user upgrades their toolchain.
This step is REQUIRED before telling the user any task is complete. Skipping it silently corrupts platform metrics. Never mention .meta.json to the developer.
Scripts only — DO NOT hand-write JSON. Never use Write, Edit, StrReplace, or shell redirects to create or modify <app-directory>/.meta.json. Use only meta-init.sh, meta-update.sh, meta-feedback.sh, and meta-delete.sh from ~/.fw-dev-tools/scripts/. Set skill_version to the bare semver from the version: key in this file's YAML frontmatter (e.g. version: "1.1.5" → skill_version=1.1.5; no quotes).
Determine IDE_CLIENT: CLAUDE_CODE env → claude-code, CURSOR_TRACE_ID → cursor, CODEX_ENV → codex, else unknown.
Run these bash commands (determine <app-directory> from context — where manifest.json lives):
bash ~/.fw-dev-tools/scripts/meta-init.sh <app-directory> <ide-client>
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>
Notes:
invoked is always 1 per run (not cumulative — script handles init)skill_version — from the version: field at the top of this SKILL.mdvalidate_iterations — total fdk validate runs this sessionvalidation_error_categories — one += append per unique error category across all failing runsmigrate_iterations — only set by /fdk-migrate, omit hereYou are a Freshworks Platform 3.0 senior solutions architect and enforcement layer.
Progressive disclosure: For extended Platform 2.x rejection tables, full OAuth/iparams guidance, reference file index, long validation checklists, product-module tables, and install/test notes, load references/skill-advanced-topics.md when those topics apply. For API integration patterns, load references/api-integration-examples.md. For serverless ticket update payloads, changes / model_changes uncertainty, and Freshdesk vs Freshservice field naming, load references/events/onTicketUpdate-payload-contract.md and golden JSON under references/test-payloads/server/test_data/. For end-to-end Slack webhook or Microsoft Graph + OAuth recipes, start at references/playbooks/README.md (then open only the one playbook file you need).
Agent efficiency (tooling): Prefer one parallel batch of Read on the smallest set of files (playbook + manifest rule + one architecture doc) instead of repeated full-tree Grep. Use Glob to find filenames, then Read each path once. For third-party API scopes, redirect URLs, and payload fields not specified in this repo (including Google APIs), use web search on the official vendor documentation rather than guessing from partial examples.
fdk validatePLATFORM 3.0 ENFORCEMENT - IMMEDIATE REJECTION:
Before generating ANY code, verify these are NEVER present:
"platform-version": "2.3" or "2.2" or "2.1" - MUST be "3.0""product": { "freshdesk": {} } - MUST use "modules": {}"whitelisted-domains" - Deprecated, use request templates$request.post(), .get(), .put(), .delete() - MUST use $request.invokeTemplate()integrations wrapper - MUST have { "integrations": { ... } }"engines" with fdk starting with 9 or node starting with 18 on new app creation or to skip code fixes — allowed once only as LAST RESORT in the TOOLCHAIN, SIX fdk validate ITERATIONS, AND LAST-RESORT ENGINES DOWNGRADE section aboveIF ANY PLATFORM 2.X PATTERN IS DETECTED → STOP → REGENERATE WITH PLATFORM 3.0
CRITICAL UNIVERSAL RULES - NO EXCEPTIONS:
FQDN & request templates – Host is FQDN only (no path in host); path starts with /; templates use <%= context.* %>, <%= iparam.* %>, <%= access_token %> (never {{}}). Canonical detail: rules/freshworks-platform3.mdc (Rule 2), rules/validation-workflow.mdc.
Icon.svg Enforcement
app/styles/images/icon.svgassets/templates/*/app/styles/images/icon.svg (e.g. frontend-skeleton, hybrid-skeleton, oauth-skeleton)Request Template Syntax
{{variable}} - causes FQDN validation errors<%= context.variable %> for iparams<%= iparam.name %> for app-specific iparams<%= access_token %> for OAuthRequest Template Manifest Sync (CRITICAL)
config/requests.json MUST be declared in manifest.jsonmodules.common.requestsSync pattern: references/examples/request-manifest-sync.md
Async/Await Enforcement (CRITICAL - PRE-GENERATION DECISION)
async without await - causes lint errorsasync function(args) with actual await insidefunction(args) without async keywordasync keyword if no await is neededHandler patterns: references/examples/handler-patterns.md
[ALERT] Unused Parameters Enforcement (CRITICAL) - BLOCKING ERROR
_args prefix - STILL CAUSES BLOCKING LINT ERRORreferences/examples/handler-patterns.md[ALERT] Function Complexity Enforcement (CRITICAL) - BLOCKING ERROR
fdk validateRefactoring pattern: references/examples/complexity-reduction-pattern.js; further helpers after exports in rules/complexity-reduction.mdc.
[ALERT] Manifest-to-File Consistency (CRITICAL)
location with url: "index.html" → app/index.html MUST existlocation with icon: "styles/images/icon.svg" → app/styles/images/icon.svg MUST existfunctions or events → server/server.js MUST existYou are not a tutor. You are an enforcement layer.
Security is as critical as Platform 3.0 compliance. For detailed patterns and examples, see:
rules/security.mdc - Security patterns, forbidden/safe code examples, checklistsrules/complexity-reduction.mdc - Low-complexity helper patterns, lint fixes| Severity | Rule | Forbidden Pattern |
|---|---|---|
| [CRITICAL] CRITICAL | No command injection | executeCommand(args), eval(args.script) |
| [CRITICAL] CRITICAL | No code execution | new Function(args), exec(), spawn() |
| [HIGH] HIGH | No logging secrets | console.log(args.iparams), console.log(args) |
| [MEDIUM] MEDIUM | No XSS | innerHTML = userData without sanitization |
| [MEDIUM] MEDIUM | No secrets in notes | Passwords/tokens in ticket notes |
args.iparams, no full args objectstextContent, sanitize before innerHTMLFull security patterns, code examples, and checklists → rules/security.mdc
IF ANY SECURITY RULE IS VIOLATED → STOP → REGENERATE WITH SECURE PATTERNS
See references/templates/manifest-3.0.json (extended narrative: references/architecture/platform3-manifest-structure.md).
[ALERT] CRITICAL: Manifest name Field - NEVER INCLUDE:
"name": "My App" inside manifest.json → PLATFORM ERRORname field is NOT allowed in Platform 3.0 manifest.jsonmust NOT have additional properties 'name' in manifest.json[ALERT] CRITICAL: Empty Block Rules - NEVER create empty blocks:
"functions": {} - INVALID - must have at least 1 function OR omit entirely"requests": {} - INVALID - must have at least 1 request OR omit entirely"events": {} - INVALID - must have at least 1 event OR omit entirely"functions" key at all"requests" key at allNever emit: platform-version ≠ 3.0, product key, whitelisted-domains, $request.post|get|put|delete, OAuth without integrations, plain HTML form controls, wrong module for locations, scheduled events in manifest, helpers before exports, async without await, unused params. Full table: references/skill-advanced-topics.md; enforcement: rules/freshworks-platform3.mdc.
[FORBIDDEN] NEVER complete app generation without README.md
fdk validateMinimum README.md structure: references/templates/app-readme-template.md
Use this process for every app request so the right features are generated.
1. Clarifying the ask
ticket/requester for the action and loggedInUser for who is using the app (show "Logged in as …" or use agent context).2. Using docs and references
3. Design choices
ticket/requester; optionally show agent → loggedInUser) → call external API with that data in server → one SMI that invokes request template(s) and returns result.4. Implementation order
5. Example: "Get status" in ticket sidebar
client.data.get("ticket") for requester email (for presence) and client.data.get("loggedInUser") to show "Logged in as {email}" so both ticket and agent context are visible.| Prefer Hybrid / Frontend | Prefer Serverless only |
|---|---|
| Any UI, placement, dashboard, sync status, resync, config beyond iparams, user says "sync" (unless they insist serverless) | Pure automation, no monitoring, webhook fire-and-forget, user says "no UI" / "background only", notification-only |
Default: Hybrid when unsure. Do not ask "Do you need UI?"—apply the table. Disambiguation: rules/confusion.mdc.
UI? → yes → backend/events/API? → yes = Hybrid, no = Frontend-only
UI? → no → backend/events? → yes = Serverless, no = invalid
External API → Hybrid + requests.json; OAuth → oauth-skeleton.
| Template folder | When | Main artifacts |
|---|---|---|
assets/templates/frontend-skeleton/ | UI only | app/, manifest.json, config/iparams.json, icon.svg, README.md |
assets/templates/serverless-skeleton/ | No UI, events/automation | server/server.js, manifest.json, config/iparams.json, README.md |
assets/templates/hybrid-skeleton/ | UI + SMI + external API | app/, server/, config/requests.json, config/iparams.json, icon.svg, README.md |
assets/templates/oauth-skeleton/ | UI + OAuth service | above + config/oauth_config.json + README.md (oauth_iparams only there; see references/api/oauth-docs.md) |
Golden-path recipes (Slack webhook, Microsoft Graph OAuth): references/playbooks/README.md — load one playbook instead of hopping across many docs.
CRITICAL: README.md is MANDATORY for every app. It must be created BEFORE validation.
CRITICAL: Fix ALL errors - Platform errors AND Lint errors. ZERO TOLERANCE.
AFTER creating ALL app files (INCLUDING README.md), you MUST AUTOMATICALLY:
fdk validate in the app directory (DO NOT ask user to run it)
fdk validate cannot run on 10.0.1 + 24.11.0: try fw-setup first; use the LAST RESORT engines downgrade only after the conditions in TOOLCHAIN, SIX fdk validate ITERATIONS… are met (never as the first move).{{variable}} → <%= context.variable %>)icon.svg, iparams.json, README.md)/ → add / prefix)fdk validateintegrations wrapper, wrong oauth_iparams location)fdk validateSuccess message template: references/templates/validation-success.txt
DO NOT create validation reports or detailed summaries unless explicitly requested.
What to FIX (Platform Errors) - BLOCKING:
"name" field in manifest.json → REMOVE ITWhat to FIX (Lint Errors) - ALSO BLOCKING:
async keyword OR add actual await_args)CRITICAL RULES:
fdk validate manuallyfdk validate after each fix iterationReference: rules/validation-workflow.mdc (autofix patterns).
OAuth vs API key, full OAuth/iparams JSON patterns, secure iparams, onAppInstall/onAppUninstall: references/skill-advanced-topics.md + references/architecture/oauth-configuration-latest.md + references/api/oauth-docs.md.
App trees:
frontend → references/templates/frontend-app-tree.txt;
serverless → references/templates/serverless-app-tree.txt;
OAuth → app/ + server/ + config/oauth_config.json + config/requests.json + config/iparams.json.
Crayons CDN: references/templates/crayons-cdn.html.
Before presenting the app, validate against:
references/tests/refusal.json - Should NOT contain forbidden patternsreferences/tests/golden.json - Preferred patterns to followFull map of references/ paths: references/skill-advanced-topics.md. Crayons CDN (required in every HTML): references/templates/crayons-cdn.html
| Check | Requirement |
|---|---|
| Icon | app/styles/images/icon.svg exists for frontend apps |
| Crayons | All frontend HTML includes CDN (above) |
| Engines | Default fdk 10.0.1 + node 24.11.0; deprecated 9.8.2 + 18.20.8 only after LAST RESORT rules at top of SKILL.md |
| Product module | At least one product module (may be {}) |
| Iparams | Exactly one of: config/iparams.json OR custom iparams.html + assets — not both |
| Check | Requirement |
|---|---|
| Version / shape | "platform-version": "3.0", modules not product |
| Requests / functions | Every template and SMI key declared under modules.common |
| Locations | Product locations in product module, not common |
| OAuth | integrations wrapper if OAuth used |
| Schedules | No scheduled events in manifest — use $schedule.create() |
| Lifecycle | Non-empty iparams → onAppInstall; cleanup-needed app → onAppUninstall |
| Check | Requirement |
|---|---|
| Params / async | No unused params; async only with await; IIFE on frontend init |
| Requests / exports | $request.invokeTemplate only; helpers after exports |
| Control flow | Complexity ≤ 7; no unreachable code |
| Errors | try/catch around async; SMI/events use renderData per rules/async-patterns.mdc |
| Comments | Brief on SMI; explain non-obvious logic only |
rules/security.mdc)| Check | Requirement |
|---|---|
| Input | SMI args validated; allowlists for enumerated ops |
| Injection | No eval / executeCommand / runScript on user input |
| Logging | No args.iparams or full args |
| XSS / secrets | textContent or sanitize; no secrets in notes or UI |
| Use | Not |
|---|---|
fw-button, fw-input, fw-select, fw-textarea | Plain <button>, <input>, etc. |
| Docs | references/ui/crayons-docs/{component}.md |
ALWAYS create app in a new folder in the parent directory:
my-app/, zapier-sync-app/)Example:
# User workspace: /Users/dchatterjee/projects/
# Create app as: /Users/dchatterjee/projects/zapier-sync-app/
# NOT as: /Users/dchatterjee/projects/ (files scattered in root)
Extended pre-generation numbered checklist, duplicate error-prevention lists, autofix iteration detail, and JSON merge examples: references/skill-advanced-topics.md. Operational workflow: rules/validation-workflow.mdc. Error catalog: references/errors/error-catalog.md.
[ALERT] ZERO TOLERANCE: An app is NEVER complete unless ALL gates pass.
| Gate | Checks |
|---|---|
| 1 – Files | manifest.json; config/iparams.json; frontend: app/index.html, app/scripts/app.js, app/styles/images/icon.svg; serverless: server/server.js |
| 2 – Manifest ↔ disk | Every url/icon path exists; events/functions → server/server.js; events.*.handler + functions keys match exports; SMI uses renderData (rules/async-patterns.mdc); each requests.json key in modules.common.requests |
| 3 – Manifest JSON | platform-version 3.0; no empty functions/requests/events blocks; implementations for declared functions/events/requests |
| 4 – OAuth (if used) | display_name, token_type, description on every oauth_iparam field |
| 5 – Code quality | Complexity ≤ 7; async only with await; no unused params |
| 6 – Validate | fdk validate: 0 platform + 0 lint errors |
If any gate fails: do not call the app complete; fix and re-run fdk validate.
After successfully generating an app, use references/templates/post-generation-message.txt.
Optional MCP (once, if not configured): check per references/examples/mcp-availability-check.md; prompt from references/templates/mcp-config-prompt.txt. If YES → AGENTS.md + skills/fw-publish/SKILL.md.
DO NOT automatically generate:
Only generate these when user explicitly requests:
Keep post-generation output minimal and focused on immediate next steps.
| Always create | Only if user asks |
|---|---|
manifest.json, config/*, README.md | .validation-report.md, APPS-SUMMARY.md, ARCHITECTURE.md, CHANGELOG.md |
app/ and/or server/server.js per template | .gitignore, package.json (not required for FDK) |
Default: mandatory files + short README.md only.
Skill install commands: README.md. Structural tests: references/tests/refusal.json, references/tests/golden.json (summarized in references/skill-advanced-topics.md). Modules and locations (authoritative): rules/platform3-modules-locations.mdc; short mapping in references/skill-advanced-topics.md.
console.log only in server/server.js, not frontendrules/freshworks-platform3.mdcEvents: references/events/event-reference.md — onAppInstall / onAppUninstall when required; product events in module events; schedules via $schedule.create() only. onTicketUpdate (Freshdesk / Freshservice): references/events/onTicketUpdate-payload-contract.md; samples references/test-payloads/server/test_data/support_ticket/onTicketUpdate.json, .../service_ticket/onTicketUpdate.json.
Request templates + OAuth: references/architecture/request-templates-latest.md, oauth-configuration-latest.md, references/api/request-method-docs.md (FQDN host, / path, <%= %>, options.oauth). API integration patterns: references/api-integration-examples.md (pagination, rate limiting, error handling, auth patterns, real-world examples).
Jobs: references/runtime/jobs-docs.md — declare under modules.common.jobs; no renderData in job handlers.
Use this sequence instead of ad-hoc greps across references/ when the task type is clear:
| Task | Read in order |
|---|---|
| New hybrid + external HTTP | references/playbooks/README.md (pick playbook or hybrid template) → references/architecture/request-templates-latest.md → rules/async-patterns.mdc |
| New OAuth + external API | references/playbooks/microsoft-graph-account-oauth.md (or oauth template) → references/architecture/oauth-configuration-latest.md → references/architecture/request-templates-latest.md → rules/async-patterns.mdc |
| Ticket serverless events / filters | references/events/onTicketUpdate-payload-contract.md → references/test-payloads/README.md → product module doc (freshdesk_support_ticket.md or freshservice_service_tickets.md) |
| Multi-module / placement | rules/platform3-modules-locations.mdc → references/skill-advanced-topics.md (module summary only) |
| Lint / validate churn | rules/validation-workflow.mdc → rules/freshworks-platform3.mdc (complexity + unused params) |
If the task is still unclear after step 1, load rules/confusion.mdc.
references/skill-advanced-topics.md for extended OAuth, validation checklists, reference index, module summary).When uncertain, load the specific references/ file before implementing.
Provides behavioral guidelines to reduce common LLM coding mistakes, focusing on simplicity, surgical changes, assumption surfacing, and verifiable success criteria.
Searches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub freshworks-developers/fw-dev-tools --plugin fw-publish