[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-atlassian-forge-app-builder":3,"mdc--d7se1j-key":40,"related-repo-atlassian-forge-app-builder":2476,"related-org-atlassian-forge-app-builder":2556},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":35,"sourceUrl":38,"mdContent":39},"forge-app-builder","build and deploy Atlassian Forge apps","Guides building, deploying, troubleshooting, and installing Atlassian Forge apps — custom extensions built with the Forge CLI (forge create, forge deploy, forge install). Use when the user wants to create a Forge app (issue panels, dashboard gadgets, Confluence macros, global pages), is encountering Forge CLI errors or deployment issues (e.g. forge install failures, environment errors), or needs help with Forge-specific concepts like resolvers, UI Kit, manifest scopes, or developer spaces. Do not use for general Jira configuration, automation rules, JQL queries, or Atlassian REST API usage outside of a Forge app context.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"atlassian","Atlassian","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fatlassian.png",[12,16,19,22],{"name":13,"slug":14,"type":15},"CLI","cli","tag",{"name":17,"slug":18,"type":15},"Plugin Development","plugin-development",{"name":20,"slug":21,"type":15},"Deployment","deployment",{"name":9,"slug":8,"type":15},14,"https:\u002F\u002Fgithub.com\u002Fatlassian\u002Fforge-skills","2026-07-12T07:58:52.007851","Apache-2.0",7,[29,30,31,32,33,34],"agent-skills","ai-agents","claude-code-plugin","claude-code-skills","gemini-cli-extension","mcp",{"repoUrl":24,"stars":23,"forks":27,"topics":36,"description":37},[29,30,31,32,33,34],"The Forge Skills Plugin bundles several Forge-focused skills plus MCP-backed tooling so your agent can scaffold apps, review them before deploy, debug production issues, and stay current on Forge APIs and the Atlassian Design System.","https:\u002F\u002Fgithub.com\u002Fatlassian\u002Fforge-skills\u002Ftree\u002FHEAD\u002Fskills\u002Fforge-app-builder","---\nname: forge-app-builder\ndescription: Guides building, deploying, troubleshooting, and installing Atlassian Forge apps — custom extensions built with the Forge CLI (forge create, forge deploy, forge install). Use when the user wants to create a Forge app (issue panels, dashboard gadgets, Confluence macros, global pages), is encountering Forge CLI errors or deployment issues (e.g. forge install failures, environment errors), or needs help with Forge-specific concepts like resolvers, UI Kit, manifest scopes, or developer spaces. Do not use for general Jira configuration, automation rules, JQL queries, or Atlassian REST API usage outside of a Forge app context.\nlicense: Apache-2.0\nlabels:\n  - confluence\n  - jira\n  - bitbucket\n  - atlassian\n  - forge\nmaintainer: amoore\nnamespace: cloud\n---\n# Forge App Builder\n\n**When building a Forge app, the agent MUST complete this workflow in order. Do not skip steps. Do not substitute manual instructions for running the scripts below.**\n\n## Critical Rules\n\n1. **Always use `forge create`** to scaffold apps — it registers the app and generates a valid app ID\n2. **Never manually scaffold** — apps without valid app IDs cannot be deployed\n3. **If `forge create` fails, STOP** — inform the user and provide the manual command\n4. **Never ask for API tokens in chat** — direct users to run `forge login` in their terminal and enter credentials there\n5. **Always ask the user to choose** when multiple options exist (developer spaces, sites) — never pick on their behalf\n6. **Always ask the user for their Atlassian site URL during installation** — never try to discover it from other apps, environment variables, or any other source\n7. **Always run the deploy script for deploy and install** — do not give the user only manual `forge deploy` \u002F `forge install` commands as the primary outcome; run `scripts.deploy_forge_app.py` yourself\n8. **Set `ATL_FORGE_ATTRIBUTION_SKILL_NAME=forge-app-builder` on `forge` commands run for this skill** — prefix `forge` invocations with this env var: ones you run in the shell (e.g. `forge developer-spaces list`, `forge lint`) **and the interactive `forge create` command you hand the user as a fallback**. The bundled scripts set it automatically; other commands shown in this skill omit it for brevity — add it when you run them. The only exclusions are `forge login` and `forge tunnel` (user-run auth \u002F live-dev commands).\n\n## MCP Server Prerequisites\n\nThis skill works best with the following MCP servers. The scripts and CLI workflow function without them, but the agent will lack access to up-to-date Forge documentation for template selection, module configuration, and code patterns.\n\n\n| MCP Server    | Required?            | Purpose                                                                   |\n| ------------- | -------------------- | ------------------------------------------------------------------------- |\n| **Forge MCP** | Strongly recommended | Template lookup, module discovery, manifest syntax, UI Kit\u002Fbackend guides |\n| **ADS MCP**   | Optional             | Atlaskit component\u002Ftoken\u002Ficon lookup (Custom UI apps only)                |\n\n\nIf MCP servers are not connected, inform the user that code guidance may be based on the model's training data and could be outdated. Recommend they verify against [developer.atlassian.com\u002Fplatform\u002Fforge](https:\u002F\u002Fdeveloper.atlassian.com\u002Fplatform\u002Fforge\u002F).\n                                                             |\n\n## Agent Workflow\n\n**Complete steps 0–5 in order. Run the scripts yourself; do not only instruct the user to run them.**\n\n### Step 0: Prerequisites (Install Automatically If Missing)\n\n**Before any other steps**, call the `forge-development-guide` tool to get the current Node.js version requirement and CLI setup instructions. Then check and install prerequisites:\n\n1. **Node.js** — Run `node -v`. If missing or below the version specified in the development guide:\n  - **macOS (Homebrew):** `brew install node`\n  - **nvm:** `nvm install \u003Cversion>` then `nvm use \u003Cversion>`\n  - **fnm:** `fnm install \u003Cversion>` then `fnm use \u003Cversion>`\n  - **Other:** [https:\u002F\u002Fnodejs.org](https:\u002F\u002Fnodejs.org) (LTS)\n2. **Forge CLI** — Run `forge --version`. If missing:\n  ```bash\n   npm install -g @forge\u002Fcli\n  ```\n3. **Forge login** — Run `forge whoami`. If not logged in:\n  - **Never ask for or accept API tokens in chat** — tokens are sensitive; the user must enter them only in their terminal\n  - Direct the user to create an API token: [https:\u002F\u002Fid.atlassian.com\u002Fmanage\u002Fapi-tokens](https:\u002F\u002Fid.atlassian.com\u002Fmanage\u002Fapi-tokens)\n  - Tell the user to run `forge login` **in their own terminal** (not via the agent). The CLI will prompt for:\n    - Atlassian email\n    - API token (paste only in the terminal when prompted)\n  - Example message: *\"You need to log in to Forge. Create an API token at [https:\u002F\u002Fid.atlassian.com\u002Fmanage\u002Fapi-tokens](https:\u002F\u002Fid.atlassian.com\u002Fmanage\u002Fapi-tokens), then run `forge login` in your terminal. Enter your email and token when prompted — do not paste them here.\"*\n  - After the user confirms they've logged in, retry the workflow\n\nInstall in order: Node.js first (required for npm), then Forge CLI, then login. Retry the workflow after installing.\n\n### Step 1: Discover Developer Spaces\n\n```bash\nATL_FORGE_ATTRIBUTION_SKILL_NAME=forge-app-builder forge developer-spaces list --json\n```\n\n### Step 2: Ask User to Choose Developer Space\n\n**Do not proceed to Step 3 until the user has selected a developer space.** Present the list from Step 1 (names and IDs) and ask which space to use. If only one space exists, you may use it and briefly inform the user. Never pick one of multiple spaces on the user's behalf.\n\n### Step 3: Create App\n\nAll `python3 -m scripts.`* commands must be run from the skill directory (the directory containing this SKILL.md file). Derive it from the SKILL.md path provided in the system prompt. Use `python3` on macOS if `python` is not available.\n\nRun from the skill directory. The `--directory` flag sets the **parent directory** under which the app folder (named after `--name`) will be created. The script `cd`s into that directory before running `forge create`, so the app appears as a subdirectory (e.g. `\u003Cparent-directory>\u002F\u003Capp-name>\u002F`). If omitted, the app is created under the current directory.\n\n```bash\npython3 -m scripts.create_forge_app \\\n  --template \u003Ctemplate> \\\n  --name \u003Capp-name> \\\n  --dev-space-id \u003Cselected-id> \\\n  --directory \u003Cparent-directory>\n```\n\nTo find the right template for the user's needs:\n\n- Call `list-forge-modules` to identify the appropriate module type\n- Call `search-forge-docs` with a query like \"template for \" to find the matching template name\n\nValidate a template: `python3 -m scripts.list_templates --validate \u003Cname>`\nList all templates: `python3 -m scripts.list_templates --list`\n\n### Step 4: Customize Code\n\nAfter `forge create` succeeds:\n\n```bash\ncd \u003Capp-name>\nnpm install\n```\n\n#### UI Kit vs Custom UI — Choose the Right Tools\n\nBefore writing any UI code, determine which approach the app uses. **Getting this wrong causes import errors and broken builds.**\n\n- **UI Kit** (most `forge create` templates): manifest uses `render: native` or code imports from `@forge\u002Freact`. Use `forge-ui-kit-developer-guide` as the ONLY UI reference. Do NOT suggest `@atlaskit\u002F`* imports — they won't work.\n- **Custom UI**: manifest has `resource` pointing to a `static\u002F` directory. Use ADS MCP tools (`ads_plan`, `ads_get_components`, `ads_get_all_icons`) for component discovery. Do NOT use `forge-ui-kit-developer-guide` — it describes a different API.\n\n#### Knowledge tools for implementation\n\n- `forge-ui-kit-developer-guide` — Frontend components (**UI Kit only**)\n- `ads_plan` \u002F `ads_get_components` — Component and token lookup (**Custom UI only**)\n- `forge-backend-developer-guide` — Backend resolvers and APIs\n- `forge-app-manifest-guide` — Manifest configuration\n- `search-forge-docs` — Search for specific APIs or props\n\n### Step 5: Deploy and Install (run the deploy script)\n\n**You MUST run the deploy script** — do not only paste manual `forge deploy` \u002F `forge install` commands for the user to run. Execute the script from the skill directory.\n\n- **If you have the user's Atlassian site URL** (e.g. they provided it earlier or in the request), run in one go:\n\n```bash\npython3 -m scripts.deploy_forge_app \\\n  --app-dir \u003Capp-directory> \\\n  --site \u003Csite-url> \\\n  --product \u003Cjira|confluence>\n```\n\n- **If you do not have the site URL yet:** run deploy only, then ask for the site, then run again to install:\n\n```bash\n# 1) Deploy only\npython3 -m scripts.deploy_forge_app \\\n  --app-dir \u003Capp-directory> \\\n  --product \u003Cjira|confluence> \\\n  --deploy-only\n\n# 2) Ask the user: \"What is your Atlassian site URL (e.g. yourcompany.atlassian.net)?\"\n\n# 3) After they reply, run again with their site to complete install\npython3 -m scripts.deploy_forge_app \\\n  --app-dir \u003Capp-directory> \\\n  --site \u003Csite-url> \\\n  --product \u003Cjira|confluence> \\\n  --skip-deps\n```\n\n**Always ask the user for their site URL** when needed for install; never try to discover it. If scopes changed from a previous install, add `--upgrade` to the install (or run the script again with `--site` and the script will handle it; for manual upgrade use `forge install ... --upgrade`).\n\n#### Cross-product installation\n\nWhen an app uses scopes from multiple products (e.g. a Confluence macro that also reads Jira data), the deploy script **automatically detects** the required products from the manifest scopes and installs on all of them. The `--product` flag sets the primary product; the script adds any additional products found in the scopes.\n\nIf you need to install manually, run `forge install` once per product:\n\n```bash\nforge install --non-interactive --site \u003Csite-url> --product confluence -e development\nforge install --non-interactive --site \u003Csite-url> --product jira -e development\n```\n\n## Handling `forge create` Failures\n\nWhen `forge create` fails, **never attempt workarounds or manual scaffolding**.\n\n\n| Error                                      | Action                                                                                                                                            |\n| ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Prerequisites missing (Node.js, Forge CLI) | Run Step 0 install commands, then retry                                                                                                           |\n| \"Prompts can not be meaningfully rendered\" | Ask user to run `forge create` in an interactive terminal                                                                                         |\n| \"No developer spaces found\"                | Direct user to [https:\u002F\u002Fdeveloper.atlassian.com\u002Fconsole\u002F](https:\u002F\u002Fdeveloper.atlassian.com\u002Fconsole\u002F)                                               |\n| \"directory already exists\"                 | A folder named `\u003Capp-name>` already exists inside the parent directory. Choose a different name or remove the existing folder                     |\n| Network\u002Fauth issues, not logged in         | Direct user to [https:\u002F\u002Fid.atlassian.com\u002Fmanage\u002Fapi-tokens](https:\u002F\u002Fid.atlassian.com\u002Fmanage\u002Fapi-tokens), then run `forge login` in their terminal |\n| Any other error                            | Show error, ask user for guidance                                                                                                                 |\n\n\nExample response when it fails:\n\n```\nforge create needs an interactive terminal. Please run:\n\n  ATL_FORGE_ATTRIBUTION_SKILL_NAME=forge-app-builder forge create --template jira-dashboard-gadget my-app-name\n\nOnce created, let me know and I'll help customize it.\n```\n\n## Module Selection\n\nCall `list-forge-modules` for a comprehensive, up-to-date list of all available modules organized by product. Then use `search-forge-docs` with the module name for configuration details and YAML examples.\n\n## Scripts\n\n\n| Script                        | Purpose                                                                                                                                                                                               |\n| ----------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `scripts\u002Fcreate_forge_app.py` | Create app with dev space selection and template validation. `--directory` sets the parent dir (script cd's into it). Run: `python3 -m scripts.create_forge_app`                                      |\n| `scripts\u002Flist_templates.py`   | List\u002Fvalidate all Forge templates from Atlassian registry. Run: `python3 -m scripts.list_templates`                                                                                                   |\n| `scripts\u002Fdeploy_forge_app.py` | Deploy and install app (prerequisites check, npm install, lint, deploy, install). Auto-detects cross-product scopes and installs on all required products. Run: `python3 -m scripts.deploy_forge_app` |\n\n\n## Completion checklist\n\nBefore considering the workflow done, confirm:\n\n- User selected developer space when more than one existed (or only one existed)\n- App was created via `create_forge_app` (or user ran `forge create` after a failure)\n- Code was customized and `npm install` run in the app directory\n- **Deploy script was executed by the agent** (not only manual commands given to the user)\n- If install was needed, user was asked for site URL and the script was run with `--site` (or user provided site and install completed)\n- If the app uses cross-product scopes (e.g. Confluence app reading Jira data), it was installed on **all** required products (the deploy script handles this automatically)\n\n## Common agent mistakes (avoid these)\n\n- **Picking a developer space when multiple exist** — always ask the user to choose.\n- **Skipping the deploy script** — giving only \"run `forge deploy` and `forge install`\" instructions instead of running `deploy_forge_app.py` yourself.\n- **Not asking for site URL** — when install is required, ask the user for their Atlassian site URL; do not guess or skip install.\n- **Proceeding to create app before user chooses a developer space** — wait for their selection when there are multiple spaces.\n\n## Troubleshooting\n\nFor CLI commands, debugging techniques, and common error patterns, call `forge-development-guide`. For quick checks:\n\n- **Not logged in \u002F auth failed**: Create API token at [id.atlassian.com\u002Fmanage\u002Fapi-tokens](https:\u002F\u002Fid.atlassian.com\u002Fmanage\u002Fapi-tokens), then run `forge login` in your terminal (never paste token in chat)\n- **App not appearing after install**: Check `forge logs -e development --limit 50`, verify manifest with `forge lint`, re-install with `--upgrade` if scopes changed\n- **\"forge: command not found\"**: `npm install -g @forge\u002Fcli`\n\n",{"data":41,"body":49},{"name":4,"description":6,"license":26,"labels":42,"maintainer":47,"namespace":48},[43,44,45,8,46],"confluence","jira","bitbucket","forge","amoore","cloud",{"type":50,"children":51},"root",[52,60,70,77,275,281,286,361,377,383,391,398,416,437,519,540,579,600,685,690,696,742,748,758,764,793,844,993,998,1026,1045,1051,1063,1107,1114,1124,1231,1237,1311,1317,1340,1353,1468,1481,1726,1760,1766,1786,1798,1914,1927,1946,2079,2084,2094,2100,2118,2124,2221,2227,2232,2307,2313,2377,2383,2395,2470],{"type":53,"tag":54,"props":55,"children":56},"element","h1",{"id":4},[57],{"type":58,"value":59},"text","Forge App Builder",{"type":53,"tag":61,"props":62,"children":63},"p",{},[64],{"type":53,"tag":65,"props":66,"children":67},"strong",{},[68],{"type":58,"value":69},"When building a Forge app, the agent MUST complete this workflow in order. Do not skip steps. Do not substitute manual instructions for running the scripts below.",{"type":53,"tag":71,"props":72,"children":74},"h2",{"id":73},"critical-rules",[75],{"type":58,"value":76},"Critical Rules",{"type":53,"tag":78,"props":79,"children":80},"ol",{},[81,99,109,126,144,154,164,198],{"type":53,"tag":82,"props":83,"children":84},"li",{},[85,97],{"type":53,"tag":65,"props":86,"children":87},{},[88,90],{"type":58,"value":89},"Always use ",{"type":53,"tag":91,"props":92,"children":94},"code",{"className":93},[],[95],{"type":58,"value":96},"forge create",{"type":58,"value":98}," to scaffold apps — it registers the app and generates a valid app ID",{"type":53,"tag":82,"props":100,"children":101},{},[102,107],{"type":53,"tag":65,"props":103,"children":104},{},[105],{"type":58,"value":106},"Never manually scaffold",{"type":58,"value":108}," — apps without valid app IDs cannot be deployed",{"type":53,"tag":82,"props":110,"children":111},{},[112,124],{"type":53,"tag":65,"props":113,"children":114},{},[115,117,122],{"type":58,"value":116},"If ",{"type":53,"tag":91,"props":118,"children":120},{"className":119},[],[121],{"type":58,"value":96},{"type":58,"value":123}," fails, STOP",{"type":58,"value":125}," — inform the user and provide the manual command",{"type":53,"tag":82,"props":127,"children":128},{},[129,134,136,142],{"type":53,"tag":65,"props":130,"children":131},{},[132],{"type":58,"value":133},"Never ask for API tokens in chat",{"type":58,"value":135}," — direct users to run ",{"type":53,"tag":91,"props":137,"children":139},{"className":138},[],[140],{"type":58,"value":141},"forge login",{"type":58,"value":143}," in their terminal and enter credentials there",{"type":53,"tag":82,"props":145,"children":146},{},[147,152],{"type":53,"tag":65,"props":148,"children":149},{},[150],{"type":58,"value":151},"Always ask the user to choose",{"type":58,"value":153}," when multiple options exist (developer spaces, sites) — never pick on their behalf",{"type":53,"tag":82,"props":155,"children":156},{},[157,162],{"type":53,"tag":65,"props":158,"children":159},{},[160],{"type":58,"value":161},"Always ask the user for their Atlassian site URL during installation",{"type":58,"value":163}," — never try to discover it from other apps, environment variables, or any other source",{"type":53,"tag":82,"props":165,"children":166},{},[167,172,174,180,182,188,190,196],{"type":53,"tag":65,"props":168,"children":169},{},[170],{"type":58,"value":171},"Always run the deploy script for deploy and install",{"type":58,"value":173}," — do not give the user only manual ",{"type":53,"tag":91,"props":175,"children":177},{"className":176},[],[178],{"type":58,"value":179},"forge deploy",{"type":58,"value":181}," \u002F ",{"type":53,"tag":91,"props":183,"children":185},{"className":184},[],[186],{"type":58,"value":187},"forge install",{"type":58,"value":189}," commands as the primary outcome; run ",{"type":53,"tag":91,"props":191,"children":193},{"className":192},[],[194],{"type":58,"value":195},"scripts.deploy_forge_app.py",{"type":58,"value":197}," yourself",{"type":53,"tag":82,"props":199,"children":200},{},[201,221,223,228,230,236,238,244,246,258,260,265,267,273],{"type":53,"tag":65,"props":202,"children":203},{},[204,206,212,214,219],{"type":58,"value":205},"Set ",{"type":53,"tag":91,"props":207,"children":209},{"className":208},[],[210],{"type":58,"value":211},"ATL_FORGE_ATTRIBUTION_SKILL_NAME=forge-app-builder",{"type":58,"value":213}," on ",{"type":53,"tag":91,"props":215,"children":217},{"className":216},[],[218],{"type":58,"value":46},{"type":58,"value":220}," commands run for this skill",{"type":58,"value":222}," — prefix ",{"type":53,"tag":91,"props":224,"children":226},{"className":225},[],[227],{"type":58,"value":46},{"type":58,"value":229}," invocations with this env var: ones you run in the shell (e.g. ",{"type":53,"tag":91,"props":231,"children":233},{"className":232},[],[234],{"type":58,"value":235},"forge developer-spaces list",{"type":58,"value":237},", ",{"type":53,"tag":91,"props":239,"children":241},{"className":240},[],[242],{"type":58,"value":243},"forge lint",{"type":58,"value":245},") ",{"type":53,"tag":65,"props":247,"children":248},{},[249,251,256],{"type":58,"value":250},"and the interactive ",{"type":53,"tag":91,"props":252,"children":254},{"className":253},[],[255],{"type":58,"value":96},{"type":58,"value":257}," command you hand the user as a fallback",{"type":58,"value":259},". The bundled scripts set it automatically; other commands shown in this skill omit it for brevity — add it when you run them. The only exclusions are ",{"type":53,"tag":91,"props":261,"children":263},{"className":262},[],[264],{"type":58,"value":141},{"type":58,"value":266}," and ",{"type":53,"tag":91,"props":268,"children":270},{"className":269},[],[271],{"type":58,"value":272},"forge tunnel",{"type":58,"value":274}," (user-run auth \u002F live-dev commands).",{"type":53,"tag":71,"props":276,"children":278},{"id":277},"mcp-server-prerequisites",[279],{"type":58,"value":280},"MCP Server Prerequisites",{"type":53,"tag":61,"props":282,"children":283},{},[284],{"type":58,"value":285},"This skill works best with the following MCP servers. The scripts and CLI workflow function without them, but the agent will lack access to up-to-date Forge documentation for template selection, module configuration, and code patterns.",{"type":53,"tag":287,"props":288,"children":289},"table",{},[290,314],{"type":53,"tag":291,"props":292,"children":293},"thead",{},[294],{"type":53,"tag":295,"props":296,"children":297},"tr",{},[298,304,309],{"type":53,"tag":299,"props":300,"children":301},"th",{},[302],{"type":58,"value":303},"MCP Server",{"type":53,"tag":299,"props":305,"children":306},{},[307],{"type":58,"value":308},"Required?",{"type":53,"tag":299,"props":310,"children":311},{},[312],{"type":58,"value":313},"Purpose",{"type":53,"tag":315,"props":316,"children":317},"tbody",{},[318,340],{"type":53,"tag":295,"props":319,"children":320},{},[321,330,335],{"type":53,"tag":322,"props":323,"children":324},"td",{},[325],{"type":53,"tag":65,"props":326,"children":327},{},[328],{"type":58,"value":329},"Forge MCP",{"type":53,"tag":322,"props":331,"children":332},{},[333],{"type":58,"value":334},"Strongly recommended",{"type":53,"tag":322,"props":336,"children":337},{},[338],{"type":58,"value":339},"Template lookup, module discovery, manifest syntax, UI Kit\u002Fbackend guides",{"type":53,"tag":295,"props":341,"children":342},{},[343,351,356],{"type":53,"tag":322,"props":344,"children":345},{},[346],{"type":53,"tag":65,"props":347,"children":348},{},[349],{"type":58,"value":350},"ADS MCP",{"type":53,"tag":322,"props":352,"children":353},{},[354],{"type":58,"value":355},"Optional",{"type":53,"tag":322,"props":357,"children":358},{},[359],{"type":58,"value":360},"Atlaskit component\u002Ftoken\u002Ficon lookup (Custom UI apps only)",{"type":53,"tag":61,"props":362,"children":363},{},[364,366,375],{"type":58,"value":365},"If MCP servers are not connected, inform the user that code guidance may be based on the model's training data and could be outdated. Recommend they verify against ",{"type":53,"tag":367,"props":368,"children":372},"a",{"href":369,"rel":370},"https:\u002F\u002Fdeveloper.atlassian.com\u002Fplatform\u002Fforge\u002F",[371],"nofollow",[373],{"type":58,"value":374},"developer.atlassian.com\u002Fplatform\u002Fforge",{"type":58,"value":376},".\n|",{"type":53,"tag":71,"props":378,"children":380},{"id":379},"agent-workflow",[381],{"type":58,"value":382},"Agent Workflow",{"type":53,"tag":61,"props":384,"children":385},{},[386],{"type":53,"tag":65,"props":387,"children":388},{},[389],{"type":58,"value":390},"Complete steps 0–5 in order. Run the scripts yourself; do not only instruct the user to run them.",{"type":53,"tag":392,"props":393,"children":395},"h3",{"id":394},"step-0-prerequisites-install-automatically-if-missing",[396],{"type":58,"value":397},"Step 0: Prerequisites (Install Automatically If Missing)",{"type":53,"tag":61,"props":399,"children":400},{},[401,406,408,414],{"type":53,"tag":65,"props":402,"children":403},{},[404],{"type":58,"value":405},"Before any other steps",{"type":58,"value":407},", call the ",{"type":53,"tag":91,"props":409,"children":411},{"className":410},[],[412],{"type":58,"value":413},"forge-development-guide",{"type":58,"value":415}," tool to get the current Node.js version requirement and CLI setup instructions. Then check and install prerequisites:",{"type":53,"tag":78,"props":417,"children":418},{},[419],{"type":53,"tag":82,"props":420,"children":421},{},[422,427,429,435],{"type":53,"tag":65,"props":423,"children":424},{},[425],{"type":58,"value":426},"Node.js",{"type":58,"value":428}," — Run ",{"type":53,"tag":91,"props":430,"children":432},{"className":431},[],[433],{"type":58,"value":434},"node -v",{"type":58,"value":436},". If missing or below the version specified in the development guide:",{"type":53,"tag":438,"props":439,"children":440},"ul",{},[441,457,480,502],{"type":53,"tag":82,"props":442,"children":443},{},[444,449,451],{"type":53,"tag":65,"props":445,"children":446},{},[447],{"type":58,"value":448},"macOS (Homebrew):",{"type":58,"value":450}," ",{"type":53,"tag":91,"props":452,"children":454},{"className":453},[],[455],{"type":58,"value":456},"brew install node",{"type":53,"tag":82,"props":458,"children":459},{},[460,465,466,472,474],{"type":53,"tag":65,"props":461,"children":462},{},[463],{"type":58,"value":464},"nvm:",{"type":58,"value":450},{"type":53,"tag":91,"props":467,"children":469},{"className":468},[],[470],{"type":58,"value":471},"nvm install \u003Cversion>",{"type":58,"value":473}," then ",{"type":53,"tag":91,"props":475,"children":477},{"className":476},[],[478],{"type":58,"value":479},"nvm use \u003Cversion>",{"type":53,"tag":82,"props":481,"children":482},{},[483,488,489,495,496],{"type":53,"tag":65,"props":484,"children":485},{},[486],{"type":58,"value":487},"fnm:",{"type":58,"value":450},{"type":53,"tag":91,"props":490,"children":492},{"className":491},[],[493],{"type":58,"value":494},"fnm install \u003Cversion>",{"type":58,"value":473},{"type":53,"tag":91,"props":497,"children":499},{"className":498},[],[500],{"type":58,"value":501},"fnm use \u003Cversion>",{"type":53,"tag":82,"props":503,"children":504},{},[505,510,511,517],{"type":53,"tag":65,"props":506,"children":507},{},[508],{"type":58,"value":509},"Other:",{"type":58,"value":450},{"type":53,"tag":367,"props":512,"children":515},{"href":513,"rel":514},"https:\u002F\u002Fnodejs.org",[371],[516],{"type":58,"value":513},{"type":58,"value":518}," (LTS)",{"type":53,"tag":78,"props":520,"children":522},{"start":521},2,[523],{"type":53,"tag":82,"props":524,"children":525},{},[526,531,532,538],{"type":53,"tag":65,"props":527,"children":528},{},[529],{"type":58,"value":530},"Forge CLI",{"type":58,"value":428},{"type":53,"tag":91,"props":533,"children":535},{"className":534},[],[536],{"type":58,"value":537},"forge --version",{"type":58,"value":539},". If missing:",{"type":53,"tag":541,"props":542,"children":547},"pre",{"className":543,"code":544,"language":545,"meta":546,"style":546},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight"," npm install -g @forge\u002Fcli\n","bash","",[548],{"type":53,"tag":91,"props":549,"children":550},{"__ignoreMap":546},[551],{"type":53,"tag":552,"props":553,"children":556},"span",{"class":554,"line":555},"line",1,[557,563,569,574],{"type":53,"tag":552,"props":558,"children":560},{"style":559},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[561],{"type":58,"value":562}," npm",{"type":53,"tag":552,"props":564,"children":566},{"style":565},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[567],{"type":58,"value":568}," install",{"type":53,"tag":552,"props":570,"children":571},{"style":565},[572],{"type":58,"value":573}," -g",{"type":53,"tag":552,"props":575,"children":576},{"style":565},[577],{"type":58,"value":578}," @forge\u002Fcli\n",{"type":53,"tag":78,"props":580,"children":582},{"start":581},3,[583],{"type":53,"tag":82,"props":584,"children":585},{},[586,591,592,598],{"type":53,"tag":65,"props":587,"children":588},{},[589],{"type":58,"value":590},"Forge login",{"type":58,"value":428},{"type":53,"tag":91,"props":593,"children":595},{"className":594},[],[596],{"type":58,"value":597},"forge whoami",{"type":58,"value":599},". If not logged in:",{"type":53,"tag":438,"props":601,"children":602},{},[603,613,624,655,680],{"type":53,"tag":82,"props":604,"children":605},{},[606,611],{"type":53,"tag":65,"props":607,"children":608},{},[609],{"type":58,"value":610},"Never ask for or accept API tokens in chat",{"type":58,"value":612}," — tokens are sensitive; the user must enter them only in their terminal",{"type":53,"tag":82,"props":614,"children":615},{},[616,618],{"type":58,"value":617},"Direct the user to create an API token: ",{"type":53,"tag":367,"props":619,"children":622},{"href":620,"rel":621},"https:\u002F\u002Fid.atlassian.com\u002Fmanage\u002Fapi-tokens",[371],[623],{"type":58,"value":620},{"type":53,"tag":82,"props":625,"children":626},{},[627,629,634,635,640,642],{"type":58,"value":628},"Tell the user to run ",{"type":53,"tag":91,"props":630,"children":632},{"className":631},[],[633],{"type":58,"value":141},{"type":58,"value":450},{"type":53,"tag":65,"props":636,"children":637},{},[638],{"type":58,"value":639},"in their own terminal",{"type":58,"value":641}," (not via the agent). The CLI will prompt for:\n",{"type":53,"tag":438,"props":643,"children":644},{},[645,650],{"type":53,"tag":82,"props":646,"children":647},{},[648],{"type":58,"value":649},"Atlassian email",{"type":53,"tag":82,"props":651,"children":652},{},[653],{"type":58,"value":654},"API token (paste only in the terminal when prompted)",{"type":53,"tag":82,"props":656,"children":657},{},[658,660],{"type":58,"value":659},"Example message: ",{"type":53,"tag":661,"props":662,"children":663},"em",{},[664,666,671,673,678],{"type":58,"value":665},"\"You need to log in to Forge. Create an API token at ",{"type":53,"tag":367,"props":667,"children":669},{"href":620,"rel":668},[371],[670],{"type":58,"value":620},{"type":58,"value":672},", then run ",{"type":53,"tag":91,"props":674,"children":676},{"className":675},[],[677],{"type":58,"value":141},{"type":58,"value":679}," in your terminal. Enter your email and token when prompted — do not paste them here.\"",{"type":53,"tag":82,"props":681,"children":682},{},[683],{"type":58,"value":684},"After the user confirms they've logged in, retry the workflow",{"type":53,"tag":61,"props":686,"children":687},{},[688],{"type":58,"value":689},"Install in order: Node.js first (required for npm), then Forge CLI, then login. Retry the workflow after installing.",{"type":53,"tag":392,"props":691,"children":693},{"id":692},"step-1-discover-developer-spaces",[694],{"type":58,"value":695},"Step 1: Discover Developer Spaces",{"type":53,"tag":541,"props":697,"children":699},{"className":543,"code":698,"language":545,"meta":546,"style":546},"ATL_FORGE_ATTRIBUTION_SKILL_NAME=forge-app-builder forge developer-spaces list --json\n",[700],{"type":53,"tag":91,"props":701,"children":702},{"__ignoreMap":546},[703],{"type":53,"tag":552,"props":704,"children":705},{"class":554,"line":555},[706,712,718,722,727,732,737],{"type":53,"tag":552,"props":707,"children":709},{"style":708},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[710],{"type":58,"value":711},"ATL_FORGE_ATTRIBUTION_SKILL_NAME",{"type":53,"tag":552,"props":713,"children":715},{"style":714},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[716],{"type":58,"value":717},"=",{"type":53,"tag":552,"props":719,"children":720},{"style":565},[721],{"type":58,"value":4},{"type":53,"tag":552,"props":723,"children":724},{"style":559},[725],{"type":58,"value":726}," forge",{"type":53,"tag":552,"props":728,"children":729},{"style":565},[730],{"type":58,"value":731}," developer-spaces",{"type":53,"tag":552,"props":733,"children":734},{"style":565},[735],{"type":58,"value":736}," list",{"type":53,"tag":552,"props":738,"children":739},{"style":565},[740],{"type":58,"value":741}," --json\n",{"type":53,"tag":392,"props":743,"children":745},{"id":744},"step-2-ask-user-to-choose-developer-space",[746],{"type":58,"value":747},"Step 2: Ask User to Choose Developer Space",{"type":53,"tag":61,"props":749,"children":750},{},[751,756],{"type":53,"tag":65,"props":752,"children":753},{},[754],{"type":58,"value":755},"Do not proceed to Step 3 until the user has selected a developer space.",{"type":58,"value":757}," Present the list from Step 1 (names and IDs) and ask which space to use. If only one space exists, you may use it and briefly inform the user. Never pick one of multiple spaces on the user's behalf.",{"type":53,"tag":392,"props":759,"children":761},{"id":760},"step-3-create-app",[762],{"type":58,"value":763},"Step 3: Create App",{"type":53,"tag":61,"props":765,"children":766},{},[767,769,775,777,783,785,791],{"type":58,"value":768},"All ",{"type":53,"tag":91,"props":770,"children":772},{"className":771},[],[773],{"type":58,"value":774},"python3 -m scripts.",{"type":58,"value":776},"* commands must be run from the skill directory (the directory containing this SKILL.md file). Derive it from the SKILL.md path provided in the system prompt. Use ",{"type":53,"tag":91,"props":778,"children":780},{"className":779},[],[781],{"type":58,"value":782},"python3",{"type":58,"value":784}," on macOS if ",{"type":53,"tag":91,"props":786,"children":788},{"className":787},[],[789],{"type":58,"value":790},"python",{"type":58,"value":792}," is not available.",{"type":53,"tag":61,"props":794,"children":795},{},[796,798,804,806,811,813,819,821,827,829,834,836,842],{"type":58,"value":797},"Run from the skill directory. The ",{"type":53,"tag":91,"props":799,"children":801},{"className":800},[],[802],{"type":58,"value":803},"--directory",{"type":58,"value":805}," flag sets the ",{"type":53,"tag":65,"props":807,"children":808},{},[809],{"type":58,"value":810},"parent directory",{"type":58,"value":812}," under which the app folder (named after ",{"type":53,"tag":91,"props":814,"children":816},{"className":815},[],[817],{"type":58,"value":818},"--name",{"type":58,"value":820},") will be created. The script ",{"type":53,"tag":91,"props":822,"children":824},{"className":823},[],[825],{"type":58,"value":826},"cd",{"type":58,"value":828},"s into that directory before running ",{"type":53,"tag":91,"props":830,"children":832},{"className":831},[],[833],{"type":58,"value":96},{"type":58,"value":835},", so the app appears as a subdirectory (e.g. ",{"type":53,"tag":91,"props":837,"children":839},{"className":838},[],[840],{"type":58,"value":841},"\u003Cparent-directory>\u002F\u003Capp-name>\u002F",{"type":58,"value":843},"). If omitted, the app is created under the current directory.",{"type":53,"tag":541,"props":845,"children":847},{"className":543,"code":846,"language":545,"meta":546,"style":546},"python3 -m scripts.create_forge_app \\\n  --template \u003Ctemplate> \\\n  --name \u003Capp-name> \\\n  --dev-space-id \u003Cselected-id> \\\n  --directory \u003Cparent-directory>\n",[848],{"type":53,"tag":91,"props":849,"children":850},{"__ignoreMap":546},[851,873,905,934,965],{"type":53,"tag":552,"props":852,"children":853},{"class":554,"line":555},[854,858,863,868],{"type":53,"tag":552,"props":855,"children":856},{"style":559},[857],{"type":58,"value":782},{"type":53,"tag":552,"props":859,"children":860},{"style":565},[861],{"type":58,"value":862}," -m",{"type":53,"tag":552,"props":864,"children":865},{"style":565},[866],{"type":58,"value":867}," scripts.create_forge_app",{"type":53,"tag":552,"props":869,"children":870},{"style":708},[871],{"type":58,"value":872}," \\\n",{"type":53,"tag":552,"props":874,"children":875},{"class":554,"line":521},[876,881,886,891,896,901],{"type":53,"tag":552,"props":877,"children":878},{"style":565},[879],{"type":58,"value":880},"  --template",{"type":53,"tag":552,"props":882,"children":883},{"style":714},[884],{"type":58,"value":885}," \u003C",{"type":53,"tag":552,"props":887,"children":888},{"style":565},[889],{"type":58,"value":890},"templat",{"type":53,"tag":552,"props":892,"children":893},{"style":708},[894],{"type":58,"value":895},"e",{"type":53,"tag":552,"props":897,"children":898},{"style":714},[899],{"type":58,"value":900},">",{"type":53,"tag":552,"props":902,"children":903},{"style":708},[904],{"type":58,"value":872},{"type":53,"tag":552,"props":906,"children":907},{"class":554,"line":581},[908,913,917,922,926,930],{"type":53,"tag":552,"props":909,"children":910},{"style":565},[911],{"type":58,"value":912},"  --name",{"type":53,"tag":552,"props":914,"children":915},{"style":714},[916],{"type":58,"value":885},{"type":53,"tag":552,"props":918,"children":919},{"style":565},[920],{"type":58,"value":921},"app-nam",{"type":53,"tag":552,"props":923,"children":924},{"style":708},[925],{"type":58,"value":895},{"type":53,"tag":552,"props":927,"children":928},{"style":714},[929],{"type":58,"value":900},{"type":53,"tag":552,"props":931,"children":932},{"style":708},[933],{"type":58,"value":872},{"type":53,"tag":552,"props":935,"children":937},{"class":554,"line":936},4,[938,943,947,952,957,961],{"type":53,"tag":552,"props":939,"children":940},{"style":565},[941],{"type":58,"value":942},"  --dev-space-id",{"type":53,"tag":552,"props":944,"children":945},{"style":714},[946],{"type":58,"value":885},{"type":53,"tag":552,"props":948,"children":949},{"style":565},[950],{"type":58,"value":951},"selected-i",{"type":53,"tag":552,"props":953,"children":954},{"style":708},[955],{"type":58,"value":956},"d",{"type":53,"tag":552,"props":958,"children":959},{"style":714},[960],{"type":58,"value":900},{"type":53,"tag":552,"props":962,"children":963},{"style":708},[964],{"type":58,"value":872},{"type":53,"tag":552,"props":966,"children":968},{"class":554,"line":967},5,[969,974,978,983,988],{"type":53,"tag":552,"props":970,"children":971},{"style":565},[972],{"type":58,"value":973},"  --directory",{"type":53,"tag":552,"props":975,"children":976},{"style":714},[977],{"type":58,"value":885},{"type":53,"tag":552,"props":979,"children":980},{"style":565},[981],{"type":58,"value":982},"parent-director",{"type":53,"tag":552,"props":984,"children":985},{"style":708},[986],{"type":58,"value":987},"y",{"type":53,"tag":552,"props":989,"children":990},{"style":714},[991],{"type":58,"value":992},">\n",{"type":53,"tag":61,"props":994,"children":995},{},[996],{"type":58,"value":997},"To find the right template for the user's needs:",{"type":53,"tag":438,"props":999,"children":1000},{},[1001,1014],{"type":53,"tag":82,"props":1002,"children":1003},{},[1004,1006,1012],{"type":58,"value":1005},"Call ",{"type":53,"tag":91,"props":1007,"children":1009},{"className":1008},[],[1010],{"type":58,"value":1011},"list-forge-modules",{"type":58,"value":1013}," to identify the appropriate module type",{"type":53,"tag":82,"props":1015,"children":1016},{},[1017,1018,1024],{"type":58,"value":1005},{"type":53,"tag":91,"props":1019,"children":1021},{"className":1020},[],[1022],{"type":58,"value":1023},"search-forge-docs",{"type":58,"value":1025}," with a query like \"template for \" to find the matching template name",{"type":53,"tag":61,"props":1027,"children":1028},{},[1029,1031,1037,1039],{"type":58,"value":1030},"Validate a template: ",{"type":53,"tag":91,"props":1032,"children":1034},{"className":1033},[],[1035],{"type":58,"value":1036},"python3 -m scripts.list_templates --validate \u003Cname>",{"type":58,"value":1038},"\nList all templates: ",{"type":53,"tag":91,"props":1040,"children":1042},{"className":1041},[],[1043],{"type":58,"value":1044},"python3 -m scripts.list_templates --list",{"type":53,"tag":392,"props":1046,"children":1048},{"id":1047},"step-4-customize-code",[1049],{"type":58,"value":1050},"Step 4: Customize Code",{"type":53,"tag":61,"props":1052,"children":1053},{},[1054,1056,1061],{"type":58,"value":1055},"After ",{"type":53,"tag":91,"props":1057,"children":1059},{"className":1058},[],[1060],{"type":58,"value":96},{"type":58,"value":1062}," succeeds:",{"type":53,"tag":541,"props":1064,"children":1066},{"className":543,"code":1065,"language":545,"meta":546,"style":546},"cd \u003Capp-name>\nnpm install\n",[1067],{"type":53,"tag":91,"props":1068,"children":1069},{"__ignoreMap":546},[1070,1094],{"type":53,"tag":552,"props":1071,"children":1072},{"class":554,"line":555},[1073,1078,1082,1086,1090],{"type":53,"tag":552,"props":1074,"children":1076},{"style":1075},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[1077],{"type":58,"value":826},{"type":53,"tag":552,"props":1079,"children":1080},{"style":714},[1081],{"type":58,"value":885},{"type":53,"tag":552,"props":1083,"children":1084},{"style":565},[1085],{"type":58,"value":921},{"type":53,"tag":552,"props":1087,"children":1088},{"style":708},[1089],{"type":58,"value":895},{"type":53,"tag":552,"props":1091,"children":1092},{"style":714},[1093],{"type":58,"value":992},{"type":53,"tag":552,"props":1095,"children":1096},{"class":554,"line":521},[1097,1102],{"type":53,"tag":552,"props":1098,"children":1099},{"style":559},[1100],{"type":58,"value":1101},"npm",{"type":53,"tag":552,"props":1103,"children":1104},{"style":565},[1105],{"type":58,"value":1106}," install\n",{"type":53,"tag":1108,"props":1109,"children":1111},"h4",{"id":1110},"ui-kit-vs-custom-ui-choose-the-right-tools",[1112],{"type":58,"value":1113},"UI Kit vs Custom UI — Choose the Right Tools",{"type":53,"tag":61,"props":1115,"children":1116},{},[1117,1119],{"type":58,"value":1118},"Before writing any UI code, determine which approach the app uses. ",{"type":53,"tag":65,"props":1120,"children":1121},{},[1122],{"type":58,"value":1123},"Getting this wrong causes import errors and broken builds.",{"type":53,"tag":438,"props":1125,"children":1126},{},[1127,1176],{"type":53,"tag":82,"props":1128,"children":1129},{},[1130,1135,1137,1142,1144,1150,1152,1158,1160,1166,1168,1174],{"type":53,"tag":65,"props":1131,"children":1132},{},[1133],{"type":58,"value":1134},"UI Kit",{"type":58,"value":1136}," (most ",{"type":53,"tag":91,"props":1138,"children":1140},{"className":1139},[],[1141],{"type":58,"value":96},{"type":58,"value":1143}," templates): manifest uses ",{"type":53,"tag":91,"props":1145,"children":1147},{"className":1146},[],[1148],{"type":58,"value":1149},"render: native",{"type":58,"value":1151}," or code imports from ",{"type":53,"tag":91,"props":1153,"children":1155},{"className":1154},[],[1156],{"type":58,"value":1157},"@forge\u002Freact",{"type":58,"value":1159},". Use ",{"type":53,"tag":91,"props":1161,"children":1163},{"className":1162},[],[1164],{"type":58,"value":1165},"forge-ui-kit-developer-guide",{"type":58,"value":1167}," as the ONLY UI reference. Do NOT suggest ",{"type":53,"tag":91,"props":1169,"children":1171},{"className":1170},[],[1172],{"type":58,"value":1173},"@atlaskit\u002F",{"type":58,"value":1175},"* imports — they won't work.",{"type":53,"tag":82,"props":1177,"children":1178},{},[1179,1184,1186,1192,1194,1200,1202,1208,1209,1215,1216,1222,1224,1229],{"type":53,"tag":65,"props":1180,"children":1181},{},[1182],{"type":58,"value":1183},"Custom UI",{"type":58,"value":1185},": manifest has ",{"type":53,"tag":91,"props":1187,"children":1189},{"className":1188},[],[1190],{"type":58,"value":1191},"resource",{"type":58,"value":1193}," pointing to a ",{"type":53,"tag":91,"props":1195,"children":1197},{"className":1196},[],[1198],{"type":58,"value":1199},"static\u002F",{"type":58,"value":1201}," directory. Use ADS MCP tools (",{"type":53,"tag":91,"props":1203,"children":1205},{"className":1204},[],[1206],{"type":58,"value":1207},"ads_plan",{"type":58,"value":237},{"type":53,"tag":91,"props":1210,"children":1212},{"className":1211},[],[1213],{"type":58,"value":1214},"ads_get_components",{"type":58,"value":237},{"type":53,"tag":91,"props":1217,"children":1219},{"className":1218},[],[1220],{"type":58,"value":1221},"ads_get_all_icons",{"type":58,"value":1223},") for component discovery. Do NOT use ",{"type":53,"tag":91,"props":1225,"children":1227},{"className":1226},[],[1228],{"type":58,"value":1165},{"type":58,"value":1230}," — it describes a different API.",{"type":53,"tag":1108,"props":1232,"children":1234},{"id":1233},"knowledge-tools-for-implementation",[1235],{"type":58,"value":1236},"Knowledge tools for implementation",{"type":53,"tag":438,"props":1238,"children":1239},{},[1240,1257,1279,1290,1301],{"type":53,"tag":82,"props":1241,"children":1242},{},[1243,1248,1250,1255],{"type":53,"tag":91,"props":1244,"children":1246},{"className":1245},[],[1247],{"type":58,"value":1165},{"type":58,"value":1249}," — Frontend components (",{"type":53,"tag":65,"props":1251,"children":1252},{},[1253],{"type":58,"value":1254},"UI Kit only",{"type":58,"value":1256},")",{"type":53,"tag":82,"props":1258,"children":1259},{},[1260,1265,1266,1271,1273,1278],{"type":53,"tag":91,"props":1261,"children":1263},{"className":1262},[],[1264],{"type":58,"value":1207},{"type":58,"value":181},{"type":53,"tag":91,"props":1267,"children":1269},{"className":1268},[],[1270],{"type":58,"value":1214},{"type":58,"value":1272}," — Component and token lookup (",{"type":53,"tag":65,"props":1274,"children":1275},{},[1276],{"type":58,"value":1277},"Custom UI only",{"type":58,"value":1256},{"type":53,"tag":82,"props":1280,"children":1281},{},[1282,1288],{"type":53,"tag":91,"props":1283,"children":1285},{"className":1284},[],[1286],{"type":58,"value":1287},"forge-backend-developer-guide",{"type":58,"value":1289}," — Backend resolvers and APIs",{"type":53,"tag":82,"props":1291,"children":1292},{},[1293,1299],{"type":53,"tag":91,"props":1294,"children":1296},{"className":1295},[],[1297],{"type":58,"value":1298},"forge-app-manifest-guide",{"type":58,"value":1300}," — Manifest configuration",{"type":53,"tag":82,"props":1302,"children":1303},{},[1304,1309],{"type":53,"tag":91,"props":1305,"children":1307},{"className":1306},[],[1308],{"type":58,"value":1023},{"type":58,"value":1310}," — Search for specific APIs or props",{"type":53,"tag":392,"props":1312,"children":1314},{"id":1313},"step-5-deploy-and-install-run-the-deploy-script",[1315],{"type":58,"value":1316},"Step 5: Deploy and Install (run the deploy script)",{"type":53,"tag":61,"props":1318,"children":1319},{},[1320,1325,1327,1332,1333,1338],{"type":53,"tag":65,"props":1321,"children":1322},{},[1323],{"type":58,"value":1324},"You MUST run the deploy script",{"type":58,"value":1326}," — do not only paste manual ",{"type":53,"tag":91,"props":1328,"children":1330},{"className":1329},[],[1331],{"type":58,"value":179},{"type":58,"value":181},{"type":53,"tag":91,"props":1334,"children":1336},{"className":1335},[],[1337],{"type":58,"value":187},{"type":58,"value":1339}," commands for the user to run. Execute the script from the skill directory.",{"type":53,"tag":438,"props":1341,"children":1342},{},[1343],{"type":53,"tag":82,"props":1344,"children":1345},{},[1346,1351],{"type":53,"tag":65,"props":1347,"children":1348},{},[1349],{"type":58,"value":1350},"If you have the user's Atlassian site URL",{"type":58,"value":1352}," (e.g. they provided it earlier or in the request), run in one go:",{"type":53,"tag":541,"props":1354,"children":1356},{"className":543,"code":1355,"language":545,"meta":546,"style":546},"python3 -m scripts.deploy_forge_app \\\n  --app-dir \u003Capp-directory> \\\n  --site \u003Csite-url> \\\n  --product \u003Cjira|confluence>\n",[1357],{"type":53,"tag":91,"props":1358,"children":1359},{"__ignoreMap":546},[1360,1380,1409,1439],{"type":53,"tag":552,"props":1361,"children":1362},{"class":554,"line":555},[1363,1367,1371,1376],{"type":53,"tag":552,"props":1364,"children":1365},{"style":559},[1366],{"type":58,"value":782},{"type":53,"tag":552,"props":1368,"children":1369},{"style":565},[1370],{"type":58,"value":862},{"type":53,"tag":552,"props":1372,"children":1373},{"style":565},[1374],{"type":58,"value":1375}," scripts.deploy_forge_app",{"type":53,"tag":552,"props":1377,"children":1378},{"style":708},[1379],{"type":58,"value":872},{"type":53,"tag":552,"props":1381,"children":1382},{"class":554,"line":521},[1383,1388,1392,1397,1401,1405],{"type":53,"tag":552,"props":1384,"children":1385},{"style":565},[1386],{"type":58,"value":1387},"  --app-dir",{"type":53,"tag":552,"props":1389,"children":1390},{"style":714},[1391],{"type":58,"value":885},{"type":53,"tag":552,"props":1393,"children":1394},{"style":565},[1395],{"type":58,"value":1396},"app-director",{"type":53,"tag":552,"props":1398,"children":1399},{"style":708},[1400],{"type":58,"value":987},{"type":53,"tag":552,"props":1402,"children":1403},{"style":714},[1404],{"type":58,"value":900},{"type":53,"tag":552,"props":1406,"children":1407},{"style":708},[1408],{"type":58,"value":872},{"type":53,"tag":552,"props":1410,"children":1411},{"class":554,"line":581},[1412,1417,1421,1426,1431,1435],{"type":53,"tag":552,"props":1413,"children":1414},{"style":565},[1415],{"type":58,"value":1416},"  --site",{"type":53,"tag":552,"props":1418,"children":1419},{"style":714},[1420],{"type":58,"value":885},{"type":53,"tag":552,"props":1422,"children":1423},{"style":565},[1424],{"type":58,"value":1425},"site-ur",{"type":53,"tag":552,"props":1427,"children":1428},{"style":708},[1429],{"type":58,"value":1430},"l",{"type":53,"tag":552,"props":1432,"children":1433},{"style":714},[1434],{"type":58,"value":900},{"type":53,"tag":552,"props":1436,"children":1437},{"style":708},[1438],{"type":58,"value":872},{"type":53,"tag":552,"props":1440,"children":1441},{"class":554,"line":936},[1442,1447,1451,1455,1460,1464],{"type":53,"tag":552,"props":1443,"children":1444},{"style":565},[1445],{"type":58,"value":1446},"  --product",{"type":53,"tag":552,"props":1448,"children":1449},{"style":714},[1450],{"type":58,"value":885},{"type":53,"tag":552,"props":1452,"children":1453},{"style":565},[1454],{"type":58,"value":44},{"type":53,"tag":552,"props":1456,"children":1457},{"style":714},[1458],{"type":58,"value":1459},"|",{"type":53,"tag":552,"props":1461,"children":1462},{"style":559},[1463],{"type":58,"value":43},{"type":53,"tag":552,"props":1465,"children":1466},{"style":708},[1467],{"type":58,"value":992},{"type":53,"tag":438,"props":1469,"children":1470},{},[1471],{"type":53,"tag":82,"props":1472,"children":1473},{},[1474,1479],{"type":53,"tag":65,"props":1475,"children":1476},{},[1477],{"type":58,"value":1478},"If you do not have the site URL yet:",{"type":58,"value":1480}," run deploy only, then ask for the site, then run again to install:",{"type":53,"tag":541,"props":1482,"children":1484},{"className":543,"code":1483,"language":545,"meta":546,"style":546},"# 1) Deploy only\npython3 -m scripts.deploy_forge_app \\\n  --app-dir \u003Capp-directory> \\\n  --product \u003Cjira|confluence> \\\n  --deploy-only\n\n# 2) Ask the user: \"What is your Atlassian site URL (e.g. yourcompany.atlassian.net)?\"\n\n# 3) After they reply, run again with their site to complete install\npython3 -m scripts.deploy_forge_app \\\n  --app-dir \u003Capp-directory> \\\n  --site \u003Csite-url> \\\n  --product \u003Cjira|confluence> \\\n  --skip-deps\n",[1485],{"type":53,"tag":91,"props":1486,"children":1487},{"__ignoreMap":546},[1488,1497,1516,1543,1571,1579,1589,1597,1605,1614,1634,1662,1690,1718],{"type":53,"tag":552,"props":1489,"children":1490},{"class":554,"line":555},[1491],{"type":53,"tag":552,"props":1492,"children":1494},{"style":1493},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[1495],{"type":58,"value":1496},"# 1) Deploy only\n",{"type":53,"tag":552,"props":1498,"children":1499},{"class":554,"line":521},[1500,1504,1508,1512],{"type":53,"tag":552,"props":1501,"children":1502},{"style":559},[1503],{"type":58,"value":782},{"type":53,"tag":552,"props":1505,"children":1506},{"style":565},[1507],{"type":58,"value":862},{"type":53,"tag":552,"props":1509,"children":1510},{"style":565},[1511],{"type":58,"value":1375},{"type":53,"tag":552,"props":1513,"children":1514},{"style":708},[1515],{"type":58,"value":872},{"type":53,"tag":552,"props":1517,"children":1518},{"class":554,"line":581},[1519,1523,1527,1531,1535,1539],{"type":53,"tag":552,"props":1520,"children":1521},{"style":565},[1522],{"type":58,"value":1387},{"type":53,"tag":552,"props":1524,"children":1525},{"style":714},[1526],{"type":58,"value":885},{"type":53,"tag":552,"props":1528,"children":1529},{"style":565},[1530],{"type":58,"value":1396},{"type":53,"tag":552,"props":1532,"children":1533},{"style":708},[1534],{"type":58,"value":987},{"type":53,"tag":552,"props":1536,"children":1537},{"style":714},[1538],{"type":58,"value":900},{"type":53,"tag":552,"props":1540,"children":1541},{"style":708},[1542],{"type":58,"value":872},{"type":53,"tag":552,"props":1544,"children":1545},{"class":554,"line":936},[1546,1550,1554,1558,1562,1566],{"type":53,"tag":552,"props":1547,"children":1548},{"style":565},[1549],{"type":58,"value":1446},{"type":53,"tag":552,"props":1551,"children":1552},{"style":714},[1553],{"type":58,"value":885},{"type":53,"tag":552,"props":1555,"children":1556},{"style":565},[1557],{"type":58,"value":44},{"type":53,"tag":552,"props":1559,"children":1560},{"style":714},[1561],{"type":58,"value":1459},{"type":53,"tag":552,"props":1563,"children":1564},{"style":559},[1565],{"type":58,"value":43},{"type":53,"tag":552,"props":1567,"children":1568},{"style":708},[1569],{"type":58,"value":1570},"> \\\n",{"type":53,"tag":552,"props":1572,"children":1573},{"class":554,"line":967},[1574],{"type":53,"tag":552,"props":1575,"children":1576},{"style":565},[1577],{"type":58,"value":1578},"  --deploy-only\n",{"type":53,"tag":552,"props":1580,"children":1582},{"class":554,"line":1581},6,[1583],{"type":53,"tag":552,"props":1584,"children":1586},{"emptyLinePlaceholder":1585},true,[1587],{"type":58,"value":1588},"\n",{"type":53,"tag":552,"props":1590,"children":1591},{"class":554,"line":27},[1592],{"type":53,"tag":552,"props":1593,"children":1594},{"style":1493},[1595],{"type":58,"value":1596},"# 2) Ask the user: \"What is your Atlassian site URL (e.g. yourcompany.atlassian.net)?\"\n",{"type":53,"tag":552,"props":1598,"children":1600},{"class":554,"line":1599},8,[1601],{"type":53,"tag":552,"props":1602,"children":1603},{"emptyLinePlaceholder":1585},[1604],{"type":58,"value":1588},{"type":53,"tag":552,"props":1606,"children":1608},{"class":554,"line":1607},9,[1609],{"type":53,"tag":552,"props":1610,"children":1611},{"style":1493},[1612],{"type":58,"value":1613},"# 3) After they reply, run again with their site to complete install\n",{"type":53,"tag":552,"props":1615,"children":1617},{"class":554,"line":1616},10,[1618,1622,1626,1630],{"type":53,"tag":552,"props":1619,"children":1620},{"style":559},[1621],{"type":58,"value":782},{"type":53,"tag":552,"props":1623,"children":1624},{"style":565},[1625],{"type":58,"value":862},{"type":53,"tag":552,"props":1627,"children":1628},{"style":565},[1629],{"type":58,"value":1375},{"type":53,"tag":552,"props":1631,"children":1632},{"style":708},[1633],{"type":58,"value":872},{"type":53,"tag":552,"props":1635,"children":1637},{"class":554,"line":1636},11,[1638,1642,1646,1650,1654,1658],{"type":53,"tag":552,"props":1639,"children":1640},{"style":565},[1641],{"type":58,"value":1387},{"type":53,"tag":552,"props":1643,"children":1644},{"style":714},[1645],{"type":58,"value":885},{"type":53,"tag":552,"props":1647,"children":1648},{"style":565},[1649],{"type":58,"value":1396},{"type":53,"tag":552,"props":1651,"children":1652},{"style":708},[1653],{"type":58,"value":987},{"type":53,"tag":552,"props":1655,"children":1656},{"style":714},[1657],{"type":58,"value":900},{"type":53,"tag":552,"props":1659,"children":1660},{"style":708},[1661],{"type":58,"value":872},{"type":53,"tag":552,"props":1663,"children":1665},{"class":554,"line":1664},12,[1666,1670,1674,1678,1682,1686],{"type":53,"tag":552,"props":1667,"children":1668},{"style":565},[1669],{"type":58,"value":1416},{"type":53,"tag":552,"props":1671,"children":1672},{"style":714},[1673],{"type":58,"value":885},{"type":53,"tag":552,"props":1675,"children":1676},{"style":565},[1677],{"type":58,"value":1425},{"type":53,"tag":552,"props":1679,"children":1680},{"style":708},[1681],{"type":58,"value":1430},{"type":53,"tag":552,"props":1683,"children":1684},{"style":714},[1685],{"type":58,"value":900},{"type":53,"tag":552,"props":1687,"children":1688},{"style":708},[1689],{"type":58,"value":872},{"type":53,"tag":552,"props":1691,"children":1693},{"class":554,"line":1692},13,[1694,1698,1702,1706,1710,1714],{"type":53,"tag":552,"props":1695,"children":1696},{"style":565},[1697],{"type":58,"value":1446},{"type":53,"tag":552,"props":1699,"children":1700},{"style":714},[1701],{"type":58,"value":885},{"type":53,"tag":552,"props":1703,"children":1704},{"style":565},[1705],{"type":58,"value":44},{"type":53,"tag":552,"props":1707,"children":1708},{"style":714},[1709],{"type":58,"value":1459},{"type":53,"tag":552,"props":1711,"children":1712},{"style":559},[1713],{"type":58,"value":43},{"type":53,"tag":552,"props":1715,"children":1716},{"style":708},[1717],{"type":58,"value":1570},{"type":53,"tag":552,"props":1719,"children":1720},{"class":554,"line":23},[1721],{"type":53,"tag":552,"props":1722,"children":1723},{"style":565},[1724],{"type":58,"value":1725},"  --skip-deps\n",{"type":53,"tag":61,"props":1727,"children":1728},{},[1729,1734,1736,1742,1744,1750,1752,1758],{"type":53,"tag":65,"props":1730,"children":1731},{},[1732],{"type":58,"value":1733},"Always ask the user for their site URL",{"type":58,"value":1735}," when needed for install; never try to discover it. If scopes changed from a previous install, add ",{"type":53,"tag":91,"props":1737,"children":1739},{"className":1738},[],[1740],{"type":58,"value":1741},"--upgrade",{"type":58,"value":1743}," to the install (or run the script again with ",{"type":53,"tag":91,"props":1745,"children":1747},{"className":1746},[],[1748],{"type":58,"value":1749},"--site",{"type":58,"value":1751}," and the script will handle it; for manual upgrade use ",{"type":53,"tag":91,"props":1753,"children":1755},{"className":1754},[],[1756],{"type":58,"value":1757},"forge install ... --upgrade",{"type":58,"value":1759},").",{"type":53,"tag":1108,"props":1761,"children":1763},{"id":1762},"cross-product-installation",[1764],{"type":58,"value":1765},"Cross-product installation",{"type":53,"tag":61,"props":1767,"children":1768},{},[1769,1771,1776,1778,1784],{"type":58,"value":1770},"When an app uses scopes from multiple products (e.g. a Confluence macro that also reads Jira data), the deploy script ",{"type":53,"tag":65,"props":1772,"children":1773},{},[1774],{"type":58,"value":1775},"automatically detects",{"type":58,"value":1777}," the required products from the manifest scopes and installs on all of them. The ",{"type":53,"tag":91,"props":1779,"children":1781},{"className":1780},[],[1782],{"type":58,"value":1783},"--product",{"type":58,"value":1785}," flag sets the primary product; the script adds any additional products found in the scopes.",{"type":53,"tag":61,"props":1787,"children":1788},{},[1789,1791,1796],{"type":58,"value":1790},"If you need to install manually, run ",{"type":53,"tag":91,"props":1792,"children":1794},{"className":1793},[],[1795],{"type":58,"value":187},{"type":58,"value":1797}," once per product:",{"type":53,"tag":541,"props":1799,"children":1801},{"className":543,"code":1800,"language":545,"meta":546,"style":546},"forge install --non-interactive --site \u003Csite-url> --product confluence -e development\nforge install --non-interactive --site \u003Csite-url> --product jira -e development\n",[1802],{"type":53,"tag":91,"props":1803,"children":1804},{"__ignoreMap":546},[1805,1862],{"type":53,"tag":552,"props":1806,"children":1807},{"class":554,"line":555},[1808,1812,1816,1821,1826,1830,1834,1838,1842,1847,1852,1857],{"type":53,"tag":552,"props":1809,"children":1810},{"style":559},[1811],{"type":58,"value":46},{"type":53,"tag":552,"props":1813,"children":1814},{"style":565},[1815],{"type":58,"value":568},{"type":53,"tag":552,"props":1817,"children":1818},{"style":565},[1819],{"type":58,"value":1820}," --non-interactive",{"type":53,"tag":552,"props":1822,"children":1823},{"style":565},[1824],{"type":58,"value":1825}," --site",{"type":53,"tag":552,"props":1827,"children":1828},{"style":714},[1829],{"type":58,"value":885},{"type":53,"tag":552,"props":1831,"children":1832},{"style":565},[1833],{"type":58,"value":1425},{"type":53,"tag":552,"props":1835,"children":1836},{"style":708},[1837],{"type":58,"value":1430},{"type":53,"tag":552,"props":1839,"children":1840},{"style":714},[1841],{"type":58,"value":900},{"type":53,"tag":552,"props":1843,"children":1844},{"style":565},[1845],{"type":58,"value":1846}," --product",{"type":53,"tag":552,"props":1848,"children":1849},{"style":565},[1850],{"type":58,"value":1851}," confluence",{"type":53,"tag":552,"props":1853,"children":1854},{"style":565},[1855],{"type":58,"value":1856}," -e",{"type":53,"tag":552,"props":1858,"children":1859},{"style":565},[1860],{"type":58,"value":1861}," development\n",{"type":53,"tag":552,"props":1863,"children":1864},{"class":554,"line":521},[1865,1869,1873,1877,1881,1885,1889,1893,1897,1901,1906,1910],{"type":53,"tag":552,"props":1866,"children":1867},{"style":559},[1868],{"type":58,"value":46},{"type":53,"tag":552,"props":1870,"children":1871},{"style":565},[1872],{"type":58,"value":568},{"type":53,"tag":552,"props":1874,"children":1875},{"style":565},[1876],{"type":58,"value":1820},{"type":53,"tag":552,"props":1878,"children":1879},{"style":565},[1880],{"type":58,"value":1825},{"type":53,"tag":552,"props":1882,"children":1883},{"style":714},[1884],{"type":58,"value":885},{"type":53,"tag":552,"props":1886,"children":1887},{"style":565},[1888],{"type":58,"value":1425},{"type":53,"tag":552,"props":1890,"children":1891},{"style":708},[1892],{"type":58,"value":1430},{"type":53,"tag":552,"props":1894,"children":1895},{"style":714},[1896],{"type":58,"value":900},{"type":53,"tag":552,"props":1898,"children":1899},{"style":565},[1900],{"type":58,"value":1846},{"type":53,"tag":552,"props":1902,"children":1903},{"style":565},[1904],{"type":58,"value":1905}," jira",{"type":53,"tag":552,"props":1907,"children":1908},{"style":565},[1909],{"type":58,"value":1856},{"type":53,"tag":552,"props":1911,"children":1912},{"style":565},[1913],{"type":58,"value":1861},{"type":53,"tag":71,"props":1915,"children":1917},{"id":1916},"handling-forge-create-failures",[1918,1920,1925],{"type":58,"value":1919},"Handling ",{"type":53,"tag":91,"props":1921,"children":1923},{"className":1922},[],[1924],{"type":58,"value":96},{"type":58,"value":1926}," Failures",{"type":53,"tag":61,"props":1928,"children":1929},{},[1930,1932,1937,1939,1944],{"type":58,"value":1931},"When ",{"type":53,"tag":91,"props":1933,"children":1935},{"className":1934},[],[1936],{"type":58,"value":96},{"type":58,"value":1938}," fails, ",{"type":53,"tag":65,"props":1940,"children":1941},{},[1942],{"type":58,"value":1943},"never attempt workarounds or manual scaffolding",{"type":58,"value":1945},".",{"type":53,"tag":287,"props":1947,"children":1948},{},[1949,1965],{"type":53,"tag":291,"props":1950,"children":1951},{},[1952],{"type":53,"tag":295,"props":1953,"children":1954},{},[1955,1960],{"type":53,"tag":299,"props":1956,"children":1957},{},[1958],{"type":58,"value":1959},"Error",{"type":53,"tag":299,"props":1961,"children":1962},{},[1963],{"type":58,"value":1964},"Action",{"type":53,"tag":315,"props":1966,"children":1967},{},[1968,1981,2001,2020,2041,2066],{"type":53,"tag":295,"props":1969,"children":1970},{},[1971,1976],{"type":53,"tag":322,"props":1972,"children":1973},{},[1974],{"type":58,"value":1975},"Prerequisites missing (Node.js, Forge CLI)",{"type":53,"tag":322,"props":1977,"children":1978},{},[1979],{"type":58,"value":1980},"Run Step 0 install commands, then retry",{"type":53,"tag":295,"props":1982,"children":1983},{},[1984,1989],{"type":53,"tag":322,"props":1985,"children":1986},{},[1987],{"type":58,"value":1988},"\"Prompts can not be meaningfully rendered\"",{"type":53,"tag":322,"props":1990,"children":1991},{},[1992,1994,1999],{"type":58,"value":1993},"Ask user to run ",{"type":53,"tag":91,"props":1995,"children":1997},{"className":1996},[],[1998],{"type":58,"value":96},{"type":58,"value":2000}," in an interactive terminal",{"type":53,"tag":295,"props":2002,"children":2003},{},[2004,2009],{"type":53,"tag":322,"props":2005,"children":2006},{},[2007],{"type":58,"value":2008},"\"No developer spaces found\"",{"type":53,"tag":322,"props":2010,"children":2011},{},[2012,2014],{"type":58,"value":2013},"Direct user to ",{"type":53,"tag":367,"props":2015,"children":2018},{"href":2016,"rel":2017},"https:\u002F\u002Fdeveloper.atlassian.com\u002Fconsole\u002F",[371],[2019],{"type":58,"value":2016},{"type":53,"tag":295,"props":2021,"children":2022},{},[2023,2028],{"type":53,"tag":322,"props":2024,"children":2025},{},[2026],{"type":58,"value":2027},"\"directory already exists\"",{"type":53,"tag":322,"props":2029,"children":2030},{},[2031,2033,2039],{"type":58,"value":2032},"A folder named ",{"type":53,"tag":91,"props":2034,"children":2036},{"className":2035},[],[2037],{"type":58,"value":2038},"\u003Capp-name>",{"type":58,"value":2040}," already exists inside the parent directory. Choose a different name or remove the existing folder",{"type":53,"tag":295,"props":2042,"children":2043},{},[2044,2049],{"type":53,"tag":322,"props":2045,"children":2046},{},[2047],{"type":58,"value":2048},"Network\u002Fauth issues, not logged in",{"type":53,"tag":322,"props":2050,"children":2051},{},[2052,2053,2058,2059,2064],{"type":58,"value":2013},{"type":53,"tag":367,"props":2054,"children":2056},{"href":620,"rel":2055},[371],[2057],{"type":58,"value":620},{"type":58,"value":672},{"type":53,"tag":91,"props":2060,"children":2062},{"className":2061},[],[2063],{"type":58,"value":141},{"type":58,"value":2065}," in their terminal",{"type":53,"tag":295,"props":2067,"children":2068},{},[2069,2074],{"type":53,"tag":322,"props":2070,"children":2071},{},[2072],{"type":58,"value":2073},"Any other error",{"type":53,"tag":322,"props":2075,"children":2076},{},[2077],{"type":58,"value":2078},"Show error, ask user for guidance",{"type":53,"tag":61,"props":2080,"children":2081},{},[2082],{"type":58,"value":2083},"Example response when it fails:",{"type":53,"tag":541,"props":2085,"children":2089},{"className":2086,"code":2088,"language":58},[2087],"language-text","forge create needs an interactive terminal. Please run:\n\n  ATL_FORGE_ATTRIBUTION_SKILL_NAME=forge-app-builder forge create --template jira-dashboard-gadget my-app-name\n\nOnce created, let me know and I'll help customize it.\n",[2090],{"type":53,"tag":91,"props":2091,"children":2092},{"__ignoreMap":546},[2093],{"type":58,"value":2088},{"type":53,"tag":71,"props":2095,"children":2097},{"id":2096},"module-selection",[2098],{"type":58,"value":2099},"Module Selection",{"type":53,"tag":61,"props":2101,"children":2102},{},[2103,2104,2109,2111,2116],{"type":58,"value":1005},{"type":53,"tag":91,"props":2105,"children":2107},{"className":2106},[],[2108],{"type":58,"value":1011},{"type":58,"value":2110}," for a comprehensive, up-to-date list of all available modules organized by product. Then use ",{"type":53,"tag":91,"props":2112,"children":2114},{"className":2113},[],[2115],{"type":58,"value":1023},{"type":58,"value":2117}," with the module name for configuration details and YAML examples.",{"type":53,"tag":71,"props":2119,"children":2121},{"id":2120},"scripts",[2122],{"type":58,"value":2123},"Scripts",{"type":53,"tag":287,"props":2125,"children":2126},{},[2127,2142],{"type":53,"tag":291,"props":2128,"children":2129},{},[2130],{"type":53,"tag":295,"props":2131,"children":2132},{},[2133,2138],{"type":53,"tag":299,"props":2134,"children":2135},{},[2136],{"type":58,"value":2137},"Script",{"type":53,"tag":299,"props":2139,"children":2140},{},[2141],{"type":58,"value":313},{"type":53,"tag":315,"props":2143,"children":2144},{},[2145,2175,2198],{"type":53,"tag":295,"props":2146,"children":2147},{},[2148,2157],{"type":53,"tag":322,"props":2149,"children":2150},{},[2151],{"type":53,"tag":91,"props":2152,"children":2154},{"className":2153},[],[2155],{"type":58,"value":2156},"scripts\u002Fcreate_forge_app.py",{"type":53,"tag":322,"props":2158,"children":2159},{},[2160,2162,2167,2169],{"type":58,"value":2161},"Create app with dev space selection and template validation. ",{"type":53,"tag":91,"props":2163,"children":2165},{"className":2164},[],[2166],{"type":58,"value":803},{"type":58,"value":2168}," sets the parent dir (script cd's into it). Run: ",{"type":53,"tag":91,"props":2170,"children":2172},{"className":2171},[],[2173],{"type":58,"value":2174},"python3 -m scripts.create_forge_app",{"type":53,"tag":295,"props":2176,"children":2177},{},[2178,2187],{"type":53,"tag":322,"props":2179,"children":2180},{},[2181],{"type":53,"tag":91,"props":2182,"children":2184},{"className":2183},[],[2185],{"type":58,"value":2186},"scripts\u002Flist_templates.py",{"type":53,"tag":322,"props":2188,"children":2189},{},[2190,2192],{"type":58,"value":2191},"List\u002Fvalidate all Forge templates from Atlassian registry. Run: ",{"type":53,"tag":91,"props":2193,"children":2195},{"className":2194},[],[2196],{"type":58,"value":2197},"python3 -m scripts.list_templates",{"type":53,"tag":295,"props":2199,"children":2200},{},[2201,2210],{"type":53,"tag":322,"props":2202,"children":2203},{},[2204],{"type":53,"tag":91,"props":2205,"children":2207},{"className":2206},[],[2208],{"type":58,"value":2209},"scripts\u002Fdeploy_forge_app.py",{"type":53,"tag":322,"props":2211,"children":2212},{},[2213,2215],{"type":58,"value":2214},"Deploy and install app (prerequisites check, npm install, lint, deploy, install). Auto-detects cross-product scopes and installs on all required products. Run: ",{"type":53,"tag":91,"props":2216,"children":2218},{"className":2217},[],[2219],{"type":58,"value":2220},"python3 -m scripts.deploy_forge_app",{"type":53,"tag":71,"props":2222,"children":2224},{"id":2223},"completion-checklist",[2225],{"type":58,"value":2226},"Completion checklist",{"type":53,"tag":61,"props":2228,"children":2229},{},[2230],{"type":58,"value":2231},"Before considering the workflow done, confirm:",{"type":53,"tag":438,"props":2233,"children":2234},{},[2235,2240,2260,2273,2283,2295],{"type":53,"tag":82,"props":2236,"children":2237},{},[2238],{"type":58,"value":2239},"User selected developer space when more than one existed (or only one existed)",{"type":53,"tag":82,"props":2241,"children":2242},{},[2243,2245,2251,2253,2258],{"type":58,"value":2244},"App was created via ",{"type":53,"tag":91,"props":2246,"children":2248},{"className":2247},[],[2249],{"type":58,"value":2250},"create_forge_app",{"type":58,"value":2252}," (or user ran ",{"type":53,"tag":91,"props":2254,"children":2256},{"className":2255},[],[2257],{"type":58,"value":96},{"type":58,"value":2259}," after a failure)",{"type":53,"tag":82,"props":2261,"children":2262},{},[2263,2265,2271],{"type":58,"value":2264},"Code was customized and ",{"type":53,"tag":91,"props":2266,"children":2268},{"className":2267},[],[2269],{"type":58,"value":2270},"npm install",{"type":58,"value":2272}," run in the app directory",{"type":53,"tag":82,"props":2274,"children":2275},{},[2276,2281],{"type":53,"tag":65,"props":2277,"children":2278},{},[2279],{"type":58,"value":2280},"Deploy script was executed by the agent",{"type":58,"value":2282}," (not only manual commands given to the user)",{"type":53,"tag":82,"props":2284,"children":2285},{},[2286,2288,2293],{"type":58,"value":2287},"If install was needed, user was asked for site URL and the script was run with ",{"type":53,"tag":91,"props":2289,"children":2291},{"className":2290},[],[2292],{"type":58,"value":1749},{"type":58,"value":2294}," (or user provided site and install completed)",{"type":53,"tag":82,"props":2296,"children":2297},{},[2298,2300,2305],{"type":58,"value":2299},"If the app uses cross-product scopes (e.g. Confluence app reading Jira data), it was installed on ",{"type":53,"tag":65,"props":2301,"children":2302},{},[2303],{"type":58,"value":2304},"all",{"type":58,"value":2306}," required products (the deploy script handles this automatically)",{"type":53,"tag":71,"props":2308,"children":2310},{"id":2309},"common-agent-mistakes-avoid-these",[2311],{"type":58,"value":2312},"Common agent mistakes (avoid these)",{"type":53,"tag":438,"props":2314,"children":2315},{},[2316,2326,2357,2367],{"type":53,"tag":82,"props":2317,"children":2318},{},[2319,2324],{"type":53,"tag":65,"props":2320,"children":2321},{},[2322],{"type":58,"value":2323},"Picking a developer space when multiple exist",{"type":58,"value":2325}," — always ask the user to choose.",{"type":53,"tag":82,"props":2327,"children":2328},{},[2329,2334,2336,2341,2342,2347,2349,2355],{"type":53,"tag":65,"props":2330,"children":2331},{},[2332],{"type":58,"value":2333},"Skipping the deploy script",{"type":58,"value":2335}," — giving only \"run ",{"type":53,"tag":91,"props":2337,"children":2339},{"className":2338},[],[2340],{"type":58,"value":179},{"type":58,"value":266},{"type":53,"tag":91,"props":2343,"children":2345},{"className":2344},[],[2346],{"type":58,"value":187},{"type":58,"value":2348},"\" instructions instead of running ",{"type":53,"tag":91,"props":2350,"children":2352},{"className":2351},[],[2353],{"type":58,"value":2354},"deploy_forge_app.py",{"type":58,"value":2356}," yourself.",{"type":53,"tag":82,"props":2358,"children":2359},{},[2360,2365],{"type":53,"tag":65,"props":2361,"children":2362},{},[2363],{"type":58,"value":2364},"Not asking for site URL",{"type":58,"value":2366}," — when install is required, ask the user for their Atlassian site URL; do not guess or skip install.",{"type":53,"tag":82,"props":2368,"children":2369},{},[2370,2375],{"type":53,"tag":65,"props":2371,"children":2372},{},[2373],{"type":58,"value":2374},"Proceeding to create app before user chooses a developer space",{"type":58,"value":2376}," — wait for their selection when there are multiple spaces.",{"type":53,"tag":71,"props":2378,"children":2380},{"id":2379},"troubleshooting",[2381],{"type":58,"value":2382},"Troubleshooting",{"type":53,"tag":61,"props":2384,"children":2385},{},[2386,2388,2393],{"type":58,"value":2387},"For CLI commands, debugging techniques, and common error patterns, call ",{"type":53,"tag":91,"props":2389,"children":2391},{"className":2390},[],[2392],{"type":58,"value":413},{"type":58,"value":2394},". For quick checks:",{"type":53,"tag":438,"props":2396,"children":2397},{},[2398,2422,2454],{"type":53,"tag":82,"props":2399,"children":2400},{},[2401,2406,2408,2414,2415,2420],{"type":53,"tag":65,"props":2402,"children":2403},{},[2404],{"type":58,"value":2405},"Not logged in \u002F auth failed",{"type":58,"value":2407},": Create API token at ",{"type":53,"tag":367,"props":2409,"children":2411},{"href":620,"rel":2410},[371],[2412],{"type":58,"value":2413},"id.atlassian.com\u002Fmanage\u002Fapi-tokens",{"type":58,"value":672},{"type":53,"tag":91,"props":2416,"children":2418},{"className":2417},[],[2419],{"type":58,"value":141},{"type":58,"value":2421}," in your terminal (never paste token in chat)",{"type":53,"tag":82,"props":2423,"children":2424},{},[2425,2430,2432,2438,2440,2445,2447,2452],{"type":53,"tag":65,"props":2426,"children":2427},{},[2428],{"type":58,"value":2429},"App not appearing after install",{"type":58,"value":2431},": Check ",{"type":53,"tag":91,"props":2433,"children":2435},{"className":2434},[],[2436],{"type":58,"value":2437},"forge logs -e development --limit 50",{"type":58,"value":2439},", verify manifest with ",{"type":53,"tag":91,"props":2441,"children":2443},{"className":2442},[],[2444],{"type":58,"value":243},{"type":58,"value":2446},", re-install with ",{"type":53,"tag":91,"props":2448,"children":2450},{"className":2449},[],[2451],{"type":58,"value":1741},{"type":58,"value":2453}," if scopes changed",{"type":53,"tag":82,"props":2455,"children":2456},{},[2457,2462,2464],{"type":53,"tag":65,"props":2458,"children":2459},{},[2460],{"type":58,"value":2461},"\"forge: command not found\"",{"type":58,"value":2463},": ",{"type":53,"tag":91,"props":2465,"children":2467},{"className":2466},[],[2468],{"type":58,"value":2469},"npm install -g @forge\u002Fcli",{"type":53,"tag":2471,"props":2472,"children":2473},"style",{},[2474],{"type":58,"value":2475},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":2477,"total":1581},[2478,2485,2500,2516,2530,2542],{"slug":4,"name":4,"fn":5,"description":6,"org":2479,"tags":2480,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2481,2482,2483,2484],{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"name":20,"slug":21,"type":15},{"name":17,"slug":18,"type":15},{"slug":2486,"name":2486,"fn":2487,"description":2488,"org":2489,"tags":2490,"stars":23,"repoUrl":24,"updatedAt":2499},"forge-app-review","review Atlassian Forge app readiness","Performs a lightweight pre-release readiness review of Atlassian Forge apps across manifest\u002Fmodule wiring, architecture, runtime compatibility, dependency posture, tests, deploy readiness, and obvious security, cost, or reliability smells. Use when the user asks \"review my Forge app\", \"pre-deploy check\", \"is this app ready to ship\", \"review manifest\", \"general app review\", \"release readiness\", or asks for a broad quality pass. Do not use for deep security audits\u002FSAST\u002Fexploitability review, cost optimization, or diagnosing a known broken app; route those to forge-security-review, forge-cost-optimizer, or forge-debugger respectively.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2491,2492,2495,2496],{"name":9,"slug":8,"type":15},{"name":2493,"slug":2494,"type":15},"Code Analysis","code-analysis",{"name":20,"slug":21,"type":15},{"name":2497,"slug":2498,"type":15},"QA","qa","2026-07-12T07:58:50.744672",{"slug":2501,"name":2501,"fn":2502,"description":2503,"org":2504,"tags":2505,"stars":23,"repoUrl":24,"updatedAt":2515},"forge-connector","build Atlassian Forge Teamwork Graph connectors","Guides building and deploying Atlassian Forge Teamwork Graph connector apps that ingest external data into Atlassian's Teamwork Graph, making it searchable in Rovo Search and surfaced in Rovo Chat. Use when the user wants to build a Forge connector, ingest external data into Atlassian, connect a third-party tool (e.g. Google Drive, ServiceNow, Salesforce) to Atlassian, make external content searchable in Rovo, build a graph:connector module, use the @forge\u002Fteamwork-graph SDK, or implement onConnectionChange \u002F validateConnection functions.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2506,2509,2512],{"name":2507,"slug":2508,"type":15},"API Development","api-development",{"name":2510,"slug":2511,"type":15},"Engineering","engineering",{"name":2513,"slug":2514,"type":15},"Enterprise Search","enterprise-search","2026-07-12T07:58:48.520248",{"slug":2517,"name":2517,"fn":2518,"description":2519,"org":2520,"tags":2521,"stars":23,"repoUrl":24,"updatedAt":2529},"forge-cost-optimizer","optimize Atlassian Forge platform costs","Optimizes Atlassian Forge apps to reduce platform consumption and avoid unnecessary costs using Atlassian's \"Optimise Forge platform costs\" guidance. Use when the user asks to optimize Forge app costs, reduce Forge invocations, lower GB-seconds, reduce storage or log usage, tune memory, replace polling, improve scheduled triggers, reduce KVS writes, move work to the frontend, use bridge APIs, batch API calls, add caching, or evaluate Forge Remote trade-offs. By default, perform an audit first and offer to make the recommended changes after presenting the audit. Only modify files immediately when the user explicitly asks the agent to implement or apply optimizations.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2522,2523,2526],{"name":9,"slug":8,"type":15},{"name":2524,"slug":2525,"type":15},"Cost Optimization","cost-optimization",{"name":2527,"slug":2528,"type":15},"Operations","operations","2026-07-12T07:58:53.557299",{"slug":2531,"name":2531,"fn":2532,"description":2533,"org":2534,"tags":2535,"stars":23,"repoUrl":24,"updatedAt":2541},"forge-debugger","diagnose and fix Atlassian Forge apps","Diagnoses and fixes issues in Atlassian Forge apps. Use this skill whenever a Forge app has errors, crashes, shows blank UI, fails to deploy, doesn't appear after installation, has permission issues, or produces unexpected output. Trigger on any mention of forge logs, forge deploy errors, resolver errors, blank panels, missing scopes, Custom UI not rendering, production vs dev discrepancies, or any Jira\u002FConfluence app that \"stopped working\". Also trigger when the user asks to debug, troubleshoot, investigate, or fix a Forge app issue — even if they haven't used the word \"Forge\" but describe a Jira panel or Confluence macro acting up.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2536,2537,2540],{"name":9,"slug":8,"type":15},{"name":2538,"slug":2539,"type":15},"Debugging","debugging",{"name":20,"slug":21,"type":15},"2026-07-12T07:58:47.226713",{"slug":2543,"name":2543,"fn":2544,"description":2545,"org":2546,"tags":2547,"stars":23,"repoUrl":24,"updatedAt":2555},"forge-security-review","perform security reviews for Forge apps","Performs a white-box security review of Atlassian Forge apps using structured, Forge-specific security rules and evidence-driven reporting. Use when the user asks for a Forge security review, security audit, vuln assessment, pentest-style code review, authz review, tenant isolation analysis, web trigger hardening, or static analysis execution for a Forge app.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2548,2551,2552],{"name":2549,"slug":2550,"type":15},"Audit","audit",{"name":2493,"slug":2494,"type":15},{"name":2553,"slug":2554,"type":15},"Security","security","2026-07-12T07:58:54.806538",{"items":2557,"total":2687},[2558,2578,2595,2612,2625,2636,2649,2656,2663,2669,2675,2681],{"slug":2559,"name":2559,"fn":2560,"description":2561,"org":2562,"tags":2563,"stars":2575,"repoUrl":2576,"updatedAt":2577},"capture-tasks-from-meeting-notes","create Jira tasks from meeting notes","Analyze meeting notes to find action items and create Jira tasks for assigned work. When an agent needs to: (1) Create Jira tasks or tickets from meeting notes, (2) Extract or find action items from notes or Confluence pages, (3) Parse meeting notes for assigned tasks, or (4) Analyze notes and generate tasks for team members. Identifies assignees, looks up account IDs, and creates tasks with proper context.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2564,2567,2569,2572],{"name":2565,"slug":2566,"type":15},"Automation","automation",{"name":2568,"slug":44,"type":15},"Jira",{"name":2570,"slug":2571,"type":15},"Meetings","meetings",{"name":2573,"slug":2574,"type":15},"Task Management","task-management",848,"https:\u002F\u002Fgithub.com\u002Fatlassian\u002Fatlassian-mcp-server","2026-07-12T07:58:45.323861",{"slug":2579,"name":2579,"fn":2580,"description":2581,"org":2582,"tags":2583,"stars":2575,"repoUrl":2576,"updatedAt":2594},"generate-status-report","generate project status reports for Confluence","Generate project status reports from Jira issues and publish to Confluence. When an agent needs to: (1) Create a status report for a project, (2) Summarize project progress or updates, (3) Generate weekly\u002Fdaily reports from Jira, (4) Publish status summaries to Confluence, or (5) Analyze project blockers and completion. Queries Jira issues, categorizes by status\u002Fpriority, and creates formatted reports for delivery managers and executives.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2584,2585,2587,2588,2591],{"name":9,"slug":8,"type":15},{"name":2586,"slug":43,"type":15},"Confluence",{"name":2568,"slug":44,"type":15},{"name":2589,"slug":2590,"type":15},"Project Management","project-management",{"name":2592,"slug":2593,"type":15},"Reporting","reporting","2026-07-12T07:58:38.457696",{"slug":2596,"name":2596,"fn":2597,"description":2598,"org":2599,"tags":2600,"stars":2575,"repoUrl":2576,"updatedAt":2611},"jira-sprint-dashboard","create Jira sprint dashboards","Create a visual Jira sprint dashboard from Jira project, space, sprint, board, filter, JQL, work item keys, or Jira URL data. Use when the user asks for a Jira sprint dashboard, standup dashboard, sprint review, delivery review, engineering manager dashboard, WIP review, planning view, closeout view, or a visual snapshot of Jira work that is more useful than a flat report. Use the richest dashboard format supported by the current agent, such as Cursor Canvas, an interactive artifact, HTML, or Markdown.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2601,2604,2607,2608],{"name":2602,"slug":2603,"type":15},"Agile","agile",{"name":2605,"slug":2606,"type":15},"Dashboards","dashboards",{"name":2568,"slug":44,"type":15},{"name":2609,"slug":2610,"type":15},"Sprint Planning","sprint-planning","2026-07-12T07:58:41.031798",{"slug":2613,"name":2613,"fn":2614,"description":2615,"org":2616,"tags":2617,"stars":2575,"repoUrl":2576,"updatedAt":2624},"search-company-knowledge","search internal company knowledge bases","Search across company knowledge bases (Confluence, Jira, internal docs) to find and explain internal concepts, processes, and technical details. When an agent needs to: (1) Find or search for information about systems, terminology, processes, deployment, authentication, infrastructure, architecture, or technical concepts, (2) Search internal documentation, knowledge base, company docs, or our docs, (3) Explain what something is, how it works, or look up information, or (4) Synthesize information from multiple sources. Searches in parallel and provides cited answers.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2618,2619,2620,2621],{"name":2586,"slug":43,"type":15},{"name":2513,"slug":2514,"type":15},{"name":2568,"slug":44,"type":15},{"name":2622,"slug":2623,"type":15},"Knowledge Management","knowledge-management","2026-07-12T07:58:39.684132",{"slug":2626,"name":2626,"fn":2627,"description":2628,"org":2629,"tags":2630,"stars":2575,"repoUrl":2576,"updatedAt":2635},"spec-to-backlog","convert Confluence specifications to Jira backlogs","Automatically convert Confluence specification documents into structured Jira backlogs with Epics and implementation tickets. When an agent needs to: (1) Create Jira tickets from a Confluence page, (2) Generate a backlog from a specification, (3) Break down a spec into implementation tasks, or (4) Convert requirements into Jira issues. Handles reading Confluence pages, analyzing specifications, creating Epics with proper structure, and generating detailed implementation tickets linked to the Epic.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2631,2632,2633,2634],{"name":2602,"slug":2603,"type":15},{"name":2586,"slug":43,"type":15},{"name":2568,"slug":44,"type":15},{"name":2589,"slug":2590,"type":15},"2026-07-12T07:58:37.200385",{"slug":2637,"name":2637,"fn":2638,"description":2639,"org":2640,"tags":2641,"stars":2575,"repoUrl":2576,"updatedAt":2648},"triage-issue","triage bug reports in Jira","Intelligently triage bug reports and error messages by searching for duplicates in Jira and offering to create new issues or add comments to existing ones. When an agent needs to: (1) Triage a bug report or error message, (2) Check if an issue is a duplicate, (3) Find similar past issues, (4) Create a new bug ticket with proper context, or (5) Add information to an existing ticket. Searches Jira for similar issues, identifies duplicates, checks fix history, and helps create well-structured bug reports.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2642,2643,2644,2645],{"name":2538,"slug":2539,"type":15},{"name":2568,"slug":44,"type":15},{"name":2589,"slug":2590,"type":15},{"name":2646,"slug":2647,"type":15},"Triage","triage","2026-07-12T07:58:33.007343",{"slug":4,"name":4,"fn":5,"description":6,"org":2650,"tags":2651,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2652,2653,2654,2655],{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"name":20,"slug":21,"type":15},{"name":17,"slug":18,"type":15},{"slug":2486,"name":2486,"fn":2487,"description":2488,"org":2657,"tags":2658,"stars":23,"repoUrl":24,"updatedAt":2499},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2659,2660,2661,2662],{"name":9,"slug":8,"type":15},{"name":2493,"slug":2494,"type":15},{"name":20,"slug":21,"type":15},{"name":2497,"slug":2498,"type":15},{"slug":2501,"name":2501,"fn":2502,"description":2503,"org":2664,"tags":2665,"stars":23,"repoUrl":24,"updatedAt":2515},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2666,2667,2668],{"name":2507,"slug":2508,"type":15},{"name":2510,"slug":2511,"type":15},{"name":2513,"slug":2514,"type":15},{"slug":2517,"name":2517,"fn":2518,"description":2519,"org":2670,"tags":2671,"stars":23,"repoUrl":24,"updatedAt":2529},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2672,2673,2674],{"name":9,"slug":8,"type":15},{"name":2524,"slug":2525,"type":15},{"name":2527,"slug":2528,"type":15},{"slug":2531,"name":2531,"fn":2532,"description":2533,"org":2676,"tags":2677,"stars":23,"repoUrl":24,"updatedAt":2541},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2678,2679,2680],{"name":9,"slug":8,"type":15},{"name":2538,"slug":2539,"type":15},{"name":20,"slug":21,"type":15},{"slug":2543,"name":2543,"fn":2544,"description":2545,"org":2682,"tags":2683,"stars":23,"repoUrl":24,"updatedAt":2555},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2684,2685,2686],{"name":2549,"slug":2550,"type":15},{"name":2493,"slug":2494,"type":15},{"name":2553,"slug":2554,"type":15},24]