@manehorizons/cadence-core 1.7.0 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/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/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
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command-service I/O seam (phase 58).
|
|
3
|
+
*
|
|
4
|
+
* The curated CLI commands exposed over MCP (`progress`, `status`, `recommend`,
|
|
5
|
+
* `draft new/check/approve`, `build task`, `settle`, `spec new/approve`) have
|
|
6
|
+
* their logic factored into pure `*Service(repoRoot, args, io)` functions. The
|
|
7
|
+
* CLI action wires `io` to the real process streams and exit code; the MCP tool
|
|
8
|
+
* handler wires `io` to in-memory buffers and serializes the structured result.
|
|
9
|
+
*
|
|
10
|
+
* This keeps a single implementation behind both surfaces — the CLI remains the
|
|
11
|
+
* rendering layer (byte-identical output), and MCP gets structured `data` plus
|
|
12
|
+
* the captured human text. No service imports the MCP SDK, so the CLI hot path
|
|
13
|
+
* never loads it (AC-7).
|
|
14
|
+
*/
|
|
15
|
+
/** A sink for a command's human-facing output, abstracted off `process`. */
|
|
16
|
+
export interface CommandIO {
|
|
17
|
+
/** stdout-equivalent write (caller includes any trailing newline). */
|
|
18
|
+
out(s: string): void;
|
|
19
|
+
/** stderr-equivalent write (caller includes any trailing newline). */
|
|
20
|
+
err(s: string): void;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Structured result of a command service.
|
|
24
|
+
* - `exitCode` mirrors the CLI exit code (0 ok, 1 refusal/error, 2 structural).
|
|
25
|
+
* - `data` is the machine-readable payload surfaced as MCP `structuredContent`.
|
|
26
|
+
*/
|
|
27
|
+
export interface CommandResult {
|
|
28
|
+
exitCode: number;
|
|
29
|
+
data?: unknown;
|
|
30
|
+
}
|
|
31
|
+
/** `CommandIO` bound to the real process streams — used by the CLI actions. */
|
|
32
|
+
export declare function processIO(): CommandIO;
|
|
33
|
+
/** A `CommandIO` that captures into strings — used by the MCP tool handlers. */
|
|
34
|
+
export interface BufferIO extends CommandIO {
|
|
35
|
+
stdout(): string;
|
|
36
|
+
stderr(): string;
|
|
37
|
+
}
|
|
38
|
+
export declare function bufferIO(): BufferIO;
|
|
39
|
+
//# sourceMappingURL=io.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"io.d.ts","sourceRoot":"","sources":["../../src/services/io.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,4EAA4E;AAC5E,MAAM,WAAW,SAAS;IACxB,sEAAsE;IACtE,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,sEAAsE;IACtE,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,+EAA+E;AAC/E,wBAAgB,SAAS,IAAI,SAAS,CAKrC;AAED,gFAAgF;AAChF,MAAM,WAAW,QAAS,SAAQ,SAAS;IACzC,MAAM,IAAI,MAAM,CAAC;IACjB,MAAM,IAAI,MAAM,CAAC;CAClB;AAED,wBAAgB,QAAQ,IAAI,QAAQ,CAanC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command-service I/O seam (phase 58).
|
|
3
|
+
*
|
|
4
|
+
* The curated CLI commands exposed over MCP (`progress`, `status`, `recommend`,
|
|
5
|
+
* `draft new/check/approve`, `build task`, `settle`, `spec new/approve`) have
|
|
6
|
+
* their logic factored into pure `*Service(repoRoot, args, io)` functions. The
|
|
7
|
+
* CLI action wires `io` to the real process streams and exit code; the MCP tool
|
|
8
|
+
* handler wires `io` to in-memory buffers and serializes the structured result.
|
|
9
|
+
*
|
|
10
|
+
* This keeps a single implementation behind both surfaces — the CLI remains the
|
|
11
|
+
* rendering layer (byte-identical output), and MCP gets structured `data` plus
|
|
12
|
+
* the captured human text. No service imports the MCP SDK, so the CLI hot path
|
|
13
|
+
* never loads it (AC-7).
|
|
14
|
+
*/
|
|
15
|
+
/** `CommandIO` bound to the real process streams — used by the CLI actions. */
|
|
16
|
+
export function processIO() {
|
|
17
|
+
return {
|
|
18
|
+
out: (s) => void process.stdout.write(s),
|
|
19
|
+
err: (s) => void process.stderr.write(s),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export function bufferIO() {
|
|
23
|
+
let out = '';
|
|
24
|
+
let err = '';
|
|
25
|
+
return {
|
|
26
|
+
out: (s) => {
|
|
27
|
+
out += s;
|
|
28
|
+
},
|
|
29
|
+
err: (s) => {
|
|
30
|
+
err += s;
|
|
31
|
+
},
|
|
32
|
+
stdout: () => out,
|
|
33
|
+
stderr: () => err,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=io.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"io.js","sourceRoot":"","sources":["../../src/services/io.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAoBH,+EAA+E;AAC/E,MAAM,UAAU,SAAS;IACvB,OAAO;QACL,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACxC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;KACzC,CAAC;AACJ,CAAC;AAQD,MAAM,UAAU,QAAQ;IACtB,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,OAAO;QACL,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE;YACT,GAAG,IAAI,CAAC,CAAC;QACX,CAAC;QACD,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE;YACT,GAAG,IAAI,CAAC,CAAC;QACX,CAAC;QACD,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG;QACjB,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG;KAClB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { CommandIO, CommandResult } from './io.js';
|
|
2
|
+
/**
|
|
3
|
+
* `cadence progress` — the single recommended next action (read-only).
|
|
4
|
+
* Returns `data: { command, reason }` for structured consumers.
|
|
5
|
+
*/
|
|
6
|
+
export declare function progressService(repoRoot: string, io: CommandIO): Promise<CommandResult>;
|
|
7
|
+
//# sourceMappingURL=progress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/services/progress.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExD;;;GAGG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,SAAS,GACZ,OAAO,CAAC,aAAa,CAAC,CAYxB"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { SimpleStateBackend } from '../state/simple.js';
|
|
2
|
+
import { nextAction } from '../progress.js';
|
|
3
|
+
/**
|
|
4
|
+
* `cadence progress` — the single recommended next action (read-only).
|
|
5
|
+
* Returns `data: { command, reason }` for structured consumers.
|
|
6
|
+
*/
|
|
7
|
+
export async function progressService(repoRoot, io) {
|
|
8
|
+
try {
|
|
9
|
+
const backend = new SimpleStateBackend(repoRoot);
|
|
10
|
+
const state = await backend.readState();
|
|
11
|
+
const action = nextAction(state);
|
|
12
|
+
io.out(`Next: ${action.command}\n`);
|
|
13
|
+
io.out(`Reason: ${action.reason}\n`);
|
|
14
|
+
return { exitCode: 0, data: { command: action.command, reason: action.reason } };
|
|
15
|
+
}
|
|
16
|
+
catch (err) {
|
|
17
|
+
io.err(`progress failed: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
18
|
+
return { exitCode: 1 };
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/services/progress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAG5C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAAgB,EAChB,EAAa;IAEb,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QACjC,EAAE,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;QACpC,EAAE,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;QACrC,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;IACnF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,EAAE,CAAC,GAAG,CAAC,oBAAoB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjF,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACzB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { CommandIO, CommandResult } from './io.js';
|
|
2
|
+
/**
|
|
3
|
+
* `cadence recommend` — ranked strategic recommendations (read-only).
|
|
4
|
+
* `json: true` mirrors `--json`. `data` is the recommend report either way.
|
|
5
|
+
*/
|
|
6
|
+
export declare function recommendService(repoRoot: string, args: {
|
|
7
|
+
json?: boolean;
|
|
8
|
+
}, io: CommandIO): Promise<CommandResult>;
|
|
9
|
+
//# sourceMappingURL=recommend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recommend.d.ts","sourceRoot":"","sources":["../../src/services/recommend.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExD;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,EACxB,EAAE,EAAE,SAAS,GACZ,OAAO,CAAC,aAAa,CAAC,CAaxB"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { runRecommend } from '../intelligence/recommend.js';
|
|
2
|
+
import { renderRecommendMd } from '../intelligence/render-recommend.js';
|
|
3
|
+
/**
|
|
4
|
+
* `cadence recommend` — ranked strategic recommendations (read-only).
|
|
5
|
+
* `json: true` mirrors `--json`. `data` is the recommend report either way.
|
|
6
|
+
*/
|
|
7
|
+
export async function recommendService(repoRoot, args, io) {
|
|
8
|
+
try {
|
|
9
|
+
const report = await runRecommend(repoRoot);
|
|
10
|
+
if (args.json) {
|
|
11
|
+
io.out(JSON.stringify(report) + '\n');
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
io.out(renderRecommendMd(report));
|
|
15
|
+
}
|
|
16
|
+
return { exitCode: 0, data: report };
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
io.err(`recommend failed: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
20
|
+
return { exitCode: 1 };
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=recommend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recommend.js","sourceRoot":"","sources":["../../src/services/recommend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAGxE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAgB,EAChB,IAAwB,EACxB,EAAa;IAEb,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;QACpC,CAAC;QACD,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACvC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,EAAE,CAAC,GAAG,CAAC,qBAAqB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClF,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACzB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { CommandIO, CommandResult } from './io.js';
|
|
2
|
+
export interface SettleArgs {
|
|
3
|
+
ac?: string[];
|
|
4
|
+
auto?: boolean;
|
|
5
|
+
force?: boolean;
|
|
6
|
+
allowMissingCoverage?: boolean;
|
|
7
|
+
deep?: boolean;
|
|
8
|
+
allowAutoComplex?: boolean;
|
|
9
|
+
allowStaleDraft?: boolean;
|
|
10
|
+
allowOpenTasks?: boolean;
|
|
11
|
+
allowFailingBuild?: boolean;
|
|
12
|
+
allowVerifierFailure?: boolean;
|
|
13
|
+
allowCodeReviewFailure?: boolean;
|
|
14
|
+
allowSecurityAuditFailure?: boolean;
|
|
15
|
+
allowSkillAuditMiss?: boolean;
|
|
16
|
+
interactive?: boolean;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* `cadence settle run` — close the loop: run the settle gate stack, write
|
|
20
|
+
* SUMMARY.{json,md}, and return to IDLE. Faithful extraction of the former CLI
|
|
21
|
+
* action body (process streams + exit code routed through `io`/the result).
|
|
22
|
+
*/
|
|
23
|
+
export declare function settleService(repoRoot: string, opts: SettleArgs, io: CommandIO): Promise<CommandResult>;
|
|
24
|
+
//# sourceMappingURL=settle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settle.d.ts","sourceRoot":"","sources":["../../src/services/settle.ts"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExD,MAAM,WAAW,UAAU;IACzB,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAaD;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,UAAU,EAChB,EAAE,EAAE,SAAS,GACZ,OAAO,CAAC,aAAa,CAAC,CA2TxB"}
|
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { readFile, stat } from 'node:fs/promises';
|
|
4
|
+
import { existsSync } from 'node:fs';
|
|
5
|
+
import { TaskStatusZ } from '@manehorizons/cadence-types';
|
|
6
|
+
import { parseDraftMd } from '../parse/draft-parser.js';
|
|
7
|
+
import { renderSummaryMd } from '../parse/summary-writer.js';
|
|
8
|
+
import { SimpleStateBackend } from '../state/simple.js';
|
|
9
|
+
import { atomicWriteJSON, atomicWriteText } from '../state/atomic-write.js';
|
|
10
|
+
import { LoopViolationError } from '../errors.js';
|
|
11
|
+
import { deriveAcResults } from '../status.js';
|
|
12
|
+
import { loadConfig } from '../config/loader.js';
|
|
13
|
+
import { effectiveGateSet } from '../gates/engine.js';
|
|
14
|
+
import { selectVerifier } from '../verify/factory.js';
|
|
15
|
+
import { scanTestCoverage } from '../verify/coverage.js';
|
|
16
|
+
import { resolveEffectiveProvider, MOCK_FALLBACK_BANNER, } from '../verify/verifier-factory.js';
|
|
17
|
+
import { runSettleGates } from '../gates/registry.js';
|
|
18
|
+
import { runSkillAuditCheck } from '../checks/skill-audit.js';
|
|
19
|
+
import { ScriptedPrompter, StdinPrompter } from '../verify/prompter.js';
|
|
20
|
+
import { selectNotifier } from '../notify/factory.js';
|
|
21
|
+
import { collectAnomalies } from '../notify/collect.js';
|
|
22
|
+
import { emitLoopViolation } from '../notify/loop-violation.js';
|
|
23
|
+
import { selectCodeReviewVerifier } from '../verify/code-review-factory.js';
|
|
24
|
+
import { emitCodeReviewHigh, emitCodeReviewUnconverged } from '../notify/code-review.js';
|
|
25
|
+
import { emitSkillAuditMiss } from '../notify/skill-audit.js';
|
|
26
|
+
import { selectSecurityAuditVerifier } from '../verify/security-audit-factory.js';
|
|
27
|
+
function parseAcArg(arg) {
|
|
28
|
+
const eqIdx = arg.indexOf('=');
|
|
29
|
+
if (eqIdx === -1)
|
|
30
|
+
throw new Error(`bad --ac syntax: ${arg}`);
|
|
31
|
+
const id = arg.slice(0, eqIdx);
|
|
32
|
+
const rest = arg.slice(eqIdx + 1);
|
|
33
|
+
const colonIdx = rest.indexOf(':');
|
|
34
|
+
const verdict = colonIdx === -1 ? rest : rest.slice(0, colonIdx);
|
|
35
|
+
const note = colonIdx === -1 ? undefined : rest.slice(colonIdx + 1).trim();
|
|
36
|
+
return { id, pass: verdict === 'pass', ...(note ? { note } : {}) };
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* `cadence settle run` — close the loop: run the settle gate stack, write
|
|
40
|
+
* SUMMARY.{json,md}, and return to IDLE. Faithful extraction of the former CLI
|
|
41
|
+
* action body (process streams + exit code routed through `io`/the result).
|
|
42
|
+
*/
|
|
43
|
+
export async function settleService(repoRoot, opts, io) {
|
|
44
|
+
const cwd = repoRoot;
|
|
45
|
+
try {
|
|
46
|
+
const backend = new SimpleStateBackend(cwd);
|
|
47
|
+
const state = await backend.readState();
|
|
48
|
+
if (state.loopPosition !== 'BUILD' || !state.activeDraft || !state.activePhase) {
|
|
49
|
+
throw new LoopViolationError('settle run requires loopPosition=BUILD with an active draft', { expected: 'BUILD', actual: state.loopPosition });
|
|
50
|
+
}
|
|
51
|
+
const draftPath = join(cwd, '.cadence/phases', state.activePhase, `${state.activeDraft}-DRAFT.md`);
|
|
52
|
+
const draft = parseDraftMd(await readFile(draftPath, 'utf8'));
|
|
53
|
+
const progPath = join(cwd, '.cadence/phases', state.activePhase, `${state.activeDraft}-PROGRESS.json`);
|
|
54
|
+
const progress = existsSync(progPath)
|
|
55
|
+
? JSON.parse(await readFile(progPath, 'utf8'))
|
|
56
|
+
: { draftId: state.activeDraft, tasks: {} };
|
|
57
|
+
const explicit = (opts.ac ?? []).map(parseAcArg);
|
|
58
|
+
const explicitIds = new Set(explicit.map((a) => a.id));
|
|
59
|
+
let cadenceConfig = null;
|
|
60
|
+
try {
|
|
61
|
+
cadenceConfig = await loadConfig(cwd);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
cadenceConfig = null;
|
|
65
|
+
}
|
|
66
|
+
const gateSet = effectiveGateSet(state, cadenceConfig, draft);
|
|
67
|
+
if (opts.deep &&
|
|
68
|
+
resolveEffectiveProvider(cadenceConfig?.verifier).provider === 'mock') {
|
|
69
|
+
io.err(MOCK_FALLBACK_BANNER + '\n');
|
|
70
|
+
}
|
|
71
|
+
// DESIGN.md §4 M2 — soft cap on auto × complex.
|
|
72
|
+
if (gateSet.softCap && !opts.allowAutoComplex) {
|
|
73
|
+
io.err('settle run refused: auto × complex is soft-capped (DESIGN.md §4 M2). Pass --allow-auto-complex to override.\n');
|
|
74
|
+
return { exitCode: 1 };
|
|
75
|
+
}
|
|
76
|
+
if (gateSet.softCap && opts.allowAutoComplex) {
|
|
77
|
+
io.err('settle: --allow-auto-complex set; proceeding past soft cap (auto × complex).\n');
|
|
78
|
+
}
|
|
79
|
+
const touchedFiles = Array.from(new Set(draft.tasks.flatMap((t) => t.files)));
|
|
80
|
+
let coverageMemo;
|
|
81
|
+
let draftMtimeMemo;
|
|
82
|
+
let deepVerifierMemo;
|
|
83
|
+
let codeReviewVerifierMemo;
|
|
84
|
+
let securityAuditVerifierMemo;
|
|
85
|
+
let diffMemo;
|
|
86
|
+
const codeReviewSidecarPath = join(cwd, '.cadence/phases', state.activePhase, `${state.activeDraft}-CODE-REVIEW.json`);
|
|
87
|
+
const ctx = {
|
|
88
|
+
cwd,
|
|
89
|
+
state,
|
|
90
|
+
draft,
|
|
91
|
+
progress,
|
|
92
|
+
config: cadenceConfig,
|
|
93
|
+
gateSet,
|
|
94
|
+
opts: {
|
|
95
|
+
...(opts.force !== undefined ? { force: opts.force } : {}),
|
|
96
|
+
...(opts.auto !== undefined ? { auto: opts.auto } : {}),
|
|
97
|
+
...(opts.deep !== undefined ? { deep: opts.deep } : {}),
|
|
98
|
+
...(opts.allowMissingCoverage !== undefined ? { allowMissingCoverage: opts.allowMissingCoverage } : {}),
|
|
99
|
+
...(opts.allowVerifierFailure !== undefined ? { allowVerifierFailure: opts.allowVerifierFailure } : {}),
|
|
100
|
+
...(opts.allowStaleDraft !== undefined ? { allowStaleDraft: opts.allowStaleDraft } : {}),
|
|
101
|
+
...(opts.allowOpenTasks !== undefined ? { allowOpenTasks: opts.allowOpenTasks } : {}),
|
|
102
|
+
...(opts.allowFailingBuild !== undefined ? { allowFailingBuild: opts.allowFailingBuild } : {}),
|
|
103
|
+
...(opts.interactive !== undefined ? { interactive: opts.interactive } : {}),
|
|
104
|
+
...(opts.allowCodeReviewFailure !== undefined ? { allowCodeReviewFailure: opts.allowCodeReviewFailure } : {}),
|
|
105
|
+
...(opts.allowSecurityAuditFailure !== undefined ? { allowSecurityAuditFailure: opts.allowSecurityAuditFailure } : {}),
|
|
106
|
+
...(opts.allowSkillAuditMiss !== undefined ? { allowSkillAuditMiss: opts.allowSkillAuditMiss } : {}),
|
|
107
|
+
},
|
|
108
|
+
explicitIds,
|
|
109
|
+
touchedFiles,
|
|
110
|
+
coverage: () => {
|
|
111
|
+
if (!coverageMemo) {
|
|
112
|
+
const globs = cadenceConfig?.verification?.testGlobs;
|
|
113
|
+
coverageMemo = scanTestCoverage(cwd, globs ? { globs } : {});
|
|
114
|
+
}
|
|
115
|
+
return coverageMemo;
|
|
116
|
+
},
|
|
117
|
+
draftMtimeMs: () => {
|
|
118
|
+
if (!draftMtimeMemo) {
|
|
119
|
+
draftMtimeMemo = stat(draftPath)
|
|
120
|
+
.then((s) => s.mtime.getTime())
|
|
121
|
+
.catch(() => null);
|
|
122
|
+
}
|
|
123
|
+
return draftMtimeMemo;
|
|
124
|
+
},
|
|
125
|
+
diff: () => {
|
|
126
|
+
if (diffMemo === undefined) {
|
|
127
|
+
diffMemo = collectDiffForCodeReview(cwd, touchedFiles);
|
|
128
|
+
}
|
|
129
|
+
return diffMemo;
|
|
130
|
+
},
|
|
131
|
+
verifiers: {
|
|
132
|
+
deep: {
|
|
133
|
+
verify: (input) => {
|
|
134
|
+
if (!deepVerifierMemo) {
|
|
135
|
+
deepVerifierMemo = selectVerifier(cadenceConfig);
|
|
136
|
+
}
|
|
137
|
+
return deepVerifierMemo.verify(input);
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
codeReview: {
|
|
141
|
+
verify: (input) => {
|
|
142
|
+
if (!codeReviewVerifierMemo) {
|
|
143
|
+
codeReviewVerifierMemo = selectCodeReviewVerifier(cadenceConfig);
|
|
144
|
+
}
|
|
145
|
+
return codeReviewVerifierMemo.verify(input);
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
securityAudit: {
|
|
149
|
+
verify: (input) => {
|
|
150
|
+
if (!securityAuditVerifierMemo) {
|
|
151
|
+
securityAuditVerifierMemo = selectSecurityAuditVerifier(cadenceConfig);
|
|
152
|
+
}
|
|
153
|
+
return securityAuditVerifierMemo.verify(input);
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
},
|
|
157
|
+
emit: {
|
|
158
|
+
anomalies: async (events) => {
|
|
159
|
+
void events;
|
|
160
|
+
},
|
|
161
|
+
codeReviewHigh: (findings, info) => emitCodeReviewHigh(selectNotifier(cadenceConfig), findings, info),
|
|
162
|
+
codeReviewUnconverged: (info) => emitCodeReviewUnconverged(selectNotifier(cadenceConfig), info),
|
|
163
|
+
skillAuditMiss: (payload) => emitSkillAuditMiss(selectNotifier(cadenceConfig), payload),
|
|
164
|
+
},
|
|
165
|
+
runner: {
|
|
166
|
+
test: async () => {
|
|
167
|
+
const command = cadenceConfig?.verification?.testCommand;
|
|
168
|
+
if (!command)
|
|
169
|
+
return { ran: false, ok: true };
|
|
170
|
+
try {
|
|
171
|
+
execSync(command, { cwd, stdio: 'ignore' });
|
|
172
|
+
return { ran: true, ok: true, exitCode: 0, command };
|
|
173
|
+
}
|
|
174
|
+
catch (e) {
|
|
175
|
+
const status = e.status;
|
|
176
|
+
const exitCode = typeof status === 'number' ? status : 1;
|
|
177
|
+
return { ran: true, ok: false, exitCode, command };
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
prompter: {
|
|
182
|
+
create: () => {
|
|
183
|
+
const scripted = process.env.CADENCE_PROMPTER_SCRIPT;
|
|
184
|
+
if (scripted !== undefined) {
|
|
185
|
+
const answers = scripted.split('\n').filter((s) => s.length > 0 || s === '');
|
|
186
|
+
return new ScriptedPrompter(answers);
|
|
187
|
+
}
|
|
188
|
+
return new StdinPrompter();
|
|
189
|
+
},
|
|
190
|
+
},
|
|
191
|
+
codeReviewSidecar: {
|
|
192
|
+
read: async () => {
|
|
193
|
+
if (!existsSync(codeReviewSidecarPath)) {
|
|
194
|
+
return { attemptsSoFar: 0, history: [] };
|
|
195
|
+
}
|
|
196
|
+
try {
|
|
197
|
+
const prior = JSON.parse(await readFile(codeReviewSidecarPath, 'utf8'));
|
|
198
|
+
return {
|
|
199
|
+
attemptsSoFar: typeof prior.attempts === 'number' ? prior.attempts : 0,
|
|
200
|
+
history: Array.isArray(prior.history) ? prior.history : [],
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
return { attemptsSoFar: 0, history: [] };
|
|
205
|
+
}
|
|
206
|
+
},
|
|
207
|
+
write: (text) => atomicWriteText(codeReviewSidecarPath, text),
|
|
208
|
+
},
|
|
209
|
+
io: { err: (s) => io.err(s) },
|
|
210
|
+
};
|
|
211
|
+
const { acc, refused } = await runSettleGates(ctx);
|
|
212
|
+
if (refused) {
|
|
213
|
+
return { exitCode: 1 };
|
|
214
|
+
}
|
|
215
|
+
const coverageBypassed = acc.flags.coverageBypassed === true;
|
|
216
|
+
const interactiveRequested = opts.interactive === true ||
|
|
217
|
+
(opts.interactive !== false && gateSet.gates.includes('interactive-verdict'));
|
|
218
|
+
const interactiveVerify = acc.interactiveVerify;
|
|
219
|
+
const deepVerify = acc.deepVerify;
|
|
220
|
+
const verifierFailure = acc.flags.verifierFailure;
|
|
221
|
+
const codeReviewFindings = acc.codeReview;
|
|
222
|
+
const securityAuditFindings = acc.securityAudit;
|
|
223
|
+
const interactiveIds = new Set(interactiveVerify ? Object.keys(interactiveVerify) : []);
|
|
224
|
+
const userVerdictedIds = new Set([...explicitIds, ...interactiveIds]);
|
|
225
|
+
let acResults = [...explicit];
|
|
226
|
+
if (interactiveVerify) {
|
|
227
|
+
for (const [id, v] of Object.entries(interactiveVerify)) {
|
|
228
|
+
if (explicitIds.has(id))
|
|
229
|
+
continue;
|
|
230
|
+
acResults.push({
|
|
231
|
+
id,
|
|
232
|
+
pass: v.verdict === 'pass',
|
|
233
|
+
...(v.note ? { note: v.note } : {}),
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
if (opts.auto || interactiveRequested) {
|
|
238
|
+
const derived = deriveAcResults(draft, progress);
|
|
239
|
+
const offenders = derived.filter((d) => d.verdict !== 'pass' && !userVerdictedIds.has(d.id));
|
|
240
|
+
if (offenders.length > 0 && !opts.force) {
|
|
241
|
+
for (const o of offenders) {
|
|
242
|
+
const tasks = o.blockers.length > 0 ? ` (tasks: ${o.blockers.join(', ')})` : '';
|
|
243
|
+
io.err(`auto: ${o.id} ${o.verdict}${tasks}\n`);
|
|
244
|
+
}
|
|
245
|
+
io.err('settle run --auto refused: complete the blocking tasks or rerun with --force.\n');
|
|
246
|
+
return { exitCode: 1 };
|
|
247
|
+
}
|
|
248
|
+
const merged = [...acResults];
|
|
249
|
+
for (const d of derived) {
|
|
250
|
+
if (userVerdictedIds.has(d.id))
|
|
251
|
+
continue;
|
|
252
|
+
if (d.verdict === 'pass') {
|
|
253
|
+
merged.push({ id: d.id, pass: true });
|
|
254
|
+
}
|
|
255
|
+
else if (d.verdict === 'blocked') {
|
|
256
|
+
merged.push({ id: d.id, pass: false, note: `auto: ${d.blockers.join(', ')} blocked` });
|
|
257
|
+
}
|
|
258
|
+
else if (d.verdict === 'needs-context') {
|
|
259
|
+
merged.push({ id: d.id, pass: false, note: `auto: ${d.blockers.join(', ')} needs context` });
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
merged.push({
|
|
263
|
+
id: d.id,
|
|
264
|
+
pass: false,
|
|
265
|
+
note: d.blockers.length > 0 ? `auto: ${d.blockers.join(', ')} incomplete` : 'auto: no linked tasks',
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
acResults = merged;
|
|
270
|
+
}
|
|
271
|
+
if (gateSet.gates.includes('anomaly-notify')) {
|
|
272
|
+
const anomalies = collectAnomalies({
|
|
273
|
+
draft,
|
|
274
|
+
progress,
|
|
275
|
+
coverageBypassed,
|
|
276
|
+
force: opts.force === true,
|
|
277
|
+
root: cwd,
|
|
278
|
+
...(deepVerify ? { deepVerify } : {}),
|
|
279
|
+
...(interactiveVerify ? { interactiveVerify } : {}),
|
|
280
|
+
...(verifierFailure ? { verifierFailure } : {}),
|
|
281
|
+
});
|
|
282
|
+
if (anomalies.length > 0) {
|
|
283
|
+
const notifier = selectNotifier(cadenceConfig);
|
|
284
|
+
try {
|
|
285
|
+
await notifier.notify(anomalies);
|
|
286
|
+
}
|
|
287
|
+
catch (err) {
|
|
288
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
289
|
+
io.err(`notify: ${notifier.name} transport failed — ${msg} (continuing)\n`);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
{
|
|
294
|
+
const res = await runSkillAuditCheck(ctx);
|
|
295
|
+
if (res.outcome === 'refuse') {
|
|
296
|
+
return { exitCode: 1 };
|
|
297
|
+
}
|
|
298
|
+
state.skillAudit.required = res.effectiveRequired;
|
|
299
|
+
}
|
|
300
|
+
const summary = {
|
|
301
|
+
schemaVersion: 1,
|
|
302
|
+
draftId: state.activeDraft,
|
|
303
|
+
completedAt: new Date().toISOString(),
|
|
304
|
+
acResults,
|
|
305
|
+
taskResults: draft.tasks.map((t) => ({
|
|
306
|
+
id: t.id,
|
|
307
|
+
status: (TaskStatusZ.safeParse(progress.tasks[t.id]?.status).success
|
|
308
|
+
? progress.tasks[t.id].status
|
|
309
|
+
: 'BLOCKED'),
|
|
310
|
+
notes: progress.tasks[t.id]?.notes ?? '',
|
|
311
|
+
})),
|
|
312
|
+
decisions: [],
|
|
313
|
+
deferred: [],
|
|
314
|
+
skillAudit: state.skillAudit,
|
|
315
|
+
...(deepVerify ? { deepVerify } : {}),
|
|
316
|
+
...(interactiveVerify ? { interactiveVerify } : {}),
|
|
317
|
+
...(codeReviewFindings ? { codeReview: codeReviewFindings } : {}),
|
|
318
|
+
...(securityAuditFindings ? { securityAudit: securityAuditFindings } : {}),
|
|
319
|
+
};
|
|
320
|
+
const summaryBase = join(cwd, '.cadence/phases', state.activePhase, `${state.activeDraft}-SUMMARY`);
|
|
321
|
+
await atomicWriteJSON(`${summaryBase}.json`, summary);
|
|
322
|
+
await atomicWriteText(`${summaryBase}.md`, renderSummaryMd(summary));
|
|
323
|
+
const draftId = state.activeDraft;
|
|
324
|
+
state.openDrafts = state.openDrafts.filter((d) => d.id !== draftId);
|
|
325
|
+
state.activeDraft = null;
|
|
326
|
+
state.activeTask = null;
|
|
327
|
+
state.loopPosition = 'IDLE';
|
|
328
|
+
state.tier = null;
|
|
329
|
+
await backend.commit(state);
|
|
330
|
+
io.out(`Settled ${draftId}\n`);
|
|
331
|
+
return { exitCode: 0, data: { settled: draftId, acResults } };
|
|
332
|
+
}
|
|
333
|
+
catch (err) {
|
|
334
|
+
io.err(`settle run failed: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
335
|
+
if (err instanceof LoopViolationError) {
|
|
336
|
+
await emitLoopViolation(cwd, err, 'settle.run');
|
|
337
|
+
}
|
|
338
|
+
return { exitCode: 1 };
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* `git diff --no-color HEAD -- <files>` via execSync. Returns empty
|
|
343
|
+
* string on any error (non-git workdir, no diff, exec failure).
|
|
344
|
+
*/
|
|
345
|
+
function collectDiffForCodeReview(cwd, files) {
|
|
346
|
+
if (files.length === 0)
|
|
347
|
+
return '';
|
|
348
|
+
try {
|
|
349
|
+
const args = ['diff', '--no-color', 'HEAD', '--', ...files];
|
|
350
|
+
return execSync(`git ${args.map(shellQuote).join(' ')}`, {
|
|
351
|
+
cwd,
|
|
352
|
+
encoding: 'utf8',
|
|
353
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
354
|
+
maxBuffer: 16 * 1024 * 1024,
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
catch {
|
|
358
|
+
return '';
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
function shellQuote(arg) {
|
|
362
|
+
if (/^[A-Za-z0-9._/=:@+-]+$/.test(arg))
|
|
363
|
+
return arg;
|
|
364
|
+
return `"${arg.replace(/(["\\$`])/g, '\\$1')}"`;
|
|
365
|
+
}
|
|
366
|
+
//# sourceMappingURL=settle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settle.js","sourceRoot":"","sources":["../../src/services/settle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { CommandIO, CommandResult } from './io.js';
|
|
2
|
+
/**
|
|
3
|
+
* `cadence spec approve <phase> <num>` — run the convergent spec-review gate;
|
|
4
|
+
* on pass mark APPROVED and leave the spec stage (SPEC→IDLE).
|
|
5
|
+
*/
|
|
6
|
+
export declare function specApproveService(repoRoot: string, args: {
|
|
7
|
+
phase: string;
|
|
8
|
+
num: string;
|
|
9
|
+
allowSpecReviewFailure?: boolean;
|
|
10
|
+
}, io: CommandIO): Promise<CommandResult>;
|
|
11
|
+
//# sourceMappingURL=spec-approve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-approve.d.ts","sourceRoot":"","sources":["../../src/services/spec-approve.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExD;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,sBAAsB,CAAC,EAAE,OAAO,CAAA;CAAE,EACtE,EAAE,EAAE,SAAS,GACZ,OAAO,CAAC,aAAa,CAAC,CAiIxB"}
|