--- name: experience-ui-bundle-project-generate description: "Generates a minimal, ready-to-develop SFDX starter project from template instead of hand-scaffolding files. Use this skill when starting a brand-new Salesforce UI bundle app (React or Angular) and the initial project must be scaffolded — trigger phrases include create, start, or scaffold a new UI bundle app, generate a starter project, or use a prebuilt/starter template. DO NOT TRIGGER when: editing, styling, or adding pages or components to an EXISTING app (use experience-ui-bundle-frontend-generate); configuring ui-bundle.json or metadata files (use experience-ui-bundle-metadata-generate); deploying to an org (use experience-ui-bundle-deploy); when the user explicitly says they want to hand-scaffold from scratch; or when creating a brand-new standalone Salesforce project that also needs full setup — relocating the session, connecting an org, setting the default, and enabling source tracking (use dx-project-create in the salesforce-development plugin)." metadata: version: "1.2" domains: ["Experience"] relatedSkills: - "experience-ui-bundle-app-coordinate" - "experience-ui-bundle-deploy" - "experience-ui-bundle-frontend-generate" - "experience-ui-bundle-metadata-generate" - "experience-ui-bundle-salesforce-data-access" cliTools: - tool: ["node"] semver: ">=18.0.0" - tool: ["npm"] semver: ">=9.0.0" - tool: ["sf"] semver: ">=2.0.0" --- # Using a UI Bundle Template Before building a Salesforce UI bundle app from scratch, offer the user a **prebuilt starter template**. The Salesforce CLI generates these — a complete, deployable SFDX project (UI bundle + toolchain + an `npm run setup` automation) — in one command. Starting from a starter is faster and less error-prone than hand-scaffolding. The CLI command is `sf template generate project`. ## Step 1: Offer the choice **Determine the framework.** It is normally already decided by the calling context — either passed down by the root/coordinator skill that invoked this one, or stated in the user's request. Use that. The frameworks this skill supports are exactly the reference files under `/references/`, each named `-project-generate.md` (so `react` → `/references/react-project-generate.md`). This is the single source of truth — adding a framework means adding a reference file, nothing here changes. - **If the framework is known** — open `/references/-project-generate.md`. - **If it is unknown** (a standalone run where nobody said which) — list `/references/`, derive the supported set by stripping the `-project-generate.md` suffix from each filename, and ask the user to pick one of those. If the user names a framework with no matching reference file, it is not supported here — hand off to `experience-ui-bundle-app-coordinate` to scaffold from scratch. Each reference lists that framework's `--template` flags and what each starter contains. Pick the one that fits the user's audience (internal vs. external). **If the user prefers to start from scratch** (or neither template fits), stop here and let `experience-ui-bundle-app-coordinate` scaffold a new project. This skill is opt-in — do not force a template. Once the user picks, carry the chosen `--template` flag into Step 2. ## Step 2: Generate the project into the target root The project contents must land **directly at the target root `$DEST`** — so `sfdx-project.json` sits at `$DEST/sfdx-project.json`, with no extra wrapper subfolder. `sf template generate project` always nests its output under a `--name` subfolder, so `/scripts/generate-project.mjs` generates into `$DEST`, flattens the subfolder's contents up into `$DEST` (overwriting anything already there on conflict), and removes the now-empty subfolder — all through Node's `fs`/`child_process` APIs, so it runs the same way on Windows cmd/PowerShell as it does on macOS/Linux/Git Bash. - `` = the absolute path to **this skill's own directory** — the folder containing this `SKILL.md`; resolve it from the skill path in context - **`$NAME`** — the project name (alphanumerical only — no spaces, hyphens, underscores, or special characters). Ask the user for it. It also names the UI bundle, so it shows up inside the project. - **`$DEST`** — the target root directory the contents land in (use `.` for the current directory). - **`$TEMPLATE`** — the `--template` flag value from the framework reference chosen in Step 1 (e.g. `reactinternalapp`). Run the script with the actual, literal values substituted for `$NAME`, `$DEST`, and `$TEMPLATE` — do not use shell variable assignment/interpolation (`NAME=...` / `$NAME` / `%NAME%` / `$env:NAME`) since that syntax differs across bash, cmd, and PowerShell and this command must work in all three: ```sh node "/scripts/generate-project.mjs" "" "" "