@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.
- package/bundles/antigravity-plugin/caddis_statusline.py +0 -1
- package/bundles/antigravity-plugin/mcp_ping_server.py +1 -1
- package/bundles/antigravity-plugin/plugin.json +1 -1
- package/bundles/antigravity-plugin/scripts/caddis_adhoc.py +301 -66
- package/bundles/antigravity-plugin/scripts/caddis_exit.py +15 -0
- package/bundles/antigravity-plugin/scripts/caddis_frontmatter.py +145 -0
- package/bundles/antigravity-plugin/scripts/caddis_gate.py +33 -10
- package/bundles/antigravity-plugin/scripts/caddis_governor.py +5 -2
- package/bundles/antigravity-plugin/scripts/caddis_lanes.py +13 -1
- package/bundles/antigravity-plugin/scripts/caddis_migrate_dir.py +1 -1
- package/bundles/antigravity-plugin/scripts/caddis_spawn.py +2 -2
- package/bundles/antigravity-plugin/scripts/caddis_statusline.py +0 -1
- package/bundles/antigravity-plugin/scripts/caddis_tidy.py +9 -14
- package/bundles/antigravity-plugin/scripts/claudster_doctor.py +66 -0
- package/bundles/antigravity-plugin/scripts/convert_doc_to_confluence.py +1430 -0
- package/bundles/antigravity-plugin/scripts/new-machine.ps1 +1 -1
- package/bundles/antigravity-plugin/scripts/oss_ask.py +6 -5
- package/bundles/antigravity-plugin/scripts/oss_model.py +1 -1
- package/bundles/antigravity-plugin/scripts/oss_review.py +84 -15
- package/bundles/antigravity-plugin/scripts/secret_filter.py +316 -0
- package/bundles/antigravity-plugin/scripts/setup_project_ai.py +9 -4
- package/bundles/antigravity-plugin/skills/_registry.md +5 -3
- package/bundles/antigravity-plugin/skills/catchup/SKILL.md +37 -2
- package/bundles/antigravity-plugin/skills/cross-review/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/data-lineage/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/digress/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/handoff/SKILL.md +8 -1
- package/bundles/antigravity-plugin/skills/hld/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/implement/SKILL.md +3 -1
- package/bundles/antigravity-plugin/skills/install-statusline/SKILL.md +105 -0
- package/bundles/antigravity-plugin/skills/lld/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/mmr/SKILL.md +23 -14
- package/bundles/antigravity-plugin/skills/resume/SKILL.md +2 -32
- package/bundles/antigravity-plugin/skills/review/SKILL.md +2 -96
- package/bundles/antigravity-plugin/skills/review-pr/SKILL.md +100 -0
- package/bundles/antigravity-plugin/skills/statusline/SKILL.md +2 -101
- package/bundles/antigravity-plugin-extras/plugin.json +1 -1
- package/bundles/antigravity-plugin-extras/skills/cross-review/SKILL.md +3 -3
- package/bundles/antigravity-plugin-extras/skills/golden-plan/SKILL.md +1 -1
- package/bundles/codex/.codex/config.toml.example +0 -16
- package/bundles/codex/AGENTS.md +2 -2
- package/bundles/manifest.json +3 -3
- package/dist/claude-deepseek.js +1 -1
- package/dist/claude-glm.js +1 -1
- package/dist/claude-oss.js +1 -1
- package/dist/cli.js +1 -1
- 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:
|
|
62
|
-
|
|
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
|
-
- **
|
|
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 — `/
|
|
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 `/
|
|
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
|
-
|
|
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 → Codex Sol → Claude) inside an isolated
|
|
9
|
-
git worktree with automated test gates and second-vendor review (DeepSeek).
|
|
10
|
-
|
|
11
|
-
|
|
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: <task>"* → `/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
|
-
- **
|
|
40
|
-
- **
|
|
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
|
-
-
|
|
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:
|
|
3
|
+
description: Renamed to /caddis:catchup (alias, removed next release)
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
|
|
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:
|
|
3
|
+
description: Renamed to /caddis:review-pr (alias, removed next release)
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
|
|
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.
|