wizard
First-run onboarding — detect the host project's framework + stack, confirm via checkbox prompts, sync CLAUDE.md to the real project (structure, commands), then offer /prune (opt-in — removes nothing itself). Use after copying the kit into a repo, or re-run after a stack change.
Install
mkdir -p .claude/skills/wizard && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/16756" && unzip -o skill.zip -d .claude/skills/wizard && rm skill.zipInstalls to .claude/skills/wizard
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
First-run onboarding — detect the host project's framework + stack, confirm via checkbox prompts, sync CLAUDE.md to the real project (structure, commands), then offer /prune (opt-in — removes nothing itself). Use after copying the kit into a repo, or re-run after a stack change.About this skill
Onboarding wizard
Adapts the kit to this project: detect the framework and stack, confirm it with the user, sync CLAUDE.md to the real project, then optionally hand off to /prune. The wizard itself deletes no agents/skills/rules — pruning happens only if the user opts in at the end (step 10).
Work through the steps in order. Stop and ask whenever a value is ambiguous; never guess a stack choice silently. Prefer AskUserQuestion (checkbox/radio prompts) over asking the user to type "1, 2, 3".
-
Refresh the facts. Run
node .claude/hooks/detect-stack.mjs(cheap, fail-open), then read.claude/.wizard/facts.json.- If
isProjectisfalse, there is no host project here — this is the kit repo itself or an empty dir. Stop, say so, edit nothing. - Read
framework(one ofvue|react|angular|svelte|solid|preact|lit, orunknown) andmetaFramework(e.g.nuxt|next|sveltekit|remix|astro, ornull). The kit's rules speak the Vue reference stack, so:vue→ native fit; proceed.- a known non-Vue framework → tell the user the rules are written against the Vue reference stack and that named APIs translate to their framework; confirm they want to proceed.
unknown→ the detector found no known UI framework. Ask the user which framework this is (or whether it's framework-agnostic) before continuing — don't assume Vue.
- If
kit.onboardedis alreadytrue, this is a re-sync — say so and continue (re-running is supported). - Surface every entry in
warningsto the user — they flag ambiguous or conflicting detection.
- If
-
Guard the working tree. Run
git status --short. If it is not clean, tell the user the wizard will edit CLAUDE.md and ask whether to proceed anyway or stop to commit/stash first. Never edit a dirty tree without an explicit go-ahead (git is the only undo). -
Confirm the stack — use
AskUserQuestion, not free text. Present each value as a radio question (multiSelect: false) with the detected value first, labelled(detected); rely on the automatic "Other" for the long tail. The tool caps each call at 4 questions and each question at 4 authored options — the "Other" free-text choice is added automatically on top and costs no slot. Split into two calls:- Call 1 — basics:
- Framework — detected
frameworkfirst, plus up to three likely alternatives (4 authored options); the auto-"Other" covers the rest of the known set. - Package manager —
npm|pnpm|yarn|bun. IfpackageManagerAmbiguousis true or it isnull, the user must choose (surface anywarnings). - Language — TypeScript or JavaScript (default
language). - Styling — Tailwind / Sass-SCSS / CSS Modules / scoped
<style>(defaultstyling).
- Framework — detected
- Call 2 — layout:
- Structure — layer-first or feature-first (default
structure; cross-check against the realsrcDirs). - Project name — detected
projectNamefirst, the repo folder name second.
- Structure — layer-first or feature-first (default
- Skip a question only when the value is certain and there's nothing to confirm; when in doubt, ask.
- Call 1 — basics:
-
Apply the confirmed values to CLAUDE.md. Surgical edits only — the file may already be hand-edited (see
rules/principles.md):- Title
# <PROJECT_NAME>→ the project name. - Stack section — name the confirmed framework on the first line, with its version only if
frameworkVersionis non-null, stripping the semver range sigil (^3.4.0→ 3.4); don't fabricate one — on a meta-framework project the base version isn't readable, so write e.g. "Vue (via NuxtmetaFrameworkVersion)" instead of guessing a Vue version. Keep tooling lines (state / router / i18n / test libs) only where the facts confirm them —usesandtestinginfacts.jsonname what's actually installed; don't re-infer from memory. On a stack the kit can't detect libs for, name the framework and leave its equivalents to the user — never assert tools the facts don't show. - Reference-stack note (the callout under the title): on a Vue project you can drop it (nothing to translate); on a known non-Vue framework keep it and name that framework as what the Vue APIs translate to; on
unknownkeep it generic. - Language section: collapse
**TypeScript** | **JavaScript** ← set one for this repo.to the chosen one, and keep only the relevant guidance sentence. - Package manager — keep the
<pm>token in the Commands block and Quality gate. The kit is PM-agnostic by design (README: the config never hardcodes npm/pnpm/yarn/bun): the agent substitutes<pm>from the lockfile. In the Package-manager section, just state the detected manager (e.g. "Detected: pnpm (frompnpm-lock.yaml)") and drop the generic lockfile table. Do not rewrite<pm>to the concrete manager anywhere — in CLAUDE.md or the rules. - Styling line in Stack → state the chosen approach (drop the "swap for…" aside once decided).
- JavaScript projects: remove the TS-only
<pm> run typecheckcommand line and trim the "plustypecheck" / "TS only" notes in Language and Quality gate. - Leave every other line untouched (surgical edits only).
- Title
-
Sync CLAUDE.md to the real project (the
/init-like step). Step 4 resolves placeholders; this step makes the structure and commands match reality instead of the template example — this is what stops it feeling like/initnever ran:- Project structure — read the real layout: start from
srcDirsin facts, then confirm with a shallow scan (find src -maxdepth 2 -type dorls src). Replace the example tree with the project's actual top-level source dirs, with a short gloss each where the purpose is obvious. Keep it concise (top one–two levels), drop the "Adapt this to your repo — an example, not a rule" hedge once it reflects reality, and keep the by-type vs by-feature note aligned with the confirmedstructure. - Commands — the script names are already in facts (
scripts); cross-checkpackage.jsonfor what they run. Keep a documented command line only if its script actually exists; drop the rest. Add any project-specific scripts that matter (e.g.storybook,test:unit,test:coverage). Keep the<pm>prefix token (don't expand it). Don't invent scripts the project doesn't have. - If something genuinely can't be determined, leave the template line and say so in the summary — never fabricate structure or commands.
- Project structure — read the real layout: start from
-
Confirm the machine-local paths are ignored. The SessionStart hook auto-adds
.claude/.wizard/to.gitignoreon every run (ensureWizardIgnoredindetect-stack.mjs) — confirm it, and append it manually only if the hook hasn't run yet (it holds the machine-local detection cache, which must not be committed). Also ensure the other two machine-local entries from the README quick-start:.claude/settings.local.jsonand.claude/worktrees/— append any that are missing. Do not ignore.claude/.onboarded(it's the committed marker teammates rely on). -
Offer the native pre-commit gate (opt-in). The shipped
PreToolUsehook gates only commits made through Claude Code — a commit from a plain terminal bypasses it. Ask viaAskUserQuestion(yes/no) whether to install the same gate as a native git hook. If yes: when the repo already uses a hook manager (husky/lefthook — checkpackage.jsonand existing hook dirs), addnode .claude/hooks/pre-commit-gate.mjs --nativeto its pre-commit config instead of fighting it; otherwise write.git/hooks/pre-commit(#!/bin/sh+exec node "$(git rev-parse --show-toplevel)/.claude/hooks/pre-commit-gate.mjs" --native) andchmod +xit. Note that.git/hooks/is machine-local — teammates re-run/wizardor copy the snippet from the README. If no, mention the README documents the one-liner. -
Drop the marker. Write
.claude/.onboarded— one short line: the date and the resolved stack, framework first (e.g.2026-06-26 · react · pnpm · TypeScript · Tailwind · layer-first). This stops the SessionStart hook from prompting again, and it is committed so teammates skip onboarding. -
Summarize. Tell the user exactly what changed in CLAUDE.md — placeholders resolved, structure synced, commands reconciled. Suggest they review
git diff CLAUDE.mdand the new.claude/.onboarded, then commit on a branch (nevermain— seerules/git-operations.md). -
Offer to prune (opt-in). The kit still ships every agent, skill, and rule — nothing was removed. Ask the user via
AskUserQuestion(yes/no) whether to remove the capabilities this project won't use now. If yes, run the/pruneskill — it presents the removable units as checkboxes, is graph-aware, and fixes every cross-reference. Note that/prunewants a clean tree, so recommend committing the onboarding first. If no, remind them/pruneis available anytime later. Never remove anything without this explicit go-ahead.