Bootstrap workflow
π§° Opinionated Claude Code starter kit β bootstrap, git, handoff, pre-commit
npx -y skills add dominikwozniak/claude-kit --skill bootstrap-workflowAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Use when applying the claude-kit setup to a new project β drops CLAUDE.local.md, .claude/settings.local.json, hook scripts, and updates .gitignore. Γ la carte picker via AskUserQuestion: choose artifacts, pick hooks, optionally brew-install missing deps. All artifacts are local/gitignored. Trigger phrases: "bootstrap this project", "set up workflow", "apply claude-kit".
SKILL.md
8.1 KB, ~2.1k tokens by cl100k_base, as published. Nobody here has run it
Workflow Bootstrap
Apply the claude-kit personal setup to the current project. Everything dropped is gitignored β safe to run repeatedly. Selection is the gate: only what you pick gets written.
What can be installed
CLAUDE.local.md(root, gitignored) β workflow + git conventions + tool list.claude/settings.local.json(gitignored) β permissions ask-list + hook wiring.claude/hooks/block-dangerous-git.shβ PreToolUse guard, blocks force-push / hard-reset / etc..claude/hooks/block-non-pnpm.shβ PreToolUse guard, blocks npm / yarn / bun.claude/hooks/lint-on-edit.shβ PostToolUse, lints edited TS/JS files.claude/hooks/lint-on-edit-rb.shβ PostToolUse, lints edited.rbfiles viabundle exec standardrb/rubocop(~1-2s per edit).claude/hooks/typecheck-on-stop.shβ Stop hook, typechecks on TS file changes.gitignoreβ appends idempotent block fencing the above
Workflow
Follow this procedure in order. Each step has a single purpose.
1. Detect repo characteristics
Read just enough of the target project to pre-check the picker boxes intelligently and pick stack-aware defaults:
test -f package.json && echo "has-pkg"
test -f tsconfig.json && echo "has-tsconfig"
test -f Gemfile && echo "has-gemfile"
jq -r '.scripts.lint // empty' package.json 2>/dev/null
grep -q 'gem .standard.' Gemfile 2>/dev/null && echo "has-standardrb"
grep -q 'gem .rubocop' Gemfile 2>/dev/null && echo "has-rubocop"
grep -q 'gem .rspec' Gemfile 2>/dev/null && echo "has-rspec"
(The exact Gemfile detection regex lives in bootstrap.sh; the snippet above is illustrative β agents can read the script for the precise quoting.)
Use the results to decide pre-check defaults for step 3:
block-dangerous-git.shβ always pre-check (stack-neutral)block-non-pnpm.shβ pre-check only ifpackage.jsonexists. Hide entirely on Ruby-only repos.lint-on-edit.shβ pre-check only ifpackage.jsonhas alintscript. Hide on Ruby-only repos (regex matches JS extensions).lint-on-edit-rb.shβ pre-check only ifGemfilehasgem 'standard'orgem 'rubocop'. Hide on JS-only repos (noGemfile).typecheck-on-stop.shβ pre-check only iftsconfig.jsonexists. Hide on Ruby-only repos.
2. Run doctor.sh for missing deps
"${CLAUDE_PLUGIN_ROOT}/scripts/doctor.sh" --json
Parse with jq. The script returns {missing, optional_missing, plugin_missing, marketplace_missing}. Use optional_missing to populate the brew-install question (step 3, question 3). Skip that question if the array is empty or brew is not on PATH.
3. Ask the user β picker via AskUserQuestion
Three questions (skip question 2 if answer to Q1 doesn't include settings; skip question 3 if nothing brew-installable to offer):
Question 1 β Artifacts to drop (multi-select):
CLAUDE.local.md(recommended).claude/settings.local.json(recommended β hooks below need it).gitignore additions(recommended)
Question 2 β Hooks to install (multi-select, only if settings selected above):
block-dangerous-gitβ universal git guardrail (always offered)block-non-pnpmβ JS/TS only (skip on Ruby-only repos)lint-on-editβ only useful with a JS/TS lint script (skip on Ruby-only repos)lint-on-edit-rbβ Ruby only (skip on JS-only repos); adds ~1-2s per.rbedit (bundle exec startup)typecheck-on-stopβ TypeScript only (skip on Ruby-only repos)
Use the detection results from step 1 as the default-checked set. Filter out JS-only hooks when package.json is absent β on a pure Rails repo with standardrb/rubocop in the Gemfile, the offer is block-dangerous-git + lint-on-edit-rb (still β₯ 2 options, multi-select works).
If filtering leaves fewer than 2 options, do not call AskUserQuestion with a multi-select β that violates the tool's minItems: 2 validation. Instead, ask a single Yes/No question naming the lone remaining hook (e.g. "Install block-dangerous-git hook?") with options Yes (recommended) / No. Map Yes β include that hook in --hooks=; No β pass --hooks= empty. Q1 (artifacts) always has 3 fixed options, so this fallback only ever applies to Q2 and Q3.
Question 3 β Missing deps to brew install (multi-select, only when applicable):
Render the optional_missing array from doctor.sh as options. Pre-check none β let the user opt in.
If optional_missing has exactly one entry, fall back to a Yes/No prompt naming that tool (e.g. "Install rtk via brew?") with Yes / No (skip) β same minItems: 2 reason as Q2. Skip the question entirely when the array is empty or brew is not on PATH.
4. Collect CLAUDE.local.md placeholder values
Only if CLAUDE.local.md was selected. Use a single AskUserQuestion round with the defaults pre-filled from auto-detection. Suggested defaults:
project-nameβbasename "$(pwd)"default-branchβgit symbolic-ref --short refs/remotes/origin/HEAD | sed 's@^origin/@@'orgit config --get init.defaultBranchormainstackβ detect frompackage.json/tsconfig.json/Cargo.toml/pyproject.toml/Gemfiletest-cmd,lint-cmd,typecheck-cmdβ stack-dependent:- Node / TS:
jq -r '.scripts.<name>'ofpackage.json, falling back topnpm <name>. - Ruby:
bundle exec rspec(orbin/rails testif no rspec gem) for test,bundle exec standardrb --fixorbundle exec rubocop -Abased onGemfilefor lint, empty (renders as_(n/a)_) for typecheck. - Other / unknown: leave empty so the user fills them in.
- Node / TS:
domain,key-dirs,deploy,gotchasβ empty (user fills later)
Bootstrap.sh handles all of the above auto-detection β you only need to pass the flags the user explicitly overrides.
5. Invoke bootstrap.sh with flags
Construct a single non-interactive call:
"${CLAUDE_PLUGIN_ROOT}/scripts/bootstrap.sh" "$(pwd)" \
--features=claude-md,settings,gitignore \
--hooks=block-dangerous-git,lint-on-edit \
--brew-install=rtk \
--project-name="fancy" \
--default-branch="main" \
--stack="TypeScript / Node" \
--test-cmd="pnpm test" \
--lint-cmd="pnpm lint" \
--typecheck-cmd="pnpm typecheck" \
--no-prompt
Omit --brew-install= and any placeholder flag the user didn't fill. --no-prompt is mandatory from the skill path β Claude's Bash tool has no TTY, so the script must run unattended.
If ${CLAUDE_PLUGIN_ROOT} is empty (skill invoked outside Claude Code), fall back to the local repo checkout path and ask the user.
6. Confirm with the user
Show the resulting CLAUDE.local.md (if installed). Ask if any conventions need adjusting (commit format, branch naming, etc.).
7. Suggest companion plugins
Tell the user to:
/plugin marketplace add github:dominikwozniak/claude-kit
/plugin install git-workflow
/plugin install session-handoff
β¦and to ensure agent-skills (addyosmani), caveman, claude-mem are enabled in ~/.claude/settings.json.
Notes
- Re-running is safe β the
.gitignoreblock is marker-fenced and idempotent;settings.local.jsonis overwritten wholesale; hook files are overwritten. - De-selecting a hook in a later run does not remove the previously-installed file. Delete it manually if you want it gone.
- The script never touches files that aren't local/gitignored β no teammate impact.
- For team-shared pre-commit hooks (husky + lint-staged), use the
setup-pre-commitskill β separate concern. - Direct invocation outside Claude is still supported:
scripts/bootstrap.sh <dir>without--no-promptfalls back toread </dev/ttyprompts for any unset placeholder. Flags still work, e.g.scripts/bootstrap.sh /tmp/foo --features=claude-md --hooks=.