@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.
- package/LICENSE +21 -0
- package/README.md +589 -0
- package/dist/commands/adopt.d.ts +2 -0
- package/dist/commands/adopt.js +26 -0
- package/dist/commands/adopt.js.map +1 -0
- package/dist/commands/brief.d.ts +2 -0
- package/dist/commands/brief.js +22 -0
- package/dist/commands/brief.js.map +1 -0
- package/dist/commands/card.d.ts +6 -0
- package/dist/commands/card.js +159 -0
- package/dist/commands/card.js.map +1 -0
- package/dist/commands/check.d.ts +4 -0
- package/dist/commands/check.js +76 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/cloud.d.ts +8 -0
- package/dist/commands/cloud.js +123 -0
- package/dist/commands/cloud.js.map +1 -0
- package/dist/commands/guard.d.ts +2 -0
- package/dist/commands/guard.js +26 -0
- package/dist/commands/guard.js.map +1 -0
- package/dist/commands/import.d.ts +2 -0
- package/dist/commands/import.js +24 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/inbox.d.ts +2 -0
- package/dist/commands/inbox.js +48 -0
- package/dist/commands/inbox.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.js +142 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/install.d.ts +2 -0
- package/dist/commands/install.js +125 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/lane.d.ts +2 -0
- package/dist/commands/lane.js +100 -0
- package/dist/commands/lane.js.map +1 -0
- package/dist/commands/list.d.ts +2 -0
- package/dist/commands/list.js +35 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/login.d.ts +2 -0
- package/dist/commands/login.js +77 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/mock.d.ts +3 -0
- package/dist/commands/mock.js +22 -0
- package/dist/commands/mock.js.map +1 -0
- package/dist/commands/pack.d.ts +2 -0
- package/dist/commands/pack.js +19 -0
- package/dist/commands/pack.js.map +1 -0
- package/dist/commands/publish.d.ts +2 -0
- package/dist/commands/publish.js +125 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/remove.d.ts +2 -0
- package/dist/commands/remove.js +31 -0
- package/dist/commands/remove.js.map +1 -0
- package/dist/commands/render.d.ts +5 -0
- package/dist/commands/render.js +47 -0
- package/dist/commands/render.js.map +1 -0
- package/dist/commands/run.d.ts +2 -0
- package/dist/commands/run.js +45 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/scan.d.ts +2 -0
- package/dist/commands/scan.js +26 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/schedule.d.ts +2 -0
- package/dist/commands/schedule.js +51 -0
- package/dist/commands/schedule.js.map +1 -0
- package/dist/commands/search.d.ts +2 -0
- package/dist/commands/search.js +85 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/serve.d.ts +7 -0
- package/dist/commands/serve.js +126 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/commands/spec.d.ts +3 -0
- package/dist/commands/spec.js +64 -0
- package/dist/commands/spec.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.js +251 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/update.d.ts +2 -0
- package/dist/commands/update.js +83 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/verify.d.ts +3 -0
- package/dist/commands/verify.js +75 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/commands/watch.d.ts +6 -0
- package/dist/commands/watch.js +111 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/commands/wiki.d.ts +3 -0
- package/dist/commands/wiki.js +85 -0
- package/dist/commands/wiki.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +86 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/agent.d.ts +27 -0
- package/dist/lib/agent.js +178 -0
- package/dist/lib/agent.js.map +1 -0
- package/dist/lib/board.d.ts +38 -0
- package/dist/lib/board.js +86 -0
- package/dist/lib/board.js.map +1 -0
- package/dist/lib/cards.d.ts +82 -0
- package/dist/lib/cards.js +107 -0
- package/dist/lib/cards.js.map +1 -0
- package/dist/lib/clock.d.ts +5 -0
- package/dist/lib/clock.js +14 -0
- package/dist/lib/clock.js.map +1 -0
- package/dist/lib/cloud.d.ts +122 -0
- package/dist/lib/cloud.js +580 -0
- package/dist/lib/cloud.js.map +1 -0
- package/dist/lib/competitors.d.ts +28 -0
- package/dist/lib/competitors.js +90 -0
- package/dist/lib/competitors.js.map +1 -0
- package/dist/lib/config.d.ts +7 -0
- package/dist/lib/config.js +25 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/cron.d.ts +5 -0
- package/dist/lib/cron.js +82 -0
- package/dist/lib/cron.js.map +1 -0
- package/dist/lib/detect.d.ts +13 -0
- package/dist/lib/detect.js +60 -0
- package/dist/lib/detect.js.map +1 -0
- package/dist/lib/engine.d.ts +88 -0
- package/dist/lib/engine.js +435 -0
- package/dist/lib/engine.js.map +1 -0
- package/dist/lib/flow.d.ts +44 -0
- package/dist/lib/flow.js +121 -0
- package/dist/lib/flow.js.map +1 -0
- package/dist/lib/glob.d.ts +2 -0
- package/dist/lib/glob.js +10 -0
- package/dist/lib/glob.js.map +1 -0
- package/dist/lib/import.d.ts +13 -0
- package/dist/lib/import.js +127 -0
- package/dist/lib/import.js.map +1 -0
- package/dist/lib/inbox.d.ts +42 -0
- package/dist/lib/inbox.js +65 -0
- package/dist/lib/inbox.js.map +1 -0
- package/dist/lib/lane.d.ts +71 -0
- package/dist/lib/lane.js +105 -0
- package/dist/lib/lane.js.map +1 -0
- package/dist/lib/lock.d.ts +6 -0
- package/dist/lib/lock.js +64 -0
- package/dist/lib/lock.js.map +1 -0
- package/dist/lib/mcp.d.ts +2 -0
- package/dist/lib/mcp.js +57 -0
- package/dist/lib/mcp.js.map +1 -0
- package/dist/lib/mock.d.ts +17 -0
- package/dist/lib/mock.js +137 -0
- package/dist/lib/mock.js.map +1 -0
- package/dist/lib/pack.d.ts +24 -0
- package/dist/lib/pack.js +77 -0
- package/dist/lib/pack.js.map +1 -0
- package/dist/lib/proposals.d.ts +48 -0
- package/dist/lib/proposals.js +240 -0
- package/dist/lib/proposals.js.map +1 -0
- package/dist/lib/render.d.ts +7 -0
- package/dist/lib/render.js +84 -0
- package/dist/lib/render.js.map +1 -0
- package/dist/lib/research.d.ts +8 -0
- package/dist/lib/research.js +39 -0
- package/dist/lib/research.js.map +1 -0
- package/dist/lib/run.d.ts +38 -0
- package/dist/lib/run.js +215 -0
- package/dist/lib/run.js.map +1 -0
- package/dist/lib/scaffold.d.ts +16 -0
- package/dist/lib/scaffold.js +175 -0
- package/dist/lib/scaffold.js.map +1 -0
- package/dist/lib/scan.d.ts +22 -0
- package/dist/lib/scan.js +85 -0
- package/dist/lib/scan.js.map +1 -0
- package/dist/lib/schedule.d.ts +20 -0
- package/dist/lib/schedule.js +66 -0
- package/dist/lib/schedule.js.map +1 -0
- package/dist/lib/server.d.ts +68 -0
- package/dist/lib/server.js +235 -0
- package/dist/lib/server.js.map +1 -0
- package/dist/lib/shell.d.ts +1 -0
- package/dist/lib/shell.js +25 -0
- package/dist/lib/shell.js.map +1 -0
- package/dist/lib/skills.d.ts +20 -0
- package/dist/lib/skills.js +92 -0
- package/dist/lib/skills.js.map +1 -0
- package/dist/lib/spec.d.ts +24 -0
- package/dist/lib/spec.js +102 -0
- package/dist/lib/spec.js.map +1 -0
- package/dist/lib/stats.d.ts +13 -0
- package/dist/lib/stats.js +43 -0
- package/dist/lib/stats.js.map +1 -0
- package/dist/lib/verify.d.ts +25 -0
- package/dist/lib/verify.js +135 -0
- package/dist/lib/verify.js.map +1 -0
- package/dist/lib/version.d.ts +10 -0
- package/dist/lib/version.js +27 -0
- package/dist/lib/version.js.map +1 -0
- package/dist/lib/wiki.d.ts +51 -0
- package/dist/lib/wiki.js +164 -0
- package/dist/lib/wiki.js.map +1 -0
- package/dist/registry/index.d.ts +7 -0
- package/dist/registry/index.js +8 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/installer.d.ts +30 -0
- package/dist/registry/installer.js +133 -0
- package/dist/registry/installer.js.map +1 -0
- package/dist/registry/local-index.d.ts +32 -0
- package/dist/registry/local-index.js +58 -0
- package/dist/registry/local-index.js.map +1 -0
- package/dist/registry/lockfile.d.ts +40 -0
- package/dist/registry/lockfile.js +85 -0
- package/dist/registry/lockfile.js.map +1 -0
- package/dist/registry/security.d.ts +25 -0
- package/dist/registry/security.js +100 -0
- package/dist/registry/security.js.map +1 -0
- package/dist/registry/skill-schema.d.ts +30 -0
- package/dist/registry/skill-schema.js +95 -0
- package/dist/registry/skill-schema.js.map +1 -0
- package/dist/ui/404.html +1 -0
- package/dist/ui/_next/static/6wzGE5sCtbYkSyhMWxL32/_buildManifest.js +1 -0
- package/dist/ui/_next/static/6wzGE5sCtbYkSyhMWxL32/_ssgManifest.js +1 -0
- package/dist/ui/_next/static/chunks/255-54d3085ce94738a4.js +1 -0
- package/dist/ui/_next/static/chunks/423-bb541b7ae2733575.js +1 -0
- package/dist/ui/_next/static/chunks/4bd1b696-c023c6e3521b1417.js +1 -0
- package/dist/ui/_next/static/chunks/app/_not-found/page-d6bc774f7acb716e.js +1 -0
- package/dist/ui/_next/static/chunks/app/layout-e5fc8e78e1c8da95.js +1 -0
- package/dist/ui/_next/static/chunks/app/page-0c34b6e119cef236.js +1 -0
- package/dist/ui/_next/static/chunks/framework-de98b93a850cfc71.js +1 -0
- package/dist/ui/_next/static/chunks/main-49fd204fc9037ea3.js +1 -0
- package/dist/ui/_next/static/chunks/main-app-c46afa2f48f3aaef.js +1 -0
- package/dist/ui/_next/static/chunks/pages/_app-7d307437aca18ad4.js +1 -0
- package/dist/ui/_next/static/chunks/pages/_error-cb2a52f75f2162e2.js +1 -0
- package/dist/ui/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- package/dist/ui/_next/static/chunks/webpack-4a462cecab786e93.js +1 -0
- package/dist/ui/_next/static/css/1bf01240dbfd6088.css +1 -0
- package/dist/ui/index.html +1 -0
- package/dist/ui/index.txt +19 -0
- package/dist/watch/index.d.ts +21 -0
- package/dist/watch/index.js +88 -0
- package/dist/watch/index.js.map +1 -0
- package/dist/watch/reporter.d.ts +11 -0
- package/dist/watch/reporter.js +44 -0
- package/dist/watch/reporter.js.map +1 -0
- package/dist/watch/signals.d.ts +38 -0
- package/dist/watch/signals.js +119 -0
- package/dist/watch/signals.js.map +1 -0
- package/dist/watch/triggers.d.ts +10 -0
- package/dist/watch/triggers.js +67 -0
- package/dist/watch/triggers.js.map +1 -0
- package/package.json +64 -0
- package/registry/index.json +106 -0
- package/starters/generic.yaml +95 -0
- package/starters/go.yaml +99 -0
- package/starters/node-typescript.yaml +108 -0
- package/starters/python.yaml +105 -0
- package/templates/ci/codeloop-pr.yml +29 -0
- package/templates/ci/codeloop-prod.yml +27 -0
- package/templates/ci/codeloop-staging.yml +34 -0
- package/templates/codeloop/board.json +5 -0
- package/templates/codeloop/gotchas.md +13 -0
- package/templates/codeloop/patterns.md +15 -0
- package/templates/codeloop/principles.md +49 -0
- package/templates/codeloop/rules.md +23 -0
- package/templates/commands/commit.md +255 -0
- package/templates/commands/debug.md +142 -0
- package/templates/commands/deploy.md +144 -0
- package/templates/commands/design.md +102 -0
- package/templates/commands/manage.md +77 -0
- package/templates/commands/plan.md +84 -0
- package/templates/commands/qa.md +155 -0
- package/templates/commands/reflect.md +93 -0
- package/templates/commands/ship.md +187 -0
- package/templates/commands/test.md +133 -0
- package/templates/hooks/commit-msg +8 -0
- package/templates/lanes/analyze.yaml +25 -0
- package/templates/lanes/build.yaml +45 -0
- package/templates/lanes/deploy.yaml +24 -0
- package/templates/lanes/learn.yaml +20 -0
- package/templates/lanes/market.yaml +25 -0
- package/templates/lanes/plan.yaml +24 -0
- package/templates/lanes/scan.yaml +11 -0
- package/templates/lanes/triage.yaml +24 -0
- package/templates/mock/template.html +82 -0
- package/templates/seeds/go-gotchas.md +28 -0
- package/templates/seeds/go-patterns.md +22 -0
- package/templates/seeds/node-typescript-gotchas.md +30 -0
- package/templates/seeds/node-typescript-patterns.md +27 -0
- package/templates/seeds/python-gotchas.md +30 -0
- package/templates/seeds/python-patterns.md +19 -0
- package/templates/seeds/universal-gotchas.md +11 -0
- package/templates/seeds/universal-patterns.md +11 -0
- package/templates/spec/plan.md +7 -0
- package/templates/spec/research.md +19 -0
- package/templates/spec/spec.md +14 -0
- package/templates/spec/tasks.md +10 -0
- package/templates/tasks/todo.md +3 -0
|
@@ -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,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,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,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,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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"}
|