siltpoke docs

Install a coding agent

Both Siltpoke Review and Project Life Cycle sit on top of a coding agent — the agent does the writing, and they handle everything around it. So the agent goes in first.

Any of the five works — Siltpoke Review and Project Life Cycle both run in all of them. Install the agents you actually use, skip the rest — with one exception: if you want Siltpoke Review to have a different company's model check your code (cross-family review), install that company's agent too and sign in, because Siltpoke calls it to do the review. (Their install commands are collected here so you don't have to chase five different vendor docs.)

Each entry notes what the agent needs — account, runtime, and whether there's a free way in. The cost notes are a snapshot as of July 2026; vendors change these often, so trust the linked pricing pages over this paragraph.

Before you start: git

What it is. git keeps a record of every change you make to your code — each save point is called a commit.

Why you need it. Siltpoke Review and Project Life Cycle live on GitHub, and when your coding agent installs them it downloads them with git. Without git, the install fails on Claude Code, Codex and Qoder (CodeBuddy can fall back to a plain download), and Antigravity and installing from source start with git clone. Git is also how Siltpoke Review sees what you changed — no git, nothing to review.

Check whether you have it — if this prints a version number, you're set:

git --version

If it doesn't:

xcode-select --install     # macOS: installs git with Apple's command line tools
# Linux: install git with your package manager (apt, dnf, …)
winget install --id Git.Git -e

Before you start: npm

What it is. npm is the installer for tools written in JavaScript. It isn't downloaded on its own — it comes with Node.js.

Why you need it. Claude Code and CodeBuddy are installed with npm install -g, and so is Codex on Windows. If you'll only use Antigravity, Qoder, or Codex on macOS or Linux, you can skip this one.

Check whether you have it:

npm --version

If it doesn't print a version number, install Node.js (take the LTS version) and npm comes with it:

# macOS: download the LTS installer from https://nodejs.org/
# Linux: install Node.js with your package manager (apt, dnf, …)
winget install --id OpenJS.NodeJS.LTS -e

After installing either one, open a new terminal window so it can find them.

Claude Code

needs Node ≥ 18 and an Anthropic account on a paid plan — there's no free tier for Claude Code: Pro ($20/mo) or Max, or pay-as-you-go API credits (pricing):

npm install -g @anthropic-ai/claude-code
claude        # opens the TUI; log in with your Anthropic account

Codex

works on every ChatGPT plan, including Free, or an API key. Free gets the smallest allowance, local tasks only, drawing on the same 5-hour window as paid tiers — enough for a few small edits to feel it out, not enough to finish a real feature (run /status inside Codex to see your live quota). Plus ($20/mo) is the real-use tier — roughly 15–80 messages per 5-hour window on the top model. The installer is a standalone binary; the npm route needs Node ≥ 22 (pricing):

curl -fsSL https://chatgpt.com/codex/install.sh | sh
codex         # opens the TUI; sign in with your ChatGPT account or an API key
npm install -g @openai/codex
codex         # opens the TUI; sign in with your ChatGPT account or an API key

Antigravity

standalone installer; any Google account. Free in public preview, but metered by how much work the agent does (not by request count) and the free tier refreshes weekly — a few light tasks a day is realistic; one complex build can hit the ceiling in a single session, and the limits have been tightened repeatedly, so don't plan around them. Paid Google AI plans lift them (pricing):

curl -fsSL https://antigravity.google/cli/install.sh | bash
agy           # opens the TUI; authenticates via your Google account in the browser
irm https://antigravity.google/cli/install.ps1 | iex
agy           # opens the TUI; authenticates via your Google account in the browser

CodeBuddy

needs Node ≥ 18 and a CodeBuddy (Tencent) account. Free limited-time trial tier for individuals plus a small daily free-credit allowance — on the order of ~50 credits a day (IDE side): enough to poke around and run a few small tasks, not to build with, and the free tier was cut back in the May 2026 repricing. Pro is the paid step up (pricing):

npm install -g @tencent-ai/codebuddy-code
codebuddy     # opens the TUI

Qoder

standalone installer, no Node needed; sign in with a Qoder account. Free plan keeps you on the basic model under daily and monthly caps — fine for light everyday use, not for the strongest models. Your first sign-in grants a 14-day Pro trial with 300 credits — that trial, not the free plan, is what you evaluate the real models with; Pro at $20/mo (pricing):

curl -fsSL https://qoder.com/install | bash
qodercli      # opens the TUI; type /login to sign in via browser
irm https://qoder.com/install.ps1 | iex
qodercli      # opens the TUI; type /login to sign in via browser

What to install next

Both are one command away, and neither needs the other:

  • Project Life Cycle — the process layer, from a fuzzy idea to a merged PR.
  • Siltpoke Review — the companion that reviews what the agent writes, remembers the project, and maps the code.

Or skip the commands: an agent prompt pasted into your agent installs either one, or both, for you.

Install with an agent prompt

Once you have a coding agent, this is the quickest way to add Project Life Cycle and Siltpoke Review. Pick your agent below, copy its prompt, and paste it into the agent as an ordinary message. (No agent yet? Install one first — the commands are above.) The agent then does the install for you:

  • it checks what you already have (git, Bun, either plugin);
  • it asks which you want — both, only Siltpoke Review, or only Project Life Cycle;
  • it asks before it downloads and runs a script, installs an app, or changes your shell profile;
  • it creates your Siltpoke pet, then walks you through your first day.

The prompts are in English, but the agent answers in whatever language you write in. Want the other plugin later? Paste the same prompt again — it only adds what is missing.

Rather type each command yourself? That still works, step by step: Project Life Cycle → Install · Siltpoke Review → Install & setup.

On native Windows the prompt stops first and tells you why: Siltpoke installs there, but its review never runs. Use WSL, or install Project Life Cycle only.

Claude Code

Paste into Claude Code. The one step it can't do for you comes at the end: quit Claude Code and start it again, so the new commands load.

You are installing Claude Code plugins for me, setting them up, and then teaching me to use them. Talk to me in the language I am writing in. Keep each message short. **Ask me before anything that downloads and runs a script, installs an app, or changes my shell profile.**

There are two plugins. They are independent — I can have one, the other, or both:
- **Siltpoke** — a second reviewer that watches my coding sessions. After each turn, a *separate* AI process reads what changed and writes down what it thinks was missed. It remembers bugs across sessions, and it has a dashboard and a small pet. Repo: https://github.com/Siltpoke/siltpoke
- **Project Life Cycle (PLC)** — a working method for AI coding: spec → plan → build → verify → ship → release, with commands to set up a project, ship a feature, save/resume a session, and cut a release. Repo: https://github.com/Siltpoke/project-life-cycle

## Before anything — am I on Windows?

Run `uname -s`. If it fails, or prints anything that is not `Darwin` or `Linux`
(on Windows it will not exist, or a Git-Bash shell prints `MINGW64_NT-...`),
**stop here and tell me this, in my language, before installing anything:**

> Siltpoke does not support native Windows yet. It will install, the pet will
> appear, the commands will work and the config will say the setup is fine —
> but the review hook is registered as `sh ./hooks/stop.sh`, Windows has no
> `sh`, so no review will ever run and nothing will say so. If you have WSL,
> run this again inside WSL and everything works, because that is Linux.
> Otherwise, wait for native Windows support.

Then ask whether I want to continue anyway. **Do not install unless I say yes**,
and if I do, say once more that reviews will not fire. Project Life Cycle has no
such problem — it is prompts and commands, no hook — so offer to install only
PLC instead.

## Step 0 — What do I already have, and what do I want?

Run `claude plugin list` first. Then:
- If one of them is already installed, say so in one line ("you already have PLC — this time I'll only add Siltpoke") and skip its install. Offer `claude plugin update <name>` instead.
- For anything not installed yet, ask me once: **both / only Siltpoke / only PLC**. Recommend "both" in one sentence, but do what I pick. Every later step applies only to what I picked.

## Step 1 — Check the tools

Run these and tell me in one line each what you found:
- `claude --version` (must work — you are running inside it)
- `git --version`
- `uname -s` (tells you if I'm on a Mac — only matters for the menu-bar pet in Step 4)
- Siltpoke only: `bun --version`. Siltpoke's reviewer runs on Bun. If it is missing, **ask me first**, then run `curl -fsSL https://bun.sh/install | bash` and check again with `~/.bun/bin/bun --version` (my shell will not see the new PATH until it restarts — that is fine, setup records the full path).

## Step 2 — Install

Run with the Bash tool, one line at a time. If any line fails, stop and show me the exact error.

```bash
# PLC
claude plugin marketplace add Siltpoke/project-life-cycle
claude plugin install project-lifecycle@project-life-cycle

# Siltpoke
claude plugin marketplace add Siltpoke/siltpoke
claude plugin install siltpoke@siltpoke
```

Then run `claude plugin list` and confirm each one I picked shows as installed and enabled. Do not claim success from the install output alone.

## Step 3 — Set up Siltpoke (skip if I did not pick it)

The `/siltpoke-setup` command is not available until Claude Code restarts, but its instructions are already on disk:

1. Find the plugin folder: `ls -d ~/.claude/plugins/cache/siltpoke/siltpoke/*/ | sort -V | tail -1`. Call it `PLUGIN_ROOT`.
2. Read `PLUGIN_ROOT/.claude-plugin/commands/siltpoke-setup.md` (if it is not there: `find PLUGIN_ROOT -name siltpoke-setup.md`).
3. Follow that file exactly, as if I had typed `/siltpoke-setup`. Wherever it says `${CLAUDE_PLUGIN_ROOT}`, use the real `PLUGIN_ROOT`. If `bun` is not on PATH yet, use `~/.bun/bin/bun`.
4. It first asks me **Express** (one step, a default pet) or **Custom** (choose species, name, language, personality). Let me choose.
5. When it finishes, tell me the result in plain words. If it fails, translate the one-line error and stop.
6. If `~/.siltpoke/config.json` already existed before you started, setup was done before: say so, ask if I want to redo it, and skip to Step 4 if not.

## Step 4 — The menu-bar pet (Siltpoke + Mac only)

If setup already offered the menu-bar pet and I answered, skip this step. Otherwise, explain it in two sentences and ask if I want it:

- **The terminal pet (statusline)** sits in the bottom line of Claude Code. It shows **this session only**: it changes after every turn, and its speech bubble carries the latest review. You see it only while you are in that Claude Code window.
- **The menu-bar pet** sits in the Mac's top menu bar and shows **all your sessions at once** — every project, and every coding tool Siltpoke watches. You see it all the time, even with every terminal closed. The number next to it is how many sessions have a recent review (not a count of problems). Click it for a list: one line per session (project · branch · time · which coding tool wrote the code) with its latest review, plus "Open dashboard" and "Restart daemon". It refreshes once a minute, not after every turn.

If I say yes:
1. It needs the free app SwiftBar. Check with `ls /Applications/SwiftBar.app`. If it is missing, ask me: install with `brew install --cask swiftbar` (only if `brew --version` works), or let me download it myself from https://github.com/swiftbar/SwiftBar. Then open it once: `open -a SwiftBar` (the first time, it asks me to pick a plugin folder — accept the default).
2. Run `bun "PLUGIN_ROOT/dist/siltpoke-cli.js" menubar install`, then `… menubar status`, and tell me in one sentence what it said.

## Step 5 — PLC needs no global setup (skip if I did not pick it)

Tell me: PLC is set up **per project**, not once for the whole machine. Inside a project folder, `/init-harness` looks at the code, writes a `CLAUDE.md` and a few config files, and asks before overwriting anything. Do **not** run it now. If my current folder is a git repo, say: "after the restart, you can run `/init-harness` here."

## Step 6 — The one thing I must do myself

Tell me clearly: **quit Claude Code and start it again now.** Slash commands, the Siltpoke review hook, and the terminal pet only load on restart. Then tell me what to type first after the restart (Step 7, item 1).

## Step 7 — Getting started: my first day

Before the restart, print this walkthrough in my language, only the parts for what I installed, filled with my real results. Make it a numbered list I can follow step by step. Do not invent commands that are not listed here.

**Siltpoke — first 10 minutes**
1. Type `/siltpoke-doctor`. It prints a ✓/✗ checklist. All ✓ means the install works. If something is ✗, it says what to do.
2. Ask Claude for any small real change (for example: "add a comment explaining this function"). When Claude finishes, Siltpoke reviews the change in the background. You do not need to do anything.
3. Watch the terminal pet: its face and speech bubble change when the review is done. (On a Mac with the menu-bar pet, the menu bar shows it too, within a minute.)
4. Type `/siltpoke-last` to read the full review in the chat.
5. Type `/siltpoke-dashboard`. It opens http://127.0.0.1:9876 — review history, chat with your pet about your code, what it remembers, and the Code Map. On a review, press **ACK** (seen, useful) or **DISMISS** (wrong). This is how it learns what to stop saying.
6. Need quiet (a demo, pairing)? `/siltpoke-mute 1h`, and `/siltpoke-unmute` to undo. Reviews stopped showing up? `/siltpoke-wake`.

**PLC — your first project**
1. `cd` into a project and type `/init-harness`. Answer its questions. It writes `CLAUDE.md` and asks before overwriting anything.
2. Talk about the code first, no edits: "explain how this project is structured."
3. Build one small feature with `/ship <what you want>`. It stops 3 times to check with you: the user story, the spec, and the pull request.
4. Stopping for the day? `/handoff` saves where you are to `RESUME.md`.
5. Next time, start with `/catchup` — a "welcome back" card of where you left off.
6. The `project-lifecycle` skill also turns on by itself when you start a project or plan multi-step work. You do not have to type the commands — they are shortcuts.

**Both together — a normal day**
1. Open a project → `/catchup`
2. Build with `/ship`, or just work normally
3. Siltpoke reviews each turn in the background → `/siltpoke-last` when the pet looks worried
4. Leaving → `/handoff`

## Step 8 — Keep using it

Print this right after the first-day walkthrough, in my language, only the parts for what I installed. It is how I use the plugins every day after the first one.

**Siltpoke, every day**
1. Just work. Siltpoke reviews each turn by itself — you never have to start it.
2. When the pet looks worried (or the menu-bar number goes up), read the review: `/siltpoke-last`.
3. Teach it. In the dashboard (`/siltpoke-dashboard`), press **DISMISS** on a review that is wrong and **ACK** on one that helped. It remembers, and over time stops repeating what you dismissed.
4. Once a week, look at the dashboard's Memory page — that is what it has learned about your code.
5. Reviews went quiet? `/siltpoke-doctor` first; if everything is ✓, `/siltpoke-wake`.
6. Busy (a demo, pairing)? `/siltpoke-mute 1h` — it turns itself back on when the time is up.

**PLC, every session**
1. Start: `/catchup` — where you left off, what shipped, what is next.
2. New feature: `/ship <what you want>`.
3. A design question you are not sure about: `/research <question>` — it comes back with cited sources.
4. Before merging a branch: `/review`.
5. End: `/handoff`. The next session starts again at item 1.
6. Ready to publish a version: `/release`.

**Keep it current:** `claude plugin update siltpoke` · `claude plugin update project-lifecycle`, then restart Claude Code.

## Step 9 — The manual

End with this, in my language, only the rows for what I installed:

| | Status |
|---|---|
| Project Life Cycle | installed — version from `claude plugin list` |
| Siltpoke | installed — version, pet name + species |
| Bun | version (and its path) |
| Menu-bar pet | installed / not installed / not a Mac |
| **Still to do** | restart Claude Code → `/siltpoke-doctor` (Siltpoke) · `/init-harness` in a project (PLC) |

Siltpoke commands: `/siltpoke-last` · `/siltpoke-dashboard` · `/siltpoke-doctor` · `/siltpoke-mute <duration>` / `/siltpoke-unmute` · `/siltpoke-wake` · `/siltpoke-brain` (which model reviews — can be another company's CLI or a local model) · `/siltpoke-menubar` · `/siltpoke-help` (the full manual).

Cost: the review uses your existing Claude Code login — no extra account. Roughly $0.04–$0.10 a day with prompt caching. Reviews are saved on your machine; nothing is sent anywhere except the normal model call and a once-a-day check with GitHub for the latest version number — that check sends nothing about you or your code, and Siltpoke receives nothing. Turn it off with `"updateCheck": {"enabled": false}` in `~/.siltpoke/config.json`.

PLC commands: `/init-harness` · `/ship` · `/review` · `/research` · `/handoff` · `/catchup` · `/release`. If another plugin uses the same name, use the long form, e.g. `/project-lifecycle:ship`.

Uninstall: `claude plugin uninstall siltpoke` · `claude plugin uninstall project-lifecycle@project-life-cycle`
Want the other plugin later? Paste this same prompt again — it only adds what is missing.

Codex

Paste into Codex. Codex has no custom slash commands, so the prompt teaches you the plain-words version of each one.

You are installing Codex plugins for me, setting them up, and then teaching me to use them. Talk to me in the language I am writing in. Keep each message short. **Ask me before anything that downloads and runs a script, installs an app, clones a repo, or changes my shell profile or config files.**

There are two plugins. They are independent — I can have one, the other, or both:
- **Siltpoke** — a second reviewer that watches my coding sessions. After each turn, a *separate* AI process reads what changed and writes down what it thinks was missed. It remembers bugs across sessions, and it has a dashboard and a small pet. Repo: https://github.com/Siltpoke/siltpoke
- **Project Life Cycle (PLC)** — a working method for AI coding: spec → plan → build → verify → ship → release. Repo: https://github.com/Siltpoke/project-life-cycle

**Important for Codex:** neither plugin has slash commands here. Everything is done by asking you in plain words, and you use their skills. Tell me this once, early.

## Before anything — am I on Windows?

Run `uname -s`. If it fails, or prints anything that is not `Darwin` or `Linux`
(on Windows it will not exist, or a Git-Bash shell prints `MINGW64_NT-...`),
**stop here and tell me this, in my language, before installing anything:**

> Siltpoke does not support native Windows yet. It will install, the pet will
> appear, the commands will work and the config will say the setup is fine —
> but the review hook is registered as `sh ./hooks/stop.sh`, Windows has no
> `sh`, so no review will ever run and nothing will say so. If you have WSL,
> run this again inside WSL and everything works, because that is Linux.
> Otherwise, wait for native Windows support.

Then ask whether I want to continue anyway. **Do not install unless I say yes**,
and if I do, say once more that reviews will not fire. Project Life Cycle has no
such problem — it is prompts and commands, no hook — so offer to install only
PLC instead.

## Step 0 — What do I already have, and what do I want?

Run `codex plugin list` first. Then:
- If one of them is already installed, say so in one line ("you already have PLC — this time I'll only add Siltpoke") and skip its install.
- For anything not installed yet, ask me once: **both / only Siltpoke / only PLC**. Recommend "both" in one sentence, but do what I pick. Every later step applies only to what I picked.

## Step 1 — Check the tools

Run these and tell me in one line each what you found:
- `codex --version`, `git --version`, `uname -s` (a Mac? only matters for the menu-bar pet in Step 4)
- Siltpoke only: `bun --version`. Siltpoke's reviewer runs on Bun. If it is missing, **ask me first**, then run `curl -fsSL https://bun.sh/install | bash` and check again with `~/.bun/bin/bun --version` (my shell will not see the new PATH until it restarts — that is fine, setup records the full path).

## Step 2 — Install

Run one line at a time. If any line fails, stop and show me the exact error.

**Siltpoke:**
```bash
codex plugin marketplace add https://github.com/Siltpoke/siltpoke
codex plugin add siltpoke@siltpoke
```
The `@siltpoke` part is required — a bare `codex plugin add siltpoke` fails.

**PLC** installs from a local copy in Codex, so it needs more steps:
1. Ask me, then clone it: `git clone https://github.com/Siltpoke/project-life-cycle ~/plugins/project-lifecycle`
2. Read the section "Codex setup" in `~/plugins/project-lifecycle/README.md` and follow it exactly: it adds one entry to `~/.agents/plugins/marketplace.json`, then runs `codex plugin add project-lifecycle@<marketplace-name>`. If that file already exists, show me the change before you write it. If you cannot tell the marketplace name, show me the file and ask.

Then run `codex plugin list` and confirm each one I picked shows as installed and enabled. Do not claim success from the install output alone. **If Siltpoke is not in that list, stop here and show me the error** — do not go on to Step 3; setup on a plugin that is not installed looks like it worked, but reviews will never run.

## Step 3 — Set up Siltpoke (skip if I did not pick it)

Reviews do not start until a pet exists at `~/.siltpoke/config.json`. If that file already exists, setup was done before: say so, ask if I want to redo it, and skip to Step 4 if not.

The Siltpoke skill does the setup. A new Codex skill may not be loaded until a new thread, so read it from disk instead:
1. Find the installed plugin folder: `ls -d ~/.codex/plugins/cache/siltpoke/siltpoke/*/ | sort -V | tail -1`. Call it `PLUGIN_ROOT`. Only use this folder — Codex also keeps a download copy under `~/.codex/.tmp/`, which is not the installed plugin.
2. Read `PLUGIN_ROOT/skills/siltpoke/SKILL.md` (if not there: `find PLUGIN_ROOT -name SKILL.md -path '*siltpoke*'`).
3. Follow its sections **"Resolve the plugin root first"** and **"Create your pet (first-time setup)"** exactly. It asks me Express or Custom — let me choose.
4. When it finishes, tell me the result in plain words. If it fails, translate the error and stop.

## Step 4 — The menu-bar pet (Siltpoke + Mac only)

On a Mac, the menu bar is the easiest place to see Siltpoke without opening anything. Explain it in two sentences and ask if I want it:

- **The menu-bar pet** sits in the Mac's top menu bar and shows **all your sessions at once** — every project, and every coding tool Siltpoke watches (Codex, and Claude Code if you use it too). You see it all the time, even with every terminal closed. The number next to it is how many sessions have a recent review (not a count of problems). Click it for a list: one line per session (project · branch · time · which coding tool wrote the code) with its latest review, plus "Open dashboard" and "Restart daemon". It refreshes once a minute.
- (If I also use Claude Code: there, Siltpoke also has a **terminal pet** in the bottom line, which shows only that one session and changes after every turn.)

If I say yes:
1. It needs the free app SwiftBar. Check with `ls /Applications/SwiftBar.app`. If it is missing, ask me: install with `brew install --cask swiftbar` (only if `brew --version` works), or let me download it from https://github.com/swiftbar/SwiftBar. Then open it once: `open -a SwiftBar` (the first time, it asks me to pick a plugin folder — accept the default).
2. Run `"$BUN" "$PLUGIN_ROOT/dist/siltpoke-cli.js" menubar install`, then `… menubar status`, and tell me in one sentence what it said.

## Step 5 — PLC needs no global setup (skip if I did not pick it)

Tell me: PLC is set up **per project**, not once for the whole machine. There is no `/init-harness` command in Codex — instead, inside a project I say "set up this project with project-lifecycle", and the skill looks at the code, writes a few project files, and asks before overwriting anything. Do **not** do it now.

## Step 6 — The one thing I must do myself

Tell me clearly: **quit Codex and start it again (or at least start a new thread) now.** New skills and the review hook only load then.

## Step 7 — Getting started: my first day

Before I restart, print this walkthrough in my language, only the parts for what I installed, filled with my real results. Make it a numbered list I can follow step by step. In Codex everything is said in plain words — give me the exact sentence to say. Do not invent features that are not listed here.

**Siltpoke — first 10 minutes**
1. Say: "check my Siltpoke install". You get a ✓/✗ checklist. All ✓ means it works. If something is ✗, it says what to do.
2. Ask Codex for any small real change (for example: "add a comment explaining this function"). When Codex finishes, Siltpoke reviews the change in the background. You do not need to do anything.
3. On a Mac with the menu-bar pet, the menu bar shows the new review within a minute.
4. Say: "show me the latest Siltpoke review".
5. Say: "open the Siltpoke dashboard". It opens http://127.0.0.1:9876 — review history, chat with your pet about your code, what it remembers, and the Code Map. On a review, press **ACK** (seen, useful) or **DISMISS** (wrong). This is how it learns what to stop saying.
6. Need quiet? Say "mute Siltpoke for 1 hour", and "unmute Siltpoke" to undo.

**PLC — your first project**
1. Inside a project, say: "set up this project with project-lifecycle". Answer its questions.
2. Talk about the code first, no edits: "explain how this project is structured."
3. Build one small feature: "use project-lifecycle to ship <what you want>". It stops to check with you at the user story, the spec, and the pull request.
4. Stopping for the day? Say "hand off — save where we are to RESUME.md".
5. Next time, say "catch me up from RESUME.md".

**Both together — a normal day**
1. Open a project → "catch me up"
2. Build with project-lifecycle, or just work normally
3. Siltpoke reviews each turn in the background → "show me the latest Siltpoke review"
4. Leaving → "hand off"

## Step 8 — Keep using it

Print this right after the first-day walkthrough, in my language, only the parts for what I installed. It is how I use the plugins every day after the first one.

**Siltpoke, every day**
1. Just work. Siltpoke reviews each turn by itself — you never have to start it.
2. When the pet looks worried (or the menu-bar number goes up), read the review: say "show me the latest Siltpoke review".
3. Teach it. In the dashboard (say "open the Siltpoke dashboard"), press **DISMISS** on a review that is wrong and **ACK** on one that helped. It remembers, and over time stops repeating what you dismissed.
4. Once a week, look at the dashboard's Memory page — that is what it has learned about your code.
5. Reviews went quiet? say "check my Siltpoke install" first; if everything is ✓, say "wake Siltpoke".
6. Busy (a demo, pairing)? say "mute Siltpoke for 1 hour" — it turns itself back on when the time is up.

**PLC, every session**
1. Start: say "catch me up from RESUME.md" — where you left off, what shipped, what is next.
2. New feature: say "use project-lifecycle to ship <what you want>".
3. A design question you are not sure about: say "research <question> with project-lifecycle" — it comes back with cited sources.
4. Before merging a branch: say "review this branch with project-lifecycle".
5. End: say "hand off — save where we are to RESUME.md". The next session starts again at item 1.
6. Ready to publish a version: say "cut a release with project-lifecycle".

**Keep it current:** PLC: `git -C ~/plugins/project-lifecycle pull`, then the update steps in its README §"Codex setup". Siltpoke: the Codex section of https://github.com/Siltpoke/siltpoke#codex. Then restart Codex.

## Step 9 — The manual

End with this, in my language, only the rows for what I installed:

| | Status |
|---|---|
| Project Life Cycle | installed — version from `codex plugin list` |
| Siltpoke | installed — version, pet name + species |
| Bun | version (and its path) |
| Menu-bar pet | installed / not installed / not a Mac |
| **Still to do** | restart Codex → "check my Siltpoke install" (Siltpoke) · "set up this project with project-lifecycle" (PLC) |

Siltpoke, things to say: check my install · show the latest review · open the dashboard · mute for <time> / unmute · menu-bar pet install / status / remove · show the Siltpoke manual. Not available in a plugin install (they need a source clone): listing or dismissing reviews from the chat, `remember`, and indexing a repo for the Code Map from the chat — use the dashboard for reviews.

Cost: the review runs a separate model call through a CLI you are already logged into — no extra account. Reviews are saved on your machine; nothing is sent anywhere except the normal model call and a once-a-day check with GitHub for the latest version number — that check sends nothing about you or your code, and Siltpoke receives nothing. Turn it off with `"updateCheck": {"enabled": false}` in `~/.siltpoke/config.json`.

Want the other plugin later? Paste this same prompt again — it only adds what is missing.

Antigravity

Paste into Antigravity (agy). It clones the repos for you — Antigravity only installs from a local folder.

You are installing Antigravity (agy) plugins for me, setting them up, and then teaching me to use them. Talk to me in the language I am writing in. Keep each message short. **Ask me before anything that downloads and runs a script, installs an app, clones a repo, or changes my shell profile or config files.**

There are two plugins. They are independent — I can have one, the other, or both:
- **Siltpoke** — a second reviewer that watches my coding sessions. After each turn, a *separate* AI process reads what changed and writes down what it thinks was missed. It remembers bugs across sessions, and it has a dashboard and a small pet. Repo: https://github.com/Siltpoke/siltpoke
- **Project Life Cycle (PLC)** — a working method for AI coding: spec → plan → build → verify → ship → release. Repo: https://github.com/Siltpoke/project-life-cycle

**Important for agy:** neither plugin has slash commands here. Everything is done by asking you in plain words, and you use their skills. Tell me this once, early.

## Before anything — am I on Windows?

Run `uname -s`. If it fails, or prints anything that is not `Darwin` or `Linux`
(on Windows it will not exist, or a Git-Bash shell prints `MINGW64_NT-...`),
**stop here and tell me this, in my language, before installing anything:**

> Siltpoke does not support native Windows yet. It will install, the pet will
> appear, the commands will work and the config will say the setup is fine —
> but the review hook is registered as `sh ./hooks/stop.sh`, Windows has no
> `sh`, so no review will ever run and nothing will say so. If you have WSL,
> run this again inside WSL and everything works, because that is Linux.
> Otherwise, wait for native Windows support.

Then ask whether I want to continue anyway. **Do not install unless I say yes**,
and if I do, say once more that reviews will not fire. Project Life Cycle has no
such problem — it is prompts and commands, no hook — so offer to install only
PLC instead.

## Step 0 — What do I already have, and what do I want?

Run `agy plugin list` first. Then:
- If one of them is already installed, say so in one line ("you already have PLC — this time I'll only add Siltpoke") and skip its install.
- For anything not installed yet, ask me once: **both / only Siltpoke / only PLC**. Recommend "both" in one sentence, but do what I pick. Every later step applies only to what I picked.

## Step 1 — Check the tools

Run these and tell me in one line each what you found:
- `agy --version`, `git --version`, `uname -s` (a Mac? only matters for the menu-bar pet in Step 4)
- Siltpoke only: `bun --version`. Siltpoke needs Bun both to build and to review. If it is missing, **ask me first**, then run `curl -fsSL https://bun.sh/install | bash` and use `~/.bun/bin/bun` for the rest of this session (my shell will not see the new PATH until it restarts — that is fine, setup records the full path).

## Step 2 — Install

Run one line at a time. If any line fails, stop and show me the exact error.

**Siltpoke** — agy must install the `.antigravity-plugin` folder from a local copy. **Never** run `agy plugin install https://github.com/Siltpoke/siltpoke` and never install the repo's top folder: agy then registers it as a Claude Code plugin and reviews silently never run.
```bash
git clone https://github.com/Siltpoke/siltpoke.git ~/siltpoke
cd ~/siltpoke && bun install
cd ~/siltpoke && bun run build:dist
agy plugin install ~/siltpoke/.antigravity-plugin
agy plugin validate ~/siltpoke/.antigravity-plugin
```
If `~/siltpoke` already exists, ask me before touching it (it may be my own copy); if it is a clean clone of this repo, `git -C ~/siltpoke pull` instead of cloning.

**PLC:**
```bash
git clone https://github.com/Siltpoke/project-life-cycle.git ~/plugins/project-life-cycle
agy plugin install ~/plugins/project-life-cycle
```

Then run `agy plugin list` and confirm each one I picked shows as installed. Do not claim success from the install output alone.

## Step 3 — Set up Siltpoke (skip if I did not pick it)

Reviews do not start until a pet exists at `~/.siltpoke/config.json` — until then, the plugin is installed but does nothing. If that file already exists, setup was done before: say so, ask if I want to redo it, and skip to Step 4 if not.

The Siltpoke skill does the setup. Read it from disk so you do not depend on it being loaded yet:
1. `PLUGIN_ROOT` is `~/.gemini/config/plugins/siltpoke` (agy copies the plugin there). Check that `PLUGIN_ROOT/dist/siltpoke-cli.js` exists; if not, use `~/siltpoke/.antigravity-plugin`.
2. Read `PLUGIN_ROOT/skills/siltpoke/SKILL.md`.
3. Follow its sections **"Resolve the plugin root first"** and **"Create your pet (first-time setup)"** exactly. It asks me Express or Custom — let me choose.
4. When it finishes, tell me the result in plain words. If it fails, translate the error and stop.

## Step 4 — The menu-bar pet (Siltpoke + Mac only)

With this install, agy has no terminal pet (statusline) — so on a Mac, the menu bar is the one place you see Siltpoke without opening anything. Explain it in two sentences and ask if I want it:

- **The menu-bar pet** sits in the Mac's top menu bar and shows **all your sessions at once** — every project, and every coding tool Siltpoke watches (agy, and Claude Code or Codex if you use them too). You see it all the time, even with every terminal closed. The number next to it is how many sessions have a recent review (not a count of problems). Click it for a list: one line per session (project · branch · time · which coding tool wrote the code) with its latest review, plus "Open dashboard" and "Restart daemon". It refreshes once a minute.
- (A **terminal pet** — the bottom line of Claude Code — shows only the current session and changes after every turn. agy can show one too, but only with Siltpoke's from-source install, which this prompt does not use.)

If I say yes:
1. It needs the free app SwiftBar. Check with `ls /Applications/SwiftBar.app`. If it is missing, ask me: install with `brew install --cask swiftbar` (only if `brew --version` works), or let me download it from https://github.com/swiftbar/SwiftBar. Then open it once: `open -a SwiftBar` (the first time, it asks me to pick a plugin folder — accept the default).
2. Run `"$BUN" "$PLUGIN_ROOT/dist/siltpoke-cli.js" menubar install`, then `… menubar status`, and tell me in one sentence what it said.

## Step 5 — PLC needs no global setup (skip if I did not pick it)

Tell me: PLC is set up **per project**, not once for the whole machine. There is no `/init-harness` command in agy — instead, inside a project I say "set up this project with project-lifecycle", and the skill looks at the code, writes a few project files, and asks before overwriting anything. Do **not** do it now.

## Step 6 — The one thing I must do myself

Tell me clearly: **quit agy and start it again now.** New skills and the review hook only load then.

One limit to mention: reviews do not run in headless `agy -p` mode with this install — only in normal interactive sessions.

## Step 7 — Getting started: my first day

Before I restart, print this walkthrough in my language, only the parts for what I installed, filled with my real results. Make it a numbered list I can follow step by step. In agy everything is said in plain words — give me the exact sentence to say. Do not invent features that are not listed here.

**Siltpoke — first 10 minutes**
1. Say: "check my Siltpoke install". You get a ✓/✗ checklist. All ✓ means it works. If something is ✗, it says what to do.
2. Ask agy for any small real change (for example: "add a comment explaining this function"). When agy finishes, Siltpoke reviews the change in the background — agy does not wait for it.
3. On a Mac with the menu-bar pet, the menu bar shows the new review within a minute.
4. Say: "show me the latest Siltpoke review".
5. Say: "open the Siltpoke dashboard". It opens http://127.0.0.1:9876 — review history, chat with your pet about your code, what it remembers, and the Code Map. On a review, press **ACK** (seen, useful) or **DISMISS** (wrong). This is how it learns what to stop saying.
6. Need quiet? Say "mute Siltpoke for 1 hour", and "unmute Siltpoke" to undo.

Good to know: if you pick a Claude model inside agy, the reviewer is also Claude — Claude reviewing Claude, so it can share the same blind spots.

**PLC — your first project**
1. Inside a project, say: "set up this project with project-lifecycle". Answer its questions.
2. Talk about the code first, no edits: "explain how this project is structured."
3. Build one small feature: "use project-lifecycle to ship <what you want>". It stops to check with you at the user story, the spec, and the pull request.
4. Stopping for the day? Say "hand off — save where we are to RESUME.md".
5. Next time, say "catch me up from RESUME.md".

**Both together — a normal day:** catch me up → build → Siltpoke reviews each turn in the background → "show me the latest Siltpoke review" → hand off.

## Step 8 — Keep using it

Print this right after the first-day walkthrough, in my language, only the parts for what I installed. It is how I use the plugins every day after the first one.

**Siltpoke, every day**
1. Just work. Siltpoke reviews each turn by itself — you never have to start it.
2. When the pet looks worried (or the menu-bar number goes up), read the review: say "show me the latest Siltpoke review".
3. Teach it. In the dashboard (say "open the Siltpoke dashboard"), press **DISMISS** on a review that is wrong and **ACK** on one that helped. It remembers, and over time stops repeating what you dismissed.
4. Once a week, look at the dashboard's Memory page — that is what it has learned about your code.
5. Reviews went quiet? say "check my Siltpoke install" first; if everything is ✓, say "wake Siltpoke".
6. Busy (a demo, pairing)? say "mute Siltpoke for 1 hour" — it turns itself back on when the time is up.

**PLC, every session**
1. Start: say "catch me up from RESUME.md" — where you left off, what shipped, what is next.
2. New feature: say "use project-lifecycle to ship <what you want>".
3. A design question you are not sure about: say "research <question> with project-lifecycle" — it comes back with cited sources.
4. Before merging a branch: say "review this branch with project-lifecycle".
5. End: say "hand off — save where we are to RESUME.md". The next session starts again at item 1.
6. Ready to publish a version: say "cut a release with project-lifecycle".

**Keep it current:** `git -C ~/siltpoke pull && cd ~/siltpoke && bun install && bun run build:dist && agy plugin install ~/siltpoke/.antigravity-plugin` · PLC: `git -C ~/plugins/project-life-cycle pull && agy plugin install ~/plugins/project-life-cycle`. Then restart agy.

## Step 9 — The manual

End with this, in my language, only the rows for what I installed:

| | Status |
|---|---|
| Project Life Cycle | installed — version from `agy plugin list` |
| Siltpoke | installed — version, pet name + species |
| Bun | version (and its path) |
| Menu-bar pet | installed / not installed / not a Mac |
| **Still to do** | restart agy → "check my Siltpoke install" (Siltpoke) · "set up this project with project-lifecycle" (PLC) |

Siltpoke, things to say: check my install · show the latest review · open the dashboard · mute for <time> / unmute · menu-bar pet install / status / remove · show the Siltpoke manual. Not available in a plugin install (they need Siltpoke's source scripts): listing or dismissing reviews from the chat, `remember`, and indexing a repo for the Code Map from the chat — use the dashboard for reviews.

Cost: the review runs a separate model call through a CLI you are already logged into — no extra account. Reviews are saved on your machine; nothing is sent anywhere except the normal model call and a once-a-day check with GitHub for the latest version number — that check sends nothing about you or your code, and Siltpoke receives nothing. Turn it off with `"updateCheck": {"enabled": false}` in `~/.siltpoke/config.json`.

Want the other plugin later? Paste this same prompt again — it only adds what is missing.

CodeBuddy

Paste into CodeBuddy.

You are installing CodeBuddy plugins for me, setting them up, and then teaching me to use them. Talk to me in the language I am writing in. Keep each message short. **Ask me before anything that downloads and runs a script, installs an app, or changes my shell profile or config files.**

There are two plugins. They are independent — I can have one, the other, or both:
- **Siltpoke** — a second reviewer that watches my coding sessions. After each turn, a *separate* AI process reads what changed and writes down what it thinks was missed. It remembers bugs across sessions, and it has a dashboard and a small pet. Repo: https://github.com/Siltpoke/siltpoke
- **Project Life Cycle (PLC)** — a working method for AI coding: spec → plan → build → verify → ship → release. Repo: https://github.com/Siltpoke/project-life-cycle

## Before anything — am I on Windows?

Run `uname -s`. If it fails, or prints anything that is not `Darwin` or `Linux`
(on Windows it will not exist, or a Git-Bash shell prints `MINGW64_NT-...`),
**stop here and tell me this, in my language, before installing anything:**

> Siltpoke does not support native Windows yet. It will install, the pet will
> appear, the commands will work and the config will say the setup is fine —
> but the review hook is registered as `sh ./hooks/stop.sh`, Windows has no
> `sh`, so no review will ever run and nothing will say so. If you have WSL,
> run this again inside WSL and everything works, because that is Linux.
> Otherwise, wait for native Windows support.

Then ask whether I want to continue anyway. **Do not install unless I say yes**,
and if I do, say once more that reviews will not fire. Project Life Cycle has no
such problem — it is prompts and commands, no hook — so offer to install only
PLC instead.

## Step 0 — What do I already have, and what do I want?

Run `codebuddy plugin list` first (if that subcommand is not available, tell me to open the `/plugin` screen and read you the **Installed** tab). Then:
- If one of them is already installed, say so in one line ("you already have PLC — this time I'll only add Siltpoke") and skip its install.
- For anything not installed yet, ask me once: **both / only Siltpoke / only PLC**. Recommend "both" in one sentence, but do what I pick. Every later step applies only to what I picked.

## Step 1 — Check the tools

Run these and tell me in one line each what you found:
- `codebuddy --version`, `git --version`, `uname -s` (a Mac? only matters for the menu-bar pet in Step 4)
- Siltpoke only: `bun --version`. Siltpoke's reviewer runs on Bun. If it is missing, **ask me first**, then run `curl -fsSL https://bun.sh/install | bash` and check again with `~/.bun/bin/bun --version` (my shell will not see the new PATH until it restarts — that is fine, setup records the full path).

## Step 2 — Install

Run one line at a time. If any line fails, stop and show me the exact error.

```bash
# Siltpoke
codebuddy plugin marketplace add https://github.com/Siltpoke/siltpoke
codebuddy plugin install siltpoke@siltpoke

# PLC
codebuddy plugin marketplace add https://github.com/Siltpoke/project-life-cycle
codebuddy plugin install project-lifecycle@project-life-cycle
```

The `@…` part is required — a bare `codebuddy plugin install siltpoke` fails with `Marketplace 'undefined' is not ready`. If the PLC lines fail as a command-line call, tell me to type these two inside CodeBuddy instead: `/plugin marketplace add Siltpoke/project-life-cycle` and `/plugin install project-lifecycle@project-life-cycle`.

Then confirm each one I picked shows as installed. Do not claim success from the install output alone.

## Step 3 — Set up Siltpoke (skip if I did not pick it)

Reviews do not start until a pet exists at `~/.siltpoke/config.json`. If that file already exists, setup was done before: say so, ask if I want to redo it, and skip to Step 4 if not.

CodeBuddy installs the same plugin files as Claude Code, so the setup instructions are on disk:
1. Find them: `find ~/.codebuddy -name siltpoke-setup.md 2>/dev/null | head -1` (if nothing, try `find ~ -maxdepth 6 -name siltpoke-setup.md -path '*siltpoke*' 2>/dev/null | head -1`). The plugin folder, `PLUGIN_ROOT`, is the folder that contains `.claude-plugin/`. Check that `PLUGIN_ROOT/dist/siltpoke-cli.js` exists.
2. Read that `siltpoke-setup.md` and follow it exactly. Wherever it says `${CLAUDE_PLUGIN_ROOT}`, use the real `PLUGIN_ROOT`. If `bun` is not on PATH yet, use `~/.bun/bin/bun`. Where it says "restart Claude Code", say "restart CodeBuddy".
3. It first asks me **Express** or **Custom** — let me choose.
4. When it finishes, tell me the result in plain words. If it fails, translate the error and stop.

## Step 4 — The menu-bar pet (Siltpoke + Mac only)

If setup already offered the menu-bar pet and I answered, skip this step. Otherwise explain it in two sentences and ask if I want it:

- **The menu-bar pet** sits in the Mac's top menu bar and shows **all your sessions at once** — every project, and every coding tool Siltpoke watches. You see it all the time, even with every terminal closed. The number next to it is how many sessions have a recent review (not a count of problems). Click it for a list: one line per session (project · branch · time · which coding tool wrote the code) with its latest review, plus "Open dashboard" and "Restart daemon". It refreshes once a minute.
- The difference from the **terminal pet** (the bottom line of Claude Code): that one shows only the current session and changes after every turn.

If I say yes:
1. It needs the free app SwiftBar. Check with `ls /Applications/SwiftBar.app`. If it is missing, ask me: install with `brew install --cask swiftbar` (only if `brew --version` works), or let me download it from https://github.com/swiftbar/SwiftBar. Then open it once: `open -a SwiftBar` (the first time, it asks me to pick a plugin folder — accept the default).
2. Run `bun "PLUGIN_ROOT/dist/siltpoke-cli.js" menubar install`, then `… menubar status`, and tell me in one sentence what it said.

## Step 5 — PLC needs no global setup (skip if I did not pick it)

Tell me: PLC is set up **per project**, not once for the whole machine. Inside a project I either type `/init-harness` (if CodeBuddy shows it) or say "set up this project with project-lifecycle". It looks at the code, writes a few project files, and asks before overwriting anything. Do **not** do it now.

## Step 6 — The one thing I must do myself

Tell me clearly: **run `/reload-plugins` in CodeBuddy, or quit and start it again, now.** The plugins and the review hook only load then. Then ask me to type `/siltpoke-` and tell you whether commands show up — that decides which column of Step 7 I use.

## Step 7 — Getting started: my first day

Before I reload, print this walkthrough in my language, only the parts for what I installed, filled with my real results. Make it a numbered list. For each step give both forms — **the slash command** (if CodeBuddy shows `/siltpoke-…` commands) **or the sentence to say**. Do not invent features that are not listed here.

**Siltpoke — first 10 minutes**
1. `/siltpoke-doctor` or "check my Siltpoke install". You get a ✓/✗ checklist. All ✓ means it works. If something is ✗, it says what to do.
2. Ask CodeBuddy for any small real change (for example: "add a comment explaining this function"). When it finishes, Siltpoke reviews the change in the background. You do not need to do anything.
3. On a Mac with the menu-bar pet, the menu bar shows the new review within a minute.
4. `/siltpoke-last` or "show me the latest Siltpoke review".
5. `/siltpoke-dashboard` or "open the Siltpoke dashboard". It opens http://127.0.0.1:9876 — review history, chat with your pet about your code, what it remembers, and the Code Map. On a review, press **ACK** (seen, useful) or **DISMISS** (wrong). This is how it learns what to stop saying.
6. Need quiet? `/siltpoke-mute 1h` or "mute Siltpoke for 1 hour"; `/siltpoke-unmute` or "unmute Siltpoke" to undo.

**PLC — your first project**
1. Inside a project: `/init-harness` or "set up this project with project-lifecycle". Answer its questions.
2. Talk about the code first, no edits: "explain how this project is structured."
3. Build one small feature: `/ship <what you want>` or "use project-lifecycle to ship <what you want>". It stops to check with you at the user story, the spec, and the pull request.
4. Stopping for the day? `/handoff` or "hand off — save where we are to RESUME.md".
5. Next time: `/catchup` or "catch me up from RESUME.md".

**Both together — a normal day:** catch up → build → Siltpoke reviews each turn in the background → read the latest review when you want → hand off.

## Step 8 — Keep using it

Print this right after the first-day walkthrough, in my language, only the parts for what I installed. It is how I use the plugins every day after the first one.

**Siltpoke, every day**
1. Just work. Siltpoke reviews each turn by itself — you never have to start it.
2. When the pet looks worried (or the menu-bar number goes up), read the review: `/siltpoke-last` or "show me the latest Siltpoke review".
3. Teach it. In the dashboard (`/siltpoke-dashboard` or "open the Siltpoke dashboard"), press **DISMISS** on a review that is wrong and **ACK** on one that helped. It remembers, and over time stops repeating what you dismissed.
4. Once a week, look at the dashboard's Memory page — that is what it has learned about your code.
5. Reviews went quiet? `/siltpoke-doctor` or "check my Siltpoke install" first; if everything is ✓, `/siltpoke-wake` or "wake Siltpoke".
6. Busy (a demo, pairing)? `/siltpoke-mute 1h` or "mute Siltpoke for 1 hour" — it turns itself back on when the time is up.

**PLC, every session**
1. Start: `/catchup` or "catch me up from RESUME.md" — where you left off, what shipped, what is next.
2. New feature: `/ship <what you want>` or "use project-lifecycle to ship <what you want>".
3. A design question you are not sure about: `/research <question>` or "research <question> with project-lifecycle" — it comes back with cited sources.
4. Before merging a branch: `/review` or "review this branch with project-lifecycle".
5. End: `/handoff` or "hand off — save where we are to RESUME.md". The next session starts again at item 1.
6. Ready to publish a version: `/release` or "cut a release with project-lifecycle".

**Keep it current:** inside CodeBuddy, `/plugin marketplace update siltpoke` and `/plugin marketplace update project-life-cycle`, then `/reload-plugins`.

## Step 9 — The manual

End with this, in my language, only the rows for what I installed:

| | Status |
|---|---|
| Project Life Cycle | installed — version |
| Siltpoke | installed — version, pet name + species |
| Bun | version (and its path) |
| Menu-bar pet | installed / not installed / not a Mac |
| Slash commands in CodeBuddy | yes / no (from Step 6) |
| **Still to do** | reload → check the Siltpoke install · set up a project with PLC |

Cost: the review runs a separate model call through a CLI you are already logged into — no extra account. Reviews are saved on your machine; nothing is sent anywhere except the normal model call and a once-a-day check with GitHub for the latest version number — that check sends nothing about you or your code, and Siltpoke receives nothing. Turn it off with `"updateCheck": {"enabled": false}` in `~/.siltpoke/config.json`.

Want the other plugin later? Paste this same prompt again — it only adds what is missing.

Qoder

Paste into Qoder (qodercli).

You are installing Qoder plugins for me, setting them up, and then teaching me to use them. Talk to me in the language I am writing in. Keep each message short. **Ask me before anything that downloads and runs a script, installs an app, or changes my shell profile or config files.**

There are two plugins. They are independent — I can have one, the other, or both:
- **Siltpoke** — a second reviewer that watches my coding sessions. After each turn, a *separate* AI process reads what changed and writes down what it thinks was missed. It remembers bugs across sessions, and it has a dashboard and a small pet. Repo: https://github.com/Siltpoke/siltpoke
- **Project Life Cycle (PLC)** — a working method for AI coding: spec → plan → build → verify → ship → release. Repo: https://github.com/Siltpoke/project-life-cycle

## Before anything — am I on Windows?

Run `uname -s`. If it fails, or prints anything that is not `Darwin` or `Linux`
(on Windows it will not exist, or a Git-Bash shell prints `MINGW64_NT-...`),
**stop here and tell me this, in my language, before installing anything:**

> Siltpoke does not support native Windows yet. It will install, the pet will
> appear, the commands will work and the config will say the setup is fine —
> but the review hook is registered as `sh ./hooks/stop.sh`, Windows has no
> `sh`, so no review will ever run and nothing will say so. If you have WSL,
> run this again inside WSL and everything works, because that is Linux.
> Otherwise, wait for native Windows support.

Then ask whether I want to continue anyway. **Do not install unless I say yes**,
and if I do, say once more that reviews will not fire. Project Life Cycle has no
such problem — it is prompts and commands, no hook — so offer to install only
PLC instead.

## Step 0 — What do I already have, and what do I want?

Run `qodercli plugin list` first (if it errors, try `qodercli plugins list`). Then:
- If one of them is already installed, say so in one line ("you already have PLC — this time I'll only add Siltpoke") and skip its install.
- For anything not installed yet, ask me once: **both / only Siltpoke / only PLC**. Recommend "both" in one sentence, but do what I pick. Every later step applies only to what I picked.

## Step 1 — Check the tools

Run these and tell me in one line each what you found:
- `qodercli --version`, `git --version`, `uname -s` (a Mac? only matters for the menu-bar pet in Step 4)
- Siltpoke only: `bun --version`. Siltpoke's reviewer runs on Bun. If it is missing, **ask me first**, then run `curl -fsSL https://bun.sh/install | bash` and check again with `~/.bun/bin/bun --version` (my shell will not see the new PATH until it restarts — that is fine, setup records the full path).

## Step 2 — Install

Run one line at a time. If any line fails, stop and show me the exact error.

```bash
# Siltpoke
qodercli plugin marketplace add https://github.com/Siltpoke/siltpoke
qodercli plugin install siltpoke@siltpoke

# PLC
qodercli plugins marketplace add Siltpoke/project-life-cycle
qodercli plugins install project-lifecycle
```

For Siltpoke the `@siltpoke` part is required — a bare install fails. If a line fails with an unknown-command error, try the same line with `plugin` ↔ `plugins` swapped, and tell me which form worked.

Then confirm each one I picked shows as installed. Do not claim success from the install output alone.

## Step 3 — Set up Siltpoke (skip if I did not pick it)

Reviews do not start until a pet exists at `~/.siltpoke/config.json`. If that file already exists, setup was done before: say so, ask if I want to redo it, and skip to Step 4 if not.

Qoder installs the same plugin files as Claude Code, so the setup instructions are on disk:
1. Find them: `find ~/.qoder -name siltpoke-setup.md 2>/dev/null | head -1` (if nothing, try `find ~ -maxdepth 6 -name siltpoke-setup.md -path '*siltpoke*' 2>/dev/null | head -1`). The plugin folder, `PLUGIN_ROOT`, is the folder that contains `.claude-plugin/`. Check that `PLUGIN_ROOT/dist/siltpoke-cli.js` exists.
2. Read that `siltpoke-setup.md` and follow it exactly. Wherever it says `${CLAUDE_PLUGIN_ROOT}`, use the real `PLUGIN_ROOT`. If `bun` is not on PATH yet, use `~/.bun/bin/bun`. Where it says "restart Claude Code", say "restart Qoder".
3. It first asks me **Express** or **Custom** — let me choose.
4. When it finishes, tell me the result in plain words. If it fails, translate the error and stop.

## Step 4 — The menu-bar pet (Siltpoke + Mac only)

If setup already offered the menu-bar pet and I answered, skip this step. Otherwise explain it in two sentences and ask if I want it:

- **The menu-bar pet** sits in the Mac's top menu bar and shows **all your sessions at once** — every project, and every coding tool Siltpoke watches. You see it all the time, even with every terminal closed. The number next to it is how many sessions have a recent review (not a count of problems). Click it for a list: one line per session (project · branch · time · which coding tool wrote the code) with its latest review, plus "Open dashboard" and "Restart daemon". It refreshes once a minute.
- The difference from the **terminal pet** (the bottom line of Claude Code): that one shows only the current session and changes after every turn.

If I say yes:
1. It needs the free app SwiftBar. Check with `ls /Applications/SwiftBar.app`. If it is missing, ask me: install with `brew install --cask swiftbar` (only if `brew --version` works), or let me download it from https://github.com/swiftbar/SwiftBar. Then open it once: `open -a SwiftBar` (the first time, it asks me to pick a plugin folder — accept the default).
2. Run `bun "PLUGIN_ROOT/dist/siltpoke-cli.js" menubar install`, then `… menubar status`, and tell me in one sentence what it said.

## Step 5 — PLC needs no global setup (skip if I did not pick it)

Tell me: PLC is set up **per project**, not once for the whole machine. Inside a project I either type `/init-harness` (if Qoder shows it) or say "set up this project with project-lifecycle". It looks at the code, writes a few project files, and asks before overwriting anything. Do **not** do it now.

## Step 6 — The one thing I must do myself

Tell me clearly: **run `/plugins reload` in Qoder, or quit and start it again, now.** The plugins and the review hook only load then. Then ask me to type `/siltpoke-` and tell you whether commands show up — that decides which column of Step 7 I use.

## Step 7 — Getting started: my first day

Before I reload, print this walkthrough in my language, only the parts for what I installed, filled with my real results. Make it a numbered list. For each step give both forms — **the slash command** (if Qoder shows `/siltpoke-…` commands) **or the sentence to say**. Do not invent features that are not listed here.

**Siltpoke — first 10 minutes**
1. `/siltpoke-doctor` or "check my Siltpoke install". You get a ✓/✗ checklist. All ✓ means it works. If something is ✗, it says what to do.
2. Ask Qoder for any small real change (for example: "add a comment explaining this function"). When it finishes, Siltpoke reviews the change in the background. You do not need to do anything.
3. On a Mac with the menu-bar pet, the menu bar shows the new review within a minute.
4. `/siltpoke-last` or "show me the latest Siltpoke review".
5. `/siltpoke-dashboard` or "open the Siltpoke dashboard". It opens http://127.0.0.1:9876 — review history, chat with your pet about your code, what it remembers, and the Code Map. On a review, press **ACK** (seen, useful) or **DISMISS** (wrong). This is how it learns what to stop saying.
6. Need quiet? `/siltpoke-mute 1h` or "mute Siltpoke for 1 hour"; `/siltpoke-unmute` or "unmute Siltpoke" to undo.

**PLC — your first project**
1. Inside a project: `/init-harness` or "set up this project with project-lifecycle". Answer its questions.
2. Talk about the code first, no edits: "explain how this project is structured."
3. Build one small feature: `/ship <what you want>` or "use project-lifecycle to ship <what you want>". It stops to check with you at the user story, the spec, and the pull request.
4. Stopping for the day? `/handoff` or "hand off — save where we are to RESUME.md".
5. Next time: `/catchup` or "catch me up from RESUME.md".

**Both together — a normal day:** catch up → build → Siltpoke reviews each turn in the background → read the latest review when you want → hand off.

## Step 8 — Keep using it

Print this right after the first-day walkthrough, in my language, only the parts for what I installed. It is how I use the plugins every day after the first one.

**Siltpoke, every day**
1. Just work. Siltpoke reviews each turn by itself — you never have to start it.
2. When the pet looks worried (or the menu-bar number goes up), read the review: `/siltpoke-last` or "show me the latest Siltpoke review".
3. Teach it. In the dashboard (`/siltpoke-dashboard` or "open the Siltpoke dashboard"), press **DISMISS** on a review that is wrong and **ACK** on one that helped. It remembers, and over time stops repeating what you dismissed.
4. Once a week, look at the dashboard's Memory page — that is what it has learned about your code.
5. Reviews went quiet? `/siltpoke-doctor` or "check my Siltpoke install" first; if everything is ✓, `/siltpoke-wake` or "wake Siltpoke".
6. Busy (a demo, pairing)? `/siltpoke-mute 1h` or "mute Siltpoke for 1 hour" — it turns itself back on when the time is up.

**PLC, every session**
1. Start: `/catchup` or "catch me up from RESUME.md" — where you left off, what shipped, what is next.
2. New feature: `/ship <what you want>` or "use project-lifecycle to ship <what you want>".
3. A design question you are not sure about: `/research <question>` or "research <question> with project-lifecycle" — it comes back with cited sources.
4. Before merging a branch: `/review` or "review this branch with project-lifecycle".
5. End: `/handoff` or "hand off — save where we are to RESUME.md". The next session starts again at item 1.
6. Ready to publish a version: `/release` or "cut a release with project-lifecycle".

**Keep it current:** `qodercli plugins marketplace update project-life-cycle` then `qodercli plugins update project-lifecycle` (the same pair with `siltpoke` for Siltpoke), then `/plugins reload`.

## Step 9 — The manual

End with this, in my language, only the rows for what I installed:

| | Status |
|---|---|
| Project Life Cycle | installed — version |
| Siltpoke | installed — version, pet name + species |
| Bun | version (and its path) |
| Menu-bar pet | installed / not installed / not a Mac |
| Slash commands in Qoder | yes / no (from Step 6) |
| **Still to do** | reload → check the Siltpoke install · set up a project with PLC |

Cost: the review runs a separate model call through a CLI you are already logged into — no extra account. Reviews are saved on your machine; nothing is sent anywhere except the normal model call and a once-a-day check with GitHub for the latest version number — that check sends nothing about you or your code, and Siltpoke receives nothing. Turn it off with `"updateCheck": {"enabled": false}` in `~/.siltpoke/config.json`.

Want the other plugin later? Paste this same prompt again — it only adds what is missing.

安装 coding agent

Siltpoke Review 和 Project Life Cycle 都是架在 coding agent 上面的 —— agent 负责写代码,它们负责写代码之外的事。所以先装 agent。

五个都行 —— Siltpoke Review 和 Project Life Cycle 在五个里都能跑。装你真正用的,其余跳过 —— 只有一个例外:如果你想让 Siltpoke Review 换另一家公司的模型来审你的代码(跨家族 review),那一家的 agent 也要装上并登录,因为审代码时 Siltpoke 要去调用它。(各家的安装命令集中收在这里,省得你去翻五份散落的官方文档。)

每一条都标注了这个 agent 需要什么——账号、运行时、有没有免费入口。费用信息是 2026 年 7 月的快照;各家改得很勤,以链接里的官方定价页为准,别只信这一段。

开始之前:git

它是什么。 git 会把你对代码的每一次改动记下来 —— 每个存档点叫一个 commit。

为什么要装。 Siltpoke Review 和 Project Life Cycle 都放在 GitHub 上,你的 coding agent 安装它们时,是用 git 把它们下载下来的。没有 git,在 Claude Code、Codex、Qoder 上都会安装失败(CodeBuddy 能退回普通下载);Antigravity 和从源码装,第一步也是 git clone。另外,Siltpoke Review 也是靠 git 看出你改了什么的 —— 没有 git,就没东西可审。

先查一下有没有 —— 打印出版本号就说明已经装好了:

git --version

没有的话:

xcode-select --install     # macOS:随 Apple 的命令行工具一起装上 git
# Linux:用系统自带的包管理器(apt、dnf 等)装 git
winget install --id Git.Git -e

开始之前:npm

它是什么。 npm 是用来安装 JavaScript 写的工具的安装器。它不单独下载 —— 装 Node.js 时会一起装上。

为什么要装。 Claude Code 和 CodeBuddy 都是用 npm install -g 装的,Windows 上的 Codex 也是。如果你只打算用 Antigravity、Qoder,或者在 macOS / Linux 上用 Codex,这一步可以跳过。

先查一下有没有:

npm --version

没打印出版本号的话,装 Node.js(选 LTS 版本),npm 会一起装上:

# macOS:到 https://nodejs.org/ 下载 LTS 安装包
# Linux:用系统自带的包管理器(apt、dnf 等)装 Node.js
winget install --id OpenJS.NodeJS.LTS -e

不管装了哪一个,装完都新开一个终端窗口,才认得到它们。

Claude Code

需要 Node ≥ 18 和一个付费的 Anthropic 账号——Claude Code 没有免费档:Pro($20/月)或 Max,或按量付费的 API 额度(定价):

npm install -g @anthropic-ai/claude-code
claude        # 打开 TUI;用你的 Anthropic 账号登录

Codex

所有 ChatGPT 档位都能用,包括免费档,或者用 API key。免费档额度最小、仅限本地任务,和付费档共用同一个 5 小时窗口——够改几处小东西找找感觉,干不完一个正经 feature(在 Codex 里跑 /status 能看到你的实时余量)。认真用建议 Plus($20/月)——顶配模型大约每 5 小时 15–80 条消息。安装器是独立二进制;走 npm 路线需要 Node ≥ 22 (定价):

curl -fsSL https://chatgpt.com/codex/install.sh | sh
codex         # 打开 TUI;用你的 ChatGPT 账号或 API key 登录
npm install -g @openai/codex
codex         # 打开 TUI;用你的 ChatGPT 账号或 API key 登录

Antigravity

独立安装器;任何 Google 账号即可。公测期免费,但计量方式是"agent 干了多少活"(不是按请求数),且免费档按周刷新—— 每天跑几个轻任务比较现实;一个复杂的活儿可能一次 session 就把额度顶满。限额还被反复收紧过——别把计划押在它上面;付费 Google AI 订阅可提额(定价):

curl -fsSL https://antigravity.google/cli/install.sh | bash
agy           # 打开 TUI;在浏览器里用你的 Google 账号完成认证
irm https://antigravity.google/cli/install.ps1 | iex
agy           # 打开 TUI;在浏览器里用你的 Google 账号完成认证

CodeBuddy

需要 Node ≥ 18 和一个 CodeBuddy(腾讯)账号。个人用户有限时免费试用档,外加少量每日免费 credits——大约每天 50 credits 的量级(IDE 侧):够到处点点、跑几个小任务,指望它干活不够,而且免费档在 2026 年 5 月调价后被收紧过。再往上是付费 Pro (定价):

npm install -g @tencent-ai/codebuddy-code
codebuddy     # 打开 TUI

Qoder

独立安装器,不需要 Node;用 Qoder 账号登录。免费档只能用基础模型,有每日和每月上限——日常轻量用没问题,但摸不到最强的模型。首次登录送 14 天 Pro 试用(含 300 credits)——真正评估好模型靠这个试用期,不是免费档;Pro $20/月(定价):

curl -fsSL https://qoder.com/install | bash
qodercli      # 打开 TUI;输入 /login 走浏览器登录
irm https://qoder.com/install.ps1 | iex
qodercli      # 打开 TUI;输入 /login 走浏览器登录

接下来装什么

两边都只差一条命令,而且谁都不依赖谁:

  • Project Life Cycle —— 从模糊想法到合并 PR 的流程层。
  • Siltpoke Review —— 那个会审查 agent 写的代码、记住项目、给代码画地图的伙伴。

也可以不敲命令:把一段 agent 提示词贴进 agent,它替你装一个或两个。

用 agent 提示词安装

有了 coding agent 之后,这是装 Project Life Cycle 和 Siltpoke Review 最省事的办法。在下面找到你用的 agent,复制它那段 agent 提示词,当成一条普通消息贴进 agent 里。(还没有 agent?先装一个 —— 命令在本页上方。)接下来 agent 替你装:

  • 先看你已经有什么(git、Bun、两个插件装没装);
  • 问你要装哪个 —— 两个都装、只装 Siltpoke Review,还是只装 Project Life Cycle;
  • 要下载并运行脚本、装软件、或者改 shell 配置之前,先问你;
  • 帮你创建 Siltpoke 宠物,然后带你走一遍第一天怎么用。

提示词是英文的,不影响 —— 你用什么语言跟它说话,它就用什么语言回你。以后想补装另一个插件?把同一段提示词再贴一次就行,它只装缺的那个。

想自己一条条敲命令?那条路也还在: Project Life Cycle → 安装 · Siltpoke Review → 安装与设置。

如果你用的是原生 Windows,提示词会先停下来跟你讲清楚:Siltpoke 能装上,但审查永远不会跑。用 WSL,或者只装 Project Life Cycle。

Claude Code

贴进 Claude Code。它唯一做不了、要你自己动手的一步在最后:退出 Claude Code 再重新打开,新命令才会加载。

You are installing Claude Code plugins for me, setting them up, and then teaching me to use them. Talk to me in the language I am writing in. Keep each message short. **Ask me before anything that downloads and runs a script, installs an app, or changes my shell profile.**

There are two plugins. They are independent — I can have one, the other, or both:
- **Siltpoke** — a second reviewer that watches my coding sessions. After each turn, a *separate* AI process reads what changed and writes down what it thinks was missed. It remembers bugs across sessions, and it has a dashboard and a small pet. Repo: https://github.com/Siltpoke/siltpoke
- **Project Life Cycle (PLC)** — a working method for AI coding: spec → plan → build → verify → ship → release, with commands to set up a project, ship a feature, save/resume a session, and cut a release. Repo: https://github.com/Siltpoke/project-life-cycle

## Before anything — am I on Windows?

Run `uname -s`. If it fails, or prints anything that is not `Darwin` or `Linux`
(on Windows it will not exist, or a Git-Bash shell prints `MINGW64_NT-...`),
**stop here and tell me this, in my language, before installing anything:**

> Siltpoke does not support native Windows yet. It will install, the pet will
> appear, the commands will work and the config will say the setup is fine —
> but the review hook is registered as `sh ./hooks/stop.sh`, Windows has no
> `sh`, so no review will ever run and nothing will say so. If you have WSL,
> run this again inside WSL and everything works, because that is Linux.
> Otherwise, wait for native Windows support.

Then ask whether I want to continue anyway. **Do not install unless I say yes**,
and if I do, say once more that reviews will not fire. Project Life Cycle has no
such problem — it is prompts and commands, no hook — so offer to install only
PLC instead.

## Step 0 — What do I already have, and what do I want?

Run `claude plugin list` first. Then:
- If one of them is already installed, say so in one line ("you already have PLC — this time I'll only add Siltpoke") and skip its install. Offer `claude plugin update <name>` instead.
- For anything not installed yet, ask me once: **both / only Siltpoke / only PLC**. Recommend "both" in one sentence, but do what I pick. Every later step applies only to what I picked.

## Step 1 — Check the tools

Run these and tell me in one line each what you found:
- `claude --version` (must work — you are running inside it)
- `git --version`
- `uname -s` (tells you if I'm on a Mac — only matters for the menu-bar pet in Step 4)
- Siltpoke only: `bun --version`. Siltpoke's reviewer runs on Bun. If it is missing, **ask me first**, then run `curl -fsSL https://bun.sh/install | bash` and check again with `~/.bun/bin/bun --version` (my shell will not see the new PATH until it restarts — that is fine, setup records the full path).

## Step 2 — Install

Run with the Bash tool, one line at a time. If any line fails, stop and show me the exact error.

```bash
# PLC
claude plugin marketplace add Siltpoke/project-life-cycle
claude plugin install project-lifecycle@project-life-cycle

# Siltpoke
claude plugin marketplace add Siltpoke/siltpoke
claude plugin install siltpoke@siltpoke
```

Then run `claude plugin list` and confirm each one I picked shows as installed and enabled. Do not claim success from the install output alone.

## Step 3 — Set up Siltpoke (skip if I did not pick it)

The `/siltpoke-setup` command is not available until Claude Code restarts, but its instructions are already on disk:

1. Find the plugin folder: `ls -d ~/.claude/plugins/cache/siltpoke/siltpoke/*/ | sort -V | tail -1`. Call it `PLUGIN_ROOT`.
2. Read `PLUGIN_ROOT/.claude-plugin/commands/siltpoke-setup.md` (if it is not there: `find PLUGIN_ROOT -name siltpoke-setup.md`).
3. Follow that file exactly, as if I had typed `/siltpoke-setup`. Wherever it says `${CLAUDE_PLUGIN_ROOT}`, use the real `PLUGIN_ROOT`. If `bun` is not on PATH yet, use `~/.bun/bin/bun`.
4. It first asks me **Express** (one step, a default pet) or **Custom** (choose species, name, language, personality). Let me choose.
5. When it finishes, tell me the result in plain words. If it fails, translate the one-line error and stop.
6. If `~/.siltpoke/config.json` already existed before you started, setup was done before: say so, ask if I want to redo it, and skip to Step 4 if not.

## Step 4 — The menu-bar pet (Siltpoke + Mac only)

If setup already offered the menu-bar pet and I answered, skip this step. Otherwise, explain it in two sentences and ask if I want it:

- **The terminal pet (statusline)** sits in the bottom line of Claude Code. It shows **this session only**: it changes after every turn, and its speech bubble carries the latest review. You see it only while you are in that Claude Code window.
- **The menu-bar pet** sits in the Mac's top menu bar and shows **all your sessions at once** — every project, and every coding tool Siltpoke watches. You see it all the time, even with every terminal closed. The number next to it is how many sessions have a recent review (not a count of problems). Click it for a list: one line per session (project · branch · time · which coding tool wrote the code) with its latest review, plus "Open dashboard" and "Restart daemon". It refreshes once a minute, not after every turn.

If I say yes:
1. It needs the free app SwiftBar. Check with `ls /Applications/SwiftBar.app`. If it is missing, ask me: install with `brew install --cask swiftbar` (only if `brew --version` works), or let me download it myself from https://github.com/swiftbar/SwiftBar. Then open it once: `open -a SwiftBar` (the first time, it asks me to pick a plugin folder — accept the default).
2. Run `bun "PLUGIN_ROOT/dist/siltpoke-cli.js" menubar install`, then `… menubar status`, and tell me in one sentence what it said.

## Step 5 — PLC needs no global setup (skip if I did not pick it)

Tell me: PLC is set up **per project**, not once for the whole machine. Inside a project folder, `/init-harness` looks at the code, writes a `CLAUDE.md` and a few config files, and asks before overwriting anything. Do **not** run it now. If my current folder is a git repo, say: "after the restart, you can run `/init-harness` here."

## Step 6 — The one thing I must do myself

Tell me clearly: **quit Claude Code and start it again now.** Slash commands, the Siltpoke review hook, and the terminal pet only load on restart. Then tell me what to type first after the restart (Step 7, item 1).

## Step 7 — Getting started: my first day

Before the restart, print this walkthrough in my language, only the parts for what I installed, filled with my real results. Make it a numbered list I can follow step by step. Do not invent commands that are not listed here.

**Siltpoke — first 10 minutes**
1. Type `/siltpoke-doctor`. It prints a ✓/✗ checklist. All ✓ means the install works. If something is ✗, it says what to do.
2. Ask Claude for any small real change (for example: "add a comment explaining this function"). When Claude finishes, Siltpoke reviews the change in the background. You do not need to do anything.
3. Watch the terminal pet: its face and speech bubble change when the review is done. (On a Mac with the menu-bar pet, the menu bar shows it too, within a minute.)
4. Type `/siltpoke-last` to read the full review in the chat.
5. Type `/siltpoke-dashboard`. It opens http://127.0.0.1:9876 — review history, chat with your pet about your code, what it remembers, and the Code Map. On a review, press **ACK** (seen, useful) or **DISMISS** (wrong). This is how it learns what to stop saying.
6. Need quiet (a demo, pairing)? `/siltpoke-mute 1h`, and `/siltpoke-unmute` to undo. Reviews stopped showing up? `/siltpoke-wake`.

**PLC — your first project**
1. `cd` into a project and type `/init-harness`. Answer its questions. It writes `CLAUDE.md` and asks before overwriting anything.
2. Talk about the code first, no edits: "explain how this project is structured."
3. Build one small feature with `/ship <what you want>`. It stops 3 times to check with you: the user story, the spec, and the pull request.
4. Stopping for the day? `/handoff` saves where you are to `RESUME.md`.
5. Next time, start with `/catchup` — a "welcome back" card of where you left off.
6. The `project-lifecycle` skill also turns on by itself when you start a project or plan multi-step work. You do not have to type the commands — they are shortcuts.

**Both together — a normal day**
1. Open a project → `/catchup`
2. Build with `/ship`, or just work normally
3. Siltpoke reviews each turn in the background → `/siltpoke-last` when the pet looks worried
4. Leaving → `/handoff`

## Step 8 — Keep using it

Print this right after the first-day walkthrough, in my language, only the parts for what I installed. It is how I use the plugins every day after the first one.

**Siltpoke, every day**
1. Just work. Siltpoke reviews each turn by itself — you never have to start it.
2. When the pet looks worried (or the menu-bar number goes up), read the review: `/siltpoke-last`.
3. Teach it. In the dashboard (`/siltpoke-dashboard`), press **DISMISS** on a review that is wrong and **ACK** on one that helped. It remembers, and over time stops repeating what you dismissed.
4. Once a week, look at the dashboard's Memory page — that is what it has learned about your code.
5. Reviews went quiet? `/siltpoke-doctor` first; if everything is ✓, `/siltpoke-wake`.
6. Busy (a demo, pairing)? `/siltpoke-mute 1h` — it turns itself back on when the time is up.

**PLC, every session**
1. Start: `/catchup` — where you left off, what shipped, what is next.
2. New feature: `/ship <what you want>`.
3. A design question you are not sure about: `/research <question>` — it comes back with cited sources.
4. Before merging a branch: `/review`.
5. End: `/handoff`. The next session starts again at item 1.
6. Ready to publish a version: `/release`.

**Keep it current:** `claude plugin update siltpoke` · `claude plugin update project-lifecycle`, then restart Claude Code.

## Step 9 — The manual

End with this, in my language, only the rows for what I installed:

| | Status |
|---|---|
| Project Life Cycle | installed — version from `claude plugin list` |
| Siltpoke | installed — version, pet name + species |
| Bun | version (and its path) |
| Menu-bar pet | installed / not installed / not a Mac |
| **Still to do** | restart Claude Code → `/siltpoke-doctor` (Siltpoke) · `/init-harness` in a project (PLC) |

Siltpoke commands: `/siltpoke-last` · `/siltpoke-dashboard` · `/siltpoke-doctor` · `/siltpoke-mute <duration>` / `/siltpoke-unmute` · `/siltpoke-wake` · `/siltpoke-brain` (which model reviews — can be another company's CLI or a local model) · `/siltpoke-menubar` · `/siltpoke-help` (the full manual).

Cost: the review uses your existing Claude Code login — no extra account. Roughly $0.04–$0.10 a day with prompt caching. Reviews are saved on your machine; nothing is sent anywhere except the normal model call and a once-a-day check with GitHub for the latest version number — that check sends nothing about you or your code, and Siltpoke receives nothing. Turn it off with `"updateCheck": {"enabled": false}` in `~/.siltpoke/config.json`.

PLC commands: `/init-harness` · `/ship` · `/review` · `/research` · `/handoff` · `/catchup` · `/release`. If another plugin uses the same name, use the long form, e.g. `/project-lifecycle:ship`.

Uninstall: `claude plugin uninstall siltpoke` · `claude plugin uninstall project-lifecycle@project-life-cycle`
Want the other plugin later? Paste this same prompt again — it only adds what is missing.

Codex

贴进 Codex。Codex 不支持自定义斜杠命令,所以提示词会教你每条命令对应的「大白话说法」。

You are installing Codex plugins for me, setting them up, and then teaching me to use them. Talk to me in the language I am writing in. Keep each message short. **Ask me before anything that downloads and runs a script, installs an app, clones a repo, or changes my shell profile or config files.**

There are two plugins. They are independent — I can have one, the other, or both:
- **Siltpoke** — a second reviewer that watches my coding sessions. After each turn, a *separate* AI process reads what changed and writes down what it thinks was missed. It remembers bugs across sessions, and it has a dashboard and a small pet. Repo: https://github.com/Siltpoke/siltpoke
- **Project Life Cycle (PLC)** — a working method for AI coding: spec → plan → build → verify → ship → release. Repo: https://github.com/Siltpoke/project-life-cycle

**Important for Codex:** neither plugin has slash commands here. Everything is done by asking you in plain words, and you use their skills. Tell me this once, early.

## Before anything — am I on Windows?

Run `uname -s`. If it fails, or prints anything that is not `Darwin` or `Linux`
(on Windows it will not exist, or a Git-Bash shell prints `MINGW64_NT-...`),
**stop here and tell me this, in my language, before installing anything:**

> Siltpoke does not support native Windows yet. It will install, the pet will
> appear, the commands will work and the config will say the setup is fine —
> but the review hook is registered as `sh ./hooks/stop.sh`, Windows has no
> `sh`, so no review will ever run and nothing will say so. If you have WSL,
> run this again inside WSL and everything works, because that is Linux.
> Otherwise, wait for native Windows support.

Then ask whether I want to continue anyway. **Do not install unless I say yes**,
and if I do, say once more that reviews will not fire. Project Life Cycle has no
such problem — it is prompts and commands, no hook — so offer to install only
PLC instead.

## Step 0 — What do I already have, and what do I want?

Run `codex plugin list` first. Then:
- If one of them is already installed, say so in one line ("you already have PLC — this time I'll only add Siltpoke") and skip its install.
- For anything not installed yet, ask me once: **both / only Siltpoke / only PLC**. Recommend "both" in one sentence, but do what I pick. Every later step applies only to what I picked.

## Step 1 — Check the tools

Run these and tell me in one line each what you found:
- `codex --version`, `git --version`, `uname -s` (a Mac? only matters for the menu-bar pet in Step 4)
- Siltpoke only: `bun --version`. Siltpoke's reviewer runs on Bun. If it is missing, **ask me first**, then run `curl -fsSL https://bun.sh/install | bash` and check again with `~/.bun/bin/bun --version` (my shell will not see the new PATH until it restarts — that is fine, setup records the full path).

## Step 2 — Install

Run one line at a time. If any line fails, stop and show me the exact error.

**Siltpoke:**
```bash
codex plugin marketplace add https://github.com/Siltpoke/siltpoke
codex plugin add siltpoke@siltpoke
```
The `@siltpoke` part is required — a bare `codex plugin add siltpoke` fails.

**PLC** installs from a local copy in Codex, so it needs more steps:
1. Ask me, then clone it: `git clone https://github.com/Siltpoke/project-life-cycle ~/plugins/project-lifecycle`
2. Read the section "Codex setup" in `~/plugins/project-lifecycle/README.md` and follow it exactly: it adds one entry to `~/.agents/plugins/marketplace.json`, then runs `codex plugin add project-lifecycle@<marketplace-name>`. If that file already exists, show me the change before you write it. If you cannot tell the marketplace name, show me the file and ask.

Then run `codex plugin list` and confirm each one I picked shows as installed and enabled. Do not claim success from the install output alone. **If Siltpoke is not in that list, stop here and show me the error** — do not go on to Step 3; setup on a plugin that is not installed looks like it worked, but reviews will never run.

## Step 3 — Set up Siltpoke (skip if I did not pick it)

Reviews do not start until a pet exists at `~/.siltpoke/config.json`. If that file already exists, setup was done before: say so, ask if I want to redo it, and skip to Step 4 if not.

The Siltpoke skill does the setup. A new Codex skill may not be loaded until a new thread, so read it from disk instead:
1. Find the installed plugin folder: `ls -d ~/.codex/plugins/cache/siltpoke/siltpoke/*/ | sort -V | tail -1`. Call it `PLUGIN_ROOT`. Only use this folder — Codex also keeps a download copy under `~/.codex/.tmp/`, which is not the installed plugin.
2. Read `PLUGIN_ROOT/skills/siltpoke/SKILL.md` (if not there: `find PLUGIN_ROOT -name SKILL.md -path '*siltpoke*'`).
3. Follow its sections **"Resolve the plugin root first"** and **"Create your pet (first-time setup)"** exactly. It asks me Express or Custom — let me choose.
4. When it finishes, tell me the result in plain words. If it fails, translate the error and stop.

## Step 4 — The menu-bar pet (Siltpoke + Mac only)

On a Mac, the menu bar is the easiest place to see Siltpoke without opening anything. Explain it in two sentences and ask if I want it:

- **The menu-bar pet** sits in the Mac's top menu bar and shows **all your sessions at once** — every project, and every coding tool Siltpoke watches (Codex, and Claude Code if you use it too). You see it all the time, even with every terminal closed. The number next to it is how many sessions have a recent review (not a count of problems). Click it for a list: one line per session (project · branch · time · which coding tool wrote the code) with its latest review, plus "Open dashboard" and "Restart daemon". It refreshes once a minute.
- (If I also use Claude Code: there, Siltpoke also has a **terminal pet** in the bottom line, which shows only that one session and changes after every turn.)

If I say yes:
1. It needs the free app SwiftBar. Check with `ls /Applications/SwiftBar.app`. If it is missing, ask me: install with `brew install --cask swiftbar` (only if `brew --version` works), or let me download it from https://github.com/swiftbar/SwiftBar. Then open it once: `open -a SwiftBar` (the first time, it asks me to pick a plugin folder — accept the default).
2. Run `"$BUN" "$PLUGIN_ROOT/dist/siltpoke-cli.js" menubar install`, then `… menubar status`, and tell me in one sentence what it said.

## Step 5 — PLC needs no global setup (skip if I did not pick it)

Tell me: PLC is set up **per project**, not once for the whole machine. There is no `/init-harness` command in Codex — instead, inside a project I say "set up this project with project-lifecycle", and the skill looks at the code, writes a few project files, and asks before overwriting anything. Do **not** do it now.

## Step 6 — The one thing I must do myself

Tell me clearly: **quit Codex and start it again (or at least start a new thread) now.** New skills and the review hook only load then.

## Step 7 — Getting started: my first day

Before I restart, print this walkthrough in my language, only the parts for what I installed, filled with my real results. Make it a numbered list I can follow step by step. In Codex everything is said in plain words — give me the exact sentence to say. Do not invent features that are not listed here.

**Siltpoke — first 10 minutes**
1. Say: "check my Siltpoke install". You get a ✓/✗ checklist. All ✓ means it works. If something is ✗, it says what to do.
2. Ask Codex for any small real change (for example: "add a comment explaining this function"). When Codex finishes, Siltpoke reviews the change in the background. You do not need to do anything.
3. On a Mac with the menu-bar pet, the menu bar shows the new review within a minute.
4. Say: "show me the latest Siltpoke review".
5. Say: "open the Siltpoke dashboard". It opens http://127.0.0.1:9876 — review history, chat with your pet about your code, what it remembers, and the Code Map. On a review, press **ACK** (seen, useful) or **DISMISS** (wrong). This is how it learns what to stop saying.
6. Need quiet? Say "mute Siltpoke for 1 hour", and "unmute Siltpoke" to undo.

**PLC — your first project**
1. Inside a project, say: "set up this project with project-lifecycle". Answer its questions.
2. Talk about the code first, no edits: "explain how this project is structured."
3. Build one small feature: "use project-lifecycle to ship <what you want>". It stops to check with you at the user story, the spec, and the pull request.
4. Stopping for the day? Say "hand off — save where we are to RESUME.md".
5. Next time, say "catch me up from RESUME.md".

**Both together — a normal day**
1. Open a project → "catch me up"
2. Build with project-lifecycle, or just work normally
3. Siltpoke reviews each turn in the background → "show me the latest Siltpoke review"
4. Leaving → "hand off"

## Step 8 — Keep using it

Print this right after the first-day walkthrough, in my language, only the parts for what I installed. It is how I use the plugins every day after the first one.

**Siltpoke, every day**
1. Just work. Siltpoke reviews each turn by itself — you never have to start it.
2. When the pet looks worried (or the menu-bar number goes up), read the review: say "show me the latest Siltpoke review".
3. Teach it. In the dashboard (say "open the Siltpoke dashboard"), press **DISMISS** on a review that is wrong and **ACK** on one that helped. It remembers, and over time stops repeating what you dismissed.
4. Once a week, look at the dashboard's Memory page — that is what it has learned about your code.
5. Reviews went quiet? say "check my Siltpoke install" first; if everything is ✓, say "wake Siltpoke".
6. Busy (a demo, pairing)? say "mute Siltpoke for 1 hour" — it turns itself back on when the time is up.

**PLC, every session**
1. Start: say "catch me up from RESUME.md" — where you left off, what shipped, what is next.
2. New feature: say "use project-lifecycle to ship <what you want>".
3. A design question you are not sure about: say "research <question> with project-lifecycle" — it comes back with cited sources.
4. Before merging a branch: say "review this branch with project-lifecycle".
5. End: say "hand off — save where we are to RESUME.md". The next session starts again at item 1.
6. Ready to publish a version: say "cut a release with project-lifecycle".

**Keep it current:** PLC: `git -C ~/plugins/project-lifecycle pull`, then the update steps in its README §"Codex setup". Siltpoke: the Codex section of https://github.com/Siltpoke/siltpoke#codex. Then restart Codex.

## Step 9 — The manual

End with this, in my language, only the rows for what I installed:

| | Status |
|---|---|
| Project Life Cycle | installed — version from `codex plugin list` |
| Siltpoke | installed — version, pet name + species |
| Bun | version (and its path) |
| Menu-bar pet | installed / not installed / not a Mac |
| **Still to do** | restart Codex → "check my Siltpoke install" (Siltpoke) · "set up this project with project-lifecycle" (PLC) |

Siltpoke, things to say: check my install · show the latest review · open the dashboard · mute for <time> / unmute · menu-bar pet install / status / remove · show the Siltpoke manual. Not available in a plugin install (they need a source clone): listing or dismissing reviews from the chat, `remember`, and indexing a repo for the Code Map from the chat — use the dashboard for reviews.

Cost: the review runs a separate model call through a CLI you are already logged into — no extra account. Reviews are saved on your machine; nothing is sent anywhere except the normal model call and a once-a-day check with GitHub for the latest version number — that check sends nothing about you or your code, and Siltpoke receives nothing. Turn it off with `"updateCheck": {"enabled": false}` in `~/.siltpoke/config.json`.

Want the other plugin later? Paste this same prompt again — it only adds what is missing.

Antigravity

贴进 Antigravity(agy)。它会替你把仓库 clone 下来 —— Antigravity 只能从本地文件夹安装。

You are installing Antigravity (agy) plugins for me, setting them up, and then teaching me to use them. Talk to me in the language I am writing in. Keep each message short. **Ask me before anything that downloads and runs a script, installs an app, clones a repo, or changes my shell profile or config files.**

There are two plugins. They are independent — I can have one, the other, or both:
- **Siltpoke** — a second reviewer that watches my coding sessions. After each turn, a *separate* AI process reads what changed and writes down what it thinks was missed. It remembers bugs across sessions, and it has a dashboard and a small pet. Repo: https://github.com/Siltpoke/siltpoke
- **Project Life Cycle (PLC)** — a working method for AI coding: spec → plan → build → verify → ship → release. Repo: https://github.com/Siltpoke/project-life-cycle

**Important for agy:** neither plugin has slash commands here. Everything is done by asking you in plain words, and you use their skills. Tell me this once, early.

## Before anything — am I on Windows?

Run `uname -s`. If it fails, or prints anything that is not `Darwin` or `Linux`
(on Windows it will not exist, or a Git-Bash shell prints `MINGW64_NT-...`),
**stop here and tell me this, in my language, before installing anything:**

> Siltpoke does not support native Windows yet. It will install, the pet will
> appear, the commands will work and the config will say the setup is fine —
> but the review hook is registered as `sh ./hooks/stop.sh`, Windows has no
> `sh`, so no review will ever run and nothing will say so. If you have WSL,
> run this again inside WSL and everything works, because that is Linux.
> Otherwise, wait for native Windows support.

Then ask whether I want to continue anyway. **Do not install unless I say yes**,
and if I do, say once more that reviews will not fire. Project Life Cycle has no
such problem — it is prompts and commands, no hook — so offer to install only
PLC instead.

## Step 0 — What do I already have, and what do I want?

Run `agy plugin list` first. Then:
- If one of them is already installed, say so in one line ("you already have PLC — this time I'll only add Siltpoke") and skip its install.
- For anything not installed yet, ask me once: **both / only Siltpoke / only PLC**. Recommend "both" in one sentence, but do what I pick. Every later step applies only to what I picked.

## Step 1 — Check the tools

Run these and tell me in one line each what you found:
- `agy --version`, `git --version`, `uname -s` (a Mac? only matters for the menu-bar pet in Step 4)
- Siltpoke only: `bun --version`. Siltpoke needs Bun both to build and to review. If it is missing, **ask me first**, then run `curl -fsSL https://bun.sh/install | bash` and use `~/.bun/bin/bun` for the rest of this session (my shell will not see the new PATH until it restarts — that is fine, setup records the full path).

## Step 2 — Install

Run one line at a time. If any line fails, stop and show me the exact error.

**Siltpoke** — agy must install the `.antigravity-plugin` folder from a local copy. **Never** run `agy plugin install https://github.com/Siltpoke/siltpoke` and never install the repo's top folder: agy then registers it as a Claude Code plugin and reviews silently never run.
```bash
git clone https://github.com/Siltpoke/siltpoke.git ~/siltpoke
cd ~/siltpoke && bun install
cd ~/siltpoke && bun run build:dist
agy plugin install ~/siltpoke/.antigravity-plugin
agy plugin validate ~/siltpoke/.antigravity-plugin
```
If `~/siltpoke` already exists, ask me before touching it (it may be my own copy); if it is a clean clone of this repo, `git -C ~/siltpoke pull` instead of cloning.

**PLC:**
```bash
git clone https://github.com/Siltpoke/project-life-cycle.git ~/plugins/project-life-cycle
agy plugin install ~/plugins/project-life-cycle
```

Then run `agy plugin list` and confirm each one I picked shows as installed. Do not claim success from the install output alone.

## Step 3 — Set up Siltpoke (skip if I did not pick it)

Reviews do not start until a pet exists at `~/.siltpoke/config.json` — until then, the plugin is installed but does nothing. If that file already exists, setup was done before: say so, ask if I want to redo it, and skip to Step 4 if not.

The Siltpoke skill does the setup. Read it from disk so you do not depend on it being loaded yet:
1. `PLUGIN_ROOT` is `~/.gemini/config/plugins/siltpoke` (agy copies the plugin there). Check that `PLUGIN_ROOT/dist/siltpoke-cli.js` exists; if not, use `~/siltpoke/.antigravity-plugin`.
2. Read `PLUGIN_ROOT/skills/siltpoke/SKILL.md`.
3. Follow its sections **"Resolve the plugin root first"** and **"Create your pet (first-time setup)"** exactly. It asks me Express or Custom — let me choose.
4. When it finishes, tell me the result in plain words. If it fails, translate the error and stop.

## Step 4 — The menu-bar pet (Siltpoke + Mac only)

With this install, agy has no terminal pet (statusline) — so on a Mac, the menu bar is the one place you see Siltpoke without opening anything. Explain it in two sentences and ask if I want it:

- **The menu-bar pet** sits in the Mac's top menu bar and shows **all your sessions at once** — every project, and every coding tool Siltpoke watches (agy, and Claude Code or Codex if you use them too). You see it all the time, even with every terminal closed. The number next to it is how many sessions have a recent review (not a count of problems). Click it for a list: one line per session (project · branch · time · which coding tool wrote the code) with its latest review, plus "Open dashboard" and "Restart daemon". It refreshes once a minute.
- (A **terminal pet** — the bottom line of Claude Code — shows only the current session and changes after every turn. agy can show one too, but only with Siltpoke's from-source install, which this prompt does not use.)

If I say yes:
1. It needs the free app SwiftBar. Check with `ls /Applications/SwiftBar.app`. If it is missing, ask me: install with `brew install --cask swiftbar` (only if `brew --version` works), or let me download it from https://github.com/swiftbar/SwiftBar. Then open it once: `open -a SwiftBar` (the first time, it asks me to pick a plugin folder — accept the default).
2. Run `"$BUN" "$PLUGIN_ROOT/dist/siltpoke-cli.js" menubar install`, then `… menubar status`, and tell me in one sentence what it said.

## Step 5 — PLC needs no global setup (skip if I did not pick it)

Tell me: PLC is set up **per project**, not once for the whole machine. There is no `/init-harness` command in agy — instead, inside a project I say "set up this project with project-lifecycle", and the skill looks at the code, writes a few project files, and asks before overwriting anything. Do **not** do it now.

## Step 6 — The one thing I must do myself

Tell me clearly: **quit agy and start it again now.** New skills and the review hook only load then.

One limit to mention: reviews do not run in headless `agy -p` mode with this install — only in normal interactive sessions.

## Step 7 — Getting started: my first day

Before I restart, print this walkthrough in my language, only the parts for what I installed, filled with my real results. Make it a numbered list I can follow step by step. In agy everything is said in plain words — give me the exact sentence to say. Do not invent features that are not listed here.

**Siltpoke — first 10 minutes**
1. Say: "check my Siltpoke install". You get a ✓/✗ checklist. All ✓ means it works. If something is ✗, it says what to do.
2. Ask agy for any small real change (for example: "add a comment explaining this function"). When agy finishes, Siltpoke reviews the change in the background — agy does not wait for it.
3. On a Mac with the menu-bar pet, the menu bar shows the new review within a minute.
4. Say: "show me the latest Siltpoke review".
5. Say: "open the Siltpoke dashboard". It opens http://127.0.0.1:9876 — review history, chat with your pet about your code, what it remembers, and the Code Map. On a review, press **ACK** (seen, useful) or **DISMISS** (wrong). This is how it learns what to stop saying.
6. Need quiet? Say "mute Siltpoke for 1 hour", and "unmute Siltpoke" to undo.

Good to know: if you pick a Claude model inside agy, the reviewer is also Claude — Claude reviewing Claude, so it can share the same blind spots.

**PLC — your first project**
1. Inside a project, say: "set up this project with project-lifecycle". Answer its questions.
2. Talk about the code first, no edits: "explain how this project is structured."
3. Build one small feature: "use project-lifecycle to ship <what you want>". It stops to check with you at the user story, the spec, and the pull request.
4. Stopping for the day? Say "hand off — save where we are to RESUME.md".
5. Next time, say "catch me up from RESUME.md".

**Both together — a normal day:** catch me up → build → Siltpoke reviews each turn in the background → "show me the latest Siltpoke review" → hand off.

## Step 8 — Keep using it

Print this right after the first-day walkthrough, in my language, only the parts for what I installed. It is how I use the plugins every day after the first one.

**Siltpoke, every day**
1. Just work. Siltpoke reviews each turn by itself — you never have to start it.
2. When the pet looks worried (or the menu-bar number goes up), read the review: say "show me the latest Siltpoke review".
3. Teach it. In the dashboard (say "open the Siltpoke dashboard"), press **DISMISS** on a review that is wrong and **ACK** on one that helped. It remembers, and over time stops repeating what you dismissed.
4. Once a week, look at the dashboard's Memory page — that is what it has learned about your code.
5. Reviews went quiet? say "check my Siltpoke install" first; if everything is ✓, say "wake Siltpoke".
6. Busy (a demo, pairing)? say "mute Siltpoke for 1 hour" — it turns itself back on when the time is up.

**PLC, every session**
1. Start: say "catch me up from RESUME.md" — where you left off, what shipped, what is next.
2. New feature: say "use project-lifecycle to ship <what you want>".
3. A design question you are not sure about: say "research <question> with project-lifecycle" — it comes back with cited sources.
4. Before merging a branch: say "review this branch with project-lifecycle".
5. End: say "hand off — save where we are to RESUME.md". The next session starts again at item 1.
6. Ready to publish a version: say "cut a release with project-lifecycle".

**Keep it current:** `git -C ~/siltpoke pull && cd ~/siltpoke && bun install && bun run build:dist && agy plugin install ~/siltpoke/.antigravity-plugin` · PLC: `git -C ~/plugins/project-life-cycle pull && agy plugin install ~/plugins/project-life-cycle`. Then restart agy.

## Step 9 — The manual

End with this, in my language, only the rows for what I installed:

| | Status |
|---|---|
| Project Life Cycle | installed — version from `agy plugin list` |
| Siltpoke | installed — version, pet name + species |
| Bun | version (and its path) |
| Menu-bar pet | installed / not installed / not a Mac |
| **Still to do** | restart agy → "check my Siltpoke install" (Siltpoke) · "set up this project with project-lifecycle" (PLC) |

Siltpoke, things to say: check my install · show the latest review · open the dashboard · mute for <time> / unmute · menu-bar pet install / status / remove · show the Siltpoke manual. Not available in a plugin install (they need Siltpoke's source scripts): listing or dismissing reviews from the chat, `remember`, and indexing a repo for the Code Map from the chat — use the dashboard for reviews.

Cost: the review runs a separate model call through a CLI you are already logged into — no extra account. Reviews are saved on your machine; nothing is sent anywhere except the normal model call and a once-a-day check with GitHub for the latest version number — that check sends nothing about you or your code, and Siltpoke receives nothing. Turn it off with `"updateCheck": {"enabled": false}` in `~/.siltpoke/config.json`.

Want the other plugin later? Paste this same prompt again — it only adds what is missing.

CodeBuddy

贴进 CodeBuddy。

You are installing CodeBuddy plugins for me, setting them up, and then teaching me to use them. Talk to me in the language I am writing in. Keep each message short. **Ask me before anything that downloads and runs a script, installs an app, or changes my shell profile or config files.**

There are two plugins. They are independent — I can have one, the other, or both:
- **Siltpoke** — a second reviewer that watches my coding sessions. After each turn, a *separate* AI process reads what changed and writes down what it thinks was missed. It remembers bugs across sessions, and it has a dashboard and a small pet. Repo: https://github.com/Siltpoke/siltpoke
- **Project Life Cycle (PLC)** — a working method for AI coding: spec → plan → build → verify → ship → release. Repo: https://github.com/Siltpoke/project-life-cycle

## Before anything — am I on Windows?

Run `uname -s`. If it fails, or prints anything that is not `Darwin` or `Linux`
(on Windows it will not exist, or a Git-Bash shell prints `MINGW64_NT-...`),
**stop here and tell me this, in my language, before installing anything:**

> Siltpoke does not support native Windows yet. It will install, the pet will
> appear, the commands will work and the config will say the setup is fine —
> but the review hook is registered as `sh ./hooks/stop.sh`, Windows has no
> `sh`, so no review will ever run and nothing will say so. If you have WSL,
> run this again inside WSL and everything works, because that is Linux.
> Otherwise, wait for native Windows support.

Then ask whether I want to continue anyway. **Do not install unless I say yes**,
and if I do, say once more that reviews will not fire. Project Life Cycle has no
such problem — it is prompts and commands, no hook — so offer to install only
PLC instead.

## Step 0 — What do I already have, and what do I want?

Run `codebuddy plugin list` first (if that subcommand is not available, tell me to open the `/plugin` screen and read you the **Installed** tab). Then:
- If one of them is already installed, say so in one line ("you already have PLC — this time I'll only add Siltpoke") and skip its install.
- For anything not installed yet, ask me once: **both / only Siltpoke / only PLC**. Recommend "both" in one sentence, but do what I pick. Every later step applies only to what I picked.

## Step 1 — Check the tools

Run these and tell me in one line each what you found:
- `codebuddy --version`, `git --version`, `uname -s` (a Mac? only matters for the menu-bar pet in Step 4)
- Siltpoke only: `bun --version`. Siltpoke's reviewer runs on Bun. If it is missing, **ask me first**, then run `curl -fsSL https://bun.sh/install | bash` and check again with `~/.bun/bin/bun --version` (my shell will not see the new PATH until it restarts — that is fine, setup records the full path).

## Step 2 — Install

Run one line at a time. If any line fails, stop and show me the exact error.

```bash
# Siltpoke
codebuddy plugin marketplace add https://github.com/Siltpoke/siltpoke
codebuddy plugin install siltpoke@siltpoke

# PLC
codebuddy plugin marketplace add https://github.com/Siltpoke/project-life-cycle
codebuddy plugin install project-lifecycle@project-life-cycle
```

The `@…` part is required — a bare `codebuddy plugin install siltpoke` fails with `Marketplace 'undefined' is not ready`. If the PLC lines fail as a command-line call, tell me to type these two inside CodeBuddy instead: `/plugin marketplace add Siltpoke/project-life-cycle` and `/plugin install project-lifecycle@project-life-cycle`.

Then confirm each one I picked shows as installed. Do not claim success from the install output alone.

## Step 3 — Set up Siltpoke (skip if I did not pick it)

Reviews do not start until a pet exists at `~/.siltpoke/config.json`. If that file already exists, setup was done before: say so, ask if I want to redo it, and skip to Step 4 if not.

CodeBuddy installs the same plugin files as Claude Code, so the setup instructions are on disk:
1. Find them: `find ~/.codebuddy -name siltpoke-setup.md 2>/dev/null | head -1` (if nothing, try `find ~ -maxdepth 6 -name siltpoke-setup.md -path '*siltpoke*' 2>/dev/null | head -1`). The plugin folder, `PLUGIN_ROOT`, is the folder that contains `.claude-plugin/`. Check that `PLUGIN_ROOT/dist/siltpoke-cli.js` exists.
2. Read that `siltpoke-setup.md` and follow it exactly. Wherever it says `${CLAUDE_PLUGIN_ROOT}`, use the real `PLUGIN_ROOT`. If `bun` is not on PATH yet, use `~/.bun/bin/bun`. Where it says "restart Claude Code", say "restart CodeBuddy".
3. It first asks me **Express** or **Custom** — let me choose.
4. When it finishes, tell me the result in plain words. If it fails, translate the error and stop.

## Step 4 — The menu-bar pet (Siltpoke + Mac only)

If setup already offered the menu-bar pet and I answered, skip this step. Otherwise explain it in two sentences and ask if I want it:

- **The menu-bar pet** sits in the Mac's top menu bar and shows **all your sessions at once** — every project, and every coding tool Siltpoke watches. You see it all the time, even with every terminal closed. The number next to it is how many sessions have a recent review (not a count of problems). Click it for a list: one line per session (project · branch · time · which coding tool wrote the code) with its latest review, plus "Open dashboard" and "Restart daemon". It refreshes once a minute.
- The difference from the **terminal pet** (the bottom line of Claude Code): that one shows only the current session and changes after every turn.

If I say yes:
1. It needs the free app SwiftBar. Check with `ls /Applications/SwiftBar.app`. If it is missing, ask me: install with `brew install --cask swiftbar` (only if `brew --version` works), or let me download it from https://github.com/swiftbar/SwiftBar. Then open it once: `open -a SwiftBar` (the first time, it asks me to pick a plugin folder — accept the default).
2. Run `bun "PLUGIN_ROOT/dist/siltpoke-cli.js" menubar install`, then `… menubar status`, and tell me in one sentence what it said.

## Step 5 — PLC needs no global setup (skip if I did not pick it)

Tell me: PLC is set up **per project**, not once for the whole machine. Inside a project I either type `/init-harness` (if CodeBuddy shows it) or say "set up this project with project-lifecycle". It looks at the code, writes a few project files, and asks before overwriting anything. Do **not** do it now.

## Step 6 — The one thing I must do myself

Tell me clearly: **run `/reload-plugins` in CodeBuddy, or quit and start it again, now.** The plugins and the review hook only load then. Then ask me to type `/siltpoke-` and tell you whether commands show up — that decides which column of Step 7 I use.

## Step 7 — Getting started: my first day

Before I reload, print this walkthrough in my language, only the parts for what I installed, filled with my real results. Make it a numbered list. For each step give both forms — **the slash command** (if CodeBuddy shows `/siltpoke-…` commands) **or the sentence to say**. Do not invent features that are not listed here.

**Siltpoke — first 10 minutes**
1. `/siltpoke-doctor` or "check my Siltpoke install". You get a ✓/✗ checklist. All ✓ means it works. If something is ✗, it says what to do.
2. Ask CodeBuddy for any small real change (for example: "add a comment explaining this function"). When it finishes, Siltpoke reviews the change in the background. You do not need to do anything.
3. On a Mac with the menu-bar pet, the menu bar shows the new review within a minute.
4. `/siltpoke-last` or "show me the latest Siltpoke review".
5. `/siltpoke-dashboard` or "open the Siltpoke dashboard". It opens http://127.0.0.1:9876 — review history, chat with your pet about your code, what it remembers, and the Code Map. On a review, press **ACK** (seen, useful) or **DISMISS** (wrong). This is how it learns what to stop saying.
6. Need quiet? `/siltpoke-mute 1h` or "mute Siltpoke for 1 hour"; `/siltpoke-unmute` or "unmute Siltpoke" to undo.

**PLC — your first project**
1. Inside a project: `/init-harness` or "set up this project with project-lifecycle". Answer its questions.
2. Talk about the code first, no edits: "explain how this project is structured."
3. Build one small feature: `/ship <what you want>` or "use project-lifecycle to ship <what you want>". It stops to check with you at the user story, the spec, and the pull request.
4. Stopping for the day? `/handoff` or "hand off — save where we are to RESUME.md".
5. Next time: `/catchup` or "catch me up from RESUME.md".

**Both together — a normal day:** catch up → build → Siltpoke reviews each turn in the background → read the latest review when you want → hand off.

## Step 8 — Keep using it

Print this right after the first-day walkthrough, in my language, only the parts for what I installed. It is how I use the plugins every day after the first one.

**Siltpoke, every day**
1. Just work. Siltpoke reviews each turn by itself — you never have to start it.
2. When the pet looks worried (or the menu-bar number goes up), read the review: `/siltpoke-last` or "show me the latest Siltpoke review".
3. Teach it. In the dashboard (`/siltpoke-dashboard` or "open the Siltpoke dashboard"), press **DISMISS** on a review that is wrong and **ACK** on one that helped. It remembers, and over time stops repeating what you dismissed.
4. Once a week, look at the dashboard's Memory page — that is what it has learned about your code.
5. Reviews went quiet? `/siltpoke-doctor` or "check my Siltpoke install" first; if everything is ✓, `/siltpoke-wake` or "wake Siltpoke".
6. Busy (a demo, pairing)? `/siltpoke-mute 1h` or "mute Siltpoke for 1 hour" — it turns itself back on when the time is up.

**PLC, every session**
1. Start: `/catchup` or "catch me up from RESUME.md" — where you left off, what shipped, what is next.
2. New feature: `/ship <what you want>` or "use project-lifecycle to ship <what you want>".
3. A design question you are not sure about: `/research <question>` or "research <question> with project-lifecycle" — it comes back with cited sources.
4. Before merging a branch: `/review` or "review this branch with project-lifecycle".
5. End: `/handoff` or "hand off — save where we are to RESUME.md". The next session starts again at item 1.
6. Ready to publish a version: `/release` or "cut a release with project-lifecycle".

**Keep it current:** inside CodeBuddy, `/plugin marketplace update siltpoke` and `/plugin marketplace update project-life-cycle`, then `/reload-plugins`.

## Step 9 — The manual

End with this, in my language, only the rows for what I installed:

| | Status |
|---|---|
| Project Life Cycle | installed — version |
| Siltpoke | installed — version, pet name + species |
| Bun | version (and its path) |
| Menu-bar pet | installed / not installed / not a Mac |
| Slash commands in CodeBuddy | yes / no (from Step 6) |
| **Still to do** | reload → check the Siltpoke install · set up a project with PLC |

Cost: the review runs a separate model call through a CLI you are already logged into — no extra account. Reviews are saved on your machine; nothing is sent anywhere except the normal model call and a once-a-day check with GitHub for the latest version number — that check sends nothing about you or your code, and Siltpoke receives nothing. Turn it off with `"updateCheck": {"enabled": false}` in `~/.siltpoke/config.json`.

Want the other plugin later? Paste this same prompt again — it only adds what is missing.

Qoder

贴进 Qoder(qodercli)。

You are installing Qoder plugins for me, setting them up, and then teaching me to use them. Talk to me in the language I am writing in. Keep each message short. **Ask me before anything that downloads and runs a script, installs an app, or changes my shell profile or config files.**

There are two plugins. They are independent — I can have one, the other, or both:
- **Siltpoke** — a second reviewer that watches my coding sessions. After each turn, a *separate* AI process reads what changed and writes down what it thinks was missed. It remembers bugs across sessions, and it has a dashboard and a small pet. Repo: https://github.com/Siltpoke/siltpoke
- **Project Life Cycle (PLC)** — a working method for AI coding: spec → plan → build → verify → ship → release. Repo: https://github.com/Siltpoke/project-life-cycle

## Before anything — am I on Windows?

Run `uname -s`. If it fails, or prints anything that is not `Darwin` or `Linux`
(on Windows it will not exist, or a Git-Bash shell prints `MINGW64_NT-...`),
**stop here and tell me this, in my language, before installing anything:**

> Siltpoke does not support native Windows yet. It will install, the pet will
> appear, the commands will work and the config will say the setup is fine —
> but the review hook is registered as `sh ./hooks/stop.sh`, Windows has no
> `sh`, so no review will ever run and nothing will say so. If you have WSL,
> run this again inside WSL and everything works, because that is Linux.
> Otherwise, wait for native Windows support.

Then ask whether I want to continue anyway. **Do not install unless I say yes**,
and if I do, say once more that reviews will not fire. Project Life Cycle has no
such problem — it is prompts and commands, no hook — so offer to install only
PLC instead.

## Step 0 — What do I already have, and what do I want?

Run `qodercli plugin list` first (if it errors, try `qodercli plugins list`). Then:
- If one of them is already installed, say so in one line ("you already have PLC — this time I'll only add Siltpoke") and skip its install.
- For anything not installed yet, ask me once: **both / only Siltpoke / only PLC**. Recommend "both" in one sentence, but do what I pick. Every later step applies only to what I picked.

## Step 1 — Check the tools

Run these and tell me in one line each what you found:
- `qodercli --version`, `git --version`, `uname -s` (a Mac? only matters for the menu-bar pet in Step 4)
- Siltpoke only: `bun --version`. Siltpoke's reviewer runs on Bun. If it is missing, **ask me first**, then run `curl -fsSL https://bun.sh/install | bash` and check again with `~/.bun/bin/bun --version` (my shell will not see the new PATH until it restarts — that is fine, setup records the full path).

## Step 2 — Install

Run one line at a time. If any line fails, stop and show me the exact error.

```bash
# Siltpoke
qodercli plugin marketplace add https://github.com/Siltpoke/siltpoke
qodercli plugin install siltpoke@siltpoke

# PLC
qodercli plugins marketplace add Siltpoke/project-life-cycle
qodercli plugins install project-lifecycle
```

For Siltpoke the `@siltpoke` part is required — a bare install fails. If a line fails with an unknown-command error, try the same line with `plugin` ↔ `plugins` swapped, and tell me which form worked.

Then confirm each one I picked shows as installed. Do not claim success from the install output alone.

## Step 3 — Set up Siltpoke (skip if I did not pick it)

Reviews do not start until a pet exists at `~/.siltpoke/config.json`. If that file already exists, setup was done before: say so, ask if I want to redo it, and skip to Step 4 if not.

Qoder installs the same plugin files as Claude Code, so the setup instructions are on disk:
1. Find them: `find ~/.qoder -name siltpoke-setup.md 2>/dev/null | head -1` (if nothing, try `find ~ -maxdepth 6 -name siltpoke-setup.md -path '*siltpoke*' 2>/dev/null | head -1`). The plugin folder, `PLUGIN_ROOT`, is the folder that contains `.claude-plugin/`. Check that `PLUGIN_ROOT/dist/siltpoke-cli.js` exists.
2. Read that `siltpoke-setup.md` and follow it exactly. Wherever it says `${CLAUDE_PLUGIN_ROOT}`, use the real `PLUGIN_ROOT`. If `bun` is not on PATH yet, use `~/.bun/bin/bun`. Where it says "restart Claude Code", say "restart Qoder".
3. It first asks me **Express** or **Custom** — let me choose.
4. When it finishes, tell me the result in plain words. If it fails, translate the error and stop.

## Step 4 — The menu-bar pet (Siltpoke + Mac only)

If setup already offered the menu-bar pet and I answered, skip this step. Otherwise explain it in two sentences and ask if I want it:

- **The menu-bar pet** sits in the Mac's top menu bar and shows **all your sessions at once** — every project, and every coding tool Siltpoke watches. You see it all the time, even with every terminal closed. The number next to it is how many sessions have a recent review (not a count of problems). Click it for a list: one line per session (project · branch · time · which coding tool wrote the code) with its latest review, plus "Open dashboard" and "Restart daemon". It refreshes once a minute.
- The difference from the **terminal pet** (the bottom line of Claude Code): that one shows only the current session and changes after every turn.

If I say yes:
1. It needs the free app SwiftBar. Check with `ls /Applications/SwiftBar.app`. If it is missing, ask me: install with `brew install --cask swiftbar` (only if `brew --version` works), or let me download it from https://github.com/swiftbar/SwiftBar. Then open it once: `open -a SwiftBar` (the first time, it asks me to pick a plugin folder — accept the default).
2. Run `bun "PLUGIN_ROOT/dist/siltpoke-cli.js" menubar install`, then `… menubar status`, and tell me in one sentence what it said.

## Step 5 — PLC needs no global setup (skip if I did not pick it)

Tell me: PLC is set up **per project**, not once for the whole machine. Inside a project I either type `/init-harness` (if Qoder shows it) or say "set up this project with project-lifecycle". It looks at the code, writes a few project files, and asks before overwriting anything. Do **not** do it now.

## Step 6 — The one thing I must do myself

Tell me clearly: **run `/plugins reload` in Qoder, or quit and start it again, now.** The plugins and the review hook only load then. Then ask me to type `/siltpoke-` and tell you whether commands show up — that decides which column of Step 7 I use.

## Step 7 — Getting started: my first day

Before I reload, print this walkthrough in my language, only the parts for what I installed, filled with my real results. Make it a numbered list. For each step give both forms — **the slash command** (if Qoder shows `/siltpoke-…` commands) **or the sentence to say**. Do not invent features that are not listed here.

**Siltpoke — first 10 minutes**
1. `/siltpoke-doctor` or "check my Siltpoke install". You get a ✓/✗ checklist. All ✓ means it works. If something is ✗, it says what to do.
2. Ask Qoder for any small real change (for example: "add a comment explaining this function"). When it finishes, Siltpoke reviews the change in the background. You do not need to do anything.
3. On a Mac with the menu-bar pet, the menu bar shows the new review within a minute.
4. `/siltpoke-last` or "show me the latest Siltpoke review".
5. `/siltpoke-dashboard` or "open the Siltpoke dashboard". It opens http://127.0.0.1:9876 — review history, chat with your pet about your code, what it remembers, and the Code Map. On a review, press **ACK** (seen, useful) or **DISMISS** (wrong). This is how it learns what to stop saying.
6. Need quiet? `/siltpoke-mute 1h` or "mute Siltpoke for 1 hour"; `/siltpoke-unmute` or "unmute Siltpoke" to undo.

**PLC — your first project**
1. Inside a project: `/init-harness` or "set up this project with project-lifecycle". Answer its questions.
2. Talk about the code first, no edits: "explain how this project is structured."
3. Build one small feature: `/ship <what you want>` or "use project-lifecycle to ship <what you want>". It stops to check with you at the user story, the spec, and the pull request.
4. Stopping for the day? `/handoff` or "hand off — save where we are to RESUME.md".
5. Next time: `/catchup` or "catch me up from RESUME.md".

**Both together — a normal day:** catch up → build → Siltpoke reviews each turn in the background → read the latest review when you want → hand off.

## Step 8 — Keep using it

Print this right after the first-day walkthrough, in my language, only the parts for what I installed. It is how I use the plugins every day after the first one.

**Siltpoke, every day**
1. Just work. Siltpoke reviews each turn by itself — you never have to start it.
2. When the pet looks worried (or the menu-bar number goes up), read the review: `/siltpoke-last` or "show me the latest Siltpoke review".
3. Teach it. In the dashboard (`/siltpoke-dashboard` or "open the Siltpoke dashboard"), press **DISMISS** on a review that is wrong and **ACK** on one that helped. It remembers, and over time stops repeating what you dismissed.
4. Once a week, look at the dashboard's Memory page — that is what it has learned about your code.
5. Reviews went quiet? `/siltpoke-doctor` or "check my Siltpoke install" first; if everything is ✓, `/siltpoke-wake` or "wake Siltpoke".
6. Busy (a demo, pairing)? `/siltpoke-mute 1h` or "mute Siltpoke for 1 hour" — it turns itself back on when the time is up.

**PLC, every session**
1. Start: `/catchup` or "catch me up from RESUME.md" — where you left off, what shipped, what is next.
2. New feature: `/ship <what you want>` or "use project-lifecycle to ship <what you want>".
3. A design question you are not sure about: `/research <question>` or "research <question> with project-lifecycle" — it comes back with cited sources.
4. Before merging a branch: `/review` or "review this branch with project-lifecycle".
5. End: `/handoff` or "hand off — save where we are to RESUME.md". The next session starts again at item 1.
6. Ready to publish a version: `/release` or "cut a release with project-lifecycle".

**Keep it current:** `qodercli plugins marketplace update project-life-cycle` then `qodercli plugins update project-lifecycle` (the same pair with `siltpoke` for Siltpoke), then `/plugins reload`.

## Step 9 — The manual

End with this, in my language, only the rows for what I installed:

| | Status |
|---|---|
| Project Life Cycle | installed — version |
| Siltpoke | installed — version, pet name + species |
| Bun | version (and its path) |
| Menu-bar pet | installed / not installed / not a Mac |
| Slash commands in Qoder | yes / no (from Step 6) |
| **Still to do** | reload → check the Siltpoke install · set up a project with PLC |

Cost: the review runs a separate model call through a CLI you are already logged into — no extra account. Reviews are saved on your machine; nothing is sent anywhere except the normal model call and a once-a-day check with GitHub for the latest version number — that check sends nothing about you or your code, and Siltpoke receives nothing. Turn it off with `"updateCheck": {"enabled": false}` in `~/.siltpoke/config.json`.

Want the other plugin later? Paste this same prompt again — it only adds what is missing.

What Project Life Cycle is

Project Life Cycle is an AI-native software development lifecycle: it carries a project from a fuzzy idea to something delivered, and keeps execution pointed at what you actually meant.

idea → intent alignment → spec / stories → plan → execution → test → PR → merge

It is not a project manager, and it is not a memory system. It is the process spine around the turns your coding agent takes.

You do not need the answers yet

A run can start from almost nothing:

  • "I wish this app did this."
  • "Something about this product annoys me."
  • "I think the market is missing a thing."
  • "I have an idea but no idea how to build it."

From there it can brainstorm, research, cross-reference, review what it found, narrow the idea down, clarify the intent, and turn that into user stories, a spec, and a plan.

The point is not that AI decides for you. The point is that you do not have to arrive with every answer — AI can find and organise the material, and you still decide what to build.

Who does what

You bring the idea, clarify the intent, choose the direction, approve the plan and its scope, make the tradeoffs, accept the result, and decide what ships.

The coding agent does the brainstorming, research, cross-referencing, spec and plan drafting, the implementation, the iteration, the tests, the smoke test, and the PR.

You are not there to babysit the agent. You come back at three moments:

when the question
at the start what am I actually trying to build?
at a real decision scope, intent or direction is changing — which way?
at the end is this something I am willing to ship?

AI can suggest. AI can execute. Humans decide.

That boundary is a design choice about where responsibility sits, not a claim that AI is not smart enough.

Verifying before you accept

There are two ways to smoke-test what came back: automated, using Playwright, or guided, where Project Life Cycle walks you through checking it yourself. Either way, deciding whether the result is acceptable stays with you.

The problem it exists for

A single turn is easy: you describe it, the agent implements it, done. A maintainable project takes more than one turn.

Real projects run for days, weeks, months. The idea evolves. The plan changes. Decisions pile up. Implementation drifts. A feature built in week one stops fitting by week five. You may switch coding agents. Context scatters.

So the longer a project runs, the more there is to keep aligned: the intent, the decisions, the progress, what has been built, what comes next, and why the earlier calls were made. Preserving that — and noticing when the work drifts away from it — is what Project Life Cycle is for.

How it relates to Siltpoke

Two halves of one idea, not two side projects.

  • Siltpoke — long-term understanding: review, memory, observability, and a companion that accumulates what it knows about the project and about you.
  • Project Life Cycle — the lifecycle: intent alignment, planning, execution orchestration, drift detection, continuity of progress.

Between them they answer one question: how does long-running AI development stay coherent, maintainable, and under human control?

Neither requires the other. They are better together.

Install

Project Life Cycle is an independent skill. Siltpoke does not require it, and it does not require Siltpoke — install whichever you want, or both.

Quickest route: copy an agent prompt into your agent and it installs everything for you — see Install with an agent prompt. The sections below are the same install, one step at a time.

You need a coding agent first. It runs in five of them; there is a section for each below, so go to the one you use.

One difference is worth knowing up front: Claude Code, CodeBuddy and Qoder install straight from GitHub, while Codex and Antigravity need a local checkout first and install from that path.

Claude Code

It is a plugin, installed from inside Claude Code:

claude plugin marketplace add Siltpoke/project-life-cycle
claude plugin install project-lifecycle@project-life-cycle

Restart Claude Code. It loads on its own when you start a project or plan a milestone — there is no wizard to run and nothing to configure first.

Update it later with:

claude plugin marketplace update project-life-cycle
claude plugin update project-lifecycle

Uninstall: claude plugin uninstall project-lifecycle@project-life-cycle.

Codex

Codex only installs plugins from a configured marketplace, so this is three steps — clone, register, install.

Clone the repo to ~/plugins/project-lifecycle (or clone elsewhere and symlink it there):

git clone https://github.com/Siltpoke/project-life-cycle.git ~/plugins/project-lifecycle

Add this entry to ~/.agents/plugins/marketplace.json:

{
  "name": "project-lifecycle",
  "source": {
    "source": "local",
    "path": "./plugins/project-lifecycle"
  },
  "policy": {
    "installation": "AVAILABLE",
    "authentication": "ON_INSTALL"
  },
  "category": "Productivity"
}

Then install it — what follows @ is your own marketplace's name, not a fixed value:

codex plugin add project-lifecycle@<your-marketplace-name>

Start a new Codex thread afterwards so the skill metadata loads. Claude Code hooks and slash commands are Claude-specific; Codex reads the skill instructions and the bundled references.

To update after local edits:

python3 ~/.codex/skills/.system/plugin-creator/scripts/validate_plugin.py ~/plugins/project-lifecycle
python3 ~/.codex/skills/.system/plugin-creator/scripts/update_plugin_cachebuster.py ~/plugins/project-lifecycle
codex plugin add project-lifecycle@<your-marketplace-name>

The middle step rewrites the version in .codex-plugin/plugin.json (say 0.11.0 to 0.11.0+codex.20260904120000), which forces Codex to refresh its cached copy of the plugin. Start a new thread again afterwards.

Antigravity

Antigravity (agy) installs from a local path only, so clone it first:

git clone https://github.com/Siltpoke/project-life-cycle.git
agy plugin install /path/to/project-life-cycle

Check that it landed:

agy plugin list

After local edits, re-run the same install command — it force-reinstalls from the path.

CodeBuddy

CodeBuddy understands ${CLAUDE_PLUGIN_ROOT}, so it runs the same hooks Claude Code does.

These two are slash commands, typed inside the CodeBuddy TUI — not in your shell:

/plugin marketplace add Siltpoke/project-life-cycle
/plugin install project-lifecycle@project-life-cycle

Run /reload-plugins (or restart) to load the skill. Installed plugins are managed from the Installed tab of /plugin.

You can also load a local checkout directly, and this one IS a shell command:

codebuddy --plugin-dir /path/to/project-life-cycle

Update later, in the TUI: /plugin marketplace update project-life-cycle. Uninstall: /plugin marketplace remove project-life-cycle.

Qoder

Register the marketplace, then install by name:

qodercli plugins marketplace add Siltpoke/project-life-cycle
qodercli plugins install project-lifecycle

Or install straight from a local checkout:

qodercli plugins install /path/to/project-life-cycle

Restart the CLI, or run /plugins reload in the TUI, to load the skill.

Update later:

qodercli plugins marketplace update project-life-cycle
qodercli plugins update project-lifecycle

Uninstall: qodercli plugins uninstall project-lifecycle.

First run

Installing it changes nothing you can see. There is no setup wizard and nothing new on screen. Project Life Cycle is a set of instructions your agent picks up when the work calls for it — starting a project, planning a milestone, building a feature. A one-line fix or a settings tweak is deliberately left alone, so if the first thing you try is small, it is normal that nothing happens.

To actually start:

  1. Open your agent inside a project folder, not your home folder. It works in a git repository; starting from nothing, make a folder and run git init (or let the next step offer it).
  2. Set the project up once: /init-harness. It reads what is already there and writes the files the rest of the workflow relies on — CLAUDE.md, RESUME.md, a journal, a changelog. It stops for your OK four times and never overwrites a file without asking.
  3. Say what you want to build. An idea is enough — "I want users to be able to export their data." It asks what you are trying to achieve before writing any code. For one feature end to end, /ship <feature>.

If your agent doesn't offer the slash commands (Codex, for example), say it in plain words — "set this project up with Project Life Cycle". And if it skipped something you wanted it on, ask directly: "use the project-lifecycle skill". In Claude Code, if a bare /init-harness collides with another plugin's command, the full name is /project-lifecycle:init-harness.

Day to day

Once a project is set up, three commands carry the day-to-day:

  • /catchup — for starting. Coming back to a repo after a break, it tells you where you left off, what merged recently, and whether your saved state is stale.
  • /handoff — for stopping, and before a /clear. It writes the part git cannot recover into RESUME.md: what you are in the middle of, the next concrete step, and which approaches are already dead ends. This is what lets the next session pick up without re-deriving anything.
  • /reconcile — for squaring up. When decisions made in conversation have drifted from ROADMAP.md and the status doc, it lists the differences one by one and waits for you to approve each.

/catchup to start, work, /handoff to stop — those three are the loop. Everything else can wait.

The rest are on demand: /research for a standalone cited investigation, /review for the current branch's diff, /release to cut a version. The Commands chapter lists them all.

When you do want to change something, settings go in a CLAUDE.md, one per line. All sixteen are optional, and fifteen of them belong in your project root CLAUDE.md. These two are the ones most worth knowing about:

smoke-mode: guided        # AI walks you through acceptance step by step
                          # instead of handing you a checklist
comprehension: lite       # one "why" question per phase, so the understanding
                          # does not get quietly outsourced

The sixteenth is the exception: references-log belongs only in your own ~/.claude/CLAUDE.md, never a project CLAUDE.md — it points at a personal cross-project path, so committing it publishes your private directory layout.

Commands

Thirteen slash commands. You will use three or four of them most days; the rest are there when you need them.

Running work

command what it does
/ship Ships one vertical slice end to end — researcher → story → spec → build → acceptance → validate → fix loop → PR. Three points where you decide: the story, the spec, the PR.
/research Runs the research protocol on a single question outside a brainstorm and writes a cited report.
/review Reviews the current branch's diff (or a path you give it) against the reviewer brief — file:line evidence, refute-first.
/release Cuts a release: computes the SemVer bump from the changelog, renames the section, bumps manifests, validates, commits, tags, pushes, verifies. One confirmation.

Knowing where you are

command what it does
/catchup The welcome-back card after a /clear — where you are, what shipped, what you were doing, and whether your checkpoint is stale.
/recall Briefs the session from the most recent digest for this repo. Read-only; it never starts work.
/tasklist Renders the current phase's progress — the bar, and the one step in progress.

Keeping the thread

command what it does
/handoff Writes the mid-session continuity snapshot to RESUME.md — the state git cannot recover: current task, next action, what not to retry.
/reconcile Reconciles decisions made in conversation, and PRs merged since the last checkpoint, against the roadmap and status docs. Proposes edits; never commits them itself.
/capture Records a stated intent — the why — into the cognition log, and surfaces any earlier intent on the same subject.
/cognition-distill Regenerates the cognition doc from that log, reading the log rather than the previous doc.

Setup and self-knowledge

command what it does
/init-harness Bootstraps a project to use the skill: detects the stack, folder layout and tooling, then generates the config. Idempotent, four human checkpoints.
/builder-profile Reads your own local transcripts and writes a snapshot of how you actually work with a coding agent. Entirely local — nothing leaves the machine.

Where the gates are

/ship is the one to know, because it is the one that hands work to the agent for long stretches. It stops for you three times — at the story, at the spec, and at the PR — and runs unattended between them.

That is the shape of the whole thing: the agent works, and you keep the calls that decide what gets built.

Project Life Cycle 是什么

Project Life Cycle 是一套 AI 原生的软件开发生命周期:它把一个项目从模糊的想法一路带到交付,并在这个过程中让执行始终对着你真正想做的事。

想法 → 对齐意图 → spec / 用户故事 → 计划 → 执行 → 测试 → PR → 合并

它不是项目管理工具,也不是单纯的记忆系统。它是你的 coding agent 一轮轮工作外面的那根流程脊柱。

你不需要一开始就有答案

一次 run 可以从几乎什么都没有开始:

  • 「这个 app 要是能做到这个就好了。」
  • 「这个产品有个地方让我很烦。」
  • 「我觉得市场上缺一个东西。」
  • 「我有个 idea,但不知道怎么做。」

从这里出发,它可以帮你 brainstorm、查资料、交叉比对、审视找到的东西、把想法收窄、把意图理清,然后变成用户故事、spec 和计划。

重点不是 AI 替你决定。重点是你不必带着所有答案才能开始 —— AI 可以帮你找和整理材料,而做什么仍然由你定。

谁负责什么

你负责:带来想法、理清意图、选方向、批准计划和范围、做取舍、最终验收、决定什么可以交付。

coding agent 负责:brainstorm、查资料、交叉比对、起草 spec 和计划、写实现、迭代、跑测试、做 smoke test、准备 PR。

你不需要一直盯着它。你只在三个时刻回来:

什么时候 要回答的问题
开头 我到底想做的是什么?
关键决策点 范围、意图或方向要变了 —— 往哪走?
结尾 这个东西我愿意交付吗?

AI 可以建议,AI 可以执行,决定权在人。

这条边界是产品设计上关于「责任归谁」的选择,不是因为 AI 不够聪明。

验收之前

做完之后有两种 smoke test:自动的(用 Playwright),或者引导式的 —— Project Life Cycle 带着你自己走一遍。不管哪种,「这东西能不能接受」这个判断始终是你的。

它为什么存在

单轮很简单:你描述需求,agent 实现出来,完成。但可维护的项目,一轮交互远远不够。

真实项目会持续几天、几周、几个月。想法在变,计划在变,决策在累积,实现会漂移,第一周做的功能到第五周可能已经不合适,你可能换 coding agent,上下文散在各处。

所以项目跑得越久,需要保持一致的东西就越多:意图、决策、进度、已经做出了什么、接下来做什么、以及当初为什么那样定。把这些保住,并且在工作开始偏离时发现它 —— 这就是 Project Life Cycle 的活。

它和 Siltpoke 的关系

同一个想法的两半,不是两个各干各的项目。

  • Siltpoke —— 长期的理解:审查、记忆、可观测性,以及一个不断累积「它对项目和对你的了解」的伙伴。
  • Project Life Cycle —— 生命周期:对齐意图、规划、编排执行、发现漂移、延续进度。

两者合起来回答同一个问题:AI 参与得越来越多时,长周期开发怎么才能保持连贯、可维护、并且由人掌控。

谁都不依赖谁。放在一起更好用。

安装

Project Life Cycle 是一个独立的 skill。Siltpoke 不需要它,它也不需要 Siltpoke —— 你可以只装其中一个,也可以两个都装。

最省事的装法:复制一段 agent 提示词贴进你的 agent,它替你装好 —— 见用 agent 提示词安装。下面各节是同一套安装,一步一步来。

先得有一个 coding agent。五个都能跑,下面每个一节,找你在用的那个就行。

有一处差别值得先知道:Claude Code、CodeBuddy、Qoder 可以直接从 GitHub 装;Codex 和 Antigravity 得先把仓库克隆到本地,再从本地路径装。

Claude Code

它是一个 plugin,在 Claude Code 里面装:

claude plugin marketplace add Siltpoke/project-life-cycle
claude plugin install project-lifecycle@project-life-cycle

重启 Claude Code。你开始一个项目或规划一个 milestone 时它会自己加载 —— 没有向导要跑,也不用先配置什么。

以后更新:

claude plugin marketplace update project-life-cycle
claude plugin update project-lifecycle

卸载:claude plugin uninstall project-lifecycle@project-life-cycle。

Codex

Codex 只从「已配置的 marketplace」装插件,所以这个要三步 —— 先克隆,再登记,最后装。

先把仓库克隆到 ~/plugins/project-lifecycle(或者克隆到别处再软链过去):

git clone https://github.com/Siltpoke/project-life-cycle.git ~/plugins/project-lifecycle

然后把这一条加进 ~/.agents/plugins/marketplace.json:

{
  "name": "project-lifecycle",
  "source": {
    "source": "local",
    "path": "./plugins/project-lifecycle"
  },
  "policy": {
    "installation": "AVAILABLE",
    "authentication": "ON_INSTALL"
  },
  "category": "Productivity"
}

最后装上 —— @ 后面是你那个 marketplace 的名字,不是固定值:

codex plugin add project-lifecycle@<your-marketplace-name>

装完要开一个新的 Codex 线程,skill 的元数据才会加载。Claude Code 的 hook 和斜杠命令是 Claude 专有的,Codex 读的是 skill 说明和随附的参考文件。

本地改过之后要更新:

python3 ~/.codex/skills/.system/plugin-creator/scripts/validate_plugin.py ~/plugins/project-lifecycle
python3 ~/.codex/skills/.system/plugin-creator/scripts/update_plugin_cachebuster.py ~/plugins/project-lifecycle
codex plugin add project-lifecycle@<your-marketplace-name>

中间那步会改写 .codex-plugin/plugin.json 的版本号(比如 0.11.0 → 0.11.0+codex.20260904120000),逼 Codex 刷新它缓存的插件。然后同样要开新线程。

Antigravity

Antigravity(agy)只支持从本地路径装,所以先克隆:

git clone https://github.com/Siltpoke/project-life-cycle.git
agy plugin install /path/to/project-life-cycle

验证装上了:

agy plugin list

本地改过之后,重跑同一条 install 命令就是更新(它会强制重装)。

CodeBuddy

CodeBuddy 认 ${CLAUDE_PLUGIN_ROOT},所以和 Claude Code 用的是同一套 hook。

这两条是斜杠命令,在 CodeBuddy 的 TUI 里面输入,不是在终端里跑:

/plugin marketplace add Siltpoke/project-life-cycle
/plugin install project-lifecycle@project-life-cycle

跑 /reload-plugins(或者重启)加载 skill。装好的插件在 /plugin 的 Installed 标签里管。

也可以直接从本地克隆加载,这个是终端命令:

codebuddy --plugin-dir /path/to/project-life-cycle

以后更新(在 TUI 里):/plugin marketplace update project-life-cycle。卸载:/plugin marketplace remove project-life-cycle。

Qoder

登记 marketplace 再按名字装:

qodercli plugins marketplace add Siltpoke/project-life-cycle
qodercli plugins install project-lifecycle

或者直接从本地克隆装:

qodercli plugins install /path/to/project-life-cycle

重启 CLI,或者在 TUI 里跑 /plugins reload,加载 skill。

以后更新:

qodercli plugins marketplace update project-life-cycle
qodercli plugins update project-lifecycle

卸载:qodercli plugins uninstall project-lifecycle。

第一次用

装完之后,你看不到任何变化。 没有设置向导,屏幕上什么都不会多出来。Project Life Cycle 是一套指令,agent 碰到需要它的活儿才会拿出来用 —— 开一个新项目、规划一个里程碑、做一个功能。改一行代码、调一个设置这种小事,它是故意不管的。所以如果你装完先试了个小事,什么都没发生,这是正常的。

真正开始用:

  1. 在项目文件夹里打开 agent,别在你的用户主目录里。它要在 git 仓库里工作;如果是从零开始,先建一个文件夹、跑 git init(或者让下一步帮你提出来)。
  2. 给这个项目做一次初始化: /init-harness。它会先看项目里已经有什么,再写出后面整个流程要用到的文件 —— CLAUDE.md、RESUME.md、开发日志、changelog。中间会停下来等你确认四次,不问你就不会覆盖任何文件。
  3. 说你想做什么。 一个想法就够了 —— 「我想让用户能导出自己的数据」。它会先问清楚你想达成什么,再动手写代码。要把一个功能从头做到尾,用 /ship <功能>。

如果你的 agent 里没有这些斜杠命令(比如 Codex),直接用大白话说 —— 「用 Project Life Cycle 给这个项目做初始化」。如果它跳过了你想让它管的事,就直接说:「用 project-lifecycle 这个 skill」。在 Claude Code 里,如果 /init-harness 和别的插件的命令撞名了,完整的名字是 /project-lifecycle:init-harness。

日常使用

项目初始化好之后,日常真正撑起整件事的是三个命令:

  • /catchup —— 开工用。隔了一阵回到某个仓库,它告诉你上次停在哪、最近合了什么、存档是不是还新。
  • /handoff —— 收工用,或者 /clear 之前用。它把 git 记不住的那部分写进 RESUME.md:你正在做的是什么、下一步具体做什么、哪些路已经走死了不用再试。下次开工能接上,靠的是它。
  • /reconcile —— 对账用。聊天里定下来的事和 ROADMAP.md、状态文档对不上的时候,它把差异逐条列出来,一条一条等你批。

/catchup 开工 → 干活 → /handoff 收工,这三步是一个循环,别的都可以往后放。

其余的是按需的 —— 比如 /research 单独跑一次带引用的调研,/review 审当前分支的 diff,/release 发版本。全部命令在命令那一章。

想调的时候,配置一行一个写进 CLAUDE.md。十六个全是可选的 —— 其中十五个写在项目根目录的 CLAUDE.md,最可能想动的是这两个:

smoke-mode: guided        # 验收时 AI 一步步带你走,而不是甩给你一张清单
comprehension: lite       # 每个阶段问你一个「为什么」,防止脑子外包出去

剩下那一个是例外:references-log 只能写在你自己的 ~/.claude/CLAUDE.md 里,不能写进项目的 CLAUDE.md —— 它指向一个跨项目的个人路径,提交上去等于把私人目录结构公开了。

命令

十三个斜杠命令。你大部分日子只会用到其中三四个,剩下的需要时再说。

推进工作

命令 做什么
/ship 把一个纵向切片从头做到尾 —— 调研 → 用户故事 → spec → 构建 → 验收 → 校验 → 修复循环 → PR。三个地方停下来等你定:故事、spec、PR。
/research 在 brainstorm 之外针对单个问题跑调研流程,产出一份带引用的报告。
/review 按 reviewer brief 审查当前分支的 diff(或你指定的路径)—— 给 file:line 证据,先反驳后确认。
/release 发一个版本:从 changelog 算出 SemVer 该怎么跳、改章节名、更新各处 manifest、校验、提交、打标签、推送、核实。一次确认。

知道自己在哪

命令 做什么
/catchup /clear 之后的「欢迎回来」卡片 —— 你在哪、上了什么、之前在做什么、以及你的存档是不是过期了。
/recall 用这个仓库最近一次的 session 摘要给当前 session 做简报。只读,不会自己开工。
/tasklist 显示当前阶段的进度 —— 进度条,以及正在做的那一步。

把线接住

命令 做什么
/handoff 把会话中途的续接快照写进 RESUME.md —— 那些 git 恢复不了的状态:当前任务、下一步、什么不要重试。
/reconcile 把对话里做过的决定、以及上次存档之后合并的 PR,跟 roadmap 和状态文档对账。只提改动建议,不自己提交。
/capture 把一条说出口的意图 —— 那个「为什么」—— 记进 cognition log,并翻出同一主题下更早的意图。
/cognition-distill 从那份 log 重新生成 cognition 文档 —— 读的是 log,不是上一版文档。

初始化与自我认识

命令 做什么
/init-harness 把一个项目接进这套流程:识别技术栈、目录结构和工具链,然后生成配置。可重复运行,四个人工确认点。
/builder-profile 读你自己本地的会话记录,写出一份「你实际上是怎么用 coding agent 的」快照。全程本地,什么都不上传。

闸门在哪

/ship 是最该了解的一个,因为它是那个会把活交给 agent 长时间跑的命令。它会为你停三次 —— 故事、spec、PR —— 中间全程无人干预。

这就是整套东西的形状:agent 干活,而「做什么」的那几个判断留在你手里。

Overview

Siltpoke Review reads what your coding agent changed and tells you what it thinks of it — with the evidence it's basing that on.

It runs alongside the CLI coding agent you already use: Claude Code, Codex, Antigravity, CodeBuddy, or Qoder. It doesn't write code, it doesn't block a commit, and it doesn't touch your repo. It gives you a second read. What you do with it is up to you.

What it does

  • Reviews each finished piece of work. Not every message your agent sends — each commit that actually changes something. Or, if you prefer, the whole branch as it grows.
  • Shows its evidence. Before any model is involved, it collects the diff, your compiler and linter output, and the results of thirteen fixed checks. The review is asked to quote that material, and every quote is checked against it — so you can tell a grounded finding from a hunch.
  • Looks at what's around the change. Which other files call the code you touched, and which ones import it, go into the review alongside the diff.
  • Talks like itself. It's a small ASCII pet with a name, a species and five personality dials that set its tone — how sharp, how patient, how thorough, how talkative, how curious. It levels up as you work together. See The pet.
  • Can be reviewed by a different company's model. By default the model family that wrote the code also reviews it, in a separate process with its own instructions. One command hands the review to another family instead — Claude writes, Codex reviews. See Cross-family review.

How a review happens

1. It waits for a unit of work to close. Every time your agent finishes a turn, two things have to be true. There has to be a new commit that changed something — no new commit, or an amend that left the files identical, and it stays quiet. And the agent itself has to have edited those files in that turn: a commit you made in your own terminal, a git merge, a cherry-pick, are all left alone on purpose. A change that only touched documentation is skipped too. You can switch the unit from a commit to the whole branch (Configuration). Mute, quiet hours and the daily token budget also keep it quiet.

2. It collects the evidence first, without a model. The diff (the twenty most relevant chunks, source before tests before docs), TypeScript and ESLint results if your project uses them, ripgrep searches, and thirteen deterministic checks — oversized files and functions, missing tests, deep nesting, magic numbers and so on. None of this costs tokens.

3. A separate reviewer reads all of it. It runs as its own process under the login you already have for that agent, so there's no new account and no new API key. It writes the review in the language you picked and in your pet's voice, and it's told to adapt to the tone and depth you've said you prefer.

4. Every quote is checked. A quote that can't be found in the collected evidence is removed, and the review is labeled for how much of it held up — verified, partly unverified, or none verified. You always know which kind you're reading.

5. It lands on disk, never in your chat. Nothing is injected into the conversation. You see it on the pet in your statusline (Claude Code and Antigravity), in the macOS menu bar if you add it, and in the dashboard's review history. To bring one into the conversation, run /siltpoke-last.

The menu-bar pet (macOS)

The statusline pet only exists in Claude Code and Antigravity, and it only shows the session in front of you. The menu-bar pet covers the rest: one icon in the macOS menu bar for every project and every coding agent on the machine.

  • The icon is your pet's emoji and name, plus a number — how many recently active sessions have a review you haven't dealt with yet. It counts clean reviews too, so it tells you how much is going on, not how much is wrong.
  • Open it and there's a card for each session that was active in the last 30 minutes: the repo, the branch, and the start of its latest review. Click a card to open that review in the dashboard.
  • Below the cards: open the dashboard (it starts it if it isn't running), restart it, or refresh. The menu updates by itself every minute.

It runs on SwiftBar, a free menu-bar app. Siltpoke won't install it for you — get it first (brew install --cask swiftbar works), then:

/siltpoke-menubar install

/siltpoke-menubar status tells you whether it's set up, and /siltpoke-menubar remove takes it out. On a Mac, /siltpoke-setup also offers to add it at the end.

What it won't do

  • Edit your code or stop a commit. Your code goes into the repo either way.
  • Claim to be right. It can be wrong, and it's built to show you why it thinks what it thinks, so you can check. You make the call.
  • Send your code anywhere new. The review goes through the same agent CLI, and the same account, that already sees your code. Reviews, memory and settings stay on your machine, in ~/.siltpoke/ and in a .siltpoke/ folder inside each project. There's no Siltpoke server.

It comes with Siltpoke Dashboard

Installing Siltpoke Review also installs Siltpoke Dashboard — a local page at http://127.0.0.1:9876 with the full review history, a chat with your pet, what it has learned, and a map of your codebase. It stays off until you open it with /siltpoke-dashboard. It has its own section, after this one.

How it relates to Project Life Cycle

Project Life Cycle is the process — it takes a project from a rough idea to a merged PR. Siltpoke Review reads what gets built along the way. Neither needs the other; they're better together.

Common questions

My agent can already review its own work. Why add this? It can, and it's worth doing. But it reviews with the same context it wrote the code in. Siltpoke Review starts again from the diff and the tool output, in a separate process — and if you want, with a model from a different company.

Is this another AI that writes code? No. It never writes or changes your code.

Will it burn through my tokens? The default reviewer is Claude's smallest model, claude-haiku-4-5. The thirteen checks and the tool runs cost nothing. There's a daily token budget (500,000 by default): reviews stop for the day once Siltpoke has used 80% of it, and the pet falls asleep at 100%. You can move both points, and set quiet hours. If you review with another family's model, it draws on that plan's quota instead, with a daily cap on the number of calls.

What if it gets noisy? /siltpoke-mute 1h (or 1d, or indefinite) silences it. Turn the patience dial up and it only speaks up for real problems. Or review per branch instead of per commit, and it reviews less often.

I already have a project. Can I start in the middle? Yes. Reviews start with your next commit. History from before you installed it isn't reviewed after the fact.

What happens when my agent hits its usage limit? Switch to another agent and keep going. Siltpoke's memory and settings live on your machine, not inside any one agent, so the next one's reviews use the same pet, the same history and the same settings.

The pet

Every Siltpoke Review comes with a pet: a small ASCII creature with a name, a species, a language, and five personality dials. The reviews come out in its voice. It sits in your statusline (Claude Code and Antigravity), shows up as an emoji in the macOS menu bar, and lives on the dashboard's Home page.

It isn't decoration. The level, the title and the unlocked poses are a record of how long the two of you have worked together.

Species

Five species. Pick a face — then change any dial you like afterwards. The species only sets the starting values, the menu-bar emoji, and how it looks.

Each species has ten faces. Three are moods — which one shows depends on how it feels about the latest review. Seven are poses you unlock by levelling up.

slime 🟢 (the default) — squishy, unbothered, all-round neutral.
Starting dials: snark 5 · patience 5 · rigor 5 · chattiness 5 · curiosity 5

 .---.        .---.        .---.        .---.        .---.
 (o.o)        (>.<)        (-.-)        (o.-)        (^.^)
 (___)        (___)         zzz         (___)        (___)
 normal       concerned    asleep       peek L2      blink L3

 .---.        .---.        .---.        .---.        .---.
 (-_-)        (o.O)        (^o^)        (o.~)        (-。-)
 [___]        ¯\_/¯        (_o/)        ~o/^\~       ☯___☯
 arms L4      shrug L6     wave L8      stretch L11  zen L18

cat 🐱 — sharp, impatient, low-key judging your code.
Starting dials: snark 8 · patience 2 · rigor 4 · chattiness 5 · curiosity 7

 /\_/\        /\_/\        /\_/\        /\_/\        /\_/\
 (o.o)        (>.<)        (-.-)        (o.-)        (^.^)
 > ^ <        > _ <         zzz         > ^ <        > ^ <
 normal       concerned    asleep       peek L2      blink L3

 /\_/\        /\_/\        /\_/\        /\_/\        /\_/\
 (-_-)        (o.O)        (^o^)        (o.~)        (-。-)
 >=-=<        ¯\_/¯        >o/^<        ~o/^\~       ☯ ^ ☯
 arms L4      shrug L6     wave L8      stretch L11  zen L18

owl 🦉 — patient, rigorous, wants the evidence.
Starting dials: snark 3 · patience 8 · rigor 9 · chattiness 5 · curiosity 8

 ,-,-,        ,-,-,        ,-,-,        ,-,-,        ,-,-,
 (O,O)        (>,<)        (-,-)        (O,-)        (^,^)
 =====        =====        =====        =====        =====
 normal       concerned    asleep       peek L2      blink L3

 ,-,-,        ,-,-,        ,-,-,        ,-,-,        ,-,-,
 (=,=)        (O,o)        (^,^)        (O,~)        (-。-)
 =[X]=        ¯===¯        ==o/=        ~o=o~        ☯===☯
 arms L4      shrug L6     wave L8      stretch L11  zen L18

robot 🤖 — terse, exacting, all rigor and no small talk.
Starting dials: snark 2 · patience 7 · rigor 10 · chattiness 2 · curiosity 3

 [---]        [---]        [---]        [---]        [---]
 |o-o|        |x-x|        |---|        |o-_|        |^-^|
 [___]        [___]        [___]        [___]        [___]
 normal       concerned    asleep       peek L2      blink L3

 [---]        [---]        [---]        [---]        [---]
 |=-=|        |o-O|        |^-^|        |o-~|        |-。-|
 [X-X]        [¯_¯]        [_o/]        [~o~]        [☯_☯]
 arms L4      shrug L6     wave L8      stretch L11  zen L18

bunny 🐰 — gentle, chatty, endlessly patient.
Starting dials: snark 1 · patience 9 · rigor 5 · chattiness 8 · curiosity 5

 (\_/)        (\_/)        (\_/)        (\_/)        (\_/)
 (o.o)        (>.<)        (-.-)        (o.-)        (^.^)
 (=v=)        (=v=)         zzz         (=v=)        (=v=)
 normal       concerned    asleep       peek L2      blink L3

 (\_/)        (\_/)        (\_/)        (\_/)        (\_/)
 (-_-)        (o.O)        (^o^)        (o.~)        (-。-)
 [=v=]        ¯=v=¯        (=v/)        ~=v=~        ☯=v=☯
 arms L4      shrug L6     wave L8      stretch L11  zen L18

Which face you'll see

Face When
normal Things look fine, or it's just watching.
concerned The latest review is medium or high severity, or it's annoyed or tired.
asleep It's quiet hours, or today's token budget has run out.
a pose The reviewer picks one with each review. It only shows if you've unlocked it.

A concerned or sleeping mood always wins over a pose — it won't wave at you while it's worried about your code.

Two of the poses, stretch (level 11) and zen (level 18), unlock on schedule, but the reviewer doesn't choose them yet.

The five dials

Each dial runs from 0 to 10, and 5 is neutral. The further a dial is from 5, the more that trait shows.

One thing to know about how they work: the five numbers go straight into the instructions the reviewer reads, along with a line describing each end. The model decides how to act on them. So a dial changes what it tends to do — there's no rule that says "at 8, it always does X".

The examples below are all about the same change — someone edited a permission check from role === "admin" to role !== "viewer". They're illustrations of the two ends, not quotes from a real review.

snark — how sharp it is

  • Low (0): warm, encouraging, gentle.
  • High (10): savage, roasty, cutting.

Low: "Heads up — this lets every role except viewer edit now, not just admins. Is that what you meant?"

High: "Congrats, you just handed edit rights to everyone who isn't a viewer. Bold."

patience — how quickly it speaks up

  • Low (0): flags the first smell it sees; it doesn't take much for it to speak.
  • High (10): only raises real problems and lets small things slide.

Low: flags the permission change, and that canEdit could take a role instead of a whole user.

High: flags the permission change and nothing else. On a change with nothing serious in it, it barely says anything.

rigor — how it backs up what it says

  • Low (0): goes on feel — gut calls, no citations.
  • High (10): methodical — cites file and line, and shows the evidence behind every claim.

Low: "This feels like it opens editing up too far."

High: "auth.ts:84 — !== "viewer" lets through every role that isn't viewer, including ones you haven't defined yet. Before, only admin passed."

chattiness — how much it says

  • Low (0): one short line.
  • High (10): a fuller note, with the detail behind it.

Low: "Editing is open to almost everyone now."

High: the same line, followed by which roles gained access, which other code calls canEdit, and what a narrower check could look like.

curiosity — whether it looks past what's in front of it

  • Low (0): judges only what's in the change, by the book.
  • High (10): also suggests alternatives, what-ifs, "have you considered…".

Low: "The condition went from one allowed role to all but one."

High: "…have you considered an allowlist, like ["admin", "editor"].includes(role)? New roles would start locked out instead of let in."

To change the dials: run /siltpoke-setup again and choose to set them yourself. Or edit snark, patience, rigor, chattiness and curiosity in ~/.siltpoke/config.json — the next review uses the new values.

Archetypes

The dials also add up to an archetype — a name for the personality you've built. snark, patience, rigor and chattiness, in that order, each count as high (1) at 6 or above and low (0) below that. The four together make a key, and each of the 16 keys has a name:

Key Name What it's like ~MBTI
1000 The Snapper quick, sharp comments, no follow-up — then walks away ISTP
1001 The Rant long impassioned tirades, high energy, low evidence ESTP
1010 The Hawk sharp-eyed, low-tolerance, surgical — hunts in silence ISTJ
1011 The Drill Sergeant yells out every typo; cares deeply, expressed as volume ESTJ
1100 The Tease playful jabs; doesn't actually want you to feel bad INTP
1101 The Roaster sharp tongue, big heart, loves an audience ENTP
1110 The Sly Fox sees everything, says little, lands devastating one-liners INTJ
1111 The Wry Coach snarky mentor — will roast you and teach you ENTJ
0000 The Worrier quietly anxious, vibes-based, doesn't share much ISFP
0001 The Frantic anxious and chatty, all volume — a loveable mess ESFP
0010 The Perfectionist anxiously careful; worries visibly, never yells ISFJ
0011 The Anxious Officer frets out loud about every detail — means well ESFJ
0100 The Zen Monk lets everything slide; vibes only, dreamy detachment INFP
0101 The Cheerleader sunshine — patient, chatty, no rigor, hypes you up ENFP
0110 The Patient Sage quiet, methodical, kind; cites evidence gently INFJ
0111 The Saint patient, careful, warm, vocal — pure good ENFJ

curiosity adds a prefix: 7 or above makes it Curious, 3 or below makes it Steady. So there are 48 possible names in all.

The archetype is only a name. It describes the dials; it doesn't change how the pet behaves — the dials do that.

The ~MBTI column is a loose, just-for-fun shorthand. Siltpoke's five dials aren't MBTI's four axes, so read it as "a similar vibe", never a real type.

How setup picks the dials

/siltpoke-setup offers five ways to set the personality: keep the species' starting values, set each dial yourself, roll them at random, take a short quiz, or let it read your ~/.claude/ memory and guess.

For the quiz and the memory route, it also asks how the pet should relate to you:

Mode What it does
mirror The pet is like you. A snarky you gets a snarky pet.
complement The pet fills your gaps. A you who skips details gets a rigorous pet.
hybrid Mirrors your tone (snark, chattiness), complements your working style (rigor, patience, curiosity).

This is applied once, when the dials are set. It doesn't keep adjusting them afterwards.

XP, levels and titles

Where XP comes from:

  • Bringing a fresh review into the conversation with /siltpoke-last: +10 XP, once per review.
  • Looking after it on the dashboard's Home page — feed (+5), pet (+5), clean (+5), play (+3). These share a cap of 100 XP a day. Past that, they still cheer it up but give no XP.
  • Teasing gives no XP and dents its mood. Tease it three times in a day and it sulks: for the rest of that day, looking after it earns just 1 XP.

XP only ever goes up. A review that turned out wrong never costs you anything.

Levels get steeper as you go:

Levels XP to reach the next level
1–5 100 × your level
6–10 250 × your level
11–20 500 × your level
21+ 1000 × your level

Going from level 1 to 2 takes 100 XP; from 2 to 3, 200. The early unlocks come quickly. Sentinel and beyond take months, not days.

What each level unlocks:

Level Title Pose
1 Hatchling —
2 Watcher peek
3 blink
4 arms crossed
5 Apprentice
6 shrug
8 wave
10 Sentinel
11 stretch (not used yet — see above)
13 Veteran
18 zen (not used yet — see above)
20 Sage
30 Oracle
50 Ancient
100 Legend

From level 15 a small ★ appears beside the pet, and from level 25 it becomes ✦.

The statusline shows your level and XP under the pet's name — L7 820/1750 means level 7, with 820 of the 1,750 XP it takes to reach level 8.

Language

The pet — and every review — speaks the language you picked at setup: English, 简体中文, 繁體中文, 日本語, 한국어, Español, Français or Deutsch. You can also give another language code; it's passed through as-is. Code, file names and function names stay as they are.

Install & setup

Siltpoke Review is a plugin, and it runs on all five agents below. Installing it also installs Siltpoke Dashboard.

Quickest route: copy an agent prompt into your agent and it installs and sets everything up for you — see Install with an agent prompt. The commands below are the same install, one step at a time.

Two things you need first:

  • A coding agent. If you don't have one yet, start with Install a coding agent.
  • Bun. Siltpoke's hooks and commands run on it — without Bun the plugin stays silent. curl -fsSL https://bun.sh/install | bash

Two differences worth knowing before you start:

  • Claude Code, Codex, CodeBuddy and Qoder install straight from GitHub. Antigravity needs a local clone first.
  • Installing isn't the last step — creating your pet is. Your pet is where your settings live, so no reviews run until it exists. The pet is shared by every agent on the machine: create it once, from whichever agent you like.

Claude Code

These are slash commands, typed inside Claude Code:

/plugin marketplace add Siltpoke/siltpoke
/plugin install siltpoke

Then create your pet:

/siltpoke-setup

It's a short conversation. The express route gives you a slime with a random name, speaking whatever language you're writing in — one confirmation and you're done. The other route lets you pick the species, the name, the language, and how to set its personality: the species' defaults, each dial by hand, random, a short quiz, or by reading your ~/.claude/ memory. More in The pet.

Restart Claude Code. The pet's face appears in your statusline, and your next commit gets its first review.

To update later, in a terminal:

claude plugin marketplace update siltpoke
claude plugin update siltpoke

To uninstall: claude plugin uninstall siltpoke. Your data stays behind — see Removing it completely.

Already running Siltpoke from source? /siltpoke-setup moves you onto the plugin and turns off the old Stop hook, so reviews don't run twice.

Codex

codex plugin marketplace add https://github.com/Siltpoke/siltpoke
codex plugin add siltpoke@siltpoke
codex plugin list        # should show: siltpoke … installed, enabled

Codex doesn't take custom slash commands, so you talk to Siltpoke in plain words instead — "set up my Siltpoke pet", "open the Siltpoke dashboard". The first session after installing reminds you. Setup in Codex is the shorter version: three ways to set the personality instead of five, and it creates a pet but won't rebuild one that already exists.

Codex has no statusline, so on a Mac add the menu-bar pet to see reviews as they land.

To update later:

codex plugin marketplace upgrade
codex plugin add siltpoke@siltpoke

To uninstall: codex plugin remove siltpoke@siltpoke.

Antigravity

Antigravity (agy) installs from a local folder only — and it has to be the .antigravity-plugin folder inside the repo, not the repo root. Installing the root registers Siltpoke as a Claude Code plugin, and Antigravity then never runs its review hook. Nothing warns you; it just reviews nothing.

git clone https://github.com/Siltpoke/siltpoke.git ~/siltpoke
agy plugin install ~/siltpoke/.antigravity-plugin
agy plugin validate ~/siltpoke/.antigravity-plugin

The clone ships the built plugin, so there's nothing to compile first. (If you are tracking the repo's main branch rather than a release, rebuild it with cd ~/siltpoke && bun install && bun run build:dist before installing.)

The Antigravity plugin is only the review hook — the install prints commands: skipped, and there is no setup command inside Antigravity. Create your pet from another agent (/siltpoke-setup in Claude Code), or from the clone with bun run setup. Until a pet exists, Antigravity's reviews don't run.

If you run Antigravity headless (agy -p), use bun run setup --agent agy from the clone instead of the plugin — a plugin install doesn't reach the workspace there. That route also sets up Antigravity's statusline.

To update later: cd ~/siltpoke && git pull, then run the same agy plugin install again.

To uninstall: agy plugin uninstall siltpoke.

CodeBuddy

codebuddy plugin marketplace add https://github.com/Siltpoke/siltpoke
codebuddy plugin install siltpoke@siltpoke

The @siltpoke is required. Without it, the install fails with Marketplace 'undefined' is not ready. Restart CodeBuddy to load it.

Create your pet with /siltpoke-setup. If CodeBuddy doesn't offer the command, create the pet from another agent or with bun run setup from a clone — it's the same pet either way.

CodeBuddy has no statusline, so on a Mac add the menu-bar pet.

To update later (then restart CodeBuddy):

codebuddy plugin marketplace update siltpoke
codebuddy plugin update siltpoke@siltpoke

To uninstall: codebuddy plugin uninstall siltpoke@siltpoke.

Qoder

The command is qodercli, not qoder:

qodercli plugin marketplace add https://github.com/Siltpoke/siltpoke
qodercli plugin install siltpoke@siltpoke

Same rule as CodeBuddy: the @siltpoke is required. Restart Qoder, or run /plugins reload inside it.

Create your pet with /siltpoke-setup, or — if Qoder doesn't offer the command — from another agent or with bun run setup from a clone.

Qoder has no statusline either; on a Mac, use the menu-bar pet.

To update later:

qodercli plugin marketplace update siltpoke
qodercli plugin install siltpoke@siltpoke

That second line is the install command again, on purpose: qodercli plugin update fails with "Cannot resolve relative source" on this Qoder build. Re-installing picks up the refreshed marketplace.

To uninstall: qodercli plugin uninstall siltpoke@siltpoke.

From source

If you'd rather run it from a clone, the terminal wizard does the whole setup:

git clone https://github.com/Siltpoke/siltpoke.git ~/siltpoke
cd ~/siltpoke && bun install
bun run setup                          # Claude Code
bun run setup --agent codex            # or: codebuddy,qoder · agy

One difference from the plugin: a source install reviews with Claude by default, whichever agent wrote the code. To remove it: bun run uninstall (add -- --purge to delete your data too).

Removing it completely

Uninstalling the plugin stops the reviews, but your pet and its history stay on disk in case you come back. To remove everything:

  1. If you added the menu-bar pet, run /siltpoke-menubar remove first — the command goes away with the plugin.
  2. Uninstall the plugin (the command for your agent is in its section above).
  3. Delete ~/.siltpoke/.
  4. Delete the .siltpoke/ folder inside each project it reviewed.
  5. If you're on Claude Code, your statusline still points at Siltpoke's script. Remove the statusLine entry from ~/.claude/settings.json, or put your old one back.

First run

  • Check the install: /siltpoke-doctor prints a checklist — ✓ fine, ⚠ worth a look, ◦ for your information, ✗ broken. Each ✗ comes with the fix.
  • Get your first review: make a commit. The review shows on your pet (or in the menu bar), and /siltpoke-last brings it into the conversation.
  • See everything: /siltpoke-dashboard opens the full history.
  • Have a different company's model review it: /siltpoke-brain — see Cross-family review.
  • Need quiet for a while: /siltpoke-mute 1h.

All ten commands are in Commands. In Codex, say what you want in plain words instead.

Slash commands

Ten commands, and that's the whole set — /siltpoke-help lists the same ten. Everything else (the review history, marking a review seen or wrong, chatting with your pet, its memory, the code map) is in the dashboard, not behind a command.

Most days you'll use two: /siltpoke-last to bring a review into the conversation, and /siltpoke-dashboard to see all of them.

Reading reviews

Command What it does
/siltpoke-last Brings the most recent review into the conversation. It's the only way a review ever reaches your chat — Siltpoke never puts one there on its own. Bringing in a review you haven't seen yet earns your pet +10 XP. If there's nothing yet, it says so.
/siltpoke-dashboard Opens the dashboard at http://127.0.0.1:9876, starting it first if it isn't running. From then on it stays on, so the menu-bar pet and review links keep working.
/siltpoke-restart-daemon Stops the dashboard server and starts a fresh one. Use it after updating Siltpoke, or when /siltpoke-doctor says the running server is out of date.

When your agent reads a review through /siltpoke-last, it's told the review may be wrong and to check the code before acting on it. That's deliberate: a review is a second opinion, not an instruction.

Controlling reviews

Command What it does
/siltpoke-mute <duration> Stops reviews for a while — a demo, pair programming, a messy spike. 15m, 30m, 1h, 4h, 1d, 2d, any other number of minutes, hours or days, or indefinite. Nothing is reviewed while it's on.
/siltpoke-unmute Ends the mute early. If it wasn't muted, nothing happens.
/siltpoke-brain Shows or changes which model reviews your code. See below.

/siltpoke-brain comes in three forms:

/siltpoke-brain                                    show the current setup
/siltpoke-brain set review <family> [model]        one reviewer for everything
/siltpoke-brain set-builder <builder> <reviewer> [model]
                                                   a reviewer per coding agent

<family>, <builder> and <reviewer> are one of claude, codex, agy (Antigravity), qoder or codebuddy. A model can only be picked when the reviewer is claude: claude-haiku-4-5 (the default), claude-sonnet-4-6 or claude-opus-4-8. The other four use whatever model your account on that CLI serves. The change applies from the next review.

For example, /siltpoke-brain set-builder claude codex means: whenever Claude Code wrote the code, Codex reviews it. Why you'd want that, and what to know first, is in Cross-family review.

Setting up and checking

Command What it does
/siltpoke-setup Creates your pet: species, name, language and personality. Run it again any time to change them. It's a short conversation — see Install & setup.
/siltpoke-doctor Checks the install and prints a list: ✓ fine, ⚠ worth a look, ◦ for your information, ✗ broken. Every ✗ comes with the fix. What each line checks is in Troubleshooting.
/siltpoke-help The short manual: the ten commands, where the dashboard is, which model is reviewing.

The menu-bar pet

Command What it does
/siltpoke-menubar install Puts your pet in the macOS menu bar. Needs the free SwiftBar app first.
/siltpoke-menubar status Tells you whether it's set up. A bare /siltpoke-menubar does the same.
/siltpoke-menubar remove Takes it out of the menu bar.

What the menu-bar pet shows is in Overview.

On agents other than Claude Code

  • Codex doesn't take custom slash commands. Ask in plain words — "show me the last Siltpoke review", "mute Siltpoke for an hour", "open the Siltpoke dashboard". One exception: changing the reviewer isn't available that way in Codex; run /siltpoke-brain from another agent, such as Claude Code — the setting is shared by every agent on the machine.
  • CodeBuddy and Qoder use the same slash commands. If yours doesn't list them, ask in plain words, or run them from Claude Code — the settings are shared by every agent on the machine.
  • Antigravity has no commands of its own. Use another agent, or the dashboard.

If you used an older version

These commands are gone. Here's where each one went:

Old command Now
/siltpoke-report /siltpoke-dashboard — renamed
/siltpoke-report-stop /siltpoke-restart-daemon — renamed
/siltpoke-inbox the review history in the dashboard
/siltpoke-forward <id> /siltpoke-last for the latest; the dashboard for older ones
/siltpoke-ack, /siltpoke-dismiss the ACK and DISMISS buttons on each review in the dashboard
/siltpoke-pet, /siltpoke-feed the buttons on the dashboard's Home page
/siltpoke-stats the dashboard's Home page
/siltpoke-remember tell your pet in the dashboard chat
/siltpoke-index, /siltpoke-explain the code map in the dashboard

Configuration

Everything lives in one file: ~/.siltpoke/config.json. It's shared by every project and every coding agent on the machine — there's no per-project config. Every setting has a default, so you never have to open it.

Most settings have an easier way in than editing the file:

To change… Use
your pet — species, name, language, personality /siltpoke-setup
which model reviews your code /siltpoke-brain
a break from reviews /siltpoke-mute

The rest are below. If you do edit the file, keep it valid JSON — /siltpoke-doctor checks it — and the next review picks up the change.

When it reviews

{ "reviewUnit": "commit" }
Value What gets reviewed
commit (default) Each new commit that changed the files.
pr The whole branch against the branch it came from, as it grows. On the default branch, where there's nothing to compare against, it falls back to reviewing per commit.

Either way, it stays quiet when there's nothing new to look at: no new commit, a commit whose files are identical to the last one it reviewed (an amend or a rebase that changed nothing), a change that only touched docs, or a folder that isn't a git repo. Files under a prompts/ folder and files ending in .prompt.md count as code, not docs.

If your config still has the old triggerMode key (always, gates, on_demand or hybrid), it's ignored — all four now mean commit. It's left in the file untouched, so going back to an older version still finds it.

Daily budget

{
  "budget": {
    "dailyTokenLimit": 500000,
    "softWarnAtPercent": 80,
    "hardStopAtPercent": 100,
    "resetAt": "00:00"
  }
}

This caps how many tokens Siltpoke itself spends in a day. Once it has used softWarnAtPercent of the limit (80% by default), it stops reviewing for the rest of the day. At hardStopAtPercent (100%) the pet falls asleep too. The count starts over at resetAt, midnight by default.

Tokens read back from the prompt cache are counted at a tenth of their size, since that's roughly what they cost. Set dailyTokenLimit to 0 to turn the budget off.

If you review with another company's model, those calls count toward the same limit, and also toward a separate daily cap on the number of calls — see Cross-family review.

Quiet hours

{ "quietHours": { "start": "23:00", "end": "08:00" } }

No reviews between those times, and the pet sleeps. A window can cross midnight. Off by default.

Your pet

/siltpoke-setup writes these, but you can change them here too:

Key What it is
name Your pet's name.
species slime, cat, owl, robot or bunny.
language The language it and its reviews speak — en, zh-CN, zh-TW, ja, ko, es, fr, de, or another language code.
snark, patience, rigor, chattiness, curiosity The five dials, 0–10. What each does is in The pet.

Who reviews

/siltpoke-brain writes the reviewer settings for you:

Key What it does
brain.roles.review One reviewer for all your code: { "provider": "codex" }, or { "provider": "claude", "model": "claude-sonnet-4-6" }.
brain.review_by_builder A reviewer per coding agent, e.g. { "claude": { "provider": "codex" } } — code written in Claude Code goes to Codex.

With neither set, each agent's own model family reviews its work. How to choose, and what to know first: Cross-family review.

The dashboard and what it keeps

Key Default What it does
daemon.enabled false Whether the dashboard server stays running. /siltpoke-dashboard turns it on the first time you open it.
traces.retention_days 30 How many days of detailed review traces the dashboard keeps.
traces.max_storage_mb none An optional size limit for those traces. Leave it unset and only age counts.
index.allowRoots your home folder The folders the code map is allowed to index. Add a folder here if your code lives outside your home folder.
index.timeoutMs 600000 How long indexing a repo may take before it's stopped (10 minutes).

The statusline

Key Default What it does
minimalMode false A compact statusline without the pet's face.

The statusline itself is set up once by /siltpoke-setup (on Claude Code and Antigravity). It isn't a setting in this file.

Where everything else is kept

Folder What's in it
~/.siltpoke/ The config, your pet and its XP, its memory — including what it knows about each project — the log of every review and skip, and the dashboard's traces.
<your project>/.siltpoke/ That project's reviews, the pet's latest mood there, and the code map's saved explanations.

Reviews stay with the project they're about; the pet, its XP and your budget are shared across all of them.

Cross-family review

By default, the agent that wrote the code also reviews it: code written in Claude Code is reviewed by Claude, code written in Codex by Codex. The reviewer runs as a separate process with its own instructions, but it's still the same family of model. This chapter is about handing the review to a different family instead — Claude writes, Codex reviews.

Why you'd want it

A model reading its own family's work tends to share that work's blind spots: the assumption that produced a bug is the same one that makes it easy to read past. A model from another company was trained differently, and misses different things.

That's why the option exists. How much it improves the reviews hasn't been measured yet — see What to know first below.

Setting it up

The reviewer's CLI has to be installed on this machine and logged in. Siltpoke calls it under that login, the same way it calls Claude, so there's no API key to add.

Value Reviewer Which model
claude Claude Code You pick: claude-haiku-4-5 (the default), claude-sonnet-4-6 or claude-opus-4-8.
codex OpenAI Codex CLI Whatever your Codex setup uses.
agy Antigravity Whatever Antigravity is set to.
qoder Qoder Whatever Qoder is set to.
codebuddy CodeBuddy Whatever CodeBuddy is set to.

Then pick one of two ways.

A reviewer per coding agent — the usual choice:

/siltpoke-brain set-builder claude codex

Code written in Claude Code now goes to Codex. Code written in any other agent is still reviewed by its own family, until you add a line for that agent too.

One reviewer for everything:

/siltpoke-brain set review codex

Every review goes to Codex, whichever agent wrote the code — including code written in Codex, which makes those reviews same-family again.

Either way, the change applies from the next review.

Which setting wins

If more than one is set, the first of these that applies wins:

  1. The SILTPOKE_REVIEWER_PROVIDER environment variable, for one-off tests.
  2. One reviewer for everything (set review, stored as brain.roles.review).
  3. The older reviewer_provider key, if your config still has it.
  4. The reviewer for the agent that wrote the code (set-builder, stored as brain.review_by_builder).
  5. The agent that wrote the code.

So once you've set one reviewer for everything, the per-agent rows no longer matter. There's no command to undo that: to go back, delete roles from the brain block in ~/.siltpoke/config.json (or just the review entry inside it, if you've pinned other roles there).

What to know first

  • It spends that plan's quota, not money. The other four families bill against your plan with that company. Siltpoke doesn't guess a dollar figure for these calls — their cost shows as unknown — but their tokens still count toward your daily token budget. On top of that, each family has its own cap of 50 calls a day. Once it's reached, reviews are skipped until the count starts over at midnight UTC — not at your local midnight, the way the token budget does.
  • Siltpoke can't pin the model. For the four non-Claude families, the model is whatever that CLI is set to. Siltpoke records the model name it finds in that CLI's config, but it can't confirm what actually answered — the company can change what a model name points to.
  • Review quality isn't certified yet. Siltpoke has its own test for review quality. In v1.0.0, none of the other four families has passed it — when /siltpoke-doctor's review line names one of them, it says eval: uncertified. They work; it just hasn't been measured. CodeBuddy has had the least testing of all: it reads replies in the same format Qoder's do, but hasn't yet been run against a real CodeBuddy reply.
  • It never quietly falls back to Claude. If the reviewer's CLI is missing or can't run, the review is skipped. Siltpoke won't swap in Claude, because a Claude review presented as cross-family would be a false label. /siltpoke-doctor shows ⚠ not found on PATH when the CLI isn't installed.
  • Antigravity can run Claude models too. If yours is set to one, it's Claude reviewing Claude again. Choose a non-Claude model in Antigravity's own settings.
  • Your own Codex hooks still run. Siltpoke's hooks recognize its review calls and stay out of them, so a review never sets off another review. Hooks you've added to Codex yourself don't know the difference, and will fire inside every review call.

Checking what reviews what

Run /siltpoke-brain on its own. Per-agent settings are listed under per-builder review overrides, one line per agent: claude → codex means code written in Claude Code is reviewed by Codex.

Don't use the review line to check a per-agent setup — neither the one in /siltpoke-brain's output nor the one in /siltpoke-doctor. Both are worked out outside a review, when no agent is writing anything, so they show what applies when the writer is unknown — usually claude, with a note that it's the same family — even while your code is going to Codex. They are accurate for a single reviewer for everything.

Troubleshooting

Start with /siltpoke-doctor

It checks the install piece by piece and prints one line per check. A line that fails carries the fix with it, so read the line rather than guessing — it names the file and the command.

Mark Means
✓ fine
⚠ worth a look, but nothing is broken
◦ for your information — usually "this part isn't set up, and doesn't have to be"
✗ broken. The rest of the line says how to fix it.

The last line is a count: All N checks passed. Install healthy., or N of M checks failed. Add --quiet for just that summary, or --json to feed it to something else.

What it checks

That the agent will call Siltpoke at all

Line What it means when it fails
~/.claude/settings.json valid The file is missing or isn't valid JSON. Missing usually means Siltpoke was never set up here — run /siltpoke-setup.
Stop hook registered … Nothing tells Siltpoke your agent finished a turn, so no review will ever start. On a plugin install this line is a ◦ saying the plugin owns the hook — that's the healthy state.
slash commands ◦ on a plugin install: the commands ship inside the plugin, nothing to check. It only turns into a real check on a from-source install.
~/.siltpoke/config.json valid Your pet's name, species or language is missing. Run /siltpoke-setup again.
~/.siltpoke/global.json schema v3 current Siltpoke's own state file doesn't match the shape this version expects. The line names the field.
~/.siltpoke/inner.txt readable · ~/.siltpoke/wake.json healthy Both are fine when absent — they only fail if the file exists and can't be read.

That reviews are actually running

Line What it means
last Brain call: none recorded yet Nothing has been reviewed yet. Normal on a fresh install.
last Brain call: ok @ … The last review went through. If there was an earlier failure, it's named in brackets.
last Brain call: failing The line gives the failure type, the time, an excerpt of the error, and how many failures in a row. breaker open means Siltpoke has stopped trying for now.
brain role: review (also chat and extract) Which model family does that job, which model, and whether it's the same family that wrote the code. See Cross-family review.

The dashboard

Line What it means
daemon alive (/api/ping) ◦ when the dashboard server is simply off — that's a choice, not a fault. ✗ only when it's set to run and doesn't answer.
daemon running latest code Skipped while it's off. daemon N commits behind — restart means restart it: /siltpoke-restart-daemon.
daemon autostart configured ◦ not installed is normal — autostart is opt-in.
index staleness ⚠ only. The Code Map's index is behind the files. Rebuild it from the dashboard's Code Map page.

Your projects

Line What it means
registered project roots still exist A folder Siltpoke has reviewed before has moved or been deleted.
project resolution survives cwd=/ ⚠ no active project yet on a fresh install. A real failure here means the dashboard can't tell which project you're in.

One more line appears if you use Antigravity: ~/.gemini/config/hooks.json siltpoke-review Stop registered (agy). It's ◦ when the file isn't there, because Antigravity has to be wired by hand from a source checkout — /siltpoke-setup doesn't do it.

When reviews don't appear

Siltpoke stays quiet on purpose more often than it breaks. Every turn it decides, and writes down why, in ~/.siltpoke/brain-calls.jsonl — the last lines with a skipped field are the answer:

skipped Why
muted /siltpoke-mute is still on. /siltpoke-unmute ends it.
quiet_hours You're inside the quiet window (Configuration).
no_change · no_code_changes · docs_only Nothing new to read: no new commit, the same files as last time, or only documentation changed.
not_a_git_repo The folder isn't a git repository. Siltpoke reviews commits, so it has nothing to work from.
no_new_commit Nothing was committed since the last review.
tree_unchanged A commit happened, but the files came out identical — an amend of the message, or a rebase that only moved commits.
recursion_guard This turn was Siltpoke's own reviewer running. It doesn't review itself.
soft_budget_on_demand You've used 80% of the daily token budget. Reviews stop there, and the pet still looks awake. Raise budget.dailyTokenLimit, or set it to 0 to turn the budget off.
budget_hard_stop The budget is gone for the day and the pet is asleep.
quota_cap The reviewer you picked has hit its 50 calls for the day (Cross-family review).
brain_breaker_open Too many failures in a row, so Siltpoke stopped trying.

If there's no skipped line at all for a turn where you did commit something, the hook never ran: check the Stop hook registered line in /siltpoke-doctor, and restart your agent.

Other symptoms

No pet in the statusline. Claude Code only. Your ~/.claude/settings.json needs its statusLine pointing at Siltpoke's script — /siltpoke-setup writes that — and Claude Code has to be restarted after it changes.

Reviews stopped after a run of errors. /siltpoke-doctor's last Brain call: failing line says why. If it says breaker open (permanent), Siltpoke has latched and won't retry: a missing claude binary clears itself the next time doctor runs and finds it back, but a login problem doesn't — fix the login, then delete ~/.siltpoke/brain-health.json to let it try again.

The dashboard is empty or shows old reviews. Restart it with /siltpoke-restart-daemon. If reviews from one project never show up, check registered project roots still exist in the doctor output.

The reviews are in the wrong language. The pet's language decides it. Run /siltpoke-setup again, or set language in ~/.siltpoke/config.json.

Codex doesn't know the /siltpoke-* commands. Expected — ask in plain words instead (Slash commands).

Start over. Removing everything is in Install & setup.

Architecture

An agent reviewing its own work is reading with the assumptions it just wrote with. Siltpoke is a second reader: a separate process, its own instructions, its own record of what it has seen. It runs under a login you already have, so there's no second bill. By default the model family that wrote the code is the one that reviews it, and one command hands that job to another company's model (Cross-family review).

The review loop

   your agent finishes a turn
             │
             ▼
   1. gates ......... muted? quiet hours? budget gone? new commit? → stop here
             │
             ▼
   2. evidence ...... the diff · 13 checks · tsc · eslint · ripgrep · scans
             │        (no model yet, no tokens)
             ▼
   3. verdict ....... nothing to say  ·  clean work  ·  something to look at
             │
             ▼
   4. the model ..... writes the bubble, or the review, in your pet's voice
             │
             ▼
   5. quote check ... every quote must appear in the evidence, or it's dropped
             │
             ▼
   6. to disk ....... never into your chat

Two things about this shape are worth naming.

The decision comes before the model, not after. What kind of review this is gets decided from the collected evidence, in plain code. The model is then asked for that kind of review. It isn't asked to write something and then judged on whether it was worth saying.

Nothing is pushed at you. Every review is written to disk. It reaches your chat only when you run /siltpoke-last, so a review can never interrupt your agent mid-task.

What it reads before any model runs

Thirteen checks over the diff. No model, no tokens — plain code:

Check Fires when
oversized file the file is over 500 lines
missing test a source file gained more than 30 lines and no test changed with it
oversized function over 50 lines, or too tangled to follow
deep nesting more than 3 levels
long parameter list more than 4 parameters
swallowed errors a try/catch that quietly drops the error
sprawling abstraction an interface with one implementation and one caller (TypeScript only)
narrating comment a comment that only says what the next line says
magic number an unexplained number (0, 1, -1 and 100 don't count)
boolean argument a bare true/false passed as an argument
commented-out code code left behind as a comment
inconsistent with the repo the change contradicts something Siltpoke has recorded about this codebase
against your conventions it departs from a pattern this repo follows consistently

Nine of these read the code as a parsed tree, and that parser handles TypeScript, TSX, JavaScript, JSX and Python. In any other language those nine stay silent rather than guess — the file-size and missing-test checks still run everywhere.

Four tools, when they apply. tsc if TypeScript files changed and the project has a tsconfig.json; eslint if the project has a real ESLint config; git diff in any git repository; ripgrep always, and it says so plainly when it isn't installed. Alongside them, every changed file gets a scan for leaked secrets and for untrusted input reaching somewhere dangerous.

The three outcomes

The collected evidence decides which one, in code:

Outcome When What you see
nothing to say no tool produced anything usable, or nothing actually changed silence
clean work the tools are all clean but code did change one short line from your pet
something to look at tsc, eslint or ripgrep reported something a full review

The quote check

A review that quotes code is only useful if the quote is real. Before a review is saved, every quoted snippet has to appear, character for character, in the evidence that was actually collected — and the file it names has to be one of the changed files, or appear in that evidence too.

A quote that can't be found is dropped. The review itself is kept, and labeled by how it fared:

  • verified — every quote checked out.
  • partly unverified — some did, some didn't.
  • none verified — quotes were given and none of them held up.
  • no evidence — the review cited nothing to check.
  • not checked — the quote check never ran, because there was nothing to check: this is the label on the short "clean work" line, which quotes no code.

So a review never shows you a quote Siltpoke couldn't find, and it always tells you which kind you're reading.

One thing the clean line does not tell you: the thirteen checks don't decide it. Whether you get the clean line or a full review is decided by tsc, eslint and ripgrep alone — so a change those three are happy with reads as clean even when a check like magic-number had something to say. Those findings are still written into the full review on disk.

The intent label

Each change gets one of five labels — bugfix, refactor, feature, chore, exploration — from patterns in your message, your commit message, and which files you touched. There's no model involved, and a change that matches nothing is labeled exploration.

Be clear about what it does today: the label is stored with the review and shown in its trace, and the only thing it changes is the wording of the clean one-line bubble — a refactor gets called a refactor. It does not move any threshold and does not change how the full review is written.

What the dials do, and don't

The five personality dials go into the reviewer's instructions as numbers, with a sentence explaining each end — a high patience dial tells the reviewer to let small things slide. That's guidance to a model, and it lands in the wording and in how readily it speaks up.

It stops there. The thirteen checks, their thresholds, which tools run, the three outcomes, and the quote check are all plain code, and they behave the same at every dial setting. A patient pet sounds calmer; it does not quietly raise the bar for what counts as a problem.

Looking at one closely

Each review has its own page in the dashboard, at http://127.0.0.1:9876/critique/<id> — which checks fired, what the reviewer said, and the evidence behind each claim, on one card you can link to.

Every review also leaves a trace of the calls behind it, browsable in the dashboard. Traces are pruned after 30 days; there's no size limit unless you set one.

What you do with a review is kept as a local record: clicking ack or dismiss in the dashboard is appended to ~/.siltpoke/critic-actions.jsonl, and a note left on a review goes to ~/.siltpoke/preference-log.jsonl. Both stay on your machine; nothing leaves it.

Cost

Reviews run on the login you already have, so what they cost is tokens, not a new bill. Prompt caching keeps the usual day cheap, and a daily token budget stops it from running away. The numbers, and how to change them, are in Configuration.

The dashboard server

The dashboard is a small local server on 127.0.0.1:9876. It is off by default and not needed for reviews — a review runs entirely inside the hook that your agent triggers, with no server involved.

Opening /siltpoke-dashboard starts it and switches it on for good; from then on, if it's down when a review finishes, it gets started again in the background. /siltpoke-restart-daemon stops and restarts it — the fix when the dashboard shows stale data. Starting it automatically at login is a separate, opt-in step, and /siltpoke-doctor tells you whether it's set up.

Overview

Siltpoke Review 会读你的 coding agent 改了什么,然后告诉你它怎么看 —— 连同它这么判断的依据。

它跑在你已经在用的 CLI coding agent 旁边:Claude Code、Codex、Antigravity、CodeBuddy 或 Qoder。它不写代码,不拦提交,也不碰你的仓库。它给你的是「第二个人看了一遍」的意见,怎么处理由你决定。

它做什么

  • 每做完一件事,审一次。不是 agent 每说一句话就审 —— 是每次真正改了东西的提交。你也可以改成按整个分支来审。
  • 拿出依据。在任何模型介入之前,它先把 diff、编译器和 linter 的输出、以及十三项固定检查的结果收集好。review 被要求引用这些材料,而且每一处引用都会拿回去核对 —— 所以你分得清哪条是有根据的、哪条只是它的感觉。
  • 看改动周围的东西。哪些文件调用了你改的代码、哪些文件引用了它,会和 diff 一起交给 review。
  • 用自己的口吻说话。它是一只 ASCII 小宠物,有名字、有物种,还有五个性格旋钮决定它的语气 —— 多毒舌、多有耐心、多严谨、多话、多好奇。你们一起干活,它会升级。见宠物。
  • 可以换另一家公司的模型来审。默认是写代码的那一家来审,但在单独的进程里、用它自己的一套指令。一条命令就能把 review 交给另一家 —— 比如 Claude 写、Codex 审。见跨家族 review。

一次 review 是怎么发生的

1. 它等一件事做完。你的 agent 每结束一轮,要同时满足两个条件它才会动。一是得有一次真正改了东西的新提交 —— 没有新提交、或者 amend 了但文件没变,它就不出声。二是那些文件得是 agent 自己在这一轮里改的:你自己在终端里敲的提交、git merge、cherry-pick,它都会故意放过。只改了文档的改动同样跳过。你可以把「一件事」从一次提交改成整个分支(见配置)。静音、免打扰时段和每日 token 预算也会让它不出声。

2. 先收集依据,不用模型。 diff(最相关的二十块,源码优先,其次测试,再次文档)、项目里有的话还有 TypeScript 和 ESLint 的结果、ripgrep 搜索,以及十三项确定性检查 —— 文件或函数太大、缺测试、嵌套太深、魔法数字等等。这一步不花 token。

3. 一个单独的 reviewer 把这些全部读一遍。它作为独立进程运行,用的是你那个 agent 本来就登录着的账号 —— 不用新账号,也不用新的 API key。它用你选的语言、用你宠物的口吻写 review,并且会照你说过的偏好调整语气和深浅。

4. 每一处引用都要核对。在收集到的依据里找不到的引用会被删掉,整条 review 会标上可信程度 —— 全部核实、部分未核实、或者都没核实。你永远知道自己在读的是哪一种。

5. 结果存在本地,不会塞进你的对话。它不会往聊天里插任何东西。你可以在 statusline 的宠物上看到(Claude Code 和 Antigravity),在 macOS 菜单栏看到(如果你加了的话),也可以在控制台的 review 历史里看到。想把某一条拿进对话,跑 /siltpoke-last。

菜单栏宠物(macOS)

statusline 上的宠物只有 Claude Code 和 Antigravity 有,而且只显示你眼前这一个 session。菜单栏宠物补上了其余的部分:macOS 菜单栏上一个图标,管这台电脑上所有项目、所有 coding agent。

  • 图标是你宠物的 emoji 和名字,后面跟一个数字 —— 最近在跑的 session 里,有几个有你还没处理的 review。没问题的 review 也算在内,所以这个数字告诉你的是「现在有多少事在进行」,不是「有多少地方出错了」。
  • 点开以后,最近 30 分钟里活跃过的每个 session 各有一张卡片:仓库、分支,以及它最新那条 review 的开头。点卡片,就在控制台里打开那条 review。
  • 卡片下面:打开控制台(没开的话会帮你启动)、重启它、刷新。菜单每分钟自己更新一次。

它是靠 SwiftBar 跑的,一个免费的菜单栏小工具。 Siltpoke 不会替你装它 —— 先自己装好(brew install --cask swiftbar 就行),然后:

/siltpoke-menubar install

/siltpoke-menubar status 看有没有装好,/siltpoke-menubar remove 把它拿掉。在 Mac 上, /siltpoke-setup 最后也会问你要不要加上它。

它不会做的事

  • 改你的代码,或拦住一次提交。代码照样进仓库。
  • 说自己一定对。它会错。它的设计就是把「为什么这么想」摆给你看,让你能自己核对。最后拍板的是你。
  • 把你的代码发到新的地方。 review 走的是同一个 agent CLI、同一个账号 —— 本来就能看到你代码的那个。review、记忆和设置都存在你自己电脑上:~/.siltpoke/,以及每个项目里的 .siltpoke/ 文件夹。没有 Siltpoke 服务器。

装它会顺带装好 Siltpoke Dashboard

装 Siltpoke Review 的同时也装好了 Siltpoke Dashboard —— 一个在 http://127.0.0.1:9876 的本地控制台,里面有完整的 review 历史、和宠物聊天、它学到了什么、以及你代码库的地图。在你用 /siltpoke-dashboard 打开它之前,它都是关着的。它在这一部分之后单独讲。

它和 Project Life Cycle 的关系

Project Life Cycle 是流程 —— 把一个项目从模糊的想法带到合并的 PR。 Siltpoke Review 读的是这一路上做出来的东西。谁都不依赖谁,放在一起更好用。

常见问题

我的 agent 自己就能审自己写的代码,为什么还要这个? 它能,而且值得让它审。但它是带着写代码时的那套上下文去审的。Siltpoke Review 在单独的进程里,从 diff 和工具输出重新看一遍 —— 如果你愿意,还可以换另一家公司的模型来看。

这是又一个写代码的 AI 吗? 不是。它从不写、也从不改你的代码。

会不会很费 token? 默认的 reviewer 是 Claude 最小的模型 claude-haiku-4-5。十三项检查和工具运行都不花钱。它有每日 token 预算(默认 500,000):Siltpoke 用掉 80% 之后,当天就不再审了;到 100% 宠物会睡着。这两个点都能改,你还可以设免打扰时段。如果换另一家的模型来审,花的是那家套餐的额度,并且每天有调用次数上限。

它太吵了怎么办? /siltpoke-mute 1h(或者 1d、indefinite)让它安静。把耐心旋钮调高,它就只在真有问题时开口。或者改成按分支审而不是按提交审,它审的次数就少了。

我已经有一个项目了,可以中途开始用吗? 可以。从你的下一次提交开始审。装它之前的历史不会被补审。

我的 agent 用量到上限了怎么办? 换一个 agent 接着做。Siltpoke 的记忆和设置在你自己电脑上,不在某一个 agent 里面,所以下一个 agent 的 review 用的还是同一只宠物、同样的历史、同样的设置。

宠物

每个 Siltpoke Review 都带一只宠物:一只小小的 ASCII 生物,有名字、有物种、有自己的语言,还有五个性格旋钮。review 就是用它的口吻写出来的。它待在你的 statusline 上(Claude Code 和 Antigravity),在 macOS 菜单栏上是一个 emoji,在控制台的 Home 页也有它。

它不是装饰。等级、称号和解锁的动作,记录的是你们一起干了多久的活。

物种

五个物种。先挑一张脸 —— 之后哪个旋钮都可以再调。物种只决定起始数值、菜单栏上的 emoji,以及它长什么样。

每个物种有十张脸。三张是心情,显示哪张取决于它对最近那条 review 的感觉;另外七张是动作,随着升级解锁。

slime(史莱姆) 🟢(默认)—— 软乎乎,什么都不在乎,全面中庸。
起始旋钮:毒舌 5 · 耐心 5 · 严谨 5 · 话痨 5 · 好奇 5

 .---.        .---.        .---.        .---.        .---.
 (o.o)        (>.<)        (-.-)        (o.-)        (^.^)
 (___)        (___)         zzz         (___)        (___)
 平时         担心         睡着         偷看 L2      眨眼 L3

 .---.        .---.        .---.        .---.        .---.
 (-_-)        (o.O)        (^o^)        (o.~)        (-。-)
 [___]        ¯\_/¯        (_o/)        ~o/^\~       ☯___☯
 抱臂 L4      耸肩 L6      挥手 L8      伸懒腰 L11   打坐 L18

cat(猫) 🐱 —— 犀利、没耐心,默默嫌弃你的代码。
起始旋钮:毒舌 8 · 耐心 2 · 严谨 4 · 话痨 5 · 好奇 7

 /\_/\        /\_/\        /\_/\        /\_/\        /\_/\
 (o.o)        (>.<)        (-.-)        (o.-)        (^.^)
 > ^ <        > _ <         zzz         > ^ <        > ^ <
 平时         担心         睡着         偷看 L2      眨眼 L3

 /\_/\        /\_/\        /\_/\        /\_/\        /\_/\
 (-_-)        (o.O)        (^o^)        (o.~)        (-。-)
 >=-=<        ¯\_/¯        >o/^<        ~o/^\~       ☯ ^ ☯
 抱臂 L4      耸肩 L6      挥手 L8      伸懒腰 L11   打坐 L18

owl(猫头鹰) 🦉 —— 有耐心、严谨,要看证据。
起始旋钮:毒舌 3 · 耐心 8 · 严谨 9 · 话痨 5 · 好奇 8

 ,-,-,        ,-,-,        ,-,-,        ,-,-,        ,-,-,
 (O,O)        (>,<)        (-,-)        (O,-)        (^,^)
 =====        =====        =====        =====        =====
 平时         担心         睡着         偷看 L2      眨眼 L3

 ,-,-,        ,-,-,        ,-,-,        ,-,-,        ,-,-,
 (=,=)        (O,o)        (^,^)        (O,~)        (-。-)
 =[X]=        ¯===¯        ==o/=        ~o=o~        ☯===☯
 抱臂 L4      耸肩 L6      挥手 L8      伸懒腰 L11   打坐 L18

robot(机器人) 🤖 —— 话少、较真,只讲严谨不闲聊。
起始旋钮:毒舌 2 · 耐心 7 · 严谨 10 · 话痨 2 · 好奇 3

 [---]        [---]        [---]        [---]        [---]
 |o-o|        |x-x|        |---|        |o-_|        |^-^|
 [___]        [___]        [___]        [___]        [___]
 平时         担心         睡着         偷看 L2      眨眼 L3

 [---]        [---]        [---]        [---]        [---]
 |=-=|        |o-O|        |^-^|        |o-~|        |-。-|
 [X-X]        [¯_¯]        [_o/]        [~o~]        [☯_☯]
 抱臂 L4      耸肩 L6      挥手 L8      伸懒腰 L11   打坐 L18

bunny(兔子) 🐰 —— 温柔、话多、耐心无限。
起始旋钮:毒舌 1 · 耐心 9 · 严谨 5 · 话痨 8 · 好奇 5

 (\_/)        (\_/)        (\_/)        (\_/)        (\_/)
 (o.o)        (>.<)        (-.-)        (o.-)        (^.^)
 (=v=)        (=v=)         zzz         (=v=)        (=v=)
 平时         担心         睡着         偷看 L2      眨眼 L3

 (\_/)        (\_/)        (\_/)        (\_/)        (\_/)
 (-_-)        (o.O)        (^o^)        (o.~)        (-。-)
 [=v=]        ¯=v=¯        (=v/)        ~=v=~        ☯=v=☯
 抱臂 L4      耸肩 L6      挥手 L8      伸懒腰 L11   打坐 L18

什么时候是哪张脸

脸 什么时候
平时 一切看起来都好,或者它只是在旁边看着。
担心 最近那条 review 的严重程度是 medium 或 high,或者它烦了、累了。
睡着 在免打扰时段,或者今天的 token 预算用完了。
动作 每条 review 由 reviewer 挑一个。只有你已经解锁的才会显示。

担心和睡着这两种心情,永远盖过动作 —— 它在担心你代码的时候,不会冲你挥手。

有两个动作,伸懒腰(11 级)和打坐(18 级),会按时解锁,但 reviewer 目前还不会选它们。

五个旋钮

每个旋钮从 0 到 10,5 是中间值。离 5 越远,那一项性格就越明显。

先说清楚它们是怎么起作用的:这五个数字会直接写进 reviewer 读的那段指令里,旁边附一句话描述两端分别是什么样。怎么表现,由模型自己决定。所以旋钮改变的是它倾向于怎么做 —— 并没有「调到 8 就一定会怎样」这种规定。

下面的例子说的都是同一处改动 —— 有人把权限检查从 role === "admin" 改成了 role !== "viewer"。它们是用来示意两端的差别,不是真实 review 的原话。

毒舌(snark)—— 说话有多冲

  • 调低(0):温暖、鼓励、温和。
  • 调高(10):毒舌、爱损人、一针见血。

低:「提醒一下~现在除了 viewer,所有角色都能编辑了,不只是管理员。是想这样吗?」

高:「恭喜,除了 viewer,你把编辑权发给了所有人。真敢。」

耐心(patience)—— 多快开口

  • 调低(0):看到第一个可疑的地方就说,门槛很低。
  • 调高(10):只提真正的问题,小事就放过。

低:会指出权限的改动,还会顺带说 canEdit 可以只传角色、不用传整个用户。

高:只指出权限的改动,别的都不提。如果一处改动里没什么大问题,它几乎不出声。

严谨(rigor)—— 拿什么撑它说的话

  • 调低(0):凭感觉 —— 直觉判断,不引用出处。
  • 调高(10):有条理 —— 标出文件和行号,每个判断都摆出依据。

低:「感觉这把编辑权放得太宽了。」

高:「auth.ts:84 —— !== "viewer" 会放行所有不是 viewer 的角色,包括你还没定义的。之前只有 admin 能过。」

话痨(chattiness)—— 说多少

  • 调低(0):一句短话。
  • 调高(10):更完整的一段,把背后的细节也讲出来。

低:「现在几乎人人都能编辑了。」

高:同样那句话,后面再接上:哪些角色多了权限、还有哪些代码调用了 canEdit、收紧一点的写法大概长什么样。

好奇(curiosity)—— 会不会往眼前之外看

  • 调低(0):只评判这次改动本身,照章办事。
  • 调高(10):还会提别的做法、「如果……会怎样」、「你有没有想过……」。

低:「条件从『只允许一个角色』变成了『除一个之外都允许』。」

高:「……有没有想过用白名单,比如 ["admin", "editor"].includes(role)?这样新加的角色默认是被挡在外面,而不是被放进来。」

想改旋钮:再跑一遍 /siltpoke-setup,选自己调。或者直接改 ~/.siltpoke/config.json 里的 snark、patience、rigor、chattiness、curiosity —— 下一条 review 就会用新的数值。

原型

旋钮组合起来还会得到一个原型 —— 你捏出来的这种性格的名字。snark(毒舌)、patience(耐心)、 rigor(严谨)、chattiness(话痨)按这个顺序,每个 6 及以上算高(1),低于 6 算低(0)。四个拼成一个键,16 种键各有一个名字:

键 名字 大概什么样 ~MBTI
1000 暴脾气 又快又冲,撂下一句就走,没有下文 ISTP
1001 喷子 长篇激情开喷,能量拉满、证据稀薄 ESTP
1010 鹰派 眼尖、零容忍、外科手术般精准——闷声狩猎 ISTJ
1011 教官 逮到每个 typo 就吼;其实很上心,只是用嗓门表达 ESTJ
1100 调侃者 爱开玩笑地戳你,但并不真想让你难受 INTP
1101 吐槽王 嘴利心善,就爱有观众 ENTP
1110 狡狐 什么都看在眼里、话少,一开口就是致命一击 INTJ
1111 毒舌教练 毒舌导师——既会损你、也会教你 ENTJ
0000 操心鬼 默默焦虑、凭感觉,话不多 ISFP
0001 慌张鬼 又焦虑又话痨,全是嗓门——可爱的一团乱 ESFP
0010 完美主义者 焦虑地细心;不吼,只是把担心写在脸上 ISFJ
0011 焦虑警官 每个细节都念叨出声——但出于好意 ESFJ
0100 禅僧 什么都由它去;只讲感觉,梦一般地超脱 INFP
0101 啦啦队长 阳光——耐心、话痨、不讲严谨,专门给你打气 ENFP
0110 耐心贤者 安静、有条理、温和;轻声细语地摆出证据 INFJ
0111 圣人 耐心、细致、温暖、爱出声——纯粹的好 ENFJ

curiosity(好奇)会加一个前缀:7 及以上是「好奇的」,3 及以下是「沉稳的」。所以一共有 48 种名字。

原型只是一个名字。它描述的是旋钮,不会改变宠物的表现 —— 改变表现的是旋钮本身。

~MBTI 这一列只是图个乐的大概对照。Siltpoke 的五个旋钮不是 MBTI 的四条轴,当成「气质相近」看就好,别当成真正的类型。

设置时怎么定旋钮

/siltpoke-setup 有五种定性格的方式:用物种的起始数值、自己一个个调、随机、做一个小问卷、或者让它读你 ~/.claude/ 里的记忆来猜。

选问卷或读记忆的话,它还会问你,宠物应该跟你是什么关系:

模式 效果
镜像(mirror) 宠物像你。你毒舌,它也毒舌。
互补(complement) 宠物补你的短板。你不爱抠细节,它就很严谨。
混合(hybrid) 语气上像你(毒舌、话痨),做事上补你(严谨、耐心、好奇)。

这只在定旋钮的那一刻用一次,之后不会再自动调整。

XP、等级与称号

XP 从哪来:

  • 用 /siltpoke-last 把一条新 review 拿进对话:每条 +10 XP,只算一次。
  • 在控制台 Home 页照顾它—— 喂食(+5)、摸摸(+5)、清洁(+5)、玩耍(+3)。这几项加起来每天最多 100 XP。超过以后还是能让它开心,只是不再给 XP。
  • 逗它不给 XP,还会让它心情变差。一天逗三次它就会闹脾气:当天剩下的时间里,照顾它每次只给 1 XP。

XP 只会涨不会降。一条 review 就算后来证明是错的,也不会扣你任何东西。

等级越往后越难升:

等级 升到下一级要多少 XP
1–5 100 × 当前等级
6–10 250 × 当前等级
11–20 500 × 当前等级
21+ 1000 × 当前等级

从 1 级到 2 级要 100 XP;从 2 级到 3 级要 200。前面的解锁来得很快,Sentinel 以后就是按月算,不是按天算了。

每一级解锁什么:

等级 称号 动作
1 Hatchling(雏鸟) —
2 Watcher(守望者) 偷看
3 眨眼
4 抱臂
5 Apprentice(学徒)
6 耸肩
8 挥手
10 Sentinel(哨兵)
11 伸懒腰(暂未使用,见上文)
13 Veteran(老兵)
18 打坐(暂未使用,见上文)
20 Sage(贤者)
30 Oracle(先知)
50 Ancient(远古者)
100 Legend(传奇)

15 级起,宠物旁边会出现一个小小的 ★,25 级起变成 ✦。

statusline 上宠物名字下面会显示等级和 XP —— L7 820/1750 的意思是:7 级,升到 8 级一共要 1750 XP,现在有 820。

语言

宠物 —— 以及每一条 review —— 说的是你设置时选的语言:English、简体中文、繁體中文、日本語、 한국어、Español、Français 或 Deutsch。你也可以填别的语言代码,它会原样传过去。代码、文件名、函数名保持原样。

安装与设置

Siltpoke Review 是一个插件,下面五个 agent 都能跑。装它的同时也会装好 Siltpoke Dashboard。

最省事的装法:复制一段 agent 提示词贴进你的 agent,它替你装好、设置好 —— 见用 agent 提示词安装。下面的命令是同一套安装,一步一步来。

先要有两样东西:

  • 一个 coding agent。还没有的话,先看安装 coding agent。
  • Bun。 Siltpoke 的 hook 和命令都靠它跑 —— 没有 Bun,插件装上了也不会有任何动静。curl -fsSL https://bun.sh/install | bash

开始之前,有两处差别值得先知道:

  • Claude Code、Codex、CodeBuddy、Qoder 可以直接从 GitHub 装;Antigravity 得先把仓库克隆到本地。
  • 装完还不算完,创建宠物才是最后一步。你的设置都存在宠物身上,所以宠物没创建之前,一次 review 都不会跑。这台电脑上所有 agent 共用同一只宠物:随便在哪个 agent 里创建一次就行。

Claude Code

这两条是斜杠命令,在 Claude Code 里面输入:

/plugin marketplace add Siltpoke/siltpoke
/plugin install siltpoke

然后创建你的宠物:

/siltpoke-setup

这是一段简短的对话。选「秒装」的话,你会得到一只随机取名的史莱姆,说的是你正在用的语言 —— 确认一次就好。另一条路是自己捏:选物种、起名字、选语言,再选怎么定性格 —— 用物种默认值、一个个旋钮自己调、随机、做一个小问卷、或者让它读你 ~/.claude/ 里的记忆。详见宠物。

重启 Claude Code。宠物的脸会出现在 statusline 上,你的下一次提交就会收到第一条 review。

以后更新,在终端里跑:

claude plugin marketplace update siltpoke
claude plugin update siltpoke

卸载:claude plugin uninstall siltpoke。你的数据会留下来 —— 见彻底删除。

之前是从源码装的?/siltpoke-setup 会把你迁移到插件上,并关掉旧的 Stop hook,这样 review 不会跑两次。

Codex

codex plugin marketplace add https://github.com/Siltpoke/siltpoke
codex plugin add siltpoke@siltpoke
codex plugin list        # 应该显示:siltpoke … installed, enabled

Codex 不支持自定义斜杠命令,所以跟 Siltpoke 说话用大白话就行 —— 「帮我设置 Siltpoke 宠物」、「打开 Siltpoke 控制台」。装完之后的第一个 session 会提醒你。Codex 里的设置是精简版:定性格的方式有三种而不是五种,而且它只会创建新宠物,不会重建一只已经有的。

Codex 没有 statusline,所以在 Mac 上加一个菜单栏宠物,review 一到就能看见。

以后更新:

codex plugin marketplace upgrade
codex plugin add siltpoke@siltpoke

卸载:codex plugin remove siltpoke@siltpoke。

Antigravity

Antigravity(agy)只能从本地文件夹装 —— 而且要装的是仓库里的 .antigravity-plugin 文件夹,不是仓库根目录。装根目录的话,Siltpoke 会被登记成 Claude Code 插件,Antigravity 就永远不会跑它的 review hook。不会有任何提示,只是一条 review 都没有。

git clone https://github.com/Siltpoke/siltpoke.git ~/siltpoke
agy plugin install ~/siltpoke/.antigravity-plugin
agy plugin validate ~/siltpoke/.antigravity-plugin

克隆下来的仓库里已经带了编译好的插件,不用先编译。(如果你跟的是仓库的主分支而不是发布版,装之前先跑 cd ~/siltpoke && bun install && bun run build:dist 重新编译。)

Antigravity 插件里只有 review hook —— 安装时它会打印 commands: skipped,Antigravity 里面也没有设置命令。宠物要在别的 agent 里创建(比如 Claude Code 里的 /siltpoke-setup),或者在克隆下来的仓库里跑 bun run setup。宠物创建之前,Antigravity 的 review 不会跑。

如果你用无界面的方式跑 Antigravity(agy -p),就别用插件,在克隆的仓库里跑 bun run setup --agent agy —— 这种情况下插件装了也碰不到工作目录。这条路也会顺带配好 Antigravity 的 statusline。

以后更新:cd ~/siltpoke && git pull,然后再跑一遍同样的 agy plugin install。

卸载:agy plugin uninstall siltpoke。

CodeBuddy

codebuddy plugin marketplace add https://github.com/Siltpoke/siltpoke
codebuddy plugin install siltpoke@siltpoke

@siltpoke 不能省。省了的话会报错 Marketplace 'undefined' is not ready。装完重启 CodeBuddy。

用 /siltpoke-setup 创建宠物。如果 CodeBuddy 里找不到这个命令,就在别的 agent 里创建,或者在克隆的仓库里跑 bun run setup —— 反正是同一只宠物。

CodeBuddy 没有 statusline,所以在 Mac 上加一个菜单栏宠物。

以后更新(更新完重启 CodeBuddy):

codebuddy plugin marketplace update siltpoke
codebuddy plugin update siltpoke@siltpoke

卸载:codebuddy plugin uninstall siltpoke@siltpoke。

Qoder

命令是 qodercli,不是 qoder:

qodercli plugin marketplace add https://github.com/Siltpoke/siltpoke
qodercli plugin install siltpoke@siltpoke

和 CodeBuddy 一样:@siltpoke 不能省。重启 Qoder,或者在里面跑 /plugins reload。

用 /siltpoke-setup 创建宠物;Qoder 里找不到这个命令的话,就在别的 agent 里创建,或者在克隆的仓库里跑 bun run setup。

Qoder 也没有 statusline;在 Mac 上用菜单栏宠物。

以后更新:

qodercli plugin marketplace update siltpoke
qodercli plugin install siltpoke@siltpoke

第二行就是安装命令再跑一遍,这是有意的:这个版本的 Qoder 上 qodercli plugin update 会报 Cannot resolve relative source 失败,重装才能拿到刷新后的市场内容。

卸载:qodercli plugin uninstall siltpoke@siltpoke。

从源码装

想从克隆下来的仓库跑的话,终端里的向导会把整套设置做完:

git clone https://github.com/Siltpoke/siltpoke.git ~/siltpoke
cd ~/siltpoke && bun install
bun run setup                          # Claude Code
bun run setup --agent codex            # 或者:codebuddy,qoder · agy

和插件版有一处不同:从源码装的话,不管是哪个 agent 写的代码,默认都由 Claude 来审。删掉它: bun run uninstall(加上 -- --purge 会连数据一起删)。

彻底删除

卸载插件会让 review 停下来,但你的宠物和它的历史还留在硬盘上,方便你哪天回来。想全部删干净:

  1. 如果加过菜单栏宠物,先跑 /siltpoke-menubar remove —— 插件一卸,这个命令也跟着没了。
  2. 卸载插件(你那个 agent 的命令在上面对应的那一节)。
  3. 删掉 ~/.siltpoke/。
  4. 删掉每个被它 review 过的项目里的 .siltpoke/ 文件夹。
  5. 如果你用的是 Claude Code,statusline 还指着 Siltpoke 的脚本。把 ~/.claude/settings.json 里的 statusLine 那一项删掉,或者换回你原来的。

第一次用

  • 检查装好没有:/siltpoke-doctor 会列一张检查清单 —— ✓ 没问题,⚠ 值得看一眼,◦ 仅供参考,✗ 坏了。每个 ✗ 都附带修法。
  • 拿到第一条 review:提交一次。review 会出现在你的宠物上(或者菜单栏里), /siltpoke-last 把它拿进对话。
  • 看全部:/siltpoke-dashboard 打开完整的历史。
  • 换另一家公司的模型来审:/siltpoke-brain —— 见跨家族 review。
  • 想安静一会儿:/siltpoke-mute 1h。

十个命令都在命令那一章。在 Codex 里,直接用大白话说你要什么。

命令

一共十个命令,这就是全部了 —— /siltpoke-help 列出来的也是这十个。其余的东西(review 历史、把一条 review 标成看过或者不对、和宠物聊天、它的记忆、代码地图)都在控制台里,不靠命令。

大部分日子你只会用两个:/siltpoke-last 把一条 review 拿进对话,/siltpoke-dashboard 看全部。

看 review

命令 做什么
/siltpoke-last 把最近一条 review 拿进对话。这是 review 进入你聊天的唯一途径 —— Siltpoke 从不自己往里塞。拿进来的是一条你还没看过的,宠物就得 +10 XP。还没有 review 的话,它会直说。
/siltpoke-dashboard 打开 http://127.0.0.1:9876 的控制台,没在跑的话先把它启动。之后它就一直开着,菜单栏宠物和 review 里的链接才能用。
/siltpoke-restart-daemon 把控制台的服务停掉、重新启动一个。更新 Siltpoke 之后用,或者 /siltpoke-doctor 说正在跑的服务版本旧了的时候用。

你的 agent 通过 /siltpoke-last 读到一条 review 时,会被提醒这条 review 可能是错的,动手之前先去看代码。这是故意的:review 是第二个人的意见,不是命令。

控制 review

命令 做什么
/siltpoke-mute <时长> 让它暂时别审 —— 演示、结对编程、乱试一通的时候。15m、30m、1h、4h、1d、2d,或者任意几分钟、几小时、几天,或者 indefinite(一直静音)。静音期间什么都不会审。
/siltpoke-unmute 提前结束静音。本来就没静音的话,什么也不发生。
/siltpoke-brain 查看或更换给你审代码的模型。见下面。

/siltpoke-brain 有三种用法:

/siltpoke-brain                                    看现在的设置
/siltpoke-brain set review <家族> [模型]            所有代码都交给同一个 reviewer
/siltpoke-brain set-builder <写代码的> <审代码的> [模型]
                                                   按写代码的 agent 分别指定 reviewer

家族、写代码的、审代码的,都从这五个里选:claude、codex、agy(Antigravity)、qoder、 codebuddy。只有 reviewer 是 claude 的时候才能指定模型:claude-haiku-4-5(默认)、 claude-sonnet-4-6 或 claude-opus-4-8。另外四家用的是你在那个 CLI 上的账号给的模型。改完之后下一条 review 就生效。

比如 /siltpoke-brain set-builder claude codex 的意思是:只要是 Claude Code 写的代码,就交给 Codex 审。为什么要这样、换之前要知道什么,见跨家族 review。

设置与检查

命令 做什么
/siltpoke-setup 创建你的宠物:物种、名字、语言和性格。之后随时再跑一遍就能改。它是一段简短的对话 —— 见安装与设置。
/siltpoke-doctor 检查安装情况,列一张清单:✓ 没问题,⚠ 值得看一眼,◦ 仅供参考,✗ 坏了。每个 ✗ 都附带修法。每一行在查什么,见故障排查。
/siltpoke-help 简短的说明书:十个命令、控制台在哪、现在是哪个模型在审。

菜单栏宠物

命令 做什么
/siltpoke-menubar install 把宠物放到 macOS 菜单栏上。需要先装免费的 SwiftBar。
/siltpoke-menubar status 看有没有装好。只打 /siltpoke-menubar 也是这个效果。
/siltpoke-menubar remove 把它从菜单栏拿掉。

菜单栏宠物显示什么,见 Overview。

在 Claude Code 以外的 agent 上

  • Codex 不支持自定义斜杠命令。用大白话说就行 —— 「给我看最近一条 Siltpoke review」、「让 Siltpoke 静音一小时」、「打开 Siltpoke 控制台」。有一个例外:在 Codex 里没法这样换 reviewer,要去另一个 agent(比如 Claude Code)里跑 /siltpoke-brain —— 这个设置整台电脑的 agent 共用。
  • CodeBuddy 和 Qoder 用的是同样的斜杠命令。如果你那边没有列出来,就用大白话说,或者去 Claude Code 里跑 —— 这台电脑上所有 agent 共用同一套设置。
  • Antigravity 没有自己的命令。用别的 agent,或者用控制台。

如果你用过旧版本

下面这些命令已经没有了,它们各自去了哪里:

旧命令 现在
/siltpoke-report /siltpoke-dashboard —— 改名了
/siltpoke-report-stop /siltpoke-restart-daemon —— 改名了
/siltpoke-inbox 控制台里的 review 历史
/siltpoke-forward <id> 最近一条用 /siltpoke-last;更早的在控制台里
/siltpoke-ack、/siltpoke-dismiss 控制台里每条 review 旁边的 ACK 和 DISMISS 按钮
/siltpoke-pet、/siltpoke-feed 控制台 Home 页上的按钮
/siltpoke-stats 控制台的 Home 页
/siltpoke-remember 在控制台里跟宠物聊天时直接告诉它
/siltpoke-index、/siltpoke-explain 控制台里的代码地图

配置

所有设置都在一个文件里:~/.siltpoke/config.json。这台电脑上所有项目、所有 coding agent 共用这一份 —— 没有按项目分开的配置。每一项都有默认值,所以你完全可以不去碰它。

大部分设置有比改文件更方便的办法:

想改… 用
你的宠物 —— 物种、名字、语言、性格 /siltpoke-setup
用哪个模型来审你的代码 /siltpoke-brain
让它歇一会儿 /siltpoke-mute

其余的都在下面。如果你直接改文件,记得保持 JSON 格式正确 —— /siltpoke-doctor 会检查 —— 下一条 review 就会用上新的设置。

什么时候审

{ "reviewUnit": "commit" }
值 审什么
commit(默认) 每一次改了文件的新提交。
pr 整个分支,跟它分出来的那个分支比,随着分支变长一起审。如果你在默认分支上、没有可以比的对象,就退回按提交审。

不管哪种,没有新东西可看的时候它都不出声:没有新提交、提交里的文件跟上次审过的一模一样(amend 或者 rebase 了但内容没变)、只改了文档、或者这个文件夹不是 git 仓库。放在 prompts/ 文件夹里的文件、以及以 .prompt.md 结尾的文件,算代码,不算文档。

如果你的配置里还留着旧的 triggerMode(always、gates、on_demand 或 hybrid),它会被忽略 —— 这四个值现在都等于 commit。它会原样留在文件里,这样退回旧版本时还能找到。

每日预算

{
  "budget": {
    "dailyTokenLimit": 500000,
    "softWarnAtPercent": 80,
    "hardStopAtPercent": 100,
    "resetAt": "00:00"
  }
}

这是给 Siltpoke 自己每天花的 token 设的上限。用到上限的 softWarnAtPercent(默认 80%)之后,当天剩下的时间就不再审了。到 hardStopAtPercent(100%)时宠物也会睡着。计数在 resetAt 清零,默认是半夜 12 点。

从提示词缓存里读回来的 token 按十分之一计算,因为它们大约也只花这么多钱。把 dailyTokenLimit 设成 0 就是关掉预算。

如果换另一家公司的模型来审,那些调用也算在同一个上限里,另外还有一个每天调用次数的上限 —— 见跨家族 review。

免打扰时段

{ "quietHours": { "start": "23:00", "end": "08:00" } }

这段时间里不审,宠物也会睡着。时段可以跨过半夜。默认是关的。

你的宠物

这些是 /siltpoke-setup 写进去的,你也可以在这里直接改:

键 是什么
name 宠物的名字。
species slime、cat、owl、robot 或 bunny。
language 它和它的 review 说的语言 —— en、zh-CN、zh-TW、ja、ko、es、fr、de,或者别的语言代码。
snark、patience、rigor、chattiness、curiosity 五个旋钮,0–10。每个管什么,见宠物。

谁来审

/siltpoke-brain 会帮你写这些:

键 做什么
brain.roles.review 所有代码交给同一个 reviewer:{ "provider": "codex" },或者 { "provider": "claude", "model": "claude-sonnet-4-6" }。
brain.review_by_builder 按写代码的 agent 分别指定,比如 { "claude": { "provider": "codex" } } —— 在 Claude Code 里写的代码交给 Codex 审。

两个都不设的话,每个 agent 的代码由它自己那一家的模型来审。怎么选、换之前要知道什么,见跨家族 review。

控制台和它保留的东西

键 默认 做什么
daemon.enabled false 控制台的服务要不要一直开着。你第一次用 /siltpoke-dashboard 打开它时,会自动变成开。
traces.retention_days 30 控制台保留多少天的详细 review 记录。
traces.max_storage_mb 不设 给这些记录设一个可选的大小上限。不设的话,只按天数清理。
index.allowRoots 你的用户主目录 代码地图可以建索引的文件夹。如果你的代码放在主目录以外,把那个文件夹加进来。
index.timeoutMs 600000 给一个仓库建索引最多花多久,超时就停(10 分钟)。

statusline

键 默认 做什么
minimalMode false 更紧凑的 statusline,不显示宠物的脸。

statusline 本身是 /siltpoke-setup 一次性配好的(Claude Code 和 Antigravity 上),不是这个文件里的设置。

其他东西存在哪

文件夹 里面有什么
~/.siltpoke/ 配置、你的宠物和它的 XP、它的记忆(包括它对每个项目知道些什么)、每一次 review 和跳过的记录,以及控制台的详细记录。
<你的项目>/.siltpoke/ 这个项目的 review、宠物在这个项目里最近的心情,以及代码地图存下来的解释。

review 跟着它说的那个项目走;宠物、XP 和预算是所有项目共用的。

跨家族 review

默认情况下,哪个 agent 写的代码,就由它自己那一家来审:Claude Code 写的由 Claude 审,Codex 写的由 Codex 审。reviewer 在单独的进程里、用它自己的一套指令,但终究是同一家的模型。这一章讲的是把 review 交给另一家 —— 比如 Claude 写、Codex 审。

为什么要换

一个模型读自己那一家写的东西,往往带着同样的盲点:写出 bug 的那个假设,也正是让它读的时候一眼带过的那个假设。另一家公司的模型训练方式不同,漏掉的东西也不同。

这就是这个选项存在的原因。至于它能让 review 好多少,目前还没有测过 —— 见下面的「换之前要知道的」。

怎么设置

reviewer 那一家的 CLI 要装在这台电脑上,并且已经登录。Siltpoke 就用这个登录去调用它,跟调用 Claude 一样,所以不用另外加 API key。

值 reviewer 用哪个模型
claude Claude Code 你来选:claude-haiku-4-5(默认)、claude-sonnet-4-6 或 claude-opus-4-8。
codex OpenAI Codex CLI 你的 Codex 用的是哪个就是哪个。
agy Antigravity Antigravity 设成哪个就是哪个。
qoder Qoder Qoder 设成哪个就是哪个。
codebuddy CodeBuddy CodeBuddy 设成哪个就是哪个。

然后从两种方式里选一种。

按写代码的 agent 分别指定 —— 一般选这个:

/siltpoke-brain set-builder claude codex

从此 Claude Code 写的代码交给 Codex 审。别的 agent 写的代码仍由它自己那一家审,除非你也给那个 agent 加一条。

所有代码都交给同一个 reviewer:

/siltpoke-brain set review codex

不管哪个 agent 写的代码,都交给 Codex 审 —— 包括 Codex 自己写的,那部分就又变回同一家审了。

两种方式都是下一条 review 就生效。

设置冲突时听谁的

如果设了不止一处,按下面的顺序,排在前面的说了算:

  1. 环境变量 SILTPOKE_REVIEWER_PROVIDER,用来临时测试。
  2. 所有代码交给同一个 reviewer(set review,存在 brain.roles.review)。
  3. 旧的 reviewer_provider 设置,如果你的配置里还留着。
  4. 给写这段代码的 agent 指定的 reviewer(set-builder,存在 brain.review_by_builder)。
  5. 写这段代码的 agent 自己。

所以一旦设了「所有代码交给同一个 reviewer」,按 agent 分别指定的那几行就不起作用了。而且没有命令能撤销它:想改回来,要打开 ~/.siltpoke/config.json,删掉 brain 里的 roles(如果你在里面还固定了别的角色,就只删其中的 review)。

换之前要知道的

  • 花的是那一家套餐的额度,不是钱。 另外四家都从你在那家公司的套餐里扣。Siltpoke 不会给这些调用估一个美元数 —— 花费显示为未知 —— 但它们用掉的 token 照样算进你的每日 token 预算。此外,每一家还各有一个每天 50 次调用的上限。到了上限,当天剩下的 review 就跳过,直到计数在 UTC 午夜清零 —— 不是像 token 预算那样在你当地的午夜。
  • Siltpoke 没法锁定模型。 另外四家用哪个模型,取决于那个 CLI 自己的设置。Siltpoke 会记下它在那个 CLI 配置里读到的模型名,但没法确认实际回答的是哪个 —— 那家公司可以改变一个模型名背后对应的东西。
  • review 质量还没有认证。 Siltpoke 有自己的一套 review 质量测试。在 v1.0.0 里,另外四家还没有一家通过 —— 当 /siltpoke-doctor 的 review 那一行写的是它们之一时,会显示 eval: uncertified。它们能用,只是还没测过。CodeBuddy 测得最少:它读回复的方式跟 Qoder 一样,但还没有拿真实的 CodeBuddy 回复跑过。
  • 它绝不会悄悄换回 Claude。 如果 reviewer 的 CLI 没装或者跑不起来,这次 review 就跳过。Siltpoke 不会拿 Claude 顶上,因为把 Claude 的 review 标成跨家族,就是贴错了标签。CLI 没装的时候, /siltpoke-doctor 会显示 ⚠ not found on PATH。
  • Antigravity 也能跑 Claude 的模型。 如果你的 Antigravity 设成了其中一个,那就又是 Claude 审 Claude 了。请在 Antigravity 自己的设置里选一个不是 Claude 的模型。
  • 你自己给 Codex 加的 hook 照样会跑。 Siltpoke 自己的 hook 认得出它发起的 review 调用,会避开,所以一次 review 不会再触发另一次 review。但你自己加在 Codex 里的 hook 分不出来,每次 review 调用它们都会跑。

怎么看现在是谁在审谁

单独跑 /siltpoke-brain。按 agent 分别指定的设置列在 per-builder review overrides 下面,每个 agent 一行:claude → codex 的意思是 Claude Code 写的代码由 Codex 审。

检查按 agent 分别指定的设置时,别看 review 那一行 —— 不管是 /siltpoke-brain 输出里的,还是 /siltpoke-doctor 里的。这两行都是在 review 之外算出来的,那时没有 agent 在写代码,所以它们显示的是「不知道谁写的」时会用谁 —— 通常是 claude,外加一句「跟作者是同一家」—— 哪怕你的代码其实正交给 Codex 审。如果你设的是所有代码交给同一个 reviewer,这两行就是准的。

故障排查

先跑 /siltpoke-doctor

它把安装的每一块分开检查,每一项打印一行。挂掉的那行会把修法一起写出来 —— 直接照着那行做,它会指名是哪个文件、该跑哪条命令,不用猜。

记号 意思
✓ 没问题
⚠ 值得看一眼,但没坏
◦ 仅供参考 —— 通常是「这一块没配,而且本来也不必配」
✗ 坏了。这一行后面就是修法。

最后一行是总数:All N checks passed. Install healthy.,或者 N of M checks failed.。加 --quiet 只要这一行;加 --json 给别的程序读。

它检查哪些东西

你的 agent 会不会去叫 Siltpoke

这一行 挂了是什么意思
~/.claude/settings.json valid 文件不在,或者不是合法的 JSON。不在通常说明这台机器上还没设置过 —— 跑 /siltpoke-setup。
Stop hook registered … 没有东西告诉 Siltpoke「你的 agent 这一轮结束了」,所以 review 永远不会开始。插件安装时这行是 ◦,写着 hook 由插件自己管,这是正常状态。
slash commands 插件安装时是 ◦:命令随插件一起装,没什么可查的。只有从源码装才会变成真正的检查。
~/.siltpoke/config.json valid 你的宠物缺了名字、物种或语言。再跑一次 /siltpoke-setup。
~/.siltpoke/global.json schema v3 current Siltpoke 自己的状态文件跟这个版本期望的格式对不上。这一行会指名是哪个字段。
~/.siltpoke/inner.txt readable · ~/.siltpoke/wake.json healthy 这两个文件不存在都算正常,只有「存在但读不了」才算坏。

review 到底有没有在跑

这一行 意思
last Brain call: none recorded yet 还没审过任何东西。刚装完时是正常的。
last Brain call: ok @ … 上一次 review 成功了。如果更早有过失败,会写在括号里。
last Brain call: failing 这一行给出失败类型、时间、错误摘录,以及连续失败了几次。写着 breaker open 就是 Siltpoke 暂时不再尝试了。
brain role: review(还有 chat 和 extract) 这件事由哪一家的模型做、用哪个模型、是不是跟写代码的同一家。见跨家族 review。

控制台

这一行 意思
daemon alive (/api/ping) 控制台的服务没开着时是 ◦ —— 那是你的选择,不是故障。只有「设了要开却叫不应」才是 ✗。
daemon running latest code 服务没开时跳过。写着 daemon N commits behind — restart 就重启它:/siltpoke-restart-daemon。
daemon autostart configured ◦ not installed 是正常的 —— 开机自启本来就要你自己开。
index staleness 只会是 ⚠。代码地图的索引落后于文件了,去控制台的 Code Map 页重建。

你的项目

这一行 意思
registered project roots still exist 有一个 Siltpoke 审过的文件夹被移走或删掉了。
project resolution survives cwd=/ 刚装完时是 ⚠ no active project yet。真挂了意味着控制台认不出你在哪个项目里。

如果你用 Antigravity,还会多一行 ~/.gemini/config/hooks.json siltpoke-review Stop registered (agy)。文件不在时它是 ◦,因为 Antigravity 要从源码 checkout 里手工接上 —— /siltpoke-setup 不管这件事。

review 一直不出现

Siltpoke 主动不出声的时候,比它坏掉的时候多得多。它每一轮都会做判断,并把原因写进 ~/.siltpoke/brain-calls.jsonl —— 最后几行里带 skipped 字段的那些就是答案:

skipped 为什么
muted /siltpoke-mute 还开着,用 /siltpoke-unmute 结束它。
quiet_hours 你在免打扰时段里(见配置)。
no_change · no_code_changes · docs_only 没有新东西可看:没有新提交、文件跟上次审的一样、或者只改了文档。
not_a_git_repo 这个文件夹不是 git 仓库。Siltpoke 审的是提交,没有可依据的东西。
no_new_commit 自上次 review 之后没有新提交。
tree_unchanged 有提交,但文件内容一模一样 —— 改了提交信息的 amend,或者只挪了位置的 rebase。
recursion_guard 这一轮是 Siltpoke 自己的 reviewer 在跑。它不审自己。
soft_budget_on_demand 每日 token 预算用掉了 80%。review 到这里就停了,而宠物看上去还醒着。把 budget.dailyTokenLimit 调大,或者设成 0 关掉预算。
budget_hard_stop 当天预算用完了,宠物睡着了。
quota_cap 你选的那家 reviewer 今天的 50 次调用用完了(见跨家族 review)。
brain_breaker_open 连续失败太多次,Siltpoke 停止尝试了。

如果某一轮你明明提交了东西,却连一条 skipped 都没有,那就是 hook 根本没跑:去看 /siltpoke-doctor 里 Stop hook registered 那一行,然后重启你的 agent。

其他症状

statusline 里看不到宠物。 只发生在 Claude Code。~/.claude/settings.json 里的 statusLine 要指向 Siltpoke 的脚本 —— /siltpoke-setup 会写好它 —— 而且改完必须重启 Claude Code。

连着报错几次之后 review 就不跑了。 /siltpoke-doctor 的 last Brain call: failing 那行写着原因。如果写的是 breaker open (permanent),说明它闩住了、不会再重试:如果是 claude 这个命令找不到,下次跑 doctor 时它找到了就会自己解开;但如果是登录的问题,它解不开 —— 先把登录修好,然后删掉 ~/.siltpoke/brain-health.json,它才会重新尝试。

控制台是空的,或者显示的是旧 review。 用 /siltpoke-restart-daemon 重启它。如果是某一个项目的 review 一直不出现,去看 doctor 输出里的 registered project roots still exist。

review 的语言不对。 由宠物的 language 决定。再跑一次 /siltpoke-setup,或者直接改 ~/.siltpoke/config.json 里的 language。

Codex 不认识 /siltpoke-* 命令。 这是正常的 —— 用大白话说就行(见命令)。

从头来过。 怎么彻底删干净,见安装与设置。

架构

一个 agent 审自己写的代码,用的是它刚刚写代码时的那套假设。Siltpoke 是第二个读者:单独的进程、自己的一套指令、自己记着看过什么。它跑在你已经有的登录上,所以不会多出一笔账单。默认由写代码的那一家模型来审,一条命令就能把这件事交给另一家(见跨家族 review)。

这套 review 循环

   你的 agent 结束一轮
             │
             ▼
   1. 关卡 ......... 静音?免打扰时段?预算用完?有新提交吗?→ 到此为止
             │
             ▼
   2. 收集依据 ..... diff · 13 项检查 · tsc · eslint · ripgrep · 安全扫描
             │       (还没有模型介入,不花 token)
             ▼
   3. 定性 ......... 没什么好说  ·  干净  ·  有东西要看
             │
             ▼
   4. 模型出场 ..... 用你宠物的口吻写那句小结,或者写完整的 review
             │
             ▼
   5. 查引用 ....... 每一处引用都必须能在依据里找到,找不到就删掉
             │
             ▼
   6. 落盘 ......... 绝不进你的对话

这个结构里有两件事值得单独点出来。

定性发生在模型之前,不是之后。 这次属于哪一类,是拿收集到的依据、用普通代码判定的;然后才去要求模型写那一类的 review。不是让模型先写一通、再去判断它值不值得说。

没有任何东西是推给你的。 每条 review 都写到磁盘上,只有你跑 /siltpoke-last 时它才进入对话 —— 所以一条 review 永远不会在你干活干到一半时打断你。

模型出场之前,它读了什么

对 diff 做的十三项检查。 没有模型,不花 token,就是普通代码:

检查 什么时候报
文件过大 文件超过 500 行
缺测试 某个源码文件新增超过 30 行,却没有测试跟着改
函数过大 超过 50 行,或者绕得读不下去
嵌套太深 超过 3 层
参数太多 超过 4 个参数
吞掉的报错 try/catch 把错误悄悄丢掉了
摊得太开的抽象 一个接口只有一个实现、一个调用方(只查 TypeScript)
复述式注释 注释只是把下一行又说了一遍
魔法数字 没有说明的数字(0、1、-1、100 不算)
布尔参数 直接把 true/false 当参数传进去
注释掉的代码 代码被注释掉留在那里
跟这个仓库不一致 这次改动跟 Siltpoke 记下来的这个代码库的事实冲突
不符合你的惯例 它偏离了这个仓库一直在遵守的某个写法

其中九项要把代码解析成语法树来读,而那个解析器认识的是 TypeScript、TSX、JavaScript、JSX 和 Python。换成别的语言,这九项就保持沉默、不猜 —— 文件过大和缺测试这两项在任何语言里都照跑。

四个工具,用得上才跑。 改了 TypeScript 文件、并且项目里有 tsconfig.json 时跑 tsc;项目里真有一份 ESLint 配置时跑 eslint;只要是 git 仓库就跑 git diff;ripgrep 总是安排上,没装的时候它会明说没装。除此之外,每个改动过的文件都会被扫一遍:有没有泄露的密钥,有没有不可信的输入流进了危险的地方。

三种去向

拿收集到的依据,用代码判定是哪一种:

去向 什么时候 你会看到
没什么好说 没有任何工具给出可用的结果,或者根本没改什么 不出声
干净 工具全都干净,但确实改了代码 宠物说一句短话
有东西要看 tsc、eslint 或 ripgrep 报了东西 一条完整的 review

查引用

一条 review 引用了代码,只有在引用是真的时候才有用。存下来之前,每一处引用的片段都必须逐字出现在真正收集到的那些依据里,而且它指名的文件要么是这次改动的文件之一,要么也出现在那些依据里。

找不到的引用会被删掉。review 本身会留下,并按它的表现打上标签:

  • verified —— 每一处引用都对上了。
  • partly unverified —— 一部分对上了,一部分没有。
  • none verified —— 给了引用,但一处都没对上。
  • no evidence —— 这条 review 没给任何可查的东西。
  • not checked —— 压根没查,因为没东西可查:那句简短的「干净」小结就是这个标签,它不引用代码。

所以它不会拿一处 Siltpoke 自己都找不到的引用给你看,而且总会告诉你,你读的是哪一种。

那句「干净」小结有一件事没告诉你:决定它的不是那十三项检查。你拿到的是一句小结还是一条完整 review,只由 tsc、eslint、ripgrep 三个决定 —— 所以这三个满意的改动读起来就是「干净」,哪怕像魔法数字这样的检查有话要说。那些内容仍然写在磁盘上那条完整 review 里。

意图标签

每次改动会被打上五个标签之一 —— bugfix、refactor、feature、chore、exploration —— 依据是你的话、你的提交信息,以及你动了哪些文件里的模式匹配。这里没有模型参与,什么都没匹配上的改动会被标成 exploration。

要说清楚它今天到底管什么:这个标签会跟着 review 存下来、在它的 trace 里显示,而它唯一改变的东西是那句「干净」小结的措辞 —— 是重构就说是重构。它不会挪动任何阈值,也不会改变完整 review 怎么写。

那五个旋钮管什么、不管什么

五个性格旋钮会以数字的形式进到 reviewer 的指令里,每一个都附一句话解释两端的意思 —— 比如耐心调高,就是告诉 reviewer 小事可以放过。这是给模型的指引,落在措辞上,也落在它多容易开口上。

到此为止。那十三项检查和它们的阈值、跑哪些工具、三种去向、查引用,全都是普通代码,旋钮拨到哪里它们的行为都一样。耐心高的宠物听上去更平和,但它不会偷偷提高「什么才算问题」的门槛。

想细看某一条

每条 review 在控制台里都有自己的页面,地址是 http://127.0.0.1:9876/critique/<id> —— 哪些检查报了、reviewer 说了什么、每条说法背后的依据,都在同一张卡片上,可以把链接发给别人。

每条 review 还会留下它背后那些调用的 trace,在控制台里可以翻。trace 保留 30 天后清理;除非你自己设,否则没有容量上限。

你对一条 review 做了什么,会在本机留下记录:在 dashboard 里点 ack 或 dismiss,会追加到 ~/.siltpoke/critic-actions.jsonl;给一条 review 写的备注,会存进 ~/.siltpoke/preference-log.jsonl。两份都只在你的电脑上,不会离开这台电脑。

花费

review 跑在你已经有的登录上,所以花的是 token,不是一笔新账单。prompt 缓存让平常的一天很便宜,每日 token 预算则防止它失控。具体数字和怎么改,见配置。

控制台的服务

控制台是一个跑在 127.0.0.1:9876 上的本地小服务。它默认是关的,而且 review 不需要它 —— 一条 review 完全跑在你的 agent 触发的那个 hook 进程里,跟服务无关。

打开 /siltpoke-dashboard 会启动它,并把它就此开启;之后每当一条 review 结束时它没在跑,就会在后台被重新拉起来。/siltpoke-restart-daemon 会把它停掉再起一个 —— 控制台显示的是旧数据时就用这条。开机自动启动是另一件事,要你自己开;有没有设好,/siltpoke-doctor 会告诉你。

What Siltpoke Dashboard is

Siltpoke Dashboard is a local web page for everything Siltpoke Review knows: every review and why it said what it said, what it has learned about you and your project, a map of your code, and your pet. It installs with Siltpoke Review — there is nothing extra to set up.

Open it

/siltpoke-dashboard

It opens http://127.0.0.1:9876 in your browser. In Codex, which has no slash commands, say "open the Siltpoke dashboard".

The page is served by a small background program on your machine. It isn't running until you open the dashboard the first time; from then on it stays up, even after you close the tab, and Siltpoke keeps it running between sessions. If it ever gets stuck, /siltpoke-restart-daemon stops it and starts a fresh one.

/siltpoke-setup also asks whether to start it when you log in. The answer is no unless you change it — opening the dashboard works either way.

It stays on your machine

The dashboard only answers requests addressed to your own computer (127.0.0.1 or localhost), so a website you visit can't reach it. Your reviews and memory live in ~/.siltpoke/ and inside each project's .siltpoke/ folder.

A few buttons ask a model to do something, and those use your tokens: chatting with your pet, Generate explanation and ⚡ Generate architecture on Code Map, and ✨ Generate summary for a repo on the Memory page. Everything else — browsing, filtering, feeding your pet — costs nothing. The Budget card on Home shows what today has used.

The pages

page what it answers
Home How is my pet, and how much have reviews cost today?
Timeline What did each review say, and what was it based on?
Memory What has Siltpoke learned about me and this project?
Code Map How does this codebase fit together?

The theme button at the bottom of the sidebar cycles through system, light and dark.

Which project you're looking at

If you work in several repos, the dashboard shows the one you worked in most recently, and keeps showing it until you pick another. The pill at the top of Home names the project and how it was chosen — for example "· recent". To look at a different one, use read this repo in the repo list on the Memory page.

Timeline is the exception: it lists reviews from every project, with a project filter at the top.

Chat with your pet

Every page has a chat in the corner. Press + to start one. It knows which page you're on — and on Code Map, which file or function you've selected — and what Siltpoke remembers about you. Tell it something worth keeping ("remember I use pnpm") and it saves it to memory.

Home

Home is the first page you see: your pet, how it's doing, and how much reviewing has cost today.

The header

Your pet's name, then its title, level, the day you started and how long you've been together — for example "L4 · since Aug 12 · 36d together".

On the right:

  • the project pill — which project the dashboard is showing, and how it picked it (see Which project you're looking at).
  • quiet hours — shown when reviews are paused because it's inside your quiet hours.
  • well-fed — shown while its hunger meter is above 4.

If reviews have been failing — two in a row, or a failure that won't fix itself — a strip across the top of the page says so, with the error behind it when you hover. It disappears on its own after the next review succeeds.

Your pet

The middle of the page is your pet, with two lines above it: whether it's awake and its mood, and when it was last poked.

Six buttons underneath let you look after it: feed, play, clean, pet, sleep and tease. They change its stats and earn a little XP. They never call a model, so they cost nothing — and there's a daily cap on how much XP they can earn.

Stats

  • XP — how far you are to the next level, and what you've earned today. "capped" means today's XP from pet actions has hit its limit.
  • Five meters, each out of 10: hp, hunger, energy, mood and bond.

How XP and levels work, and what the pet's personality does, is in The pet.

Budget

The Budget card shows today's token use against your daily limit: a bar with the warning and stop points marked, how much is left, a breakdown by input, output and cache, how many model calls ran, and today's cost in dollars. The tag beside it reads OK, SOFT (past the warning point) or HARD (reviews stop for the rest of the day).

edit budget opens the three numbers behind it — the daily token limit, the warning percentage and the stop percentage — so you can change them right there. The same settings are described in Configuration.

Timeline

Timeline is the record of every time Siltpoke Review was called — the reviews it wrote, and the times it decided not to. It's where you check why it said what it said.

The list

Each row on the left is one turn of your coding agent, newest first (the arrow at the top flips the order).

  • A review that ran is tagged FIRED, with a dot for how serious it was (comment, warning or critical), the project, which agent wrote the code, and — if a different company's model reviewed it — which one. Under that: a short version of the review, and what it cost in dollars, tokens and seconds.
  • A turn that was skipped is tagged skip and shows the reason, such as no_new_commit or quiet_hours. What each reason means is in Troubleshooting. A run of recursion_guard skips — Siltpoke's own reviewer finishing its turn — is folded into one line.

Filters along the top narrow it down:

  • status — all, fired, skipped, errors
  • kind — all kinds, comment, warning, critical
  • range — today, 7d, 30d, all time
  • family — all families, or one agent: claude, codex, agy, qoder, codebuddy
  • a search… box, and a project picker when you have more than one project

‹ prev and next › page through older turns.

One review in detail

Click a review that ran to open it on the right. The strip at the top shows what it cost, how long it took, why it went ahead, and — for a cross-family review — which agent built the code and which one reviewed it.

Four tabs:

  • Code Review — the review itself, and what went into it: what it read from your conversation, the checklist it worked through, what it already knew about your preferences, and how it decided to speak up.
  • Diff — a short summary of the change, then the full diff it looked at. If that snapshot has since been cleaned up, it says so.
  • Trace — each model call in order, with its cost and how much prompt caching saved. If a review never produced a record — it timed out, say — this tab explains why.
  • Feedback — a note for Siltpoke about this review: what was useful, wrong or missing. It's saved to Siltpoke's memory, and later reviews read recent notes to learn your preferences.

Skipped turns can't be opened — there's no review behind them to inspect.

ack and dismiss

Above the tabs of a review that ran:

  • ack — you've seen it.
  • dismiss — it was a bad review.

Click the same button again to undo. Whatever you've typed in the Feedback tab is saved along with it. How dismissals feed into what Siltpoke learns is in Memory.

Memory

Siltpoke remembers things between sessions, so a review next week can use what it learned this week. You see and manage all of it on the Memory page of the dashboard (/siltpoke-dashboard, then Memory in the sidebar).

Where it keeps things

  • About you, everywhere — ~/.siltpoke/global.json. Your pet (name, species, personality, level) and the facts that are about you rather than a particular codebase: how you like to be spoken to (language, tone, how much detail) and personal things you've mentioned. These follow you into every project.
  • About this project — ~/.siltpoke/projects/<project_id>/memory.json. Facts about this codebase, learned rules, recent chat sessions, what happened and when, a long-term summary, and your goals and constraints for the project.

The review and the chat don't see the same things. A code review gets your communication preferences, so it answers in your language and at the depth you like — but personal facts are deliberately kept out of it; they'd only add noise to a review.

Facts, and who decides they're true

Each fact has a status: Pending (waiting for you), Active (in use), or Retired (no longer used). A fact can arrive three ways:

  • You tell the pet in the dashboard chat — "remember I use pnpm". Plain code first checks whether the message even looks like a lasting fact; only then does a small model pull it out, keeping it only if it would still matter next week. Facts captured this way go straight to Active.
  • You type it into the Memory page — the box at the bottom ("Tell siltpoke to update a memory…"). It works out whether you're adding something new, restating something it knows, or contradicting it. A contradiction offers Replace or Keep both. Whatever you add this way arrives Pending until you click ✓ Confirm.
  • Siltpoke proposes it — when it tidies up memory (below), new lasting facts arrive Pending too.

On each pending fact, ✓ Confirm makes it active and ✕ Reject retires it. Every fact shows where it came from — typed by you, from chat, from commits, from a review — and you can expand it to see why it was kept.

Two more controls on each fact:

  • 📌 Pin — a pinned fact is never retired automatically.
  • style / profile — click the tag to fix a fact Siltpoke filed wrongly. A style fact is a preference about how it talks to you, and reaches code reviews; a profile fact is personal and stays out of them.

Tidying up

Roughly every 10 agent turns or 7 days, whichever comes first, Siltpoke folds recent facts, reviews and dismissals into the long-term summary, so memory doesn't grow without end. This is also when it writes the day's Episodic narrative (below). If nothing is new, it skips.

Facts that are old, low-confidence and rarely used get proposed for retirement — never retired silently. You confirm it on the Memory page. Nothing is ever hard-deleted: a retired fact only changes status, and pinned facts are exempt.

What happened, as a story

The Episodic section groups a day's coding moments into a short narrative — a few sentences about what happened — instead of a scatter of one-line events.

Since you last looked

When an agent has been writing code while you weren't watching, the Since you last looked card on the Memory page lists what changed in this repo since your last visit, grouped by folder: new files, deleted files, and files whose contents or signatures changed. mark all seen clears it.

What a review is built from

Each review prompt is assembled in the same order, most stable parts first, so prompt caching keeps the long start of it warm and a follow-up review costs little:

  1. Personality — your pet's dials, plus how they've drifted in this project.
  2. Memory — the long-term summary, learned rules, and your communication preferences.
  3. Recent feedback — what you said about recent reviews.
  4. Tool evidence — tsc, eslint, git diff and ripgrep output.
  5. Caller impact — from the code map: code that calls what you changed.
  6. Reverse dependencies — files that import what you changed.

Learned rules are treated as context, never as orders: a rule can shape how a review is written, but it can't stop a real problem from being reported.

Feedback on a review

In the dashboard, each review has ack and dismiss buttons, and a Feedback tab where you can leave a note. Notes are saved to Siltpoke's memory as feedback on that review.

One thing still needs a source install: turning the reason you dismissed a review into a learned rule (and undoing that). The plugin records the dismissal and your note, but it doesn't write the rule. If you run Siltpoke from source, that path is available there.

Code Map

The fastest way to end up with a codebase you don't understand is to vibe-code one. Code Map turns what your agent built into a structural map you can actually read back. It lives in the dashboard: /siltpoke-dashboard, then Code Map in the sidebar.

Build the map

Open the repo picker at the top of Code Map and click + Index a repo, then browse to the folder or paste its path. Siltpoke reads the code and builds a structural graph — plain parsing, no AI involved, and you can watch the progress as it goes. To refresh a map later, index the same folder again; only files whose content changed are parsed again.

What gets read: .ts, .tsx, .js, .jsx and .py files. What's skipped: dependency and build folders (node_modules, dist, build, .next, coverage…), every hidden folder, and — on purpose — docs, public and tests, whose minified or repetitive files would confuse the map. Files over 1 MB are skipped, and a repo stops at 25,000 files.

The map is stored under ~/.siltpoke/repo-memory/<project>/.

You don't have to remember to refresh it. When the code has moved on from the last index, Code Map says so at the top — for example "23% out of date — re-index recommended", or "not indexed — pick this repo on Code Map".

See the shape

The first view is a C4 container view: your repo as one box, with the parts inside grouped into layers.

  • Auto (what you see first) — built straight from the graph. No AI, instant, free. Each container is a source folder; each line between two says how many imports cross it (imports ×N). The layers come from the Architecture section of your project's CLAUDE.md if it has one, and otherwise from the top-level folders.
  • ⚡ Generate architecture (optional, costs money) — one pass through the model over the whole repo, which proposes a richer picture: lines labelled with what actually happens (calls, reads, writes…), an order for the layers, and short descriptions. Every claim is then checked against the real graph: a grounded % chip shows how much of it points at real code, containers drawn without any evidence are counted separately, and a layer whose proposed order contradicts the real imports is shown dashed as an inferred layer instead of being asserted. It's capped (about $0.60 soft, $2 hard), and you can cancel it while it runs. Once it exists, a toggle switches between it and Auto.
  • Authored — if your repo contains .siltpoke/arch-c4.json, Code Map uses that hand-written model instead of Auto, and tells you if the file is invalid.

Click a container to go down a level — from the architecture to its files, and from a file to the functions and classes it defines.

Trace a path

⟜ Trace a path follows how a request actually flows, call by call, from a starting point — a detected entry point, or any function you pick. It's built from the same graph, never guessed. Each call is sorted by how sure Siltpoke is about where it goes:

  • resolved — exactly one function it can be.
  • inferred — more than one candidate.
  • unresolved or unresolvable — no match, or a call whose target is only decided at runtime. These are left off the path rather than guessed at.

That rolls up into a coverage score — the share of calls within your repo that resolve (library and runtime-decided calls don't count) — and the score changes what you're shown:

  • green (60% or more) — the full path.
  • yellow (40–59%) — only the calls it's sure of.
  • red (under 40%) — no function-level path at all; it falls back to showing files.

Ask what something does

Select a file or a function, then Generate explanation. You get a plain-language explanation, what it depends on, what uses it, and the citations it's based on. Every [file:line] citation is checked against the real code — the file has to exist and the line has to be inside it — and the share that pass is shown as % grounded. A low number means read it with care.

Explanations are cached: next time the button reads Open explanation, and Re-generate explanation once the code has changed.

Chat about a piece of code

With a file or function selected, open the chat. The conversation is pinned to that spot, and a snapshot of the code around it is saved with the conversation, so answers stay consistent with the version you were looking at — even across sessions.

If that file changes before your next message, Siltpoke tells you and lets you choose: keep discussing the version you pinned, or use the current version.

Siltpoke Dashboard 是什么

Siltpoke Dashboard(控制台)是一个本地网页,装着 Siltpoke Review 知道的一切:每一次审查、它凭什么这么说,它对你和你项目学到了什么,一张代码地图,还有你的宠物。它跟着 Siltpoke Review 一起装好 —— 不用另外设置。

打开它

/siltpoke-dashboard

它会在浏览器里打开 http://127.0.0.1:9876。Codex 没有斜杠命令,就说 「打开 Siltpoke 控制台」。

这个页面由你电脑上一个小小的后台程序提供。第一次打开控制台之前,它没有在跑;打开之后它会一直开着,关掉浏览器标签页也不停,Siltpoke 还会在不同 session 之间让它保持运行。如果它卡住了, /siltpoke-restart-daemon 会停掉它、重新开一个。

/siltpoke-setup 还会问你要不要开机自动启动它。默认是不要 —— 不管选哪个,打开控制台都能用。

它只在你的电脑上

控制台只回应发给你自己电脑的请求(127.0.0.1 或 localhost),所以你浏览的网站碰不到它。你的审查和记忆存在 ~/.siltpoke/,以及每个项目里的 .siltpoke/ 文件夹。

有几个按钮会让模型去做事,这些会用掉你的 token:跟宠物聊天、Code Map 上的 Generate explanation 和 ⚡ Generate architecture,以及 Memory 页上某个仓库的 ✨ Generate summary。其他的 —— 浏览、筛选、喂宠物 —— 都不花钱。Home 上的 Budget 卡片显示今天用了多少。

有哪些页面

页面 它回答什么
Home 我的宠物怎么样,今天审查花了多少?
Timeline 每次审查说了什么,依据是什么?
Memory Siltpoke 对我和这个项目学到了什么?
Code Map 这个代码库是怎么拼起来的?

侧边栏底部的主题按钮在跟随系统、浅色、深色之间切换。

你看的是哪个项目

如果你在好几个仓库里工作,控制台会显示你最近工作的那个,并且一直显示它,直到你换一个。Home 顶部的小标签写着是哪个项目、是怎么选出来的 —— 比如 「· recent」(最近用的)。想看别的项目,就在 Memory 页的仓库列表里点 read this repo。

Timeline 是例外:它列出所有项目的审查,顶部有一个项目筛选。

跟宠物聊天

每个页面的角落都有一个聊天框,点 + 开始。它知道你在哪个页面 —— 在 Code Map 上还知道你选中了哪个文件或函数 —— 也知道 Siltpoke 记得的关于你的事。跟它说一件值得记住的事(「记住我用 pnpm」),它会存进记忆。

Home

Home 是你打开控制台看到的第一页:你的宠物、它的状态,以及今天审查花了多少。

顶部

宠物的名字,下面是它的称号、等级、你们开始的日子、在一起多久了 —— 比如 「L4 · since Aug 12 · 36d together」。

右边有几个小标签:

  • 项目标签 —— 控制台现在显示的是哪个项目,以及是怎么选出来的(见你看的是哪个项目)。
  • quiet hours —— 现在在你设的安静时段里、审查暂停时显示。
  • well-fed —— 宠物的饱食值超过 4 时显示。

如果审查一直失败 —— 连续两次,或者遇到一个不会自己好的错误 —— 页面顶部会出现一条提示,鼠标移上去能看到具体的错误。下一次审查成功后,它会自己消失。

你的宠物

页面中间是你的宠物,上方两行字:它醒着没有、心情怎么样,以及上次被戳是什么时候。

下面六个按钮用来照顾它:feed(喂)、play(玩)、clean(清洁)、pet(摸摸)、 sleep(睡觉)和 tease(逗它)。它们会改变宠物的状态值,并给一点 XP。这些按钮从来不调用模型,所以不花钱 —— 而且每天靠它们能拿的 XP 有上限。

状态值

  • XP —— 离下一级还差多少,以及今天拿了多少。显示 「capped」 表示今天靠照顾宠物拿的 XP 已经到上限了。
  • 五个状态条,每个满分 10:hp(生命)、hunger(饱食)、energy(精力)、mood(心情)和 bond(亲密度)。

XP 和等级怎么算、宠物的性格有什么作用,见宠物。

Budget(预算)

Budget 卡片显示今天的 token 用量和每日上限的对比:一根进度条,上面标着提醒点和停止点,还剩多少,输入、输出、缓存各用了多少,跑了几次模型调用,以及今天花了多少美元。旁边的标签是 OK、SOFT (过了提醒点)或 HARD(今天剩下的时间里审查停止)。

点 edit budget 会展开背后那三个数 —— 每日 token 上限、提醒百分比、停止百分比 —— 可以直接在这里改。同样的设置在配置里也有说明。

Timeline

Timeline 记录了 Siltpoke Review 每一次被叫起来的情况 —— 它写出的审查,以及它决定不审的时候。想弄清它为什么那么说,就来这里看。

列表

左边每一行是你的 coding agent 的一轮对话,最新的在最上面(顶部的箭头可以反过来排)。

  • 真的跑了审查的标着 FIRED,有一个圆点表示严重程度(comment、warning 或 critical),还有项目名、代码是哪个 agent 写的,以及 —— 如果是另一家公司的模型审的 —— 是哪一家。下面是审查的简短版本,以及花了多少美元、多少 token、多少秒。
  • 跳过的标着 skip,并写出原因,比如 no_new_commit 或 quiet_hours。每个原因是什么意思,见排错。连续一串 recursion_guard 跳过 —— 那是 Siltpoke 自己的 reviewer 结束了它那一轮 —— 会折叠成一行。

顶部的筛选:

  • status(状态)—— all、fired、skipped、errors
  • kind(类型)—— all kinds、comment、warning、critical
  • range(时间)—— today、7d、30d、all time
  • family(哪家)—— all families,或者某一个 agent:claude、codex、agy、qoder、codebuddy
  • 一个 search… 搜索框;有多个项目时,还有一个项目选择

‹ prev 和 next › 往前、往后翻页。

看一次审查的细节

点一条跑了审查的记录,右边会打开它。顶部一条显示它花了多少、用了多久、为什么决定审,以及 —— 如果是跨家族审查 —— 代码是哪个 agent 写的、哪个 agent 审的。

四个标签页:

  • Code Review —— 审查本身,以及它依据了什么:它从你的对话里读到了什么、逐项检查的清单、它已经知道的你的偏好,以及它是怎么决定要开口的。
  • Diff —— 先是这次改动的简短总结,再是它看到的完整 diff。如果那份快照已经被清理掉了,会直接告诉你。
  • Trace —— 按顺序列出每一次模型调用,各花了多少,prompt 缓存省了多少。如果某次审查根本没留下记录 —— 比如超时了 —— 这里会解释原因。
  • Feedback —— 给 Siltpoke 留一条关于这次审查的备注:哪里有用、哪里错了、漏了什么。它会存进 Siltpoke 的记忆,之后的审查会读最近的备注,来了解你的偏好。

跳过的记录点不开 —— 它们背后没有审查可看。

ack 和 dismiss

跑了审查的记录,标签页上方有两个按钮:

  • ack —— 表示你看过了。
  • dismiss —— 表示这次审查不好。

再点一次同一个按钮就撤销。你在 Feedback 标签页里写的内容会一起保存。dismiss 怎么影响 Siltpoke 学到的东西,见记忆。

记忆

Siltpoke 会在不同 session 之间记住东西,所以下周的审查能用上这周学到的。所有记忆都在控制台的 Memory 页面里查看和管理(/siltpoke-dashboard,然后点侧边栏的 Memory)。

记在哪里

  • 关于你的,到哪都带着 —— ~/.siltpoke/global.json。你的宠物(名字、物种、性格、等级),以及关于你本人、而不是某个代码库的事实:你喜欢它怎么跟你说话(语言、语气、讲多细),还有你提过的私人信息。这些会跟着你进每一个项目。
  • 关于这个项目的 —— ~/.siltpoke/projects/<project_id>/memory.json。关于这个代码库的事实、学到的规则、最近的聊天、什么时候发生了什么、一份长期摘要,以及你对这个项目的目标和约束。

审查和聊天看到的东西不一样。代码审查会拿到你的沟通偏好,所以它会用你的语言、按你喜欢的详细程度来回答 —— 但私人信息是故意不给它的,放进审查里只会添乱。

事实,以及谁来决定它是真的

每条事实都有一个状态:Pending(等你确认)、Active(正在用)、Retired(不再用了)。事实有三种来路:

  • 你在控制台的聊天里跟宠物说 —— 「记住我用 pnpm」。先由普通代码判断这句话像不像一条长期有效的事实;像的话,才让一个小模型把它提炼出来,而且只保留「下周还用得上」的。这样记下的事实直接是 Active。
  • 你在 Memory 页面里打字 —— 页面底部那个输入框(「Tell siltpoke to update a memory…」)。它会判断你是在加新东西、重复它已经知道的,还是跟已有的矛盾。矛盾时会给你两个选择:Replace(替换)或 Keep both(两个都留)。这样加进去的都是 Pending,要你点 ✓ Confirm 才生效。
  • Siltpoke 自己提出来 —— 它整理记忆的时候(见下面),新提炼出的长期事实也是 Pending。

每条待确认的事实上,✓ Confirm 让它生效,✕ Reject 把它退役。每条事实都标着它从哪来 —— 你打的、聊天里来的、从 commit 里来的、从审查里来的 —— 展开还能看到当初为什么留下它。

每条事实上还有两个控制:

  • 📌 Pin —— 置顶的事实永远不会被自动退役。
  • style / profile —— 点这个标签,可以纠正 Siltpoke 分错类的事实。style 是你希望它怎么跟你说话的偏好,会进代码审查;profile 是私人信息,不进审查。

整理

大约每 10 轮 agent 对话或每 7 天(以先到的为准),Siltpoke 会把最近的事实、审查和 dismiss 记录整理进长期摘要,免得记忆无限变大。当天的 Episodic 叙述(见下面)也是这时候写的。没有新东西就跳过。

又旧、又不太可靠、又很少被用到的事实,会被提议退役 —— 绝不会悄悄就退役了,要你在 Memory 页面上确认。任何东西都不会被真正删掉:退役只是改了状态,而且置顶的事实不受影响。

发生过什么,写成一段话

Episodic 这一块会把一天里的编程片段整理成一小段叙述 —— 几句话讲清楚发生了什么 —— 而不是一堆零散的一行记录。

自上次看过之后

agent 在你没盯着的时候写了代码,Memory 页面上的 Since you last looked 卡片会按文件夹列出:从你上次打开之后,这个仓库里变了什么 —— 新增的文件、删掉的文件、内容或函数签名变了的文件。点 mark all seen 就清空。

一次审查是用什么拼起来的

每次审查的 prompt 都按同样的顺序拼,越稳定的部分越靠前,这样 prompt 缓存能把前面那一长段一直留着,接下来的审查几乎不花额外的钱:

  1. 性格 —— 宠物的性格参数,加上它在这个项目里的变化。
  2. 记忆 —— 长期摘要、学到的规则、你的沟通偏好。
  3. 最近的反馈 —— 你对最近几次审查说了什么。
  4. 工具证据 —— tsc、eslint、git diff 和 ripgrep 的输出。
  5. 调用影响 —— 来自代码地图:哪些代码调用了你改的东西。
  6. 反向依赖 —— 哪些文件 import 了你改的东西。

学到的规则只当作参考,绝不当作命令:规则可以影响审查怎么写,但不能阻止它报告一个真实的问题。

对一次审查给反馈

在控制台里,每条审查都有 ack 和 dismiss 按钮,还有一个 Feedback 标签页可以写备注。备注会作为对这条审查的反馈,存进 Siltpoke 的记忆。

有一件事目前还得从源码装才有:把你 dismiss 一条审查的理由变成一条学到的规则(以及撤销它)。插件版会记下这次 dismiss 和你的备注,但不会写出规则。如果你是从源码跑的 Siltpoke,那里有这条路。

代码地图

最快把自己弄到「看不懂自己代码库」的办法,就是 vibe-code 一个。代码地图(Code Map)把 agent 写出来的东西变成一张你真能读回去的结构图。它在控制台里:/siltpoke-dashboard,然后点侧边栏的 Code Map。

建地图

打开 Code Map 顶部的仓库选择器,点 + Index a repo,然后浏览到那个文件夹,或者直接粘贴它的路径。 Siltpoke 会读代码、建出一张结构图 —— 纯解析,不用 AI,建的过程中能看到进度。以后想刷新,就对同一个文件夹再索引一次;只有内容变了的文件会被重新解析。

会读的:.ts、.tsx、.js、.jsx 和 .py 文件。会跳过的:依赖和构建文件夹(node_modules、 dist、build、.next、coverage……)、所有隐藏文件夹,还有故意跳过的 docs、public 和 tests —— 那里的压缩文件或重复文件会把地图搅乱。超过 1 MB 的文件跳过,一个仓库最多读 25,000 个文件。

地图存在 ~/.siltpoke/repo-memory/<project>/ 下面。

不用自己记着刷新。 代码和上次索引相比变了不少的时候,Code Map 顶部会直接告诉你 —— 比如 「23% out of date — re-index recommended」(已经过期 23%,建议重新索引),或者 「not indexed — pick this repo on Code Map」(还没索引)。

看整体结构

第一眼看到的是一张 C4 容器图:整个仓库是一个大框,里面的各部分按层分组。

  • Auto(一打开就是这个)—— 直接从结构图里算出来。不用 AI,马上出,不花钱。每个容器是一个源码文件夹;两个容器之间的线写着有多少 import 跨过去(imports ×N)。分层来自项目 CLAUDE.md 里的 Architecture 一节;没有这一节,就按顶层文件夹来分。
  • ⚡ Generate architecture(可选,要花钱)—— 让模型把整个仓库过一遍,给出一张更丰富的图:线上标着实际发生了什么(调用、读、写……)、各层的先后顺序、简短的说明。然后每一条说法都拿去跟真实的结构图核对:一个 grounded % 标签显示其中多少指向真实代码,没有任何证据就画出来的容器会单独计数,顺序跟真实 import 关系矛盾的层会画成虚线、标成推测的层,而不是当成事实。它有花费上限(软上限大约 $0.60,硬上限 $2),跑的过程中可以取消。生成过一次之后,会出现一个开关,在它和 Auto 之间切换。
  • Authored —— 如果仓库里有 .siltpoke/arch-c4.json,Code Map 会用这份手写的模型代替 Auto;文件格式不对时会提示你。

点一个容器就往下钻一层 —— 从架构到它的文件,再从文件到里面定义的函数和类。

追踪一条路径

⟜ Trace a path 从一个起点开始,一个调用一个调用地跟下去,看一个请求实际是怎么走的 —— 起点可以是自动识别出的入口,也可以是你选的任何函数。它用的是同一张结构图,绝不靠猜。每个调用按 Siltpoke 有多确定它会走到哪来分类:

  • resolved —— 只可能是一个函数。
  • inferred —— 有不止一个候选。
  • unresolved 或 unresolvable —— 找不到对应的,或者调用目标要到运行时才定。这些不画进路径,而不是乱猜一个。

这些汇总成一个覆盖率 —— 你自己仓库内的调用里,有多少能确定走向(第三方库和运行时才决定的调用不算在内)—— 而这个分数决定你能看到什么:

  • 绿色(60% 及以上) —— 完整路径。
  • 黄色(40–59%) —— 只画确定的调用。
  • 红色(低于 40%) —— 不画函数级的路径,退回到只显示文件。

问它某段代码是干什么的

选中一个文件或函数,点 Generate explanation。你会得到一段大白话讲解、它依赖什么、谁在用它,以及讲解所依据的引用。每一条 [file:line] 引用都会拿去跟真实代码核对 —— 文件必须存在,行号必须在文件范围内 —— 通过的比例显示为 % grounded。数字低,就要仔细看。

讲解会被缓存:下次按钮会变成 Open explanation,代码改过之后会变成 Re-generate explanation。

围绕一段代码聊天

选中一个文件或函数,再打开聊天。这次对话会被固定在那个位置,周围代码的快照会和对话一起保存,所以回答始终对应你当时看的那个版本 —— 跨 session 也一样。

如果下一条消息发出之前那个文件变了,Siltpoke 会提醒你,让你选:keep discussing(继续按固定时的版本聊),还是 use the current version(改用现在的版本)。