chief-clancy 0.5.10 → 0.6.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 +17 -9
- package/dist/bundle/clancy-afk.js +2 -2
- package/dist/bundle/clancy-once.js +79 -44
- package/dist/installer/install.js +8 -1
- package/dist/installer/install.js.map +1 -1
- package/dist/schemas/env.d.ts +16 -0
- package/dist/schemas/env.d.ts.map +1 -1
- package/dist/schemas/env.js +5 -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 +1 -0
- package/dist/scripts/afk/afk.js.map +1 -1
- package/dist/scripts/board/github/github.d.ts +47 -0
- package/dist/scripts/board/github/github.d.ts.map +1 -1
- package/dist/scripts/board/github/github.js +130 -11
- package/dist/scripts/board/github/github.js.map +1 -1
- package/dist/scripts/board/jira/jira.d.ts +50 -1
- package/dist/scripts/board/jira/jira.d.ts.map +1 -1
- package/dist/scripts/board/jira/jira.js +154 -26
- package/dist/scripts/board/jira/jira.js.map +1 -1
- package/dist/scripts/board/linear/linear.d.ts +44 -0
- package/dist/scripts/board/linear/linear.d.ts.map +1 -1
- package/dist/scripts/board/linear/linear.js +166 -13
- package/dist/scripts/board/linear/linear.js.map +1 -1
- package/dist/scripts/once/board-ops/board-ops.d.ts +15 -0
- package/dist/scripts/once/board-ops/board-ops.d.ts.map +1 -1
- package/dist/scripts/once/board-ops/board-ops.js +35 -3
- package/dist/scripts/once/board-ops/board-ops.js.map +1 -1
- package/dist/scripts/once/deliver/deliver.d.ts +27 -3
- package/dist/scripts/once/deliver/deliver.d.ts.map +1 -1
- package/dist/scripts/once/deliver/deliver.js +139 -37
- 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/once.d.ts.map +1 -1
- package/dist/scripts/once/once.js +90 -21
- package/dist/scripts/once/once.js.map +1 -1
- package/dist/scripts/once/rework/rework.js +1 -1
- package/dist/scripts/once/rework/rework.js.map +1 -1
- package/dist/scripts/shared/git-ops/git-ops.d.ts +9 -0
- package/dist/scripts/shared/git-ops/git-ops.d.ts.map +1 -1
- package/dist/scripts/shared/git-ops/git-ops.js +17 -0
- package/dist/scripts/shared/git-ops/git-ops.js.map +1 -1
- package/dist/scripts/shared/progress/progress.d.ts +10 -3
- package/dist/scripts/shared/progress/progress.d.ts.map +1 -1
- package/dist/scripts/shared/progress/progress.js +76 -23
- package/dist/scripts/shared/progress/progress.js.map +1 -1
- package/dist/scripts/shared/pull-request/pr-body/pr-body.d.ts +23 -2
- 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 +40 -3
- 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-check-update.js +43 -0
- package/package.json +1 -1
- package/src/agents/devils-advocate.md +53 -0
- package/src/roles/implementer/commands/once.md +1 -1
- package/src/roles/implementer/workflows/once.md +1 -1
- 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 +85 -7
- package/src/roles/setup/workflows/scaffold.md +45 -0
- package/src/roles/setup/workflows/settings.md +105 -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 +10 -4
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
**Autonomous, board-driven development for Claude Code.**
|
|
4
4
|
|
|
5
|
-
[](https://www.npmjs.com/package/chief-clancy) [](./LICENSE) [](https://www.npmjs.com/package/chief-clancy) [](./LICENSE) [](docs/TESTING.md) [](https://github.com/Pushedskydiver/clancy/stargazers)
|
|
6
6
|
|
|
7
7
|
> [!WARNING]
|
|
8
8
|
> Clancy is in early development. Expect bugs, breaking changes, and rough edges. If you hit an issue, please [open a bug report](https://github.com/Pushedskydiver/clancy/issues/new).
|
|
@@ -25,14 +25,15 @@ Named after Chief Clancy Wiggum (The Simpsons) — built on the [Ralph technique
|
|
|
25
25
|
|
|
26
26
|
## What it does
|
|
27
27
|
|
|
28
|
-
Clancy does
|
|
28
|
+
Clancy does five things:
|
|
29
29
|
|
|
30
30
|
1. **Scaffolds itself** into a project — scripts, docs, CLAUDE.md, .clancy/.env
|
|
31
31
|
2. **Scans your codebase** with 5 parallel specialist agents and writes 10 structured docs that Claude reads before every run
|
|
32
|
-
3. **
|
|
33
|
-
4. **
|
|
32
|
+
3. **Writes strategy briefs** — interviews you (or runs a devil's advocate AI-grill in AFK mode), decomposes work into vertical slices with HITL/AFK classification, and creates board tickets with blocking dependencies
|
|
33
|
+
4. **Plans tickets** — fetches backlog tickets, explores the codebase, and generates structured implementation plans posted as comments for human review
|
|
34
|
+
5. **Runs autonomously** — picking one ticket per loop from your Kanban board (skipping blocked candidates), implementing it, committing, and creating a PR (targeting an epic branch for parented tickets, or the base branch for standalone tickets)
|
|
34
35
|
|
|
35
|
-
One ticket per run. Fresh context window every iteration. No context rot.
|
|
36
|
+
Brief → approve → plan → implement. One ticket per run. Fresh context window every iteration. No context rot.
|
|
36
37
|
|
|
37
38
|
---
|
|
38
39
|
|
|
@@ -63,7 +64,7 @@ Clancy is powerful but not magic. Here's what to expect:
|
|
|
63
64
|
|
|
64
65
|
**Ticket quality matters more than you think.** A vague ticket produces vague implementation. Clancy works best when tickets have a clear summary, a description that explains the _why_, and concrete acceptance criteria. Use `/clancy:review` to score a ticket before running — it'll tell you exactly what's missing.
|
|
65
66
|
|
|
66
|
-
**You still own the code.**
|
|
67
|
+
**You still own the code.** Clancy pushes a feature branch and creates a pull request for every ticket — targeting an epic branch for parented tickets, or the base branch for standalone ones. When all children of an epic are done, Clancy creates a final PR from the epic branch to your base branch. Either way, treat it like code from a junior developer who works very fast — it needs a sanity check, not a full rewrite.
|
|
67
68
|
|
|
68
69
|
**Some tickets will need a retry.** If Claude gets stuck or produces something obviously wrong, delete the branch and run `/clancy:once` again. Fresh context, fresh attempt. If it fails twice on the same ticket, the ticket probably needs more detail.
|
|
69
70
|
|
|
@@ -149,6 +150,8 @@ npx chief-clancy
|
|
|
149
150
|
|
|
150
151
|
| Command | Description |
|
|
151
152
|
| ---------------------- | ------------------------------------------------------------------------ |
|
|
153
|
+
| `/clancy:brief` ² | Grill phase → strategy brief → vertical slice decomposition → tickets |
|
|
154
|
+
| `/clancy:approve-brief` ² | Review and approve a strategy brief, then create board tickets |
|
|
152
155
|
| `/clancy:plan` ¹ | Refine backlog tickets into structured implementation plans |
|
|
153
156
|
| `/clancy:plan 3` ¹ | Plan up to 3 tickets in batch mode |
|
|
154
157
|
| `/clancy:approve-plan` ¹ | Promote an approved plan to the ticket description |
|
|
@@ -169,6 +172,7 @@ npx chief-clancy
|
|
|
169
172
|
| `/clancy:help` | Command reference |
|
|
170
173
|
|
|
171
174
|
¹ Planner is an optional role — see [Roles](#roles) below.
|
|
175
|
+
² Strategist is an optional role — see [Roles](#roles) below.
|
|
172
176
|
|
|
173
177
|
---
|
|
174
178
|
|
|
@@ -182,12 +186,13 @@ Clancy organises its commands into **roles** — each role handles a different s
|
|
|
182
186
|
| **Reviewer** | Score ticket readiness and track progress | `/clancy:review`, `/clancy:status`, `/clancy:logs` |
|
|
183
187
|
| **Setup** | Configure and maintain Clancy | `/clancy:init`, `/clancy:settings`, `/clancy:doctor`, etc. |
|
|
184
188
|
| **Planner** *(optional)* | Refine backlog tickets into structured implementation plans | `/clancy:plan`, `/clancy:approve-plan` |
|
|
189
|
+
| **Strategist** *(optional)* | Grill → brief → vertical slices → board tickets | `/clancy:brief`, `/clancy:approve-brief` |
|
|
185
190
|
|
|
186
|
-
**Core roles** (Implementer, Reviewer, Setup) are always installed. **Optional roles** (Planner) are opt-in — add them to `CLANCY_ROLES` in `.clancy/.env` and re-run the installer:
|
|
191
|
+
**Core roles** (Implementer, Reviewer, Setup) are always installed. **Optional roles** (Planner, Strategist) are opt-in — add them to `CLANCY_ROLES` in `.clancy/.env` and re-run the installer:
|
|
187
192
|
|
|
188
193
|
```bash
|
|
189
|
-
# Enable
|
|
190
|
-
echo 'CLANCY_ROLES="planner"' >> .clancy/.env
|
|
194
|
+
# Enable optional roles
|
|
195
|
+
echo 'CLANCY_ROLES="planner,strategist"' >> .clancy/.env
|
|
191
196
|
npx chief-clancy@latest --local # or --global
|
|
192
197
|
```
|
|
193
198
|
|
|
@@ -199,6 +204,9 @@ Each role has detailed documentation:
|
|
|
199
204
|
- [Reviewer](docs/roles/REVIEWER.md) — scores ticket readiness, tracks progress
|
|
200
205
|
- [Setup & Maintenance](docs/roles/SETUP.md) — init wizard, settings, diagnostics, codebase mapping
|
|
201
206
|
- [Planner](docs/roles/PLANNER.md) — refines backlog tickets into structured implementation plans
|
|
207
|
+
- [Strategist](docs/roles/STRATEGIST.md) — grill phase, strategy briefs, vertical slice decomposition, board ticket creation
|
|
208
|
+
|
|
209
|
+
For a visual overview of how roles, commands, and flows connect, see the [Visual Architecture](docs/VISUAL-ARCHITECTURE.md) diagrams.
|
|
202
210
|
|
|
203
211
|
---
|
|
204
212
|
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{spawnSync as k}from"node:child_process";import{existsSync as h}from"node:fs";import{dirname as w,join as T,resolve as y}from"node:path";import{setTimeout as S}from"node:timers/promises";import{fileURLToPath as g}from"node:url";function c(o){let t=Math.floor(o/1e3);if(t<60)return`${t}s`;let r=Math.floor(t/60),s=t%60;return s>0?`${r}m ${s}s`:`${r}m`}var e=o=>`\x1B[2m${o}\x1B[0m`,a=o=>`\x1B[1m${o}\x1B[0m`;var u=o=>`\x1B[32m${o}\x1B[0m`,p=o=>`\x1B[31m${o}\x1B[0m`;var m={noTickets:/No tickets found|No issues found|All done/,skipped:/Ticket skipped/,preflightFail:/^✗ /m};function
|
|
2
|
-
${f.reason}`),console.log(e(` Total: ${n} iteration${n>1?"s":""} in ${b}`));return}console.log(e(` Iteration ${n} took ${d}`)),n<t&&await S(2e3)}let $=c(Date.now()-s);console.log(""),console.log(u(`\u{1F3C1} Completed ${t} iterations`)+e(` (${$})`)),console.log(e(` "That's some good police work."`)),console.log(e(" Run clancy-afk again to continue."))}if(process.argv[1]&&g(import.meta.url)===y(process.argv[1])){let o=w(g(import.meta.url)),t=parseInt(process.env.MAX_ITERATIONS??"5",10)||5;
|
|
1
|
+
import{spawnSync as k}from"node:child_process";import{existsSync as h}from"node:fs";import{dirname as w,join as T,resolve as y}from"node:path";import{setTimeout as S}from"node:timers/promises";import{fileURLToPath as g}from"node:url";function c(o){let t=Math.floor(o/1e3);if(t<60)return`${t}s`;let r=Math.floor(t/60),s=t%60;return s>0?`${r}m ${s}s`:`${r}m`}var e=o=>`\x1B[2m${o}\x1B[0m`,a=o=>`\x1B[1m${o}\x1B[0m`;var u=o=>`\x1B[32m${o}\x1B[0m`,p=o=>`\x1B[31m${o}\x1B[0m`;var m={noTickets:/No tickets found|No issues found|All done/,skipped:/Ticket skipped/,preflightFail:/^✗ /m};function A(o){return m.noTickets.test(o)?{stop:!0,reason:"No more tickets \u2014 all done"}:m.skipped.test(o)?{stop:!0,reason:"Ticket was skipped \u2014 update the ticket and re-run"}:m.preflightFail.test(o)?{stop:!0,reason:"Preflight check failed"}:{stop:!1}}async function D(o,t=5){let r=T(o,"clancy-once.js");if(!h(r)){console.error(p("\u2717 clancy-once.js not found in"),o);return}console.log(e("\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510")),console.log(e("\u2502")+a(" \u{1F916} Clancy \u2014 AFK mode ")+e("\u2502")),console.log(e("\u2502")+e(` "I'm on it. Proceed to the abandoned warehouse." `)+e("\u2502")),console.log(e("\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518"));let s=Date.now();for(let n=1;n<=t;n++){let x=Date.now();console.log(""),console.log(a(`\u{1F501} Iteration ${n}/${t}`));let i=k("node",[r],{encoding:"utf8",stdio:["inherit","pipe","inherit"],cwd:process.cwd(),env:{...process.env,CLANCY_AFK_MODE:"1"}}),l=i.stdout??"";l&&process.stdout.write(l);let d=c(Date.now()-x);if(i.error){console.error(p(`\u2717 Failed to run clancy-once: ${i.error.message}`));return}let f=A(l);if(f.stop){let b=c(Date.now()-s);console.log(""),console.log(e(` Iteration ${n} took ${d}`)),console.log(`
|
|
2
|
+
${f.reason}`),console.log(e(` Total: ${n} iteration${n>1?"s":""} in ${b}`));return}console.log(e(` Iteration ${n} took ${d}`)),n<t&&await S(2e3)}let $=c(Date.now()-s);console.log(""),console.log(u(`\u{1F3C1} Completed ${t} iterations`)+e(` (${$})`)),console.log(e(` "That's some good police work."`)),console.log(e(" Run clancy-afk again to continue."))}if(process.argv[1]&&g(import.meta.url)===y(process.argv[1])){let o=w(g(import.meta.url)),t=parseInt(process.env.MAX_ITERATIONS??"5",10)||5;D(o,t)}export{A as checkStopCondition,D as runAfkLoop};
|