chief-clancy 0.5.12 → 0.7.0
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/README.md +15 -8
- package/dist/bundle/clancy-afk.js +6 -2
- package/dist/bundle/clancy-once.js +71 -48
- package/dist/installer/hook-installer/hook-installer.d.ts +2 -0
- package/dist/installer/hook-installer/hook-installer.d.ts.map +1 -1
- package/dist/installer/hook-installer/hook-installer.js +36 -1
- package/dist/installer/hook-installer/hook-installer.js.map +1 -1
- package/dist/installer/install.js +16 -1
- package/dist/installer/install.js.map +1 -1
- package/dist/schemas/env.d.ts +36 -0
- package/dist/schemas/env.d.ts.map +1 -1
- package/dist/schemas/env.js +11 -0
- package/dist/schemas/env.js.map +1 -1
- package/dist/schemas/github-issues.d.ts +6 -0
- package/dist/schemas/github-issues.d.ts.map +1 -1
- package/dist/schemas/github-issues.js +3 -0
- package/dist/schemas/github-issues.js.map +1 -1
- package/dist/schemas/jira.d.ts +21 -0
- package/dist/schemas/jira.d.ts.map +1 -1
- package/dist/schemas/jira.js +18 -0
- package/dist/schemas/jira.js.map +1 -1
- package/dist/schemas/linear.d.ts +41 -0
- package/dist/schemas/linear.d.ts.map +1 -1
- package/dist/schemas/linear.js +34 -0
- package/dist/schemas/linear.js.map +1 -1
- package/dist/scripts/afk/afk.d.ts.map +1 -1
- package/dist/scripts/afk/afk.js +28 -0
- package/dist/scripts/afk/afk.js.map +1 -1
- package/dist/scripts/afk/report/report.d.ts +47 -0
- package/dist/scripts/afk/report/report.d.ts.map +1 -0
- package/dist/scripts/afk/report/report.js +194 -0
- package/dist/scripts/afk/report/report.js.map +1 -0
- package/dist/scripts/board/github/github.d.ts +33 -3
- package/dist/scripts/board/github/github.d.ts.map +1 -1
- package/dist/scripts/board/github/github.js +112 -27
- package/dist/scripts/board/github/github.js.map +1 -1
- package/dist/scripts/board/jira/jira.d.ts +36 -4
- package/dist/scripts/board/jira/jira.d.ts.map +1 -1
- package/dist/scripts/board/jira/jira.js +138 -65
- package/dist/scripts/board/jira/jira.js.map +1 -1
- package/dist/scripts/board/linear/linear.d.ts +32 -5
- package/dist/scripts/board/linear/linear.d.ts.map +1 -1
- package/dist/scripts/board/linear/linear.js +135 -17
- package/dist/scripts/board/linear/linear.js.map +1 -1
- package/dist/scripts/once/board-ops/board-ops.d.ts.map +1 -1
- package/dist/scripts/once/board-ops/board-ops.js +1 -1
- package/dist/scripts/once/board-ops/board-ops.js.map +1 -1
- package/dist/scripts/once/cost/cost.d.ts +10 -0
- package/dist/scripts/once/cost/cost.d.ts.map +1 -0
- package/dist/scripts/once/cost/cost.js +23 -0
- package/dist/scripts/once/cost/cost.js.map +1 -0
- package/dist/scripts/once/deliver/deliver.d.ts.map +1 -1
- package/dist/scripts/once/deliver/deliver.js +18 -1
- package/dist/scripts/once/deliver/deliver.js.map +1 -1
- package/dist/scripts/once/fetch-ticket/fetch-ticket.d.ts +19 -1
- package/dist/scripts/once/fetch-ticket/fetch-ticket.d.ts.map +1 -1
- package/dist/scripts/once/fetch-ticket/fetch-ticket.js +93 -29
- package/dist/scripts/once/fetch-ticket/fetch-ticket.js.map +1 -1
- package/dist/scripts/once/lock/lock.d.ts +17 -0
- package/dist/scripts/once/lock/lock.d.ts.map +1 -0
- package/dist/scripts/once/lock/lock.js +70 -0
- package/dist/scripts/once/lock/lock.js.map +1 -0
- package/dist/scripts/once/once.d.ts.map +1 -1
- package/dist/scripts/once/once.js +100 -4
- package/dist/scripts/once/once.js.map +1 -1
- package/dist/scripts/once/resume/resume.d.ts +24 -0
- package/dist/scripts/once/resume/resume.d.ts.map +1 -0
- package/dist/scripts/once/resume/resume.js +159 -0
- package/dist/scripts/once/resume/resume.js.map +1 -0
- package/dist/scripts/shared/format/format.d.ts.map +1 -1
- package/dist/scripts/shared/format/format.js +6 -1
- package/dist/scripts/shared/format/format.js.map +1 -1
- package/dist/scripts/shared/progress/progress.d.ts +18 -2
- package/dist/scripts/shared/progress/progress.d.ts.map +1 -1
- package/dist/scripts/shared/progress/progress.js +31 -4
- package/dist/scripts/shared/progress/progress.js.map +1 -1
- package/dist/scripts/shared/pull-request/pr-body/pr-body.d.ts +2 -1
- package/dist/scripts/shared/pull-request/pr-body/pr-body.d.ts.map +1 -1
- package/dist/scripts/shared/pull-request/pr-body/pr-body.js +10 -1
- package/dist/scripts/shared/pull-request/pr-body/pr-body.js.map +1 -1
- package/dist/types/remote.d.ts +1 -1
- package/dist/types/remote.d.ts.map +1 -1
- package/hooks/clancy-branch-guard.js +129 -0
- package/hooks/clancy-check-update.js +43 -0
- package/hooks/clancy-context-monitor.js +134 -46
- package/hooks/clancy-post-compact.js +53 -0
- package/hooks/package.json +3 -0
- package/package.json +3 -2
- package/src/agents/devils-advocate.md +53 -0
- package/src/agents/verification-gate.md +128 -0
- package/src/roles/planner/workflows/approve-plan.md +2 -2
- package/src/roles/reviewer/workflows/logs.md +9 -6
- package/src/roles/setup/commands/help.md +7 -0
- package/src/roles/setup/workflows/init.md +111 -6
- package/src/roles/setup/workflows/scaffold.md +57 -0
- package/src/roles/setup/workflows/settings.md +145 -0
- package/src/roles/setup/workflows/update.md +18 -0
- package/src/roles/strategist/commands/approve-brief.md +20 -0
- package/src/roles/strategist/commands/brief.md +27 -0
- package/src/roles/strategist/workflows/approve-brief.md +763 -0
- package/src/roles/strategist/workflows/brief.md +732 -0
- package/src/templates/CLAUDE.md +8 -1
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# Verification Gate Agent
|
|
2
|
+
|
|
3
|
+
You are the verification gate agent for Clancy. You run as a `type: "agent"` Stop hook in Claude Code. Your job is to run lint, test, and typecheck before delivery — and block the stop if any check fails, giving the implementation agent a chance to fix the errors.
|
|
4
|
+
|
|
5
|
+
You have full tool access: Read, Edit, Write, Glob, Grep, Bash. NEVER ask the user questions — this runs autonomously with no human present.
|
|
6
|
+
|
|
7
|
+
## Instructions
|
|
8
|
+
|
|
9
|
+
Work through the following steps in order. Exit early whenever an early-exit condition is met.
|
|
10
|
+
|
|
11
|
+
### Step 1 — Check if in a Clancy run
|
|
12
|
+
|
|
13
|
+
Read `.clancy/lock.json` in the project root. If the file does not exist, this is not a Clancy implementation session. Respond immediately:
|
|
14
|
+
|
|
15
|
+
```json
|
|
16
|
+
{"decision": "allow"}
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### Step 2 — Check for stop hook recursion
|
|
20
|
+
|
|
21
|
+
Check the hook input for `stop_hook_active: true`. If set, respond immediately to prevent infinite loops:
|
|
22
|
+
|
|
23
|
+
```json
|
|
24
|
+
{"decision": "allow"}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### Step 3 — Read retry state
|
|
28
|
+
|
|
29
|
+
Read `.clancy/verify-attempt.txt` from the project root. If the file does not exist, this is attempt 1. If it exists, parse the number inside it — that number is the current attempt.
|
|
30
|
+
|
|
31
|
+
### Step 4 — Check max retries
|
|
32
|
+
|
|
33
|
+
Read the `CLANCY_FIX_RETRIES` environment variable. Default to `2` if not set.
|
|
34
|
+
|
|
35
|
+
**Special case: `CLANCY_FIX_RETRIES=0`** means "verify once but never retry." On attempt 1, run checks normally. If they fail, write `1` to `.clancy/verify-attempt.txt` and respond with `{"decision": "allow"}` — do NOT block. The PR body will include the verification warning. On attempt 2+, allow immediately.
|
|
36
|
+
|
|
37
|
+
**Normal case: `CLANCY_FIX_RETRIES >= 1`** — The first attempt (attempt 1) ALWAYS runs verification. On subsequent attempts, check if retries are exhausted: if the current attempt is greater than `maxRetries + 1`, max retries have been exhausted (attempt 1 = initial check, attempts 2 through maxRetries+1 = fix retries). When exhausted, keep `.clancy/verify-attempt.txt` in place (the delivery flow reads it to add a verification warning to the PR body). Respond immediately:
|
|
38
|
+
|
|
39
|
+
```json
|
|
40
|
+
{"decision": "allow"}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
The PR body will include a verification warning — delivery should not be blocked indefinitely.
|
|
44
|
+
|
|
45
|
+
### Step 5 — Detect check commands
|
|
46
|
+
|
|
47
|
+
First check for the `CLANCY_VERIFY_COMMANDS` environment variable. If set, use its value as a comma-separated list of **full shell commands** to run (e.g. `npm run lint,npm test,npm run typecheck`). Execute each command directly via Bash — do NOT wrap in `npm run`. Skip auto-detection.
|
|
48
|
+
|
|
49
|
+
If `CLANCY_VERIFY_COMMANDS` is not set, read `package.json` and inspect the `scripts` object. Auto-detect checks by matching script names:
|
|
50
|
+
|
|
51
|
+
| Script name pattern | Check type |
|
|
52
|
+
|---|---|
|
|
53
|
+
| `lint`, `eslint` | lint |
|
|
54
|
+
| `test`, `vitest`, `jest` | test |
|
|
55
|
+
| `typecheck`, `tsc`, `check-types` | typecheck |
|
|
56
|
+
|
|
57
|
+
Match exact script names only — do not match partial names like `test:e2e` or `lint:fix`. Use the first match per check type.
|
|
58
|
+
|
|
59
|
+
If no check commands are detected at all, respond immediately:
|
|
60
|
+
|
|
61
|
+
```json
|
|
62
|
+
{"decision": "allow"}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Step 6 — Run checks
|
|
66
|
+
|
|
67
|
+
Execute each detected command using Bash: `npm run <script-name>`. Run them sequentially (not in parallel) so output is clear. Capture both stdout and stderr for each command.
|
|
68
|
+
|
|
69
|
+
Truncate each command's output to the last 500 lines. This prevents overwhelming context on large test suites.
|
|
70
|
+
|
|
71
|
+
Track which checks passed and which failed.
|
|
72
|
+
|
|
73
|
+
### Step 7 — All checks passed
|
|
74
|
+
|
|
75
|
+
If every check exits with code 0, delete `.clancy/verify-attempt.txt` if it exists, then respond:
|
|
76
|
+
|
|
77
|
+
```json
|
|
78
|
+
{"decision": "allow"}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Step 8 — One or more checks failed
|
|
82
|
+
|
|
83
|
+
If any check fails:
|
|
84
|
+
|
|
85
|
+
1. Write the next attempt number to `.clancy/verify-attempt.txt` (current attempt + 1).
|
|
86
|
+
2. Build the reason string with the format below.
|
|
87
|
+
3. Respond with a block decision.
|
|
88
|
+
|
|
89
|
+
Read `CLANCY_FIX_RETRIES` (default 2) to determine the max. Use the current attempt number and max to select an escalation hint:
|
|
90
|
+
|
|
91
|
+
- **Attempt 1**: "Fix the specific errors reported above."
|
|
92
|
+
- **Attempt 2**: "If the same errors persist, consider reverting the problematic change and taking a different approach."
|
|
93
|
+
- **Attempt 3+**: "Consider reverting to the last known working state. Focus on delivering working code rather than complete code."
|
|
94
|
+
|
|
95
|
+
Response format:
|
|
96
|
+
|
|
97
|
+
```json
|
|
98
|
+
{
|
|
99
|
+
"decision": "block",
|
|
100
|
+
"reason": "Verification failed (attempt N of M):\n\n[check name]: FAILED\n[truncated output — last 500 lines]\n\n[check name]: PASSED\n\n[escalation hint]"
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Include output only for failed checks. List passed checks on a single line with no output.
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## Fail-open rule
|
|
109
|
+
|
|
110
|
+
If the agent itself encounters an unexpected error at any point (file read failure, malformed JSON, missing tool, etc.), respond with:
|
|
111
|
+
|
|
112
|
+
```json
|
|
113
|
+
{"decision": "allow"}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Never crash or leave the stop unresolved. The gate is a safety net, not a hard barrier.
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## Rules
|
|
121
|
+
|
|
122
|
+
- NEVER ask the human questions. This runs autonomously as a stop hook.
|
|
123
|
+
- NEVER modify source code. Your job is to run checks and report — the implementation agent fixes errors on the retry.
|
|
124
|
+
- Always respond with exactly one JSON object: `{"decision": "allow"}` or `{"decision": "block", "reason": "..."}`.
|
|
125
|
+
- No other output format is accepted. Do not wrap the JSON in markdown code fences in your final response.
|
|
126
|
+
- Truncate command output to 500 lines maximum per check. Prefer the tail (last N lines) — error summaries are usually at the end.
|
|
127
|
+
- Sequential execution only — run one check at a time so failures are clearly attributed.
|
|
128
|
+
- Clean up `.clancy/verify-attempt.txt` on success only. On max-retries-exhausted, keep the file so the delivery flow can detect it and add a verification warning to the PR body.
|
|
@@ -22,7 +22,7 @@ Promote an approved Clancy plan from a ticket comment to the ticket description.
|
|
|
22
22
|
|
|
23
23
|
### If no argument provided:
|
|
24
24
|
|
|
25
|
-
1. Scan `.clancy/progress.txt` for entries matching `| PLAN |` or `| REVISED |` that have no subsequent `|
|
|
25
|
+
1. Scan `.clancy/progress.txt` for entries matching `| PLAN |` or `| REVISED |` that have no subsequent `| APPROVE_PLAN |` for the same key.
|
|
26
26
|
2. Sort by timestamp ascending (oldest first).
|
|
27
27
|
3. If 0 found:
|
|
28
28
|
```
|
|
@@ -456,7 +456,7 @@ Plan promoted. Moved to unstarted. Ready for /clancy:once.
|
|
|
456
456
|
|
|
457
457
|
Append to `.clancy/progress.txt`:
|
|
458
458
|
```
|
|
459
|
-
YYYY-MM-DD HH:MM | {KEY} |
|
|
459
|
+
YYYY-MM-DD HH:MM | {KEY} | APPROVE_PLAN | —
|
|
460
460
|
```
|
|
461
461
|
|
|
462
462
|
On failure:
|
|
@@ -28,22 +28,23 @@ Each line has one of these formats:
|
|
|
28
28
|
- `YYYY-MM-DD HH:MM | TICKET-KEY | REVIEW | {score}%` — ticket review
|
|
29
29
|
- `YYYY-MM-DD HH:MM | TICKET-KEY | PLAN | {S/M/L}` — plan generated
|
|
30
30
|
- `YYYY-MM-DD HH:MM | TICKET-KEY | REVISED | {S/M/L}` — plan revised after feedback
|
|
31
|
-
- `YYYY-MM-DD HH:MM | TICKET-KEY |
|
|
31
|
+
- `YYYY-MM-DD HH:MM | TICKET-KEY | APPROVE_PLAN | —` — plan promoted to description
|
|
32
32
|
- `YYYY-MM-DD HH:MM | TICKET-KEY | SKIPPED | {reason}` — ticket skipped
|
|
33
33
|
- `YYYY-MM-DD HH:MM | TICKET-KEY | POST_FAILED | {reason}` — failed to post comment to board
|
|
34
|
+
- `YYYY-MM-DD HH:MM | BRIEF | {slug} | {N} proposed tickets` — brief generated (slug-based format)
|
|
35
|
+
- `YYYY-MM-DD HH:MM | APPROVE_BRIEF | {slug} | {N} tickets created` — brief approved (slug-based format)
|
|
34
36
|
|
|
35
37
|
Parse each line:
|
|
36
38
|
- Date (YYYY-MM-DD)
|
|
37
39
|
- Time (HH:MM)
|
|
38
|
-
-
|
|
39
|
-
-
|
|
40
|
-
- Detail (status, score, size, or reason)
|
|
40
|
+
- Key or status (BRIEF/APPROVE_BRIEF entries put the status here, standard entries put the ticket key)
|
|
41
|
+
- Detail (status, score, size, reason, or slug for brief entries)
|
|
41
42
|
|
|
42
43
|
Extract:
|
|
43
44
|
- Total DONE tickets
|
|
44
45
|
- First and latest run dates
|
|
45
46
|
- All DONE tickets from the current calendar week (Mon–Sun)
|
|
46
|
-
- Counts for each action type: PLAN, REVISED,
|
|
47
|
+
- Counts for each action type: PLAN, REVISED, APPROVE_PLAN, REVIEW, SKIPPED, POST_FAILED, BRIEF, APPROVE_BRIEF
|
|
47
48
|
- Epic key from ticket key — e.g. PROJ-42 → epic likely PROJ-10 (use parent field if logged, otherwise group by project prefix)
|
|
48
49
|
|
|
49
50
|
---
|
|
@@ -75,6 +76,8 @@ By epic:
|
|
|
75
76
|
Plans generated: {N} (only show if > 0)
|
|
76
77
|
Plans revised: {N} (only show if > 0)
|
|
77
78
|
Plans approved: {N} (only show if > 0)
|
|
79
|
+
Briefs generated: {N} (only show if > 0)
|
|
80
|
+
Briefs approved: {N} (only show if > 0)
|
|
78
81
|
Reviews run: {N} (only show if > 0)
|
|
79
82
|
Tickets skipped: {N} (only show if > 0)
|
|
80
83
|
Post failures: {N} (only show if > 0)
|
|
@@ -90,7 +93,7 @@ Full log: .clancy/progress.txt
|
|
|
90
93
|
- Progress bars: ASCII, proportional to highest count, width 10 chars, `█` filled, `░` empty
|
|
91
94
|
- Epic grouping: group by epic key in the ticket's parent field (from progress.txt if logged), or by project prefix if not available
|
|
92
95
|
- Tickets without an epic: group under `(other)`
|
|
93
|
-
- REVIEW, PLAN, REVISED,
|
|
96
|
+
- REVIEW, PLAN, REVISED, APPROVE_PLAN, BRIEF, APPROVE_BRIEF, SKIPPED, and POST_FAILED lines: shown separately at the end as counts — not included in ticket count
|
|
94
97
|
|
|
95
98
|
---
|
|
96
99
|
|
|
@@ -22,6 +22,13 @@ integration, structured codebase docs, and a git workflow built for team develop
|
|
|
22
22
|
| `/clancy:plan --fresh` | Discard any existing plan and start from scratch |
|
|
23
23
|
| `/clancy:approve-plan` | Promote an approved plan to the ticket description |
|
|
24
24
|
|
|
25
|
+
### Strategist *(optional — enable via `CLANCY_ROLES=strategist` in `.clancy/.env`)*
|
|
26
|
+
|
|
27
|
+
| Command | Description |
|
|
28
|
+
|---|---|
|
|
29
|
+
| `/clancy:brief` | Generate a strategic brief (research + grill + decomposition) |
|
|
30
|
+
| `/clancy:approve-brief` | Convert a brief into tickets on the board |
|
|
31
|
+
|
|
25
32
|
### Implementer
|
|
26
33
|
|
|
27
34
|
| Command | Description |
|
|
@@ -452,6 +452,51 @@ If [2]: store `CLANCY_MODE=afk` in `.clancy/.env`.
|
|
|
452
452
|
|
|
453
453
|
---
|
|
454
454
|
|
|
455
|
+
### Q3h (all boards): Reliable autonomous mode
|
|
456
|
+
|
|
457
|
+
Output:
|
|
458
|
+
|
|
459
|
+
```
|
|
460
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
461
|
+
Reliable Autonomous Mode
|
|
462
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
463
|
+
|
|
464
|
+
These settings control self-healing and safety limits for autonomous runs.
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
**Fix retries:**
|
|
468
|
+
|
|
469
|
+
```
|
|
470
|
+
Max self-healing attempts after a verification failure? [2]
|
|
471
|
+
(Range: 0–5. When lint/test/typecheck fails, Clancy retries up to this many times before delivering anyway.)
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
If a number 0–5 is entered: store as `CLANCY_FIX_RETRIES` in `.clancy/.env`.
|
|
475
|
+
If enter is pressed with no value: use default 2 — store `CLANCY_FIX_RETRIES=2` in `.clancy/.env`.
|
|
476
|
+
If the value is outside 0–5: re-prompt.
|
|
477
|
+
|
|
478
|
+
**Time limit:**
|
|
479
|
+
|
|
480
|
+
```
|
|
481
|
+
Per-ticket time limit in minutes? [30]
|
|
482
|
+
(0 to disable. Clancy will stop working on a ticket after this many minutes.)
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
If a non-negative integer is entered: store as `CLANCY_TIME_LIMIT` in `.clancy/.env`.
|
|
486
|
+
If enter is pressed with no value: use default 30 — store `CLANCY_TIME_LIMIT=30` in `.clancy/.env`.
|
|
487
|
+
If the value is negative or not a number: re-prompt.
|
|
488
|
+
|
|
489
|
+
**Branch guard:**
|
|
490
|
+
|
|
491
|
+
```
|
|
492
|
+
Enable branch guard hook? Prevents accidental commits to the base branch. [Y/n]
|
|
493
|
+
```
|
|
494
|
+
|
|
495
|
+
If `y`, `Y`, or enter: store `CLANCY_BRANCH_GUARD=true` in `.clancy/.env`.
|
|
496
|
+
If `n` or `N`: store `CLANCY_BRANCH_GUARD=false` in `.clancy/.env`.
|
|
497
|
+
|
|
498
|
+
---
|
|
499
|
+
|
|
455
500
|
### Q4: Base branch (auto-detect)
|
|
456
501
|
|
|
457
502
|
Silently detect the base branch — do not ask unless detection fails:
|
|
@@ -513,18 +558,30 @@ If no: skip the commit silently. The user can commit manually later.
|
|
|
513
558
|
Clancy includes the Implementer, Reviewer, and Setup roles by default. Optional roles add extra capabilities.
|
|
514
559
|
|
|
515
560
|
```
|
|
516
|
-
|
|
517
|
-
|
|
561
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
562
|
+
Optional Roles
|
|
563
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
518
564
|
|
|
519
|
-
|
|
565
|
+
Core roles (always installed): Implementer, Reviewer, Setup
|
|
520
566
|
|
|
521
|
-
|
|
567
|
+
Additional roles extend what Clancy can do:
|
|
568
|
+
|
|
569
|
+
[1] Planner
|
|
570
|
+
Refine vague tickets into structured implementation plans.
|
|
571
|
+
Commands: /clancy:plan, /clancy:approve-plan
|
|
572
|
+
|
|
573
|
+
[2] Strategist
|
|
574
|
+
Generate strategic briefs — research the codebase, grill
|
|
575
|
+
requirements, decompose into tickets with dependencies.
|
|
576
|
+
Commands: /clancy:brief, /clancy:approve-brief
|
|
577
|
+
|
|
578
|
+
Enable: 1, 2, all, or Enter to skip
|
|
522
579
|
```
|
|
523
580
|
|
|
524
|
-
Accept numbers, role names (e.g. "planner"), "all", or Enter to skip.
|
|
581
|
+
Accept numbers, role names (e.g. "planner", "strategist"), "all", or Enter to skip.
|
|
525
582
|
|
|
526
583
|
If any roles are selected:
|
|
527
|
-
- Store as `CLANCY_ROLES="planner"` (comma-separated if multiple) in `.clancy/.env`
|
|
584
|
+
- Store as `CLANCY_ROLES="planner,strategist"` (comma-separated if multiple) in `.clancy/.env`
|
|
528
585
|
- The selected roles' commands and workflows will be installed on the next `npx chief-clancy` run
|
|
529
586
|
|
|
530
587
|
If skipped (Enter): no `CLANCY_ROLES` line is written — only core roles are installed.
|
|
@@ -608,6 +665,54 @@ If [2]: skip — no `CLANCY_STATUS_PLANNED` line written.
|
|
|
608
665
|
|
|
609
666
|
---
|
|
610
667
|
|
|
668
|
+
## Step 4f (if Strategist role selected): Strategist config
|
|
669
|
+
|
|
670
|
+
Only ask this if the user selected Strategist in Step 4c above (or if re-running init and `CLANCY_ROLES` already includes `strategist`).
|
|
671
|
+
|
|
672
|
+
If the strategist role is not enabled, skip this step entirely.
|
|
673
|
+
|
|
674
|
+
**All boards:** Output:
|
|
675
|
+
|
|
676
|
+
```
|
|
677
|
+
Default parent epic/milestone for briefs created from text or file input?
|
|
678
|
+
This sets CLANCY_BRIEF_EPIC so tickets created by /clancy:brief are parented automatically.
|
|
679
|
+
|
|
680
|
+
[1] Skip — no default parent (set per-brief or omit)
|
|
681
|
+
[2] Enter an epic key (e.g. PROJ-100, #42, ENG-50)
|
|
682
|
+
```
|
|
683
|
+
|
|
684
|
+
If [1]: skip — no `CLANCY_BRIEF_EPIC` line written.
|
|
685
|
+
If [2]: prompt for the value, store as `CLANCY_BRIEF_EPIC` in `.clancy/.env`. Wrap in double quotes.
|
|
686
|
+
|
|
687
|
+
**Jira only:** Output:
|
|
688
|
+
|
|
689
|
+
```
|
|
690
|
+
What issue type should /clancy:brief use when creating tickets? [Task]
|
|
691
|
+
|
|
692
|
+
[1] Task (default)
|
|
693
|
+
[2] Story
|
|
694
|
+
[3] Enter a different value
|
|
695
|
+
```
|
|
696
|
+
|
|
697
|
+
If [1] or enter: do not add `CLANCY_BRIEF_ISSUE_TYPE` to `.clancy/.env` (uses default `Task`).
|
|
698
|
+
If [2]: store `CLANCY_BRIEF_ISSUE_TYPE="Story"` in `.clancy/.env`.
|
|
699
|
+
If [3]: prompt for the value, store as `CLANCY_BRIEF_ISSUE_TYPE` in `.clancy/.env`. Wrap in double quotes.
|
|
700
|
+
|
|
701
|
+
**All boards:** Output:
|
|
702
|
+
|
|
703
|
+
```
|
|
704
|
+
Auto-set a component on tickets created by /clancy:brief?
|
|
705
|
+
Only affects ticket creation — does not filter the implementation queue.
|
|
706
|
+
|
|
707
|
+
[1] Skip — no component
|
|
708
|
+
[2] Enter a component name
|
|
709
|
+
```
|
|
710
|
+
|
|
711
|
+
If [1]: skip — no `CLANCY_COMPONENT` line written.
|
|
712
|
+
If [2]: prompt for the value, store as `CLANCY_COMPONENT` in `.clancy/.env`. Wrap in double quotes.
|
|
713
|
+
|
|
714
|
+
---
|
|
715
|
+
|
|
611
716
|
## Step 5 — Optional enhancements
|
|
612
717
|
|
|
613
718
|
Output:
|
|
@@ -412,6 +412,17 @@ MAX_ITERATIONS=5
|
|
|
412
412
|
# Can also be overridden per-invocation with --afk flag.
|
|
413
413
|
# CLANCY_MODE=interactive
|
|
414
414
|
|
|
415
|
+
# ─── Optional: Strategist ───────────────────────────────────────────────────
|
|
416
|
+
# Issue type for tickets created by /clancy:brief (Jira only, default: Task)
|
|
417
|
+
# CLANCY_BRIEF_ISSUE_TYPE="Task"
|
|
418
|
+
|
|
419
|
+
# Default parent epic for briefs created from text or file input
|
|
420
|
+
# CLANCY_BRIEF_EPIC="PROJ-100"
|
|
421
|
+
|
|
422
|
+
# Auto-set on tickets created by /clancy:brief.
|
|
423
|
+
# Only affects ticket creation — does not filter the implementation queue.
|
|
424
|
+
# CLANCY_COMPONENT="frontend"
|
|
425
|
+
|
|
415
426
|
# ─── Optional: Planner queue ─────────────────────────────────────────────────
|
|
416
427
|
# Status for backlog tickets that /clancy:plan fetches from (default: Backlog)
|
|
417
428
|
# Only used if Planner role is enabled via CLANCY_ROLES
|
|
@@ -425,6 +436,16 @@ MAX_ITERATIONS=5
|
|
|
425
436
|
# Set to "false" to disable skip comments
|
|
426
437
|
# CLANCY_SKIP_COMMENTS=true
|
|
427
438
|
|
|
439
|
+
# ─── Optional: Reliable autonomous mode ───────────────────────────────────────
|
|
440
|
+
# Max self-healing attempts after verification failure (default: 2, range 0-5)
|
|
441
|
+
# CLANCY_FIX_RETRIES=2
|
|
442
|
+
|
|
443
|
+
# Per-ticket time limit in minutes (default: 30, 0 to disable)
|
|
444
|
+
# CLANCY_TIME_LIMIT=30
|
|
445
|
+
|
|
446
|
+
# Prevent accidental commits to the base branch (default: true)
|
|
447
|
+
# CLANCY_BRANCH_GUARD=true
|
|
448
|
+
|
|
428
449
|
# ─── Optional: Notifications ──────────────────────────────────────────────────
|
|
429
450
|
# Webhook URL for Slack or Teams notifications on ticket completion
|
|
430
451
|
# CLANCY_NOTIFY_WEBHOOK=https://hooks.slack.com/services/your/webhook/url
|
|
@@ -497,11 +518,29 @@ MAX_ITERATIONS=20
|
|
|
497
518
|
# Can also be overridden per-invocation with --afk flag.
|
|
498
519
|
# CLANCY_MODE=interactive
|
|
499
520
|
|
|
521
|
+
# ─── Optional: Strategist ───────────────────────────────────────────────────
|
|
522
|
+
# Default parent epic/milestone for briefs created from text or file input
|
|
523
|
+
# CLANCY_BRIEF_EPIC="#42"
|
|
524
|
+
|
|
525
|
+
# Auto-set on tickets created by /clancy:brief.
|
|
526
|
+
# Only affects ticket creation — does not filter the implementation queue.
|
|
527
|
+
# CLANCY_COMPONENT="frontend"
|
|
528
|
+
|
|
500
529
|
# ─── Optional: Skip comments ──────────────────────────────────────────────
|
|
501
530
|
# When Clancy skips a ticket (irrelevant/infeasible), post a comment explaining why
|
|
502
531
|
# Set to "false" to disable skip comments
|
|
503
532
|
# CLANCY_SKIP_COMMENTS=true
|
|
504
533
|
|
|
534
|
+
# ─── Optional: Reliable autonomous mode ───────────────────────────────────────
|
|
535
|
+
# Max self-healing attempts after verification failure (default: 2, range 0-5)
|
|
536
|
+
# CLANCY_FIX_RETRIES=2
|
|
537
|
+
|
|
538
|
+
# Per-ticket time limit in minutes (default: 30, 0 to disable)
|
|
539
|
+
# CLANCY_TIME_LIMIT=30
|
|
540
|
+
|
|
541
|
+
# Prevent accidental commits to the base branch (default: true)
|
|
542
|
+
# CLANCY_BRANCH_GUARD=true
|
|
543
|
+
|
|
505
544
|
# ─── Optional: Notifications ──────────────────────────────────────────────────
|
|
506
545
|
# Webhook URL for Slack or Teams notifications on ticket completion
|
|
507
546
|
# CLANCY_NOTIFY_WEBHOOK=https://hooks.slack.com/services/your/webhook/url
|
|
@@ -579,6 +618,14 @@ MAX_ITERATIONS=20
|
|
|
579
618
|
# Can also be overridden per-invocation with --afk flag.
|
|
580
619
|
# CLANCY_MODE=interactive
|
|
581
620
|
|
|
621
|
+
# ─── Optional: Strategist ───────────────────────────────────────────────────
|
|
622
|
+
# Default parent epic for briefs created from text or file input
|
|
623
|
+
# CLANCY_BRIEF_EPIC="ENG-50"
|
|
624
|
+
|
|
625
|
+
# Auto-set on tickets created by /clancy:brief.
|
|
626
|
+
# Only affects ticket creation — does not filter the implementation queue.
|
|
627
|
+
# CLANCY_COMPONENT="frontend"
|
|
628
|
+
|
|
582
629
|
# ─── Optional: Git host (PR creation) ───────────────────────────────────────
|
|
583
630
|
# When an issue has no parent, Clancy pushes the feature branch and creates a
|
|
584
631
|
# pull request instead of squash-merging locally. Requires a git host token.
|
|
@@ -589,6 +636,16 @@ MAX_ITERATIONS=20
|
|
|
589
636
|
# CLANCY_GIT_PLATFORM=gitlab # override auto-detection (github/gitlab/bitbucket)
|
|
590
637
|
# CLANCY_GIT_API_URL=https://gitlab.example.com/api/v4 # self-hosted git API base URL
|
|
591
638
|
|
|
639
|
+
# ─── Optional: Reliable autonomous mode ───────────────────────────────────────
|
|
640
|
+
# Max self-healing attempts after verification failure (default: 2, range 0-5)
|
|
641
|
+
# CLANCY_FIX_RETRIES=2
|
|
642
|
+
|
|
643
|
+
# Per-ticket time limit in minutes (default: 30, 0 to disable)
|
|
644
|
+
# CLANCY_TIME_LIMIT=30
|
|
645
|
+
|
|
646
|
+
# Prevent accidental commits to the base branch (default: true)
|
|
647
|
+
# CLANCY_BRANCH_GUARD=true
|
|
648
|
+
|
|
592
649
|
# ─── Optional: Skip comments ──────────────────────────────────────────────
|
|
593
650
|
# When Clancy skips a ticket (irrelevant/infeasible), post a comment explaining why
|
|
594
651
|
# Set to "false" to disable skip comments
|
|
@@ -9,6 +9,7 @@ View and change Clancy configuration. Reads `.clancy/.env`, shows current values
|
|
|
9
9
|
This workflow runs inside a Claude Code session. Accept natural language alongside option codes:
|
|
10
10
|
- "G1", "max iterations", "change iterations" → all resolve to the max iterations setting
|
|
11
11
|
- "enable planner", "R1", "planner" → all resolve to the Planner role toggle
|
|
12
|
+
- "enable strategist", "R2", "strategist" → all resolve to the Strategist role toggle
|
|
12
13
|
- "switch board", "S" → switch board flow
|
|
13
14
|
- If a response is ambiguous, ask for clarification
|
|
14
15
|
|
|
@@ -54,6 +55,9 @@ General
|
|
|
54
55
|
[G4] Max rework {CLANCY_MAX_REWORK:-3}
|
|
55
56
|
[G5] TDD mode {on if CLANCY_TDD=true, else off}
|
|
56
57
|
[G6] Grill mode {CLANCY_MODE:-interactive}
|
|
58
|
+
[G7] Fix retries {CLANCY_FIX_RETRIES:-2} self-healing attempts after verification failure
|
|
59
|
+
[G8] Time limit {CLANCY_TIME_LIMIT:-30} per-ticket time limit in minutes (0 = disabled)
|
|
60
|
+
[G9] Branch guard {on if CLANCY_BRANCH_GUARD=true or unset, off if false}
|
|
57
61
|
|
|
58
62
|
{If Jira:}
|
|
59
63
|
Jira
|
|
@@ -73,6 +77,14 @@ Linear
|
|
|
73
77
|
|
|
74
78
|
Roles
|
|
75
79
|
[R1] Planner {✅ enabled / ─ disabled}
|
|
80
|
+
[R2] Strategist {✅ enabled / ─ disabled}
|
|
81
|
+
|
|
82
|
+
{If Strategist enabled:}
|
|
83
|
+
Strategist
|
|
84
|
+
[T1] Brief epic {CLANCY_BRIEF_EPIC if set, else "off"}
|
|
85
|
+
{If Jira:}
|
|
86
|
+
[T2] Issue type {CLANCY_BRIEF_ISSUE_TYPE:-Task}
|
|
87
|
+
[T3] Component {CLANCY_COMPONENT if set, else "off"}
|
|
76
88
|
|
|
77
89
|
{If Planner enabled:}
|
|
78
90
|
Planner
|
|
@@ -205,6 +217,59 @@ If [2]: write `CLANCY_MODE=afk` to `.clancy/.env`.
|
|
|
205
217
|
|
|
206
218
|
---
|
|
207
219
|
|
|
220
|
+
### [G7] Fix retries
|
|
221
|
+
|
|
222
|
+
```
|
|
223
|
+
Fix retries — current: {value or 2}
|
|
224
|
+
Max self-healing attempts after a verification failure (lint/test/typecheck).
|
|
225
|
+
When exhausted, Clancy delivers anyway with a warning in the PR body.
|
|
226
|
+
|
|
227
|
+
[1] 2 (default)
|
|
228
|
+
[2] Enter a different number (0–5)
|
|
229
|
+
[3] Cancel
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
Validate the input is an integer between 0 and 5. If invalid, re-prompt.
|
|
233
|
+
|
|
234
|
+
If [1]: remove `CLANCY_FIX_RETRIES` from `.clancy/.env` (uses default).
|
|
235
|
+
If [2]: prompt `How many fix retries?` then write `CLANCY_FIX_RETRIES=<value>` to `.clancy/.env`.
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
### [G8] Time limit
|
|
240
|
+
|
|
241
|
+
```
|
|
242
|
+
Time limit — current: {value or 30} minutes
|
|
243
|
+
Per-ticket time limit. Clancy stops working on a ticket after this many minutes.
|
|
244
|
+
Set to 0 to disable.
|
|
245
|
+
|
|
246
|
+
[1] 30 minutes (default)
|
|
247
|
+
[2] Enter a different number
|
|
248
|
+
[3] Cancel
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
Validate the input is a non-negative integer. If invalid, re-prompt.
|
|
252
|
+
|
|
253
|
+
If [1]: remove `CLANCY_TIME_LIMIT` from `.clancy/.env` (uses default).
|
|
254
|
+
If [2]: prompt `Time limit in minutes? (0 to disable)` then write `CLANCY_TIME_LIMIT=<value>` to `.clancy/.env`.
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
|
|
258
|
+
### [G9] Branch guard
|
|
259
|
+
|
|
260
|
+
```
|
|
261
|
+
Branch guard — current: {on/off}
|
|
262
|
+
Prevents accidental commits to the base branch during autonomous runs.
|
|
263
|
+
|
|
264
|
+
[1] Enable (default)
|
|
265
|
+
[2] Disable
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
If [1]: write `CLANCY_BRANCH_GUARD=true` to `.clancy/.env`.
|
|
269
|
+
If [2]: write `CLANCY_BRANCH_GUARD=false` to `.clancy/.env`.
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
208
273
|
### [B1] Jira status filter (Jira only)
|
|
209
274
|
|
|
210
275
|
```
|
|
@@ -394,6 +459,86 @@ If disabling:
|
|
|
394
459
|
|
|
395
460
|
---
|
|
396
461
|
|
|
462
|
+
### [R2] Strategist role
|
|
463
|
+
|
|
464
|
+
```
|
|
465
|
+
Strategist role — currently: {enabled / disabled}
|
|
466
|
+
The Strategist generates strategic briefs and creates tickets on the board.
|
|
467
|
+
Commands: /clancy:brief, /clancy:approve-brief
|
|
468
|
+
|
|
469
|
+
[1] Enable
|
|
470
|
+
[2] Disable
|
|
471
|
+
[3] Cancel
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
If enabling:
|
|
475
|
+
- Add `strategist` to `CLANCY_ROLES` in `.clancy/.env` (create the key if it doesn't exist, append if other roles are listed)
|
|
476
|
+
- Show `✅ Strategist role enabled. Re-run the installer to apply: npx chief-clancy@latest --local (or --global)`
|
|
477
|
+
|
|
478
|
+
If disabling:
|
|
479
|
+
- Remove `strategist` from `CLANCY_ROLES` in `.clancy/.env` (if empty after removal, remove the line entirely)
|
|
480
|
+
- Keep strategist-specific settings (CLANCY_BRIEF_EPIC, CLANCY_BRIEF_ISSUE_TYPE, CLANCY_COMPONENT) in `.clancy/.env` so re-enabling is frictionless
|
|
481
|
+
- Show `✅ Strategist role disabled. Re-run the installer to apply: npx chief-clancy@latest --local (or --global)`
|
|
482
|
+
|
|
483
|
+
---
|
|
484
|
+
|
|
485
|
+
### [T1] Brief epic
|
|
486
|
+
|
|
487
|
+
Only shown when Strategist is enabled.
|
|
488
|
+
|
|
489
|
+
```
|
|
490
|
+
Brief epic — current: {value or "off"}
|
|
491
|
+
Default parent epic/milestone for briefs created from text or file input.
|
|
492
|
+
|
|
493
|
+
[1] Set epic key (e.g. PROJ-100, #42, ENG-50)
|
|
494
|
+
[2] Off (no default parent)
|
|
495
|
+
[3] Cancel
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
If [1]: prompt `What epic key should /clancy:brief parent tickets under?` then write `CLANCY_BRIEF_EPIC=<value>` to `.clancy/.env`. Wrap in double quotes.
|
|
499
|
+
If [2]: remove `CLANCY_BRIEF_EPIC` from `.clancy/.env`.
|
|
500
|
+
|
|
501
|
+
---
|
|
502
|
+
|
|
503
|
+
### [T2] Issue type (Jira only)
|
|
504
|
+
|
|
505
|
+
Only shown when Strategist is enabled and board is Jira.
|
|
506
|
+
|
|
507
|
+
```
|
|
508
|
+
Brief issue type — current: {value or "Task"}
|
|
509
|
+
Issue type used when /clancy:brief creates tickets on the board.
|
|
510
|
+
|
|
511
|
+
[1] Task (default)
|
|
512
|
+
[2] Story
|
|
513
|
+
[3] Enter a different value
|
|
514
|
+
[4] Cancel
|
|
515
|
+
```
|
|
516
|
+
|
|
517
|
+
If [1]: remove `CLANCY_BRIEF_ISSUE_TYPE` from `.clancy/.env` (uses default).
|
|
518
|
+
If [2]: write `CLANCY_BRIEF_ISSUE_TYPE="Story"` to `.clancy/.env`.
|
|
519
|
+
If [3]: prompt `What issue type should /clancy:brief use?` then write `CLANCY_BRIEF_ISSUE_TYPE=<value>` to `.clancy/.env`. Wrap in double quotes.
|
|
520
|
+
|
|
521
|
+
---
|
|
522
|
+
|
|
523
|
+
### [T3] Component
|
|
524
|
+
|
|
525
|
+
Only shown when Strategist is enabled.
|
|
526
|
+
|
|
527
|
+
```
|
|
528
|
+
Component — current: {value or "off"}
|
|
529
|
+
Auto-set on tickets created by /clancy:brief.
|
|
530
|
+
Only affects ticket creation — does not filter the implementation queue.
|
|
531
|
+
|
|
532
|
+
[1] Set component name
|
|
533
|
+
[2] Off (no component)
|
|
534
|
+
[3] Cancel
|
|
535
|
+
```
|
|
536
|
+
|
|
537
|
+
If [1]: prompt `What component should /clancy:brief set on created tickets?` then write `CLANCY_COMPONENT=<value>` to `.clancy/.env`. Wrap in double quotes.
|
|
538
|
+
If [2]: remove `CLANCY_COMPONENT` from `.clancy/.env`.
|
|
539
|
+
|
|
540
|
+
---
|
|
541
|
+
|
|
397
542
|
### [P1] Plan queue status (Jira only)
|
|
398
543
|
|
|
399
544
|
```
|
|
@@ -212,6 +212,23 @@ Display completion message:
|
|
|
212
212
|
View full changelog: github.com/Pushedskydiver/clancy/blob/main/CHANGELOG.md
|
|
213
213
|
```
|
|
214
214
|
|
|
215
|
+
### New role hints
|
|
216
|
+
|
|
217
|
+
After the completion message, check `.clancy/.env` for `CLANCY_ROLES` and display hints for any optional roles that are available but not enabled:
|
|
218
|
+
|
|
219
|
+
- If `CLANCY_ROLES` does not include `planner`:
|
|
220
|
+
```
|
|
221
|
+
💡 Planner role available — refine vague tickets into structured plans.
|
|
222
|
+
Run /clancy:settings to enable it.
|
|
223
|
+
```
|
|
224
|
+
- If `CLANCY_ROLES` does not include `strategist`:
|
|
225
|
+
```
|
|
226
|
+
💡 Strategist role available — generate briefs, grill requirements, create tickets.
|
|
227
|
+
Run /clancy:settings to enable it.
|
|
228
|
+
```
|
|
229
|
+
- If `CLANCY_ROLES` is not set at all (env var missing), show both hints.
|
|
230
|
+
- If all optional roles are already enabled, show nothing.
|
|
231
|
+
|
|
215
232
|
---
|
|
216
233
|
|
|
217
234
|
## Notes
|
|
@@ -219,3 +236,4 @@ View full changelog: github.com/Pushedskydiver/clancy/blob/main/CHANGELOG.md
|
|
|
219
236
|
- If the user installed globally, the update applies globally
|
|
220
237
|
- If the user installed locally, the update applies locally
|
|
221
238
|
- After updating, restart Claude Code for new commands to take effect
|
|
239
|
+
- New role hints are shown post-update so existing users discover features added in newer versions
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# /clancy:approve-brief
|
|
2
|
+
|
|
3
|
+
Convert an approved brief into real tickets on the board. Creates child tickets under the parent, links dependencies, and posts a tracking summary.
|
|
4
|
+
|
|
5
|
+
Accepts optional arguments:
|
|
6
|
+
- **By slug:** `/clancy:approve-brief auth-rework` — approve a specific brief
|
|
7
|
+
- **By index:** `/clancy:approve-brief 2` — approve the 2nd unapproved brief
|
|
8
|
+
- **By ticket:** `/clancy:approve-brief PROJ-123` — approve brief sourced from this ticket
|
|
9
|
+
- **Set parent:** `--epic PROJ-50` — override or set the parent epic
|
|
10
|
+
- **Preview:** `--dry-run` — show what would be created without making API calls
|
|
11
|
+
|
|
12
|
+
Examples:
|
|
13
|
+
- `/clancy:approve-brief` — auto-select (if only 1 unapproved brief)
|
|
14
|
+
- `/clancy:approve-brief auth-rework` — approve by slug
|
|
15
|
+
- `/clancy:approve-brief --dry-run` — preview ticket creation
|
|
16
|
+
- `/clancy:approve-brief --epic PROJ-50` — set parent and approve
|
|
17
|
+
|
|
18
|
+
@.claude/clancy/workflows/approve-brief.md
|
|
19
|
+
|
|
20
|
+
Follow the approve-brief workflow above. Parse the decomposition, create tickets on the board, link dependencies, and post a tracking comment.
|