@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,16 +1,8 @@
|
|
|
1
|
-
import { readFile
|
|
2
|
-
import { existsSync } from 'node:fs';
|
|
3
|
-
import { join } from 'node:path';
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
4
2
|
import { parseSpecMd } from '../../parse/spec-parser.js';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { selectNotifier } from '../../notify/factory.js';
|
|
9
|
-
import { selectSpecReviewVerifier } from '../../verify/spec-review-factory.js';
|
|
10
|
-
import { nextConvergence } from '../../verify/converge.js';
|
|
11
|
-
import { emitSpecReviewUnconverged } from '../../notify/spec-review.js';
|
|
12
|
-
import { readRecommendationLedger } from '../../intelligence/store/io.js';
|
|
13
|
-
import { runRecommendationTransition } from '../../intelligence/store/recommendations.js';
|
|
3
|
+
import { specNewService } from '../../services/spec-new.js';
|
|
4
|
+
import { specApproveService } from '../../services/spec-approve.js';
|
|
5
|
+
import { processIO } from '../../services/io.js';
|
|
14
6
|
/**
|
|
15
7
|
* Phase 36.1 — the pre-DRAFT SPEC stage. `spec new` (IDLE→SPEC) scaffolds a
|
|
16
8
|
* `<id>-SPEC.md`; the host agent/human authors it; `spec check` is a
|
|
@@ -26,69 +18,14 @@ export function registerSpecCommand(program) {
|
|
|
26
18
|
.option('--title <t>', 'Spec title', 'Untitled')
|
|
27
19
|
.option('--from-rec <recId>', 'Praxis recommendation id; on success the rec is auto-converted to this phase (Slice 34.3)')
|
|
28
20
|
.action(async (phase, num, opts) => {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
// Slice 34.3 — pre-flight the rec BEFORE any fs writes so we never
|
|
40
|
-
// scaffold a phase for a missing or unconvertible rec.
|
|
41
|
-
if (opts.fromRec !== undefined) {
|
|
42
|
-
const recLedger = await readRecommendationLedger(cwd);
|
|
43
|
-
const rec = recLedger.recommendations.find((r) => r.id === opts.fromRec);
|
|
44
|
-
if (!rec) {
|
|
45
|
-
process.stderr.write(`spec new refused: recommendation ${opts.fromRec} not found\n`);
|
|
46
|
-
process.exitCode = 1;
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
if (rec.status !== 'candidate' && rec.status !== 'accepted') {
|
|
50
|
-
process.stderr.write(`spec new refused: cannot convert recommendation in status ${rec.status}\n`);
|
|
51
|
-
process.exitCode = 1;
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
const dir = join(cwd, '.cadence', 'phases', phase);
|
|
56
|
-
const padded = num.padStart(2, '0');
|
|
57
|
-
const id = `${phase.slice(0, 2)}-${padded}`;
|
|
58
|
-
const path = join(dir, `${id}-SPEC.md`);
|
|
59
|
-
if (existsSync(path)) {
|
|
60
|
-
process.stderr.write(`SPEC already exists: ${path}\n`);
|
|
61
|
-
process.exitCode = 2;
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
await mkdir(dir, { recursive: true });
|
|
65
|
-
const body = `---\nphase: ${phase}\nid: ${id}\nstatus: PENDING\n---\n\n# ${id} — ${opts.title}\n\n## Objective\n\n_(one sentence)_\n\n## Acceptance Criteria\n\n### AC-1: _(name)_\nGiven _(precondition)_\nWhen _(action)_\nThen _(outcome)_\n\n## Constraints\n\n- _(constraint)_\n\n## Open Questions\n\n- _(question)_\n`;
|
|
66
|
-
await writeFile(path, body);
|
|
67
|
-
state.activePhase = phase;
|
|
68
|
-
state.activeSpec = id;
|
|
69
|
-
state.loopPosition = 'SPEC';
|
|
70
|
-
await backend.commit(state);
|
|
71
|
-
console.log(`Created ${path}`);
|
|
72
|
-
// Slice 34.3 — chained convert. Phase dir now exists, so the
|
|
73
|
-
// existing FK check inside runRecommendationTransition will pass.
|
|
74
|
-
// If the convert fails (race with another terminal mutating the
|
|
75
|
-
// rec status), the scaffold is already on disk — print a clear
|
|
76
|
-
// recovery hint and exit non-zero.
|
|
77
|
-
if (opts.fromRec !== undefined) {
|
|
78
|
-
const convertRes = await runRecommendationTransition(cwd, opts.fromRec, 'convert', phase);
|
|
79
|
-
if (!convertRes.ok) {
|
|
80
|
-
process.stderr.write(`spec new: scaffold succeeded but convert failed: ${convertRes.error}. ` +
|
|
81
|
-
`Run \`cadence recommendation convert ${opts.fromRec} --to-phase ${phase}\` to retry.\n`);
|
|
82
|
-
process.exitCode = 1;
|
|
83
|
-
return;
|
|
84
|
-
}
|
|
85
|
-
console.log(`recommendation ${opts.fromRec} → converted (to ${phase})`);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
catch (err) {
|
|
89
|
-
process.stderr.write(`spec new failed: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
90
|
-
process.exitCode = 1;
|
|
91
|
-
}
|
|
21
|
+
const { exitCode } = await specNewService(process.cwd(), {
|
|
22
|
+
phase,
|
|
23
|
+
num,
|
|
24
|
+
title: opts.title,
|
|
25
|
+
...(opts.fromRec !== undefined ? { fromRec: opts.fromRec } : {}),
|
|
26
|
+
}, processIO());
|
|
27
|
+
if (exitCode)
|
|
28
|
+
process.exitCode = exitCode;
|
|
92
29
|
});
|
|
93
30
|
cmd
|
|
94
31
|
.command('check <path>')
|
|
@@ -120,128 +57,13 @@ export function registerSpecCommand(program) {
|
|
|
120
57
|
.description('Run the convergent spec-review gate; on pass leave the spec stage (SPEC→IDLE)')
|
|
121
58
|
.option('--allow-spec-review-failure', 'proceed past a failing/unconverged spec-review instead of refusing; findings still printed')
|
|
122
59
|
.action(async (phase, num, opts) => {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
process.stderr.write(`spec approve refused: loopPosition is ${state.loopPosition}, not SPEC.\n`);
|
|
131
|
-
process.exitCode = 1;
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
const specPath = join(cwd, '.cadence', 'phases', phase, `${id}-SPEC.md`);
|
|
135
|
-
if (!existsSync(specPath)) {
|
|
136
|
-
process.stderr.write(`spec approve refused: ${specPath} not found.\n`);
|
|
137
|
-
process.exitCode = 1;
|
|
138
|
-
return;
|
|
139
|
-
}
|
|
140
|
-
const rawSpec = await readFile(specPath, 'utf8');
|
|
141
|
-
const spec = parseSpecMd(rawSpec);
|
|
142
|
-
const cfg = await loadConfig(cwd).catch(() => null);
|
|
143
|
-
// Convergent spec-review — ports the Phase 35.1 plan-review block
|
|
144
|
-
// verbatim (Draft→Spec). spec-review always runs at `spec approve`
|
|
145
|
-
// (the spec stage is itself the opt-in; not a gate-matrix cell).
|
|
146
|
-
const verifier = selectSpecReviewVerifier(cfg);
|
|
147
|
-
const sidecarPath = join(cwd, '.cadence', 'phases', phase, `${id}-SPEC-REVIEW.json`);
|
|
148
|
-
let attemptsSoFar = 0;
|
|
149
|
-
let history = [];
|
|
150
|
-
if (existsSync(sidecarPath)) {
|
|
151
|
-
try {
|
|
152
|
-
const prior = JSON.parse(await readFile(sidecarPath, 'utf8'));
|
|
153
|
-
if (typeof prior.attempts === 'number')
|
|
154
|
-
attemptsSoFar = prior.attempts;
|
|
155
|
-
if (Array.isArray(prior.history))
|
|
156
|
-
history = prior.history;
|
|
157
|
-
}
|
|
158
|
-
catch {
|
|
159
|
-
/* corrupt/legacy → fresh */
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
const res = await verifier.verify({ spec });
|
|
163
|
-
const maxAttempts = cfg?.convergence?.maxAttempts ?? 3;
|
|
164
|
-
const nv = nextConvergence(res.pass, attemptsSoFar, maxAttempts);
|
|
165
|
-
const now = new Date().toISOString();
|
|
166
|
-
const bypassed = !res.pass && opts.allowSpecReviewFailure === true;
|
|
167
|
-
history.push({
|
|
168
|
-
at: now,
|
|
169
|
-
pass: res.pass,
|
|
170
|
-
findingsCount: res.findings.length,
|
|
171
|
-
provider: res.provider,
|
|
172
|
-
...(res.model ? { model: res.model } : {}),
|
|
173
|
-
verdict: nv.verdict,
|
|
174
|
-
...(bypassed ? { bypassed: true } : {}),
|
|
175
|
-
});
|
|
176
|
-
await atomicWriteText(sidecarPath, JSON.stringify({
|
|
177
|
-
specId: id,
|
|
178
|
-
converged: res.pass,
|
|
179
|
-
attempts: nv.verdict === 'pass' ? attemptsSoFar : nv.attempt,
|
|
180
|
-
maxAttempts,
|
|
181
|
-
history,
|
|
182
|
-
pass: res.pass,
|
|
183
|
-
provider: res.provider,
|
|
184
|
-
...(res.model ? { model: res.model } : {}),
|
|
185
|
-
findings: res.findings.length,
|
|
186
|
-
at: now,
|
|
187
|
-
}, null, 2) + '\n');
|
|
188
|
-
if (!res.pass) {
|
|
189
|
-
for (const f of res.findings) {
|
|
190
|
-
process.stderr.write(`spec-review: ${f.severity} — ${f.message}\n`);
|
|
191
|
-
if (f.suggestedEdit) {
|
|
192
|
-
process.stderr.write(` ↳ suggested: ${f.suggestedEdit}\n`);
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
if (opts.allowSpecReviewFailure) {
|
|
196
|
-
if (nv.verdict === 'escalate') {
|
|
197
|
-
await emitSpecReviewUnconverged(selectNotifier(cfg), {
|
|
198
|
-
specId: id,
|
|
199
|
-
attempts: nv.attempt,
|
|
200
|
-
maxAttempts,
|
|
201
|
-
findings: res.findings.length,
|
|
202
|
-
provider: res.provider,
|
|
203
|
-
...(res.model ? { model: res.model } : {}),
|
|
204
|
-
bypassed: true,
|
|
205
|
-
});
|
|
206
|
-
}
|
|
207
|
-
process.stderr.write(`spec-review: --allow-spec-review-failure set; proceeding past ` +
|
|
208
|
-
`${res.findings.length} finding(s).\n`);
|
|
209
|
-
// fall through to APPROVED + IDLE.
|
|
210
|
-
}
|
|
211
|
-
else if (nv.verdict === 'reloop') {
|
|
212
|
-
process.stderr.write(`spec-review: attempt ${nv.attempt}/${maxAttempts} did not pass — ` +
|
|
213
|
-
`fix the SPEC and re-run \`cadence spec approve\`, ` +
|
|
214
|
-
`or pass --allow-spec-review-failure to proceed anyway.\n`);
|
|
215
|
-
process.exitCode = 1;
|
|
216
|
-
return;
|
|
217
|
-
}
|
|
218
|
-
else {
|
|
219
|
-
await emitSpecReviewUnconverged(selectNotifier(cfg), {
|
|
220
|
-
specId: id,
|
|
221
|
-
attempts: nv.attempt,
|
|
222
|
-
maxAttempts,
|
|
223
|
-
findings: res.findings.length,
|
|
224
|
-
provider: res.provider,
|
|
225
|
-
...(res.model ? { model: res.model } : {}),
|
|
226
|
-
});
|
|
227
|
-
process.stderr.write(`spec approve refused: spec-review did NOT converge after ` +
|
|
228
|
-
`${maxAttempts} attempts — a human decision is required. ` +
|
|
229
|
-
`Re-scope the spec, or pass --allow-spec-review-failure to proceed anyway.\n`);
|
|
230
|
-
process.exitCode = 1;
|
|
231
|
-
return;
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
// Converged (or bypassed): mark APPROVED, leave the spec stage.
|
|
235
|
-
await atomicWriteText(specPath, rawSpec.replace(/^status: PENDING$/m, 'status: APPROVED'));
|
|
236
|
-
state.loopPosition = 'IDLE';
|
|
237
|
-
state.activeSpec = null;
|
|
238
|
-
await backend.commit(state);
|
|
239
|
-
console.log(`Approved spec ${id}; loopPosition=IDLE`);
|
|
240
|
-
}
|
|
241
|
-
catch (err) {
|
|
242
|
-
process.stderr.write(`spec approve failed: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
243
|
-
process.exitCode = 1;
|
|
244
|
-
}
|
|
60
|
+
const { exitCode } = await specApproveService(process.cwd(), {
|
|
61
|
+
phase,
|
|
62
|
+
num,
|
|
63
|
+
...(opts.allowSpecReviewFailure !== undefined ? { allowSpecReviewFailure: opts.allowSpecReviewFailure } : {}),
|
|
64
|
+
}, processIO());
|
|
65
|
+
if (exitCode)
|
|
66
|
+
process.exitCode = exitCode;
|
|
245
67
|
});
|
|
246
68
|
}
|
|
247
69
|
//# sourceMappingURL=spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spec.js","sourceRoot":"","sources":["../../../src/cli/commands/spec.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"spec.js","sourceRoot":"","sources":["../../../src/cli/commands/spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUzC,OAAO,EAA+B,KAAK,YAAY,EAAoB,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUzC,OAAO,EAA+B,KAAK,YAAY,EAAoB,MAAM,6BAA6B,CAAC;AAO/G,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0H5D;AAED,+EAA+E;AAC/E,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG;IAC9C,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;CACb,CAcA;AAED,kEAAkE;AAClE,wBAAgB,UAAU,CACxB,MAAM,EAAE,YAAY,EAAE,EACtB,KAAK,EAAE,MAAM,GACZ,YAAY,EAAE,CAGhB"}
|
|
@@ -2,8 +2,9 @@ import { readFile } from 'node:fs/promises';
|
|
|
2
2
|
import { existsSync, statSync, openSync, readSync, closeSync, } from 'node:fs';
|
|
3
3
|
import { isAbsolute, join } from 'node:path';
|
|
4
4
|
import { AnomalyEventZ, AnomalyTypeZ } from '@manehorizons/cadence-types';
|
|
5
|
-
import { loadStatus, renderStatus } from '../../status.js';
|
|
6
5
|
import { loadConfig } from '../../config/loader.js';
|
|
6
|
+
import { statusService } from '../../services/status.js';
|
|
7
|
+
import { processIO } from '../../services/io.js';
|
|
7
8
|
const DEFAULT_LOG = '.cadence/anomalies.log';
|
|
8
9
|
export function registerStatusCommand(program) {
|
|
9
10
|
const cmd = program
|
|
@@ -13,19 +14,9 @@ export function registerStatusCommand(program) {
|
|
|
13
14
|
.option('--json', 'emit machine-readable JSON instead of rendered text')
|
|
14
15
|
.action(async (opts) => {
|
|
15
16
|
// Default action — runs only when no subcommand is given.
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
process.stdout.write(JSON.stringify(report) + '\n');
|
|
20
|
-
}
|
|
21
|
-
else {
|
|
22
|
-
process.stdout.write(renderStatus(report));
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
catch (err) {
|
|
26
|
-
process.stderr.write(`status failed: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
27
|
-
process.exitCode = 1;
|
|
28
|
-
}
|
|
17
|
+
const { exitCode } = await statusService(process.cwd(), opts.json ? { json: true } : {}, processIO());
|
|
18
|
+
if (exitCode)
|
|
19
|
+
process.exitCode = exitCode;
|
|
29
20
|
});
|
|
30
21
|
cmd
|
|
31
22
|
.command('anomalies')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EACL,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,SAAS,GACV,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAuC,MAAM,6BAA6B,CAAC;AAC/G,OAAO,EAAE,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/cli/register.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/cli/register.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0BzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyB1D"}
|
package/dist/cli/register.js
CHANGED
|
@@ -21,6 +21,7 @@ import { registerAssumptionCommand } from './commands/assumption.js';
|
|
|
21
21
|
import { registerDecisionCommand } from './commands/decision.js';
|
|
22
22
|
import { registerIntelligenceCommand } from './commands/intelligence.js';
|
|
23
23
|
import { registerDoctorCommand } from './commands/doctor.js';
|
|
24
|
+
import { registerMcpCommand } from './commands/mcp.js';
|
|
24
25
|
export function registerAllCommands(program) {
|
|
25
26
|
registerConfigCommand(program);
|
|
26
27
|
registerInitCommand(program);
|
|
@@ -45,5 +46,6 @@ export function registerAllCommands(program) {
|
|
|
45
46
|
registerDecisionCommand(program);
|
|
46
47
|
registerIntelligenceCommand(program);
|
|
47
48
|
registerDoctorCommand(program);
|
|
49
|
+
registerMcpCommand(program);
|
|
48
50
|
}
|
|
49
51
|
//# sourceMappingURL=register.js.map
|
package/dist/cli/register.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/cli/register.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/cli/register.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7B,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7B,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7B,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7B,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,2BAA2B,CAAC,OAAO,CAAC,CAAC;IACrC,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACjC,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,6BAA6B,CAAC,OAAO,CAAC,CAAC;IACvC,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAChC,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAClC,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAClC,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAChC,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAChC,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,yBAAyB,CAAC,OAAO,CAAC,CAAC;IACnC,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACjC,2BAA2B,CAAC,OAAO,CAAC,CAAC;IACrC,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** H2-header prefixes kept in a brief resume. Matched by PREFIX because some
|
|
2
|
+
* rendered headers carry decorative suffixes (e.g.
|
|
3
|
+
* "## State on handoff · pre-filled — verify, don't retype"). */
|
|
4
|
+
export declare const BRIEF_SECTION_PREFIXES: readonly ["## TL;DR", "## State on handoff", "## Carry-forward gotchas", "## Next action", "## Quick resume commands"];
|
|
5
|
+
/**
|
|
6
|
+
* Return only the H2 sections whose header starts with one of `prefixes`,
|
|
7
|
+
* preserving document order. If none match (e.g. a pre-1.5 / hand-authored
|
|
8
|
+
* doc with none of the known anchors), return the full content unchanged —
|
|
9
|
+
* we degrade toward MORE information, never an empty resume.
|
|
10
|
+
*/
|
|
11
|
+
export declare function extractBriefSections(content: string, prefixes?: readonly string[]): string;
|
|
12
|
+
//# sourceMappingURL=brief.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brief.d.ts","sourceRoot":"","sources":["../../src/handoff/brief.ts"],"names":[],"mappings":"AAEA;;qEAEqE;AACrE,eAAO,MAAM,sBAAsB,wHAMzB,CAAC;AAEX;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,SAAS,MAAM,EAA2B,GACnD,MAAM,CAoBR"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// packages/core/src/handoff/brief.ts
|
|
2
|
+
/** H2-header prefixes kept in a brief resume. Matched by PREFIX because some
|
|
3
|
+
* rendered headers carry decorative suffixes (e.g.
|
|
4
|
+
* "## State on handoff · pre-filled — verify, don't retype"). */
|
|
5
|
+
export const BRIEF_SECTION_PREFIXES = [
|
|
6
|
+
'## TL;DR',
|
|
7
|
+
'## State on handoff',
|
|
8
|
+
'## Carry-forward gotchas',
|
|
9
|
+
'## Next action',
|
|
10
|
+
'## Quick resume commands',
|
|
11
|
+
];
|
|
12
|
+
/**
|
|
13
|
+
* Return only the H2 sections whose header starts with one of `prefixes`,
|
|
14
|
+
* preserving document order. If none match (e.g. a pre-1.5 / hand-authored
|
|
15
|
+
* doc with none of the known anchors), return the full content unchanged —
|
|
16
|
+
* we degrade toward MORE information, never an empty resume.
|
|
17
|
+
*/
|
|
18
|
+
export function extractBriefSections(content, prefixes = BRIEF_SECTION_PREFIXES) {
|
|
19
|
+
const lines = content.split('\n');
|
|
20
|
+
const sections = [];
|
|
21
|
+
let current = null;
|
|
22
|
+
for (const line of lines) {
|
|
23
|
+
if (line.startsWith('## ')) {
|
|
24
|
+
if (prefixes.some((p) => line.startsWith(p))) {
|
|
25
|
+
current = [line];
|
|
26
|
+
sections.push(current);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
current = null; // a non-brief H2 closes the previous kept section
|
|
30
|
+
}
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
if (current)
|
|
34
|
+
current.push(line);
|
|
35
|
+
}
|
|
36
|
+
if (sections.length === 0)
|
|
37
|
+
return content;
|
|
38
|
+
return sections.map((s) => s.join('\n').trimEnd()).join('\n\n') + '\n';
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=brief.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brief.js","sourceRoot":"","sources":["../../src/handoff/brief.ts"],"names":[],"mappings":"AAAA,qCAAqC;AAErC;;qEAEqE;AACrE,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,UAAU;IACV,qBAAqB;IACrB,0BAA0B;IAC1B,gBAAgB;IAChB,0BAA0B;CAClB,CAAC;AAEX;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAe,EACf,WAA8B,sBAAsB;IAEpD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAe,EAAE,CAAC;IAChC,IAAI,OAAO,GAAoB,IAAI,CAAC;IAEpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7C,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC;gBACjB,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzB,CAAC;iBAAM,CAAC;gBACN,OAAO,GAAG,IAAI,CAAC,CAAC,kDAAkD;YACpE,CAAC;YACD,SAAS;QACX,CAAC;QACD,IAAI,OAAO;YAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IAC1C,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;AACzE,CAAC"}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
1
|
import type { ResumeResult } from '@manehorizons/cadence-types';
|
|
2
|
-
export
|
|
2
|
+
export interface ResumeOptions {
|
|
3
|
+
/** Force output mode. Omitted → drift decides: drift → 'full', else 'brief'. */
|
|
4
|
+
mode?: 'brief' | 'full';
|
|
5
|
+
}
|
|
6
|
+
export declare function runResume(root: string, opts?: ResumeOptions, now?: Date): Promise<ResumeResult>;
|
|
3
7
|
//# sourceMappingURL=run-resume.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-resume.d.ts","sourceRoot":"","sources":["../../src/handoff/run-resume.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"run-resume.d.ts","sourceRoot":"","sources":["../../src/handoff/run-resume.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAMhE,MAAM,WAAW,aAAa;IAC5B,gFAAgF;IAChF,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CACzB;AAED,wBAAsB,SAAS,CAC7B,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,aAAkB,EACxB,GAAG,GAAE,IAAiB,GACrB,OAAO,CAAC,YAAY,CAAC,CA+CvB"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { SimpleStateBackend } from '../state/simple.js';
|
|
2
2
|
import { runContext } from '../intelligence/context.js';
|
|
3
3
|
import { locateFreshestHandoff } from './locate.js';
|
|
4
|
-
|
|
4
|
+
import { extractBriefSections } from './brief.js';
|
|
5
|
+
export async function runResume(root, opts = {}, now = new Date()) {
|
|
5
6
|
let lastHandoff = null;
|
|
6
7
|
let liveLoopPosition = null;
|
|
7
8
|
try {
|
|
@@ -10,22 +11,39 @@ export async function runResume(root, now = new Date()) {
|
|
|
10
11
|
liveLoopPosition = state.loopPosition;
|
|
11
12
|
}
|
|
12
13
|
catch {
|
|
13
|
-
//
|
|
14
|
+
// No/corrupt state: fall back to globbing for the doc. With no live loop
|
|
15
|
+
// position we cannot compute drift, so `mode` resolves to 'brief' below —
|
|
16
|
+
// a corrupt state.json yields brief output with no drift warning. Pass
|
|
17
|
+
// --full to force the whole doc + live context in that case.
|
|
14
18
|
}
|
|
15
19
|
const located = await locateFreshestHandoff(root, lastHandoff);
|
|
16
20
|
if (!located)
|
|
17
21
|
return { found: false };
|
|
18
|
-
const context = await runContext(root, 'handoff', now);
|
|
19
22
|
const drift = located.loopPosition && liveLoopPosition && located.loopPosition !== liveLoopPosition
|
|
20
23
|
? { docLoopPosition: located.loopPosition, liveLoopPosition }
|
|
21
24
|
: null;
|
|
25
|
+
const mode = opts.mode ?? (drift ? 'full' : 'brief');
|
|
26
|
+
if (mode === 'full') {
|
|
27
|
+
const context = await runContext(root, 'handoff', now);
|
|
28
|
+
return {
|
|
29
|
+
found: true,
|
|
30
|
+
handoffPath: located.path,
|
|
31
|
+
generatedAt: located.generatedAt,
|
|
32
|
+
doc: located.content,
|
|
33
|
+
context,
|
|
34
|
+
drift,
|
|
35
|
+
mode,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
// brief: skip the live-context recompute entirely — the doc is authoritative
|
|
22
39
|
return {
|
|
23
40
|
found: true,
|
|
24
41
|
handoffPath: located.path,
|
|
25
42
|
generatedAt: located.generatedAt,
|
|
26
|
-
doc: located.content,
|
|
27
|
-
context,
|
|
43
|
+
doc: extractBriefSections(located.content),
|
|
44
|
+
context: null,
|
|
28
45
|
drift,
|
|
46
|
+
mode,
|
|
29
47
|
};
|
|
30
48
|
}
|
|
31
49
|
//# sourceMappingURL=run-resume.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-resume.js","sourceRoot":"","sources":["../../src/handoff/run-resume.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"run-resume.js","sourceRoot":"","sources":["../../src/handoff/run-resume.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAOlD,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,IAAY,EACZ,OAAsB,EAAE,EACxB,MAAY,IAAI,IAAI,EAAE;IAEtB,IAAI,WAAW,GAAkB,IAAI,CAAC;IACtC,IAAI,gBAAgB,GAAkB,IAAI,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;QAC7D,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;QACxC,gBAAgB,GAAG,KAAK,CAAC,YAAY,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,yEAAyE;QACzE,0EAA0E;QAC1E,uEAAuE;QACvE,6DAA6D;IAC/D,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC/D,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAEtC,MAAM,KAAK,GACT,OAAO,CAAC,YAAY,IAAI,gBAAgB,IAAI,OAAO,CAAC,YAAY,KAAK,gBAAgB;QACnF,CAAC,CAAC,EAAE,eAAe,EAAE,OAAO,CAAC,YAAY,EAAE,gBAAgB,EAAE;QAC7D,CAAC,CAAC,IAAI,CAAC;IAEX,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAErD,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QACvD,OAAO;YACL,KAAK,EAAE,IAAI;YACX,WAAW,EAAE,OAAO,CAAC,IAAI;YACzB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,GAAG,EAAE,OAAO,CAAC,OAAO;YACpB,OAAO;YACP,KAAK;YACL,IAAI;SACL,CAAC;IACJ,CAAC;IAED,6EAA6E;IAC7E,OAAO;QACL,KAAK,EAAE,IAAI;QACX,WAAW,EAAE,OAAO,CAAC,IAAI;QACzB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,GAAG,EAAE,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC;QAC1C,OAAO,EAAE,IAAI;QACb,KAAK;QACL,IAAI;KACL,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
/**
|
|
3
|
+
* Build the CADENCE MCP server (phase 58) — a third surface alongside the CLI
|
|
4
|
+
* and the Claude-Code hook adapter. Registers the curated tool set; each tool
|
|
5
|
+
* runs its shared service with a buffered `io` and serializes the captured text
|
|
6
|
+
* plus structured `data` into the tool result. Pure: the caller owns transport
|
|
7
|
+
* (`StdioServerTransport` in production, `InMemoryTransport` in tests).
|
|
8
|
+
*/
|
|
9
|
+
export declare function buildCadenceMcpServer(repoRoot: string, version: string): McpServer;
|
|
10
|
+
/** The curated tool names this server advertises (handy for tests/AC-1). */
|
|
11
|
+
export declare const TOOL_NAMES: readonly string[];
|
|
12
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAiClF;AAED,4EAA4E;AAC5E,eAAO,MAAM,UAAU,EAAE,SAAS,MAAM,EAA6B,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { bufferIO } from '../services/io.js';
|
|
3
|
+
import { TOOLS } from './tools.js';
|
|
4
|
+
/**
|
|
5
|
+
* Build the CADENCE MCP server (phase 58) — a third surface alongside the CLI
|
|
6
|
+
* and the Claude-Code hook adapter. Registers the curated tool set; each tool
|
|
7
|
+
* runs its shared service with a buffered `io` and serializes the captured text
|
|
8
|
+
* plus structured `data` into the tool result. Pure: the caller owns transport
|
|
9
|
+
* (`StdioServerTransport` in production, `InMemoryTransport` in tests).
|
|
10
|
+
*/
|
|
11
|
+
export function buildCadenceMcpServer(repoRoot, version) {
|
|
12
|
+
const server = new McpServer({ name: 'cadence', version });
|
|
13
|
+
for (const tool of TOOLS) {
|
|
14
|
+
server.registerTool(tool.name, { description: tool.description, inputSchema: tool.inputSchema }, async (args) => {
|
|
15
|
+
const io = bufferIO();
|
|
16
|
+
try {
|
|
17
|
+
const result = await tool.run(repoRoot, args ?? {}, io);
|
|
18
|
+
const text = (io.stdout() || io.stderr()).trimEnd();
|
|
19
|
+
const out = {
|
|
20
|
+
content: [
|
|
21
|
+
{ type: 'text', text: text.length > 0 ? text : result.exitCode === 0 ? 'ok' : 'failed' },
|
|
22
|
+
],
|
|
23
|
+
isError: result.exitCode !== 0,
|
|
24
|
+
};
|
|
25
|
+
if (result.data && typeof result.data === 'object' && !Array.isArray(result.data)) {
|
|
26
|
+
out.structuredContent = result.data;
|
|
27
|
+
}
|
|
28
|
+
return out;
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
// A thrown error (vs a non-zero exitCode) becomes an error tool result,
|
|
32
|
+
// not a transport crash — the server keeps serving subsequent calls.
|
|
33
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
34
|
+
return { content: [{ type: 'text', text: `${tool.name} failed: ${msg}` }], isError: true };
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
return server;
|
|
39
|
+
}
|
|
40
|
+
/** The curated tool names this server advertises (handy for tests/AC-1). */
|
|
41
|
+
export const TOOL_NAMES = TOOLS.map((t) => t.name);
|
|
42
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAgB,EAAE,OAAe;IACrE,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;IAE3D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,YAAY,CACjB,IAAI,CAAC,IAAI,EACT,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,EAChE,KAAK,EAAE,IAA6B,EAA2B,EAAE;YAC/D,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAC;YACtB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;gBACxD,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;gBACpD,MAAM,GAAG,GAAmB;oBAC1B,OAAO,EAAE;wBACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE;qBACzF;oBACD,OAAO,EAAE,MAAM,CAAC,QAAQ,KAAK,CAAC;iBAC/B,CAAC;gBACF,IAAI,MAAM,CAAC,IAAI,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;oBAClF,GAAG,CAAC,iBAAiB,GAAG,MAAM,CAAC,IAA+B,CAAC;gBACjE,CAAC;gBACD,OAAO,GAAG,CAAC;YACb,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,wEAAwE;gBACxE,qEAAqE;gBACrE,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,YAAY,GAAG,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC7F,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,4EAA4E;AAC5E,MAAM,CAAC,MAAM,UAAU,GAAsB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { CommandIO, CommandResult } from '../services/io.js';
|
|
3
|
+
/**
|
|
4
|
+
* One curated CADENCE command exposed as an MCP tool (phase 58). `run` calls the
|
|
5
|
+
* shared service with a buffered `io`; the server serializes the captured text +
|
|
6
|
+
* structured `data` into the tool result.
|
|
7
|
+
*
|
|
8
|
+
* Ambient edit-time gates (the `pre-tool-edit` boundary check) require host
|
|
9
|
+
* hooks and are NOT available over MCP — but command-boundary gates (coherence,
|
|
10
|
+
* the settle gate stack, spec-review) run exactly as they do from the CLI. The
|
|
11
|
+
* write-tool descriptions say so.
|
|
12
|
+
*/
|
|
13
|
+
export interface ToolDef {
|
|
14
|
+
name: string;
|
|
15
|
+
description: string;
|
|
16
|
+
inputSchema: z.ZodRawShape;
|
|
17
|
+
run(repoRoot: string, args: Record<string, unknown>, io: CommandIO): Promise<CommandResult>;
|
|
18
|
+
}
|
|
19
|
+
export declare const TOOLS: ToolDef[];
|
|
20
|
+
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAYlE;;;;;;;;;GASG;AACH,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,CAAC,CAAC,WAAW,CAAC;IAC3B,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CAC7F;AASD,eAAO,MAAM,KAAK,EAAE,OAAO,EAuM1B,CAAC"}
|