One idea, carried the whole way. Every command is shown exactly as you type it, with what gets written and the decision you are asked to make.
Do these first. Every one of them has bitten someone, so each is written out with the failure it prevents.
claude --version
You need 2.x or newer. Whatever goes wrong, one of the three recipes below fixes it. Run them as written.
zsh: command not found: claudeFind out first whether it is missing or merely unreachable:
ls -l ~/.local/bin/claude /usr/local/bin/claude /opt/homebrew/bin/claude 2>/dev/null
If a path is listed, it is installed and your shell simply cannot see it.
An already-open terminal keeps the PATH it started with, so a profile edit does
not reach it. Put it somewhere every shell looks — /usr/local/bin is on the
default system PATH and needs no sudo:
ln -sf ~/.local/bin/claude /usr/local/bin/claude
hash -r
claude --version
If nothing is listed, install it:
curl -fsSL https://claude.ai/install.sh | bash
hash -r
claude --version
claude plugin prints generic helpAn old build has no plugin command. Remove it before installing the new one,
or the old binary keeps winning the PATH race and you end up with two installs:
which -a claude # every copy on your PATH
npm uninstall -g @anthropic-ai/claude-code # if it came from npm
rm -f /usr/local/bin/claude /opt/homebrew/bin/claude # stale symlinks
curl -fsSL https://claude.ai/install.sh | bash
hash -r
claude --version # expect 2.x
claude plugin list # expect plugin output, not the general help page
An old copy outside your current npm prefix is the usual culprit: a plain
npm i -g installs to the prefix, which may lose the PATH race against
it.
Invalid API key · Please run /loginA build predating subscription login, so it demands an API key it should not need. Do not supply an API key — Claude Code authenticates with your subscription. Apply recipe B, then if it still asks, sign in once:
claude
/login
It downloads to ~/.claude/downloads and can fail silently. If
claude --version still fails afterwards and you have the VS Code extension
installed, point a wrapper at the binary it already ships:
mkdir -p ~/.local/bin
cat > ~/.local/bin/claude <<'SH'
#!/bin/sh
b=$(ls -d "$HOME"/.vscode/extensions/anthropic.claude-code-*/resources/native-binary/claude 2>/dev/null | tail -1)
if [ ! -x "$b" ]; then echo "claude: no binary found" >&2; exit 127; fi
exec "$b" "$@"
SH
chmod +x ~/.local/bin/claude
ln -sf ~/.local/bin/claude /usr/local/bin/claude
claude --version
The glob picks the newest extension, so this survives extension upgrades. Replace it with a real install whenever the installer cooperates.
python3 --version # or: python --version, py -3 --version
The gate and state logic is pure standard library, but it has to run. Windows usually has
py -3 rather than python3; the launcher detects this, so it only
matters if you call the scripts directly.
claude plugin marketplace add miricoder/project-kit
claude plugin install project-kit
Then /reload-plugins, or start a new session. Confirm it loaded:
claude plugin details project-kit
If a later update seems not to arrive, refresh the marketplace as well as the plugin
— claude plugin marketplace update project-kit then
claude plugin update project-kit.
If you cloned the repository rather than installing from the marketplace, one command reports every item above and changes nothing unless you ask:
./setup.sh # macOS and Linux
.\setup.ps1 # Windows PowerShell
./setup.sh --fix # apply the safe fixes
On Windows, if PowerShell refuses to run the file:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy RemoteSigned
Project Kit writes pipeline.json and a docs/ folder into the
directory you run it from. You do not have to create one by hand — if you are
somewhere unsuitable, /ideate makes a subdirectory and tells you.
cd ~/projects # or anywhere; an empty folder or a git repo is ideal
claude
It refuses to run inside the Project Kit plugin itself, which would write your project's files into the tool.
/ideate an app that tracks my houseplants and tells me when to water them
What happens: it sets up state, researches prior art, works out who the
user is and what job they are doing, then writes docs/research.md.
You will be asked up to five questions it cannot reasonably infer —
platforms, whether it must work offline, what data is stored. Answer briefly; anything you
leave it marks ASSUMED, and the judges test assumptions later.
Then it stops. This is checkpoint 1: confirm it understood the idea before more effort is spent on it.
A bare /ideate with no idea asks what you want to build and
writes nothing.
/proposal
What happens: it cuts v1 to the smallest thing that does the job end to
end, lists what it explicitly will not do, phases the rest with acceptance criteria,
and estimates build effort and running cost → docs/proposal.md.
Then it stops. Checkpoint 2, and the important one: this is the scope and money decision. Cut further or add back before continuing — everything downstream is bound by this.
/design
What happens: architecture, data model with migrations, interfaces,
failure modes, rollback for code and data, plus executable Gherkin →
docs/spec.md and docs/acceptance.feature. It also drafts the
strongest case that its own design is wrong, which the judges are given to test.
No stop here — it flows straight on, because the next phase has its own checkpoint before spending anything.
/handover
What happens: builds the case and brief, sends them to three different
model families, validates each verdict, and combines them mechanically into a ruling.
/verdict then ranks the fixes and either opens the gate or sends you back.
It stops before sending. Checkpoint 3 — this spends real API credit, and there is no flag to skip it.
State is written after every phase, so a project survives closing the terminal, running out of context, or coming back in a week.
cd ~/projects/houseplant-tracker
claude
/pipeline
It reports the phase, what runs next, and anything blocking. There is never a need to start an idea over because a session ended.
| Mode | Behaviour | Stops |
|---|---|---|
manual | Stops after every phase and offers a menu | every phase |
auto (default) | Advances between phases, stopping at the four checkpoints | 4 checkpoints |
yolo | End to end with no pipeline stops, subject to the budget cap | none |
/pipeline mode manual # stop after every phase and offer a menu
/pipeline mode yolo # no stops (the budget cap still applies)
yolo removes Project Kit's checkpoints, not Claude Code's permission prompts.
/pipeline mode yolo tells you whether your settings are allowlisted, so it never
looks unattended while waiting on a prompt.
| File | Written by | What it is |
|---|---|---|
pipeline.json | /ideate on first run | Phase status, gates, mode, budget. The contract every skill reads |
docs/research.md | /ideate | Prior art, the job, open questions. Claims marked VERIFIED or ASSUMED |
docs/proposal.md | /proposal | v1 cut, out-of-scope, phases with acceptance criteria, cost |
docs/spec.md | /design | Architecture, data model, failure modes, rollback, counter-argument |
docs/acceptance.feature | /design | Gherkin scenarios. What /test will verify against |
If you fork or edit the plugin, one command runs exactly what CI runs — same three steps, same order — so you find out before pushing:
pk check # unit tests, docs freshness, manifest validation
pk check --fix # regenerate stale docs rather than just reporting them
It exits 0 when everything required passes and 1 otherwise, so it
works as a git hook. A missing Claude Code CLI downgrades the manifest step to a warning
rather than failing the run.