chief-clancy 0.5.3 → 0.5.4

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 (72) hide show
  1. package/README.md +3 -3
  2. package/dist/bundle/clancy-afk.js +2 -2
  3. package/dist/bundle/clancy-once.js +29 -28
  4. package/dist/schemas/env.d.ts +27 -0
  5. package/dist/schemas/env.d.ts.map +1 -1
  6. package/dist/schemas/env.js +8 -0
  7. package/dist/schemas/env.js.map +1 -1
  8. package/dist/scripts/afk/afk.d.ts.map +1 -1
  9. package/dist/scripts/afk/afk.js +1 -8
  10. package/dist/scripts/afk/afk.js.map +1 -1
  11. package/dist/scripts/board/github/github.d.ts.map +1 -1
  12. package/dist/scripts/board/github/github.js +1 -2
  13. package/dist/scripts/board/github/github.js.map +1 -1
  14. package/dist/scripts/board/linear/linear.d.ts.map +1 -1
  15. package/dist/scripts/board/linear/linear.js +35 -4
  16. package/dist/scripts/board/linear/linear.js.map +1 -1
  17. package/dist/scripts/once/once.d.ts.map +1 -1
  18. package/dist/scripts/once/once.js +205 -35
  19. package/dist/scripts/once/once.js.map +1 -1
  20. package/dist/scripts/shared/env-schema/env-schema.d.ts.map +1 -1
  21. package/dist/scripts/shared/env-schema/env-schema.js +3 -2
  22. package/dist/scripts/shared/env-schema/env-schema.js.map +1 -1
  23. package/dist/scripts/shared/format/format.d.ts +11 -0
  24. package/dist/scripts/shared/format/format.d.ts.map +1 -0
  25. package/dist/scripts/shared/format/format.js +18 -0
  26. package/dist/scripts/shared/format/format.js.map +1 -0
  27. package/dist/scripts/shared/git-ops/git-ops.d.ts +9 -0
  28. package/dist/scripts/shared/git-ops/git-ops.d.ts.map +1 -1
  29. package/dist/scripts/shared/git-ops/git-ops.js +20 -0
  30. package/dist/scripts/shared/git-ops/git-ops.js.map +1 -1
  31. package/dist/scripts/shared/http/http.d.ts +2 -0
  32. package/dist/scripts/shared/http/http.d.ts.map +1 -1
  33. package/dist/scripts/shared/http/http.js +2 -0
  34. package/dist/scripts/shared/http/http.js.map +1 -1
  35. package/dist/scripts/shared/progress/progress.d.ts +3 -2
  36. package/dist/scripts/shared/progress/progress.d.ts.map +1 -1
  37. package/dist/scripts/shared/progress/progress.js +1 -1
  38. package/dist/scripts/shared/progress/progress.js.map +1 -1
  39. package/dist/scripts/shared/pull-request/bitbucket/bitbucket.d.ts +38 -0
  40. package/dist/scripts/shared/pull-request/bitbucket/bitbucket.d.ts.map +1 -0
  41. package/dist/scripts/shared/pull-request/bitbucket/bitbucket.js +69 -0
  42. package/dist/scripts/shared/pull-request/bitbucket/bitbucket.js.map +1 -0
  43. package/dist/scripts/shared/pull-request/github/github.d.ts +15 -0
  44. package/dist/scripts/shared/pull-request/github/github.d.ts.map +1 -0
  45. package/dist/scripts/shared/pull-request/github/github.js +29 -0
  46. package/dist/scripts/shared/pull-request/github/github.js.map +1 -0
  47. package/dist/scripts/shared/pull-request/gitlab/gitlab.d.ts +23 -0
  48. package/dist/scripts/shared/pull-request/gitlab/gitlab.d.ts.map +1 -0
  49. package/dist/scripts/shared/pull-request/gitlab/gitlab.js +27 -0
  50. package/dist/scripts/shared/pull-request/gitlab/gitlab.js.map +1 -0
  51. package/dist/scripts/shared/pull-request/post-pr/post-pr.d.ts +31 -0
  52. package/dist/scripts/shared/pull-request/post-pr/post-pr.d.ts.map +1 -0
  53. package/dist/scripts/shared/pull-request/post-pr/post-pr.js +61 -0
  54. package/dist/scripts/shared/pull-request/post-pr/post-pr.js.map +1 -0
  55. package/dist/scripts/shared/pull-request/pr-body/pr-body.d.ts +19 -0
  56. package/dist/scripts/shared/pull-request/pr-body/pr-body.d.ts.map +1 -0
  57. package/dist/scripts/shared/pull-request/pr-body/pr-body.js +35 -0
  58. package/dist/scripts/shared/pull-request/pr-body/pr-body.js.map +1 -0
  59. package/dist/scripts/shared/remote/remote.d.ts +41 -0
  60. package/dist/scripts/shared/remote/remote.d.ts.map +1 -0
  61. package/dist/scripts/shared/remote/remote.js +227 -0
  62. package/dist/scripts/shared/remote/remote.js.map +1 -0
  63. package/dist/types/index.d.ts +1 -0
  64. package/dist/types/index.d.ts.map +1 -1
  65. package/dist/types/remote.d.ts +44 -0
  66. package/dist/types/remote.d.ts.map +1 -0
  67. package/dist/types/remote.js +5 -0
  68. package/dist/types/remote.js.map +1 -0
  69. package/package.json +1 -1
  70. package/src/roles/setup/workflows/init.md +91 -0
  71. package/src/roles/setup/workflows/scaffold.md +27 -0
  72. package/src/roles/setup/workflows/settings.md +62 -0
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  **Autonomous, board-driven development for Claude Code.**
4
4
 
5
- [![npm](https://img.shields.io/npm/v/chief-clancy?style=for-the-badge&color=cb3837)](https://www.npmjs.com/package/chief-clancy) [![License: MIT](https://img.shields.io/badge/License-MIT-blue?style=for-the-badge)](./LICENSE) [![Tests](https://img.shields.io/badge/tests-167%20passing-brightgreen?style=for-the-badge)](docs/TESTING.md) [![GitHub Stars](https://img.shields.io/github/stars/Pushedskydiver/clancy?style=for-the-badge)](https://github.com/Pushedskydiver/clancy/stargazers)
5
+ [![npm](https://img.shields.io/npm/v/chief-clancy?style=for-the-badge&color=cb3837)](https://www.npmjs.com/package/chief-clancy) [![License: MIT](https://img.shields.io/badge/License-MIT-blue?style=for-the-badge)](./LICENSE) [![Tests](https://img.shields.io/badge/tests-270%20passing-brightgreen?style=for-the-badge)](docs/TESTING.md) [![GitHub Stars](https://img.shields.io/github/stars/Pushedskydiver/clancy?style=for-the-badge)](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).
@@ -30,7 +30,7 @@ Clancy does four things:
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
32
  3. **Plans tickets** — fetches backlog tickets, explores the codebase, and generates structured implementation plans posted as comments for human review
33
- 4. **Runs autonomously** — picking one ticket per loop from your Kanban board, implementing it, committing, squash-merging, and logging progress
33
+ 4. **Runs autonomously** — picking one ticket per loop from your Kanban board, implementing it, committing, and either squash-merging (epic flow) or pushing and creating a PR (standalone ticket flow)
34
34
 
35
35
  One ticket per run. Fresh context window every iteration. No context rot.
36
36
 
@@ -63,7 +63,7 @@ Clancy is powerful but not magic. Here's what to expect:
63
63
 
64
64
  **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
65
 
66
- **You still own the code.** Clancy commits and merges locally, but it never pushes to remote. Review the squash commit before pushing. Treat it like code from a junior developer who works very fast — it needs a sanity check, not a full rewrite.
66
+ **You still own the code.** When a ticket has a parent epic, Clancy squash-merges locally review the commit before pushing. When a ticket has no parent, Clancy pushes the feature branch and creates a pull request for you to review. Either way, treat it like code from a junior developer who works very fast — it needs a sanity check, not a full rewrite.
67
67
 
68
68
  **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
69
 
@@ -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";var e=o=>`\x1B[2m${o}\x1B[0m`,l=o=>`\x1B[1m${o}\x1B[0m`;var u=o=>`\x1B[32m${o}\x1B[0m`,a=o=>`\x1B[31m${o}\x1B[0m`;function p(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 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(a("\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")+l(" \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(l(`\u{1F501} Iteration ${n}/${t}`));let c=k("node",[r],{encoding:"utf8",stdio:["inherit","pipe","inherit"],cwd:process.cwd()}),i=c.stdout??"";i&&process.stdout.write(i);let d=p(Date.now()-x);if(c.error){console.error(a(`\u2717 Failed to run clancy-once: ${c.error.message}`));return}let f=A(i);if(f.stop){let b=p(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 $=p(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};
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 D(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 A(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()}),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=D(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;A(o,t)}export{D as checkStopCondition,A as runAfkLoop};