@protoboxai/codeloop 0.3.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 (290) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +589 -0
  3. package/dist/commands/adopt.d.ts +2 -0
  4. package/dist/commands/adopt.js +26 -0
  5. package/dist/commands/adopt.js.map +1 -0
  6. package/dist/commands/brief.d.ts +2 -0
  7. package/dist/commands/brief.js +22 -0
  8. package/dist/commands/brief.js.map +1 -0
  9. package/dist/commands/card.d.ts +6 -0
  10. package/dist/commands/card.js +159 -0
  11. package/dist/commands/card.js.map +1 -0
  12. package/dist/commands/check.d.ts +4 -0
  13. package/dist/commands/check.js +76 -0
  14. package/dist/commands/check.js.map +1 -0
  15. package/dist/commands/cloud.d.ts +8 -0
  16. package/dist/commands/cloud.js +123 -0
  17. package/dist/commands/cloud.js.map +1 -0
  18. package/dist/commands/guard.d.ts +2 -0
  19. package/dist/commands/guard.js +26 -0
  20. package/dist/commands/guard.js.map +1 -0
  21. package/dist/commands/import.d.ts +2 -0
  22. package/dist/commands/import.js +24 -0
  23. package/dist/commands/import.js.map +1 -0
  24. package/dist/commands/inbox.d.ts +2 -0
  25. package/dist/commands/inbox.js +48 -0
  26. package/dist/commands/inbox.js.map +1 -0
  27. package/dist/commands/init.d.ts +2 -0
  28. package/dist/commands/init.js +142 -0
  29. package/dist/commands/init.js.map +1 -0
  30. package/dist/commands/install.d.ts +2 -0
  31. package/dist/commands/install.js +125 -0
  32. package/dist/commands/install.js.map +1 -0
  33. package/dist/commands/lane.d.ts +2 -0
  34. package/dist/commands/lane.js +100 -0
  35. package/dist/commands/lane.js.map +1 -0
  36. package/dist/commands/list.d.ts +2 -0
  37. package/dist/commands/list.js +35 -0
  38. package/dist/commands/list.js.map +1 -0
  39. package/dist/commands/login.d.ts +2 -0
  40. package/dist/commands/login.js +77 -0
  41. package/dist/commands/login.js.map +1 -0
  42. package/dist/commands/mock.d.ts +3 -0
  43. package/dist/commands/mock.js +22 -0
  44. package/dist/commands/mock.js.map +1 -0
  45. package/dist/commands/pack.d.ts +2 -0
  46. package/dist/commands/pack.js +19 -0
  47. package/dist/commands/pack.js.map +1 -0
  48. package/dist/commands/publish.d.ts +2 -0
  49. package/dist/commands/publish.js +125 -0
  50. package/dist/commands/publish.js.map +1 -0
  51. package/dist/commands/remove.d.ts +2 -0
  52. package/dist/commands/remove.js +31 -0
  53. package/dist/commands/remove.js.map +1 -0
  54. package/dist/commands/render.d.ts +5 -0
  55. package/dist/commands/render.js +47 -0
  56. package/dist/commands/render.js.map +1 -0
  57. package/dist/commands/run.d.ts +2 -0
  58. package/dist/commands/run.js +45 -0
  59. package/dist/commands/run.js.map +1 -0
  60. package/dist/commands/scan.d.ts +2 -0
  61. package/dist/commands/scan.js +26 -0
  62. package/dist/commands/scan.js.map +1 -0
  63. package/dist/commands/schedule.d.ts +2 -0
  64. package/dist/commands/schedule.js +51 -0
  65. package/dist/commands/schedule.js.map +1 -0
  66. package/dist/commands/search.d.ts +2 -0
  67. package/dist/commands/search.js +85 -0
  68. package/dist/commands/search.js.map +1 -0
  69. package/dist/commands/serve.d.ts +7 -0
  70. package/dist/commands/serve.js +126 -0
  71. package/dist/commands/serve.js.map +1 -0
  72. package/dist/commands/spec.d.ts +3 -0
  73. package/dist/commands/spec.js +64 -0
  74. package/dist/commands/spec.js.map +1 -0
  75. package/dist/commands/status.d.ts +3 -0
  76. package/dist/commands/status.js +251 -0
  77. package/dist/commands/status.js.map +1 -0
  78. package/dist/commands/update.d.ts +2 -0
  79. package/dist/commands/update.js +83 -0
  80. package/dist/commands/update.js.map +1 -0
  81. package/dist/commands/verify.d.ts +3 -0
  82. package/dist/commands/verify.js +75 -0
  83. package/dist/commands/verify.js.map +1 -0
  84. package/dist/commands/watch.d.ts +6 -0
  85. package/dist/commands/watch.js +111 -0
  86. package/dist/commands/watch.js.map +1 -0
  87. package/dist/commands/wiki.d.ts +3 -0
  88. package/dist/commands/wiki.js +85 -0
  89. package/dist/commands/wiki.js.map +1 -0
  90. package/dist/index.d.ts +2 -0
  91. package/dist/index.js +86 -0
  92. package/dist/index.js.map +1 -0
  93. package/dist/lib/agent.d.ts +27 -0
  94. package/dist/lib/agent.js +178 -0
  95. package/dist/lib/agent.js.map +1 -0
  96. package/dist/lib/board.d.ts +38 -0
  97. package/dist/lib/board.js +86 -0
  98. package/dist/lib/board.js.map +1 -0
  99. package/dist/lib/cards.d.ts +82 -0
  100. package/dist/lib/cards.js +107 -0
  101. package/dist/lib/cards.js.map +1 -0
  102. package/dist/lib/clock.d.ts +5 -0
  103. package/dist/lib/clock.js +14 -0
  104. package/dist/lib/clock.js.map +1 -0
  105. package/dist/lib/cloud.d.ts +122 -0
  106. package/dist/lib/cloud.js +580 -0
  107. package/dist/lib/cloud.js.map +1 -0
  108. package/dist/lib/competitors.d.ts +28 -0
  109. package/dist/lib/competitors.js +90 -0
  110. package/dist/lib/competitors.js.map +1 -0
  111. package/dist/lib/config.d.ts +7 -0
  112. package/dist/lib/config.js +25 -0
  113. package/dist/lib/config.js.map +1 -0
  114. package/dist/lib/cron.d.ts +5 -0
  115. package/dist/lib/cron.js +82 -0
  116. package/dist/lib/cron.js.map +1 -0
  117. package/dist/lib/detect.d.ts +13 -0
  118. package/dist/lib/detect.js +60 -0
  119. package/dist/lib/detect.js.map +1 -0
  120. package/dist/lib/engine.d.ts +88 -0
  121. package/dist/lib/engine.js +435 -0
  122. package/dist/lib/engine.js.map +1 -0
  123. package/dist/lib/flow.d.ts +44 -0
  124. package/dist/lib/flow.js +121 -0
  125. package/dist/lib/flow.js.map +1 -0
  126. package/dist/lib/glob.d.ts +2 -0
  127. package/dist/lib/glob.js +10 -0
  128. package/dist/lib/glob.js.map +1 -0
  129. package/dist/lib/import.d.ts +13 -0
  130. package/dist/lib/import.js +127 -0
  131. package/dist/lib/import.js.map +1 -0
  132. package/dist/lib/inbox.d.ts +42 -0
  133. package/dist/lib/inbox.js +65 -0
  134. package/dist/lib/inbox.js.map +1 -0
  135. package/dist/lib/lane.d.ts +71 -0
  136. package/dist/lib/lane.js +105 -0
  137. package/dist/lib/lane.js.map +1 -0
  138. package/dist/lib/lock.d.ts +6 -0
  139. package/dist/lib/lock.js +64 -0
  140. package/dist/lib/lock.js.map +1 -0
  141. package/dist/lib/mcp.d.ts +2 -0
  142. package/dist/lib/mcp.js +57 -0
  143. package/dist/lib/mcp.js.map +1 -0
  144. package/dist/lib/mock.d.ts +17 -0
  145. package/dist/lib/mock.js +137 -0
  146. package/dist/lib/mock.js.map +1 -0
  147. package/dist/lib/pack.d.ts +24 -0
  148. package/dist/lib/pack.js +77 -0
  149. package/dist/lib/pack.js.map +1 -0
  150. package/dist/lib/proposals.d.ts +48 -0
  151. package/dist/lib/proposals.js +240 -0
  152. package/dist/lib/proposals.js.map +1 -0
  153. package/dist/lib/render.d.ts +7 -0
  154. package/dist/lib/render.js +84 -0
  155. package/dist/lib/render.js.map +1 -0
  156. package/dist/lib/research.d.ts +8 -0
  157. package/dist/lib/research.js +39 -0
  158. package/dist/lib/research.js.map +1 -0
  159. package/dist/lib/run.d.ts +38 -0
  160. package/dist/lib/run.js +215 -0
  161. package/dist/lib/run.js.map +1 -0
  162. package/dist/lib/scaffold.d.ts +16 -0
  163. package/dist/lib/scaffold.js +175 -0
  164. package/dist/lib/scaffold.js.map +1 -0
  165. package/dist/lib/scan.d.ts +22 -0
  166. package/dist/lib/scan.js +85 -0
  167. package/dist/lib/scan.js.map +1 -0
  168. package/dist/lib/schedule.d.ts +20 -0
  169. package/dist/lib/schedule.js +66 -0
  170. package/dist/lib/schedule.js.map +1 -0
  171. package/dist/lib/server.d.ts +68 -0
  172. package/dist/lib/server.js +235 -0
  173. package/dist/lib/server.js.map +1 -0
  174. package/dist/lib/shell.d.ts +1 -0
  175. package/dist/lib/shell.js +25 -0
  176. package/dist/lib/shell.js.map +1 -0
  177. package/dist/lib/skills.d.ts +20 -0
  178. package/dist/lib/skills.js +92 -0
  179. package/dist/lib/skills.js.map +1 -0
  180. package/dist/lib/spec.d.ts +24 -0
  181. package/dist/lib/spec.js +102 -0
  182. package/dist/lib/spec.js.map +1 -0
  183. package/dist/lib/stats.d.ts +13 -0
  184. package/dist/lib/stats.js +43 -0
  185. package/dist/lib/stats.js.map +1 -0
  186. package/dist/lib/verify.d.ts +25 -0
  187. package/dist/lib/verify.js +135 -0
  188. package/dist/lib/verify.js.map +1 -0
  189. package/dist/lib/version.d.ts +10 -0
  190. package/dist/lib/version.js +27 -0
  191. package/dist/lib/version.js.map +1 -0
  192. package/dist/lib/wiki.d.ts +51 -0
  193. package/dist/lib/wiki.js +164 -0
  194. package/dist/lib/wiki.js.map +1 -0
  195. package/dist/registry/index.d.ts +7 -0
  196. package/dist/registry/index.js +8 -0
  197. package/dist/registry/index.js.map +1 -0
  198. package/dist/registry/installer.d.ts +30 -0
  199. package/dist/registry/installer.js +133 -0
  200. package/dist/registry/installer.js.map +1 -0
  201. package/dist/registry/local-index.d.ts +32 -0
  202. package/dist/registry/local-index.js +58 -0
  203. package/dist/registry/local-index.js.map +1 -0
  204. package/dist/registry/lockfile.d.ts +40 -0
  205. package/dist/registry/lockfile.js +85 -0
  206. package/dist/registry/lockfile.js.map +1 -0
  207. package/dist/registry/security.d.ts +25 -0
  208. package/dist/registry/security.js +100 -0
  209. package/dist/registry/security.js.map +1 -0
  210. package/dist/registry/skill-schema.d.ts +30 -0
  211. package/dist/registry/skill-schema.js +95 -0
  212. package/dist/registry/skill-schema.js.map +1 -0
  213. package/dist/ui/404.html +1 -0
  214. package/dist/ui/_next/static/6wzGE5sCtbYkSyhMWxL32/_buildManifest.js +1 -0
  215. package/dist/ui/_next/static/6wzGE5sCtbYkSyhMWxL32/_ssgManifest.js +1 -0
  216. package/dist/ui/_next/static/chunks/255-54d3085ce94738a4.js +1 -0
  217. package/dist/ui/_next/static/chunks/423-bb541b7ae2733575.js +1 -0
  218. package/dist/ui/_next/static/chunks/4bd1b696-c023c6e3521b1417.js +1 -0
  219. package/dist/ui/_next/static/chunks/app/_not-found/page-d6bc774f7acb716e.js +1 -0
  220. package/dist/ui/_next/static/chunks/app/layout-e5fc8e78e1c8da95.js +1 -0
  221. package/dist/ui/_next/static/chunks/app/page-0c34b6e119cef236.js +1 -0
  222. package/dist/ui/_next/static/chunks/framework-de98b93a850cfc71.js +1 -0
  223. package/dist/ui/_next/static/chunks/main-49fd204fc9037ea3.js +1 -0
  224. package/dist/ui/_next/static/chunks/main-app-c46afa2f48f3aaef.js +1 -0
  225. package/dist/ui/_next/static/chunks/pages/_app-7d307437aca18ad4.js +1 -0
  226. package/dist/ui/_next/static/chunks/pages/_error-cb2a52f75f2162e2.js +1 -0
  227. package/dist/ui/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  228. package/dist/ui/_next/static/chunks/webpack-4a462cecab786e93.js +1 -0
  229. package/dist/ui/_next/static/css/1bf01240dbfd6088.css +1 -0
  230. package/dist/ui/index.html +1 -0
  231. package/dist/ui/index.txt +19 -0
  232. package/dist/watch/index.d.ts +21 -0
  233. package/dist/watch/index.js +88 -0
  234. package/dist/watch/index.js.map +1 -0
  235. package/dist/watch/reporter.d.ts +11 -0
  236. package/dist/watch/reporter.js +44 -0
  237. package/dist/watch/reporter.js.map +1 -0
  238. package/dist/watch/signals.d.ts +38 -0
  239. package/dist/watch/signals.js +119 -0
  240. package/dist/watch/signals.js.map +1 -0
  241. package/dist/watch/triggers.d.ts +10 -0
  242. package/dist/watch/triggers.js +67 -0
  243. package/dist/watch/triggers.js.map +1 -0
  244. package/package.json +64 -0
  245. package/registry/index.json +106 -0
  246. package/starters/generic.yaml +95 -0
  247. package/starters/go.yaml +99 -0
  248. package/starters/node-typescript.yaml +108 -0
  249. package/starters/python.yaml +105 -0
  250. package/templates/ci/codeloop-pr.yml +29 -0
  251. package/templates/ci/codeloop-prod.yml +27 -0
  252. package/templates/ci/codeloop-staging.yml +34 -0
  253. package/templates/codeloop/board.json +5 -0
  254. package/templates/codeloop/gotchas.md +13 -0
  255. package/templates/codeloop/patterns.md +15 -0
  256. package/templates/codeloop/principles.md +49 -0
  257. package/templates/codeloop/rules.md +23 -0
  258. package/templates/commands/commit.md +255 -0
  259. package/templates/commands/debug.md +142 -0
  260. package/templates/commands/deploy.md +144 -0
  261. package/templates/commands/design.md +102 -0
  262. package/templates/commands/manage.md +77 -0
  263. package/templates/commands/plan.md +84 -0
  264. package/templates/commands/qa.md +155 -0
  265. package/templates/commands/reflect.md +93 -0
  266. package/templates/commands/ship.md +187 -0
  267. package/templates/commands/test.md +133 -0
  268. package/templates/hooks/commit-msg +8 -0
  269. package/templates/lanes/analyze.yaml +25 -0
  270. package/templates/lanes/build.yaml +45 -0
  271. package/templates/lanes/deploy.yaml +24 -0
  272. package/templates/lanes/learn.yaml +20 -0
  273. package/templates/lanes/market.yaml +25 -0
  274. package/templates/lanes/plan.yaml +24 -0
  275. package/templates/lanes/scan.yaml +11 -0
  276. package/templates/lanes/triage.yaml +24 -0
  277. package/templates/mock/template.html +82 -0
  278. package/templates/seeds/go-gotchas.md +28 -0
  279. package/templates/seeds/go-patterns.md +22 -0
  280. package/templates/seeds/node-typescript-gotchas.md +30 -0
  281. package/templates/seeds/node-typescript-patterns.md +27 -0
  282. package/templates/seeds/python-gotchas.md +30 -0
  283. package/templates/seeds/python-patterns.md +19 -0
  284. package/templates/seeds/universal-gotchas.md +11 -0
  285. package/templates/seeds/universal-patterns.md +11 -0
  286. package/templates/spec/plan.md +7 -0
  287. package/templates/spec/research.md +19 -0
  288. package/templates/spec/spec.md +14 -0
  289. package/templates/spec/tasks.md +10 -0
  290. package/templates/tasks/todo.md +3 -0
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare const briefCommand: Command;
@@ -0,0 +1,22 @@
1
+ import { Command } from 'commander';
2
+ import { mkdirSync, writeFileSync } from 'fs';
3
+ import { dirname, resolve } from 'path';
4
+ import { buildBrief } from '../lib/agent.js';
5
+ import { findCard, readCards } from '../lib/cards.js';
6
+ import { guard } from './guard.js';
7
+ export const briefCommand = new Command('brief')
8
+ .description("Print what an agent is given to do a card's current stage: skill, output, check, feedback, wiki pages, rules")
9
+ .argument('<card>')
10
+ .option('--out <file>', 'Write the brief to a file')
11
+ .action(guard((id, opts) => {
12
+ const projectDir = process.cwd();
13
+ const brief = buildBrief(projectDir, findCard(readCards(projectDir).cards, id));
14
+ if (!opts.out) {
15
+ process.stdout.write(brief);
16
+ return;
17
+ }
18
+ mkdirSync(dirname(resolve(opts.out)), { recursive: true });
19
+ writeFileSync(opts.out, brief);
20
+ console.log(` wrote ${opts.out}`);
21
+ }));
22
+ //# sourceMappingURL=brief.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brief.js","sourceRoot":"","sources":["../../src/commands/brief.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,8GAA8G,CAAC;KAC3H,QAAQ,CAAC,QAAQ,CAAC;KAClB,MAAM,CAAC,cAAc,EAAE,2BAA2B,CAAC;KACnD,MAAM,CAAC,KAAK,CAAC,CAAC,EAAU,EAAE,IAAsB,EAAE,EAAE;IACnD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,UAAU,CAAC,UAAU,EAAE,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;IAChF,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5B,OAAO;IACT,CAAC;IACD,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { Command } from 'commander';
2
+ export declare const cardCommand: Command;
3
+ export declare const startCommand: Command;
4
+ export declare const nextCommand: Command;
5
+ export declare const approveCommand: Command;
6
+ export declare const rejectCommand: Command;
@@ -0,0 +1,159 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { DONE, DROPPED, findCard, inLane, readCards, RefusalError } from '../lib/cards.js';
4
+ import { advanceCard, proposeCard, rejectCard, resolveRole } from '../lib/engine.js';
5
+ import { approveFlow, describeAdvance, nextHint, stageBrief, startCard } from '../lib/flow.js';
6
+ import { guard } from './guard.js';
7
+ function line(card) {
8
+ const state = card.gate ? chalk.yellow(`waiting for you: ${card.gate}`) : card.stage === DONE ? chalk.green('done') : card.stage;
9
+ return ` ${card.id} ${card.lane.padEnd(8)} ${state} ${chalk.dim(card.title)}`;
10
+ }
11
+ function print(result) {
12
+ result.lines.forEach(l => console.log(l.startsWith('Next:') ? chalk.cyan(l) : l));
13
+ if (result.exitCode)
14
+ process.exit(result.exitCode);
15
+ }
16
+ const start = (lane, title, opts) => {
17
+ const projectDir = process.cwd();
18
+ const card = startCard(projectDir, { lane, title, id: opts.id, role: resolveRole(opts.as) });
19
+ console.log(`created ${card.id} in ${card.lane} at stage ${card.stage}${card.spec ? ` (${card.spec}/)` : ''}`);
20
+ print({ lines: [nextHint(projectDir, card)], exitCode: 0 });
21
+ };
22
+ const next = (id, opts) => {
23
+ const projectDir = process.cwd();
24
+ let ref = id;
25
+ if (!ref) {
26
+ const active = readCards(projectDir).cards.filter(c => inLane(c) && !c.gate);
27
+ if (active.length !== 1)
28
+ throw new RefusalError(active.length ? `${active.length} cards are active (${active.map(c => c.id).join(', ')}); say which` : 'no active card; `codeloop start "<title>"` creates one');
29
+ ref = active[0].id;
30
+ }
31
+ print(describeAdvance(projectDir, advanceCard(projectDir, ref, { event: opts.event })));
32
+ };
33
+ const approve = (id, opts) => {
34
+ const projectDir = process.cwd();
35
+ const result = approveFlow(projectDir, id, resolveRole(opts.as), opts.note);
36
+ console.log(`${result.card.id} ${result.gate === 'stuck' ? 'can be retried' : result.gate === 'proposal' ? `promoted to ${result.card.lane}/${result.card.stage}` : `gate ${result.gate} approved`}`);
37
+ print(result.advanced ? describeAdvance(projectDir, result.advanced) : { lines: [nextHint(projectDir, result.card)], exitCode: 0 });
38
+ };
39
+ const reject = (id, note, opts) => {
40
+ const projectDir = process.cwd();
41
+ const card = rejectCard(projectDir, id, resolveRole(opts.as), note ?? opts.note ?? '');
42
+ if (card.stage === DROPPED) {
43
+ console.log(`${card.id} dropped; note recorded`);
44
+ return;
45
+ }
46
+ console.log(`${card.id} rejected at ${card.stage}; note recorded`);
47
+ print({ lines: [nextHint(projectDir, card).replace('Next: run', 'Next: redo with')], exitCode: 0 });
48
+ };
49
+ const ROLE = ['--as <role>', 'owner | reviewer | agent (default: owner at a terminal, agent otherwise)'];
50
+ export const cardCommand = new Command('card').description('Create and move cards through a lane');
51
+ cardCommand
52
+ .command('new <lane> <title>')
53
+ .description('Create a card in the first stage of a lane')
54
+ .option('--id <id>', 'Card id (default: next c-NNN)')
55
+ .option(...ROLE)
56
+ .action(guard(start));
57
+ cardCommand
58
+ .command('propose <lane> <title>')
59
+ .description('Propose a card: it waits in the inbox until the owner promotes it with `codeloop approve`, and nothing starts it')
60
+ .option('--description <text>', 'What was seen, for the owner deciding')
61
+ .option('--source <url or path>', 'Where it came from')
62
+ .option(...ROLE)
63
+ .action(guard((lane, title, opts) => {
64
+ const { card, created } = proposeCard(process.cwd(), { lane, title, description: opts.description, source: opts.source, dedupe: opts.source ? `${lane}:${opts.source}:${title}` : undefined, role: resolveRole(opts.as) });
65
+ console.log(created ? `proposed ${card.id} for ${card.lane}: ${card.title}` : `already proposed as ${card.id}`);
66
+ print({ lines: [nextHint(process.cwd(), card)], exitCode: 0 });
67
+ }));
68
+ cardCommand
69
+ .command('show <id>')
70
+ .description('Show a card, its current stage brief and its events')
71
+ .option('--json', 'JSON output')
72
+ .action(guard((id, opts) => {
73
+ const projectDir = process.cwd();
74
+ const card = findCard(readCards(projectDir).cards, id);
75
+ const stage = stageBrief(projectDir, card);
76
+ if (opts.json) {
77
+ console.log(JSON.stringify({ ...card, brief: stage }, null, 2));
78
+ return;
79
+ }
80
+ console.log(line(card));
81
+ if (card.description)
82
+ console.log(card.description.split('\n').map(l => ` ${l}`).join('\n'));
83
+ if (card.source && !card.description?.includes(card.source))
84
+ console.log(` source: ${card.source}`);
85
+ if (stage) {
86
+ if (stage.skill)
87
+ console.log(` skill: ${stage.skill}`);
88
+ if (stage.output)
89
+ console.log(` output: ${stage.output}`);
90
+ if (stage.done)
91
+ console.log(` check: ${stage.done}`);
92
+ for (const note of stage.notes)
93
+ console.log(` note: ${note}`);
94
+ for (const note of stage.rejections)
95
+ console.log(chalk.yellow(` rejected: ${note}`));
96
+ }
97
+ console.log();
98
+ for (const e of card.events) {
99
+ console.log(chalk.dim(` ${e.at} ${e.actor.padEnd(8)} ${e.action}${e.stage ? ` ${e.stage}` : ''}${e.note ? `: ${e.note.split('\n').at(-1)}` : ''}`));
100
+ }
101
+ console.log(chalk.cyan(nextHint(projectDir, card)));
102
+ }));
103
+ cardCommand
104
+ .command('list')
105
+ .description('List cards')
106
+ .option('--json', 'JSON output')
107
+ .action(guard((opts) => {
108
+ const { cards } = readCards(process.cwd());
109
+ if (opts.json)
110
+ console.log(JSON.stringify(cards, null, 2));
111
+ else if (cards.length === 0)
112
+ console.log(' no cards');
113
+ else
114
+ cards.forEach(c => console.log(line(c)));
115
+ }));
116
+ cardCommand
117
+ .command('advance [id]')
118
+ .description("Run the current stage's check and move the card if it passes")
119
+ .option('--event <name>', 'Report the event a stage with `done.event` is waiting for')
120
+ .action(guard(next));
121
+ cardCommand
122
+ .command('approve <id>')
123
+ .description('Approve the gate a card is waiting at, then advance it once')
124
+ .option(...ROLE)
125
+ .option('--note <note>', 'Optional note')
126
+ .action(guard(approve));
127
+ cardCommand
128
+ .command('reject <id> [note]')
129
+ .description('Reject the gate with a note; the card stays in its stage')
130
+ .option('--note <note>', 'What to change')
131
+ .option(...ROLE)
132
+ .action(guard(reject));
133
+ // Short forms of the four commands a person types most.
134
+ export const startCommand = new Command('start')
135
+ .description('Start a card: `codeloop start "<title>"` (same as card new, plus its spec folder)')
136
+ .argument('<title>')
137
+ .option('--lane <lane>', 'Lane to start in', 'build')
138
+ .option('--id <id>', 'Card id (default: next c-NNN)')
139
+ .option(...ROLE)
140
+ .action(guard((title, opts) => start(opts.lane, title, opts)));
141
+ export const nextCommand = new Command('next')
142
+ .description('Run the check for a card and move it on (same as card advance); with one active card the id is optional')
143
+ .argument('[id]')
144
+ .option('--event <name>', 'Report the event a stage with `done.event` is waiting for')
145
+ .action(guard(next));
146
+ export const approveCommand = new Command('approve')
147
+ .description('Approve the gate a card is waiting at (same as card approve)')
148
+ .argument('<id>')
149
+ .option(...ROLE)
150
+ .option('--note <note>', 'Optional note')
151
+ .action(guard(approve));
152
+ export const rejectCommand = new Command('reject')
153
+ .description('Reject with a note: `codeloop reject <id> "<what to change>"`')
154
+ .argument('<id>')
155
+ .argument('[note]')
156
+ .option('--note <note>', 'What to change')
157
+ .option(...ROLE)
158
+ .action(guard(reject));
159
+ //# sourceMappingURL=card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card.js","sourceRoot":"","sources":["../../src/commands/card.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Command } from 'commander';
2
+ /** Why the file does not pass, or null. With nothing to look for, an empty file still fails: `touch` is not work. */
3
+ export declare function fileProblem(path: string, has: string[]): string | null;
4
+ export declare const checkCommand: Command;
@@ -0,0 +1,76 @@
1
+ import { Command } from 'commander';
2
+ import { existsSync, readFileSync } from 'fs';
3
+ import { RefusalError } from '../lib/cards.js';
4
+ import { checkMock } from '../lib/mock.js';
5
+ import { checkOnline, checkResearch } from '../lib/research.js';
6
+ import { blockingGotchas } from '../lib/wiki.js';
7
+ /** Why the file does not pass, or null. With nothing to look for, an empty file still fails: `touch` is not work. */
8
+ export function fileProblem(path, has) {
9
+ if (!existsSync(path))
10
+ return `missing file: ${path}`;
11
+ const text = readFileSync(path, 'utf-8');
12
+ if (text.trim() === '')
13
+ return `${path} is empty`;
14
+ const missing = has.filter(s => !text.includes(s));
15
+ return missing.length ? `${path} is missing: ${missing.map(s => `"${s}"`).join(', ')}` : null;
16
+ }
17
+ export const checkCommand = new Command('check').description('Done-check helpers for lane stages');
18
+ checkCommand
19
+ .command('file <path>')
20
+ .description('Exit 1 unless the file exists, is not empty, and contains every --has string')
21
+ .option('--has <str...>', 'Strings the file must contain')
22
+ .action((path, opts) => {
23
+ const problem = fileProblem(path, opts.has ?? []);
24
+ if (problem) {
25
+ console.error(problem);
26
+ process.exit(1);
27
+ }
28
+ });
29
+ checkCommand
30
+ .command('gotchas')
31
+ .description('Exit 1 while a critical wiki page applies to these files and has not been acknowledged')
32
+ .requiredOption('--files <path...>', 'Changed files')
33
+ .option('--ack <title...>', 'Titles of critical pages that were read and handled', [])
34
+ .action((opts) => {
35
+ const blocking = blockingGotchas(process.cwd(), opts.files, opts.ack);
36
+ for (const p of blocking)
37
+ console.error(`critical: ${p.title} (freq ${p.freq}, ${p.path})\n${p.body}\n`);
38
+ if (blocking.length) {
39
+ console.error(`${blocking.length} critical wiki page(s) apply. Read them, then re-run with --ack "<title>" for each.`);
40
+ process.exit(1);
41
+ }
42
+ });
43
+ // A check exits 1 with one line per problem. A card with no spec folder is a problem too, not a crash.
44
+ function failing(run) {
45
+ return async () => {
46
+ let problems;
47
+ try {
48
+ problems = await run();
49
+ }
50
+ catch (e) {
51
+ if (!(e instanceof RefusalError))
52
+ throw e;
53
+ problems = [e.message];
54
+ }
55
+ problems.forEach(p => console.error(p));
56
+ if (problems.length)
57
+ process.exit(1);
58
+ };
59
+ }
60
+ checkCommand
61
+ .command('research <card>')
62
+ .description("Exit 1 unless the card's research.md has a `verdict:` line and enough `- source: <url> — <note>` lines")
63
+ .option('--min-sources <n>', 'How many source lines are required', '3')
64
+ .option('--online', 'Also require each source URL to answer with 2xx or 3xx')
65
+ .action((card, opts) => failing(async () => {
66
+ const min = parseInt(opts.minSources, 10);
67
+ if (!Number.isInteger(min) || min < 0)
68
+ return [`--min-sources "${opts.minSources}" is not a number`];
69
+ const { errors, urls } = checkResearch(process.cwd(), card, min);
70
+ return opts.online ? [...errors, ...(await checkOnline(urls))] : errors;
71
+ })());
72
+ checkCommand
73
+ .command('mock <card>')
74
+ .description("Exit 1 unless the card's mock is built from the shared template, keeps its tokens, uses no other colours and draws every screen the spec names")
75
+ .action((card) => failing(() => checkMock(process.cwd(), card))());
76
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { Command } from 'commander';
2
+ /**
3
+ * The step before every command while connected. What it did goes to stderr, so `--json` output
4
+ * and the MCP server's stdout stay clean. A pending board write that the cloud has moved past
5
+ * refuses the command with exit 3; any other trouble leaves the command to run on local files.
6
+ */
7
+ export declare function syncBeforeCommand(command: string): void;
8
+ export declare const cloudCommand: Command;
@@ -0,0 +1,123 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { CloudConflictError, CloudError, connect, disconnect, pull, push, search, status, syncBefore } from '../lib/cloud.js';
4
+ const CONFLICT_HINT = 'Next: `codeloop cloud pull` takes the cloud board; `codeloop cloud push --force` replaces it with yours.';
5
+ /** Exit 3 on a version conflict, as for a local one; 1 for anything else the cloud refuses. */
6
+ function guardCloud(fn) {
7
+ return (...args) => {
8
+ try {
9
+ fn(...args);
10
+ }
11
+ catch (e) {
12
+ if (e instanceof CloudConflictError) {
13
+ console.error(chalk.red(`conflict: ${e.message}`));
14
+ console.error(CONFLICT_HINT);
15
+ process.exit(3);
16
+ }
17
+ console.error(chalk.red(e instanceof CloudError ? e.message : String(e.message)));
18
+ process.exit(1);
19
+ }
20
+ };
21
+ }
22
+ // `cloud` commands sync themselves, `init` and `check` have nothing to sync, and a command started
23
+ // by a check or an agent runs inside one that has already synced. CODELOOP_NO_SYNC=1 skips the
24
+ // step for any command: a script that reads many times in a row would otherwise spend the
25
+ // endpoint's requests on listings.
26
+ const NO_SYNC = new Set(['cloud', 'init', 'check', 'help']);
27
+ /**
28
+ * The step before every command while connected. What it did goes to stderr, so `--json` output
29
+ * and the MCP server's stdout stay clean. A pending board write that the cloud has moved past
30
+ * refuses the command with exit 3; any other trouble leaves the command to run on local files.
31
+ */
32
+ export function syncBeforeCommand(command) {
33
+ if (NO_SYNC.has(command) || process.env.CODELOOP_NO_SYNC)
34
+ return;
35
+ try {
36
+ for (const note of syncBefore(process.cwd()))
37
+ console.error(chalk.dim(` cloud: ${note}`));
38
+ }
39
+ catch (e) {
40
+ if (e instanceof CloudConflictError) {
41
+ console.error(chalk.red(`conflict: ${e.message}`));
42
+ console.error(CONFLICT_HINT);
43
+ process.exit(3);
44
+ }
45
+ console.error(chalk.yellow(` cloud: ${e.message}; working from the local files`));
46
+ }
47
+ }
48
+ export const cloudCommand = new Command('cloud').description('Optional: keep the board, wiki, config and lanes in a Protobox workspace as well as in the repo');
49
+ cloudCommand
50
+ .command('connect')
51
+ .description('Save the connection in .codeloop/cloud.json (gitignored) and upload the board, wiki, config.yaml and lanes')
52
+ .requiredOption('--url <mcp url>', 'Workspace MCP URL')
53
+ .requiredOption('--key <api key>', 'Workspace API key (stored in cloud.json, never printed)')
54
+ .option('--workspace-name <name>', 'A label for status output')
55
+ .option('--folder <path>', 'Workspace folder for this project\'s pages (default: codeloop)')
56
+ .action(guardCloud((opts) => {
57
+ const r = connect(process.cwd(), opts);
58
+ console.log(r.adopted
59
+ ? ` connected: a board page already exists (revision ${r.revision}) and was left as it is`
60
+ : ` connected: board uploaded (revision ${r.revision})`);
61
+ console.log(` ${r.wikiPages} wiki pages uploaded`);
62
+ r.notes.forEach(n => console.log(chalk.yellow(` ${n}`)));
63
+ if (r.adopted)
64
+ console.log('Next: `codeloop cloud pull` to take the cloud board, or `codeloop cloud push --force` to replace it with yours.');
65
+ }));
66
+ cloudCommand
67
+ .command('status')
68
+ .description('Workspace, page revision against the local version, and each document as in-sync, local-ahead, cloud-ahead or both-changed')
69
+ .option('--json', 'JSON output')
70
+ .action(guardCloud((opts) => {
71
+ const s = status(process.cwd());
72
+ if (opts.json) {
73
+ console.log(JSON.stringify(s, null, 2));
74
+ return;
75
+ }
76
+ console.log(` workspace: ${s.workspaceName ? `${s.workspaceName} ` : ''}${s.url}`);
77
+ console.log(` board page "${s.boardTitle}": revision ${s.pageRevision} (last seen here: ${s.lastSeenRevision})`);
78
+ console.log(` local cards.json: version ${s.localVersion}, ${s.cards} cards`);
79
+ console.log(` in sync: ${s.inSync ? 'yes' : 'no'} wiki pages: ${s.wikiPages}`);
80
+ for (const d of s.documents) {
81
+ const state = d.state === 'in-sync' ? chalk.green(d.state.padEnd(12)) : chalk.yellow(d.state.padEnd(12));
82
+ console.log(` ${state} ${d.path}${d.pending ? chalk.dim(' (pending: kept locally while the cloud was unreachable)') : ''}`);
83
+ }
84
+ }));
85
+ cloudCommand
86
+ .command('push')
87
+ .description('Write the board, wiki pages and config that changed here to the cloud. Lanes are not pushed: they change through `lane promote`')
88
+ .option('--force', 'Overwrite even if the cloud copy changed since it was last seen here')
89
+ .action(guardCloud((opts) => {
90
+ const r = push(process.cwd(), opts);
91
+ console.log(` pushed: board revision ${r.revision}, ${r.wikiPages} wiki pages`);
92
+ r.held.forEach(p => console.log(chalk.yellow(` not pushed: ${p} was edited here; a lane changes through \`codeloop lane promote\``)));
93
+ }));
94
+ cloudCommand
95
+ .command('pull')
96
+ .description('Take the cloud board, and every other cloud copy whose local file was not edited here')
97
+ .option('--force', 'Take the cloud copy of every document, discarding local edits')
98
+ .action(guardCloud((opts) => {
99
+ const r = pull(process.cwd(), opts);
100
+ console.log(` pulled: board revision ${r.revision}, ${r.wikiPages} wiki pages`);
101
+ r.notes.forEach(n => console.log(chalk.yellow(` ${n}`)));
102
+ }));
103
+ cloudCommand
104
+ .command('disconnect')
105
+ .description('Push pending writes, pull everything back into the repo, then remove cloud.json')
106
+ .action(guardCloud(() => {
107
+ const r = disconnect(process.cwd());
108
+ console.log(` disconnected: board (revision ${r.revision}) and ${r.wikiPages} wiki pages are back in the repo; .codeloop/cloud.json removed`);
109
+ }));
110
+ cloudCommand
111
+ .command('search <query>')
112
+ .description('Search the workspace knowledge base')
113
+ .option('--json', 'JSON output')
114
+ .action(guardCloud((query, opts) => {
115
+ const results = search(process.cwd(), query);
116
+ if (opts.json)
117
+ console.log(JSON.stringify(results, null, 2));
118
+ else if (results.length === 0)
119
+ console.log(' no results');
120
+ else
121
+ results.forEach(r => console.log(` ${r.title}`));
122
+ }));
123
+ //# sourceMappingURL=cloud.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud.js","sourceRoot":"","sources":["../../src/commands/cloud.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ /** Exit codes: 2 = a check, gate or permission refused; 3 = cards.json version conflict. */
2
+ export declare function guard<A extends unknown[]>(fn: (...args: A) => void | Promise<void>): (...args: A) => Promise<void>;
@@ -0,0 +1,26 @@
1
+ import chalk from 'chalk';
2
+ import { ConflictError } from '../lib/cards.js';
3
+ import { CloudConflictError } from '../lib/cloud.js';
4
+ import { RefusalError } from '../lib/engine.js';
5
+ /** Exit codes: 2 = a check, gate or permission refused; 3 = cards.json version conflict. */
6
+ export function guard(fn) {
7
+ return async (...args) => {
8
+ try {
9
+ await fn(...args);
10
+ }
11
+ catch (e) {
12
+ const message = e.message;
13
+ if (e instanceof RefusalError) {
14
+ console.error(chalk.red(`refused: ${message}`));
15
+ process.exit(2);
16
+ }
17
+ if (e instanceof ConflictError || e instanceof CloudConflictError) {
18
+ console.error(chalk.red(`conflict: ${message}`));
19
+ process.exit(3);
20
+ }
21
+ console.error(chalk.red(message));
22
+ process.exit(1);
23
+ }
24
+ };
25
+ }
26
+ //# sourceMappingURL=guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard.js","sourceRoot":"","sources":["../../src/commands/guard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,4FAA4F;AAC5F,MAAM,UAAU,KAAK,CAAsB,EAAwC;IACjF,OAAO,KAAK,EAAE,GAAG,IAAO,EAAiB,EAAE;QACzC,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QACpB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,OAAO,GAAI,CAAW,CAAC,OAAO,CAAC;YACrC,IAAI,CAAC,YAAY,YAAY,EAAE,CAAC;gBAC9B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC,CAAC;gBAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,IAAI,CAAC,YAAY,aAAa,IAAI,CAAC,YAAY,kBAAkB,EAAE,CAAC;gBAClE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,OAAO,EAAE,CAAC,CAAC,CAAC;gBACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare const importCommand: Command;
@@ -0,0 +1,24 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { importBmad, importSpecKit } from '../lib/import.js';
4
+ import { guard } from './guard.js';
5
+ function report(result) {
6
+ result.cards.forEach(c => console.log(` ${c.id} at ${c.stage}: ${c.title} ${chalk.dim(c.spec ?? '')}`));
7
+ if (result.flagged.length) {
8
+ console.log(chalk.yellow(` ${result.flagged.length} tasks have no layer; replace [?] with api, sdk, ui, test or docs:`));
9
+ result.flagged.forEach(f => console.log(chalk.dim(` ${f.file}: ${f.task}`)));
10
+ }
11
+ console.log(` imported ${result.cards.length} cards`);
12
+ }
13
+ export const importCommand = new Command('import').description('Bring existing specs in as cards; source files are only read');
14
+ importCommand
15
+ .command('speckit [dir]')
16
+ .description('One card per specs/NNN* feature, tasks rewritten with layer tags')
17
+ .option('--lane <id>', 'Lane to create cards in', 'build')
18
+ .action(guard((dir, opts) => report(importSpecKit(process.cwd(), dir ?? '.', opts.lane))));
19
+ importCommand
20
+ .command('bmad [dir]')
21
+ .description('One card per story in sprint-status.yaml, status mapped to a stage')
22
+ .option('--lane <id>', 'Lane to create cards in', 'build')
23
+ .action(guard((dir, opts) => report(importBmad(process.cwd(), dir ?? '.', opts.lane))));
24
+ //# sourceMappingURL=import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/commands/import.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,aAAa,EAAqB,MAAM,kBAAkB,CAAC;AAChF,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,SAAS,MAAM,CAAC,MAAoB;IAClC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1G,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC,OAAO,CAAC,MAAM,oEAAoE,CAAC,CAAC,CAAC;QAC1H,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,8DAA8D,CAAC,CAAC;AAE/H,aAAa;KACV,OAAO,CAAC,eAAe,CAAC;KACxB,WAAW,CAAC,kEAAkE,CAAC;KAC/E,MAAM,CAAC,aAAa,EAAE,yBAAyB,EAAE,OAAO,CAAC;KACzD,MAAM,CAAC,KAAK,CAAC,CAAC,GAAuB,EAAE,IAAsB,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAEnI,aAAa;KACV,OAAO,CAAC,YAAY,CAAC;KACrB,WAAW,CAAC,oEAAoE,CAAC;KACjF,MAAM,CAAC,aAAa,EAAE,yBAAyB,EAAE,OAAO,CAAC;KACzD,MAAM,CAAC,KAAK,CAAC,CAAC,GAAuB,EAAE,IAAsB,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare const inboxCommand: Command;
@@ -0,0 +1,48 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { buildInbox, markInboxSeen } from '../lib/inbox.js';
4
+ import { guard } from './guard.js';
5
+ export const inboxCommand = new Command('inbox')
6
+ .description('What needs you, what shipped, and the numbers per lane')
7
+ .option('--json', 'JSON output')
8
+ .option('--seen', 'Mark everything shipped so far as seen')
9
+ .action(guard((opts) => {
10
+ const projectDir = process.cwd();
11
+ const inbox = buildInbox(projectDir);
12
+ if (opts.json) {
13
+ console.log(JSON.stringify(inbox, null, 2));
14
+ }
15
+ else {
16
+ console.log(inbox.summary);
17
+ console.log();
18
+ console.log(chalk.bold(`Waiting for you (${inbox.needs_you.length + inbox.needs_merge.length})`));
19
+ for (const c of inbox.needs_you) {
20
+ console.log(` ${c.id} ${c.title}: ${c.lane}/${c.stage}, gate ${chalk.yellow(c.gate)}`);
21
+ if (c.gate === 'proposal') {
22
+ console.log(chalk.dim(` proposed${c.source ? ` from ${c.source}` : ''}; \`codeloop card show ${c.id}\` has the detail`));
23
+ console.log(chalk.dim(` codeloop approve ${c.id} puts it in the ${c.lane} lane or codeloop reject ${c.id} "<why not>" drops it`));
24
+ continue;
25
+ }
26
+ console.log(chalk.dim(` read: ${c.read ?? 'nothing written for this stage'} last check: ${c.last_check}`));
27
+ if (c.mock)
28
+ console.log(chalk.dim(` mock: ${c.mock}`));
29
+ console.log(chalk.dim(` codeloop approve ${c.id} or codeloop reject ${c.id} "<what to change>"`));
30
+ }
31
+ for (const m of inbox.needs_merge) {
32
+ console.log(` wiki ${m.path}: changed here and in the cloud`);
33
+ console.log(chalk.dim(` merge ${m.cloud} into it, then delete that file; the next command pushes your merge`));
34
+ }
35
+ console.log(chalk.bold(`Shipped (${inbox.shipped.length})`));
36
+ for (const c of inbox.shipped)
37
+ console.log(` ${c.id} ${c.lane} ${chalk.dim(c.title)}`);
38
+ console.log(chalk.bold('Numbers'));
39
+ const pct = (n) => (n === null ? '-' : `${Math.round(n * 100)}%`);
40
+ for (const n of inbox.numbers) {
41
+ const turns = n.human_turns_per_card === null ? '-' : n.human_turns_per_card.toFixed(1);
42
+ console.log(` ${n.lane.padEnd(10)} active ${n.active} waiting ${n.parked} done ${n.done} human turns/card ${turns} first pass ${pct(n.first_pass_rate)}`);
43
+ }
44
+ }
45
+ if (opts.seen)
46
+ markInboxSeen(projectDir);
47
+ }));
48
+ //# sourceMappingURL=inbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbox.js","sourceRoot":"","sources":["../../src/commands/inbox.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare const initCommand: Command;