@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.
- package/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/build.js +10 -77
- package/dist/cli/commands/build.js.map +1 -1
- package/dist/cli/commands/draft-new.d.ts.map +1 -1
- package/dist/cli/commands/draft-new.js +11 -97
- package/dist/cli/commands/draft-new.js.map +1 -1
- package/dist/cli/commands/draft.d.ts.map +1 -1
- package/dist/cli/commands/draft.js +15 -104
- package/dist/cli/commands/draft.js.map +1 -1
- package/dist/cli/commands/mcp.d.ts +3 -0
- package/dist/cli/commands/mcp.d.ts.map +1 -0
- package/dist/cli/commands/mcp.js +35 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/commands/progress.d.ts.map +1 -1
- package/dist/cli/commands/progress.js +5 -13
- package/dist/cli/commands/progress.js.map +1 -1
- package/dist/cli/commands/recommend.d.ts.map +1 -1
- package/dist/cli/commands/recommend.js +5 -15
- package/dist/cli/commands/recommend.js.map +1 -1
- package/dist/cli/commands/resume.d.ts.map +1 -1
- package/dist/cli/commands/resume.js +12 -1
- package/dist/cli/commands/resume.js.map +1 -1
- package/dist/cli/commands/settle.d.ts.map +1 -1
- package/dist/cli/commands/settle.js +5 -442
- package/dist/cli/commands/settle.js.map +1 -1
- package/dist/cli/commands/spec.d.ts.map +1 -1
- package/dist/cli/commands/spec.js +19 -197
- package/dist/cli/commands/spec.js.map +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +5 -14
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/register.d.ts.map +1 -1
- package/dist/cli/register.js +2 -0
- package/dist/cli/register.js.map +1 -1
- package/dist/handoff/brief.d.ts +12 -0
- package/dist/handoff/brief.d.ts.map +1 -0
- package/dist/handoff/brief.js +40 -0
- package/dist/handoff/brief.js.map +1 -0
- package/dist/handoff/run-resume.d.ts +5 -1
- package/dist/handoff/run-resume.d.ts.map +1 -1
- package/dist/handoff/run-resume.js +23 -5
- package/dist/handoff/run-resume.js.map +1 -1
- package/dist/mcp/server.d.ts +12 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +42 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +20 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +189 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/services/build-task.d.ts +12 -0
- package/dist/services/build-task.d.ts.map +1 -0
- package/dist/services/build-task.js +78 -0
- package/dist/services/build-task.js.map +1 -0
- package/dist/services/draft-approve.d.ts +14 -0
- package/dist/services/draft-approve.d.ts.map +1 -0
- package/dist/services/draft-approve.js +74 -0
- package/dist/services/draft-approve.js.map +1 -0
- package/dist/services/draft-check.d.ts +10 -0
- package/dist/services/draft-check.d.ts.map +1 -0
- package/dist/services/draft-check.js +47 -0
- package/dist/services/draft-check.js.map +1 -0
- package/dist/services/draft-new.d.ts +14 -0
- package/dist/services/draft-new.d.ts.map +1 -0
- package/dist/services/draft-new.js +98 -0
- package/dist/services/draft-new.js.map +1 -0
- package/dist/services/io.d.ts +39 -0
- package/dist/services/io.d.ts.map +1 -0
- package/dist/services/io.js +36 -0
- package/dist/services/io.js.map +1 -0
- package/dist/services/progress.d.ts +7 -0
- package/dist/services/progress.d.ts.map +1 -0
- package/dist/services/progress.js +21 -0
- package/dist/services/progress.js.map +1 -0
- package/dist/services/recommend.d.ts +9 -0
- package/dist/services/recommend.d.ts.map +1 -0
- package/dist/services/recommend.js +23 -0
- package/dist/services/recommend.js.map +1 -0
- package/dist/services/settle.d.ts +24 -0
- package/dist/services/settle.d.ts.map +1 -0
- package/dist/services/settle.js +366 -0
- package/dist/services/settle.js.map +1 -0
- package/dist/services/spec-approve.d.ts +11 -0
- package/dist/services/spec-approve.d.ts.map +1 -0
- package/dist/services/spec-approve.js +133 -0
- package/dist/services/spec-approve.js.map +1 -0
- package/dist/services/spec-new.d.ts +9 -0
- package/dist/services/spec-new.d.ts.map +1 -0
- package/dist/services/spec-new.js +62 -0
- package/dist/services/spec-new.js.map +1 -0
- package/dist/services/status.d.ts +9 -0
- package/dist/services/status.d.ts.map +1 -0
- package/dist/services/status.js +22 -0
- package/dist/services/status.js.map +1 -0
- 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;
|
|
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 {
|
|
2
|
-
import {
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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":"AACA,OAAO,EAAE,
|
|
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"}
|
|
@@ -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;
|
|
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 {
|
|
2
|
-
import {
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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":"AACA,OAAO,EAAE,
|
|
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;
|
|
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 {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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":"AACA,OAAO,EAAE,
|
|
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 @@
|
|
|
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,
|
|
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 {
|
|
2
|
-
import {
|
|
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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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,
|
|
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,
|
|
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 {
|
|
2
|
-
import {
|
|
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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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,
|
|
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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resume.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/resume.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"resume.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/resume.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyC5D"}
|
|
@@ -4,9 +4,17 @@ export function registerResumeCommand(program) {
|
|
|
4
4
|
.command('resume')
|
|
5
5
|
.description('Replay the freshest .cadence/handoff/ SESSION doc + live context (read-only)')
|
|
6
6
|
.option('--json', 'emit machine-readable JSON instead of rendered text')
|
|
7
|
+
.option('--full', 'force full output (whole doc + live context replay)')
|
|
8
|
+
.option('--brief', 'force brief output (key sections only, no context replay)')
|
|
7
9
|
.action(async (opts) => {
|
|
10
|
+
if (opts.full && opts.brief) {
|
|
11
|
+
process.stderr.write('resume: --full and --brief are mutually exclusive\n');
|
|
12
|
+
process.exitCode = 1;
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
8
15
|
try {
|
|
9
|
-
const
|
|
16
|
+
const mode = opts.full ? 'full' : opts.brief ? 'brief' : undefined;
|
|
17
|
+
const res = await runResume(process.cwd(), mode ? { mode } : {});
|
|
10
18
|
if (opts.json) {
|
|
11
19
|
process.stdout.write(JSON.stringify(res) + '\n');
|
|
12
20
|
return;
|
|
@@ -20,6 +28,9 @@ export function registerResumeCommand(program) {
|
|
|
20
28
|
}
|
|
21
29
|
process.stdout.write(`--- narrative from ${res.handoffPath} ---\n\n`);
|
|
22
30
|
process.stdout.write(res.doc.endsWith('\n') ? res.doc : res.doc + '\n');
|
|
31
|
+
if (res.mode === 'brief') {
|
|
32
|
+
process.stdout.write('\nbrief mode; run `cadence resume --full` (or `cadence context handoff`) for the full doc + live context\n');
|
|
33
|
+
}
|
|
23
34
|
}
|
|
24
35
|
catch (err) {
|
|
25
36
|
process.stderr.write(`resume failed: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resume.js","sourceRoot":"","sources":["../../../src/cli/commands/resume.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAExD,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,8EAA8E,CAAC;SAC3F,MAAM,CAAC,QAAQ,EAAE,qDAAqD,CAAC;SACvE,MAAM,CAAC,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"resume.js","sourceRoot":"","sources":["../../../src/cli/commands/resume.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAExD,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,8EAA8E,CAAC;SAC3F,MAAM,CAAC,QAAQ,EAAE,qDAAqD,CAAC;SACvE,MAAM,CAAC,QAAQ,EAAE,qDAAqD,CAAC;SACvE,MAAM,CAAC,SAAS,EAAE,2DAA2D,CAAC;SAC9E,MAAM,CAAC,KAAK,EAAE,IAAyD,EAAE,EAAE;QAC1E,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;YAC5E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;YACnE,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACjE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;gBACjD,OAAO;YACT,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mEAAmE,CAAC,CAAC;gBAC1F,OAAO;YACT,CAAC;YACD,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;gBACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,wBAAwB,GAAG,CAAC,KAAK,CAAC,eAAe,oBAAoB,GAAG,CAAC,KAAK,CAAC,gBAAgB,MAAM,CACtG,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,GAAG,CAAC,WAAW,UAAU,CAAC,CAAC;YACtE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;YACxE,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,4GAA4G,CAC7G,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC7F,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settle.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/settle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"settle.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/settle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6D5D"}
|