@manehorizons/cadence-core 1.7.0 → 1.9.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 (95) 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/draft-new.d.ts.map +1 -1
  5. package/dist/cli/commands/draft-new.js +11 -97
  6. package/dist/cli/commands/draft-new.js.map +1 -1
  7. package/dist/cli/commands/draft.d.ts.map +1 -1
  8. package/dist/cli/commands/draft.js +15 -104
  9. package/dist/cli/commands/draft.js.map +1 -1
  10. package/dist/cli/commands/mcp.d.ts +3 -0
  11. package/dist/cli/commands/mcp.d.ts.map +1 -0
  12. package/dist/cli/commands/mcp.js +35 -0
  13. package/dist/cli/commands/mcp.js.map +1 -0
  14. package/dist/cli/commands/progress.d.ts.map +1 -1
  15. package/dist/cli/commands/progress.js +5 -13
  16. package/dist/cli/commands/progress.js.map +1 -1
  17. package/dist/cli/commands/recommend.d.ts.map +1 -1
  18. package/dist/cli/commands/recommend.js +5 -15
  19. package/dist/cli/commands/recommend.js.map +1 -1
  20. package/dist/cli/commands/resume.d.ts.map +1 -1
  21. package/dist/cli/commands/resume.js +12 -1
  22. package/dist/cli/commands/resume.js.map +1 -1
  23. package/dist/cli/commands/settle.d.ts.map +1 -1
  24. package/dist/cli/commands/settle.js +5 -442
  25. package/dist/cli/commands/settle.js.map +1 -1
  26. package/dist/cli/commands/spec.d.ts.map +1 -1
  27. package/dist/cli/commands/spec.js +19 -197
  28. package/dist/cli/commands/spec.js.map +1 -1
  29. package/dist/cli/commands/status.d.ts.map +1 -1
  30. package/dist/cli/commands/status.js +5 -14
  31. package/dist/cli/commands/status.js.map +1 -1
  32. package/dist/cli/register.d.ts.map +1 -1
  33. package/dist/cli/register.js +2 -0
  34. package/dist/cli/register.js.map +1 -1
  35. package/dist/handoff/brief.d.ts +12 -0
  36. package/dist/handoff/brief.d.ts.map +1 -0
  37. package/dist/handoff/brief.js +40 -0
  38. package/dist/handoff/brief.js.map +1 -0
  39. package/dist/handoff/run-resume.d.ts +5 -1
  40. package/dist/handoff/run-resume.d.ts.map +1 -1
  41. package/dist/handoff/run-resume.js +23 -5
  42. package/dist/handoff/run-resume.js.map +1 -1
  43. package/dist/mcp/server.d.ts +12 -0
  44. package/dist/mcp/server.d.ts.map +1 -0
  45. package/dist/mcp/server.js +42 -0
  46. package/dist/mcp/server.js.map +1 -0
  47. package/dist/mcp/tools.d.ts +20 -0
  48. package/dist/mcp/tools.d.ts.map +1 -0
  49. package/dist/mcp/tools.js +189 -0
  50. package/dist/mcp/tools.js.map +1 -0
  51. package/dist/services/build-task.d.ts +12 -0
  52. package/dist/services/build-task.d.ts.map +1 -0
  53. package/dist/services/build-task.js +78 -0
  54. package/dist/services/build-task.js.map +1 -0
  55. package/dist/services/draft-approve.d.ts +14 -0
  56. package/dist/services/draft-approve.d.ts.map +1 -0
  57. package/dist/services/draft-approve.js +74 -0
  58. package/dist/services/draft-approve.js.map +1 -0
  59. package/dist/services/draft-check.d.ts +10 -0
  60. package/dist/services/draft-check.d.ts.map +1 -0
  61. package/dist/services/draft-check.js +47 -0
  62. package/dist/services/draft-check.js.map +1 -0
  63. package/dist/services/draft-new.d.ts +14 -0
  64. package/dist/services/draft-new.d.ts.map +1 -0
  65. package/dist/services/draft-new.js +98 -0
  66. package/dist/services/draft-new.js.map +1 -0
  67. package/dist/services/io.d.ts +39 -0
  68. package/dist/services/io.d.ts.map +1 -0
  69. package/dist/services/io.js +36 -0
  70. package/dist/services/io.js.map +1 -0
  71. package/dist/services/progress.d.ts +7 -0
  72. package/dist/services/progress.d.ts.map +1 -0
  73. package/dist/services/progress.js +21 -0
  74. package/dist/services/progress.js.map +1 -0
  75. package/dist/services/recommend.d.ts +9 -0
  76. package/dist/services/recommend.d.ts.map +1 -0
  77. package/dist/services/recommend.js +23 -0
  78. package/dist/services/recommend.js.map +1 -0
  79. package/dist/services/settle.d.ts +24 -0
  80. package/dist/services/settle.d.ts.map +1 -0
  81. package/dist/services/settle.js +366 -0
  82. package/dist/services/settle.js.map +1 -0
  83. package/dist/services/spec-approve.d.ts +11 -0
  84. package/dist/services/spec-approve.d.ts.map +1 -0
  85. package/dist/services/spec-approve.js +133 -0
  86. package/dist/services/spec-approve.js.map +1 -0
  87. package/dist/services/spec-new.d.ts +9 -0
  88. package/dist/services/spec-new.d.ts.map +1 -0
  89. package/dist/services/spec-new.js +62 -0
  90. package/dist/services/spec-new.js.map +1 -0
  91. package/dist/services/status.d.ts +9 -0
  92. package/dist/services/status.d.ts.map +1 -0
  93. package/dist/services/status.js +22 -0
  94. package/dist/services/status.js.map +1 -0
  95. package/package.json +3 -2
@@ -0,0 +1,189 @@
1
+ import { z } from 'zod';
2
+ import { progressService } from '../services/progress.js';
3
+ import { statusService } from '../services/status.js';
4
+ import { recommendService } from '../services/recommend.js';
5
+ import { draftNewService } from '../services/draft-new.js';
6
+ import { draftCheckService } from '../services/draft-check.js';
7
+ import { draftApproveService } from '../services/draft-approve.js';
8
+ import { buildTaskService } from '../services/build-task.js';
9
+ import { settleService } from '../services/settle.js';
10
+ import { specNewService } from '../services/spec-new.js';
11
+ import { specApproveService } from '../services/spec-approve.js';
12
+ const str = (v) => String(v);
13
+ const optStr = (v) => (typeof v === 'string' ? v : undefined);
14
+ const isTrue = (v) => v === true;
15
+ const TIER = z.enum(['quick-fix', 'standard', 'complex']);
16
+ const TASK_STATUS = z.enum(['DONE', 'DONE_WITH_CONCERNS', 'NEEDS_CONTEXT', 'BLOCKED']);
17
+ export const TOOLS = [
18
+ {
19
+ name: 'cadence_progress',
20
+ description: 'Show the single recommended next action for the CADENCE loop (read-only).',
21
+ inputSchema: {},
22
+ run: (repoRoot, _args, io) => progressService(repoRoot, io),
23
+ },
24
+ {
25
+ name: 'cadence_status',
26
+ description: 'Show full loop context: position, active phase/draft, tasks, AC results, next action (read-only).',
27
+ inputSchema: {
28
+ json: z.boolean().optional().describe('Return the raw status report instead of rendered text'),
29
+ },
30
+ run: (repoRoot, args, io) => statusService(repoRoot, isTrue(args.json) ? { json: true } : {}, io),
31
+ },
32
+ {
33
+ name: 'cadence_recommend',
34
+ description: 'Rank actionable strategic recommendations and advise the next move (read-only).',
35
+ inputSchema: {
36
+ json: z.boolean().optional().describe('Return the raw recommend report instead of rendered text'),
37
+ },
38
+ run: (repoRoot, args, io) => recommendService(repoRoot, isTrue(args.json) ? { json: true } : {}, io),
39
+ },
40
+ {
41
+ name: 'cadence_draft_new',
42
+ description: 'Scaffold a new DRAFT for a phase task and enter the DRAFT stage (requires loop IDLE). ' +
43
+ 'With fromRec, the recommendation is auto-converted to this phase.',
44
+ inputSchema: {
45
+ phase: z.string().describe('Phase slug, e.g. "58-mcp-server"'),
46
+ num: z.string().describe('Two-digit unit number within the phase, e.g. "01"'),
47
+ title: z.string().optional().describe('Draft title'),
48
+ tier: TIER.optional().describe('Work tier (default: standard)'),
49
+ fromRec: z.string().optional().describe('Recommendation id to convert into this phase'),
50
+ },
51
+ run: (repoRoot, args, io) => draftNewService(repoRoot, {
52
+ phase: str(args.phase),
53
+ num: str(args.num),
54
+ ...(optStr(args.title) !== undefined ? { title: optStr(args.title) } : {}),
55
+ ...(optStr(args.tier) !== undefined ? { tier: optStr(args.tier) } : {}),
56
+ ...(optStr(args.fromRec) !== undefined ? { fromRec: optStr(args.fromRec) } : {}),
57
+ }, io),
58
+ },
59
+ {
60
+ name: 'cadence_draft_check',
61
+ description: 'Run the structural coherence check on a phase DRAFT.md against state + PROJECT.md. ' +
62
+ 'Reports blocking issues exactly as the CLI does (command-boundary gate).',
63
+ inputSchema: {
64
+ phase: z.string().describe('Phase slug'),
65
+ num: z.string().describe('Two-digit unit number'),
66
+ },
67
+ run: (repoRoot, args, io) => {
68
+ const id = `${str(args.phase).slice(0, 2)}-${str(args.num).padStart(2, '0')}`;
69
+ const path = `.cadence/phases/${str(args.phase)}/${id}-DRAFT.md`;
70
+ return draftCheckService(repoRoot, { path }, io);
71
+ },
72
+ },
73
+ {
74
+ name: 'cadence_draft_approve',
75
+ description: 'Approve a DRAFT and enter BUILD. Runs the coherence → soft-cap → plan-review gate ladder ' +
76
+ '(the same command-boundary gates as the CLI). The interactive manual-approve prompt is ' +
77
+ 'bypassed over MCP — calling this tool IS the approval.',
78
+ inputSchema: {
79
+ phase: z.string().describe('Phase slug'),
80
+ num: z.string().describe('Two-digit unit number'),
81
+ allowAutoComplex: z
82
+ .boolean()
83
+ .optional()
84
+ .describe('Override the DESIGN.md §4 M2 soft cap on auto × complex drafts'),
85
+ allowPlanReviewFailure: z
86
+ .boolean()
87
+ .optional()
88
+ .describe('Proceed past a failing plan-review gate (findings still reported)'),
89
+ },
90
+ run: (repoRoot, args, io) => draftApproveService(repoRoot, {
91
+ phase: str(args.phase),
92
+ num: str(args.num),
93
+ approve: false, // no TTY over MCP; the tool call is the approval
94
+ ...(isTrue(args.allowAutoComplex) ? { allowAutoComplex: true } : {}),
95
+ ...(isTrue(args.allowPlanReviewFailure) ? { allowPlanReviewFailure: true } : {}),
96
+ }, io),
97
+ },
98
+ {
99
+ name: 'cadence_build_task',
100
+ description: 'Record the outcome of a BUILD task (runs the per-task verifier gate on DONE).',
101
+ inputSchema: {
102
+ taskId: z.string().describe('Task id from the active DRAFT, e.g. "T1"'),
103
+ status: TASK_STATUS.optional().describe('Outcome (default: DONE)'),
104
+ notes: z.string().optional().describe('Free-text notes recorded with the outcome'),
105
+ allowPerTaskFailure: z
106
+ .boolean()
107
+ .optional()
108
+ .describe('Record DONE even if the per-task verifier refuses'),
109
+ },
110
+ run: (repoRoot, args, io) => buildTaskService(repoRoot, {
111
+ taskId: str(args.taskId),
112
+ ...(optStr(args.status) !== undefined ? { status: optStr(args.status) } : {}),
113
+ ...(optStr(args.notes) !== undefined ? { notes: optStr(args.notes) } : {}),
114
+ ...(isTrue(args.allowPerTaskFailure) ? { allowPerTaskFailure: true } : {}),
115
+ }, io),
116
+ },
117
+ {
118
+ name: 'cadence_settle',
119
+ description: 'Close the loop: run the settle gate stack, write SUMMARY.{json,md}, and return to IDLE. ' +
120
+ 'Runs the full command-boundary gate stack (coverage, structural verifier, etc.). The ' +
121
+ 'interactive verdict walker is disabled over MCP; supply AC verdicts via "ac" or use "auto".',
122
+ inputSchema: {
123
+ ac: z
124
+ .array(z.string())
125
+ .optional()
126
+ .describe('AC verdicts, e.g. ["AC-1=pass", "AC-2=fail:reason"]'),
127
+ auto: z.boolean().optional().describe('Derive AC verdicts from task statuses'),
128
+ force: z.boolean().optional().describe('Settle even when --auto detects blocked/pending ACs'),
129
+ deep: z.boolean().optional().describe('Run the independent verifier agent against each AC'),
130
+ allowMissingCoverage: z.boolean().optional().describe('Skip the test-coverage gate'),
131
+ allowOpenTasks: z.boolean().optional().describe('Skip the structural-verifier gate'),
132
+ allowFailingBuild: z.boolean().optional().describe('Do not refuse on a failing test command'),
133
+ allowStaleDraft: z.boolean().optional().describe('Skip the DRAFT-read mtime gate'),
134
+ allowVerifierFailure: z.boolean().optional().describe('Do not refuse on verifier transport failure'),
135
+ allowCodeReviewFailure: z.boolean().optional().describe('Do not refuse on HIGH code-review findings'),
136
+ allowSecurityAuditFailure: z.boolean().optional().describe('Do not refuse on CRITICAL security findings'),
137
+ allowSkillAuditMiss: z.boolean().optional().describe('Do not refuse when required skills were not invoked'),
138
+ allowAutoComplex: z.boolean().optional().describe('Override the auto × complex soft cap'),
139
+ },
140
+ run: (repoRoot, args, io) => {
141
+ const flags = [
142
+ 'auto', 'force', 'deep', 'allowMissingCoverage', 'allowOpenTasks', 'allowFailingBuild',
143
+ 'allowStaleDraft', 'allowVerifierFailure', 'allowCodeReviewFailure',
144
+ 'allowSecurityAuditFailure', 'allowSkillAuditMiss', 'allowAutoComplex',
145
+ ];
146
+ const opts = { interactive: false };
147
+ if (Array.isArray(args.ac))
148
+ opts.ac = args.ac.map(String);
149
+ for (const f of flags)
150
+ if (isTrue(args[f]))
151
+ opts[f] = true;
152
+ return settleService(repoRoot, opts, io);
153
+ },
154
+ },
155
+ {
156
+ name: 'cadence_spec_new',
157
+ description: 'Scaffold a new SPEC for a phase task and enter the SPEC stage (requires loop IDLE).',
158
+ inputSchema: {
159
+ phase: z.string().describe('Phase slug'),
160
+ num: z.string().describe('Two-digit unit number'),
161
+ title: z.string().optional().describe('Spec title'),
162
+ fromRec: z.string().optional().describe('Recommendation id to convert into this phase'),
163
+ },
164
+ run: (repoRoot, args, io) => specNewService(repoRoot, {
165
+ phase: str(args.phase),
166
+ num: str(args.num),
167
+ ...(optStr(args.title) !== undefined ? { title: optStr(args.title) } : {}),
168
+ ...(optStr(args.fromRec) !== undefined ? { fromRec: optStr(args.fromRec) } : {}),
169
+ }, io),
170
+ },
171
+ {
172
+ name: 'cadence_spec_approve',
173
+ description: 'Run the convergent spec-review gate; on pass mark the SPEC APPROVED and leave the spec stage.',
174
+ inputSchema: {
175
+ phase: z.string().describe('Phase slug'),
176
+ num: z.string().describe('Two-digit unit number'),
177
+ allowSpecReviewFailure: z
178
+ .boolean()
179
+ .optional()
180
+ .describe('Proceed past a failing/unconverged spec-review'),
181
+ },
182
+ run: (repoRoot, args, io) => specApproveService(repoRoot, {
183
+ phase: str(args.phase),
184
+ num: str(args.num),
185
+ ...(isTrue(args.allowSpecReviewFailure) ? { allowSpecReviewFailure: true } : {}),
186
+ }, io),
187
+ },
188
+ ];
189
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { CommandIO, CommandResult } from './io.js';
2
+ /**
3
+ * `cadence build task <id>` — record a task outcome (runs the per-task verifier
4
+ * gate on DONE). Faithful extraction of the former CLI action body.
5
+ */
6
+ export declare function buildTaskService(repoRoot: string, args: {
7
+ taskId: string;
8
+ status?: string;
9
+ notes?: string;
10
+ allowPerTaskFailure?: boolean;
11
+ }, io: CommandIO): Promise<CommandResult>;
12
+ //# sourceMappingURL=build-task.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-task.d.ts","sourceRoot":"","sources":["../../src/services/build-task.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExD;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,mBAAmB,CAAC,EAAE,OAAO,CAAA;CAAE,EACxF,EAAE,EAAE,SAAS,GACZ,OAAO,CAAC,aAAa,CAAC,CAsExB"}
@@ -0,0 +1,78 @@
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';
14
+ /**
15
+ * `cadence build task <id>` — record a task outcome (runs the per-task verifier
16
+ * gate on DONE). Faithful extraction of the former CLI action body.
17
+ */
18
+ export async function buildTaskService(repoRoot, args, io) {
19
+ const statusRaw = args.status ?? 'DONE';
20
+ const notes = args.notes ?? '';
21
+ try {
22
+ const statusParse = TaskStatusZ.safeParse(statusRaw);
23
+ if (!statusParse.success ||
24
+ statusParse.data === 'PENDING' ||
25
+ statusParse.data === 'IN_PROGRESS') {
26
+ io.err(`Invalid task status: ${statusRaw}. Allowed: DONE | DONE_WITH_CONCERNS | NEEDS_CONTEXT | BLOCKED\n`);
27
+ return { exitCode: 2 };
28
+ }
29
+ const status = statusParse.data;
30
+ const backend = new SimpleStateBackend(repoRoot);
31
+ const state = await backend.readState();
32
+ let draft;
33
+ if (state.activePhase && state.activeDraft) {
34
+ const draftPath = join(repoRoot, '.cadence', 'phases', state.activePhase, `${state.activeDraft}-DRAFT.md`);
35
+ if (existsSync(draftPath)) {
36
+ draft = parseDraftMd(await readFile(draftPath, 'utf8'));
37
+ const validIds = draft.tasks.map((t) => t.id);
38
+ if (!validIds.includes(args.taskId)) {
39
+ io.err(`build task: unknown task id "${args.taskId}". ` +
40
+ `Valid ids in ${state.activeDraft}-DRAFT.md: ${validIds.join(', ') || '(none)'}. ` +
41
+ `Nothing recorded.\n`);
42
+ return { exitCode: 2 };
43
+ }
44
+ }
45
+ }
46
+ let perTaskRecord;
47
+ if (status === 'DONE' && draft) {
48
+ const cfg = await loadConfig(repoRoot).catch(() => null);
49
+ const ctx = buildBuildContext({
50
+ cwd: repoRoot,
51
+ state,
52
+ draft,
53
+ config: cfg,
54
+ gateSet: effectiveGateSet(state, cfg, draft),
55
+ taskId: args.taskId,
56
+ opts: args.allowPerTaskFailure !== undefined
57
+ ? { allowPerTaskFailure: args.allowPerTaskFailure }
58
+ : {},
59
+ });
60
+ const res = await runPerTaskVerifyGate(ctx);
61
+ if (res.outcome === 'refuse') {
62
+ return { exitCode: 1 };
63
+ }
64
+ perTaskRecord = res.summaryPatch?.perTaskRecord;
65
+ }
66
+ await recordTaskOutcome(repoRoot, args.taskId, status, notes, perTaskRecord);
67
+ io.out(`Recorded ${args.taskId}: ${status}\n`);
68
+ return { exitCode: 0, data: { taskId: args.taskId, status } };
69
+ }
70
+ catch (err) {
71
+ io.err(`build task failed: ${err instanceof Error ? err.message : String(err)}\n`);
72
+ if (err instanceof LoopViolationError) {
73
+ await emitLoopViolation(repoRoot, err, 'build.task');
74
+ }
75
+ return { exitCode: 1 };
76
+ }
77
+ }
78
+ //# sourceMappingURL=build-task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-task.js","sourceRoot":"","sources":["../../src/services/build-task.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { CommandIO, CommandResult } from './io.js';
2
+ /**
3
+ * `cadence draft approve <phase> <num>` — run the coherence → soft-cap →
4
+ * approve → plan-review gate ladder, then transition DRAFT→BUILD. Faithful
5
+ * extraction of the former CLI action body.
6
+ */
7
+ export declare function draftApproveService(repoRoot: string, args: {
8
+ phase: string;
9
+ num: string;
10
+ allowAutoComplex?: boolean;
11
+ approve?: boolean;
12
+ allowPlanReviewFailure?: boolean;
13
+ }, io: CommandIO): Promise<CommandResult>;
14
+ //# sourceMappingURL=draft-approve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draft-approve.d.ts","sourceRoot":"","sources":["../../src/services/draft-approve.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExD;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE;IACJ,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC,EACD,EAAE,EAAE,SAAS,GACZ,OAAO,CAAC,aAAa,CAAC,CA2DxB"}
@@ -0,0 +1,74 @@
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 { SimpleStateBackend } from '../state/simple.js';
6
+ import { loadConfig } from '../config/loader.js';
7
+ import { effectiveGateSet } from '../gates/engine.js';
8
+ import { buildDraftContext } from '../gates/draft-context.js';
9
+ import { runCoherenceGate, emitCoherenceWarns } from '../gates/coherence.js';
10
+ import { runApproveGate } from '../gates/approve.js';
11
+ import { runPlanReviewGate } from '../gates/plan-review.js';
12
+ /**
13
+ * `cadence draft approve <phase> <num>` — run the coherence → soft-cap →
14
+ * approve → plan-review gate ladder, then transition DRAFT→BUILD. Faithful
15
+ * extraction of the former CLI action body.
16
+ */
17
+ export async function draftApproveService(repoRoot, args, io) {
18
+ try {
19
+ const id = `${args.phase.slice(0, 2)}-${args.num.padStart(2, '0')}`;
20
+ const path = join(repoRoot, '.cadence', 'phases', args.phase, `${id}-DRAFT.md`);
21
+ const draft = parseDraftMd(await readFile(path, 'utf8'));
22
+ const backend = new SimpleStateBackend(repoRoot);
23
+ const state = await backend.readState();
24
+ const projectMdPath = join(repoRoot, '.cadence', 'PROJECT.md');
25
+ const projectMd = existsSync(projectMdPath) ? await readFile(projectMdPath, 'utf8') : '';
26
+ const cfg = await loadConfig(repoRoot).catch(() => null);
27
+ const gateSet = effectiveGateSet(state, cfg, draft);
28
+ const ctx = buildDraftContext({
29
+ cwd: repoRoot, state, draft, config: cfg, gateSet, phase: args.phase, id, projectMd,
30
+ opts: {
31
+ ...(args.allowAutoComplex !== undefined ? { allowAutoComplex: args.allowAutoComplex } : {}),
32
+ ...(args.approve !== undefined ? { approve: args.approve } : {}),
33
+ ...(args.allowPlanReviewFailure !== undefined ? { allowPlanReviewFailure: args.allowPlanReviewFailure } : {}),
34
+ },
35
+ });
36
+ // Coherence blockers refuse before any state mutation (exit 2).
37
+ if ((await runCoherenceGate(ctx)).outcome === 'refuse') {
38
+ return { exitCode: 2 };
39
+ }
40
+ // DESIGN.md §4 M2 — soft cap on auto × complex (Phase 21.1).
41
+ if (gateSet.softCap && !args.allowAutoComplex) {
42
+ io.err('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');
43
+ return { exitCode: 1 };
44
+ }
45
+ if (gateSet.softCap && args.allowAutoComplex) {
46
+ io.err('draft approve: --allow-auto-complex set; proceeding past soft cap (auto × complex).\n');
47
+ }
48
+ // Manual approve gate (Phase 24.1) then plan-review gate (25.1 / 35.1).
49
+ if ((await runApproveGate(ctx)).outcome === 'refuse') {
50
+ return { exitCode: 1 };
51
+ }
52
+ if ((await runPlanReviewGate(ctx)).outcome === 'refuse') {
53
+ return { exitCode: 1 };
54
+ }
55
+ // Coherence-warn emission at approve time (before the BUILD transition).
56
+ await emitCoherenceWarns(ctx, 'coherence.approve');
57
+ state.activePhase = args.phase;
58
+ state.activeDraft = id;
59
+ state.loopPosition = 'BUILD';
60
+ state.tier = draft.tier;
61
+ state.draftReadAt = new Date().toISOString();
62
+ if (!state.openDrafts.some((d) => d.id === id)) {
63
+ state.openDrafts.push({ id, since: new Date().toISOString() });
64
+ }
65
+ await backend.commit(state);
66
+ io.out(`Approved ${id}; loopPosition=BUILD\n`);
67
+ return { exitCode: 0, data: { id, loopPosition: 'BUILD' } };
68
+ }
69
+ catch (err) {
70
+ io.err(`draft approve failed: ${err instanceof Error ? err.message : String(err)}\n`);
71
+ return { exitCode: 1 };
72
+ }
73
+ }
74
+ //# sourceMappingURL=draft-approve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draft-approve.js","sourceRoot":"","sources":["../../src/services/draft-approve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { CommandIO, CommandResult } from './io.js';
2
+ /**
3
+ * `cadence draft check <path>` — coherence-check a DRAFT.md against state +
4
+ * PROJECT.md. `path` is resolved against `repoRoot` (absolute paths pass
5
+ * through). Exit 2 on a blocking issue, matching the CLI.
6
+ */
7
+ export declare function draftCheckService(repoRoot: string, args: {
8
+ path: string;
9
+ }, io: CommandIO): Promise<CommandResult>;
10
+ //# sourceMappingURL=draft-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draft-check.d.ts","sourceRoot":"","sources":["../../src/services/draft-check.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExD;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EACtB,EAAE,EAAE,SAAS,GACZ,OAAO,CAAC,aAAa,CAAC,CA6BxB"}
@@ -0,0 +1,47 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { existsSync } from 'node:fs';
3
+ import { join, resolve } 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 { emitCoherenceWarns, printAllCoherenceIssues } from '../gates/coherence.js';
11
+ /**
12
+ * `cadence draft check <path>` — coherence-check a DRAFT.md against state +
13
+ * PROJECT.md. `path` is resolved against `repoRoot` (absolute paths pass
14
+ * through). Exit 2 on a blocking issue, matching the CLI.
15
+ */
16
+ export async function draftCheckService(repoRoot, args, io) {
17
+ try {
18
+ const path = resolve(repoRoot, args.path);
19
+ const draft = parseDraftMd(await readFile(path, 'utf8'));
20
+ const state = await new SimpleStateBackend(repoRoot).readState();
21
+ const projectMdPath = join(repoRoot, '.cadence', 'PROJECT.md');
22
+ const projectMd = existsSync(projectMdPath) ? await readFile(projectMdPath, 'utf8') : '';
23
+ const issues = coherenceCheck(draft, state, projectMd).issues;
24
+ if (issues.length === 0) {
25
+ io.out('coherence: OK\n');
26
+ return { exitCode: 0, data: { ok: true, issues: [] } };
27
+ }
28
+ const blocked = printAllCoherenceIssues(issues, { err: (s) => io.err(s) });
29
+ // Phase 23.2 — coherence-warn emission (gated on anomaly-notify). Block
30
+ // issues already printed loudly above; warns still emit even when blocked.
31
+ if (issues.some((i) => i.severity === 'warn')) {
32
+ const cfg = await loadConfig(repoRoot).catch(() => null);
33
+ const ctx = buildDraftContext({
34
+ cwd: repoRoot, state, draft, config: cfg,
35
+ gateSet: effectiveGateSet(state, cfg, draft),
36
+ phase: '', id: '', projectMd, opts: {},
37
+ });
38
+ await emitCoherenceWarns(ctx, 'coherence.check');
39
+ }
40
+ return { exitCode: blocked ? 2 : 0, data: { ok: !blocked, issues } };
41
+ }
42
+ catch (err) {
43
+ io.err(`draft check failed: ${err instanceof Error ? err.message : String(err)}\n`);
44
+ return { exitCode: 1 };
45
+ }
46
+ }
47
+ //# sourceMappingURL=draft-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draft-check.js","sourceRoot":"","sources":["../../src/services/draft-check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { CommandIO, CommandResult } from './io.js';
2
+ /**
3
+ * `cadence draft new <phase> <num>` — scaffold a DRAFT.md (IDLE→DRAFT) and,
4
+ * with `fromRec`, chain-convert the recommendation. Faithful extraction of the
5
+ * former CLI action body.
6
+ */
7
+ export declare function draftNewService(repoRoot: string, args: {
8
+ phase: string;
9
+ num: string;
10
+ title?: string;
11
+ tier?: string;
12
+ fromRec?: string;
13
+ }, io: CommandIO): Promise<CommandResult>;
14
+ //# sourceMappingURL=draft-new.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draft-new.d.ts","sourceRoot":"","sources":["../../src/services/draft-new.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExD;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,EACrF,EAAE,EAAE,SAAS,GACZ,OAAO,CAAC,aAAa,CAAC,CAqFxB"}
@@ -0,0 +1,98 @@
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';
9
+ /**
10
+ * `cadence draft new <phase> <num>` — scaffold a DRAFT.md (IDLE→DRAFT) and,
11
+ * with `fromRec`, chain-convert the recommendation. Faithful extraction of the
12
+ * former CLI action body.
13
+ */
14
+ export async function draftNewService(repoRoot, args, io) {
15
+ const title = args.title ?? 'Untitled';
16
+ const tier = args.tier ?? 'standard';
17
+ try {
18
+ const backend = new SimpleStateBackend(repoRoot);
19
+ const state = await backend.readState();
20
+ if (state.loopPosition !== 'IDLE') {
21
+ const hint = state.loopPosition === 'SPEC'
22
+ ? `Approve or discard the active spec (${state.activeSpec ?? '?'}) first (cadence spec approve …).`
23
+ : `Settle or discard the active draft (${state.activeDraft ?? '?'}) first.`;
24
+ io.err(`draft new refused: loopPosition is ${state.loopPosition}, not IDLE. ${hint}\n`);
25
+ return { exitCode: 1 };
26
+ }
27
+ // Slice 34.3 — pre-flight the rec BEFORE any fs writes so we never
28
+ // scaffold a phase for a missing or unconvertible rec.
29
+ if (args.fromRec !== undefined) {
30
+ const recLedger = await readRecommendationLedger(repoRoot);
31
+ const rec = recLedger.recommendations.find((r) => r.id === args.fromRec);
32
+ if (!rec) {
33
+ io.err(`draft new refused: recommendation ${args.fromRec} not found\n`);
34
+ return { exitCode: 1 };
35
+ }
36
+ if (rec.status !== 'candidate' && rec.status !== 'accepted') {
37
+ io.err(`draft new refused: cannot convert recommendation in status ${rec.status}\n`);
38
+ return { exitCode: 1 };
39
+ }
40
+ }
41
+ const dir = join(repoRoot, '.cadence', 'phases', args.phase);
42
+ const padded = args.num.padStart(2, '0');
43
+ const id = `${args.phase.slice(0, 2)}-${padded}`;
44
+ const path = join(dir, `${id}-DRAFT.md`);
45
+ if (existsSync(path)) {
46
+ io.err(`DRAFT already exists: ${path}\n`);
47
+ return { exitCode: 2 };
48
+ }
49
+ await mkdir(dir, { recursive: true });
50
+ const specPath = join(dir, `${id}-SPEC.md`);
51
+ let body;
52
+ if (existsSync(specPath)) {
53
+ const rawSpec = await readFile(specPath, 'utf8');
54
+ if (frontmatterStatus(rawSpec) === 'APPROVED') {
55
+ try {
56
+ const spec = parseSpecMd(rawSpec);
57
+ body = renderDraftBody(args.phase, id, tier, title, spec);
58
+ io.out(`draft new: seeded objective + ${spec.acceptanceCriteria.length} AC(s) from approved SPEC ${id}\n`);
59
+ }
60
+ catch (err) {
61
+ io.err(`draft new: SPEC ${id} APPROVED but unparseable (${err instanceof Error ? err.message : String(err)}) — scaffolding empty\n`);
62
+ body = renderDraftBody(args.phase, id, tier, title);
63
+ }
64
+ }
65
+ else {
66
+ io.err(`draft new: SPEC ${id} present but not APPROVED — scaffolding empty\n`);
67
+ body = renderDraftBody(args.phase, id, tier, title);
68
+ }
69
+ }
70
+ else {
71
+ body = renderDraftBody(args.phase, id, tier, title);
72
+ }
73
+ await writeFile(path, body);
74
+ state.activePhase = args.phase;
75
+ state.activeDraft = id;
76
+ state.loopPosition = 'DRAFT';
77
+ if (!state.openDrafts.some((d) => d.id === id)) {
78
+ state.openDrafts.push({ id, since: new Date().toISOString() });
79
+ }
80
+ await backend.commit(state);
81
+ io.out(`Created ${path}\n`);
82
+ if (args.fromRec !== undefined) {
83
+ const convertRes = await runRecommendationTransition(repoRoot, args.fromRec, 'convert', args.phase);
84
+ if (!convertRes.ok) {
85
+ io.err(`draft new: scaffold succeeded but convert failed: ${convertRes.error}. ` +
86
+ `Run \`cadence recommendation convert ${args.fromRec} --to-phase ${args.phase}\` to retry.\n`);
87
+ return { exitCode: 1, data: { path, id, converted: false } };
88
+ }
89
+ io.out(`recommendation ${args.fromRec} → converted (to ${args.phase})\n`);
90
+ }
91
+ return { exitCode: 0, data: { path, id, converted: args.fromRec !== undefined } };
92
+ }
93
+ catch (err) {
94
+ io.err(`draft new failed: ${err instanceof Error ? err.message : String(err)}\n`);
95
+ return { exitCode: 1 };
96
+ }
97
+ }
98
+ //# sourceMappingURL=draft-new.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draft-new.js","sourceRoot":"","sources":["../../src/services/draft-new.ts"],"names":[],"mappings":"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"}