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.
Files changed (102) hide show
  1. package/README.md +15 -8
  2. package/dist/bundle/clancy-afk.js +6 -2
  3. package/dist/bundle/clancy-once.js +71 -48
  4. package/dist/installer/hook-installer/hook-installer.d.ts +2 -0
  5. package/dist/installer/hook-installer/hook-installer.d.ts.map +1 -1
  6. package/dist/installer/hook-installer/hook-installer.js +36 -1
  7. package/dist/installer/hook-installer/hook-installer.js.map +1 -1
  8. package/dist/installer/install.js +16 -1
  9. package/dist/installer/install.js.map +1 -1
  10. package/dist/schemas/env.d.ts +36 -0
  11. package/dist/schemas/env.d.ts.map +1 -1
  12. package/dist/schemas/env.js +11 -0
  13. package/dist/schemas/env.js.map +1 -1
  14. package/dist/schemas/github-issues.d.ts +6 -0
  15. package/dist/schemas/github-issues.d.ts.map +1 -1
  16. package/dist/schemas/github-issues.js +3 -0
  17. package/dist/schemas/github-issues.js.map +1 -1
  18. package/dist/schemas/jira.d.ts +21 -0
  19. package/dist/schemas/jira.d.ts.map +1 -1
  20. package/dist/schemas/jira.js +18 -0
  21. package/dist/schemas/jira.js.map +1 -1
  22. package/dist/schemas/linear.d.ts +41 -0
  23. package/dist/schemas/linear.d.ts.map +1 -1
  24. package/dist/schemas/linear.js +34 -0
  25. package/dist/schemas/linear.js.map +1 -1
  26. package/dist/scripts/afk/afk.d.ts.map +1 -1
  27. package/dist/scripts/afk/afk.js +28 -0
  28. package/dist/scripts/afk/afk.js.map +1 -1
  29. package/dist/scripts/afk/report/report.d.ts +47 -0
  30. package/dist/scripts/afk/report/report.d.ts.map +1 -0
  31. package/dist/scripts/afk/report/report.js +194 -0
  32. package/dist/scripts/afk/report/report.js.map +1 -0
  33. package/dist/scripts/board/github/github.d.ts +33 -3
  34. package/dist/scripts/board/github/github.d.ts.map +1 -1
  35. package/dist/scripts/board/github/github.js +112 -27
  36. package/dist/scripts/board/github/github.js.map +1 -1
  37. package/dist/scripts/board/jira/jira.d.ts +36 -4
  38. package/dist/scripts/board/jira/jira.d.ts.map +1 -1
  39. package/dist/scripts/board/jira/jira.js +138 -65
  40. package/dist/scripts/board/jira/jira.js.map +1 -1
  41. package/dist/scripts/board/linear/linear.d.ts +32 -5
  42. package/dist/scripts/board/linear/linear.d.ts.map +1 -1
  43. package/dist/scripts/board/linear/linear.js +135 -17
  44. package/dist/scripts/board/linear/linear.js.map +1 -1
  45. package/dist/scripts/once/board-ops/board-ops.d.ts.map +1 -1
  46. package/dist/scripts/once/board-ops/board-ops.js +1 -1
  47. package/dist/scripts/once/board-ops/board-ops.js.map +1 -1
  48. package/dist/scripts/once/cost/cost.d.ts +10 -0
  49. package/dist/scripts/once/cost/cost.d.ts.map +1 -0
  50. package/dist/scripts/once/cost/cost.js +23 -0
  51. package/dist/scripts/once/cost/cost.js.map +1 -0
  52. package/dist/scripts/once/deliver/deliver.d.ts.map +1 -1
  53. package/dist/scripts/once/deliver/deliver.js +18 -1
  54. package/dist/scripts/once/deliver/deliver.js.map +1 -1
  55. package/dist/scripts/once/fetch-ticket/fetch-ticket.d.ts +19 -1
  56. package/dist/scripts/once/fetch-ticket/fetch-ticket.d.ts.map +1 -1
  57. package/dist/scripts/once/fetch-ticket/fetch-ticket.js +93 -29
  58. package/dist/scripts/once/fetch-ticket/fetch-ticket.js.map +1 -1
  59. package/dist/scripts/once/lock/lock.d.ts +17 -0
  60. package/dist/scripts/once/lock/lock.d.ts.map +1 -0
  61. package/dist/scripts/once/lock/lock.js +70 -0
  62. package/dist/scripts/once/lock/lock.js.map +1 -0
  63. package/dist/scripts/once/once.d.ts.map +1 -1
  64. package/dist/scripts/once/once.js +100 -4
  65. package/dist/scripts/once/once.js.map +1 -1
  66. package/dist/scripts/once/resume/resume.d.ts +24 -0
  67. package/dist/scripts/once/resume/resume.d.ts.map +1 -0
  68. package/dist/scripts/once/resume/resume.js +159 -0
  69. package/dist/scripts/once/resume/resume.js.map +1 -0
  70. package/dist/scripts/shared/format/format.d.ts.map +1 -1
  71. package/dist/scripts/shared/format/format.js +6 -1
  72. package/dist/scripts/shared/format/format.js.map +1 -1
  73. package/dist/scripts/shared/progress/progress.d.ts +18 -2
  74. package/dist/scripts/shared/progress/progress.d.ts.map +1 -1
  75. package/dist/scripts/shared/progress/progress.js +31 -4
  76. package/dist/scripts/shared/progress/progress.js.map +1 -1
  77. package/dist/scripts/shared/pull-request/pr-body/pr-body.d.ts +2 -1
  78. package/dist/scripts/shared/pull-request/pr-body/pr-body.d.ts.map +1 -1
  79. package/dist/scripts/shared/pull-request/pr-body/pr-body.js +10 -1
  80. package/dist/scripts/shared/pull-request/pr-body/pr-body.js.map +1 -1
  81. package/dist/types/remote.d.ts +1 -1
  82. package/dist/types/remote.d.ts.map +1 -1
  83. package/hooks/clancy-branch-guard.js +129 -0
  84. package/hooks/clancy-check-update.js +43 -0
  85. package/hooks/clancy-context-monitor.js +134 -46
  86. package/hooks/clancy-post-compact.js +53 -0
  87. package/hooks/package.json +3 -0
  88. package/package.json +3 -2
  89. package/src/agents/devils-advocate.md +53 -0
  90. package/src/agents/verification-gate.md +128 -0
  91. package/src/roles/planner/workflows/approve-plan.md +2 -2
  92. package/src/roles/reviewer/workflows/logs.md +9 -6
  93. package/src/roles/setup/commands/help.md +7 -0
  94. package/src/roles/setup/workflows/init.md +111 -6
  95. package/src/roles/setup/workflows/scaffold.md +57 -0
  96. package/src/roles/setup/workflows/settings.md +145 -0
  97. package/src/roles/setup/workflows/update.md +18 -0
  98. package/src/roles/strategist/commands/approve-brief.md +20 -0
  99. package/src/roles/strategist/commands/brief.md +27 -0
  100. package/src/roles/strategist/workflows/approve-brief.md +763 -0
  101. package/src/roles/strategist/workflows/brief.md +732 -0
  102. 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 `| APPROVE |` for the same key.
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} | APPROVE | —
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 | APPROVE | —` — plan promoted to description
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
- - Ticket key (e.g. PROJ-42)
39
- - Action type (DONE, REVIEW, PLAN, REVISED, APPROVE, SKIPPED, POST_FAILED, or summary text)
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, APPROVE, REVIEW, SKIPPED, POST_FAILED
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, APPROVE, SKIPPED, and POST_FAILED lines: shown separately at the end as counts — not included in ticket count
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
- Clancy includes the Implementer, Reviewer, and Setup roles by default.
517
- You can enable additional roles:
561
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
562
+ Optional Roles
563
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
518
564
 
519
- [1] Planner — Refine vague tickets into structured implementation plans
565
+ Core roles (always installed): Implementer, Reviewer, Setup
520
566
 
521
- Enter roles to enable (e.g. 1 or "all") or press Enter to skip:
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.