@caddis/cli 0.4.29 → 0.4.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/bundles/antigravity-plugin/caddis_statusline.py +0 -1
  2. package/bundles/antigravity-plugin/mcp_ping_server.py +1 -1
  3. package/bundles/antigravity-plugin/plugin.json +1 -1
  4. package/bundles/antigravity-plugin/scripts/caddis_adhoc.py +301 -66
  5. package/bundles/antigravity-plugin/scripts/caddis_exit.py +15 -0
  6. package/bundles/antigravity-plugin/scripts/caddis_frontmatter.py +145 -0
  7. package/bundles/antigravity-plugin/scripts/caddis_gate.py +33 -10
  8. package/bundles/antigravity-plugin/scripts/caddis_governor.py +5 -2
  9. package/bundles/antigravity-plugin/scripts/caddis_lanes.py +13 -1
  10. package/bundles/antigravity-plugin/scripts/caddis_migrate_dir.py +1 -1
  11. package/bundles/antigravity-plugin/scripts/caddis_spawn.py +2 -2
  12. package/bundles/antigravity-plugin/scripts/caddis_statusline.py +0 -1
  13. package/bundles/antigravity-plugin/scripts/caddis_tidy.py +9 -14
  14. package/bundles/antigravity-plugin/scripts/claudster_doctor.py +66 -0
  15. package/bundles/antigravity-plugin/scripts/convert_doc_to_confluence.py +1430 -0
  16. package/bundles/antigravity-plugin/scripts/new-machine.ps1 +1 -1
  17. package/bundles/antigravity-plugin/scripts/oss_ask.py +6 -5
  18. package/bundles/antigravity-plugin/scripts/oss_model.py +1 -1
  19. package/bundles/antigravity-plugin/scripts/oss_review.py +84 -15
  20. package/bundles/antigravity-plugin/scripts/secret_filter.py +316 -0
  21. package/bundles/antigravity-plugin/scripts/setup_project_ai.py +9 -4
  22. package/bundles/antigravity-plugin/skills/_registry.md +5 -3
  23. package/bundles/antigravity-plugin/skills/catchup/SKILL.md +37 -2
  24. package/bundles/antigravity-plugin/skills/cross-review/SKILL.md +1 -1
  25. package/bundles/antigravity-plugin/skills/data-lineage/SKILL.md +1 -1
  26. package/bundles/antigravity-plugin/skills/digress/SKILL.md +1 -1
  27. package/bundles/antigravity-plugin/skills/handoff/SKILL.md +8 -1
  28. package/bundles/antigravity-plugin/skills/hld/SKILL.md +1 -1
  29. package/bundles/antigravity-plugin/skills/implement/SKILL.md +3 -1
  30. package/bundles/antigravity-plugin/skills/install-statusline/SKILL.md +105 -0
  31. package/bundles/antigravity-plugin/skills/lld/SKILL.md +1 -1
  32. package/bundles/antigravity-plugin/skills/mmr/SKILL.md +23 -14
  33. package/bundles/antigravity-plugin/skills/resume/SKILL.md +2 -32
  34. package/bundles/antigravity-plugin/skills/review/SKILL.md +2 -96
  35. package/bundles/antigravity-plugin/skills/review-pr/SKILL.md +100 -0
  36. package/bundles/antigravity-plugin/skills/statusline/SKILL.md +2 -101
  37. package/bundles/antigravity-plugin-extras/plugin.json +1 -1
  38. package/bundles/antigravity-plugin-extras/skills/cross-review/SKILL.md +3 -3
  39. package/bundles/antigravity-plugin-extras/skills/golden-plan/SKILL.md +1 -1
  40. package/bundles/codex/.codex/config.toml.example +0 -16
  41. package/bundles/codex/AGENTS.md +2 -2
  42. package/bundles/manifest.json +3 -3
  43. package/dist/claude-deepseek.js +1 -1
  44. package/dist/claude-glm.js +1 -1
  45. package/dist/claude-oss.js +1 -1
  46. package/dist/cli.js +1 -1
  47. package/package.json +1 -1
@@ -5,6 +5,10 @@ description: Where were we? A quick list of what this session was doing and what
5
5
 
6
6
  # /catchup — where are we?
7
7
 
8
+ If $ARGUMENTS is empty, follow the catchup procedure below. If a name is given, follow
9
+ the pop-and-resume procedure at the end of this file. The name selects this mode; the
10
+ procedure still pops the last parked frame.
11
+
8
12
  Answer one question: **what were we doing, and what is still open?**
9
13
 
10
14
  Not named `/recap` on purpose — Claude Code has a built-in `/recap` that produces a one-line
@@ -58,5 +62,36 @@ on is worse than one sentence admitting there is nothing to recap.
58
62
  folder, or `claude --resume` to pick an older session. Mention this only if the recap is thin,
59
63
  or if they ask for detail the files do not hold.
60
64
  - To **write** a durable resume doc rather than read one: `/caddis:handoff`.
61
- - To **pop a parked workstream** off the digress stack: `/caddis:resume`. That is a different
62
- mechanism — it restores work deliberately set aside, not the last session's state.
65
+ - To **pop a parked workstream** off the digress stack: `/caddis:catchup [name]`. This restores work deliberately set aside.
66
+
67
+ # /caddis:catchup [name] — pop the parked task and pick it back up
68
+
69
+ A digression is finished; return to the task you parked with `/digress`. This pops the top frame off the
70
+ workstream stack, restates where you were, realigns `relay.md`, and immediately continues the work — the
71
+ user should not have to remember or re-state anything.
72
+
73
+ ## Step 1 — read the stack
74
+ Read `.caddis/workstreams.json`. If it is **absent, unparseable, `version != 1`, or `stack` is empty**,
75
+ say exactly `Nothing is parked.` and stop. Do nothing else.
76
+
77
+ ## Step 2 — pop the top frame
78
+ The top of stack is the **last** element of `stack` (LIFO — most recently parked). Remove it and write the
79
+ rest of the file back (preserve `version` and any other frames + unknown fields). This is the one write
80
+ this command makes to the state file.
81
+
82
+ ## Step 3 — restate + realign relay.md
83
+ Restate the popped frame to the user: its `plan`, `phase`, and `resumePointer` (and `repo` if set — the
84
+ parked task lives in another repo, so say which). Then edit `.caddis/relay.md`'s `## Next step` section
85
+ **in place** so it matches the popped frame's `resumePointer` — preserve every other section of relay.md
86
+ untouched. (If relay.md or that section is absent, skip this edit silently; the restatement above is enough.)
87
+
88
+ ## Step 4 — resume the work
89
+ Begin executing the `resumePointer` immediately. Ask nothing — the frame already carries the next action.
90
+ If the parked plan lives in another `repo`, note that the user may need to open that repo first, then
91
+ proceed there.
92
+
93
+ ## Rules
94
+ - **Never** run a destructive or history-rewriting git action (no `git checkout`, `git reset`, `git stash`,
95
+ branch switches). Resuming is metadata-only.
96
+ - Pop exactly one frame per invocation (the LIFO top). Run `/caddis:catchup [name]` again to pop the next.
97
+ - Only real paths and verified facts — restate the frame as written; do not embellish the resume point.
@@ -97,7 +97,7 @@ as a diff that silently is not read. Name a provider explicitly only when you ha
97
97
  - **0 — REVIEW: CLEAN** → no blocking issues. Proceed.
98
98
  - **1 — REVIEW: BLOCKING** → read the printed findings, then **FIX each blocking item** (or explicitly
99
99
  justify why one is a false positive). Re-run until CLEAN.
100
- - **2 — error** → no verdict parsed, or a git/endpoint failure. Read stderr; do NOT treat as clean.
100
+ - **4 — error** → no verdict parsed, or a git/endpoint failure. Read stderr; do NOT treat as clean.
101
101
  - **3 — misconfigured** → `REVIEW_API_KEY` is unset. Set it (see Prerequisite) and re-run.
102
102
 
103
103
  ## Rules
@@ -26,7 +26,7 @@ Run the End-to-End Data Lineage generation procedure:
26
26
  3. **Convert to Confluence Storage Format XHTML:**
27
27
  - Run the PlantUML-enabled converter:
28
28
  ```powershell
29
- python scripts/convert_doc_to_confluence.py docs/<app>/<app>-data-lineage.md --output docs/<app>/<app>-data-lineage.html --diagram-type plantuml
29
+ python "${CLAUDE_PLUGIN_ROOT}/scripts/convert_doc_to_confluence.py" docs/<app>/<app>-data-lineage.md --output docs/<app>/<app>-data-lineage.html --diagram-type plantuml
30
30
  ```
31
31
  - Verify that all diagrams convert to native `<ac:structured-macro ac:name="plantuml">` blocks with scale 1.2, natural splines, auto-wrapped edge labels, crimson red borders on impacted components, and embedded Creole legends.
32
32
  - Verify that output validates as 100% well-formed XML.
@@ -7,7 +7,7 @@ description: Park the current workstream on the stack and switch to a new task
7
7
 
8
8
  You are about to leave the current task for a related-but-different one (a design decision, a sub-feature,
9
9
  or a blocker that must be fixed first). This command **records the original task on a workstream stack** so
10
- neither you nor the user has to remember and re-state it later — `/resume` pops it back with its exact
10
+ neither you nor the user has to remember and re-state it later — `/catchup [name]` pops it back with its exact
11
11
  resume point, and every SessionStart surfaces it (`⛏ Parked workstream: …`).
12
12
 
13
13
  The reason for the detour is **$ARGUMENTS** (if empty, derive a one-line reason yourself from what the
@@ -51,7 +51,7 @@ clean phase boundary and lose or double-do the work.
51
51
 
52
52
  **Digression check.** If this session abandoned a mid-flight plan for a *different* one (relay.md or the
53
53
  tracker shows plan A in progress, but the work moved to plan B), suggest the user run `/digress` to park
54
- plan A on the workstream stack — so its exact resume point survives and `/resume` can pop it back later.
54
+ plan A on the workstream stack — so its exact resume point survives and `/catchup [name]` can pop it back later.
55
55
 
56
56
  ## Step 2b — Advisory-Hub handoff audit (conditional — skip silently if not applicable)
57
57
 
@@ -113,6 +113,13 @@ Nothing to say is the normal answer. Say nothing and move on — this must not b
113
113
  > `/caddis:migrate-dir` does that.
114
114
 
115
115
  ```markdown
116
+ ---
117
+ type: relay
118
+ workstream: <name>
119
+ branch: <branch>
120
+ generated: { by: <model>, at: <ISO time> }
121
+ ---
122
+
116
123
  # Relay — <feature>
117
124
  **Updated:** <ISO timestamp>
118
125
 
@@ -32,7 +32,7 @@ Run the High-Level Design (HLD) generation procedure:
32
32
  4. **Convert to Confluence Storage Format XHTML:**
33
33
  - Run the PlantUML-enabled converter:
34
34
  ```powershell
35
- python scripts/convert_doc_to_confluence.py docs/<app>/<app>-hld.md --output docs/<app>/<app>-hld.html --diagram-type plantuml
35
+ python "${CLAUDE_PLUGIN_ROOT}/scripts/convert_doc_to_confluence.py" docs/<app>/<app>-hld.md --output docs/<app>/<app>-hld.html --diagram-type plantuml
36
36
  ```
37
37
  - Verify that all diagrams are converted to native `<ac:structured-macro ac:name="plantuml">` blocks with scale 1.2, natural splines, auto-wrapped edge labels, crimson red borders on impacted components, and embedded Creole legends.
38
38
  - Ensure multi-stage operational flows use horizontal side-by-side stages (`flowchart LR`) and architecture topologies follow clean 3-tier hierarchies (`flowchart TD`).
@@ -51,7 +51,9 @@ python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_gate.py" verdict-gate --plan <plan
51
51
  python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_gate.py" tracker-vs-git --plan <plan>
52
52
  ```
53
53
 
54
- Obey the exit code: **0** proceed · **1** STOP and report why · **2** proceed but record the note it
54
+ Use the shared scale in `caddis_exit.py`: 0 clean, 1 blocked, 2 advisory, 3 could not run,
55
+ 4 error or bad usage. For `caddis_gate.py`, obey the exit code: **0** proceed · **1** STOP and report
56
+ why · **2** proceed but record the note it
55
57
  printed · **3** wrong lane — the launch command is on stdout, spawn it · **4** the launch command is
56
58
  malformed, do not run it.
57
59
 
@@ -0,0 +1,105 @@
1
+ ---
2
+ name: install-statusline
3
+ description: Install the caddis status line into Claude Code and agy — one renderer, once per machine
4
+ ---
5
+
6
+ # /install-statusline — set up the status bar
7
+
8
+ Wire the caddis status line into every coding agent on this machine. One Python renderer serves
9
+ both hosts. It installs at **user scope**, so every project gets the line and no project holds a
10
+ copy that can drift.
11
+
12
+ ## What the user gets
13
+
14
+ Claude Code:
15
+
16
+ ```
17
+ ⌂ claudster-source | saajunaid/caddis ⎇ main +2 ●1 ?3 ↑1 | ◆ Opus 5 (1M context) v2.1.239 |
18
+ ◉ 412k/1M [███░░░░░] 41% | ⚡ 386k cached | effort:high | style:Plain | thinking |
19
+ 5h:12% 7d:40% | 💻 57% (37 GB) | ⏺ relay | ◷ 07:58
20
+ ```
21
+
22
+ agy (Antigravity):
23
+
24
+ ```
25
+ ▛▜ agy | ● idle | 🧠 Gemini 3.6 Flash (High) (high) | 📁 claudster-source | ⎇ main ?3 |
26
+ ◉ 48.5k/1M [░░░░░░░░] 5% | ⚡ 40k cached | q 62% | 💻 57% (37 GB) | ⏺ relay | ◷ 08:01
27
+ ```
28
+
29
+ Both lines come from `caddis_statusline.py`. It has two profiles, because the two hosts send
30
+ different field names — agy's payload is a sibling of Claude Code's, not a copy.
31
+
32
+ ## Run it
33
+
34
+ Find the renderer in this install and run it. Try these paths in order and use the first that exists:
35
+
36
+ - `${CLAUDE_PLUGIN_ROOT}/scripts/caddis_statusline.py`
37
+ - `claude-harness/scripts/caddis_statusline.py` (working inside the caddis source repo)
38
+
39
+ Then:
40
+
41
+ ```bash
42
+ python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_statusline.py" --install # both hosts
43
+ python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_statusline.py" --install --host claude
44
+ python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_statusline.py" --install --host agy
45
+ python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_statusline.py" --install --dry-run # print, write nothing
46
+ ```
47
+
48
+ `--install` does four things:
49
+
50
+ 1. Copies the renderer to `~/.caddis/statusline.py` — a **stable** path. Pointing the host
51
+ settings at the plugin cache would break on every caddis upgrade, because the version number
52
+ is in that path.
53
+ 2. Creates `~/.caddis/statusline.json` with the default toggles. It never overwrites an existing one.
54
+ 3. Backs up each host's `settings.json` to `settings.json.bak-caddis-statusline`.
55
+ 4. Sets `statusLine` in `~/.claude/settings.json` and `~/.gemini/antigravity-cli/settings.json`,
56
+ preserving every other key. A host that is not installed is skipped, not failed.
57
+
58
+ Report the tool's own output to the user. Then tell them the line appears on the **next** session —
59
+ neither host re-reads `settings.json` mid-session.
60
+
61
+ ## Verify
62
+
63
+ ```bash
64
+ python ~/.caddis/statusline.py --check # what is wired where
65
+ python ~/.caddis/statusline.py --sample --profile claude # preview, no host needed
66
+ python ~/.caddis/statusline.py --sample --profile agy
67
+ ```
68
+
69
+ `--check` exits non-zero when a host's `statusLine` is missing or points somewhere else.
70
+
71
+ ## Change the look
72
+
73
+ Edit `~/.caddis/statusline.json`. Every key is optional; a missing file means defaults.
74
+
75
+ | key | default | what it controls |
76
+ |---|---|---|
77
+ | `color` | `true` | ANSI colour |
78
+ | `icons` | `true` | Unicode segment icons. These are plain Unicode, **not** Nerd Font glyphs |
79
+ | `progress_bar` | `true` | the `[███░░░░░]` context bar |
80
+ | `bar_width` | `8` | bar cells |
81
+ | `token_counts` | `true` | `◉ 412k/1M` |
82
+ | `cached_tokens` | `true` | `⚡ 386k cached` — bold and bright by design, never width-gated |
83
+ | `ram` | `true` | `💻 57% (37 GB)` |
84
+ | `ram_min_width` | `0` | hide RAM below this terminal width; `0` always shows it |
85
+ | `clock` | `true` | `◷ 07:58` |
86
+ | `relay` | `true` | `⏺ relay` when a parked resume pointer exists |
87
+ | `rate_limits` | `true` | `5h:12% 7d:40%` (Claude Code only) |
88
+ | `session_id` | `false` | `#a1b2c3d4` |
89
+ | `git` | `true` | branch, staged/unstaged/untracked counts, ahead/behind |
90
+ | `separator` | `"\|"` | segment separator |
91
+
92
+ Config changes take effect on the next render. No reinstall needed.
93
+
94
+ ## Notes for you, not the user
95
+
96
+ - Do **not** hand-edit either `settings.json` to wire this. `--install` reads, merges and writes
97
+ back, so it cannot drop an unrelated key. Hand edits have dropped `trustedWorkspaces` before.
98
+ - The renderer never crashes the host. A bad payload, a missing field, or an unreadable config
99
+ degrades to fewer segments; a hard failure degrades to the directory name.
100
+ - RAM on Windows uses `ctypes` `GlobalMemoryStatusEx`, an in-process call. Do not replace it with
101
+ `Get-CimInstance Win32_OperatingSystem` — that cost about 300 ms on **every** render in the
102
+ PowerShell line this replaced.
103
+ - If the user asks why their old `~/.claude/statusline-custom.sh` or
104
+ `~/.gemini/statusline/statusline.ps1` no longer runs: nothing points at them any more. They are
105
+ superseded, not deleted. Both are safe to remove once the user is happy with the new line.
@@ -39,7 +39,7 @@ Run the Lower-Level Design (LLD) generation procedure:
39
39
  4. **Convert to Confluence Storage Format XHTML:**
40
40
  - Run the PlantUML-enabled converter:
41
41
  ```powershell
42
- python scripts/convert_doc_to_confluence.py docs/<app>/<app>-lld.md --output docs/<app>/<app>-lld.html --diagram-type plantuml
42
+ python "${CLAUDE_PLUGIN_ROOT}/scripts/convert_doc_to_confluence.py" docs/<app>/<app>-lld.md --output docs/<app>/<app>-lld.html --diagram-type plantuml
43
43
  ```
44
44
  - Verify that all diagrams are converted to native `<ac:structured-macro ac:name="plantuml">` blocks with scale 1.2, natural splines, auto-wrapped edge labels, crimson red borders on impacted components, and embedded Creole legends.
45
45
  - Verify that output validates as well-formed XML.
@@ -6,12 +6,20 @@ description: Multi-Model Review & Runner (MMR) — run an ad-hoc task in an isol
6
6
  # /caddis:mmr — Multi-Model Review & Runner
7
7
 
8
8
  Execute an ad-hoc task across model lanes (GLM-5.3 &rarr; Codex Sol &rarr; Claude) inside an isolated
9
- git worktree with automated test gates and second-vendor review (DeepSeek). Destroys the worktree
10
- immediately on completion (zero worktree leaks) and leaves the output on a clean branch with a
11
- simple Verdict Card.
9
+ git worktree with automated test gates and second-vendor review (DeepSeek). A full PASS commits
10
+ code changes and removes the worktree. A FAIL or PENDING keeps the worktree for inspection or
11
+ Claude-lane work. The result appears in a Verdict Card.
12
12
 
13
13
  When invoked without a task prompt (or with a git range), `/mmr` runs a direct cross-model diff review.
14
14
 
15
+ The user typed: **$ARGUMENTS**. Route it to one of the commands below: `keep`, `drop` or `status`
16
+ as given; a git range such as `origin/main..HEAD` to `review --range`; empty to `review`;
17
+ anything else is the task for `run`. Pass supported run flags such as `--type` with the task.
18
+ An unknown flag returns a usage error.
19
+
20
+ The exit codes follow `caddis_exit.py`: 0 clean, 1 blocked, 2 advisory, 3 could not run,
21
+ 4 error or bad usage. In particular, `caddis_adhoc.py` returns 4 for bad usage.
22
+
15
23
  ## Natural Language Triggers
16
24
  You can trigger MMR naturally without typing the full slash command:
17
25
  - *"Run this on another lane: &lt;task&gt;"* &rarr; `/mmr "<task>"`
@@ -27,21 +35,22 @@ You can trigger MMR naturally without typing the full slash command:
27
35
 
28
36
  ### 1. Run an Ad-Hoc Task
29
37
  ```bash
30
- python scripts/caddis_adhoc.py run "<task description>" [--type backend|tests|docs|ui|hard]
38
+ python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_adhoc.py" run "<task description>" [--type backend|tests|docs|ui|hard]
31
39
  # Shorthand:
32
- python scripts/caddis_adhoc.py "<task description>"
40
+ python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_adhoc.py" "<task description>"
33
41
  ```
34
42
  - **Sandbox Isolation:** Creates an ephemeral 1-phase plan at `.caddis/orchestrator/adhoc/<slug>.md`.
35
43
  - **Pre-flight Checks:** Verifies dirty tree and API keys. Warns if local edits exist.
36
44
  - **Failover Cascade:** Automatically cascades from GLM to Codex to Claude if a lane is out of budget.
37
45
  - **Local Test Gates:** Runs project test gates before review.
38
46
  - **Cross-Vendor Review:** DeepSeek or GLM reviews the diff.
39
- - **Immediate Worktree Cleanup:** Stashes/commits results to `lane/adhoc-<slug>` and immediately removes the worktree. Zero open worktrees remain.
40
- - **Verdict Card:** Prints PASS/FAIL summary with diff stats and next actions.
47
+ - **Worktree result:** PASS commits code changes to `lane/adhoc-<slug>` and removes the worktree. FAIL keeps it. A Claude-lane `PENDING` keeps it and prints the `NEXT:` step. Gates that never ran show `Gates: not run`.
48
+ - **No-op and gate failures:** A run with no code changes fails and keeps its worktree. A pytest gate that collects no tests also fails.
49
+ - **Verdict Card:** Prints PASS, FAIL, or PENDING with diff stats and next actions.
41
50
 
42
51
  ### 2. Keep the Result
43
52
  ```bash
44
- python scripts/caddis_adhoc.py keep
53
+ python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_adhoc.py" keep
45
54
  ```
46
55
  - Keeps the output branch `lane/adhoc-<slug>`.
47
56
  - **Main Branch Protection:** If you are on `main` or `master`, direct merge is disabled to protect trunk. Recommends running `/ship-pr`.
@@ -49,15 +58,15 @@ python scripts/caddis_adhoc.py keep
49
58
 
50
59
  ### 3. Drop the Result
51
60
  ```bash
52
- python scripts/caddis_adhoc.py drop
61
+ python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_adhoc.py" drop
53
62
  ```
54
- - Deletes the branch `lane/adhoc-<slug>`.
63
+ - Removes a kept worktree, prunes its registration, and deletes the task branch.
55
64
  - Deletes the ephemeral plan file and run logs.
56
65
  - Workspace remains clean and untouched.
57
66
 
58
67
  ### 4. Check Status
59
68
  ```bash
60
- python scripts/caddis_adhoc.py status
69
+ python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_adhoc.py" status
61
70
  ```
62
71
  - Displays API key readiness for all lanes (`Anthropic`, `DeepSeek`, `GLM`, `OpenAI`).
63
72
  - Shows the latest task status, model used, and gates/review verdicts.
@@ -65,11 +74,11 @@ python scripts/caddis_adhoc.py status
65
74
 
66
75
  ### 5. Review Diff Only
67
76
  ```bash
68
- python scripts/caddis_adhoc.py review [--range <range>]
77
+ python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_adhoc.py" review [--range <range>]
69
78
  # Shorthand (no args):
70
- python scripts/caddis_adhoc.py
79
+ python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_adhoc.py"
71
80
  ```
72
- - Fast cross-model review of working tree or git range (e.g., `origin/main..HEAD`).
81
+ - Fast cross-model review of working tree or git range (e.g., `origin/main..HEAD`). A range can also be passed directly as the first argument.
73
82
 
74
83
  ---
75
84
 
@@ -1,36 +1,6 @@
1
1
  ---
2
2
  name: resume
3
- description: Pop the most recently parked workstream off the stack and resume it at its exact resume point
3
+ description: Renamed to /caddis:catchup (alias, removed next release)
4
4
  ---
5
5
 
6
- # /caddis:resume — pop the parked task and pick it back up
7
-
8
- A digression is finished; return to the task you parked with `/digress`. This pops the top frame off the
9
- workstream stack, restates where you were, realigns `relay.md`, and immediately continues the work — the
10
- user should not have to remember or re-state anything.
11
-
12
- ## Step 1 — read the stack
13
- Read `.caddis/workstreams.json`. If it is **absent, unparseable, `version != 1`, or `stack` is empty**,
14
- say exactly `Nothing is parked.` and stop. Do nothing else.
15
-
16
- ## Step 2 — pop the top frame
17
- The top of stack is the **last** element of `stack` (LIFO — most recently parked). Remove it and write the
18
- rest of the file back (preserve `version` and any other frames + unknown fields). This is the one write
19
- this command makes to the state file.
20
-
21
- ## Step 3 — restate + realign relay.md
22
- Restate the popped frame to the user: its `plan`, `phase`, and `resumePointer` (and `repo` if set — the
23
- parked task lives in another repo, so say which). Then edit `.caddis/relay.md`'s `## Next step` section
24
- **in place** so it matches the popped frame's `resumePointer` — preserve every other section of relay.md
25
- untouched. (If relay.md or that section is absent, skip this edit silently; the restatement above is enough.)
26
-
27
- ## Step 4 — resume the work
28
- Begin executing the `resumePointer` immediately. Ask nothing — the frame already carries the next action.
29
- If the parked plan lives in another `repo`, note that the user may need to open that repo first, then
30
- proceed there.
31
-
32
- ## Rules
33
- - **Never** run a destructive or history-rewriting git action (no `git checkout`, `git reset`, `git stash`,
34
- branch switches). Resuming is metadata-only.
35
- - Pop exactly one frame per invocation (the LIFO top). Run `/resume` again to pop the next.
36
- - Only real paths and verified facts — restate the frame as written; do not embellish the resume point.
6
+ This command was renamed to /caddis:catchup. Run /caddis:catchup now in its pop-and-resume mode with the same arguments ($ARGUMENTS); if $ARGUMENTS is empty, pass `last` as the name, so this alias still pops the most recently parked task as /caddis:resume always did. Tell the user once: "/caddis:resume is renamed to /caddis:catchup; the old name will be removed in the next release."
@@ -1,100 +1,6 @@
1
1
  ---
2
2
  name: review
3
- description: Review someone else's OPEN pull request end to end — what changed, what CI says, what is risky — then approve or request changes. Never approves on its own.
3
+ description: Renamed to /caddis:review-pr (alias, removed next release)
4
4
  ---
5
5
 
6
- # /caddis:review — review an open PR, then decide
7
-
8
- Review pull request **$ARGUMENTS** and walk the operator to an approve-or-not decision.
9
-
10
- > **This is the only caddis review surface aimed at a PULL REQUEST.** The others review a local
11
- > diff: `/caddis:gate-review` (adversarial, same vendor), `/caddis:cross-review` (a different
12
- > vendor's model). `/caddis:ship-pr` and `/caddis:ship-merge` create and merge PRs. This one is for
13
- > the case none of those covers — somebody else has opened a PR and you have to decide about it.
14
- >
15
- > Do not reimplement the review itself. Gather the context, then hand the diff to
16
- > `/caddis:gate-review` (or Claude Code's native `/code-review`, which is better where it exists).
17
-
18
- ## Absolute rule
19
-
20
- **Never approve, request changes, merge, or close on the operator's behalf.** Present the evidence
21
- and the exact command; the human runs it. An approval is the one human judgement in the pipeline —
22
- a review tool that also approves has removed the thing it was built to protect.
23
-
24
- ## 1. Resolve the PR
25
-
26
- `$ARGUMENTS` is a PR number, optionally followed by `owner/repo`. With no repo, use the current
27
- directory's `origin`. If the number is missing, list the open PRs and stop.
28
-
29
- ```bash
30
- gh pr view <n> --repo <owner/repo> --json number,title,author,state,isDraft,mergeStateStatus,reviewDecision,baseRefName,headRefName,additions,deletions,changedFiles,url
31
- ```
32
-
33
- **Stop and say so, before reviewing anything**, if:
34
- - the PR is **merged or closed** — there is nothing to decide;
35
- - it is a **draft** — say so and ask whether to continue;
36
- - **the operator is the author.** GitHub does not allow approving your own PR. Say it plainly, and
37
- say the alternatives: have someone else approve it, or merge with an admin bypass
38
- (`gh pr merge <n> --squash --admin`). Do not silently produce a review they cannot submit.
39
-
40
- ## 2. Gather what the decision needs
41
-
42
- Four things, and report them even when they are boring — "CI is green" is information:
43
-
44
- ```bash
45
- gh pr checks <n> --repo <owner/repo> # every check and its state
46
- gh pr diff <n> --repo <owner/repo> # the change itself
47
- gh pr view <n> --repo <owner/repo> --comments # review comments, and any bot review
48
- ```
49
-
50
- If an automated review has already commented, **read it and say whether you agree**. Two reviews
51
- that disagree is a finding; two that agree is worth stating once, not twice.
52
-
53
- `mergeStateStatus` explains a blocked PR without guessing: `BLOCKED` (needs a review),
54
- `BEHIND` (needs *Update branch*), `UNSTABLE` (a check failed), `DIRTY` (conflicts).
55
-
56
- ## 3. Review the diff
57
-
58
- Hand it to `/caddis:gate-review` — or the native `/code-review` on Claude Code. Then, on top of its
59
- verdict, check the things that have actually cost this fleet time, because a generic reviewer will
60
- not know to look:
61
-
62
- - **A gate that cannot fail.** A check whose failure path cannot execute — piped to `Out-Null`,
63
- wrapped in a `catch{}` a native non-zero exit can never trigger, or asserting something too broad
64
- to attribute. It manufactures confidence. Worse than no check.
65
- - **A wall-clock assertion.** A timing threshold on a shared runner measures load, not the code.
66
- Assert ordering instead.
67
- - **Staged directories.** `git add -A` / `git add .` sweeps in files nobody reviewed.
68
- - **CI shell assumptions.** The runner may be Windows PowerShell 5.1, where a native command's
69
- stderr becomes a terminating error under `$ErrorActionPreference='Stop'`, and where `Should -Be`
70
- (Pester 4 syntax) fails on a Pester 3 runner.
71
- - **Deploy-script changes.** If the pipeline runs the deploy script from a checkout it also updates,
72
- the change does not take effect on the deploy that delivers it. Budget two deploys.
73
- - **Verification by proxy.** An HTTP 200 or a version string is not proof a page renders.
74
- - **Credentials.** A token scoped to the wrong host; a permission raised to make a test pass; a
75
- secret in a URL where git will echo it into a log.
76
- - **A doc the change makes untrue.** Comments and runbooks that were accurate until this diff.
77
-
78
- ## 4. Report, then hand over
79
-
80
- Lead with the verdict. Keep it short enough to read before deciding:
81
-
82
- - **What this PR does** — one or two sentences, not a file list.
83
- - **Blocking issues** — each with file, line, and why it matters. None is a valid answer, and say it.
84
- - **Should-fix / nits** — grouped, brief.
85
- - **CI** — green, red, or still running. Name the failing check.
86
- - **Merge state** — and what would clear it.
87
-
88
- Then print the exact commands, and stop:
89
-
90
- ```bash
91
- # approve
92
- gh pr review <n> --repo <owner/repo> --approve
93
- gh pr merge <n> --repo <owner/repo> --squash --delete-branch
94
-
95
- # or ask for changes
96
- gh pr review <n> --repo <owner/repo> --request-changes --body "..."
97
- ```
98
-
99
- **If you found a blocking issue, say so in the verdict line** rather than burying it under the
100
- summary. The operator should be able to read the first line and know whether to keep reading.
6
+ This command was renamed to /caddis:review-pr. Run /caddis:review-pr now with the same arguments ($ARGUMENTS), and tell the user once: "/caddis:review is renamed to /caddis:review-pr; the old name will be removed in the next release."
@@ -0,0 +1,100 @@
1
+ ---
2
+ name: review-pr
3
+ description: Review someone else's OPEN pull request end to end — what changed, what CI says, what is risky — then approve or request changes. Never approves on its own.
4
+ ---
5
+
6
+ # /caddis:review-pr — review an open PR, then decide
7
+
8
+ Review pull request **$ARGUMENTS** and walk the operator to an approve-or-not decision.
9
+
10
+ > **This is the only caddis review surface aimed at a PULL REQUEST.** The others review a local
11
+ > diff: `/caddis:gate-review` (adversarial, same vendor), `/caddis:cross-review` (a different
12
+ > vendor's model). `/caddis:ship-pr` and `/caddis:ship-merge` create and merge PRs. This one is for
13
+ > the case none of those covers — somebody else has opened a PR and you have to decide about it.
14
+ >
15
+ > Do not reimplement the review itself. Gather the context, then hand the diff to
16
+ > `/caddis:gate-review` (or Claude Code's native `/code-review`, which is better where it exists).
17
+
18
+ ## Absolute rule
19
+
20
+ **Never approve, request changes, merge, or close on the operator's behalf.** Present the evidence
21
+ and the exact command; the human runs it. An approval is the one human judgement in the pipeline —
22
+ a review tool that also approves has removed the thing it was built to protect.
23
+
24
+ ## 1. Resolve the PR
25
+
26
+ `$ARGUMENTS` is a PR number, optionally followed by `owner/repo`. With no repo, use the current
27
+ directory's `origin`. If the number is missing, list the open PRs and stop.
28
+
29
+ ```bash
30
+ gh pr view <n> --repo <owner/repo> --json number,title,author,state,isDraft,mergeStateStatus,reviewDecision,baseRefName,headRefName,additions,deletions,changedFiles,url
31
+ ```
32
+
33
+ **Stop and say so, before reviewing anything**, if:
34
+ - the PR is **merged or closed** — there is nothing to decide;
35
+ - it is a **draft** — say so and ask whether to continue;
36
+ - **the operator is the author.** GitHub does not allow approving your own PR. Say it plainly, and
37
+ say the alternatives: have someone else approve it, or merge with an admin bypass
38
+ (`gh pr merge <n> --squash --admin`). Do not silently produce a review they cannot submit.
39
+
40
+ ## 2. Gather what the decision needs
41
+
42
+ Four things, and report them even when they are boring — "CI is green" is information:
43
+
44
+ ```bash
45
+ gh pr checks <n> --repo <owner/repo> # every check and its state
46
+ gh pr diff <n> --repo <owner/repo> # the change itself
47
+ gh pr view <n> --repo <owner/repo> --comments # review comments, and any bot review
48
+ ```
49
+
50
+ If an automated review has already commented, **read it and say whether you agree**. Two reviews
51
+ that disagree is a finding; two that agree is worth stating once, not twice.
52
+
53
+ `mergeStateStatus` explains a blocked PR without guessing: `BLOCKED` (needs a review),
54
+ `BEHIND` (needs *Update branch*), `UNSTABLE` (a check failed), `DIRTY` (conflicts).
55
+
56
+ ## 3. Review the diff
57
+
58
+ Hand it to `/caddis:gate-review` — or the native `/code-review` on Claude Code. Then, on top of its
59
+ verdict, check the things that have actually cost this fleet time, because a generic reviewer will
60
+ not know to look:
61
+
62
+ - **A gate that cannot fail.** A check whose failure path cannot execute — piped to `Out-Null`,
63
+ wrapped in a `catch{}` a native non-zero exit can never trigger, or asserting something too broad
64
+ to attribute. It manufactures confidence. Worse than no check.
65
+ - **A wall-clock assertion.** A timing threshold on a shared runner measures load, not the code.
66
+ Assert ordering instead.
67
+ - **Staged directories.** `git add -A` / `git add .` sweeps in files nobody reviewed.
68
+ - **CI shell assumptions.** The runner may be Windows PowerShell 5.1, where a native command's
69
+ stderr becomes a terminating error under `$ErrorActionPreference='Stop'`, and where `Should -Be`
70
+ (Pester 4 syntax) fails on a Pester 3 runner.
71
+ - **Deploy-script changes.** If the pipeline runs the deploy script from a checkout it also updates,
72
+ the change does not take effect on the deploy that delivers it. Budget two deploys.
73
+ - **Verification by proxy.** An HTTP 200 or a version string is not proof a page renders.
74
+ - **Credentials.** A token scoped to the wrong host; a permission raised to make a test pass; a
75
+ secret in a URL where git will echo it into a log.
76
+ - **A doc the change makes untrue.** Comments and runbooks that were accurate until this diff.
77
+
78
+ ## 4. Report, then hand over
79
+
80
+ Lead with the verdict. Keep it short enough to read before deciding:
81
+
82
+ - **What this PR does** — one or two sentences, not a file list.
83
+ - **Blocking issues** — each with file, line, and why it matters. None is a valid answer, and say it.
84
+ - **Should-fix / nits** — grouped, brief.
85
+ - **CI** — green, red, or still running. Name the failing check.
86
+ - **Merge state** — and what would clear it.
87
+
88
+ Then print the exact commands, and stop:
89
+
90
+ ```bash
91
+ # approve
92
+ gh pr review <n> --repo <owner/repo> --approve
93
+ gh pr merge <n> --repo <owner/repo> --squash --delete-branch
94
+
95
+ # or ask for changes
96
+ gh pr review <n> --repo <owner/repo> --request-changes --body "..."
97
+ ```
98
+
99
+ **If you found a blocking issue, say so in the verdict line** rather than burying it under the
100
+ summary. The operator should be able to read the first line and know whether to keep reading.