@caddis/cli 0.4.70 → 0.4.72
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/plugin.json +1 -1
- package/bundles/antigravity-plugin/scripts/caddis_coordinate.py +1589 -0
- package/bundles/antigravity-plugin/scripts/caddis_upstream_check.py +107 -0
- package/bundles/antigravity-plugin/scripts/schemas/coordinator.schema.json +95 -0
- package/bundles/antigravity-plugin/scripts/schemas/request.schema.json +39 -0
- package/bundles/antigravity-plugin/scripts/templates/coordinator.md +91 -0
- package/bundles/antigravity-plugin/skills/_registry.md +2 -1
- package/bundles/antigravity-plugin/skills/brainstorming/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/coordinate/SKILL.md +339 -0
- package/bundles/antigravity-plugin/skills/feature-plan/SKILL.md +64 -1
- package/bundles/antigravity-plugin/skills/implement/SKILL.md +14 -0
- package/bundles/antigravity-plugin/skills/usage-review/SKILL.md +9 -0
- package/bundles/antigravity-plugin/skills/writing-plans/SKILL.md +15 -375
- package/bundles/codex/.codex/skills/docs/writing-plans/SKILL.md +15 -375
- package/bundles/codex/.codex/skills/workflow/brainstorming/SKILL.md +1 -1
- package/bundles/manifest.json +2 -2
- package/package.json +1 -1
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""caddis_upstream_check - say when an upstream skill that caddis borrowed ideas from has changed.
|
|
3
|
+
|
|
4
|
+
Why: /caddis:feature-plan and /caddis:implement adapt ideas from obra/superpowers (writing-plans 7.0.0,
|
|
5
|
+
subagent-driven-development 7.0.0, MIT). `.github/upstream-sources.json` records, per borrowed file, the
|
|
6
|
+
upstream version and the sha256 of the file we read. This script compares that record with the copies
|
|
7
|
+
installed in the Claude Code plugin cache (`~/.claude/plugins/cache/<marketplace>/<plugin>/<version>/<path>`),
|
|
8
|
+
so caddis does not fall behind upstream without anyone seeing it. /caddis:usage-review runs it.
|
|
9
|
+
|
|
10
|
+
One line per source:
|
|
11
|
+
UP-TO-DATE <id> <version>
|
|
12
|
+
DRIFT <id> recorded <v> installed <v'> (sha differs): review the upstream diff and port what fits, ...
|
|
13
|
+
NOT-INSTALLED <id>
|
|
14
|
+
`NO-SOURCES <path>` means there is no record (any repo other than the caddis source repo).
|
|
15
|
+
|
|
16
|
+
Advisory only: the exit code is always 0. Stdlib only.
|
|
17
|
+
|
|
18
|
+
Usage:
|
|
19
|
+
python caddis_upstream_check.py [--sources <json>] [--cache-root <dir>] [--json]
|
|
20
|
+
"""
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
import argparse
|
|
24
|
+
import hashlib
|
|
25
|
+
import json
|
|
26
|
+
import sys
|
|
27
|
+
from pathlib import Path
|
|
28
|
+
|
|
29
|
+
SOURCES_REL = Path(".github") / "upstream-sources.json"
|
|
30
|
+
DRIFT_ADVICE = "review the upstream diff and port what fits, then update .github/upstream-sources.json"
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def default_sources() -> Path:
|
|
34
|
+
"""The record in the current repo; else the one next to this script in a source checkout."""
|
|
35
|
+
here = Path.cwd() / SOURCES_REL
|
|
36
|
+
if here.is_file():
|
|
37
|
+
return here
|
|
38
|
+
return Path(__file__).resolve().parents[1] / SOURCES_REL
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def default_cache_root() -> Path:
|
|
42
|
+
return Path.home() / ".claude" / "plugins" / "cache"
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def _version_key(version: str) -> tuple:
|
|
46
|
+
"""Numeric parts compare as numbers (7.10.0 > 7.9.0); a non-numeric part sorts before any number."""
|
|
47
|
+
return tuple((1, int(p)) if p.isdigit() else (0, p) for p in version.split("."))
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def _sha256(path: Path) -> str:
|
|
51
|
+
return hashlib.sha256(path.read_bytes()).hexdigest()
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def installed_copies(cache_root: Path, plugin: str, rel_path: str) -> list[tuple[str, Path]]:
|
|
55
|
+
"""(version, file) for every installed copy, newest version last."""
|
|
56
|
+
if not cache_root.is_dir():
|
|
57
|
+
return []
|
|
58
|
+
found = [(f.parents[len(Path(rel_path).parts) - 1].name, f)
|
|
59
|
+
for f in cache_root.glob(f"*/{plugin}/*/{rel_path}") if f.is_file()]
|
|
60
|
+
return sorted(found, key=lambda vf: _version_key(vf[0]))
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def check_source(src: dict, cache_root: Path) -> dict:
|
|
64
|
+
sid, recorded = src["id"], src["version"]
|
|
65
|
+
plugin = sid.split(":", 1)[0]
|
|
66
|
+
copies = installed_copies(cache_root, plugin, src["path"])
|
|
67
|
+
row = {"id": sid, "status": "NOT-INSTALLED", "recorded_version": recorded, "installed_version": None,
|
|
68
|
+
"line": f"NOT-INSTALLED {sid}"}
|
|
69
|
+
if not copies:
|
|
70
|
+
return row
|
|
71
|
+
version, newest = copies[-1]
|
|
72
|
+
row["installed_version"] = version
|
|
73
|
+
if _sha256(newest) == src["sha256"]:
|
|
74
|
+
row.update(status="UP-TO-DATE", line=f"UP-TO-DATE {sid} {recorded}")
|
|
75
|
+
else:
|
|
76
|
+
row.update(status="DRIFT",
|
|
77
|
+
line=f"DRIFT {sid} recorded {recorded} installed {version} (sha differs): {DRIFT_ADVICE}")
|
|
78
|
+
return row
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def main(argv: list[str] | None = None) -> int:
|
|
82
|
+
ap = argparse.ArgumentParser(description="Compare borrowed upstream skills with the installed copies.")
|
|
83
|
+
ap.add_argument("--sources", type=Path, default=None, help="path to upstream-sources.json")
|
|
84
|
+
ap.add_argument("--cache-root", type=Path, default=None, help="the Claude Code plugin cache folder")
|
|
85
|
+
ap.add_argument("--json", action="store_true", help="print the rows as a JSON list")
|
|
86
|
+
args = ap.parse_args(argv)
|
|
87
|
+
sources = args.sources or default_sources()
|
|
88
|
+
cache_root = args.cache_root or default_cache_root()
|
|
89
|
+
if not sources.is_file():
|
|
90
|
+
print(f"NO-SOURCES {sources}")
|
|
91
|
+
return 0
|
|
92
|
+
try:
|
|
93
|
+
data = json.loads(sources.read_text(encoding="utf-8"))
|
|
94
|
+
rows = [check_source(src, cache_root) for src in data.get("sources", [])]
|
|
95
|
+
except (OSError, ValueError, KeyError, TypeError) as exc:
|
|
96
|
+
print(f"NO-SOURCES {sources} (unreadable: {exc})")
|
|
97
|
+
return 0
|
|
98
|
+
if args.json:
|
|
99
|
+
print(json.dumps(rows, indent=2))
|
|
100
|
+
else:
|
|
101
|
+
for row in rows:
|
|
102
|
+
print(row["line"])
|
|
103
|
+
return 0
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
if __name__ == "__main__":
|
|
107
|
+
sys.exit(main())
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"title": "caddis hub coordinator state (coordinator.json)",
|
|
4
|
+
"description": "One file per repo id, written only by caddis_coordinate.py. Readers accept schema N and N-1.",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["schema", "repo", "coordinator_session", "heartbeat_at", "queue", "merging_now", "deploy_checks",
|
|
7
|
+
"ledger", "processed_requests"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"schema": {"type": "integer", "enum": [0, 1]},
|
|
10
|
+
"repo": {"type": "string", "minLength": 1},
|
|
11
|
+
"coordinator_session": {
|
|
12
|
+
"type": "object",
|
|
13
|
+
"required": ["name", "sessionId", "pid"],
|
|
14
|
+
"properties": {
|
|
15
|
+
"name": {"type": ["string", "null"]},
|
|
16
|
+
"sessionId": {"type": ["string", "null"]},
|
|
17
|
+
"pid": {"type": ["integer", "null"]}
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"heartbeat_at": {"$ref": "#/$defs/utc"},
|
|
21
|
+
"queue": {
|
|
22
|
+
"type": "array",
|
|
23
|
+
"items": {
|
|
24
|
+
"type": "object",
|
|
25
|
+
"required": ["pr", "head_sha", "title", "state", "why_waiting", "waits_on", "hotfix", "held",
|
|
26
|
+
"entered_ready_at"],
|
|
27
|
+
"properties": {
|
|
28
|
+
"pr": {"type": "integer", "minimum": 1},
|
|
29
|
+
"head_sha": {"type": "string"},
|
|
30
|
+
"title": {"type": "string"},
|
|
31
|
+
"state": {"enum": ["waiting", "ci", "ready", "merging", "blocked", "held"]},
|
|
32
|
+
"why_waiting": {"type": "string"},
|
|
33
|
+
"waits_on": {
|
|
34
|
+
"type": "array",
|
|
35
|
+
"items": {
|
|
36
|
+
"type": "object",
|
|
37
|
+
"required": ["repo", "pr"],
|
|
38
|
+
"properties": {"repo": {"type": "string"}, "pr": {"type": "integer"}}
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
"hotfix": {"type": "boolean"},
|
|
42
|
+
"held": {"type": "boolean"},
|
|
43
|
+
"entered_ready_at": {"anyOf": [{"$ref": "#/$defs/utc"}, {"type": "null"}]}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
"merging_now": {"type": ["integer", "object", "null"]},
|
|
48
|
+
"deploy_checks": {
|
|
49
|
+
"type": "array",
|
|
50
|
+
"items": {
|
|
51
|
+
"type": "object",
|
|
52
|
+
"required": ["pr", "merge_sha", "deploy_run", "health", "at"],
|
|
53
|
+
"properties": {
|
|
54
|
+
"pr": {"type": "integer"},
|
|
55
|
+
"merge_sha": {"type": "string", "pattern": "^[0-9a-f]{40}$", "description": "lower-cased"},
|
|
56
|
+
"deploy_run": {"type": ["integer", "null"]},
|
|
57
|
+
"health": {"enum": ["pending", "ok", "failed"]},
|
|
58
|
+
"at": {"$ref": "#/$defs/utc"}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
"ledger": {
|
|
63
|
+
"type": "array",
|
|
64
|
+
"items": {
|
|
65
|
+
"type": "object",
|
|
66
|
+
"required": ["what", "decision", "approved_by", "reason", "window", "request_id", "at"],
|
|
67
|
+
"properties": {
|
|
68
|
+
"what": {"type": "string", "minLength": 1},
|
|
69
|
+
"decision": {"enum": ["approve", "decline"]},
|
|
70
|
+
"approved_by": {"enum": ["owner", "coordinator"]},
|
|
71
|
+
"reason": {"type": "string", "minLength": 1},
|
|
72
|
+
"window": {"type": ["string", "null"], "description": "the session window the decision was made in; \"hub\" for an owner click"},
|
|
73
|
+
"request_id": {"type": ["string", "null"], "description": "the owner request id; null when not from a request"},
|
|
74
|
+
"at": {"$ref": "#/$defs/utc"}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
"processed_requests": {
|
|
79
|
+
"type": "array",
|
|
80
|
+
"items": {
|
|
81
|
+
"type": "object",
|
|
82
|
+
"required": ["id", "result", "reason", "at"],
|
|
83
|
+
"properties": {
|
|
84
|
+
"id": {"type": "string"},
|
|
85
|
+
"result": {"enum": ["done", "rejected", "expired"]},
|
|
86
|
+
"reason": {"type": "string"},
|
|
87
|
+
"at": {"$ref": "#/$defs/utc"}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
"$defs": {
|
|
93
|
+
"utc": {"type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$"}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"title": "caddis hub owner request (one line of requests.jsonl)",
|
|
4
|
+
"description": "Appended by the hub, applied by caddis_coordinate.py intake. Readers accept v N and N-1. pr may be null only for approve/decline, and then args.what is required (ruling R2).",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["v", "id", "created_at", "expires_at", "repo", "pr", "head_sha", "action", "args"],
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"properties": {
|
|
9
|
+
"v": {"type": "integer", "enum": [0, 1]},
|
|
10
|
+
"id": {"type": "string", "minLength": 1},
|
|
11
|
+
"created_at": {"$ref": "#/$defs/utc"},
|
|
12
|
+
"expires_at": {"$ref": "#/$defs/utc"},
|
|
13
|
+
"repo": {"type": "string", "minLength": 1},
|
|
14
|
+
"pr": {"type": ["integer", "null"], "minimum": 1},
|
|
15
|
+
"head_sha": {"type": ["string", "null"], "description": "40 hex characters when pr is set; compared case-insensitively"},
|
|
16
|
+
"action": {"enum": ["hotfix", "unhotfix", "hold", "release", "approve", "decline"]},
|
|
17
|
+
"args": {
|
|
18
|
+
"type": "object",
|
|
19
|
+
"properties": {"what": {"type": "string", "minLength": 1}}
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"allOf": [
|
|
23
|
+
{
|
|
24
|
+
"if": {"properties": {"pr": {"type": "null"}}, "required": ["pr"]},
|
|
25
|
+
"then": {
|
|
26
|
+
"properties": {
|
|
27
|
+
"action": {"enum": ["approve", "decline"]},
|
|
28
|
+
"args": {"required": ["what"]}
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"else": {
|
|
32
|
+
"properties": {"head_sha": {"type": "string", "pattern": "^[0-9a-fA-F]{40}$"}}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
],
|
|
36
|
+
"$defs": {
|
|
37
|
+
"utc": {"type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$"}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Coordinator config
|
|
2
|
+
|
|
3
|
+
This file is the per-repo config for `/caddis:coordinate`. The coordinator session reads the ONE fenced
|
|
4
|
+
`json` block below. The prose around it is for people.
|
|
5
|
+
|
|
6
|
+
How to fill it:
|
|
7
|
+
|
|
8
|
+
- Replace every `"<fill: ...>"` string with the real value. The coordinator refuses to start while any
|
|
9
|
+
`<fill:` string is left (`caddis_coordinate.py config show` lists them).
|
|
10
|
+
- Keep every key. A missing key also stops the coordinator.
|
|
11
|
+
- Put no host names and no secrets here. The production base URL comes from the environment variable that
|
|
12
|
+
`deploy.base_url_env` names.
|
|
13
|
+
|
|
14
|
+
What the keys mean:
|
|
15
|
+
|
|
16
|
+
| Key | Meaning |
|
|
17
|
+
|---|---|
|
|
18
|
+
| `schema` | The config format version. Keep `1`. |
|
|
19
|
+
| `default_branch` | The branch that PRs merge into. |
|
|
20
|
+
| `merge_method` | `squash`, `merge` or `rebase`. Match the repo's branch protection (linear history needs `squash` or `rebase`). |
|
|
21
|
+
| `required_checks` | The required status checks, as branch protection names them. A fallback only: the coordinator reads branch protection first and tells the owner on a mismatch. |
|
|
22
|
+
| `not_required` | Checks that may fail or skip on a PR without blocking the merge. |
|
|
23
|
+
| `docs_only.signal` | The CI job that decides if a change is docs-only (the other required checks then conclude `skipped`). |
|
|
24
|
+
| `docs_only.deploy_check` | The deploy checks for a docs-only merge. A docs-only push deploys nothing. |
|
|
25
|
+
| `main_workflow` | The name of the CI workflow that runs on the default branch. No merge while it runs. |
|
|
26
|
+
| `reviews.count` | How many reviews a PR needs before it is ready. |
|
|
27
|
+
| `reviews.stop_on` | Which review findings stop a merge. `blocking`: only blocking findings. |
|
|
28
|
+
| `peer_ack.warning_min` | Minutes between the merge warning and the merge. |
|
|
29
|
+
| `peer_ack.ack_file` | Where each peer writes its ack: `{head, acked[], at}`. An ack older than 30 minutes does not count. |
|
|
30
|
+
| `deploy.event` | The event that starts the deploy run (for example `push`). |
|
|
31
|
+
| `deploy.jobs` | The number of jobs in the deploy run. |
|
|
32
|
+
| `deploy.tag` | The release tag scheme. With `calver`, the tag must point at the merge SHA. |
|
|
33
|
+
| `deploy.base_url_env` | The environment variable that holds the production base URL on this machine. |
|
|
34
|
+
| `deploy.auth` | How the checks authenticate to production. |
|
|
35
|
+
| `deploy.version_path` | The JSON endpoint whose `sha` field must equal the merge SHA after the deploy. |
|
|
36
|
+
| `deploy.health_path` | The endpoint that must answer 200 after the deploy. |
|
|
37
|
+
| `deploy.never_health_path` | A path that looks healthy even when the API is dead. Never used as a health check. |
|
|
38
|
+
| `deploy.render_check` | How the PR's session checks a served page: 0 console errors and one value checked against its source. |
|
|
39
|
+
| `deploy.wait` | How to wait for the deploy run. No fixed sleep. |
|
|
40
|
+
| `owner_reserved` | Changes that only the owner may approve. |
|
|
41
|
+
| `stall.busy_silent_min` | Minutes a busy session may stay silent before the coordinator asks. |
|
|
42
|
+
| `stall.ready_no_ready_msg_min` | Minutes a green PR may wait for its session's ready message. |
|
|
43
|
+
| `quiet.coordination` | Quiet hours for merges (`none`: no quiet hours). |
|
|
44
|
+
| `quiet.timing_checks` | When timing checks may run. |
|
|
45
|
+
|
|
46
|
+
```json
|
|
47
|
+
{
|
|
48
|
+
"schema": 1,
|
|
49
|
+
"default_branch": "<fill: the branch that PRs merge into, for example main>",
|
|
50
|
+
"merge_method": "squash",
|
|
51
|
+
"required_checks": [
|
|
52
|
+
"<fill: one required status check as branch protection names it, for example ci / lint_and_test; one string per check>"
|
|
53
|
+
],
|
|
54
|
+
"not_required": [
|
|
55
|
+
"<fill: one check that may fail or skip on a PR, for example notify; one string per check, or an empty list>"
|
|
56
|
+
],
|
|
57
|
+
"docs_only": {
|
|
58
|
+
"signal": "<fill: name of the CI job that decides if a change is docs-only>",
|
|
59
|
+
"deploy_check": ["push_run", "health"]
|
|
60
|
+
},
|
|
61
|
+
"main_workflow": "<fill: name of the CI workflow that runs on the default branch>",
|
|
62
|
+
"reviews": {"count": 2, "stop_on": "blocking"},
|
|
63
|
+
"peer_ack": {
|
|
64
|
+
"warning_min": 2,
|
|
65
|
+
"ack_file": "~/.claude/merge-acks/<repo>/pr-<n>.json"
|
|
66
|
+
},
|
|
67
|
+
"deploy": {
|
|
68
|
+
"event": "push",
|
|
69
|
+
"jobs": "<fill: number of jobs in the deploy run>",
|
|
70
|
+
"tag": "<fill: release tag scheme, for example calver, or none>",
|
|
71
|
+
"base_url_env": "<fill: name of the environment variable that holds the production base URL>",
|
|
72
|
+
"auth": "<fill: how the checks authenticate to production, for example none>",
|
|
73
|
+
"version_path": "<fill: path of the JSON endpoint whose sha field is the deployed commit>",
|
|
74
|
+
"health_path": "<fill: path of the endpoint that must answer 200 after the deploy>",
|
|
75
|
+
"never_health_path": "<fill: path that looks healthy even when the API is dead, or null>",
|
|
76
|
+
"render_check": "<fill: how the PR's session checks a served page, for example a headless browser>",
|
|
77
|
+
"wait": "gh run watch"
|
|
78
|
+
},
|
|
79
|
+
"owner_reserved": [
|
|
80
|
+
"schema change or data write on prod",
|
|
81
|
+
"permission change",
|
|
82
|
+
"any open blocking review finding",
|
|
83
|
+
"<fill: a rule the owner reserved by name; one string per rule, or delete this line>"
|
|
84
|
+
],
|
|
85
|
+
"stall": {"busy_silent_min": 45, "ready_no_ready_msg_min": 20},
|
|
86
|
+
"quiet": {
|
|
87
|
+
"coordination": "none",
|
|
88
|
+
"timing_checks": "<fill: when timing checks may run, for example quiet window only>"
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
```
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
| Office Documents Official | `office-documents-official/` | Hint for Office and PDF file work. Use when the user asks to create, edit, read or convert a Word .docx, PDF, PowerPoint .pptx or Excel .xlsx file. caddis does not ship these skills; points to Anthropic's official document-skills plugin. |
|
|
59
59
|
| Tech Explainer | `tech-explainer/` | >- |
|
|
60
60
|
| Technical Writing | `technical-writing/` | Documentation best practices for READMEs, API docs, architecture docs, runbooks and developer guides. Use when writing or reviewing docs or setting documentation standards. |
|
|
61
|
-
| Writing Plans | `writing-plans/` | Use when you have a spec or requirements for a multi-step task, before touching code |
|
|
61
|
+
| Writing Plans | `writing-plans/` | Use when you have a spec or requirements for a multi-step task, before touching code. In caddis, plans are written with /caddis:feature-plan, the only plan writer; this skill sends you there. |
|
|
62
62
|
|
|
63
63
|
### Frontend
|
|
64
64
|
|
|
@@ -80,6 +80,7 @@
|
|
|
80
80
|
| Add Rules | `add-rules/` | Create canonical rules for ANY folder — write <folder>/AGENTS.md (from the folder template) + a <folder>/CLAUDE.md @import shim. For folders the stack-map generator doesn't cover. |
|
|
81
81
|
| Catchup | `catchup/` | Where were we? A quick list of what this session was doing and what is still open |
|
|
82
82
|
| Cloud Phases | `cloud-phases/` | Run plan phases in Claude Code cloud sessions — write one prompt per phase, push, hand out paste lines, then take the PRs back |
|
|
83
|
+
| Coordinate | `coordinate/` | Run this session as the repo's coordinator — one merge queue for all sessions, one merge at a time, a deploy check after each merge, routine approvals in the ledger. |
|
|
83
84
|
| Decide | `decide/` | Record a decision in one step — .caddis/decisions/<date>-<slug>.md |
|
|
84
85
|
| Digress | `digress/` | Park the current workstream on the stack and switch to a new task — without losing the original |
|
|
85
86
|
| Excalidraw Db | `excalidraw-db/` | Turn a SQL artifact into an Excalidraw diagram for a design review / ARB pack / slide — higher-level, drag-the-boxes format |
|
|
@@ -45,7 +45,7 @@ Start by understanding the current project context, then ask questions one at a
|
|
|
45
45
|
**Implementation (if continuing):**
|
|
46
46
|
- Ask: "Ready to set up for implementation?"
|
|
47
47
|
- Use the `using-git-worktrees` skill (caddis, devops/) to create an isolated workspace
|
|
48
|
-
- Use `/caddis:feature-plan`
|
|
48
|
+
- Use `/caddis:feature-plan` to write the plan (it is the only plan writer in caddis)
|
|
49
49
|
|
|
50
50
|
## Key Principles
|
|
51
51
|
|