@caddis/cli 0.4.34 → 0.4.36
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/agents/code-reviewer.md +4 -0
- package/bundles/antigravity-plugin/plugin.json +1 -1
- package/bundles/antigravity-plugin/scripts/caddis_file_lock.py +121 -0
- package/bundles/antigravity-plugin/scripts/caddis_frontmatter.py +12 -0
- package/bundles/antigravity-plugin/scripts/caddis_gate.py +210 -6
- package/bundles/antigravity-plugin/scripts/caddis_inventory.py +9 -9
- package/bundles/antigravity-plugin/scripts/caddis_lanes.py +262 -1
- package/bundles/antigravity-plugin/scripts/caddis_relay_git.py +159 -0
- package/bundles/antigravity-plugin/scripts/caddis_routing.py +103 -0
- package/bundles/antigravity-plugin/scripts/caddis_tidy.py +579 -40
- package/bundles/antigravity-plugin/scripts/caddis_todo.py +462 -0
- package/bundles/antigravity-plugin/scripts/caddis_workstreams.py +631 -0
- package/bundles/antigravity-plugin/scripts/check_doc_coverage.py +27 -13
- package/bundles/antigravity-plugin/scripts/oss_review.py +30 -3
- package/bundles/antigravity-plugin/scripts/setup_project_ai.py +5 -0
- package/bundles/antigravity-plugin/scripts/usage_review.py +2 -2
- package/bundles/antigravity-plugin/session_end_agy.py +16 -1
- package/bundles/antigravity-plugin/skills/_registry.md +35 -32
- package/bundles/antigravity-plugin/skills/adopt-app/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/advisory-hub/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/api-design/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/backend-development/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/catchup/SKILL.md +31 -33
- package/bundles/antigravity-plugin/skills/ci-cd-pipeline/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/cloud-phases/SKILL.md +185 -0
- package/bundles/antigravity-plugin/skills/code-documentation/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/code-review/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/codebase-audit/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/confluence-hla/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/cross-review/SKILL.md +9 -1
- package/bundles/antigravity-plugin/skills/css-architecture/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/dashboard-perf-sweep/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/database-design/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/db-diagram/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/decide/SKILL.md +61 -0
- package/bundles/antigravity-plugin/skills/digress/SKILL.md +41 -23
- package/bundles/antigravity-plugin/skills/error-handling/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/explainer-doc/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/feature-plan/SKILL.md +20 -0
- package/bundles/antigravity-plugin/skills/frontend-design/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/gate-preflight/SKILL.md +12 -0
- package/bundles/antigravity-plugin/skills/handoff/SKILL.md +74 -13
- package/bundles/antigravity-plugin/skills/implement/SKILL.md +31 -2
- package/bundles/antigravity-plugin/skills/mermaid-diagrams/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/mmr/SKILL.md +8 -0
- package/bundles/antigravity-plugin/skills/particle-art/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/playwright/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/port-to-github/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/pr-merge/SKILL.md +33 -2
- package/bundles/antigravity-plugin/skills/python/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/rca/SKILL.md +97 -0
- package/bundles/antigravity-plugin/skills/react-dev/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/safe-cleanup/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/ship/SKILL.md +27 -7
- package/bundles/antigravity-plugin/skills/ship-merge/SKILL.md +36 -3
- package/bundles/antigravity-plugin/skills/ship-pr/SKILL.md +6 -1
- package/bundles/antigravity-plugin/skills/skill-creator/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/sql/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/tech-explainer/SKILL.md +7 -12
- package/bundles/antigravity-plugin/skills/technical-writing/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/test-strategy/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/ui-review/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/using-git-worktrees/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/warm-editorial-ui/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/webapp-testing/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/windows-deployment/SKILL.md +1 -1
- package/bundles/antigravity-plugin/warm_start_agy.py +138 -42
- package/bundles/antigravity-plugin-extras/plugin.json +1 -1
- package/bundles/antigravity-plugin-extras/skills/_registry.md +61 -61
- package/bundles/antigravity-plugin-extras/skills/agent-md-refactor/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/agent-orchestration/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/algorithmic-art/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/api-client-patterns/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/architecture-diagram/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/architecture-document/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/artifacts-builder/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/ascii-art/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/aws-agentic-ai/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/aws-cdk-development/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/aws-cost-operations/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/aws-serverless-eda/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/backend-to-frontend-handoff/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/banner-design/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/brand-design/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/brand-guidelines/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/brand-voice/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/building-ai-agent-on-cloudflare/SKILL.md +3 -7
- package/bundles/antigravity-plugin-extras/skills/building-mcp-server-on-cloudflare/SKILL.md +3 -7
- package/bundles/antigravity-plugin-extras/skills/canvas-design/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/changelog-generator/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/code-explainer/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/component-testing/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/cross-review/SKILL.md +10 -2
- package/bundles/antigravity-plugin-extras/skills/data-contract-pipeline/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/data-loader/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/data-validation/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/deploy-local/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/design-md/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/design-system-tokens/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/developer-growth-analysis/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/doc-coauthoring/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/documentation-analyzer/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/enterprise-dashboard-aesthetic-system/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/file-organizer/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/game-changing-features/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/golden-nuggets/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/golden-plan/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/hld/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/internal-comms/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/jira-issues/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/lld/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/llm-application-dev/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/mcp-builder/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/monorepo/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/nextjs-app-router/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/observability/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/performance-testing/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/popular-web-designs/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/prd-to-code/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/react-useeffect/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/receiving-code-review/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/responsive-mobile-native/SKILL.md +4 -9
- package/bundles/antigravity-plugin-extras/skills/safe-cleanup/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/schema-migration/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/setup-project-ai/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/shadcn-radix/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/sketch/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/streamlit-dev/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/theme-factory/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/ui-styling-patterns/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/ui-ux-intelligence/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/understand-anything/SKILL.md +5 -9
- package/bundles/antigravity-plugin-extras/skills/update-readme/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/word-cloud/SKILL.md +1 -1
- package/bundles/codex/.codex/skills/coding/api-design/SKILL.md +1 -1
- package/bundles/codex/.codex/skills/coding/backend-development/SKILL.md +1 -1
- package/bundles/codex/.codex/skills/coding/code-review/SKILL.md +1 -1
- package/bundles/codex/.codex/skills/coding/codebase-audit/SKILL.md +1 -1
- package/bundles/codex/.codex/skills/coding/dashboard-perf-sweep/SKILL.md +1 -1
- package/bundles/codex/.codex/skills/coding/error-handling/SKILL.md +1 -1
- package/bundles/codex/.codex/skills/coding/python/SKILL.md +1 -1
- package/bundles/codex/.codex/skills/coding/sql/SKILL.md +1 -1
- package/bundles/codex/.codex/skills/data/database-design/SKILL.md +1 -1
- package/bundles/codex/.codex/skills/data/db-diagram/SKILL.md +1 -1
- package/bundles/codex/.codex/skills/devops/adopt-app/SKILL.md +1 -1
- package/bundles/codex/.codex/skills/devops/ci-cd-pipeline/SKILL.md +1 -1
- package/bundles/codex/.codex/skills/devops/port-to-github/SKILL.md +1 -1
- package/bundles/codex/.codex/skills/devops/safe-cleanup/SKILL.md +1 -1
- package/bundles/codex/.codex/skills/devops/using-git-worktrees/SKILL.md +1 -1
- package/bundles/codex/.codex/skills/devops/windows-deployment/SKILL.md +1 -1
- package/bundles/codex/.codex/skills/docs/code-documentation/SKILL.md +1 -1
- package/bundles/codex/.codex/skills/docs/confluence-hla/SKILL.md +1 -1
- package/bundles/codex/.codex/skills/docs/explainer-doc/SKILL.md +1 -1
- package/bundles/codex/.codex/skills/docs/tech-explainer/SKILL.md +7 -12
- package/bundles/codex/.codex/skills/docs/technical-writing/SKILL.md +1 -1
- package/bundles/codex/.codex/skills/frontend/css-architecture/SKILL.md +1 -1
- package/bundles/codex/.codex/skills/frontend/frontend-design/SKILL.md +1 -1
- package/bundles/codex/.codex/skills/frontend/react-dev/SKILL.md +1 -1
- package/bundles/codex/.codex/skills/frontend/ui-review/SKILL.md +1 -1
- package/bundles/codex/.codex/skills/frontend/warm-editorial-ui/SKILL.md +1 -1
- package/bundles/codex/.codex/skills/media/mermaid-diagrams/SKILL.md +1 -1
- package/bundles/codex/.codex/skills/media/particle-art/SKILL.md +1 -1
- package/bundles/codex/.codex/skills/testing/playwright/SKILL.md +1 -1
- package/bundles/codex/.codex/skills/testing/test-strategy/SKILL.md +1 -1
- package/bundles/codex/.codex/skills/testing/webapp-testing/SKILL.md +1 -1
- package/bundles/codex/.codex/skills/workflow/advisory-hub/SKILL.md +1 -1
- package/bundles/codex/.codex/skills/workflow/skill-creator/SKILL.md +1 -1
- package/bundles/codex/AGENTS.md +5 -1
- package/bundles/manifest.json +3 -3
- package/package.json +1 -1
|
@@ -5,7 +5,7 @@ description: End-of-session handoff — capture exact state so the next session
|
|
|
5
5
|
|
|
6
6
|
# /handoff — stop cleanly, write the resume doc
|
|
7
7
|
|
|
8
|
-
You are ending a work session. Produce/refresh
|
|
8
|
+
You are ending a work session. Produce/refresh this workstream's resume doc (`.caddis/relay/<name>.md`) so the next session
|
|
9
9
|
(you, a future you, or another agent on any tool) can resume immediately. This is the anti-context-rot checkpoint.
|
|
10
10
|
|
|
11
11
|
## Step 1 — capture learnings FIRST (knowledge-transfer)
|
|
@@ -103,21 +103,42 @@ Nothing to say is the normal answer. Say nothing and move on — this must not b
|
|
|
103
103
|
<!-- /shared:harness-friction-question -->
|
|
104
104
|
|
|
105
105
|
## Step 3 — write the resume doc (overwrite) with exactly these sections
|
|
106
|
-
> **Where to write:**
|
|
107
|
-
>
|
|
108
|
-
>
|
|
109
|
-
> per-branch file automatically when it exists, then `.caddis/relay.md`, then the legacy
|
|
110
|
-
> `.claude/relay/<branch>.md` and root `relay.md` (back-compat during the migration).
|
|
106
|
+
> **Where to write:** this session's own workstream relay, `.caddis/relay/<name>.md`, through the
|
|
107
|
+
> locked script — never with a plain file edit, which would skip the conflict check. `.caddis/relay.md`
|
|
108
|
+
> is a generated index of all workstreams; do not write it by hand.
|
|
111
109
|
>
|
|
112
|
-
>
|
|
113
|
-
>
|
|
110
|
+
> Your session id is printed at session start as `[caddis] this session's id: <id>`; use it for
|
|
111
|
+
> `session_id` and `--session-id`. Never guess one: a wrong id disables session matching.
|
|
112
|
+
>
|
|
113
|
+
> 1. **Name the workstream** (active plan's `feature`, else the branch; the script prints nothing
|
|
114
|
+
> on the default branch with no plan — then ask the user for a short name):
|
|
115
|
+
> `python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_workstreams.py" resolve --plan <feature> --branch <branch> --default-branch <main>`
|
|
116
|
+
> 2. **Legacy repo:** if `.caddis/relay.md` exists and does not start with
|
|
117
|
+
> `<!-- caddis-workstream-index-v1 -->`, or an old `/digress` stack `.caddis/workstreams.json`
|
|
118
|
+
> exists, run `caddis_workstreams.py migrate-legacy` once first.
|
|
119
|
+
> It backs up the old file and stops without deleting anything on a conflict; report a conflict
|
|
120
|
+
> to the user and stop.
|
|
121
|
+
> 3. **Read the stored version's hash** before you compose: `caddis_workstreams.py hash <name>`
|
|
122
|
+
> (prints `none` for a new workstream).
|
|
123
|
+
> 4. **Write** the relay below to a temp file, then
|
|
124
|
+
> `caddis_workstreams.py write <name> <temp-file> --expected-hash <hash>`. Exit 1 means another
|
|
125
|
+
> session changed the relay since step 3: it prints the diff and writes nothing. Show the diff,
|
|
126
|
+
> merge by hand, and retry with the new hash. Never force it.
|
|
127
|
+
> 5. **Refresh the index:** `caddis_workstreams.py render-index --session-id <id> --branch <branch>`.
|
|
128
|
+
>
|
|
129
|
+
> (Source checkout: `scripts/caddis_workstreams.py`.) A repo still on the pre-rename `.claudster/`
|
|
130
|
+
> won't see this relay until it's converted — `/caddis:migrate-dir` does that.
|
|
114
131
|
|
|
115
132
|
```markdown
|
|
116
133
|
---
|
|
117
134
|
type: relay
|
|
118
135
|
workstream: <name>
|
|
119
136
|
branch: <branch>
|
|
120
|
-
|
|
137
|
+
plan: <plan file name, or empty>
|
|
138
|
+
session_id: <session id>
|
|
139
|
+
generated:
|
|
140
|
+
by: <model>
|
|
141
|
+
at: <ISO time>
|
|
121
142
|
---
|
|
122
143
|
|
|
123
144
|
# Relay — <feature>
|
|
@@ -148,7 +169,7 @@ advisory-context audit: <N candidates → M gaps → landed in <path>> | n/a (no
|
|
|
148
169
|
|
|
149
170
|
## Resume prompt
|
|
150
171
|
\`\`\`
|
|
151
|
-
Read relay
|
|
172
|
+
Read .caddis/relay/<name>.md, then the plan it points to. Continue from <phase/step>. Next action: <exact>.
|
|
152
173
|
\`\`\`
|
|
153
174
|
```
|
|
154
175
|
|
|
@@ -168,7 +189,7 @@ handoff over it.
|
|
|
168
189
|
## Step 5 — check the handover you just wrote
|
|
169
190
|
|
|
170
191
|
```
|
|
171
|
-
python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_gate.py" handover-check --doc .caddis/relay
|
|
192
|
+
python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_gate.py" handover-check --doc .caddis/relay/<name>.md --max-chars 4000
|
|
172
193
|
```
|
|
173
194
|
(falls back to `scripts/caddis_gate.py` in a source checkout; degrades open when the script is
|
|
174
195
|
missing.) **Run it in the repo the handover is about** — a handover describing another repo will
|
|
@@ -181,13 +202,53 @@ incoming Hub looking for a prompt that was never written. Fix what it lists, the
|
|
|
181
202
|
It also notes any generated artefact committed before its generator last changed. That is advisory,
|
|
182
203
|
not blocking — but do not quote a report the note names without rebuilding it first.
|
|
183
204
|
|
|
205
|
+
## Step 6 — reconcile task rows from session-state
|
|
206
|
+
Run task reconciliation against the newest session-state file:
|
|
207
|
+
```
|
|
208
|
+
python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_todo.py" reconcile --session-state .caddis/session-state/<session-id>.md
|
|
209
|
+
```
|
|
210
|
+
This marks ad-hoc to-do items done by metadata ID; it never edits the Tracker and ignores phase rows.
|
|
211
|
+
|
|
212
|
+
## Step 6b — record usage and tidy session state
|
|
213
|
+
The Stop hook only writes the session-state file. These two used to run on every turn; they run
|
|
214
|
+
here, once:
|
|
215
|
+
```
|
|
216
|
+
python "${CLAUDE_PLUGIN_ROOT}/scripts/session_state.py" usage --session-id <session-id>
|
|
217
|
+
python "${CLAUDE_PLUGIN_ROOT}/scripts/session_state.py" prune
|
|
218
|
+
```
|
|
219
|
+
`usage` finds this session's transcript by its id and appends one token-and-skill record to
|
|
220
|
+
`.caddis/usage-log.jsonl`, which `/usage-review` reads. Pass `--transcript <path>` if you know the
|
|
221
|
+
path and it is not under the Claude config folder. `prune` keeps the newest 8 files in
|
|
222
|
+
`.caddis/session-state/`; run it after Step 6, which reads this session's file. Include the
|
|
223
|
+
`[USAGE]` line in your output. Both always exit 0; if the script is missing, skip this step.
|
|
224
|
+
|
|
225
|
+
Then list old local state (falls back to `scripts/caddis_tidy.py`; skip if missing):
|
|
226
|
+
```
|
|
227
|
+
python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_tidy.py" --prune
|
|
228
|
+
```
|
|
229
|
+
It only lists: session-state files older than 7 days, logs over 5 MB to rotate, and (report
|
|
230
|
+
only, never deleted) orphan `.lock` files and lane worktrees older than 7 days. Include its report. **Never
|
|
231
|
+
add `--apply` yourself**; deleting is the user's choice. If they ask, run `--prune --apply`.
|
|
232
|
+
|
|
233
|
+
## Step 7 — push prompt (interactive only)
|
|
234
|
+
If this is an interactive session, ask the user every time — never reuse an earlier answer:
|
|
235
|
+
`Push this note for another machine? (y/N)`
|
|
236
|
+
Only on an explicit `y` in this session, run:
|
|
237
|
+
```
|
|
238
|
+
python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_relay_git.py" push <name> --user-said-yes
|
|
239
|
+
```
|
|
240
|
+
It publishes only `.caddis/relay/<name>.md` to `refs/caddis/relay/<name>` — never the branch, the
|
|
241
|
+
index or staged files — after the secret filter passes. Report its one-line result. Anything but
|
|
242
|
+
`y` means do nothing. Headless runs never ask and never push (the script also refuses headless).
|
|
243
|
+
On the other machine, `/catchup <name>` fetches it.
|
|
244
|
+
|
|
184
245
|
## Rules
|
|
185
246
|
- **One next action, by priority ladder.** `## Next step` names exactly ONE action — not a menu. Pick it in
|
|
186
247
|
order: (1) interrupted mid-phase work → finish + commit it; else (2) the active plan's next not-started
|
|
187
248
|
phase; else (3) the top open question/decision. Everything else is context, not the next step.
|
|
188
249
|
- Only verified facts and real paths. Mark anything unconfirmed as `Unknown`.
|
|
189
250
|
- Update the plan's tracker rows too (status + last commit) — relay and tracker must agree.
|
|
190
|
-
- Don't commit unless asked. Report
|
|
251
|
+
- Don't commit unless asked. Report which `.caddis/relay/<name>.md` was written and the one next action.
|
|
191
252
|
- **Never hand off a Hub session on the strength of "the context doc is designed for this."** That is the
|
|
192
253
|
one instinct that has been measured and found wrong. Run Step 2b's audit instead.
|
|
193
254
|
- **Prune the Done section — two rules, both apply:**
|
|
@@ -198,5 +259,5 @@ not blocking — but do not quote a report the note names without rebuilding it
|
|
|
198
259
|
are more, collapse the oldest into one summary line:
|
|
199
260
|
`- [N prior milestones — see git log for full history]`
|
|
200
261
|
Keep the 8 most recent bullets below it.
|
|
201
|
-
Target: relay
|
|
262
|
+
Target: the relay stays at most 4,000 characters (handover-check enforces it). inject_relay.py caps injection at 120 lines as a
|
|
202
263
|
safety net, but the file itself should never reach that ceiling.
|
|
@@ -7,6 +7,19 @@ description: Headless plan executor — implement an approved plan phase-by-phas
|
|
|
7
7
|
|
|
8
8
|
Implement the plan at **$ARGUMENTS** (falls back to the `DOCKET_PLAN` env var if `$ARGUMENTS` is empty).
|
|
9
9
|
|
|
10
|
+
**Which plan.** An explicit plan always wins: `$ARGUMENTS` first, then the `DOCKET_PLAN` env var
|
|
11
|
+
(it counts as an explicit argument). Only when both are empty, find the active plan:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_todo.py" active-plan
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
- **Exit 0** → stdout is the plan path. Say which plan you picked ("No plan given; using
|
|
18
|
+
`<path>`.") and implement it.
|
|
19
|
+
- **Exit 3** → no single active plan. Do not guess and do not ask. Stop before any change, list the
|
|
20
|
+
candidates it printed on stderr (or "none") in the review file, and end with the
|
|
21
|
+
`"implemented":false` JSON block from step 6.
|
|
22
|
+
|
|
10
23
|
This command is the **docket Implement lane's driver**. It is spawned autonomously by the docket runner —
|
|
11
24
|
**no human is present**. It does not design or re-plan: the plan is the intelligence, you are the executor.
|
|
12
25
|
The runner independently re-runs the tests and a fresh code-review after you finish and decides success
|
|
@@ -35,6 +48,14 @@ depend on them:
|
|
|
35
48
|
AskUserQuestion. Where the plan leaves a genuine gap, make the smallest reasonable assumption, record it
|
|
36
49
|
in the review file, and proceed — asking is always wrong here.
|
|
37
50
|
|
|
51
|
+
## Three rules: one attempt, one review
|
|
52
|
+
1. **Think before you send.** Before a task goes to any coder, write its edge cases and check the facts it depends on (one query or one file read).
|
|
53
|
+
2. **Run it before review.** The coder runs the same checks as CI (name the exact commands in the task). Then run the change once on real data.
|
|
54
|
+
3. **Review once.** Use whatever reviewer is available. Stop at the first CLEAN. After two blocking reviews, ask the owner.
|
|
55
|
+
|
|
56
|
+
This run is headless, so "ask the owner" means: stop the phase, do not commit it, and record the
|
|
57
|
+
two blocking reviews in the review file.
|
|
58
|
+
|
|
38
59
|
## What to do
|
|
39
60
|
|
|
40
61
|
**1. Read the plan.** Load the plan file (`$ARGUMENTS` / `DOCKET_PLAN`). Read its `## Phases`, `## Affected
|
|
@@ -145,8 +166,16 @@ row, visible to any later reader without an Advisory Hub having to catch it live
|
|
|
145
166
|
lane worktrees and branches. It reports unmerged or dirty ones. It pushes the feature branch.
|
|
146
167
|
The plan is not done until it prints `LEFTOVERS: 0`. Then run `/caddis:ship-pr`. Merging and
|
|
147
168
|
post-merge cleanup stay with `/caddis:ship-merge` after the owner's go.
|
|
148
|
-
10. **When Claude is out of budget**, the
|
|
149
|
-
|
|
169
|
+
10. **When a dispatched Claude run is out of budget**, read the output from the subagent or
|
|
170
|
+
`claude -p`. If it holds Claude usage-limit text (for example `You've hit your session limit`
|
|
171
|
+
or `You're out of extra usage`; the full list is `BUDGET_PATTERNS["claude"]` in
|
|
172
|
+
`caddis_lanes.py`), run `python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_lanes.py" next-lane --role <the phase's role> --after <the model that ran>`.
|
|
173
|
+
Re-dispatch the same phase prompt to the printed lane with its direct launch command:
|
|
174
|
+
`codex exec ...` or `agy ... -p "..."`, using the same form that `/feature-plan` writes.
|
|
175
|
+
An out-of-budget switch is not an attempt (item 4). Record the fallback in the Tracker
|
|
176
|
+
`Lane` column, for example `sonnet -> agy (claude out of budget)`.
|
|
177
|
+
If `next-lane` exits 3, stop and report that no lane is left. As a last resort, the owner can
|
|
178
|
+
open `caddis-run codex -m gpt-6-astra` and ask it to follow this same subsection.
|
|
150
179
|
|
|
151
180
|
**Advisory-Hub mode (conditional — OFF by default).** Check whether a companion file
|
|
152
181
|
`<plan-dir>/<plan-stem>-advisory-context.md` exists (e.g. plan `.caddis/plans/foo.md` → look for
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: mermaid-diagrams
|
|
3
3
|
context: fork
|
|
4
|
-
description:
|
|
4
|
+
description: "Software diagrams in Mermaid: class, sequence, flowchart, ERD, C4, state, git graph, gantt. Use for domain models, API flows, processes and database schemas."
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Mermaid Diagramming
|
|
@@ -20,6 +20,14 @@ An unknown flag returns a usage error.
|
|
|
20
20
|
The exit codes follow `caddis_exit.py`: 0 clean, 1 blocked, 2 advisory, 3 could not run,
|
|
21
21
|
4 error or bad usage. In particular, `caddis_adhoc.py` returns 4 for bad usage.
|
|
22
22
|
|
|
23
|
+
## Three rules: one attempt, one review
|
|
24
|
+
1. **Think before you send.** Before a task goes to any coder, write its edge cases and check the facts it depends on (one query or one file read).
|
|
25
|
+
2. **Run it before review.** The coder runs the same checks as CI (name the exact commands in the task). Then run the change once on real data.
|
|
26
|
+
3. **Review once.** Use whatever reviewer is available. Stop at the first CLEAN. After two blocking reviews, ask the owner.
|
|
27
|
+
|
|
28
|
+
`/mmr` is for handing a task to another model, not for normal reviews. For a normal review, use
|
|
29
|
+
`/cross-review`.
|
|
30
|
+
|
|
23
31
|
## Natural Language Triggers
|
|
24
32
|
You can trigger MMR naturally without typing the full slash command:
|
|
25
33
|
- *"Run this on another lane: <task>"* → `/mmr "<task>"`
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: particle-art
|
|
3
3
|
version: 1.0.0
|
|
4
|
-
description:
|
|
4
|
+
description: Zero-dependency animated particle art as a React/Next.js component (spring physics, CSS-variable theming, mouse interaction). Use for animated hero art or a living logo, or on "particles that form a shape", "particle animation", "node network", "animated letter/logo/initials", "living letter", "morphing particles", "constellation", "neural net art", "dot field", "stipple portrait", "halftone animation", "ASCII art animation", "background art for my site", or "art that reacts to mouse".
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Particle Art Generator
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: playwright
|
|
3
3
|
context: fork
|
|
4
|
-
description:
|
|
4
|
+
description: "Browser automation and testing with Playwright: auto-detects dev servers; tests pages, forms, logins, links, screenshots and responsive layouts. Use to test websites or automate any browser task."
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
**IMPORTANT - Path Resolution:**
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: port-to-github
|
|
3
|
-
description:
|
|
3
|
+
description: Port an app or repo to GitHub from any source (git server, local folder, UNC share, Windows box over WinRM) — all branches and tags, SHA-verified, CI translated, history kept source-only, deploy cut over with rollback. Use when the user says "move this app to GitHub", "port X to GitHub", "migrate from Gitea", "put this folder on GitHub", "this app only exists on the server", "import the repo from the prod box", "keep binaries / MariaDB / PHP out of the repo", "check the repo only holds source", or "cut the deploy over to GitHub".
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# port-to-github
|
|
@@ -94,13 +94,38 @@ what failed.
|
|
|
94
94
|
|
|
95
95
|
Watch the PR's checks job-by-job until completion:
|
|
96
96
|
- Gitea lane: poll the run for the PR's head SHA via the API (`deploy-local` skill procedure).
|
|
97
|
-
- GitHub lane:
|
|
97
|
+
- GitHub lane: first record the head you are about to watch, then wait for PR checks outside the Claude session via `ci-watch`:
|
|
98
|
+
```bash
|
|
99
|
+
gh pr view <pr> --json headRefOid # write down headRefOid as <watched-sha>
|
|
100
|
+
python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_lanes.py" ci-watch --pr <pr>
|
|
101
|
+
```
|
|
102
|
+
Exit codes: **0** pass → continue; **1** fail → read `FAILING:` and the gh output, classify the cause, apply the minimum source fix, and re-push (stop before merging); **3** could not tell → stop and report, do not merge.
|
|
103
|
+
Fallback when `caddis_lanes.py` is not available: watch in-session with `gh pr checks <pr> --watch` / `gh run watch` (`gh-cli` skill).
|
|
98
104
|
- If any check fails (red check): report the failure, classify the cause, and **stop before merging**.
|
|
99
105
|
Do not merge a failing PR. Apply the minimum source fix and re-push.
|
|
100
106
|
|
|
107
|
+
## Step 6b — Deploy boundary (before the merge; nothing skips it)
|
|
108
|
+
|
|
109
|
+
The PR exists and is green. Run this before the merge:
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_gate.py" deploy-boundary --repo .
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Exit **0** — go on to Step 7. Exit **1** (a push to the default branch deploys to production), exit
|
|
116
|
+
**3** (it cannot tell), or any other non-zero code — **stop. Do not merge.** Hand the merge to the
|
|
117
|
+
owner with the PR link; skip Steps 7–9. Show the gate's output and end the command. This holds
|
|
118
|
+
whatever confirmation was given: `--yes`, a confirm flag, "just merge it" or an earlier approval
|
|
119
|
+
cannot bypass it.
|
|
120
|
+
|
|
101
121
|
## Step 7 — Merge to default branch
|
|
102
122
|
|
|
103
123
|
Once all required checks are **green**, there are no merge conflicts, and review requirements are satisfied:
|
|
124
|
+
- Re-read PR head and merge state before merging (GitHub lane):
|
|
125
|
+
```bash
|
|
126
|
+
gh pr view <pr> --json headRefOid,mergeStateStatus
|
|
127
|
+
```
|
|
128
|
+
Merge only when `headRefOid` equals `<watched-sha>`, the head recorded before the watch started and `mergeStateStatus` is `CLEAN` (or `HAS_HOOKS`/`UNSTABLE` only if the repo's own rules allow it; else stop and report). The ci-watch report is a signal, not proof.
|
|
104
129
|
- Use the repo's configured **merge strategy** — read it from repo settings (Gitea repo settings API /
|
|
105
130
|
`gh repo view --json squashMergeAllowed,mergeCommitAllowed,rebaseMergeAllowed`) and `AGENTS.md`;
|
|
106
131
|
an explicit argument wins. Options: **squash**, **merge-commit**, rebase-merge. **Don't assume** —
|
|
@@ -114,7 +139,12 @@ Once all required checks are **green**, there are no merge conflicts, and review
|
|
|
114
139
|
|
|
115
140
|
If the default branch triggers an automated deployment pipeline:
|
|
116
141
|
- Gitea: `lint_and_test` → `deploy_prod` → `release_metadata` (`deploy-local` skill).
|
|
117
|
-
- GitHub:
|
|
142
|
+
- GitHub: wait for the deploy run on the default branch outside the Claude session via `ci-watch`:
|
|
143
|
+
```bash
|
|
144
|
+
python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_lanes.py" ci-watch --run <run-id>
|
|
145
|
+
```
|
|
146
|
+
Exit codes: **0** pass → continue; **1** fail → read `FAILING:` and the gh output, classify, apply the minimum source fix; **3** could not tell → stop, report, and **skip cleanup** (Step 9).
|
|
147
|
+
Fallback when `caddis_lanes.py` is not available: watch in-session with `gh run watch <run-id> --exit-status` on the default branch (`gh-cli` skill). If CI-only, note that no deploy occurs.
|
|
118
148
|
- Validate health and deployed SHA if a live service is deployed. If deploy validation fails, report
|
|
119
149
|
immediately and **skip cleanup** (Step 9).
|
|
120
150
|
|
|
@@ -143,6 +173,7 @@ Cleanup: remote branch deleted / local branch deleted / backup ref dropped
|
|
|
143
173
|
## Rules
|
|
144
174
|
|
|
145
175
|
- Never merge a PR whose required checks are red or absent.
|
|
176
|
+
- Never merge unless `deploy-boundary` exited 0 on this run. No confirmation overrides it.
|
|
146
177
|
- Never delete a feature branch before its merge is confirmed and any deploy validated.
|
|
147
178
|
- Never `git add -A` without reviewing `git status` first (stage named files only).
|
|
148
179
|
- Never force-push without a `backup/*-preship` recovery ref; force pushes are `--force-with-lease` only.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: python-development
|
|
3
|
-
description: Modern Python
|
|
3
|
+
description: Modern Python 3.12+ (Django, FastAPI, async) with production best practices. Use for Python projects, APIs, data processing or scripts.
|
|
4
4
|
source: wshobson/agents
|
|
5
5
|
license: MIT
|
|
6
6
|
---
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: rca
|
|
3
|
+
description: Record a root cause in one step — .caddis/rca/<date>-<slug>.md — or close one with the fixing commit
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# /caddis:rca — record a root cause, or close one
|
|
7
|
+
|
|
8
|
+
A root cause found mid-task gets forgotten by the next session that hits the same symptom. This
|
|
9
|
+
command writes one down in a single step, and closes it later with the commit that fixed it.
|
|
10
|
+
|
|
11
|
+
The request is **$ARGUMENTS**.
|
|
12
|
+
|
|
13
|
+
## Mode select
|
|
14
|
+
|
|
15
|
+
| `$ARGUMENTS` | Do this |
|
|
16
|
+
|---|---|
|
|
17
|
+
| starts with `done ` | Go to **Close mode** |
|
|
18
|
+
| anything else | Go to **File mode** — the text is the symptom |
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## File mode
|
|
23
|
+
|
|
24
|
+
### Step 1 — build the slug
|
|
25
|
+
Lower-case the symptom text, replace each run of characters outside `a-z0-9` with one `-`, trim
|
|
26
|
+
`-` from both ends, cap at 60 characters (`Login fails: 401!` → `login-fails-401`). If nothing is left after cleaning, **stop and ask the user for a shorter title** — the
|
|
27
|
+
one question this command may ask.
|
|
28
|
+
|
|
29
|
+
### Step 2 — pick the path
|
|
30
|
+
`.caddis/rca/<YYYY-MM-DD>-<slug>.md`, using today's date (UTC). Create `.caddis/rca/` first if it
|
|
31
|
+
does not exist.
|
|
32
|
+
|
|
33
|
+
**If that exact path already exists, refuse — never overwrite it.** Print the existing path and
|
|
34
|
+
stop; the user can open it directly, or pick different (more specific) symptom text so the slug
|
|
35
|
+
comes out differently.
|
|
36
|
+
|
|
37
|
+
### Step 3 — write the file
|
|
38
|
+
|
|
39
|
+
```markdown
|
|
40
|
+
---
|
|
41
|
+
type: rca
|
|
42
|
+
status: open
|
|
43
|
+
found: <YYYY-MM-DD>
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
# <symptom, verbatim>
|
|
47
|
+
|
|
48
|
+
## Symptom
|
|
49
|
+
<what was observed — the exact error, command, or behaviour>
|
|
50
|
+
|
|
51
|
+
## Root cause
|
|
52
|
+
<why it happened, not just what happened>
|
|
53
|
+
|
|
54
|
+
## Fix
|
|
55
|
+
<what changed to remove the cause>
|
|
56
|
+
|
|
57
|
+
## How verified
|
|
58
|
+
<the command or check that proves the fix, and its result>
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Leave a section as its one-line prompt if the answer is not known yet — `/rca done` below is where
|
|
62
|
+
it gets filled in for real.
|
|
63
|
+
|
|
64
|
+
### Step 4 — verify
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_gate.py" docs-check --root .
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Exit 0 means the header is valid. Do not report the item as filed until this passes.
|
|
71
|
+
|
|
72
|
+
### Step 5 — report
|
|
73
|
+
One line: the path. Nothing else.
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Close mode — `done <file>`
|
|
78
|
+
|
|
79
|
+
`<file>` is a path under `.caddis/rca/`, optionally followed by a commit SHA.
|
|
80
|
+
|
|
81
|
+
1. If the file does not exist, say so and change nothing.
|
|
82
|
+
2. If its header does not carry `type: rca`, say so and change nothing.
|
|
83
|
+
3. If its `status:` is already `done`, say so and change nothing — closing an already-closed RCA is
|
|
84
|
+
a no-op, not a re-close.
|
|
85
|
+
4. Otherwise set `status: done` and add `commit: <short SHA>` to the header. The SHA is whatever the
|
|
86
|
+
user gave after the filename in `$ARGUMENTS`; if none was given, use `git rev-parse --short HEAD`.
|
|
87
|
+
It must match `^[0-9a-f]{7,40}$`; if it does not, say so and change nothing.
|
|
88
|
+
5. Fill in **Root cause**, **Fix**, and **How verified** only with facts from this session or the
|
|
89
|
+
fixing commit. A section you do not know stays as its Step 3 prompt; never guess.
|
|
90
|
+
6. Run the Step 4 docs-check. If it does not exit 0, restore the file and report the error.
|
|
91
|
+
7. Report the path and the recorded commit. Nothing else.
|
|
92
|
+
|
|
93
|
+
## Rules
|
|
94
|
+
- **Never** overwrite an existing RCA file. A repeat symptom is either the same file (edit it by
|
|
95
|
+
hand) or genuinely different (use different symptom text so the slug comes out different).
|
|
96
|
+
- This command records facts about what already happened; it does not investigate or fix anything
|
|
97
|
+
itself.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: react-dev
|
|
3
3
|
version: 1.0.0
|
|
4
|
-
description:
|
|
4
|
+
description: "Type-safe React 18-19 with TypeScript: components, generic components, hooks, events, Server Components, TanStack Router and React Router. Use when React TypeScript or React 19 is involved."
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# React TypeScript
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: safe-cleanup
|
|
3
|
-
description: Use BEFORE deleting
|
|
3
|
+
description: Use BEFORE deleting a directory tree, scratchpad or git worktree, or "tidying up" generated folders, especially on Windows, where deleting through a junction or symlink destroys its target; and to verify a venv or node_modules survived.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Safe Cleanup
|
|
@@ -9,10 +9,11 @@ Ship the current working changes via this repo's actual delivery pipeline. The p
|
|
|
9
9
|
repo, so **detect it first**, then follow the matching lane. Preflight, staging, and commit are
|
|
10
10
|
identical across lanes; only monitoring and validation differ.
|
|
11
11
|
|
|
12
|
-
> **This is the express lane** —
|
|
13
|
-
>
|
|
14
|
-
> reviewed lane instead: `/ship-pr`** (open a
|
|
15
|
-
> (merge the green PR behind a deploy-confirm,
|
|
12
|
+
> **This is the express lane** — it pushes straight to the default branch with no review pause.
|
|
13
|
+
> Right for a hotfix. On a repo where that push deploys to production, Step 2c stops it before the
|
|
14
|
+
> push and the owner merges. **For feature work, use the reviewed lane instead: `/ship-pr`** (open a
|
|
15
|
+
> PR, monitor CI, stop at green) **→ `/ship-merge`** (merge the green PR behind a deploy-confirm,
|
|
16
|
+
> validate, clean up).
|
|
16
17
|
|
|
17
18
|
Optional message: **$ARGUMENTS** (if empty, derive a conventional commit message from staged changes)
|
|
18
19
|
|
|
@@ -63,6 +64,19 @@ over 400 changed lines. No judgement in any of those — deliberately, because j
|
|
|
63
64
|
what failed.
|
|
64
65
|
<!-- /shared:cross-review-trigger -->
|
|
65
66
|
|
|
67
|
+
**2c. DEPLOY BOUNDARY** — before the push; nothing skips it:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_gate.py" deploy-boundary --repo .
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Exit **0** (no deploy signal found) — push. Exit **1** (a push to the default branch deploys to
|
|
74
|
+
production), exit **3** (it cannot tell), or any other non-zero code — **stop. Do not merge or push to
|
|
75
|
+
the default branch.** The commit stays local. If it sits on the default branch, move it to a feature
|
|
76
|
+
branch first (`git switch -c <feature-branch>`). Then open a PR with `/ship-pr` and hand the merge
|
|
77
|
+
to the owner with the PR link. Show the gate's output and end the command. This holds whatever confirmation was given:
|
|
78
|
+
`--yes`, a confirm flag, "just merge it" or an earlier approval cannot bypass it.
|
|
79
|
+
|
|
66
80
|
**3. PUSH** — to the repo's default branch (confirm the branch first; don't assume `main`):
|
|
67
81
|
```
|
|
68
82
|
git push origin <branch>
|
|
@@ -81,12 +95,17 @@ Track jobs in order: `lint_and_test` → `frontend_checks` (if present) → `dep
|
|
|
81
95
|
`release_metadata` → `notify`. Report status as each job completes. On failure, classify it and apply
|
|
82
96
|
the minimum fix (see `deploy-local` skill §6).
|
|
83
97
|
|
|
84
|
-
**GitHub lane** —
|
|
85
|
-
```
|
|
98
|
+
**GitHub lane** — Find the run id for the pushed SHA, then wait outside the Claude session via `ci-watch`:
|
|
99
|
+
```bash
|
|
86
100
|
gh run list --branch <branch> --limit 1 # find the run id for the pushed SHA
|
|
87
|
-
|
|
101
|
+
python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_lanes.py" ci-watch --run <run-id>
|
|
102
|
+
```
|
|
103
|
+
Exit codes: **0** pass → continue; **1** fail → read `FAILING:` and the gh output, classify, apply the minimum source fix; **3** could not tell → stop and report.
|
|
104
|
+
On failure, pull only the failing job logs:
|
|
105
|
+
```bash
|
|
88
106
|
gh run view <run-id> --log-failed # on failure, pull only the failing job logs
|
|
89
107
|
```
|
|
108
|
+
Fallback when `caddis_lanes.py` is not available: watch in-session with `gh run watch <run-id> --exit-status` (`gh-cli` skill).
|
|
90
109
|
Report each job's status as it resolves. On failure, classify it and apply the minimum source fix.
|
|
91
110
|
|
|
92
111
|
**Local-only lane** — no CI; skip monitoring.
|
|
@@ -113,6 +132,7 @@ Release tag: <tag> → <sha> | n/a
|
|
|
113
132
|
|
|
114
133
|
## Rules
|
|
115
134
|
- Never push before preflight gates are green.
|
|
135
|
+
- Never push to the default branch unless `deploy-boundary` exited 0 on this run.
|
|
116
136
|
- Never use `git add -A` without reviewing `git status` first.
|
|
117
137
|
- Do not edit a workflow file (`.gitea/workflows/` or `.github/workflows/`) to make a failing gate
|
|
118
138
|
pass — fix the source.
|
|
@@ -28,6 +28,20 @@ Resolve the target PR from `$ARGUMENTS`, else the current branch's open PR. No o
|
|
|
28
28
|
that and point at `/ship-pr`. Read `AGENTS.md` + the workflow file(s) for the repo's real deploy
|
|
29
29
|
job names and default branch — never assume.
|
|
30
30
|
|
|
31
|
+
## Step 0b — Deploy boundary (before the confirm; nothing skips it)
|
|
32
|
+
|
|
33
|
+
Run it before asking for any confirmation, in a checkout of the PR's own repository. If the
|
|
34
|
+
PR belongs to another repository, treat that as exit **3**.
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_gate.py" deploy-boundary --repo .
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Exit **0** — go on to Step 1. Exit **1** (a push to the default branch deploys to production), exit
|
|
41
|
+
**3** (it cannot tell), or any other non-zero code — **stop. Do not merge.** Hand the merge to the
|
|
42
|
+
owner with the PR link. Show the gate's output and end the command. This holds whatever confirmation
|
|
43
|
+
was given: `--yes`, a confirm flag, "just merge it" or an earlier approval cannot bypass it.
|
|
44
|
+
|
|
31
45
|
## Step 1 — Refuse unless green + mergeable + reviewed
|
|
32
46
|
|
|
33
47
|
All of, per the repo's own rules:
|
|
@@ -50,10 +64,24 @@ future run — ask every time, even for the same PR five minutes later.
|
|
|
50
64
|
|
|
51
65
|
## Step 3 — Merge
|
|
52
66
|
|
|
67
|
+
Re-read PR head and merge state before merging (GitHub lane):
|
|
68
|
+
```bash
|
|
69
|
+
gh pr view <pr> --json headRefOid,mergeStateStatus
|
|
70
|
+
```
|
|
71
|
+
Merge only when `headRefOid` equals `<head-sha>` (the head that Step 1 found green and Step 2's
|
|
72
|
+
confirmation named) and `mergeStateStatus` is `CLEAN` (or `HAS_HOOKS`/`UNSTABLE` only if the repo's
|
|
73
|
+
own rules allow it). Otherwise stop and report: a new push needs a fresh Step 1 and a fresh confirm.
|
|
74
|
+
A check report is a signal, not proof.
|
|
75
|
+
|
|
53
76
|
Use the repo's configured **merge strategy** — read it from repo settings (Gitea repo settings API /
|
|
54
77
|
`gh repo view --json squashMergeAllowed,mergeCommitAllowed,rebaseMergeAllowed`) and `AGENTS.md`;
|
|
55
|
-
an explicit argument wins. Options: **squash**, **merge-commit**, rebase-merge
|
|
78
|
+
an explicit argument wins. Options: **squash**, **merge-commit**, **rebase-merge**. **Don't assume** —
|
|
56
79
|
if detection is inconclusive, say so and use merge-commit (never silently squash someone's history).
|
|
80
|
+
|
|
81
|
+
Then merge:
|
|
82
|
+
- GitHub: `gh pr merge <pr>` with `--squash` (squash), `--merge` (merge-commit) or `--rebase` (rebase-merge).
|
|
83
|
+
- Gitea: call the Gitea PR merge API with the chosen strategy.
|
|
84
|
+
|
|
57
85
|
Record the merge SHA.
|
|
58
86
|
|
|
59
87
|
## Step 4 — Monitor the deploy
|
|
@@ -61,8 +89,12 @@ Record the merge SHA.
|
|
|
61
89
|
The merge lands on the default branch and triggers the pipeline. Watch it via the lane's skill:
|
|
62
90
|
- Gitea: `lint_and_test` → `frontend_checks` (if present) → **`deploy_prod`** → `release_metadata`
|
|
63
91
|
→ `notify` (`deploy-local` skill §monitoring; classify + minimum-fix on failure).
|
|
64
|
-
- GitHub:
|
|
65
|
-
|
|
92
|
+
- GitHub: wait for the deploy run on the default branch outside the Claude session via `ci-watch`:
|
|
93
|
+
```bash
|
|
94
|
+
python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_lanes.py" ci-watch --run <run-id>
|
|
95
|
+
```
|
|
96
|
+
Exit codes: **0** pass → continue; **1** fail → read `FAILING:` and the gh output, classify, apply the minimum source fix; **3** could not tell → stop, report, and **skip cleanup** (Step 6).
|
|
97
|
+
Fallback when `caddis_lanes.py` is not available: watch in-session with `gh run watch <run-id> --exit-status` on the default branch (`gh-cli` skill). If the workflow has a deploy job, watch it through; if CI-only, note that no deploy occurs.
|
|
66
98
|
|
|
67
99
|
## Step 5 — Post-deploy validation
|
|
68
100
|
|
|
@@ -94,6 +126,7 @@ Cleanup: remote branch ✗ deleted / local ✗ deleted / backup ref droppe
|
|
|
94
126
|
|
|
95
127
|
## Rules
|
|
96
128
|
- Never merge without: green required checks **and** the explicit human deploy-confirm.
|
|
129
|
+
- Never merge unless `deploy-boundary` exited 0 on this run. No confirmation overrides it.
|
|
97
130
|
- Never delete a branch before its deploy is validated green.
|
|
98
131
|
- Never `git add -A` without reviewing `git status`; never edit a workflow file to make a gate pass.
|
|
99
132
|
- Local-only lane: no PR, no merge — refuse and point at `/ship`.
|
|
@@ -103,7 +103,12 @@ what failed.
|
|
|
103
103
|
Watch the PR's checks job-by-job (never the deploy — PRs don't deploy here), including the
|
|
104
104
|
scope-guard check when present:
|
|
105
105
|
- Gitea lane: poll the run for the PR's head SHA via the API (`deploy-local` skill procedure).
|
|
106
|
-
- GitHub lane:
|
|
106
|
+
- GitHub lane: wait for PR checks outside the Claude session via `ci-watch`:
|
|
107
|
+
```bash
|
|
108
|
+
python "${CLAUDE_PLUGIN_ROOT}/scripts/caddis_lanes.py" ci-watch --pr <pr>
|
|
109
|
+
```
|
|
110
|
+
Exit codes: **0** pass → continue; **1** fail → read `FAILING:` and the gh output, classify, apply the minimum source fix, then re-push (through Step 4's safety if history must change); **3** could not tell → stop and report, do not merge.
|
|
111
|
+
Fallback when `caddis_lanes.py` is not available: watch in-session with `gh pr checks <pr> --watch` / `gh run watch` (`gh-cli` skill).
|
|
107
112
|
On a red check, classify the failure and apply the minimum **source** fix, then re-push (through
|
|
108
113
|
Step 4's safety if history must change).
|
|
109
114
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: skill-creator
|
|
3
3
|
context: fork
|
|
4
|
-
description: Create
|
|
4
|
+
description: Create, edit and improve skills, run evals and benchmarks, and optimize a skill's description for triggering accuracy.
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Skill Creator
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: sql
|
|
3
|
-
description: Write
|
|
3
|
+
description: "Write optimized, secure, readable SQL: performance, NULL handling, dialect-specific notes."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# SQL Expert Skill
|