App Builder Project Initialization Maps user intent to the right Adobe App Builder template and runs non-interactive . Default: (SPA + actions). For headless/bare projects, use . When a Developer Console project / workspace / API subscription does not yet exist, this skill walks the agent through creating them non-interactively by calling directly — see the Bootstrap section and references/bootstrap.md. The latest bundle exposes non-interactive / / / (with for services that require a product profile), and non-interactive . Together they remove every blocking "open the Developer Console UI and…

\\n'/\\\\n}\n value=${value//

App Builder Project Initialization Maps user intent to the right Adobe App Builder template and runs non-interactive . Default: (SPA + actions). For headless/bare projects, use . When a Developer Console project / workspace / API subscription does not yet exist, this skill walks the agent through creating them non-interactively by calling directly — see the Bootstrap section and references/bootstrap.md. The latest bundle exposes non-interactive / / / (with for services that require a product profile), and non-interactive . Together they remove every blocking "open the Developer Console UI and…

\\r'/\\\\r}\n value=${value//

App Builder Project Initialization Maps user intent to the right Adobe App Builder template and runs non-interactive . Default: (SPA + actions). For headless/bare projects, use . When a Developer Console project / workspace / API subscription does not yet exist, this skill walks the agent through creating them non-interactively by calling directly — see the Bootstrap section and references/bootstrap.md. The latest bundle exposes non-interactive / / / (with for services that require a product profile), and non-interactive . Together they remove every blocking "open the Developer Console UI and…

\\t'/\\\\t}\n value=${value//

App Builder Project Initialization Maps user intent to the right Adobe App Builder template and runs non-interactive . Default: (SPA + actions). For headless/bare projects, use . When a Developer Console project / workspace / API subscription does not yet exist, this skill walks the agent through creating them non-interactively by calling directly — see the Bootstrap section and references/bootstrap.md. The latest bundle exposes non-interactive / / / (with for services that require a product profile), and non-interactive . Together they remove every blocking "open the Developer Console UI and…

\\b'/\\\\b}\n value=${value//

App Builder Project Initialization Maps user intent to the right Adobe App Builder template and runs non-interactive . Default: (SPA + actions). For headless/bare projects, use . When a Developer Console project / workspace / API subscription does not yet exist, this skill walks the agent through creating them non-interactively by calling directly — see the Bootstrap section and references/bootstrap.md. The latest bundle exposes non-interactive / / / (with for services that require a product profile), and non-interactive . Together they remove every blocking "open the Developer Console UI and…

\\f'/\\\\f}\n printf '%s' \"$value\"\n}\n\nprint_json() {\n local pairs=(\"$@\")\n local out=\"{\"\n local i=0\n while [[ $i -lt ${#pairs[@]} ]]; do\n local key=\"${pairs[$i]}\"\n local val=\"${pairs[$((i + 1))]}\"\n [[ $i -gt 0 ]] && out+=\", \"\n if [[ \"$key\" == \"success\" ]]; then\n out+=\"\\\"$key\\\": $val\"\n else\n out+=\"\\\"$key\\\": \\\"$(json_escape \"$val\")\\\"\"\n fi\n i=$((i + 2))\n done\n out+=\"}\"\n printf '%s\\n' \"$out\"\n}\n\n# --- Guards ---\n\nrequire_aio() {\n if ! command -v aio >/dev/null 2>&1; then\n print_json success false error \"aio CLI is not installed or not on PATH.\"\n exit 2\n fi\n}\n\nrequire_project_root() {\n if [[ ! -f \"app.config.yaml\" ]]; then\n print_json success false error \"app.config.yaml not found. Run this from an App Builder project root.\"\n exit 1\n fi\n}\n\nusage() {\n cat \u003c\u003c'EOF'\nUsage: init.sh \u003ccommand> [options]\n\nCommands:\n init \u003ctemplate> [path] Initialize project from a template\n [--org ID] [--project NAME] Wire to a Console org/project\n [--template-options B64JSON] Optional template options (base64-encoded JSON)\n [--no-config-validation] Skip schema validation during init\n init-bare [path] Initialize a bare/standalone project\n add-action \u003cname> Add an action to an existing project\n add-web-assets Add web assets to an existing project\n\nFor Developer Console bootstrap (project / workspace / API subscriptions),\ncall `aio console …` directly per references/bootstrap.md — they are\nalready non-interactive in current @adobe/aio-cli releases and don't\nneed a wrapper. If any flag above is unrecognised, refresh the CLI\nbundle: `npm install -g @adobe/aio-cli`.\n\nAll commands output JSON. Exit codes: 0=success, 1=error, 2=aio CLI missing.\nEOF\n}\n\n# --- Subcommands ---\n\ncmd_init() {\n if [[ $# -lt 1 ]]; then\n print_json success false error \"Missing required argument: template\"\n exit 1\n fi\n\n local template=\"$1\"; shift\n local project_path=\"\"\n local extra_flags=()\n\n # First non-flag positional becomes project_path; everything else\n # is a pass-through flag for `aio app init`.\n while [[ $# -gt 0 ]]; do\n case \"$1\" in\n --org|--project|--template-options)\n extra_flags+=(\"$1\" \"${2-}\")\n shift 2\n ;;\n --org=*|--project=*|--template-options=*)\n extra_flags+=(\"$1\")\n shift\n ;;\n --no-config-validation|--config-validation)\n extra_flags+=(\"$1\")\n shift\n ;;\n --)\n shift\n while [[ $# -gt 0 ]]; do extra_flags+=(\"$1\"); shift; done\n ;;\n -*)\n print_json success false error \"Unknown flag for init: $1\"\n exit 1\n ;;\n *)\n if [[ -z \"$project_path\" ]]; then\n project_path=\"$1\"\n shift\n else\n print_json success false error \"Unexpected positional argument: $1\"\n exit 1\n fi\n ;;\n esac\n done\n\n require_aio\n\n local resolved_path\n resolved_path=\"$(pwd -P)\"\n\n local base_args=(app init -y --no-login --no-install --template=\"$template\")\n if [[ ${#extra_flags[@]} -gt 0 ]]; then\n base_args+=(\"${extra_flags[@]}\")\n fi\n\n if [[ -n \"$project_path\" ]]; then\n if ! mkdir -p \"$project_path\"; then\n print_json success false template \"$template\" path \"$project_path\" error \"Failed to create directory: $project_path\"\n exit 1\n fi\n if ! resolved_path=\"$(cd \"$project_path\" && pwd -P)\"; then\n print_json success false template \"$template\" path \"$project_path\" error \"Failed to resolve path: $project_path\"\n exit 1\n fi\n local output\n output=\"$(cd \"$project_path\" && aio \"${base_args[@]}\" 2>&1)\" || {\n print_json success false template \"$template\" path \"$resolved_path\" output \"$output\"\n exit 1\n }\n else\n local output\n output=\"$(aio \"${base_args[@]}\" 2>&1)\" || {\n print_json success false template \"$template\" path \"$resolved_path\" output \"$output\"\n exit 1\n }\n fi\n\n print_json success true template \"$template\" path \"$resolved_path\" output \"$output\"\n}\n\ncmd_init_bare() {\n local project_path=\"${1-}\"\n\n require_aio\n\n local resolved_path\n resolved_path=\"$(pwd -P)\"\n\n if [[ -n \"$project_path\" ]]; then\n if ! mkdir -p -- \"$project_path\"; then\n print_json success false path \"$project_path\" error \"Failed to create directory: $project_path\"\n exit 1\n fi\n if ! resolved_path=\"$(cd \"$project_path\" && pwd -P)\"; then\n print_json success false path \"$project_path\" error \"Failed to resolve path: $project_path\"\n exit 1\n fi\n local output\n output=\"$(cd \"$project_path\" && aio app init -y --no-login --standalone-app --no-install 2>&1)\" || {\n print_json success false path \"$resolved_path\" output \"$output\"\n exit 1\n }\n else\n local output\n output=\"$(aio app init -y --no-login --standalone-app --no-install 2>&1)\" || {\n print_json success false path \"$resolved_path\" output \"$output\"\n exit 1\n }\n fi\n\n print_json success true path \"$resolved_path\" output \"$output\"\n}\n\ncmd_add_action() {\n if [[ $# -ne 1 ]]; then\n print_json success false error \"Missing required argument: action-name\"\n exit 1\n fi\n\n local action_name=\"$1\"\n require_aio\n require_project_root\n\n local output\n output=\"$(aio app add action \"$action_name\" -y --no-login 2>&1)\" || {\n print_json success false actionName \"$action_name\" output \"$output\"\n exit 1\n }\n\n print_json success true actionName \"$action_name\" output \"$output\"\n}\n\ncmd_add_web_assets() {\n require_aio\n require_project_root\n\n if [[ ! -f \"package.json\" ]]; then\n print_json success false error \"package.json not found. Run this from an App Builder project root.\"\n exit 1\n fi\n\n local output\n output=\"$(aio app add web-assets -y --no-login 2>&1)\" || {\n print_json success false output \"$output\"\n exit 1\n }\n\n print_json success true output \"$output\"\n}\n\n# --- Main dispatch ---\n\nif [[ $# -eq 0 ]]; then\n usage\n exit 1\nfi\n\ncommand=\"$1\"\nshift\n\ncase \"$command\" in\n init) cmd_init \"$@\" ;;\n init-bare) cmd_init_bare \"$@\" ;;\n add-action) cmd_add_action \"$@\" ;;\n add-web-assets) cmd_add_web_assets \"$@\" ;;\n -h|--help) usage; exit 0 ;;\n *)\n print_json success false error \"Unknown command: $command. Run with --help for usage.\"\n exit 1\n ;;\nesac\n","content_type":"application/x-sh; charset=utf-8","language":"bash","size":7661,"content_sha256":"772bac62e594b962907b470ea72f9961632ee26a32547569a0ba336b99e49dd6"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"App Builder Project Initialization","type":"text"}]},{"type":"paragraph","content":[{"text":"Maps user intent to the right Adobe App Builder template and runs non-interactive ","type":"text"},{"text":"aio app init","type":"text","marks":[{"type":"code_inline"}]},{"text":". Default: ","type":"text"},{"text":"@adobe/generator-app-excshell","type":"text","marks":[{"type":"code_inline"}]},{"text":" (SPA + actions). For headless/bare projects, use ","type":"text"},{"text":"init-bare","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"paragraph","content":[{"text":"When a Developer Console project / workspace / API subscription does not yet exist, this skill walks the agent through creating them non-interactively by calling ","type":"text"},{"text":"aio console …","type":"text","marks":[{"type":"code_inline"}]},{"text":" directly — see the ","type":"text"},{"text":"Bootstrap","type":"text","marks":[{"type":"strong"}]},{"text":" section and ","type":"text"},{"text":"references/bootstrap.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/bootstrap.md","title":null}}]},{"text":". The latest ","type":"text"},{"text":"@adobe/aio-cli","type":"text","marks":[{"type":"code_inline"}]},{"text":" bundle exposes non-interactive ","type":"text"},{"text":"aio console project create","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"workspace create","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"api list","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"workspace api add","type":"text","marks":[{"type":"code_inline"}]},{"text":" (with ","type":"text"},{"text":"--license-config","type":"text","marks":[{"type":"code_inline"}]},{"text":" for services that require a product profile), and non-interactive ","type":"text"},{"text":"aio app init --org/--project/--template-options","type":"text","marks":[{"type":"code_inline"}]},{"text":". Together they remove every blocking \"open the Developer Console UI and click\" step from the agentic setup path. Just install the latest CLI (","type":"text"},{"text":"npm install -g @adobe/aio-cli","type":"text","marks":[{"type":"code_inline"}]},{"text":") and use them.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Machine setup (first time)","type":"text"}]},{"type":"paragraph","content":[{"text":"Do this once per machine before initializing a project — plus a login per environment. If the CLI is already installed and you're logged in, skip to ","type":"text"},{"text":"Bootstrap","type":"text","marks":[{"type":"strong"}]},{"text":" below.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"1. Node 20","type":"text"}]},{"type":"paragraph","content":[{"text":"App Builder needs ","type":"text"},{"text":"Node 20","type":"text","marks":[{"type":"strong"}]},{"text":" (npm ships with it). Check what's active: ","type":"text"},{"text":"node -v","type":"text","marks":[{"type":"code_inline"}]},{"text":" → expect ","type":"text"},{"text":"v20.x","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Have nvm?","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":"nvm install 20 && nvm use 20 && nvm alias default 20","type":"text","marks":[{"type":"code_inline"}]},{"text":" so new shells keep it. If several Node versions are installed, the ","type":"text"},{"text":"active","type":"text","marks":[{"type":"em"}]},{"text":" one must be 20.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"No Node / no nvm?","type":"text","marks":[{"type":"strong"}]},{"text":" Install nvm, then Node 20:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash\n# reopen the shell, then:\nnvm install 20 && nvm use 20 && nvm alias default 20","type":"text"}]},{"type":"paragraph","content":[{"text":"(Alternatives: ","type":"text"},{"text":"brew install node@20","type":"text","marks":[{"type":"code_inline"}]},{"text":", or the official installer at nodejs.org.)","type":"text"}]}]}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"Older Adobe docs say Node 18 — use ","type":"text"},{"text":"20","type":"text","marks":[{"type":"strong"}]},{"text":". A global ","type":"text"},{"text":"aio","type":"text","marks":[{"type":"code_inline"}]},{"text":" belongs to whichever Node was active when you ran ","type":"text"},{"text":"npm i -g","type":"text","marks":[{"type":"code_inline"}]},{"text":"; if you switch Node versions the old ","type":"text"},{"text":"aio","type":"text","marks":[{"type":"code_inline"}]},{"text":" won't be on PATH. Symptom of a mismatch: ","type":"text"},{"text":"aio","type":"text","marks":[{"type":"code_inline"}]},{"text":" dies with ","type":"text"},{"text":"SyntaxError: Unexpected token '??='","type":"text","marks":[{"type":"code_inline"}]},{"text":" (a pre-20 Node parsing the Node-20 ","type":"text"},{"text":"aio","type":"text","marks":[{"type":"code_inline"}]},{"text":") — fix with ","type":"text"},{"text":"nvm use 20","type":"text","marks":[{"type":"code_inline"}]},{"text":" and reinstall ","type":"text"},{"text":"aio","type":"text","marks":[{"type":"code_inline"}]},{"text":" there.","type":"text"}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"2. Install the aio CLI + log in","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"npm install -g @adobe/aio-cli # on Node 20\naio login # opens a browser; `aio login -f` forces a fresh prompt\naio where # confirm the correct IMS org/context\naio console org list # list orgs and their IDs (then `aio console org select \u003cid>` if needed)","type":"text"}]},{"type":"paragraph","content":[{"text":"Tokens are stored by the CLI automatically; a normal ","type":"text"},{"text":"aio login","type":"text","marks":[{"type":"code_inline"}]},{"text":" lasts hours/days — one login per session, not per command. Confirm the ","type":"text"},{"text":"correct IMS org","type":"text","marks":[{"type":"strong"}]},{"text":" — wrong-org is the most common setup mistake.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"3. Stage vs prod","type":"text"}]},{"type":"paragraph","content":[{"text":"The default environment is ","type":"text"},{"text":"prod","type":"text","marks":[{"type":"strong"}]},{"text":". To target ","type":"text"},{"text":"stage","type":"text","marks":[{"type":"strong"}]},{"text":", set the env var and re-authenticate:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"export AIO_CLI_ENV=stage\naio logout && aio login","type":"text"}]},{"type":"paragraph","content":[{"text":"Unset the variable (or open a new shell) to return to prod. The stage CLI talks to the stage Console (","type":"text"},{"text":"developer-stage","type":"text","marks":[{"type":"code_inline"}]},{"text":").","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Logging in without a browser (CI / no human)","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Import creds:","type":"text","marks":[{"type":"strong"}]},{"text":" in the Developer Console open the workspace → ","type":"text"},{"text":"Download all","type":"text","marks":[{"type":"strong"}]},{"text":" → ","type":"text"},{"text":"console.json","type":"text","marks":[{"type":"code_inline"}]},{"text":", then ","type":"text"},{"text":"aio app init \u003capp> --import path/to/console.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" (fills ","type":"text"},{"text":".env","type":"text","marks":[{"type":"code_inline"}]},{"text":"/","type":"text"},{"text":".aio","type":"text","marks":[{"type":"code_inline"}]},{"text":" — treat ","type":"text"},{"text":"console.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" as a secret, gitignore it).","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"CI / pipeline:","type":"text","marks":[{"type":"strong"}]},{"text":" add an ","type":"text"},{"text":"OAuth Server-to-Server","type":"text","marks":[{"type":"strong"}]},{"text":" credential to the workspace; ","type":"text"},{"text":"aio","type":"text","marks":[{"type":"code_inline"}]},{"text":" and Runtime authenticate from the client id/secret with no human. Don't script SSO/MFA headlessly.","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Bootstrap the Developer Console (project, workspace, APIs)","type":"text"}]},{"type":"paragraph","content":[{"text":"If the user is starting from zero — no Developer Console project yet, or an existing project that is missing a workspace or API subscription — bootstrap that state ","type":"text"},{"text":"before","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":"aio app init","type":"text","marks":[{"type":"code_inline"}]},{"text":". Otherwise ","type":"text"},{"text":"aio app init","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"aio app use","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"aio app deploy","type":"text","marks":[{"type":"code_inline"}]},{"text":" have nothing to wire the local app to.","type":"text"}]},{"type":"paragraph","content":[{"text":"The full bootstrap is just ","type":"text"},{"text":"aio","type":"text","marks":[{"type":"code_inline"}]},{"text":" commands; ","type":"text"},{"text":"call them directly","type":"text","marks":[{"type":"strong"}]},{"text":", not through a wrapper script. They are already non-interactive in the recent plugin releases, and per-step calls let you react to \"already exists\" or \"needs a product profile\" responses without baking those decisions into bash.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Preflight","type":"text"}]},{"type":"paragraph","content":[{"text":"Make sure the CLI is current — that's what brings in the non-interactive Console + app init commands:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"npm install -g @adobe/aio-cli\naio --version","type":"text"}]},{"type":"paragraph","content":[{"text":"Don't try to assert specific plugin versions; just take the latest. If a ","type":"text"},{"text":"console","type":"text","marks":[{"type":"code_inline"}]},{"text":" or ","type":"text"},{"text":"app","type":"text","marks":[{"type":"code_inline"}]},{"text":" subcommand below is rejected as \"command not found\" or \"unknown flag\" after this, the CLI install genuinely failed (PATH issue, permissions, registry mirror) — fix the install rather than working around it.","type":"text"}]},{"type":"paragraph","content":[{"text":"Confirm an org is selected (or pass ","type":"text"},{"text":"--orgId","type":"text","marks":[{"type":"code_inline"}]},{"text":" on every command below):","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"aio console org list --json # if needed, then:\naio console org select \u003corgId>","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Decision rule","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"User state","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Next action","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"Create a project + workspace + add APIs from scratch\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Run the bootstrap chain (project → workspace → APIs), then ","type":"text"},{"text":"aio app init","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Project exists, workspace missing","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Skip project-create. Run ","type":"text"},{"text":"aio console workspace create","type":"text","marks":[{"type":"code_inline"}]},{"text":", then optionally ","type":"text"},{"text":"aio console workspace api add","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Project + workspace exist, only need to add an API","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Run ","type":"text"},{"text":"aio console api list","type":"text","marks":[{"type":"code_inline"}]},{"text":" to discover service codes, then ","type":"text"},{"text":"aio console workspace api add","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Everything already wired","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Skip bootstrap. Go straight to ","type":"text"},{"text":"Initialize via Script","type":"text","marks":[{"type":"strong"}]},{"text":".","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"Always check what already exists with ","type":"text"},{"text":"aio console project list --json","type":"text","marks":[{"type":"code_inline"}]},{"text":" and ","type":"text"},{"text":"aio console workspace api list --projectName \u003cp> --workspaceName \u003cw> --json","type":"text","marks":[{"type":"code_inline"}]},{"text":" before creating — these commands fail loudly on \"already exists\" and there is no built-in idempotency.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"The bootstrap chain (raw commands)","type":"text"}]},{"type":"paragraph","content":[{"text":"Step 1 — create the Console project:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"aio console project create -n my-project --json\n# optional: -t \"Title\" -d \"Description\" -o \u003corgId>","type":"text"}]},{"type":"paragraph","content":[{"text":"Step 2 — create a workspace inside it (","type":"text"},{"text":"Stage","type":"text","marks":[{"type":"code_inline"}]},{"text":" is the conventional first non-Production workspace; pick a more descriptive name in long-lived shared projects):","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"aio console workspace create \\\n --projectName my-project \\\n --name Stage \\\n --json\n# optional: --orgId \u003corgId> --title \"Stage workspace\"","type":"text"}]},{"type":"paragraph","content":[{"text":"Step 3 — discover and subscribe the APIs the app needs:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"aio console api list --json # see all service codes available to the org\n # entries flagged for whether they need a product profile\n\n# Free-tier service:\naio console workspace api add \\\n --projectName my-project \\\n --workspaceName Stage \\\n --service-code AdobeIOManagementAPISDK \\\n --json\n\n# Service that requires a product profile:\naio console workspace api add \\\n --projectName my-project \\\n --workspaceName Stage \\\n --service-code AdobeAnalyticsSDK \\\n --license-config AdobeAnalyticsSDK=AnalyticsProductionProfile \\\n --json","type":"text"}]},{"type":"paragraph","content":[{"text":"--service-code","type":"text","marks":[{"type":"code_inline"}]},{"text":" accepts a comma-separated list to subscribe several free-tier services in one call. ","type":"text"},{"text":"--license-config","type":"text","marks":[{"type":"code_inline"}]},{"text":" is repeatable when several profile-bound services are added together.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Recover from per-step failures","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Failure","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"What to do","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"project create","type":"text","marks":[{"type":"code_inline"}]},{"text":" fails with \"already exists\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Read ","type":"text"},{"text":"aio console project list --json","type":"text","marks":[{"type":"code_inline"}]},{"text":", reuse the existing project's name, and continue at step 2.","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"workspace create","type":"text","marks":[{"type":"code_inline"}]},{"text":" fails with \"already exists\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"List workspaces with ","type":"text"},{"text":"aio console workspace list --projectName \u003cp> --json","type":"text","marks":[{"type":"code_inline"}]},{"text":" and continue at step 3.","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"workspace api add","type":"text","marks":[{"type":"code_inline"}]},{"text":" returns \"product profile required\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"The service code requires ","type":"text"},{"text":"--license-config","type":"text","marks":[{"type":"code_inline"}]},{"text":". Ask the user (or the org admin) for the profile name and retry with ","type":"text"},{"text":"--license-config CODE=PROFILE","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Any step returns an org-selection error","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Pass ","type":"text"},{"text":"--orgId \u003cid>","type":"text","marks":[{"type":"code_inline"}]},{"text":" explicitly, or ","type":"text"},{"text":"aio console org select \u003cid>","type":"text","marks":[{"type":"code_inline"}]},{"text":" once before retrying.","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Wire the local app to the bootstrapped state","type":"text"}]},{"type":"paragraph","content":[{"text":"Two equivalent ways to point a fresh ","type":"text"},{"text":"aio app init","type":"text","marks":[{"type":"code_inline"}]},{"text":" at the project/workspace you just created:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Pass them as flags to ","type":"text","marks":[{"type":"strong"}]},{"text":"init","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" itself","type":"text","marks":[{"type":"strong"}]},{"text":" (cleanest):","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"skills/appbuilder-project-init/scripts/init.sh init \\\n \"@adobe/generator-app-excshell\" ./my-project \\\n --org \u003corgId> --project my-project","type":"text"}]},{"type":"paragraph","content":[{"text":"The wrapper passes ","type":"text"},{"text":"--org","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"--project","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"--template-options","type":"text","marks":[{"type":"code_inline"}]},{"text":" straight through to ","type":"text"},{"text":"aio app init","type":"text","marks":[{"type":"code_inline"}]},{"text":", on top of the existing ","type":"text"},{"text":"-y --no-login --no-install","type":"text","marks":[{"type":"code_inline"}]},{"text":" flags.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Run ","type":"text","marks":[{"type":"strong"}]},{"text":"aio app use","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" after init","type":"text","marks":[{"type":"strong"}]},{"text":" (works on any plugin version):","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"cd ./my-project\naio app use --no-input # adopts the currently selected project/workspace, no prompts","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Either route ends with the local ","type":"text"},{"text":".aio","type":"text","marks":[{"type":"code_inline"}]},{"text":" and ","type":"text"},{"text":".env","type":"text","marks":[{"type":"code_inline"}]},{"text":" pointing at the workspace you just bootstrapped, so ","type":"text"},{"text":"aio app deploy","type":"text","marks":[{"type":"code_inline"}]},{"text":" publishes to the right namespace.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Fast Path (for clear requests)","type":"text"}]},{"type":"paragraph","content":[{"text":"When the user's intent maps unambiguously to a single template — for example, they name a template directly or describe an app that clearly matches exactly one entry below — skip straight to ","type":"text"},{"text":"Initialize via Script","type":"text","marks":[{"type":"strong"}]},{"text":" below. Use the matched template and any project name the user provided (or a sensible default).","type":"text"}]},{"type":"paragraph","content":[{"text":"Examples of fast-path triggers:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"\"Create an App Builder app using ","type":"text"},{"text":"@adobe/generator-app-excshell","type":"text","marks":[{"type":"code_inline"}]},{"text":"\" → use that template, run init","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"\"Set up an Asset Compute worker\" → maps unambiguously to ","type":"text"},{"text":"@adobe/generator-app-asset-compute","type":"text","marks":[{"type":"code_inline"}]},{"text":", run init","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"\"Create a new App Builder app\" (no specifics) → defaults to ","type":"text"},{"text":"@adobe/generator-app-excshell","type":"text","marks":[{"type":"code_inline"}]},{"text":", run init","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"\"Initialize a bare project\" → use ","type":"text"},{"text":"init-bare","type":"text","marks":[{"type":"code_inline"}]},{"text":", run init","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"If there is any ambiguity — multiple templates could fit, or the user's constraints are unclear — use the full template decision table and workflow below.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Template Decision Table","type":"text"}]},{"type":"paragraph","content":[{"text":"Pick the template that matches the user's intent. When unclear, default to ","type":"text"},{"text":"@adobe/generator-app-excshell","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"User wants","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Template","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"SPA with actions + React UI","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"@adobe/generator-app-excshell","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Content Hub extension (asset details panel, card action, bulk action)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"No generator — scaffold from sample app, see ","type":"text"},{"text":"references/templates.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/templates.md","title":null}},{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"AEM Content Fragment Console extension","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"@adobe/aem-cf-admin-ui-ext-tpl","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"AEM React SPA (WKND-based)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"@adobe/generator-app-aem-react","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Adobe API Mesh (GraphQL)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"@adobe/generator-app-api-mesh","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Asset Compute custom worker","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"@adobe/generator-app-asset-compute","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Remote server on App Builder","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"@adobe/generator-app-remote-mcp-server-generic","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Bare / from-scratch project (no pre-scaffolded actions or UI)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"init.sh init-bare","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"For a headless/backend-only request, prefer ","type":"text"},{"text":"init-bare","type":"text","marks":[{"type":"code_inline"}]},{"text":" when possible. If the user still needs a template that generates UI files, plan a post-init cleanup so the final project has no ","type":"text"},{"text":"web-src","type":"text","marks":[{"type":"code_inline"}]},{"text":" frontend directory or web manifest wiring.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Initialize via Script","type":"text"}]},{"type":"paragraph","content":[{"text":"The ","type":"text"},{"text":"aio app *","type":"text","marks":[{"type":"code_inline"}]},{"text":" wrappers go through a single script: ","type":"text"},{"text":"scripts/init.sh","type":"text","marks":[{"type":"code_inline"}]},{"text":". (Console bootstrap commands are called directly — see the ","type":"text"},{"text":"Bootstrap","type":"text","marks":[{"type":"strong"}]},{"text":" section above for the rationale.)","type":"text"}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"Note:","type":"text","marks":[{"type":"strong"}]},{"text":" The path to this skill's scripts may be ","type":"text"},{"text":"skills/","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":".augment/skills/","type":"text","marks":[{"type":"code_inline"}]},{"text":", or ","type":"text"},{"text":".github/skills/","type":"text","marks":[{"type":"code_inline"}]},{"text":" depending on your platform and repository layout. Adjust the prefix in the commands below accordingly.","type":"text"}]}]},{"type":"paragraph","content":[{"text":"With a template:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"skills/appbuilder-project-init/scripts/init.sh init \"@adobe/generator-app-excshell\" ./my-project","type":"text"}]},{"type":"paragraph","content":[{"text":"With a template, fully wired to a specific Console org/project (no post-init ","type":"text","marks":[{"type":"strong"}]},{"text":"aio app use","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" needed):","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"skills/appbuilder-project-init/scripts/init.sh init \\\n \"@adobe/generator-app-excshell\" ./my-project \\\n --org \u003corgId> --project my-project","type":"text"}]},{"type":"paragraph","content":[{"text":"--org","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"--project","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"--template-options","type":"text","marks":[{"type":"code_inline"}]},{"text":" (base64-encoded JSON), and ","type":"text"},{"text":"--no-config-validation","type":"text","marks":[{"type":"code_inline"}]},{"text":" are passed straight through to ","type":"text"},{"text":"aio app init","type":"text","marks":[{"type":"code_inline"}]},{"text":". Use the latest ","type":"text"},{"text":"@adobe/aio-cli","type":"text","marks":[{"type":"code_inline"}]},{"text":" so they're all recognised; ","type":"text"},{"text":"--no-config-validation","type":"text","marks":[{"type":"code_inline"}]},{"text":" is the escape hatch for the rare case where a partial scaffold shouldn't yet have to pass schema validation.","type":"text"}]},{"type":"paragraph","content":[{"text":"Bare project (no template):","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"skills/appbuilder-project-init/scripts/init.sh init-bare ./my-project","type":"text"}]},{"type":"paragraph","content":[{"text":"Use ","type":"text"},{"text":"init-bare","type":"text","marks":[{"type":"code_inline"}]},{"text":" only when the user explicitly wants to configure everything from scratch. In that case, \"bare\" means the generated project should stay minimal:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"app.config.yaml","type":"text","marks":[{"type":"code_inline"}]},{"text":" exists with an empty or minimal ","type":"text"},{"text":"application.runtimeManifest","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"package.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" exists with only the basic project dependencies","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"No pre-scaffolded ","type":"text"},{"text":"src/","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"web-src/","type":"text","marks":[{"type":"code_inline"}]},{"text":", or ","type":"text"},{"text":"actions/","type":"text","marks":[{"type":"code_inline"}]},{"text":" directories","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Why this matters: if the user asked for a bare project, pre-generated actions or web assets contradict that intent and remove the clean starting point they requested.","type":"text"}]},{"type":"paragraph","content":[{"text":"The script outputs JSON with ","type":"text"},{"text":"success","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"path","type":"text","marks":[{"type":"code_inline"}]},{"text":", and ","type":"text"},{"text":"output","type":"text","marks":[{"type":"code_inline"}]},{"text":" fields. Check ","type":"text"},{"text":"success","type":"text","marks":[{"type":"code_inline"}]},{"text":" before proceeding.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Full Workflow (for ambiguous or complex requests)","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 1 — Gather intent","type":"text"}]},{"type":"paragraph","content":[{"text":"Ask the user (or infer from conversation context):","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Question","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Examples","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"What type of app?","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"SPA shell, headless API, AEM extension, Asset Compute worker, API Mesh, remote server","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Needs a UI?","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Yes (React Spectrum in ExC Shell), No (actions only)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Extension point?","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"dx/excshell/1, aem/cf-console-admin/1, dx/asset-compute/worker/1, or N/A","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Additional actions?","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Names and purposes of custom actions beyond the default","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Console state?","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Existing project + workspace? Or do we need to create them and subscribe APIs first?","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"APIs needed?","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"e.g. Adobe I/O Management, Analytics, Target — including any that require a product profile","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"If the user simply says \"create an App Builder app\" with no specifics, default to ","type":"text"},{"text":"@adobe/generator-app-excshell","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"paragraph","content":[{"text":"If the Console state is \"from scratch\" or unknown, run the ","type":"text"},{"text":"Bootstrap the Developer Console","type":"text","marks":[{"type":"strong"}]},{"text":" flow before continuing to template selection. See ","type":"text"},{"text":"references/bootstrap.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/bootstrap.md","title":null}}]},{"text":" for the full agentic bootstrap playbook.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 2 — Select template","type":"text"}]},{"type":"paragraph","content":[{"text":"Consult the Template Decision Table above and ","type":"text"},{"text":"references/templates.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/templates.md","title":null}}]},{"text":" to map the user's intent to a template.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 3 — Initialize, customize, validate","type":"text"}]},{"type":"paragraph","content":[{"text":"Follow the ","type":"text"},{"text":"Initialize via Script","type":"text","marks":[{"type":"strong"}]},{"text":", ","type":"text"},{"text":"Post-init customization","type":"text","marks":[{"type":"strong"}]},{"text":", and ","type":"text"},{"text":"Validate","type":"text","marks":[{"type":"strong"}]},{"text":" sections below.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Post-init Customization","type":"text"}]},{"type":"paragraph","content":[{"text":"Consult ","type":"text"},{"text":"references/templates.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/templates.md","title":null}}]},{"text":" for template-specific post-init guidance. Common tasks:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Install dependencies","type":"text","marks":[{"type":"strong"}]},{"text":" — Run ","type":"text"},{"text":"npm install","type":"text","marks":[{"type":"code_inline"}]},{"text":" in the project directory. The init script uses ","type":"text"},{"text":"--no-install","type":"text","marks":[{"type":"code_inline"}]},{"text":" to keep initialization fast, but dependencies are required before building or testing.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"For API Mesh projects, verify ","type":"text","marks":[{"type":"strong"}]},{"text":"mesh.json","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" is at the project root — After ","type":"text"},{"text":"aio app init","type":"text","marks":[{"type":"code_inline"}]},{"text":" with ","type":"text"},{"text":"@adobe/generator-app-api-mesh","type":"text","marks":[{"type":"code_inline"}]},{"text":", confirm ","type":"text"},{"text":"./mesh.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" exists before treating the scaffold as ready. If the file only exists at ","type":"text"},{"text":"node_modules/@adobe/generator-app-api-mesh/templates/mesh.json","type":"text","marks":[{"type":"code_inline"}]},{"text":", copy it into place with ","type":"text"},{"text":"cp node_modules/@adobe/generator-app-api-mesh/templates/mesh.json ./mesh.json","type":"text","marks":[{"type":"code_inline"}]},{"text":". The file under ","type":"text"},{"text":"node_modules/","type":"text","marks":[{"type":"code_inline"}]},{"text":" is the generator's template source, not the project's active API Mesh configuration. Then customize the root ","type":"text"},{"text":"mesh.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" with the user's real source handlers; for multi-backend scenarios, configure at least two handlers.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Clean up bare-project scaffolding if needed","type":"text","marks":[{"type":"strong"}]},{"text":" — After ","type":"text"},{"text":"init-bare","type":"text","marks":[{"type":"code_inline"}]},{"text":", inspect the generated project. If the initializer created ","type":"text"},{"text":"actions/","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"src/","type":"text","marks":[{"type":"code_inline"}]},{"text":", or ","type":"text"},{"text":"web-src/","type":"text","marks":[{"type":"code_inline"}]},{"text":", remove those directories before continuing. A bare project should not keep auto-generated action code or web assets.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Headless cleanup after template init","type":"text","marks":[{"type":"strong"}]},{"text":" — If the user wants a headless project with ","type":"text"},{"text":"no frontend","type":"text","marks":[{"type":"strong"}]},{"text":", delete any generated UI directory after ","type":"text"},{"text":"aio app init","type":"text","marks":[{"type":"code_inline"}]},{"text":": ","type":"text"},{"text":"rm -rf web-src/","type":"text","marks":[{"type":"code_inline"}]},{"text":" or the template-specific path such as ","type":"text"},{"text":"rm -rf src/\u003cextension>/web-src/","type":"text","marks":[{"type":"code_inline"}]},{"text":". Then remove matching ","type":"text"},{"text":"web-src","type":"text","marks":[{"type":"code_inline"}]},{"text":" config from ","type":"text"},{"text":"app.config.yaml","type":"text","marks":[{"type":"code_inline"}]},{"text":" or ","type":"text"},{"text":"ext.config.yaml","type":"text","marks":[{"type":"code_inline"}]},{"text":" if present, especially ","type":"text"},{"text":"web: web-src","type":"text","marks":[{"type":"code_inline"}]},{"text":" and ","type":"text"},{"text":"operations.view","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"impl: index.html","type":"text","marks":[{"type":"code_inline"}]},{"text":" entries. This avoids unnecessary frontend build artifacts and stale manifest wiring in a backend-only project.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Add actions","type":"text","marks":[{"type":"strong"}]},{"text":" — If the user later wants custom actions, run ","type":"text"},{"text":"cd ./my-project && skills/appbuilder-project-init/scripts/init.sh add-action \"my-action\"","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Add web assets","type":"text","marks":[{"type":"strong"}]},{"text":" — Only if the user later decides the bare project needs a UI, run ","type":"text"},{"text":"skills/appbuilder-project-init/scripts/init.sh add-web-assets","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Edit ext.config.yaml directly","type":"text","marks":[{"type":"strong"}]},{"text":" — Customize action definitions:","type":"text"}]}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Set ","type":"text"},{"text":"runtime: nodejs:22","type":"text","marks":[{"type":"code_inline"}]},{"text":" for production. Stage workspaces also accept ","type":"text"},{"text":"runtime: nodejs:24","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Add ","type":"text"},{"text":"inputs:","type":"text","marks":[{"type":"code_inline"}]},{"text":" for environment variables the action needs","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Set ","type":"text"},{"text":"annotations.require-adobe-auth: true","type":"text","marks":[{"type":"code_inline"}]},{"text":" if the action needs IMS tokens","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Set ","type":"text"},{"text":"web: 'yes'","type":"text","marks":[{"type":"code_inline"}]},{"text":" or ","type":"text"},{"text":"web: 'raw'","type":"text","marks":[{"type":"code_inline"}]},{"text":" depending on HTTP access needs","type":"text"}]}]}]},{"type":"ordered_list","attrs":{"order":8,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Edit app.config.yaml","type":"text","marks":[{"type":"strong"}]},{"text":" — For multi-extension projects, add ","type":"text"},{"text":"$include","type":"text","marks":[{"type":"code_inline"}]},{"text":" entries.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Apply action boilerplate","type":"text","marks":[{"type":"strong"}]},{"text":" — Use the ","type":"text"},{"text":"appbuilder-action-scaffolder","type":"text","marks":[{"type":"code_inline"}]},{"text":" skill's boilerplate pattern for production-ready action code with logging, input validation, and error handling.","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Validate","type":"text"}]},{"type":"paragraph","content":[{"text":"Verify the project structure by checking these items directly:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"app.config.yaml","type":"text","marks":[{"type":"code_inline"}]},{"text":"** exists** and contains valid YAML","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"All ","type":"text","marks":[{"type":"strong"}]},{"text":"$include","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" paths resolve to real files","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"ext.config.yaml","type":"text","marks":[{"type":"code_inline"}]},{"text":" (if present) has ","type":"text"},{"text":"runtimeManifest.packages","type":"text","marks":[{"type":"code_inline"}]},{"text":" with at least one action","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Action JS files exist","type":"text","marks":[{"type":"strong"}]},{"text":" at all declared ","type":"text"},{"text":"function:","type":"text","marks":[{"type":"code_inline"}]},{"text":" paths","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"package.json","type":"text","marks":[{"type":"code_inline"}]},{"text":"** exists** with ","type":"text"},{"text":"name","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"version","type":"text","marks":[{"type":"code_inline"}]},{"text":", and an Adobe SDK dependency (","type":"text"},{"text":"@adobe/aio-sdk","type":"text","marks":[{"type":"code_inline"}]},{"text":" or ","type":"text"},{"text":"@adobe/aio-lib-core-logging","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"**No root-level **","type":"text"},{"text":"runtimeManifest","type":"text","marks":[{"type":"code_inline"}]},{"text":" in ","type":"text"},{"text":"app.config.yaml","type":"text","marks":[{"type":"code_inline"}]},{"text":" (see Manifest guardrail below)","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Read the relevant files and verify each check. Fix any issues before proceeding.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Build, Test, Deploy (optional)","type":"text"}]},{"type":"paragraph","content":[{"text":"If the user wants to go beyond scaffolding:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"aio app build # Build\naio app test # Run tests\naio app deploy # Deploy to Adobe I/O Runtime\naio app dev # Run locally for development (use `aio app run` instead if actions use State SDK, Files SDK, or sequences)","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Manifest guardrail","type":"text"}]},{"type":"paragraph","content":[{"text":"Extension projects:","type":"text","marks":[{"type":"strong"}]},{"text":" Actions are defined under ","type":"text"},{"text":"runtimeManifest","type":"text","marks":[{"type":"code_inline"}]},{"text":" in ","type":"text"},{"text":"ext.config.yaml","type":"text","marks":[{"type":"code_inline"}]},{"text":", referenced via ","type":"text"},{"text":"$include","type":"text","marks":[{"type":"code_inline"}]},{"text":" from ","type":"text"},{"text":"app.config.yaml","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"paragraph","content":[{"text":"Standalone apps:","type":"text","marks":[{"type":"strong"}]},{"text":" Actions go under ","type":"text"},{"text":"application.runtimeManifest","type":"text","marks":[{"type":"code_inline"}]},{"text":" in ","type":"text"},{"text":"app.config.yaml","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"paragraph","content":[{"text":"Do not place a root-level ","type":"text"},{"text":"runtimeManifest","type":"text","marks":[{"type":"code_inline"}]},{"text":" directly in ","type":"text"},{"text":"app.config.yaml","type":"text","marks":[{"type":"code_inline"}]},{"text":": the CLI ignores those actions, so they will not deploy. If you see this shape, move it under ","type":"text"},{"text":"application.runtimeManifest","type":"text","marks":[{"type":"code_inline"}]},{"text":" or into ","type":"text"},{"text":"ext.config.yaml","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Troubleshooting & Edge Cases","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"aio","type":"text","marks":[{"type":"code_inline"}]},{"text":"** CLI not installed:** If ","type":"text"},{"text":"aio --version","type":"text","marks":[{"type":"code_inline"}]},{"text":" returns ","type":"text"},{"text":"command not found","type":"text","marks":[{"type":"code_inline"}]},{"text":" or fails, stop before initialization. Ask the user to install Adobe I/O CLI, complete ","type":"text"},{"text":"aio auth login","type":"text","marks":[{"type":"code_inline"}]},{"text":", and retry only after the CLI is available.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"npm install","type":"text","marks":[{"type":"code_inline"}]},{"text":"** fails after init:** The scaffold can still be created because init runs with ","type":"text"},{"text":"--no-install","type":"text","marks":[{"type":"code_inline"}]},{"text":", but builds/tests will fail until dependencies install cleanly. Capture the first package error, confirm the Node/npm version is compatible, rerun ","type":"text"},{"text":"npm install","type":"text","marks":[{"type":"code_inline"}]},{"text":" from the project root, and only continue once it succeeds.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Template choice is ambiguous:","type":"text","marks":[{"type":"strong"}]},{"text":" If the request could map to multiple templates, ask one clarifying question about UI vs headless, extension point, or target Adobe product. If the user has no preference, default to ","type":"text"},{"text":"@adobe/generator-app-excshell","type":"text","marks":[{"type":"code_inline"}]},{"text":" and state that assumption explicitly.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Project directory already exists or is not empty:","type":"text","marks":[{"type":"strong"}]},{"text":" Do not overwrite it silently. Ask whether to use a different directory, clear the existing folder, or initialize into a new path.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"aio console …","type":"text","marks":[{"type":"code_inline"}]},{"text":"** subcommand or flag not recognised:** Almost always means the CLI bundle is stale. Run ","type":"text"},{"text":"npm install -g @adobe/aio-cli","type":"text","marks":[{"type":"code_inline"}]},{"text":" and retry — that's the supported way to refresh every plugin (console, app, runtime, ims-oauth, telemetry). Only dig deeper if the same command still fails after a clean reinstall.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Workspace API add fails with \"product profile required\":","type":"text","marks":[{"type":"strong"}]},{"text":" The service code needs a product profile. Re-run ","type":"text"},{"text":"aio console api list --json","type":"text","marks":[{"type":"code_inline"}]},{"text":" to confirm, ask the user (or org admin) for the profile name, and retry with ","type":"text"},{"text":"--license-config CODE=PROFILE","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"No org selected:","type":"text","marks":[{"type":"strong"}]},{"text":" Console bootstrap commands will fail with an org-selection error. Run ","type":"text"},{"text":"aio console org list","type":"text","marks":[{"type":"code_inline"}]},{"text":" then ","type":"text"},{"text":"aio console org select \u003corgId>","type":"text","marks":[{"type":"code_inline"}]},{"text":" (or pass ","type":"text"},{"text":"--orgId","type":"text","marks":[{"type":"code_inline"}]},{"text":" to every command) before retrying.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Validation errors from a freshly scaffolded but partially edited project:","type":"text","marks":[{"type":"strong"}]},{"text":" Recent ","type":"text"},{"text":"aio app *","type":"text","marks":[{"type":"code_inline"}]},{"text":" versions validate ","type":"text"},{"text":"app.config.yaml","type":"text","marks":[{"type":"code_inline"}]},{"text":" by default against an OpenWhisk-aligned schema. The validation runs on every ","type":"text"},{"text":"aio app *","type":"text","marks":[{"type":"code_inline"}]},{"text":" command that reads or writes the manifest — concretely: ","type":"text"},{"text":"aio app init","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"aio app add (action|web-assets|extension|event|service)","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"aio app delete (action|web-assets|extension|event|service)","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"aio app build","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"aio app deploy","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"aio app undeploy","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"aio app run","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"aio app dev","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"aio app use","type":"text","marks":[{"type":"code_inline"}]},{"text":", and ","type":"text"},{"text":"aio app info","type":"text","marks":[{"type":"code_inline"}]},{"text":". The escape hatch flag is the same on all of them: ","type":"text"},{"text":"--no-config-validation","type":"text","marks":[{"type":"code_inline"}]},{"text":". Use it on the single command you need to unblock (e.g. ","type":"text"},{"text":"aio app build --no-config-validation","type":"text","marks":[{"type":"code_inline"}]},{"text":" while you're still mid-refactor), then drop it as soon as the manifest is whole. Don't bake it into scripts — silent drift between local config and the deployed shape is exactly what the validator was added to catch.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Template listing hangs behind a corporate proxy:","type":"text","marks":[{"type":"strong"}]},{"text":" Older CLI bundles didn't honour ","type":"text"},{"text":"HTTP_PROXY","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"HTTPS_PROXY","type":"text","marks":[{"type":"code_inline"}]},{"text":" during the template registry SSL handshake. Run ","type":"text"},{"text":"npm install -g @adobe/aio-cli","type":"text","marks":[{"type":"code_inline"}]},{"text":" to pick up the proxy fix, confirm ","type":"text"},{"text":"HTTPS_PROXY","type":"text","marks":[{"type":"code_inline"}]},{"text":" is exported in the same shell, and retry.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"aio","type":"text","marks":[{"type":"code_inline"}]},{"text":"** commands die instantly with ","type":"text"},{"text":"ERR_REQUIRE_ESM","type":"text","marks":[{"type":"code_inline"}]},{"text":" (exit 127):** A clean install can resolve ","type":"text"},{"text":"@adobe/aio-cli-plugin-certificate","type":"text","marks":[{"type":"code_inline"}]},{"text":" to ","type":"text"},{"text":"2.2.0","type":"text","marks":[{"type":"code_inline"}]},{"text":" (shipped as ESM), which the bundled CommonJS console lib cannot ","type":"text"},{"text":"require()","type":"text","marks":[{"type":"code_inline"}]},{"text":" — every ","type":"text"},{"text":"aio where","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"login","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"console","type":"text","marks":[{"type":"code_inline"}]},{"text":" command exits 127 with ","type":"text"},{"text":"[ERR_REQUIRE_ESM]","type":"text","marks":[{"type":"code_inline"}]},{"text":" (though ","type":"text"},{"text":"aio -v","type":"text","marks":[{"type":"code_inline"}]},{"text":" still prints a version, which is misleading). Pin the plugin to the last CommonJS 2.x ","type":"text"},{"text":"inside the global package","type":"text","marks":[{"type":"em"}]},{"text":": ","type":"text"},{"text":"cd \"$(npm root -g)/@adobe/aio-cli\" && npm install @adobe/[email protected]","type":"text","marks":[{"type":"code_inline"}]},{"text":". Re-check after any ","type":"text"},{"text":"aio update","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"aio console org list","type":"text","marks":[{"type":"code_inline"}]},{"text":"** returns nothing / ","type":"text"},{"text":"[]","type":"text","marks":[{"type":"code_inline"}]},{"text":":** Login succeeded but the org list is empty — almost always the ","type":"text"},{"text":"wrong environment","type":"text","marks":[{"type":"strong"}]},{"text":" (internal Adobe/App Builder dev lives on ","type":"text"},{"text":"stage","type":"text","marks":[{"type":"strong"}]},{"text":", but the CLI defaults to ","type":"text"},{"text":"prod","type":"text","marks":[{"type":"strong"}]},{"text":"). Switch: ","type":"text"},{"text":"export AIO_CLI_ENV=stage && aio logout && aio login","type":"text","marks":[{"type":"code_inline"}]},{"text":". If stage is ","type":"text"},{"text":"also","type":"text","marks":[{"type":"em"}]},{"text":" empty, it's an entitlement problem, not an environment one (needs an App Builder license and the user added under ","type":"text"},{"text":"Admin Console → Users → Developers","type":"text","marks":[{"type":"strong"}]},{"text":").","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"aio console project list","type":"text","marks":[{"type":"code_inline"}]},{"text":"** → ","type":"text"},{"text":"451 … accept developer terms","type":"text","marks":[{"type":"code_inline"}]},{"text":":** The org's ","type":"text"},{"text":"Adobe Developer Terms of Use","type":"text","marks":[{"type":"strong"}]},{"text":" haven't been accepted — a one-time, per-org acceptance the CLI can't do for you. Open the Developer Console (Stage ","type":"text"},{"text":"https://developer-stage.adobe.com/console","type":"text","marks":[{"type":"code_inline"}]},{"text":", Prod ","type":"text"},{"text":"https://developer.adobe.com/console","type":"text","marks":[{"type":"code_inline"}]},{"text":"), confirm the correct org (top-right), accept the prompt, then re-run the command.","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Chaining with other skills","type":"text"}]},{"type":"paragraph","content":[{"text":"After initialization, hand off to:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"appbuilder-action-scaffolder","type":"text","marks":[{"type":"code_inline"}]},{"text":" — For scaffolding actions with playbook, checklist, boilerplate templates, and manifest validation","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"appbuilder-ui-scaffolder","type":"text","marks":[{"type":"code_inline"}]},{"text":" — Build React Spectrum UI for ExC Shell SPAs and AEM extensions","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Pattern Quick-Reference","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Task","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Reference","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Command","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Bootstrap Console project + workspace + APIs","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"references/bootstrap.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/bootstrap.md","title":null}}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"aio console project create","type":"text","marks":[{"type":"code_inline"}]},{"text":" → ","type":"text"},{"text":"aio console workspace create","type":"text","marks":[{"type":"code_inline"}]},{"text":" → ","type":"text"},{"text":"aio console workspace api add","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Discover org's available APIs","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"references/bootstrap.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/bootstrap.md","title":null}}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"aio console api list --json","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Subscribe an existing workspace to an API","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"references/bootstrap.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/bootstrap.md","title":null}}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"aio console workspace api add --service-code … [--license-config …]","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Initialize an App Builder project from a template","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"references/templates.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/templates.md","title":null}}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"scripts/init.sh init","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Wire local app to a Console workspace post-init","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"references/bootstrap.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/bootstrap.md","title":null}}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"scripts/init.sh init … --org … --project …","type":"text","marks":[{"type":"code_inline"}]},{"text":" ","type":"text"},{"text":"or","type":"text","marks":[{"type":"em"}]},{"text":" ","type":"text"},{"text":"aio app use --no-input","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Debug project init issues","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"references/debugging.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/debugging.md","title":null}}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"—","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"References","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/bootstrap.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/bootstrap.md","title":null}}]},{"text":" — Agentic Developer Console bootstrap (project, workspace, API subscriptions) via raw ","type":"text"},{"text":"aio console …","type":"text","marks":[{"type":"code_inline"}]},{"text":" commands from the latest ","type":"text"},{"text":"@adobe/aio-cli","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/templates.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/templates.md","title":null}}]},{"text":" — Template catalog with intent mapping and per-template post-init guidance (includes the Content Hub extension)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/debugging.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/debugging.md","title":null}}]},{"text":" — Troubleshooting guide for init failures, Node/npm issues, login problems, and first-run errors","type":"text"}]}]}]}]},"metadata":{"date":"2026-11-02","name":"appbuilder-project-init","author":"@skillopedia","source":{"stars":319,"repo_name":"skills","origin_url":"https://github.com/adobe/skills/blob/HEAD/plugins/app-builder/skills/appbuilder-project-init/SKILL.md","repo_owner":"adobe","body_sha256":"ff5429ec7adc80dd4061974024b00962f994b0266ade614eaf85bab9050ae7c0","cluster_key":"b8c4e2a7ac7d30e195d4f7816e3ebafcb9e93f6289f0fa5408a08d2b1710ef56","clean_bundle":{"format":"clean-skill-bundle-v1","source":"adobe/skills/plugins/app-builder/skills/appbuilder-project-init/SKILL.md","text_bytes":62418,"source_commit":"7a3600673cc0caffe1b97f56d3e7e26f72deaca5","skills_sh_rank":13958,"attachment_count":6,"text_attachments":6,"attachment_storage":"skill_attachments","binary_attachments":0},"cluster_size":1,"skill_md_path":"plugins/app-builder/skills/appbuilder-project-init/SKILL.md","import_metadata":{"date":"2026-11-02","author":"@skillopedia","version":"v1","category":"devops-infrastructure","category_label":"DevOps"},"exact_dupes_collapsed_into_this":0},"license":"Apache-2.0","version":"v1","category":"devops-infrastructure","metadata":{"category":"project-initialization"},"import_tag":"skills-sh-top20k-2026-11","description":"Initialize an Adobe App Builder project end-to-end and prepare the machine to build one. Creates the Console project and workspace, subscribes APIs (including those needing a product profile), maps intent to the right template, runs non-interactive `aio app init`, and guides post-init customization. Use whenever the user mentions creating an App Builder app, scaffolding a project, `aio app init`, an Experience Cloud extension, adding actions or web assets, or creating a Console project/workspace — even without saying \"App Builder\". Also for SPA templates, AEM extensions, API Mesh, Asset Compute workers, and MCP servers. Also covers first-time machine/CLI setup (Node 20, aio CLI install, `aio login`, IMS org, stage vs prod) and debugging setup/init failures — `ERR_REQUIRE_ESM`, empty `aio console org list`, `451 accept developer terms`, template not found, init hangs, or Node/npm and post-init build errors.","allowed-tools":"Bash(aio:*) Bash(npm:*) Bash(node:*) Read Write Edit","compatibility":"Requires aio CLI (Adobe I/O CLI) — install or refresh with `npm install -g @adobe/aio-cli` so the bundled plugins (`aio-cli-plugin-console`, `aio-cli-plugin-app`, etc.) are current. Node.js 18+ (Node 24 supported on Stage runtimes). Bash shell."}},"renderedAt":1793661378899}

App Builder Project Initialization Maps user intent to the right Adobe App Builder template and runs non-interactive . Default: (SPA + actions). For headless/bare projects, use . When a Developer Console project / workspace / API subscription does not yet exist, this skill walks the agent through creating them non-interactively by calling directly — see the Bootstrap section and references/bootstrap.md. The latest bundle exposes non-interactive / / / (with for services that require a product profile), and non-interactive . Together they remove every blocking "open the Developer Console UI and…