@agent-surface/cli 0.13.0 → 0.15.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/bin.js +41 -14
- package/dist/bin.js.map +1 -1
- package/dist/{check-TJIX7NDE.js → check-VWRYNYLN.js} +66 -48
- package/dist/check-VWRYNYLN.js.map +1 -0
- package/dist/chunk-A5UCBF7D.js +246 -0
- package/dist/chunk-A5UCBF7D.js.map +1 -0
- package/dist/chunk-GYYWHZPM.js +532 -0
- package/dist/chunk-GYYWHZPM.js.map +1 -0
- package/dist/chunk-NFK3XWWH.js +1475 -0
- package/dist/chunk-NFK3XWWH.js.map +1 -0
- package/dist/chunk-Y2LSPEVK.js +61 -0
- package/dist/chunk-Y2LSPEVK.js.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/{init-6XV64LK2.js → init-BVZR6CRS.js} +62 -40
- package/dist/init-BVZR6CRS.js.map +1 -0
- package/dist/{ink-QR7X7TAC.js → ink-ZCQ26EY4.js} +71 -17
- package/dist/ink-ZCQ26EY4.js.map +1 -0
- package/dist/{inspect-NJ4J3MPP.js → inspect-3YFPCYQJ.js} +88 -104
- package/dist/inspect-3YFPCYQJ.js.map +1 -0
- package/dist/snapshot-5QKLZKZI.js +130 -0
- package/dist/snapshot-5QKLZKZI.js.map +1 -0
- package/package.json +4 -4
- package/dist/check-TJIX7NDE.js.map +0 -1
- package/dist/chunk-3AJ343NA.js +0 -178
- package/dist/chunk-3AJ343NA.js.map +0 -1
- package/dist/chunk-IALBMW3R.js +0 -278
- package/dist/chunk-IALBMW3R.js.map +0 -1
- package/dist/chunk-L7GHSC2Z.js +0 -465
- package/dist/chunk-L7GHSC2Z.js.map +0 -1
- package/dist/chunk-UGCLJ5JX.js +0 -724
- package/dist/chunk-UGCLJ5JX.js.map +0 -1
- package/dist/chunk-VX6GBEP3.js +0 -539
- package/dist/chunk-VX6GBEP3.js.map +0 -1
- package/dist/init-6XV64LK2.js.map +0 -1
- package/dist/ink-QR7X7TAC.js.map +0 -1
- package/dist/inspect-NJ4J3MPP.js.map +0 -1
- package/dist/snapshot-ZGTAF2Y5.js +0 -77
- package/dist/snapshot-ZGTAF2Y5.js.map +0 -1
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import {
|
|
2
|
+
scenarioBaseline
|
|
3
|
+
} from "./chunk-Y2LSPEVK.js";
|
|
4
|
+
import {
|
|
5
|
+
createPresenter,
|
|
6
|
+
joinCoverage,
|
|
7
|
+
mountScenarios,
|
|
8
|
+
readInventory
|
|
9
|
+
} from "./chunk-A5UCBF7D.js";
|
|
10
|
+
import {
|
|
11
|
+
UsageError,
|
|
12
|
+
baselinePath,
|
|
13
|
+
writeBaseline,
|
|
14
|
+
writeScenarioManifest
|
|
15
|
+
} from "./chunk-GYYWHZPM.js";
|
|
16
|
+
import {
|
|
17
|
+
READING_SOURCE,
|
|
18
|
+
buildView,
|
|
19
|
+
coverageSections,
|
|
20
|
+
displayPath,
|
|
21
|
+
failureSection,
|
|
22
|
+
flatRows,
|
|
23
|
+
mountingLabel,
|
|
24
|
+
neverCallable,
|
|
25
|
+
neverCallableSection,
|
|
26
|
+
noVerdictSection,
|
|
27
|
+
runHeaderBlocks,
|
|
28
|
+
scenarioStats,
|
|
29
|
+
surfaceSummaryRows,
|
|
30
|
+
trackReach
|
|
31
|
+
} from "./chunk-NFK3XWWH.js";
|
|
32
|
+
|
|
33
|
+
// src/commands/snapshot.ts
|
|
34
|
+
async function runSnapshot(options) {
|
|
35
|
+
if (options.depth === "static") {
|
|
36
|
+
throw new UsageError(
|
|
37
|
+
"snapshot --depth static has nothing to write \u2014 a baseline is a projection, and at this depth nothing is mounted."
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
const analysis = {
|
|
41
|
+
configPath: options.configPath,
|
|
42
|
+
depth: options.depth,
|
|
43
|
+
...options.scenario ? { scenario: options.scenario } : {},
|
|
44
|
+
...options.scope ? { scope: options.scope } : {},
|
|
45
|
+
...options.tsconfig ? { tsconfig: options.tsconfig } : {},
|
|
46
|
+
...options.baselineDir ? { baselineDir: options.baselineDir } : {}
|
|
47
|
+
};
|
|
48
|
+
const present = await createPresenter(options);
|
|
49
|
+
await present.wait(READING_SOURCE);
|
|
50
|
+
const inventory = readInventory(analysis);
|
|
51
|
+
let scenarios = [];
|
|
52
|
+
let mountedCount = 0;
|
|
53
|
+
const runtime = await mountScenarios(analysis, {
|
|
54
|
+
onPlan: async (plan) => {
|
|
55
|
+
scenarios = plan.scenarios;
|
|
56
|
+
await present.emit({
|
|
57
|
+
kind: "blocks",
|
|
58
|
+
blocks: runHeaderBlocks("SURFACE SNAPSHOT", {
|
|
59
|
+
configPath: options.configPath,
|
|
60
|
+
depth: options.depth,
|
|
61
|
+
...plan.scope ? { scope: plan.scope } : {},
|
|
62
|
+
scenarios: plan.scenarios,
|
|
63
|
+
declaredScenarios: plan.declaredScenarios
|
|
64
|
+
})
|
|
65
|
+
});
|
|
66
|
+
if (scenarios.length > 0) await present.wait(mountingLabel(scenarios, 0));
|
|
67
|
+
},
|
|
68
|
+
onEach: async () => {
|
|
69
|
+
mountedCount += 1;
|
|
70
|
+
if (mountedCount < scenarios.length) {
|
|
71
|
+
await present.wait(mountingLabel(scenarios, mountedCount));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
present.settle();
|
|
76
|
+
if (!runtime) throw new UsageError("snapshot needs a mount, and this depth performs none");
|
|
77
|
+
const written = [];
|
|
78
|
+
for (const result of runtime.results) {
|
|
79
|
+
const path = baselinePath(runtime.baselineDir, result.scenario);
|
|
80
|
+
writeBaseline(path, scenarioBaseline(result));
|
|
81
|
+
written.push({ cells: [result.scenario, displayPath(path)] });
|
|
82
|
+
}
|
|
83
|
+
writeScenarioManifest(runtime.baselineDir, runtime.declaredScenarios);
|
|
84
|
+
const reach = /* @__PURE__ */ new Map();
|
|
85
|
+
for (const result of runtime.results) {
|
|
86
|
+
trackReach(reach, flatRows(buildView(result)), result.scenario);
|
|
87
|
+
}
|
|
88
|
+
const coverage = joinCoverage(inventory, runtime, analysis);
|
|
89
|
+
const stats = runtime.results.map(scenarioStats);
|
|
90
|
+
const dark = neverCallable(reach);
|
|
91
|
+
const parts = [
|
|
92
|
+
{ kind: "table", title: `WROTE (${written.length})`, headers: ["SCENARIO", "FILE"], rows: written }
|
|
93
|
+
];
|
|
94
|
+
const sections = [
|
|
95
|
+
...coverage ? coverageSections(coverage) : [],
|
|
96
|
+
...dark.length > 0 && stats.length > 1 ? [neverCallableSection(dark)] : []
|
|
97
|
+
];
|
|
98
|
+
if (sections.length > 0) parts.push({ kind: "findings", sections });
|
|
99
|
+
parts.push({
|
|
100
|
+
kind: "blocks",
|
|
101
|
+
blocks: [
|
|
102
|
+
{
|
|
103
|
+
title: "SURFACE SUMMARY",
|
|
104
|
+
rows: surfaceSummaryRows({
|
|
105
|
+
depth: options.depth,
|
|
106
|
+
...coverage ? { coverage } : {},
|
|
107
|
+
scenarios: stats,
|
|
108
|
+
failures: runtime.failures.length,
|
|
109
|
+
reach
|
|
110
|
+
})
|
|
111
|
+
}
|
|
112
|
+
]
|
|
113
|
+
});
|
|
114
|
+
if (runtime.failures.length > 0) {
|
|
115
|
+
parts.push({
|
|
116
|
+
kind: "findings",
|
|
117
|
+
stream: "err",
|
|
118
|
+
sections: [
|
|
119
|
+
failureSection(runtime.failures),
|
|
120
|
+
...inventory ? [noVerdictSection(runtime.failures)] : []
|
|
121
|
+
]
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
await present.emit(...parts);
|
|
125
|
+
return runtime.failures.length > 0 ? 2 : 0;
|
|
126
|
+
}
|
|
127
|
+
export {
|
|
128
|
+
runSnapshot
|
|
129
|
+
};
|
|
130
|
+
//# sourceMappingURL=snapshot-5QKLZKZI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/snapshot.ts"],"sourcesContent":["import {\n joinCoverage,\n mountScenarios,\n readInventory,\n UsageError,\n type AnalysisOptions,\n type Depth,\n} from \"../analysis.js\";\nimport { baselinePath, writeBaseline, writeScenarioManifest } from \"../baseline.js\";\nimport { scenarioBaseline } from \"../report.js\";\nimport { buildView, flatRows } from \"../render/model.js\";\nimport { createPresenter } from \"../render/present.js\";\nimport {\n coverageSections,\n displayPath,\n failureSection,\n mountingLabel,\n neverCallable,\n neverCallableSection,\n noVerdictSection,\n READING_SOURCE,\n runHeaderBlocks,\n scenarioStats,\n surfaceSummaryRows,\n trackReach,\n type CapabilityReach,\n type ReportPart,\n} from \"../render/summary.js\";\n\nexport interface SnapshotOptions {\n configPath: string;\n depth: Depth;\n scenario?: string;\n scope?: string[];\n tsconfig?: string;\n baselineDir?: string;\n json?: boolean;\n plain?: boolean;\n}\n\n/**\n * Writes (or refreshes) the committed baseline `check` compares against.\n *\n * It prints the coverage verdict too. This is the command you run to *accept* a\n * change to the surface, which makes it the last moment before a reviewer sees\n * the diff — and accepting a projection while a capability sits behind a route\n * no scenario visits is exactly the state worth hearing about. It reports;\n * `check` is still the only thing that fails.\n *\n * Its report opens the way every other one does (`AS-CLI-013`): what the run\n * was pointed at, then what it wrote, then the verdict. It used to open with\n * bare `wrote …` lines and no header at all, which left the one command that\n * *changes committed files* as the only one that never said what it had been\n * pointed at while it did.\n */\nexport async function runSnapshot(options: SnapshotOptions): Promise<number> {\n if (options.depth === \"static\") {\n throw new UsageError(\n \"snapshot --depth static has nothing to write — a baseline is a projection, and \" +\n \"at this depth nothing is mounted.\",\n );\n }\n\n const analysis: AnalysisOptions = {\n configPath: options.configPath,\n depth: options.depth,\n ...(options.scenario ? { scenario: options.scenario } : {}),\n ...(options.scope ? { scope: options.scope } : {}),\n ...(options.tsconfig ? { tsconfig: options.tsconfig } : {}),\n ...(options.baselineDir ? { baselineDir: options.baselineDir } : {}),\n };\n\n const present = await createPresenter(options);\n await present.wait(READING_SOURCE);\n\n const inventory = readInventory(analysis);\n let scenarios: string[] = [];\n let mountedCount = 0;\n const runtime = await mountScenarios(analysis, {\n onPlan: async (plan) => {\n scenarios = plan.scenarios;\n await present.emit({\n kind: \"blocks\",\n blocks: runHeaderBlocks(\"SURFACE SNAPSHOT\", {\n configPath: options.configPath,\n depth: options.depth,\n ...(plan.scope ? { scope: plan.scope } : {}),\n scenarios: plan.scenarios,\n declaredScenarios: plan.declaredScenarios,\n }),\n });\n if (scenarios.length > 0) await present.wait(mountingLabel(scenarios, 0));\n },\n onEach: async () => {\n mountedCount += 1;\n if (mountedCount < scenarios.length) {\n await present.wait(mountingLabel(scenarios, mountedCount));\n }\n },\n });\n present.settle();\n if (!runtime) throw new UsageError(\"snapshot needs a mount, and this depth performs none\");\n\n const written: Array<{ cells: string[] }> = [];\n for (const result of runtime.results) {\n const path = baselinePath(runtime.baselineDir, result.scenario);\n writeBaseline(path, scenarioBaseline(result));\n written.push({ cells: [result.scenario, displayPath(path)] });\n }\n writeScenarioManifest(runtime.baselineDir, runtime.declaredScenarios);\n\n const reach = new Map<string, CapabilityReach>();\n for (const result of runtime.results) {\n trackReach(reach, flatRows(buildView(result)), result.scenario);\n }\n const coverage = joinCoverage(inventory, runtime, analysis);\n const stats = runtime.results.map(scenarioStats);\n const dark = neverCallable(reach);\n\n const parts: ReportPart[] = [\n { kind: \"table\", title: `WROTE (${written.length})`, headers: [\"SCENARIO\", \"FILE\"], rows: written },\n ];\n\n // Over one scenario, \"never callable\" repeats that scenario's own table row\n // for row — see neverCallableSection().\n const sections = [\n ...(coverage ? coverageSections(coverage) : []),\n ...(dark.length > 0 && stats.length > 1 ? [neverCallableSection(dark)] : []),\n ];\n if (sections.length > 0) parts.push({ kind: \"findings\", sections });\n\n parts.push({\n kind: \"blocks\",\n blocks: [\n {\n title: \"SURFACE SUMMARY\",\n rows: surfaceSummaryRows({\n depth: options.depth,\n ...(coverage ? { coverage } : {}),\n scenarios: stats,\n failures: runtime.failures.length,\n reach,\n }),\n },\n ],\n });\n\n if (runtime.failures.length > 0) {\n // A baseline written for some scenarios and not others is a baseline that\n // will fail `check` for a reason that has nothing to do with the surface.\n parts.push({\n kind: \"findings\",\n stream: \"err\",\n sections: [\n failureSection(runtime.failures),\n ...(inventory ? [noVerdictSection(runtime.failures)] : []),\n ],\n });\n }\n\n await present.emit(...parts);\n return runtime.failures.length > 0 ? 2 : 0;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuDA,eAAsB,YAAY,SAA2C;AAC3E,MAAI,QAAQ,UAAU,UAAU;AAC9B,UAAM,IAAI;AAAA,MACR;AAAA,IAEF;AAAA,EACF;AAEA,QAAM,WAA4B;AAAA,IAChC,YAAY,QAAQ;AAAA,IACpB,OAAO,QAAQ;AAAA,IACf,GAAI,QAAQ,WAAW,EAAE,UAAU,QAAQ,SAAS,IAAI,CAAC;AAAA,IACzD,GAAI,QAAQ,QAAQ,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;AAAA,IAChD,GAAI,QAAQ,WAAW,EAAE,UAAU,QAAQ,SAAS,IAAI,CAAC;AAAA,IACzD,GAAI,QAAQ,cAAc,EAAE,aAAa,QAAQ,YAAY,IAAI,CAAC;AAAA,EACpE;AAEA,QAAM,UAAU,MAAM,gBAAgB,OAAO;AAC7C,QAAM,QAAQ,KAAK,cAAc;AAEjC,QAAM,YAAY,cAAc,QAAQ;AACxC,MAAI,YAAsB,CAAC;AAC3B,MAAI,eAAe;AACnB,QAAM,UAAU,MAAM,eAAe,UAAU;AAAA,IAC7C,QAAQ,OAAO,SAAS;AACtB,kBAAY,KAAK;AACjB,YAAM,QAAQ,KAAK;AAAA,QACjB,MAAM;AAAA,QACN,QAAQ,gBAAgB,oBAAoB;AAAA,UAC1C,YAAY,QAAQ;AAAA,UACpB,OAAO,QAAQ;AAAA,UACf,GAAI,KAAK,QAAQ,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,UAC1C,WAAW,KAAK;AAAA,UAChB,mBAAmB,KAAK;AAAA,QAC1B,CAAC;AAAA,MACH,CAAC;AACD,UAAI,UAAU,SAAS,EAAG,OAAM,QAAQ,KAAK,cAAc,WAAW,CAAC,CAAC;AAAA,IAC1E;AAAA,IACA,QAAQ,YAAY;AAClB,sBAAgB;AAChB,UAAI,eAAe,UAAU,QAAQ;AACnC,cAAM,QAAQ,KAAK,cAAc,WAAW,YAAY,CAAC;AAAA,MAC3D;AAAA,IACF;AAAA,EACF,CAAC;AACD,UAAQ,OAAO;AACf,MAAI,CAAC,QAAS,OAAM,IAAI,WAAW,sDAAsD;AAEzF,QAAM,UAAsC,CAAC;AAC7C,aAAW,UAAU,QAAQ,SAAS;AACpC,UAAM,OAAO,aAAa,QAAQ,aAAa,OAAO,QAAQ;AAC9D,kBAAc,MAAM,iBAAiB,MAAM,CAAC;AAC5C,YAAQ,KAAK,EAAE,OAAO,CAAC,OAAO,UAAU,YAAY,IAAI,CAAC,EAAE,CAAC;AAAA,EAC9D;AACA,wBAAsB,QAAQ,aAAa,QAAQ,iBAAiB;AAEpE,QAAM,QAAQ,oBAAI,IAA6B;AAC/C,aAAW,UAAU,QAAQ,SAAS;AACpC,eAAW,OAAO,SAAS,UAAU,MAAM,CAAC,GAAG,OAAO,QAAQ;AAAA,EAChE;AACA,QAAM,WAAW,aAAa,WAAW,SAAS,QAAQ;AAC1D,QAAM,QAAQ,QAAQ,QAAQ,IAAI,aAAa;AAC/C,QAAM,OAAO,cAAc,KAAK;AAEhC,QAAM,QAAsB;AAAA,IAC1B,EAAE,MAAM,SAAS,OAAO,WAAW,QAAQ,MAAM,KAAK,SAAS,CAAC,YAAY,MAAM,GAAG,MAAM,QAAQ;AAAA,EACrG;AAIA,QAAM,WAAW;AAAA,IACf,GAAI,WAAW,iBAAiB,QAAQ,IAAI,CAAC;AAAA,IAC7C,GAAI,KAAK,SAAS,KAAK,MAAM,SAAS,IAAI,CAAC,qBAAqB,IAAI,CAAC,IAAI,CAAC;AAAA,EAC5E;AACA,MAAI,SAAS,SAAS,EAAG,OAAM,KAAK,EAAE,MAAM,YAAY,SAAS,CAAC;AAElE,QAAM,KAAK;AAAA,IACT,MAAM;AAAA,IACN,QAAQ;AAAA,MACN;AAAA,QACE,OAAO;AAAA,QACP,MAAM,mBAAmB;AAAA,UACvB,OAAO,QAAQ;AAAA,UACf,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,UAC/B,WAAW;AAAA,UACX,UAAU,QAAQ,SAAS;AAAA,UAC3B;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAC;AAED,MAAI,QAAQ,SAAS,SAAS,GAAG;AAG/B,UAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,QACR,eAAe,QAAQ,QAAQ;AAAA,QAC/B,GAAI,YAAY,CAAC,iBAAiB,QAAQ,QAAQ,CAAC,IAAI,CAAC;AAAA,MAC1D;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,QAAQ,KAAK,GAAG,KAAK;AAC3B,SAAO,QAAQ,SAAS,SAAS,IAAI,IAAI;AAC3C;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-surface/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.15.0",
|
|
4
4
|
"description": "Inspect and check the agent surface your app exposes — in the terminal and in CI",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -31,9 +31,9 @@
|
|
|
31
31
|
"typescript": "^5.9.2",
|
|
32
32
|
"vite": "^7.1.3",
|
|
33
33
|
"vite-node": "^3.2.4",
|
|
34
|
-
"@agent-surface/
|
|
35
|
-
"@agent-surface/
|
|
36
|
-
"@agent-surface/testing": "^0.
|
|
34
|
+
"@agent-surface/core": "^0.15.0",
|
|
35
|
+
"@agent-surface/react": "^0.15.0",
|
|
36
|
+
"@agent-surface/testing": "^0.15.0"
|
|
37
37
|
},
|
|
38
38
|
"peerDependencies": {
|
|
39
39
|
"@testing-library/react": ">=14",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/check.ts"],"sourcesContent":["import { existsSync, readdirSync } from \"node:fs\";\nimport {\n UsageError,\n joinCoverage,\n mountScenarios,\n readInventory,\n type AnalysisOptions,\n type Depth,\n} from \"../analysis.js\";\nimport {\n annotate,\n baselinePath,\n diff,\n readBaseline,\n readScenarioManifest,\n SCENARIO_MANIFEST_FILE,\n type DiffEntry,\n} from \"../baseline.js\";\nimport { ALLOWLIST_FILE, coverageExitCode, UNREAD_ALLOWLIST_FILE } from \"../coverage.js\";\nimport {\n renderCoveragePlain,\n renderCheckOverviewPlain,\n renderDriftPlain,\n renderFailuresPlain,\n renderNextStepsPlain,\n renderNoVerdictPlain,\n renderSectionsPlain,\n} from \"../render/plain.js\";\nimport {\n displayPath,\n scenarioStats,\n type FindingSection,\n type ScenarioStats,\n} from \"../render/summary.js\";\nimport { write, writeError } from \"../output.js\";\nimport { coverageReport, scenarioBaseline } from \"../report.js\";\n\nexport interface CheckOptions {\n configPath: string;\n depth: Depth;\n scenario?: string;\n scope?: string[];\n tsconfig?: string;\n baselineDir?: string;\n allowUnresolved?: boolean;\n json?: boolean;\n plain?: boolean;\n detail?: boolean;\n}\n\ninterface ScenarioDrift {\n scenario: string;\n missingBaseline?: boolean;\n entries: DiffEntry[];\n}\n\ninterface RejectedScenario {\n scenario: string;\n rejections: Array<{ componentType: string; instanceId: string; reason: string }>;\n}\n\n/**\n * The gate. The only command in this package that fails on a finding, which is\n * why every finding has to reach it.\n *\n * It used to fail on exactly one class — the projection drifting from its\n * baseline — and print a line telling you that capabilities no scenario mounts\n * were a different command's question. A gate that names the check it is not\n * performing is a gate with a hole in it, and in CI the hole was silent: a\n * whole unreached route sat behind a green tick.\n *\n * So it now fails on every incomplete or changed report:\n *\n * - **drift** — the surface changed against its committed baseline;\n * - **a missing baseline** — nothing to compare, which is not the same as a match;\n * - **an unreached capability** — authored, and no scenario mounts it;\n * - **an unread call site** — the catalog is incomplete, so the third check\n * above is computed over a denominator that is only a floor;\n * - **a rejected registration** — authored surface was refused;\n * - **scenario drift** — config, manifest and baseline files disagree.\n *\n * `.agent-surface/coverage-allow.json` ratchets the third; `--allow-unresolved`\n * accepts the fourth. Both are deliberate, committed decisions rather than\n * flags that quietly widen the gate.\n *\n * The report is read top-down: the verdict, what it was computed over, one row\n * per class of finding whether or not it fired, one row per scenario, then the\n * findings themselves and the commands that clear them. Output is always plain,\n * with no rendering framework in its path at all: this is a report that gets\n * pasted into a pull request and read out of a CI log, and neither of those is\n * a terminal.\n */\nexport async function runCheck(options: CheckOptions): Promise<number> {\n if (options.depth === \"static\") {\n throw new UsageError(\n \"check --depth static has nothing to compare — a baseline is a projection, and \" +\n \"at this depth nothing is mounted. Use --depth runtime for drift alone, or full for both.\",\n );\n }\n\n const analysis: AnalysisOptions = {\n configPath: options.configPath,\n depth: options.depth,\n ...(options.scenario ? { scenario: options.scenario } : {}),\n ...(options.scope ? { scope: options.scope } : {}),\n ...(options.tsconfig ? { tsconfig: options.tsconfig } : {}),\n ...(options.baselineDir ? { baselineDir: options.baselineDir } : {}),\n };\n\n const inventory = readInventory(analysis);\n // No streaming here, unlike `inspect`. A report is read top-down and has to\n // lead with its findings, which means every finding has to exist first.\n const runtime = await mountScenarios(analysis);\n if (!runtime) throw new UsageError(\"check needs a mount, and this depth performs none\");\n\n const drifted: ScenarioDrift[] = [];\n for (const result of runtime.results) {\n const path = baselinePath(runtime.baselineDir, result.scenario);\n const expected = readBaseline(path);\n if (expected === undefined) {\n drifted.push({ scenario: result.scenario, missingBaseline: true, entries: [] });\n continue;\n }\n const actual = scenarioBaseline(result);\n const entries = annotate(diff(expected, actual), actual, expected);\n if (entries.length > 0) drifted.push({ scenario: result.scenario, entries });\n }\n\n const committedScenarios = readScenarioManifest(runtime.baselineDir);\n const declared = [...runtime.declaredScenarios].sort();\n const scenarioManifestMismatch =\n committedScenarios === undefined ||\n JSON.stringify(committedScenarios) !== JSON.stringify(declared);\n const reserved = new Set([SCENARIO_MANIFEST_FILE, ALLOWLIST_FILE, UNREAD_ALLOWLIST_FILE]);\n const staleBaselineFiles = (\n existsSync(runtime.baselineDir) ? readdirSync(runtime.baselineDir, { withFileTypes: true }) : []\n )\n .filter((entry) => entry.isFile() && entry.name.endsWith(\".json\") && !reserved.has(entry.name))\n .map((entry) => entry.name.slice(0, -5))\n .filter((scenario) => !runtime.declaredScenarios.includes(scenario))\n .sort();\n\n const rejected: RejectedScenario[] = runtime.results\n .filter((result) => result.rejections.length > 0)\n .map((result) => ({ scenario: result.scenario, rejections: result.rejections }));\n\n const coverage = joinCoverage(inventory, runtime, analysis);\n const coverageFailed =\n coverage !== undefined &&\n coverageExitCode(coverage, { allowUnresolved: options.allowUnresolved === true }) !== 0;\n const couldNotRun = runtime.failures.length > 0;\n const ok =\n drifted.length === 0 &&\n !coverageFailed &&\n !couldNotRun &&\n rejected.length === 0 &&\n !scenarioManifestMismatch &&\n staleBaselineFiles.length === 0;\n\n if (options.json) {\n write(\n JSON.stringify(\n {\n ok,\n drifted,\n failures: runtime.failures,\n rejected,\n scenarioManifest: {\n expected: declared,\n committed: committedScenarios ?? null,\n staleBaselines: staleBaselineFiles,\n },\n coverage: coverageReport(coverage),\n },\n null,\n 2,\n ),\n );\n return couldNotRun ? 2 : ok ? 0 : 1;\n }\n\n // \"No baseline\" is not drift, and filing it under a heading that says the\n // surface changed would be a claim about a comparison that never happened.\n const missing = drifted.filter((entry) => entry.missingBaseline);\n const changed = drifted.filter((entry) => !entry.missingBaseline);\n\n const baselineOf = (scenario: string): string => {\n const entry = drifted.find((candidate) => candidate.scenario === scenario);\n if (!entry) return \"current\";\n if (entry.missingBaseline) return \"missing\";\n return `drift (${entry.entries.length})`;\n };\n // One row per scenario the run attempted, in config order — including the\n // ones that threw, which otherwise appear only at the bottom of the report.\n const stats: ScenarioStats[] = runtime.scenarios.map((scenario) => {\n const result = runtime.results.find((candidate) => candidate.scenario === scenario);\n return result\n ? { ...scenarioStats(result), baseline: baselineOf(scenario) }\n : {\n scenario,\n callable: 0,\n disabled: 0,\n hidden: 0,\n rejected: 0,\n failed: true,\n ...(runtime.failures.find((failure) => failure.scenario === scenario)?.message\n ? {\n failure: runtime.failures.find((failure) => failure.scenario === scenario)!.message,\n }\n : {}),\n };\n });\n\n const overview = renderCheckOverviewPlain({\n status: couldNotRun ? \"ERROR\" : ok ? \"PASS\" : \"FAIL\",\n ...(coverage ? { coverage } : {}),\n unresolvedAllowed: options.allowUnresolved === true,\n baselineCurrent: Math.max(0, runtime.results.length - drifted.length),\n baselineTotal: runtime.scenarios.length,\n scenarioManifestOk: !scenarioManifestMismatch && staleBaselineFiles.length === 0,\n rejected: rejected.reduce((sum, entry) => sum + entry.rejections.length, 0),\n mountFailures: runtime.failures.length,\n scenarios: runtime.scenarios,\n context: {\n configPath: options.configPath,\n depth: options.depth,\n ...(runtime.scope ? { scope: runtime.scope } : {}),\n },\n stats,\n });\n if (ok) write(overview);\n else writeError(overview);\n\n // The gap leads, because it is the finding this command could not previously\n // make at all. Drift follows, because it is the one it always could.\n if (coverage) {\n const rendered = renderCoveragePlain(coverage, {\n compact: true,\n ...(options.detail ? { detail: true } : {}),\n });\n if (rendered) {\n if (coverageFailed) writeError(`\\n${rendered}`);\n else write(`\\n${rendered}`);\n }\n }\n\n const sections: FindingSection[] = [];\n const steps: string[] = [];\n if (coverage && coverage.unreached.length > 0) {\n steps.push(\n `mount the ${coverage.unreached.length} unreached capabilit${\n coverage.unreached.length === 1 ? \"y\" : \"ies\"\n } from a scenario, or record the decision in ${displayPath(coverage.allowlistPath)}`,\n );\n }\n if (coverage && coverage.unresolved.length > 0 && options.allowUnresolved !== true) {\n steps.push(\n `make the ${coverage.unresolved.length} unread call site${\n coverage.unresolved.length === 1 ? \"\" : \"s\"\n } readable, or paste each printed key into ${displayPath(coverage.unreadAllowlistPath)}`,\n );\n }\n\n if (rejected.length > 0) {\n const total = rejected.reduce((sum, entry) => sum + entry.rejections.length, 0);\n sections.push({\n title: \"REJECTED REGISTRATIONS\",\n gloss: \"the runtime refused authored surface during the mount\",\n count: total,\n lines: rejected.flatMap((entry) =>\n entry.rejections.map(\n (rejection) =>\n `${entry.scenario}: ${rejection.componentType}@${rejection.instanceId} (${rejection.reason})`,\n ),\n ),\n hint:\n \"a dead handle registers nothing — give the second registration its own instanceId, \" +\n \"or remove the duplicated component type\",\n });\n steps.push(\n `resolve ${total} rejected registration${total === 1 ? \"\" : \"s\"} — the capabilities ` +\n \"behind them reach no agent\",\n );\n }\n\n if (scenarioManifestMismatch || staleBaselineFiles.length > 0) {\n sections.push({\n title: \"SCENARIO DRIFT\",\n gloss: \"the committed baselines do not match the config\",\n count: 0,\n lines: [\n `config: ${declared.join(\", \")}`,\n `manifest: ${committedScenarios?.join(\", \") ?? \"missing\"}`,\n ...(staleBaselineFiles.length > 0\n ? [`stale: ${staleBaselineFiles.join(\", \")}`]\n : []),\n ],\n hint:\n \"run `agent-surface snapshot`, commit the manifest, and delete any baseline for a \" +\n \"scenario the config no longer declares\",\n });\n }\n\n if (missing.length > 0) {\n sections.push({\n title: \"NO BASELINE\",\n gloss: \"nothing to compare against, which is not the same as a match\",\n count: missing.length,\n lines: missing.map(\n (entry) =>\n `${entry.scenario}: ${displayPath(\n baselinePath(runtime.baselineDir, entry.scenario),\n )} does not exist`,\n ),\n hint: \"run `agent-surface snapshot` and commit the files it writes\",\n });\n }\n\n if (changed.length > 0) {\n sections.push({\n title: \"DRIFT\",\n gloss: \"the surface changed against its baseline\",\n count: changed.length,\n lines: changed.flatMap((entry) => renderDriftPlain(entry.scenario, entry.entries)),\n hint:\n \"review the change, then `agent-surface snapshot` to accept it\" +\n (runtime.scope\n ? \". A scope filters the projection while baselines are written from whatever \" +\n \"scope wrote them, so re-check without --scope before believing this one\"\n : \"\"),\n });\n }\n\n const baselinesStale =\n missing.length > 0 ||\n changed.length > 0 ||\n scenarioManifestMismatch ||\n staleBaselineFiles.length > 0;\n if (baselinesStale) {\n steps.push(\n \"`agent-surface snapshot`, then commit .agent-surface/ — this accepts the surface \" +\n \"above as reviewed\",\n );\n }\n\n if (sections.length > 0) writeError(`\\n${renderSectionsPlain(sections)}`);\n\n if (couldNotRun) {\n writeError(`\\n${renderFailuresPlain(runtime.failures)}`);\n if (inventory) writeError(`\\n${renderNoVerdictPlain(runtime.failures)}`);\n // First, and above every other remedy: nothing else in this report can be\n // trusted while a scenario the config declares never ran.\n steps.unshift(\n `fix the mount for ${runtime.failures\n .map((failure) => failure.scenario)\n .join(\", \")} — every count above is missing whatever ${\n runtime.failures.length === 1 ? \"it\" : \"they\"\n } would have surfaced`,\n );\n }\n\n // Last, and only when something failed: the tail of a CI log is what a reader\n // sees first, and a list of findings without the commands that clear them\n // leaves the reader to derive those from six different sections.\n if (!ok && steps.length > 0) writeError(`\\n${renderNextStepsPlain(steps)}`);\n\n return couldNotRun ? 2 : ok ? 0 : 1;\n}\n"],"mappings":"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","names":[]}
|
package/dist/chunk-3AJ343NA.js
DELETED
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
// src/contract.ts
|
|
2
|
-
var DEPTHS = ["static", "runtime", "full"];
|
|
3
|
-
function isDepth(value) {
|
|
4
|
-
return typeof value === "string" && DEPTHS.includes(value);
|
|
5
|
-
}
|
|
6
|
-
var UsageError = class extends Error {
|
|
7
|
-
};
|
|
8
|
-
|
|
9
|
-
// src/load.ts
|
|
10
|
-
import { existsSync } from "fs";
|
|
11
|
-
import { dirname, isAbsolute, join, resolve } from "path";
|
|
12
|
-
import { fileURLToPath } from "url";
|
|
13
|
-
import { createServer } from "vite";
|
|
14
|
-
import { ViteNodeServer } from "vite-node/server";
|
|
15
|
-
import { ViteNodeRunner } from "vite-node/client";
|
|
16
|
-
import { installSourcemapsSupport } from "vite-node/source-map";
|
|
17
|
-
var CONFIG_NAMES = [
|
|
18
|
-
"agent-surface.config.tsx",
|
|
19
|
-
"agent-surface.config.ts",
|
|
20
|
-
"agent-surface.config.mjs",
|
|
21
|
-
"agent-surface.config.js"
|
|
22
|
-
];
|
|
23
|
-
function findConfig(from = process.cwd()) {
|
|
24
|
-
let dir = resolve(from);
|
|
25
|
-
for (; ; ) {
|
|
26
|
-
for (const name of CONFIG_NAMES) {
|
|
27
|
-
const candidate = join(dir, name);
|
|
28
|
-
if (existsSync(candidate)) return candidate;
|
|
29
|
-
}
|
|
30
|
-
const parent = dirname(dir);
|
|
31
|
-
if (parent === dir) return void 0;
|
|
32
|
-
dir = parent;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
function collectorPath() {
|
|
36
|
-
for (const ext of ["js", "ts"]) {
|
|
37
|
-
const candidate = fileURLToPath(new URL(`./collect.${ext}`, import.meta.url));
|
|
38
|
-
if (existsSync(candidate)) return candidate;
|
|
39
|
-
}
|
|
40
|
-
throw new Error("could not locate the agent-surface collector module");
|
|
41
|
-
}
|
|
42
|
-
async function createSurfaceRunner(configPath) {
|
|
43
|
-
const absoluteConfig = isAbsolute(configPath) ? configPath : resolve(configPath);
|
|
44
|
-
if (!existsSync(absoluteConfig)) {
|
|
45
|
-
throw new Error(`config not found: ${absoluteConfig}`);
|
|
46
|
-
}
|
|
47
|
-
const root = dirname(absoluteConfig);
|
|
48
|
-
let server;
|
|
49
|
-
try {
|
|
50
|
-
server = await createServer({
|
|
51
|
-
root,
|
|
52
|
-
logLevel: "error",
|
|
53
|
-
// `serve` so plugins behave as they do in dev; nothing is ever served.
|
|
54
|
-
server: { middlewareMode: true, watch: null, fs: { strict: false } },
|
|
55
|
-
optimizeDeps: { noDiscovery: true, include: [] },
|
|
56
|
-
resolve: {
|
|
57
|
-
// Both halves of the graph must agree on these. React because two
|
|
58
|
-
// copies break hooks; core because `explainSurface` finds the registry
|
|
59
|
-
// through a Symbol, which is per-module-instance (see collect.ts).
|
|
60
|
-
dedupe: [
|
|
61
|
-
"react",
|
|
62
|
-
"react-dom",
|
|
63
|
-
"@agent-surface/core",
|
|
64
|
-
"@agent-surface/react",
|
|
65
|
-
"@agent-surface/testing"
|
|
66
|
-
]
|
|
67
|
-
}
|
|
68
|
-
});
|
|
69
|
-
} catch (error) {
|
|
70
|
-
throw new Error(
|
|
71
|
-
`could not start Vite for ${root}: ${error instanceof Error ? error.message : String(error)}`
|
|
72
|
-
);
|
|
73
|
-
}
|
|
74
|
-
try {
|
|
75
|
-
await server.pluginContainer.buildStart({});
|
|
76
|
-
} catch {
|
|
77
|
-
}
|
|
78
|
-
const nodeServer = new ViteNodeServer(server);
|
|
79
|
-
installSourcemapsSupport({ getSourceMap: (source) => nodeServer.getSourceMap(source) });
|
|
80
|
-
const runner = new ViteNodeRunner({
|
|
81
|
-
root: server.config.root,
|
|
82
|
-
base: server.config.base,
|
|
83
|
-
fetchModule: (id) => nodeServer.fetchModule(id),
|
|
84
|
-
resolveId: (id, importer) => nodeServer.resolveId(id, importer)
|
|
85
|
-
});
|
|
86
|
-
const close = async () => {
|
|
87
|
-
await server.close();
|
|
88
|
-
};
|
|
89
|
-
try {
|
|
90
|
-
const configModule = await runner.executeFile(absoluteConfig);
|
|
91
|
-
const config = configModule.default;
|
|
92
|
-
if (!config || typeof config.mount !== "function") {
|
|
93
|
-
throw new Error(
|
|
94
|
-
`${absoluteConfig} must \`export default defineSurface({ mount, scenarios })\``
|
|
95
|
-
);
|
|
96
|
-
}
|
|
97
|
-
const scenarioNames = Object.keys(config.scenarios ?? {});
|
|
98
|
-
if (scenarioNames.length === 0) {
|
|
99
|
-
throw new Error(`${absoluteConfig} defines no scenarios`);
|
|
100
|
-
}
|
|
101
|
-
const collector = await runner.executeFile(collectorPath());
|
|
102
|
-
return {
|
|
103
|
-
config,
|
|
104
|
-
scenarioNames,
|
|
105
|
-
collect: async (options) => {
|
|
106
|
-
const globals = globalThis;
|
|
107
|
-
const previous = globals["IS_REACT_ACT_ENVIRONMENT"];
|
|
108
|
-
globals["IS_REACT_ACT_ENVIRONMENT"] = true;
|
|
109
|
-
try {
|
|
110
|
-
return await collector.collect(config, options);
|
|
111
|
-
} finally {
|
|
112
|
-
globals["IS_REACT_ACT_ENVIRONMENT"] = previous;
|
|
113
|
-
}
|
|
114
|
-
},
|
|
115
|
-
close
|
|
116
|
-
};
|
|
117
|
-
} catch (error) {
|
|
118
|
-
await close();
|
|
119
|
-
throw error;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
// src/output.ts
|
|
124
|
-
function isPlain(flags) {
|
|
125
|
-
if (flags.json) return true;
|
|
126
|
-
if (flags.plain) return true;
|
|
127
|
-
if (process.env["CI"]) return true;
|
|
128
|
-
if (process.env["NO_COLOR"]) return true;
|
|
129
|
-
if (process.stdout.isTTY !== true) return true;
|
|
130
|
-
return !process.stdout.columns;
|
|
131
|
-
}
|
|
132
|
-
function write(text) {
|
|
133
|
-
process.stdout.write(`${text}
|
|
134
|
-
`);
|
|
135
|
-
}
|
|
136
|
-
function writeError(text) {
|
|
137
|
-
process.stderr.write(`${text}
|
|
138
|
-
`);
|
|
139
|
-
}
|
|
140
|
-
var cached;
|
|
141
|
-
async function loadInk() {
|
|
142
|
-
if (cached !== void 0) return cached;
|
|
143
|
-
try {
|
|
144
|
-
cached = await import("./ink-QR7X7TAC.js");
|
|
145
|
-
} catch {
|
|
146
|
-
cached = null;
|
|
147
|
-
}
|
|
148
|
-
return cached;
|
|
149
|
-
}
|
|
150
|
-
async function paint(element) {
|
|
151
|
-
const { render } = await import("ink");
|
|
152
|
-
const instance = render(element);
|
|
153
|
-
instance.unmount();
|
|
154
|
-
await instance.waitUntilExit();
|
|
155
|
-
}
|
|
156
|
-
async function transient(element) {
|
|
157
|
-
const { render } = await import("ink");
|
|
158
|
-
const instance = render(element);
|
|
159
|
-
return () => {
|
|
160
|
-
instance.clear();
|
|
161
|
-
instance.unmount();
|
|
162
|
-
};
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
export {
|
|
166
|
-
DEPTHS,
|
|
167
|
-
isDepth,
|
|
168
|
-
UsageError,
|
|
169
|
-
findConfig,
|
|
170
|
-
createSurfaceRunner,
|
|
171
|
-
isPlain,
|
|
172
|
-
write,
|
|
173
|
-
writeError,
|
|
174
|
-
loadInk,
|
|
175
|
-
paint,
|
|
176
|
-
transient
|
|
177
|
-
};
|
|
178
|
-
//# sourceMappingURL=chunk-3AJ343NA.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/contract.ts","../src/load.ts","../src/output.ts"],"sourcesContent":["/**\n * The vocabulary every layer shares, and nothing else.\n *\n * It is its own module because `bin.ts` needs both of these before it has\n * decided which command to run, and everything else in this package pulls in\n * either the TypeScript compiler or Vite the moment it is imported. A `--help`\n * that boots a TypeScript program to print a paragraph is a `--help` nobody\n * runs twice.\n */\n\nexport const DEPTHS = [\"static\", \"runtime\", \"full\"] as const;\n\n/**\n * How much of the surface a command is asked to compute.\n *\n * A presentation surface has two sources of truth and every command needs some\n * mix of both — the **catalog** this codebase authors, which is static, and the\n * **projection** a mounted scenario surfaces, which is not. Splitting those\n * across separate commands is what let a green `check` sit on top of a route no\n * scenario visits, so the split lives here instead.\n *\n * `static` reads the TypeScript program and mounts nothing — no Vite server, no\n * jsdom, no scenarios. It is the only depth that survives an app which will not\n * mount, and the only one that needs no scenarios to exist yet.\n *\n * `runtime` mounts and skips the program read, for a repository whose tsconfig\n * is wide enough that booting it costs more than the answer is worth.\n *\n * `full` does both and joins them, which is the only depth that can answer\n * *did we author something no scenario reaches*. It is the default because a\n * tool that has to be asked for the complete answer mostly gives the\n * incomplete one.\n */\nexport type Depth = (typeof DEPTHS)[number];\n\nexport function isDepth(value: unknown): value is Depth {\n return typeof value === \"string\" && (DEPTHS as readonly string[]).includes(value);\n}\n\n/**\n * The caller asked for something impossible — as opposed to the app being\n * broken, which is what a mount failure is. Both exit `2`: CI has to tell \"the\n * surface changed\" apart from \"the tool never ran\", and these are both the\n * second one.\n */\nexport class UsageError extends Error {}\n","import { existsSync } from \"node:fs\";\nimport { dirname, isAbsolute, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { createServer, type ViteDevServer } from \"vite\";\nimport { ViteNodeServer } from \"vite-node/server\";\nimport { ViteNodeRunner } from \"vite-node/client\";\nimport { installSourcemapsSupport } from \"vite-node/source-map\";\nimport type { CollectOptions, CollectResult } from \"./collect.js\";\nimport type { SurfaceConfig } from \"./config.js\";\n\nconst CONFIG_NAMES = [\n \"agent-surface.config.tsx\",\n \"agent-surface.config.ts\",\n \"agent-surface.config.mjs\",\n \"agent-surface.config.js\",\n];\n\n/** Walks up from `from` looking for an `agent-surface.config.*`. */\nexport function findConfig(from: string = process.cwd()): string | undefined {\n let dir = resolve(from);\n for (;;) {\n for (const name of CONFIG_NAMES) {\n const candidate = join(dir, name);\n if (existsSync(candidate)) return candidate;\n }\n const parent = dirname(dir);\n if (parent === dir) return undefined;\n dir = parent;\n }\n}\n\n/** `dist/collect.js` when installed; `src/collect.ts` when run from source. */\nfunction collectorPath(): string {\n for (const ext of [\"js\", \"ts\"]) {\n const candidate = fileURLToPath(new URL(`./collect.${ext}`, import.meta.url));\n if (existsSync(candidate)) return candidate;\n }\n throw new Error(\"could not locate the agent-surface collector module\");\n}\n\nexport interface SurfaceRunner {\n config: SurfaceConfig;\n scenarioNames: string[];\n collect(options: CollectOptions): Promise<CollectResult>;\n close(): Promise<void>;\n}\n\n/**\n * Boots a Vite dev server on the app's own config, so the config file and the\n * app modules it imports are transformed and resolved exactly as the app\n * resolves them — its aliases, its plugins, its TSX.\n */\nexport async function createSurfaceRunner(configPath: string): Promise<SurfaceRunner> {\n const absoluteConfig = isAbsolute(configPath) ? configPath : resolve(configPath);\n if (!existsSync(absoluteConfig)) {\n throw new Error(`config not found: ${absoluteConfig}`);\n }\n const root = dirname(absoluteConfig);\n\n let server: ViteDevServer;\n try {\n server = await createServer({\n root,\n logLevel: \"error\",\n // `serve` so plugins behave as they do in dev; nothing is ever served.\n server: { middlewareMode: true, watch: null, fs: { strict: false } },\n optimizeDeps: { noDiscovery: true, include: [] },\n resolve: {\n // Both halves of the graph must agree on these. React because two\n // copies break hooks; core because `explainSurface` finds the registry\n // through a Symbol, which is per-module-instance (see collect.ts).\n dedupe: [\n \"react\",\n \"react-dom\",\n \"@agent-surface/core\",\n \"@agent-surface/react\",\n \"@agent-surface/testing\",\n ],\n },\n });\n } catch (error) {\n throw new Error(\n `could not start Vite for ${root}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n try {\n await server.pluginContainer.buildStart({});\n } catch {\n // Vite keeps moving this; a plugin that needs buildStart will say so itself.\n }\n\n const nodeServer = new ViteNodeServer(server);\n installSourcemapsSupport({ getSourceMap: (source) => nodeServer.getSourceMap(source) });\n\n const runner = new ViteNodeRunner({\n root: server.config.root,\n base: server.config.base,\n fetchModule: (id) => nodeServer.fetchModule(id),\n resolveId: (id, importer) => nodeServer.resolveId(id, importer),\n });\n\n const close = async (): Promise<void> => {\n await server.close();\n };\n\n try {\n const configModule = (await runner.executeFile(absoluteConfig)) as {\n default?: SurfaceConfig;\n };\n const config = configModule.default;\n if (!config || typeof config.mount !== \"function\") {\n throw new Error(\n `${absoluteConfig} must \\`export default defineSurface({ mount, scenarios })\\``,\n );\n }\n const scenarioNames = Object.keys(config.scenarios ?? {});\n if (scenarioNames.length === 0) {\n throw new Error(`${absoluteConfig} defines no scenarios`);\n }\n\n // Same runner ⇒ same module graph ⇒ the collector shares React and core\n // with the app tree it is about to mount.\n const collector = (await runner.executeFile(collectorPath())) as {\n collect(config: SurfaceConfig, options: CollectOptions): Promise<CollectResult>;\n };\n\n return {\n config,\n scenarioNames,\n collect: async (options) => {\n // Scoped to the mount, never process-wide: `act()` needs it, and Ink\n // renders its own React tree afterwards — with the flag still set,\n // every frame of the CLI's own UI prints React's \"not wrapped in\n // act(...)\" warning at the user.\n const globals = globalThis as Record<string, unknown>;\n const previous = globals[\"IS_REACT_ACT_ENVIRONMENT\"];\n globals[\"IS_REACT_ACT_ENVIRONMENT\"] = true;\n try {\n return await collector.collect(config, options);\n } finally {\n globals[\"IS_REACT_ACT_ENVIRONMENT\"] = previous;\n }\n },\n close,\n };\n } catch (error) {\n await close();\n throw error;\n }\n}\n","import type { ReactElement } from \"react\";\n\nexport interface OutputFlags {\n plain?: boolean;\n json?: boolean;\n}\n\n/**\n * Terminal-aware only when there is a terminal. Piped output, `--plain`, `CI`\n * and `NO_COLOR` all fall back to plain text — a CLI whose output changes shape\n * when redirected is unusable in a build log.\n */\nexport function isPlain(flags: OutputFlags): boolean {\n if (flags.json) return true;\n if (flags.plain) return true;\n if (process.env[\"CI\"]) return true;\n if (process.env[\"NO_COLOR\"]) return true;\n if (process.stdout.isTTY !== true) return true;\n // A TTY that cannot report its width (some CI ptys, `script` on macOS) makes\n // Ink lay out at zero columns and emit one character per line. Plain text is\n // the only honest rendering for a terminal whose size is unknown.\n return !process.stdout.columns;\n}\n\nexport function write(text: string): void {\n process.stdout.write(`${text}\\n`);\n}\n\nexport function writeError(text: string): void {\n process.stderr.write(`${text}\\n`);\n}\n\ntype InkModule = typeof import(\"./render/ink.js\");\n\nlet cached: InkModule | null | undefined;\n\n/**\n * Loads the Ink renderer, or returns `null` when it cannot run here.\n *\n * Two reasons this is lazy rather than a top-level import. It keeps `--plain`\n * and `--json` from paying for a terminal UI they never draw — and Ink drives\n * React through `react-reconciler`, which reads React 19 internals, so a host\n * that pins React 18 globally cannot load it at all. Neither is a reason to\n * fail a command that was about to print text.\n */\nexport async function loadInk(): Promise<InkModule | null> {\n if (cached !== undefined) return cached;\n try {\n cached = await import(\"./render/ink.js\");\n } catch {\n cached = null;\n }\n return cached;\n}\n\n/** Paints an Ink element once and returns when the frame has been flushed. */\nexport async function paint(element: ReactElement): Promise<void> {\n const { render } = await import(\"ink\");\n const instance = render(element);\n instance.unmount();\n await instance.waitUntilExit();\n}\n\n/** A live Ink frame (spinner) that is cleared before the real output lands. */\nexport async function transient(element: ReactElement): Promise<() => void> {\n const { render } = await import(\"ink\");\n const instance = render(element);\n return () => {\n instance.clear();\n instance.unmount();\n };\n}\n"],"mappings":"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","names":[]}
|