@manehorizons/cadence-core 1.6.1 → 1.8.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 (103) hide show
  1. package/dist/cli/commands/build.d.ts.map +1 -1
  2. package/dist/cli/commands/build.js +10 -77
  3. package/dist/cli/commands/build.js.map +1 -1
  4. package/dist/cli/commands/doctor.d.ts +3 -0
  5. package/dist/cli/commands/doctor.d.ts.map +1 -0
  6. package/dist/cli/commands/doctor.js +44 -0
  7. package/dist/cli/commands/doctor.js.map +1 -0
  8. package/dist/cli/commands/draft-new.d.ts.map +1 -1
  9. package/dist/cli/commands/draft-new.js +11 -97
  10. package/dist/cli/commands/draft-new.js.map +1 -1
  11. package/dist/cli/commands/draft.d.ts.map +1 -1
  12. package/dist/cli/commands/draft.js +15 -104
  13. package/dist/cli/commands/draft.js.map +1 -1
  14. package/dist/cli/commands/mcp.d.ts +3 -0
  15. package/dist/cli/commands/mcp.d.ts.map +1 -0
  16. package/dist/cli/commands/mcp.js +35 -0
  17. package/dist/cli/commands/mcp.js.map +1 -0
  18. package/dist/cli/commands/progress.d.ts.map +1 -1
  19. package/dist/cli/commands/progress.js +5 -13
  20. package/dist/cli/commands/progress.js.map +1 -1
  21. package/dist/cli/commands/recommend.d.ts.map +1 -1
  22. package/dist/cli/commands/recommend.js +5 -15
  23. package/dist/cli/commands/recommend.js.map +1 -1
  24. package/dist/cli/commands/recommendation.d.ts.map +1 -1
  25. package/dist/cli/commands/recommendation.js +52 -1
  26. package/dist/cli/commands/recommendation.js.map +1 -1
  27. package/dist/cli/commands/settle.d.ts.map +1 -1
  28. package/dist/cli/commands/settle.js +5 -442
  29. package/dist/cli/commands/settle.js.map +1 -1
  30. package/dist/cli/commands/spec.d.ts.map +1 -1
  31. package/dist/cli/commands/spec.js +19 -197
  32. package/dist/cli/commands/spec.js.map +1 -1
  33. package/dist/cli/commands/status.d.ts.map +1 -1
  34. package/dist/cli/commands/status.js +5 -14
  35. package/dist/cli/commands/status.js.map +1 -1
  36. package/dist/cli/register.d.ts.map +1 -1
  37. package/dist/cli/register.js +4 -0
  38. package/dist/cli/register.js.map +1 -1
  39. package/dist/doctor/model.d.ts +27 -0
  40. package/dist/doctor/model.d.ts.map +1 -0
  41. package/dist/doctor/model.js +10 -0
  42. package/dist/doctor/model.js.map +1 -0
  43. package/dist/doctor/run.d.ts +3 -0
  44. package/dist/doctor/run.d.ts.map +1 -0
  45. package/dist/doctor/run.js +141 -0
  46. package/dist/doctor/run.js.map +1 -0
  47. package/dist/intelligence/store/recommendations.d.ts +7 -1
  48. package/dist/intelligence/store/recommendations.d.ts.map +1 -1
  49. package/dist/intelligence/store/recommendations.js +53 -0
  50. package/dist/intelligence/store/recommendations.js.map +1 -1
  51. package/dist/mcp/server.d.ts +12 -0
  52. package/dist/mcp/server.d.ts.map +1 -0
  53. package/dist/mcp/server.js +42 -0
  54. package/dist/mcp/server.js.map +1 -0
  55. package/dist/mcp/tools.d.ts +20 -0
  56. package/dist/mcp/tools.d.ts.map +1 -0
  57. package/dist/mcp/tools.js +189 -0
  58. package/dist/mcp/tools.js.map +1 -0
  59. package/dist/services/build-task.d.ts +12 -0
  60. package/dist/services/build-task.d.ts.map +1 -0
  61. package/dist/services/build-task.js +78 -0
  62. package/dist/services/build-task.js.map +1 -0
  63. package/dist/services/draft-approve.d.ts +14 -0
  64. package/dist/services/draft-approve.d.ts.map +1 -0
  65. package/dist/services/draft-approve.js +74 -0
  66. package/dist/services/draft-approve.js.map +1 -0
  67. package/dist/services/draft-check.d.ts +10 -0
  68. package/dist/services/draft-check.d.ts.map +1 -0
  69. package/dist/services/draft-check.js +47 -0
  70. package/dist/services/draft-check.js.map +1 -0
  71. package/dist/services/draft-new.d.ts +14 -0
  72. package/dist/services/draft-new.d.ts.map +1 -0
  73. package/dist/services/draft-new.js +98 -0
  74. package/dist/services/draft-new.js.map +1 -0
  75. package/dist/services/io.d.ts +39 -0
  76. package/dist/services/io.d.ts.map +1 -0
  77. package/dist/services/io.js +36 -0
  78. package/dist/services/io.js.map +1 -0
  79. package/dist/services/progress.d.ts +7 -0
  80. package/dist/services/progress.d.ts.map +1 -0
  81. package/dist/services/progress.js +21 -0
  82. package/dist/services/progress.js.map +1 -0
  83. package/dist/services/recommend.d.ts +9 -0
  84. package/dist/services/recommend.d.ts.map +1 -0
  85. package/dist/services/recommend.js +23 -0
  86. package/dist/services/recommend.js.map +1 -0
  87. package/dist/services/settle.d.ts +24 -0
  88. package/dist/services/settle.d.ts.map +1 -0
  89. package/dist/services/settle.js +366 -0
  90. package/dist/services/settle.js.map +1 -0
  91. package/dist/services/spec-approve.d.ts +11 -0
  92. package/dist/services/spec-approve.d.ts.map +1 -0
  93. package/dist/services/spec-approve.js +133 -0
  94. package/dist/services/spec-approve.js.map +1 -0
  95. package/dist/services/spec-new.d.ts +9 -0
  96. package/dist/services/spec-new.d.ts.map +1 -0
  97. package/dist/services/spec-new.js +62 -0
  98. package/dist/services/spec-new.js.map +1 -0
  99. package/dist/services/status.d.ts +9 -0
  100. package/dist/services/status.d.ts.map +1 -0
  101. package/dist/services/status.js +22 -0
  102. package/dist/services/status.js.map +1 -0
  103. package/package.json +3 -2
@@ -1 +1 @@
1
- {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/build.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmBzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgG3D"}
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/build.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8B3D"}
@@ -1,16 +1,5 @@
1
- import { readFile } from 'node:fs/promises';
2
- import { existsSync } from 'node:fs';
3
- import { join } from 'node:path';
4
- import { TaskStatusZ } from '@manehorizons/cadence-types';
5
- import { recordTaskOutcome, } from '../../build/record.js';
6
- import { LoopViolationError } from '../../errors.js';
7
- import { emitLoopViolation } from '../../notify/loop-violation.js';
8
- import { loadConfig } from '../../config/loader.js';
9
- import { effectiveGateSet } from '../../gates/engine.js';
10
- import { parseDraftMd } from '../../parse/draft-parser.js';
11
- import { SimpleStateBackend } from '../../state/simple.js';
12
- import { runPerTaskVerifyGate } from '../../gates/per-task-verify.js';
13
- import { buildBuildContext } from '../../gates/build-context.js';
1
+ import { buildTaskService } from '../../services/build-task.js';
2
+ import { processIO } from '../../services/io.js';
14
3
  export function registerBuildCommand(program) {
15
4
  const cmd = program.command('build').description('BUILD phase task tracking');
16
5
  cmd
@@ -20,70 +9,14 @@ export function registerBuildCommand(program) {
20
9
  .option('--notes <n>', 'Notes', '')
21
10
  .option('--allow-per-task-failure', 'bypass the per-task verifier gate (Phase 24.2): record DONE even if the verifier refuses')
22
11
  .action(async (taskId, opts) => {
23
- try {
24
- const statusParse = TaskStatusZ.safeParse(opts.status);
25
- if (!statusParse.success ||
26
- statusParse.data === 'PENDING' ||
27
- statusParse.data === 'IN_PROGRESS') {
28
- process.stderr.write(`Invalid task status: ${opts.status}. Allowed: DONE | DONE_WITH_CONCERNS | NEEDS_CONTEXT | BLOCKED\n`);
29
- process.exitCode = 2;
30
- return;
31
- }
32
- const status = statusParse.data;
33
- const cwd = process.cwd();
34
- // Resolve the active DRAFT once. Phase 29.8 T3 task-id validation and
35
- // the per-task gate both need it; only when resolvable, else the
36
- // no-active-draft / loop-violation paths are handled downstream.
37
- const backend = new SimpleStateBackend(cwd);
38
- const state = await backend.readState();
39
- let draft;
40
- if (state.activePhase && state.activeDraft) {
41
- const draftPath = join(cwd, '.cadence', 'phases', state.activePhase, `${state.activeDraft}-DRAFT.md`);
42
- if (existsSync(draftPath)) {
43
- draft = parseDraftMd(await readFile(draftPath, 'utf8'));
44
- const validIds = draft.tasks.map((t) => t.id);
45
- if (!validIds.includes(taskId)) {
46
- process.stderr.write(`build task: unknown task id "${taskId}". ` +
47
- `Valid ids in ${state.activeDraft}-DRAFT.md: ${validIds.join(', ') || '(none)'}. ` +
48
- `Nothing recorded.\n`);
49
- process.exitCode = 2;
50
- return;
51
- }
52
- }
53
- }
54
- // Phase 24.2 — per-task verifier gate. Fires only on DONE outcomes
55
- // when a DRAFT is resolvable; the gate membership-guards itself.
56
- let perTaskRecord;
57
- if (status === 'DONE' && draft) {
58
- const cfg = await loadConfig(cwd).catch(() => null);
59
- const ctx = buildBuildContext({
60
- cwd,
61
- state,
62
- draft,
63
- config: cfg,
64
- gateSet: effectiveGateSet(state, cfg, draft),
65
- taskId,
66
- opts: opts.allowPerTaskFailure !== undefined
67
- ? { allowPerTaskFailure: opts.allowPerTaskFailure }
68
- : {},
69
- });
70
- const res = await runPerTaskVerifyGate(ctx);
71
- if (res.outcome === 'refuse') {
72
- process.exitCode = 1;
73
- return;
74
- }
75
- perTaskRecord = res.summaryPatch?.perTaskRecord;
76
- }
77
- await recordTaskOutcome(cwd, taskId, status, opts.notes, perTaskRecord);
78
- console.log(`Recorded ${taskId}: ${status}`);
79
- }
80
- catch (err) {
81
- process.stderr.write(`build task failed: ${err instanceof Error ? err.message : String(err)}\n`);
82
- if (err instanceof LoopViolationError) {
83
- await emitLoopViolation(process.cwd(), err, 'build.task');
84
- }
85
- process.exitCode = 1;
86
- }
12
+ const { exitCode } = await buildTaskService(process.cwd(), {
13
+ taskId,
14
+ status: opts.status,
15
+ notes: opts.notes,
16
+ ...(opts.allowPerTaskFailure !== undefined ? { allowPerTaskFailure: opts.allowPerTaskFailure } : {}),
17
+ }, processIO());
18
+ if (exitCode)
19
+ process.exitCode = exitCode;
87
20
  });
88
21
  }
89
22
  //# sourceMappingURL=build.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/cli/commands/build.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/cli/commands/build.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,2BAA2B,CAAC,CAAC;IAE9E,GAAG;SACA,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,8BAA8B,CAAC;SAC3C,MAAM,CAAC,cAAc,EAAE,qDAAqD,EAAE,MAAM,CAAC;SACrF,MAAM,CAAC,aAAa,EAAE,OAAO,EAAE,EAAE,CAAC;SAClC,MAAM,CACL,0BAA0B,EAC1B,0FAA0F,CAC3F;SACA,MAAM,CACL,KAAK,EACH,MAAc,EACd,IAAsE,EACtE,EAAE;QACF,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,gBAAgB,CACzC,OAAO,CAAC,GAAG,EAAE,EACb;YACE,MAAM;YACN,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,GAAG,CAAC,IAAI,CAAC,mBAAmB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrG,EACD,SAAS,EAAE,CACZ,CAAC;QACF,IAAI,QAAQ;YAAE,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC5C,CAAC,CACF,CAAC;AACN,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerDoctorCommand(program: Command): void;
3
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsBzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0B5D"}
@@ -0,0 +1,44 @@
1
+ import { runDoctor } from '../../doctor/run.js';
2
+ function renderHuman(report) {
3
+ const lines = ['cadence doctor', ''];
4
+ const mark = (c) => c.severity === 'ok' ? '✓' : c.severity === 'warning' ? '!' : '✗';
5
+ for (const c of report.checks) {
6
+ lines.push(` ${mark(c)} ${c.severity.padEnd(7)} ${c.name}: ${c.detail}`);
7
+ if (c.remediation !== null)
8
+ lines.push(` → ${c.remediation}`);
9
+ }
10
+ const problems = report.checks.filter((c) => c.severity !== 'ok');
11
+ lines.push('');
12
+ lines.push(problems.length === 0
13
+ ? `All ${report.checks.length} checks passed.`
14
+ : `${problems.length} problem(s) across ${report.checks.length} checks.`);
15
+ return lines.join('\n') + '\n';
16
+ }
17
+ export function registerDoctorCommand(program) {
18
+ program
19
+ .command('doctor')
20
+ .description('Diagnose this project’s CADENCE setup and report problems')
21
+ .option('--json', 'emit machine-readable JSON instead of rendered text')
22
+ .action(async (opts) => {
23
+ try {
24
+ const report = await runDoctor(process.cwd(), {
25
+ nodeVersion: process.versions.node,
26
+ platform: process.platform,
27
+ });
28
+ if (opts.json) {
29
+ process.stdout.write(JSON.stringify(report) + '\n');
30
+ }
31
+ else {
32
+ process.stdout.write(renderHuman(report));
33
+ }
34
+ // Exit non-zero iff an error-severity problem exists, so `doctor` is
35
+ // usable as a CI gate. Warnings do not fail.
36
+ process.exitCode = report.ok ? 0 : 1;
37
+ }
38
+ catch (err) {
39
+ process.stderr.write(`doctor failed: ${err instanceof Error ? err.message : String(err)}\n`);
40
+ process.exitCode = 1;
41
+ }
42
+ });
43
+ }
44
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGhD,SAAS,WAAW,CAAC,MAAoB;IACvC,MAAM,KAAK,GAAa,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,CAAC,CAAc,EAAU,EAAE,CACtC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACnE,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1E,IAAI,CAAC,CAAC,WAAW,KAAK,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC;IAClE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CACR,QAAQ,CAAC,MAAM,KAAK,CAAC;QACnB,CAAC,CAAC,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,iBAAiB;QAC9C,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,sBAAsB,MAAM,CAAC,MAAM,CAAC,MAAM,UAAU,CAC3E,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,2DAA2D,CAAC;SACxE,MAAM,CAAC,QAAQ,EAAE,qDAAqD,CAAC;SACvE,MAAM,CAAC,KAAK,EAAE,IAAwB,EAAE,EAAE;QACzC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE;gBAC5C,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAClC,QAAQ,EAAE,OAAO,CAAC,QAAQ;aAC3B,CAAC,CAAC;YACH,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;YACtD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;YAC5C,CAAC;YACD,qEAAqE;YACrE,6CAA6C;YAC7C,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,kBAAkB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CACvE,CAAC;YACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"draft-new.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/draft-new.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUzC,yEAAyE;AACzE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAuHnD"}
1
+ {"version":3,"file":"draft-new.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/draft-new.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,yEAAyE;AACzE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAqBnD"}
@@ -1,11 +1,5 @@
1
- import { readFile, mkdir, writeFile } from 'node:fs/promises';
2
- import { existsSync } from 'node:fs';
3
- import { join } from 'node:path';
4
- import { parseSpecMd } from '../../parse/spec-parser.js';
5
- import { renderDraftBody, frontmatterStatus } from '../../parse/draft-scaffold.js';
6
- import { SimpleStateBackend } from '../../state/simple.js';
7
- import { readRecommendationLedger } from '../../intelligence/store/io.js';
8
- import { runRecommendationTransition } from '../../intelligence/store/recommendations.js';
1
+ import { draftNewService } from '../../services/draft-new.js';
2
+ import { processIO } from '../../services/io.js';
9
3
  /** Registers `draft new <phase> <num>` on the parent `draft` command. */
10
4
  export function registerDraftNew(cmd) {
11
5
  cmd
@@ -15,95 +9,15 @@ export function registerDraftNew(cmd) {
15
9
  .option('--tier <t>', 'Tier (quick-fix | standard | complex)', 'standard')
16
10
  .option('--from-rec <recId>', 'Praxis recommendation id; on success the rec is auto-converted to this phase (Slice 34.3)')
17
11
  .action(async (phase, num, opts) => {
18
- try {
19
- const cwd = process.cwd();
20
- const backend = new SimpleStateBackend(cwd);
21
- const state = await backend.readState();
22
- if (state.loopPosition !== 'IDLE') {
23
- const hint = state.loopPosition === 'SPEC'
24
- ? `Approve or discard the active spec (${state.activeSpec ?? '?'}) first (cadence spec approve …).`
25
- : `Settle or discard the active draft (${state.activeDraft ?? '?'}) first.`;
26
- process.stderr.write(`draft new refused: loopPosition is ${state.loopPosition}, not IDLE. ${hint}\n`);
27
- process.exitCode = 1;
28
- return;
29
- }
30
- // Slice 34.3 — pre-flight the rec BEFORE any fs writes so we never
31
- // scaffold a phase for a missing or unconvertible rec.
32
- if (opts.fromRec !== undefined) {
33
- const recLedger = await readRecommendationLedger(cwd);
34
- const rec = recLedger.recommendations.find((r) => r.id === opts.fromRec);
35
- if (!rec) {
36
- process.stderr.write(`draft new refused: recommendation ${opts.fromRec} not found\n`);
37
- process.exitCode = 1;
38
- return;
39
- }
40
- if (rec.status !== 'candidate' && rec.status !== 'accepted') {
41
- process.stderr.write(`draft new refused: cannot convert recommendation in status ${rec.status}\n`);
42
- process.exitCode = 1;
43
- return;
44
- }
45
- }
46
- const dir = join(cwd, '.cadence', 'phases', phase);
47
- const padded = num.padStart(2, '0');
48
- const id = `${phase.slice(0, 2)}-${padded}`;
49
- const path = join(dir, `${id}-DRAFT.md`);
50
- if (existsSync(path)) {
51
- process.stderr.write(`DRAFT already exists: ${path}\n`);
52
- process.exitCode = 2;
53
- return;
54
- }
55
- await mkdir(dir, { recursive: true });
56
- const specPath = join(dir, `${id}-SPEC.md`);
57
- let body;
58
- if (existsSync(specPath)) {
59
- const rawSpec = await readFile(specPath, 'utf8');
60
- if (frontmatterStatus(rawSpec) === 'APPROVED') {
61
- try {
62
- const spec = parseSpecMd(rawSpec);
63
- body = renderDraftBody(phase, id, opts.tier, opts.title, spec);
64
- console.log(`draft new: seeded objective + ${spec.acceptanceCriteria.length} AC(s) from approved SPEC ${id}`);
65
- }
66
- catch (err) {
67
- process.stderr.write(`draft new: SPEC ${id} APPROVED but unparseable (${err instanceof Error ? err.message : String(err)}) — scaffolding empty\n`);
68
- body = renderDraftBody(phase, id, opts.tier, opts.title);
69
- }
70
- }
71
- else {
72
- process.stderr.write(`draft new: SPEC ${id} present but not APPROVED — scaffolding empty\n`);
73
- body = renderDraftBody(phase, id, opts.tier, opts.title);
74
- }
75
- }
76
- else {
77
- body = renderDraftBody(phase, id, opts.tier, opts.title);
78
- }
79
- await writeFile(path, body);
80
- state.activePhase = phase;
81
- state.activeDraft = id;
82
- state.loopPosition = 'DRAFT';
83
- if (!state.openDrafts.some((d) => d.id === id)) {
84
- state.openDrafts.push({ id, since: new Date().toISOString() });
85
- }
86
- await backend.commit(state);
87
- console.log(`Created ${path}`);
88
- // Slice 34.3 — chained convert. Phase dir now exists, so the existing
89
- // FK check inside runRecommendationTransition will pass. If the convert
90
- // fails (race with another terminal mutating the rec status), the
91
- // scaffold is already on disk — print a recovery hint and exit non-zero.
92
- if (opts.fromRec !== undefined) {
93
- const convertRes = await runRecommendationTransition(cwd, opts.fromRec, 'convert', phase);
94
- if (!convertRes.ok) {
95
- process.stderr.write(`draft new: scaffold succeeded but convert failed: ${convertRes.error}. ` +
96
- `Run \`cadence recommendation convert ${opts.fromRec} --to-phase ${phase}\` to retry.\n`);
97
- process.exitCode = 1;
98
- return;
99
- }
100
- console.log(`recommendation ${opts.fromRec} → converted (to ${phase})`);
101
- }
102
- }
103
- catch (err) {
104
- process.stderr.write(`draft new failed: ${err instanceof Error ? err.message : String(err)}\n`);
105
- process.exitCode = 1;
106
- }
12
+ const { exitCode } = await draftNewService(process.cwd(), {
13
+ phase,
14
+ num,
15
+ title: opts.title,
16
+ tier: opts.tier,
17
+ ...(opts.fromRec !== undefined ? { fromRec: opts.fromRec } : {}),
18
+ }, processIO());
19
+ if (exitCode)
20
+ process.exitCode = exitCode;
107
21
  });
108
22
  }
109
23
  //# sourceMappingURL=draft-new.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"draft-new.js","sourceRoot":"","sources":["../../../src/cli/commands/draft-new.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"draft-new.js","sourceRoot":"","sources":["../../../src/cli/commands/draft-new.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,yEAAyE;AACzE,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,GAAG;SACA,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,wDAAwD,CAAC;SACrE,MAAM,CAAC,aAAa,EAAE,aAAa,EAAE,UAAU,CAAC;SAChD,MAAM,CAAC,YAAY,EAAE,uCAAuC,EAAE,UAAU,CAAC;SACzE,MAAM,CAAC,oBAAoB,EAAE,2FAA2F,CAAC;SACzH,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,GAAW,EAAE,IAAuD,EAAE,EAAE;QACpG,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,eAAe,CACxC,OAAO,CAAC,GAAG,EAAE,EACb;YACE,KAAK;YACL,GAAG;YACH,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACjE,EACD,SAAS,EAAE,CACZ,CAAC;QACF,IAAI,QAAQ;YAAE,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC5C,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"draft.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/draft.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoBzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwH3D"}
1
+ {"version":3,"file":"draft.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/draft.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuC3D"}
@@ -1,15 +1,6 @@
1
- import { readFile } from 'node:fs/promises';
2
- import { existsSync } from 'node:fs';
3
- import { join } from 'node:path';
4
- import { parseDraftMd } from '../../parse/draft-parser.js';
5
- import { coherenceCheck } from '../../coherence/check.js';
6
- import { SimpleStateBackend } from '../../state/simple.js';
7
- import { loadConfig } from '../../config/loader.js';
8
- import { effectiveGateSet } from '../../gates/engine.js';
9
- import { buildDraftContext } from '../../gates/draft-context.js';
10
- import { runCoherenceGate, emitCoherenceWarns, printAllCoherenceIssues, } from '../../gates/coherence.js';
11
- import { runApproveGate } from '../../gates/approve.js';
12
- import { runPlanReviewGate } from '../../gates/plan-review.js';
1
+ import { draftCheckService } from '../../services/draft-check.js';
2
+ import { draftApproveService } from '../../services/draft-approve.js';
3
+ import { processIO } from '../../services/io.js';
13
4
  import { registerDraftNew } from './draft-new.js';
14
5
  // Re-exported for the `ask-approve-verdict` suite (moved to gates/approve.ts).
15
6
  export { askApproveVerdict } from '../../gates/approve.js';
@@ -20,36 +11,9 @@ export function registerDraftCommand(program) {
20
11
  .command('check <path>')
21
12
  .description('Coherence-check a DRAFT.md against state.json + PROJECT.md')
22
13
  .action(async (path) => {
23
- try {
24
- const cwd = process.cwd();
25
- const draft = parseDraftMd(await readFile(path, 'utf8'));
26
- const state = await new SimpleStateBackend(cwd).readState();
27
- const projectMdPath = join(cwd, '.cadence', 'PROJECT.md');
28
- const projectMd = existsSync(projectMdPath) ? await readFile(projectMdPath, 'utf8') : '';
29
- const issues = coherenceCheck(draft, state, projectMd).issues;
30
- if (issues.length === 0) {
31
- console.log('coherence: OK');
32
- return;
33
- }
34
- const blocked = printAllCoherenceIssues(issues, { err: (s) => process.stderr.write(s) });
35
- // Phase 23.2 — coherence-warn emission (gated on anomaly-notify). Block
36
- // issues already printed loudly above; warns still emit even when blocked.
37
- if (issues.some((i) => i.severity === 'warn')) {
38
- const cfg = await loadConfig(cwd).catch(() => null);
39
- const ctx = buildDraftContext({
40
- cwd, state, draft, config: cfg,
41
- gateSet: effectiveGateSet(state, cfg, draft),
42
- phase: '', id: '', projectMd, opts: {},
43
- });
44
- await emitCoherenceWarns(ctx, 'coherence.check');
45
- }
46
- if (blocked)
47
- process.exitCode = 2;
48
- }
49
- catch (err) {
50
- process.stderr.write(`draft check failed: ${err instanceof Error ? err.message : String(err)}\n`);
51
- process.exitCode = 1;
52
- }
14
+ const { exitCode } = await draftCheckService(process.cwd(), { path }, processIO());
15
+ if (exitCode)
16
+ process.exitCode = exitCode;
53
17
  });
54
18
  cmd
55
19
  .command('approve <phase> <num>')
@@ -58,68 +22,15 @@ export function registerDraftCommand(program) {
58
22
  .option('--no-approve', "bypass the manual approve gate (Phase 24.1) per invocation; required for non-TTY runs when the 'approve' gate is in the effective set")
59
23
  .option('--allow-plan-review-failure', 'proceed past a failing plan-review gate (Phase 25.1) instead of refusing approve; findings are still printed')
60
24
  .action(async (phase, num, opts) => {
61
- try {
62
- const cwd = process.cwd();
63
- const id = `${phase.slice(0, 2)}-${num.padStart(2, '0')}`;
64
- const path = join(cwd, '.cadence', 'phases', phase, `${id}-DRAFT.md`);
65
- const draft = parseDraftMd(await readFile(path, 'utf8'));
66
- const backend = new SimpleStateBackend(cwd);
67
- const state = await backend.readState();
68
- const projectMdPath = join(cwd, '.cadence', 'PROJECT.md');
69
- const projectMd = existsSync(projectMdPath) ? await readFile(projectMdPath, 'utf8') : '';
70
- const cfg = await loadConfig(cwd).catch(() => null);
71
- const gateSet = effectiveGateSet(state, cfg, draft);
72
- const ctx = buildDraftContext({
73
- cwd, state, draft, config: cfg, gateSet, phase, id, projectMd,
74
- opts: {
75
- ...(opts.allowAutoComplex !== undefined ? { allowAutoComplex: opts.allowAutoComplex } : {}),
76
- ...(opts.approve !== undefined ? { approve: opts.approve } : {}),
77
- ...(opts.allowPlanReviewFailure !== undefined ? { allowPlanReviewFailure: opts.allowPlanReviewFailure } : {}),
78
- },
79
- });
80
- // Coherence blockers refuse before any state mutation (exit 2).
81
- if ((await runCoherenceGate(ctx)).outcome === 'refuse') {
82
- process.exitCode = 2;
83
- return;
84
- }
85
- // DESIGN.md §4 M2 — soft cap on auto × complex (Phase 21.1). Not a
86
- // named gate; router-owned, refused before the BUILD transition.
87
- if (gateSet.softCap && !opts.allowAutoComplex) {
88
- process.stderr.write('draft approve refused: auto × complex is soft-capped (DESIGN.md §4 M2). Pass --allow-auto-complex to override, or bump the draft\'s profile to standard/strict.\n');
89
- process.exitCode = 1;
90
- return;
91
- }
92
- if (gateSet.softCap && opts.allowAutoComplex) {
93
- process.stderr.write('draft approve: --allow-auto-complex set; proceeding past soft cap (auto × complex).\n');
94
- }
95
- // Manual approve gate (Phase 24.1) then plan-review gate (25.1 / 35.1).
96
- if ((await runApproveGate(ctx)).outcome === 'refuse') {
97
- process.exitCode = 1;
98
- return;
99
- }
100
- if ((await runPlanReviewGate(ctx)).outcome === 'refuse') {
101
- process.exitCode = 1;
102
- return;
103
- }
104
- // Coherence-warn emission at approve time (before the BUILD transition
105
- // so failed dispatches don't leave partial state).
106
- await emitCoherenceWarns(ctx, 'coherence.approve');
107
- state.activePhase = phase;
108
- state.activeDraft = id;
109
- state.loopPosition = 'BUILD';
110
- state.tier = draft.tier;
111
- // Phase 23.1 — stamp the approve timestamp for the DRAFT-read gate.
112
- state.draftReadAt = new Date().toISOString();
113
- if (!state.openDrafts.some((d) => d.id === id)) {
114
- state.openDrafts.push({ id, since: new Date().toISOString() });
115
- }
116
- await backend.commit(state);
117
- console.log(`Approved ${id}; loopPosition=BUILD`);
118
- }
119
- catch (err) {
120
- process.stderr.write(`draft approve failed: ${err instanceof Error ? err.message : String(err)}\n`);
121
- process.exitCode = 1;
122
- }
25
+ const { exitCode } = await draftApproveService(process.cwd(), {
26
+ phase,
27
+ num,
28
+ ...(opts.allowAutoComplex !== undefined ? { allowAutoComplex: opts.allowAutoComplex } : {}),
29
+ ...(opts.approve !== undefined ? { approve: opts.approve } : {}),
30
+ ...(opts.allowPlanReviewFailure !== undefined ? { allowPlanReviewFailure: opts.allowPlanReviewFailure } : {}),
31
+ }, processIO());
32
+ if (exitCode)
33
+ process.exitCode = exitCode;
123
34
  });
124
35
  }
125
36
  //# sourceMappingURL=draft.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"draft.js","sourceRoot":"","sources":["../../../src/cli/commands/draft.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"draft.js","sourceRoot":"","sources":["../../../src/cli/commands/draft.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,+EAA+E;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC;IAEzE,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAEtB,GAAG;SACA,OAAO,CAAC,cAAc,CAAC;SACvB,WAAW,CAAC,4DAA4D,CAAC;SACzE,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;QAC7B,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QACnF,IAAI,QAAQ;YAAE,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,uBAAuB,CAAC;SAChC,WAAW,CAAC,uCAAuC,CAAC;SACpD,MAAM,CAAC,sBAAsB,EAAE,2EAA2E,CAAC;SAC3G,MAAM,CAAC,cAAc,EAAE,uIAAuI,CAAC;SAC/J,MAAM,CAAC,6BAA6B,EAAE,8GAA8G,CAAC;SACrJ,MAAM,CACL,KAAK,EACH,KAAa,EACb,GAAW,EACX,IAAyF,EACzF,EAAE;QACF,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,mBAAmB,CAC5C,OAAO,CAAC,GAAG,EAAE,EACb;YACE,KAAK;YACL,GAAG;YACH,GAAG,CAAC,IAAI,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3F,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChE,GAAG,CAAC,IAAI,CAAC,sBAAsB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,sBAAsB,EAAE,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9G,EACD,SAAS,EAAE,CACZ,CAAC;QACF,IAAI,QAAQ;YAAE,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC5C,CAAC,CACF,CAAC;AACN,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerMcpCommand(program: Command): void;
3
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBzC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoBzD"}
@@ -0,0 +1,35 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { fileURLToPath } from 'node:url';
3
+ import { dirname, join, resolve } from 'node:path';
4
+ /** Read this package's version (dist/cli/commands/mcp.js → ../../../package.json). */
5
+ function readPackageVersion() {
6
+ try {
7
+ const pkgPath = join(dirname(fileURLToPath(import.meta.url)), '../../../package.json');
8
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
9
+ return pkg.version ?? '0.0.0';
10
+ }
11
+ catch {
12
+ return '0.0.0';
13
+ }
14
+ }
15
+ export function registerMcpCommand(program) {
16
+ const cmd = program.command('mcp').description('Model Context Protocol surface');
17
+ cmd
18
+ .command('serve')
19
+ .description('Run the CADENCE MCP server over stdio so any MCP host can drive the loop')
20
+ .option('--repo <path>', 'repo root to operate on (default: current working directory)')
21
+ .action(async (opts) => {
22
+ const repoRoot = opts.repo ? resolve(process.cwd(), opts.repo) : process.cwd();
23
+ // Lazy-import the SDK + server so ordinary CLI commands never load the MCP
24
+ // dependency (phase 58 AC-7). Both modules pull in @modelcontextprotocol/sdk.
25
+ const [{ buildCadenceMcpServer }, { StdioServerTransport }] = await Promise.all([
26
+ import('../../mcp/server.js'),
27
+ import('@modelcontextprotocol/sdk/server/stdio.js'),
28
+ ]);
29
+ const server = buildCadenceMcpServer(repoRoot, readPackageVersion());
30
+ const transport = new StdioServerTransport();
31
+ await server.connect(transport);
32
+ // server now owns the transport and serves until stdin closes.
33
+ });
34
+ }
35
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../../src/cli/commands/mcp.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEnD,sFAAsF;AACtF,SAAS,kBAAkB;IACzB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,uBAAuB,CAAC,CAAC;QACvF,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAyB,CAAC;QAC9E,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,gCAAgC,CAAC,CAAC;IAEjF,GAAG;SACA,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,0EAA0E,CAAC;SACvF,MAAM,CAAC,eAAe,EAAE,8DAA8D,CAAC;SACvF,MAAM,CAAC,KAAK,EAAE,IAAuB,EAAE,EAAE;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QAC/E,2EAA2E;QAC3E,8EAA8E;QAC9E,MAAM,CAAC,EAAE,qBAAqB,EAAE,EAAE,EAAE,oBAAoB,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC9E,MAAM,CAAC,qBAAqB,CAAC;YAC7B,MAAM,CAAC,2CAA2C,CAAC;SACpD,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,qBAAqB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,CAAC,CAAC;QACrE,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAChC,+DAA+D;IACjE,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/progress.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgB9D"}
1
+ {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/progress.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAQ9D"}
@@ -1,21 +1,13 @@
1
- import { SimpleStateBackend } from '../../state/simple.js';
2
- import { nextAction } from '../../progress.js';
1
+ import { progressService } from '../../services/progress.js';
2
+ import { processIO } from '../../services/io.js';
3
3
  export function registerProgressCommand(program) {
4
4
  program
5
5
  .command('progress')
6
6
  .description('Show single recommended next action')
7
7
  .action(async () => {
8
- try {
9
- const backend = new SimpleStateBackend(process.cwd());
10
- const state = await backend.readState();
11
- const action = nextAction(state);
12
- console.log(`Next: ${action.command}`);
13
- console.log(`Reason: ${action.reason}`);
14
- }
15
- catch (err) {
16
- process.stderr.write(`progress failed: ${err instanceof Error ? err.message : String(err)}\n`);
17
- process.exitCode = 1;
18
- }
8
+ const { exitCode } = await progressService(process.cwd(), processIO());
9
+ if (exitCode)
10
+ process.exitCode = exitCode;
19
11
  });
20
12
  }
21
13
  //# sourceMappingURL=progress.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"progress.js","sourceRoot":"","sources":["../../../src/cli/commands/progress.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,MAAM,UAAU,uBAAuB,CAAC,OAAgB;IACtD,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,qCAAqC,CAAC;SAClD,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,kBAAkB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YACtD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC/F,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"progress.js","sourceRoot":"","sources":["../../../src/cli/commands/progress.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,MAAM,UAAU,uBAAuB,CAAC,OAAgB;IACtD,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,qCAAqC,CAAC;SAClD,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QACvE,IAAI,QAAQ;YAAE,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC5C,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"recommend.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/recommend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsB/D"}
1
+ {"version":3,"file":"recommend.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/recommend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAe/D"}
@@ -1,24 +1,14 @@
1
- import { runRecommend } from '../../intelligence/recommend.js';
2
- import { renderRecommendMd } from '../../intelligence/render-recommend.js';
1
+ import { recommendService } from '../../services/recommend.js';
2
+ import { processIO } from '../../services/io.js';
3
3
  export function registerRecommendCommand(program) {
4
4
  program
5
5
  .command('recommend')
6
6
  .description('Rank actionable strategic recommendations and advise the next move (read-only)')
7
7
  .option('--json', 'emit machine-readable JSON instead of rendered text')
8
8
  .action(async (opts) => {
9
- try {
10
- const report = await runRecommend(process.cwd());
11
- if (opts.json) {
12
- process.stdout.write(JSON.stringify(report) + '\n');
13
- }
14
- else {
15
- process.stdout.write(renderRecommendMd(report));
16
- }
17
- }
18
- catch (err) {
19
- process.stderr.write(`recommend failed: ${err instanceof Error ? err.message : String(err)}\n`);
20
- process.exitCode = 1;
21
- }
9
+ const { exitCode } = await recommendService(process.cwd(), opts.json ? { json: true } : {}, processIO());
10
+ if (exitCode)
11
+ process.exitCode = exitCode;
22
12
  });
23
13
  }
24
14
  //# sourceMappingURL=recommend.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"recommend.js","sourceRoot":"","sources":["../../../src/cli/commands/recommend.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAE3E,MAAM,UAAU,wBAAwB,CAAC,OAAgB;IACvD,OAAO;SACJ,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CACV,gFAAgF,CACjF;SACA,MAAM,CAAC,QAAQ,EAAE,qDAAqD,CAAC;SACvE,MAAM,CAAC,KAAK,EAAE,IAAwB,EAAE,EAAE;QACzC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YACjD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;YACtD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,qBAAqB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAC1E,CAAC;YACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"recommend.js","sourceRoot":"","sources":["../../../src/cli/commands/recommend.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,MAAM,UAAU,wBAAwB,CAAC,OAAgB;IACvD,OAAO;SACJ,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CACV,gFAAgF,CACjF;SACA,MAAM,CAAC,QAAQ,EAAE,qDAAqD,CAAC;SACvE,MAAM,CAAC,KAAK,EAAE,IAAwB,EAAE,EAAE;QACzC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,gBAAgB,CACzC,OAAO,CAAC,GAAG,EAAE,EACb,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAC/B,SAAS,EAAE,CACZ,CAAC;QACF,IAAI,QAAQ;YAAE,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC5C,CAAC,CAAC,CAAC;AACP,CAAC"}