bootstrap
Skill2 starsChanged 3 months agoMITView on GitHub
Adapt the feature-flow kit to THIS project — the front door for setting it up. Run on the FIRST install after dropping the kit into a project's .claude/ folder: detects the stack, writes the project profile (.claude/PROJECT.md), installs and reconciles stack rule packs against the real codebase, wires settings/hooks/commands, and writes the kit manifest. Backs up before writing and asks keep-or-rollback before cleaning up build-time files. On a project that's ALREADY adapted (profile_status: ACTIVE) it hands off to /update-kit instead of re-installing, so any later update or re-adapt goes through the safe staging + 3-way merge. Trigger when the user says "bootstrap", "adapt the kit", "set up .claude for this project", or when PROJECT.md is missing / still a TEMPLATE. DO NOT TRIGGER to remove or roll back the kit (that's /teardown). For a plain kit update or re-adapt you can go straight to /update-kit — running /bootstrap on an already-adapted (profile_status: ACTIVE) project is still safe: it detects that and hands off to /update-kit rather than re-installing.
- Deletes or force-pushes
- Commits and pushes
70 other projects use a version of this.
Adopted by
Most recently taken up by
- victorbeppler/claude-bootstraptheir own version, first seen Nov 8, 2026
- zedarvates/frugal-skillstheir own version, first seen Nov 8, 2026
- joi-fairshare/agentic-workflowtheir own version, first seen Nov 8, 2026
- renzrollon/interlocktheir own version, first seen Nov 5, 2026
- ArcticFox2029/chamnantheir own version, first seen Nov 5, 2026
- enocgit/sdlc-kittheir own version, first seen Nov 1, 2026
Used with
Projects with it also use surprise-me, ppt-generation and 10 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
stophobiaSkillsurprise-me
Create a delightful, unexpected "wow" experience for the user by dynamically discovering and creatively combining other enabled skills. Triggers when the user says "surprise me" or any request expressing a desire for an unexpected creative showcase. Also triggers when the user is bored, wants inspiration, or asks for "something interesting".
Also in 3 projects that use this
HK-hubSkillppt-generation
Use this skill when the user requests to generate, create, or make presentations (PPT/PPTX). Creates visually rich slides by generating images for each slide and composing them into a PowerPoint file.
Also in 3 projects that use this
stophobiaSkillgithub-deep-research
Conduct multi-round deep research on any GitHub Repo. Use when users request comprehensive analysis, timeline reconstruction, competitive analysis, or in-depth investigation of GitHub. Produces structured markdown reports with executive summaries, chronological timelines, metrics analysis, and Mermaid diagrams. Triggers on Github repository URL or open source projects.
Also in 3 projects that use this
HK-hubSkillconsulting-analysis
Use this skill when the user requests to generate, create, or write professional research reports including but not limited to market analysis, consumer insights, brand analysis, financial analysis, industry research, competitive intelligence, investment due diligence, or any consulting-grade analytical report. This skill operates in two phases — (1) generating a structured analysis framework with chapter skeleton, data query requirements, and analysis logic, and (2) after data collection by other skills, producing the final consulting-grade report with structured narratives, embedded charts, and strategic insights.
Also in 3 projects that use this
MicrosoftSkillpodcast-generation
Generate AI-powered podcast-style audio narratives using Azure OpenAI's GPT Realtime Mini model via WebSocket. Use when building text-to-speech features, audio narrative generation, podcast creation from content, or integrating with Azure OpenAI Realtime API for real audio output. Covers full-stack implementation from React frontend to Python FastAPI backend with WebSocket streaming.
Also in 3 projects that use this
VercelSkillvercel-deploy
Deploy applications and websites to Vercel with a claimable preview. Use when the user requests deployment actions like "deploy my app", "deploy and give me the link", "push this live", or "create a preview deployment". No authentication required - returns preview URL and claimable deployment link.
Also in 4 projects that use this
- +1 more from HK-hub
Other versions70 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 70
- bytedance/deer-flow★ 85ksame name
- mozilla-mobile/firefox-ios★ 13ksame name
- openai/plugins★ 7.8ksame name
- modelscope/OpenJudge★ 1.1ksame name
- agentscope-ai/OpenJudge★ 1.1ksame name
- iovisor/ubpf★ 996same name
- stophobia/deerflow2.0-enhanced★ 821same name
- infragate/capa★ 718same name
- EvovexAI/EvoFlow★ 612same name
- vercel/vercel-plugin★ 328same name
60 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository48 other files it gives its agents.
- analystSkill
- api-designSkill
- arch-healthSkill
- audit-qualitySkill
- audit-securitySkill
- clean-mvpSkill
- close-epicSkill
- codebase-designSkill
- code-reviewSkill
- decomposeSkill
- deploySkill
- depsSkill
- diagnoseSkill
- discoverSkill
- distillSkill
- domain-modelSkill
- epic-statusSkill
- grillSkill
- grill-with-docsSkill
- handoffSkill
- ideaSkill
- implementSkill
- incidentSkill
- onboardSkill
- perfSkill
- preflightSkill
- prepareSkill
- prompt-masterSkill
- prototypeSkill
- refactorSkill
- retroSkill
- revisitSkill
- rolloutSkill
- scaffoldSkill
- select-techSkill
- spikeSkill
- sweepSkill
- tddSkill
- teardownSkill
- testSkill
- test-specSkill
- threat-modelSkill
- to-issuesSkill
- to-prdSkill
- triageSkill
- update-kitSkill
- which-skillSkill
- writing-skillsSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
23 rules. 0 are common, 3 are distinctive, and 20 are very specific to this project.
0
Common
Most of the 62 edited versions we read keep these.
3
Distinctive
This author's own choices. Worth a look.
20
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 47
Read the contracts: PROJECT.template.md, settings.template.json, and CLAUDE.snippet.md.
- Distinctive: line 52
Before writing anything, snapshot what you are about to change so this run is reversible (Phase 8).
- Very specific: line 99
Always confirm the Domain section with the user briefly — it drives /analyst and can't be reliably detected from code.
- Very specific: line 104
If the repo already has a CONTEXT.md or docs/adr/, point at it.
- Very specific: line 114
Ask the artifact git policy and record it in PROJECT.md → "Artifact git policy".
- Very specific: line 124
Ask the VCS / code-publish policy and record it in PROJECT.md → "Security / VCS policy".
- Very specific: line 139
Always install the kit's rules/_generic/* (language-neutral.
- Very specific: line 145
If a detected stack has no pack in the library, tell the user: the generic core works, but stack rules are missing — offer to (a) proceed …
- Very specific: line 155
Only for an existing project.
- Very specific: line 157
Run the probe (a cheap Grep/Glob/Read check) to test whether the pack's expects holds in this codebase.
- Distinctive: line 159
If reality matches → install the rule as-is.
- Very specific: line 160
If reality diverges and on_divergence: ask (the default) → present the divergence via AskUserQuestion: state what the rule expects vs what …
- Very specific: line 174
Write the project-specific files.
- Very specific: line 223
Keep the emitted file strictly valid JSON: no // comment keys, no unknown hook events, and resolve everything (the schema is strictly …
- Very specific: line 262
sessionstart.sh→__BOOTSTRAP_EPIC_STATUS__: If the project has a tool that prints active-epic progress or status drift (PROJECT.md → … - Very specific: line 310
If .claude/skills/ already holds skills the kit does not ship, draft PROJECT.md → ## Project skills from their descriptions so /which-skill …
- Very specific: line 353
After the Phase 7 report, ask via AskUserQuestion: Keep the adaptation, or Roll back.
- Very specific: line 357
Delete every path listed in $BK/created.txt (files, then any now-empty dirs this run created).
- Very specific: line 365
Leave _kit/ in place so the user can fix inputs and re-run.
- Very specific: line 370
Only after the user keeps the result.
- Distinctive: line 381
Detect, don't assume: Every project fact written to PROJECT.md must come from evidence or from the user — never from a default framework …
- Very specific: line 383
Ask on divergence: When installed rules contradict the real code, the user decides (adopt/relax/skip).
- Very specific: line 395
Leave a manifest: Always write .claude/.kit-manifest.json (Phase 6) — it's the baseline /update-kit uses to tell adapted kit files from …
“Common” is measured: kept by at least 6 in 10 of the 62 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
/bootstrap — adapt the kit to this project
You turn the portable feature-flow kit into a project-specific .claude/. You are
interactive: detect what you can, ask the user about anything ambiguous or where rules
diverge from the real code, then generate the project layer. Read _kit/KIT.md and
_kit/rules-library/PACKS.md once at the start — they define the kit and the pack format.
Work top-to-bottom, naming each phase as you enter it — the phase headings below are the checklist, and none is optional. Do not skip or reorder: this run is interactive and long, and a run that loses its place re-asks the user questions they already answered.
Phase 0 — Preconditions
- Dispatch on entry (this skill is the front door) — check this FIRST. If
.claude/PROJECT.mdalready exists withprofile_status: ACTIVEand you were entered directly (the user ran/bootstrap— not/update-kitcalling the reconcile phases 3–6), this is not a first install: the project is already adapted. Hand off to/update-kitand stop — it stages the new/current kit, 3-way merges so local adaptations survive, then re-adapts. Re-copying the kit over.claude/and re-installing would clobber local edits — never do that. (Re-adapting after structural changes also goes through/update-kit.) Check this before the kit-present precondition below, because an adapted project has already removed_kit/at cleanup. - Confirm the current directory is the project root and the kit is present:
_kit/KIT.mdexists under.claude/(or the cwd if the kit was dropped at repo root). If not, stop and tell the user to copy the kit into<project>/.claude/first. - Read the contracts:
PROJECT.template.md,settings.template.json, andCLAUDE.snippet.md. Stack rule packs are vendored in_kit/rules-library/.
Phase 0.5 — Back up before any writes
Before writing anything, snapshot what you are about to change so this run is reversible (Phase 8). Create a timestamped backup dir plus a manifest of newly created paths:
TS=$(date +%Y%m%d-%H%M%S); BK=".claude/.bootstrap-backup/$TS"; mkdir -p "$BK"
for f in CLAUDE.md .gitignore .claude/PROJECT.md .claude/settings.json .claude/hooks/guard-bash.sh; do
[ -f "$f" ] && mkdir -p "$BK/$(dirname "$f")" && cp -p "$f" "$BK/$f"
done
: > "$BK/created.txt" # paths this run newly creates — for a clean rollback- Back up every file you will modify in place into
$BKbefore you touch it. The loop covers the always-touched ones; add any other existing file you end up overwriting. - As you install in Phases 5–6, append each newly created path (pack rules, pack skills,
commands,
PROJECT.mdif it didn't exist) to$BK/created.txt, one per line. - On a re-run, add a new snapshot — never delete earlier ones.
- This snapshot reverses bootstrap's own writes. Restoring the project to its pre-kit
state also needs the pre-copy backup taken before the kit was copied in (README "Quick start"
step);
/teardownuses whichever backup is present.
Phase 1 — Detect the project
Decide empty vs existing (any source files tracked or present beyond .claude/).
Scan for stack markers and structure. For a non-trivial repo, delegate the heavy scan to an Explore agent (read-only) and have it report; otherwise scan inline:
- Language/framework markers:
Gemfile(+rails),package.json(+framework deps),pyproject.toml/setup.py,go.mod,Cargo.toml,*.csproj, etc. - Package manager / tooling: lockfiles (
yarn.lock,package-lock.json,uv.lock,poetry.lock,Gemfile.lock); presence ofmake, task runners,bin/scripts. - Test / build / lint commands: infer from config (
Makefiletargets,package.jsonscripts,pyprojecttool config) — capture exact strings. - Structure / layers: top-level source dirs, module/layer layout, any existing
architecture docs,
CLAUDE.md,.cursor/rules, README. - Git host:
git remote -v→ github / gitlab / none. - Integrations: external SDKs/clients in deps and their official doc URLs.
Phase 2 — Draft the profile
Fill PROJECT.template.md into a draft .claude/PROJECT.md from detection.
- Existing project: populate every section from evidence; mark anything you inferred but aren't sure of for confirmation in Phase 4.
- Empty project: you can't detect — ask the user. Use
AskUserQuestionfor: primary language/framework, package manager, test command, architecture style, and the business domain + roles. Keep it to a few focused questions. - Always confirm the Domain section with the user briefly — it drives
/analystand can't be reliably detected from code. - Set the Domain → Glossary (CONTEXT.md) and ADR location pointers (default
CONTEXT.mdat repo root anddocs/adr/). Leave themn/auntil/domain-modelrecords the first term/decision — do not create the files now (they're created lazily by/domain-model). If the repo already has aCONTEXT.mdordocs/adr/, point at it. - Set Plans / backlog → Issue tracker =
local, the Issues directory (default<backlog>/issues/, used by/to-issuesand/triage), and the Triage labels state machine — offer the defaultneeds-triage → ready → in-progress → done+blockedand let the user adjust. Don't scaffold the issues directory;/to-issuescreates it on first use. - Set Plans / backlog → Small-debt register — default
<backlog>/small-debt-register.md, the path-keyed home for verified zero-consequence fixes that/close-epicrefuses to card andrules/_generic/code.mdtells a file-editing session to grep. Don't scaffold it; it is created fromskills/close-epic/assets/small-debt-register.mdon first use.n/ais a valid answer — the rows then stay as clauses in ledger rows, which is where they were before the register existed. - Ask the artifact git policy and record it in
PROJECT.md→ "Artifact git policy". For each category of agent-generated artifact, the user decides whether it stays local (gitignored, never pushed) or is committed (shared) — explain the trade-off, don't impose. Group into a couple ofAskUserQuestions, e.g.:- Working backlog (briefs/specs/plans/PRDs/issues/handoff/diagnosis): "keep as local scratch that never leaves your machine, or commit them as shared docs?"
- Shared model (
CONTEXT.mdglossary + ADRs): "commit as the team's shared language (recommended — that's the point of a ubiquitous language), or keep local?" Offer a sensible default (working backlog local,CONTEXT.md/ADRs committed) but the choice is the user's. The chosen local locations get added to.gitignorein Phase 6.
- Ask the VCS / code-publish policy and record it in
PROJECT.md→ "Security / VCS policy". The safe default is suggest-only: the agent never runsgit add/commit/merge/push— it outputs the command for the user to run. Confirm the user wants that, or relax it (e.g. allow local commits but never push). Also ask for any other commands to forbid entirely — a deploy/publish CLI,scp/rsyncto a remote, a package-publish command, etc. Both answers drive thesettings.jsondenylist and the guard-bash blocks in Phase 5, so the user explicitly controls what the agent may run and what code can leave the machine.
Set profile_status: ACTIVE only at the end (Phase 5), not yet.
Phase 3 — Select rule packs (from the rules library)
Stack rule packs are vendored in the kit at _kit/rules-library/ — read them there,
no network needed. (If that folder is missing, proceed generic-only and tell the user.)
- Always install the kit's
rules/_generic/*(language-neutral; already in place). - Scan
_kit/rules-library/*/pack.yaml; read_kit/rules-library/PACKS.mdfor the schema. Evaluate eachdetectagainst the target repo; select matching packs and pull theirdepends_on. If bothrubyandrailsmatch, choose ONE per theirnotes(ruby = comprehensive, rails = condensed) — ask the user if unsure. Compose freely across languages (e.g.ruby+react-ts+postgres, orpython+postgres). - If a detected stack has no pack in the library, tell the user: the generic core
works, but stack rules are missing — offer to (a) proceed generic-only, or (b) pause to
add a pack under
_kit/rules-library/perPACKS.md, then re-run. - Resolve each pack's
installs: take always-entries; for conditional entries (rule/when/probe/on_absent) run theprobeagainst the repo and honoron_absent(skip, orask). Note each pack'stemplates(e.g.project-overview.md) for the fill step. Warn about any listed file missing from the library.
Phase 4 — Reconcile rules with reality (key step)
Only for an existing project. For each selected pack, walk its assumptions[]:
- Run the
probe(a cheap Grep/Glob/Read check) to test whether the pack'sexpectsholds in this codebase. - If reality matches → install the rule as-is.
- If reality diverges and
on_divergence: ask(the default) → present the divergence viaAskUserQuestion: state what the rule expects vs what the code actually does, and offer:- Adopt — keep the rule; note that code should move toward it over time.
- Relax — rewrite the rule to match the current code (edit the installed copy).
- Skip — don't install this rule.
(For
adopt/relax/skipdefaults in the pack, apply without asking.)
- Batch related divergences into as few questions as is sensible — don't ask 20 separate questions if 4 grouped ones cover it.
- Record each resolution (assumption id → decision) in
PROJECT.md→ a "Rules notes" subsection, so the choice is traceable and the next/bootstrapreuses it.
Phase 5 — Generate the project layer
Write the project-specific files. As you go, log each newly created path to $BK/created.txt
and back up any pre-existing file into $BK before overwriting it (see Phase 0.5):
.claude/PROJECT.md— finalize all sections; setprofile_status: ACTIVE..claude/rules/— copy the selected packs' resolvedinstallsrule files (reconciled) from_kit/rules-library/<stack>/claude/rules/into.claude/rules/; keep the kit's_generic/. Copy each pack'salso_installskills into.claude/skills/. Fold a pack'sCLAUDE.mdguidance intoPROJECT.mdrather than overwriting the project's CLAUDE.md. Copytemplates(e.g.project-overview.md) and flag them for the user to fill. UpdatePROJECT.md→ Rules to list what's installed.Then narrow each installed rule's
paths:to this project's actual layout — this is the step that turns the rule set into a context budget. The kit shipspaths: "**/*"as a deliberate template default: it means "scope me, I don't know your tree yet", and a rule left that wide loads on every file touch. Walk the installed rules and rewrite each glob against the layout you surveyed:- Match the rule's subject, not its tier. A Python-convention rule takes the source
globs for Python; a frontend rule takes the asset/template/script directories. Read the
rule's own
descriptionto decide what it governs. - Cover every language the rule's subject appears in. The common failure is a glob that
names one language and silently drops the rest — an observed project scoped five
behavioural rules to
src/**/*.py, and they were absent from 13 frontend-only sessions before anyone noticed. If a rule is about how the agent behaves rather than about a language, it belongs on the whole tree or in the always-on set. - Leave
paths:off entirely only for rules that must hold with no file open. Those are the standing context tax — every session pays for them, so each one has to earn it. - A rule whose spine must hold at a moment its
paths:cannot see is mis-scoped. Check the trigger against the moment of application, not the file where the rule is edited. sql.md— re-scope to where this project actually writes SQL: migrations, models, raw.sql, seeds (Django*/migrations/, Railsdb/migrate/, Alembicalembic/versions/) — but where SQL lives in ordinary application modules, replace the template globs with those directories rather than narrowing them, and accept the scope by measuring: it covers most files that carry SQL, and**/models/**is not collecting ML or asset directories.- Record the narrowing in
PROJECT.md→ Rules, so/update-kitcan tell a deliberate project scope from a stale template default.
- Match the rule's subject, not its tier. A Python-convention rule takes the source
globs for Python; a frontend rule takes the asset/template/script directories. Read the
rule's own
.claude/settings.json— copysettings.template.jsonverbatim (it is already a clean, valid settings file with$schemaand no comment keys), then append the project-specific permission entries derived from the profile:- allow:
Bash(...)patterns for the profile's test/lint/format/build/run/deploy commands. - allow:
WebFetch(domain:...)for each Integrations doc URL. (Web search/fetch for research and implementation stay available — the policy below controls code leaving the machine, not reading the web.) - deny: the code-publish commands per the VCS / code-publish policy. The template already
denies
git add/git commit/git merge/git push(suggest-only default) — keep them, or relax to match the survey (e.g. dropgit commitif the team lets the agent commit locally, but keepgit push). Add any other user-forbidden commands (banned package manager, server start, destructive db tasks, a deploy/publish CLI,scp/rsyncto a remote) — these also drive the guard hook (next). Keep the emitted file strictly valid JSON: no//comment keys, no unknown hook events, and resolve everything (the schema is strictly validated and rejected as a whole on error). Three conventions worth applying while writing the file (details in_kit/KIT.md→ Hook & permission configuration): every hook command path is$CLAUDE_PROJECT_DIR/.claude/hooks/<name>.sh— never a bare relative path (it assumes the hook's cwd is the project root, which a worktree breaks) and never an absolute one (breaks on another machine); duplicate every read-onlyBash(<cmd> *)entry in itscd-prefixed spelling (Bash(cd * && rg *)) — the whole command line is matched, so a session that writescd src && rg foomisses the unprefixed rule and prompts every time; and use the per-entry"if"/"statusMessage"/"async"hook fields where they fit —"if": "Edit(<the profile's source glob>)"is the usual way to scopeformat-file.shto real source files, and"async": truebelongs on notifications but never on a guard (an async hook cannot block). Then offer the opt-in hooks, which the template deliberately leaves unwired. Ask them in one question, state the trade-off in one line each, and merge only what the user accepts.Stopis an array: merging two examples that both use it means appending, never replacing. - post-turn verify gate — merge the
Stopblock fromsettings.stop-gate.example.jsonintohooks(non-blocking lint/test after each turn; seehooks/verify-stop.sh). - desktop notifications (macOS only) — merge
settings.notifications.example.json(Notification/Elicitation/Stop,osascript, allasync). Offer it only on macOS; on other platforms say the equivalent is a one-linenotify-send/toast command in the same shape, and leave it to the user. - prompt→skill hint — merge the
UserPromptSubmitblock fromsettings.skill-hint.example.jsonintohooks(seehooks/skill-hint.sh). Advisory only: it names the top 1–2 matching skills as context and never blocks or edits the prompt. Worth offering because most kit skills are manual-by-default, so a task request with a perfect skill match otherwise runs bare. Say the two limits out loud: matching is English-token based (a non-English prompt scores 0 and it stays silent), and it costs ~29 ms on every prompt.SKILL_HINT_DISABLE=1disables it later without unwiring.
- allow:
.claude/hooks/guard-bash.sh— append project-specificcasearms in the__BOOTSTRAP_PROJECT_BLOCKS__region from the deny decisions. The__VCS_PUBLISH_BLOCKS__region is default-on (blocksgit add/commit/merge/push) — leave it as the safe default unless the VCS-policy survey said to relax a specific command, in which case remove only that onecasearm. Leaveformat-file.sh,sessionstart.sh,guard-secrets.sh,verify-stop.sh, andskill-hint.shas-is — the first three self-detect or are warn-only, and the last two are inert unless the user wired them in step 3 (the file being present is not the same as the hook being on). Optionally tightenformat-file.shto the profile's exactformatcommand. Two regions in the generic hooks are worth filling when the project has the matching facts:sessionstart.sh→__BOOTSTRAP_EPIC_STATUS__. If the project has a tool that prints active-epic progress or status drift (PROJECT.md→ Plans / backlog and Commands — a plan CLI, a board script, amaketarget), uncomment the region and fill__EPIC_STATUS_PROBE__(the path whose absence keeps it silent) and__EPIC_STATUS_CMD__(the one-line command, with a fallback runner if the primary may be missing). No such tool → leave it commented and say nothing. Verify withbash -nand one manual run: it must stay report-only, print at most a few lines, and be silent on failure.guard-bash.sh→__BOOTSTRAP_PROJECT_BLOCKS__data-protection templates. See the block library commented in that region, and step 4 below.
.claude/commands/— installcommit.mdalways; installpr.md(GitHub) ormr.md(GitLab) per detected git host. Copy from_kit/templates/commands/. 5a.tools/— two project-side scripts, installed only when they have work to do; each is stdlib-Python and report-only.lint-refs.py(dead paths cited byCLAUDE.mdand.claude/) installs whenever the project keeps committed instructions — that is always, after this run — and gets its command row (refs:lint) inPROJECT.md→ Commands plus a step in/preflight.lint-board.pyinstalls only if the backlog is wave-structured (an<epic>/RUN-ORDER.mdexists, or the user says boards are coming); then record it as theepic:statuscommand, and it becomes the__EPIC_STATUS_CMD__of step 4. Its per-edit half,hooks/lint-board.sh, is copied with it and registered underPostToolUse/Write|Edit— widen its path filter to the project's own backlog and plans locations. No boards → install neither, and say so..claude/agents/— keep the generic agents; remove any that don't fit (e.g. droparch-traceronly if the project is genuinely single-layer, or a kit agent the project already covers with its own). Default: keep all. Every kit path you remove goes into the manifest'sexcluded(Phase 6) — otherwise/update-kitre-adds it on the next run.
Phase 6 — Wire up
- Merge
CLAUDE.snippet.mdinto the project'sCLAUDE.md(create it if absent). The snippet is delimited byfeature-flow-kit:begin/end— replace that block on re-run, never duplicate it. .gitignore— enforce the artifact git policy. For every location the user marked local inPROJECT.md→ "Artifact git policy", ensure it's excluded so it can't be pushed. Show the exact lines and confirm before writing. Append them to the project's.gitignore(create it if absent) inside a delimited block:# feature-flow-kit:begin — local agent artifacts (never pushed) <local plans/backlog location>/ <local issues directory>/ # feature-flow-kit:endIdempotent — replace this block on re-run, never duplicate; if all categories are committed, write no block (and remove an existing one). Back up
.gitignorefirst (done in Phase 0.5) and, if you created it, log it to$BK/created.txt. Leave committed locations (e.g.CONTEXT.md,docs/adr/when chosen committed) tracked — never gitignore them.- Sanity-check that the installed skills can resolve everything they reference in
PROJECT.md(Commands, Plans/backlog location, Architecture). Fix gaps in PROJECT.md. If.claude/skills/already holds skills the kit does not ship, draftPROJECT.md→## Project skillsfrom their descriptions so/which-skillcan route to them. Write the kit manifest
.claude/.kit-manifest.json— the install baseline/update-kitneeds to 3-way merge a future kit version without clobbering local edits. Hash every persistent, pristine-by-default kit file (skills/**kit skills,agents/**,hooks/**exceptguard-bash.sh,rules/_generic/**,output-styles/**,schemas/**,docs/**kit docs) as the kit shipped it — not after Phase 5 narrowed a rule'spaths:or filled a hook. Take the hash from the kit source (or before the edit); a hash of the adapted copy makes/update-kitread the file as untouched and overwrite the adaptation. Record the kit paths removed in Phase 5.6 underexcluded. It's local state (fine in a gitignored.claude/); log it to$BK/created.txt.hashof() { shasum -a 256 "$1" 2>/dev/null | cut -d' ' -f1 || sha256sum "$1" | cut -d' ' -f1; }Shape:
{ "kit_version": "<KIT.md version or date>", "installed_at": "<ISO>", "files": { "<relpath under .claude/>": "<sha256 as shipped>", … }, "excluded": [ … ] }.
Phase 7 — Report & verify
Output:
- Installed: profile, rules (generic + packs), settings, hooks, commands, agents.
- Reconciliation summary: table of assumption → decision (adopt/relax/skip).
- Open questions / TODOs left in PROJECT.md.
- Smoke-test checklist for the user:
/analyststarts and asks domain questions sourced from the profile.- the profile's
testcommand runs. /prepareassembles its rules checklist from the installed rules./which-skill "where do I start"routes to a sensible pipeline step./domain-modelcan record a first term intoCONTEXT.md(creates it lazily).- the hooks actually registered —
/hooksshows a non-zero count for each event you wrote and a source label pointing at your settings file./hooksis TUI-only; when it is unavailable, provoke a hook into producing output and look for anattachmentrecord (hook_success, carryinghookEvent/hookName/command) in the session transcript. Full procedure and its two measured blind spots:_kit/KIT.md§ Hook & permission configuration. A hook file on disk is not a registered hook — silent kit hooks look identical either way, so this is the one item that cannot be checked by reading the tree.
- Updating later: to pull a newer kit version into this project without losing your
adaptations, drop the new version into
.claude/.kit-incoming/and run/update-kit— it 3-way merges against the manifest and re-adapts in one pass. Don't re-copy the kit by hand.
Phase 8 — Confirm: keep or roll back (ask)
After the Phase 7 report, ask via AskUserQuestion: Keep the adaptation, or Roll back.
- Keep → proceed to Phase 9.
- Roll back → undo this run from the Phase-0.5 snapshot
$BK:- Delete every path listed in
$BK/created.txt(files, then any now-empty dirs this run created). - Restore every backed-up file from
$BKto its original location (overwriting the modified copy) — this includes.gitignore, so thefeature-flow-kitblock this run added is reverted with it. - For any file that had no prior version in
$BK, strip thefeature-flow-kit:begin…endblock this run added — inCLAUDE.mdand in.gitignore(delete a file the kit created if it's now empty). - Leave
_kit/in place so the user can fix inputs and re-run. Report exactly what was undone.
- Delete every path listed in
Phase 9 — Clean up build-time files (ask first)
Only after the user keeps the result. Ask to confirm, then remove build-time-only material:
rm -rf .claude/_kit and delete .claude/*.template.* and .claude/CLAUDE.snippet.md.
Offer to also remove the .claude/.bootstrap-backup/ snapshots and any pre-copy backup once
the user is satisfied. Leave a clean project .claude/. (The rule packs lived under _kit/;
once it's removed, the selected rules already live in .claude/rules/.) /teardown runs this
same cleanup — and a full uninstall — on demand later.
Hard rules
- Detect, don't assume. Every project fact written to PROJECT.md must come from evidence or from the user — never from a default framework guess.
- Ask on divergence. When installed rules contradict the real code, the user decides (adopt/relax/skip). Never silently install a rule the codebase violates.
- First install is the front door; updates route to
/update-kit. On a fresh target,/bootstrapdoes the full install. On an already-adapted project (ACTIVE) it hands off to/update-kitrather than re-copying. The reconcile phases (3–6) stay idempotent — invoked by the install flow or by/update-kit, they update profile/rules in place and never duplicate the CLAUDE.md block, rules, or settings entries. - Don't touch app code. Bootstrap only writes under
.claude/(and the CLAUDE.md snippet). It plans refactors via rules; it does not refactor the project itself. - Reversible. Back up before writing (Phase 0.5) and confirm keep-or-rollback (Phase 8) before any cleanup. A rolled-back run leaves no trace; never delete a backup the user hasn't approved removing.
- Leave a manifest. Always write
.claude/.kit-manifest.json(Phase 6) — it's the baseline/update-kituses to tell adapted kit files from pristine ones on a future version bump.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

