configproof 0.3.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/LICENSE +21 -0
- package/README.md +217 -0
- package/dist/adapters/dotenv.d.ts +3 -0
- package/dist/adapters/dotenv.js +277 -0
- package/dist/adapters/dotenv.js.map +1 -0
- package/dist/adapters/native-env.d.ts +7 -0
- package/dist/adapters/native-env.js +196 -0
- package/dist/adapters/native-env.js.map +1 -0
- package/dist/adapters/registry.d.ts +7 -0
- package/dist/adapters/registry.js +30 -0
- package/dist/adapters/registry.js.map +1 -0
- package/dist/agent/server.d.ts +15 -0
- package/dist/agent/server.js +254 -0
- package/dist/agent/server.js.map +1 -0
- package/dist/analysis/diagnose.d.ts +64 -0
- package/dist/analysis/diagnose.js +142 -0
- package/dist/analysis/diagnose.js.map +1 -0
- package/dist/analysis/history.d.ts +52 -0
- package/dist/analysis/history.js +119 -0
- package/dist/analysis/history.js.map +1 -0
- package/dist/analysis/policy.d.ts +161 -0
- package/dist/analysis/policy.js +192 -0
- package/dist/analysis/policy.js.map +1 -0
- package/dist/analysis/provenance.d.ts +45 -0
- package/dist/analysis/provenance.js +144 -0
- package/dist/analysis/provenance.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +286 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/analyze.d.ts +46 -0
- package/dist/core/analyze.js +168 -0
- package/dist/core/analyze.js.map +1 -0
- package/dist/core/collect.d.ts +5 -0
- package/dist/core/collect.js +147 -0
- package/dist/core/collect.js.map +1 -0
- package/dist/core/export.d.ts +53 -0
- package/dist/core/export.js +155 -0
- package/dist/core/export.js.map +1 -0
- package/dist/core/io.d.ts +13 -0
- package/dist/core/io.js +100 -0
- package/dist/core/io.js.map +1 -0
- package/dist/core/privacy.d.ts +25 -0
- package/dist/core/privacy.js +113 -0
- package/dist/core/privacy.js.map +1 -0
- package/dist/core/schema.d.ts +2149 -0
- package/dist/core/schema.js +181 -0
- package/dist/core/schema.js.map +1 -0
- package/dist/demo.d.ts +1 -0
- package/dist/demo.js +45 -0
- package/dist/demo.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.js +63 -0
- package/dist/index.js.map +1 -0
- package/dist/launcher.d.ts +27 -0
- package/dist/launcher.js +122 -0
- package/dist/launcher.js.map +1 -0
- package/dist/report/html.d.ts +5 -0
- package/dist/report/html.js +109 -0
- package/dist/report/html.js.map +1 -0
- package/dist/runtime/api.d.ts +44 -0
- package/dist/runtime/api.js +29 -0
- package/dist/runtime/api.js.map +1 -0
- package/dist/runtime/callsite.d.ts +3 -0
- package/dist/runtime/callsite.js +61 -0
- package/dist/runtime/callsite.js.map +1 -0
- package/dist/runtime/children.d.ts +8 -0
- package/dist/runtime/children.js +69 -0
- package/dist/runtime/children.js.map +1 -0
- package/dist/runtime/environment.d.ts +3 -0
- package/dist/runtime/environment.js +53 -0
- package/dist/runtime/environment.js.map +1 -0
- package/dist/runtime/preload.d.ts +1 -0
- package/dist/runtime/preload.js +117 -0
- package/dist/runtime/preload.js.map +1 -0
- package/dist/runtime/recorder.d.ts +59 -0
- package/dist/runtime/recorder.js +254 -0
- package/dist/runtime/recorder.js.map +1 -0
- package/dist/runtime/workers.d.ts +12 -0
- package/dist/runtime/workers.js +127 -0
- package/dist/runtime/workers.js.map +1 -0
- package/docs/ARCHITECTURE.md +54 -0
- package/docs/COMPATIBILITY.md +24 -0
- package/docs/PRIVACY.md +17 -0
- package/docs/VALIDATION.md +42 -0
- package/fixtures/bypass/app.cjs +6 -0
- package/fixtures/bypass/early.cjs +2 -0
- package/fixtures/child-process/child.cjs +2 -0
- package/fixtures/child-process/parent.cjs +5 -0
- package/fixtures/custom-target/app.cjs +4 -0
- package/fixtures/custom-target/sample.env +1 -0
- package/fixtures/esm/app.mjs +5 -0
- package/fixtures/exit-code/app.cjs +4 -0
- package/fixtures/failure-boundary/app.cjs +7 -0
- package/fixtures/load-order/app.cjs +9 -0
- package/fixtures/load-order/first.env +1 -0
- package/fixtures/load-order/second.env +1 -0
- package/fixtures/manifest.json +16 -0
- package/fixtures/native-env/app.cjs +6 -0
- package/fixtures/native-env/failure.cjs +4 -0
- package/fixtures/native-env/sample.env +1 -0
- package/fixtures/native-env/startup.cjs +2 -0
- package/fixtures/runtime-mutation/app.cjs +12 -0
- package/fixtures/source-map/input.ts +5 -0
- package/fixtures/source-map/tsconfig.json +7 -0
- package/fixtures/stale-inheritance/app.cjs +4 -0
- package/fixtures/stale-inheritance/sample.env +1 -0
- package/fixtures/v03-manifest.json +32 -0
- package/fixtures/worker/parent.cjs +3 -0
- package/fixtures/worker/worker.cjs +2 -0
- package/fixtures/worker-modes/parent.cjs +17 -0
- package/fixtures/worker-modes/worker.cjs +4 -0
- package/package.json +64 -0
- package/policies/configtrace-policy.yaml +23 -0
- package/policies/issue-share.yaml +12 -0
- package/policies/minimal.yaml +8 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
8
|
+
const node_os_1 = __importDefault(require("node:os"));
|
|
9
|
+
const node_util_1 = require("node:util");
|
|
10
|
+
const launcher_1 = require("./launcher");
|
|
11
|
+
const io_1 = require("./core/io");
|
|
12
|
+
const schema_1 = require("./core/schema");
|
|
13
|
+
const privacy_1 = require("./core/privacy");
|
|
14
|
+
const analyze_1 = require("./core/analyze");
|
|
15
|
+
const html_1 = require("./report/html");
|
|
16
|
+
const export_1 = require("./core/export");
|
|
17
|
+
const provenance_1 = require("./analysis/provenance");
|
|
18
|
+
const diagnose_1 = require("./analysis/diagnose");
|
|
19
|
+
const policy_1 = require("./analysis/policy");
|
|
20
|
+
const history_1 = require("./analysis/history");
|
|
21
|
+
const server_1 = require("./agent/server");
|
|
22
|
+
const registry_1 = require("./adapters/registry");
|
|
23
|
+
const demo_1 = require("./demo");
|
|
24
|
+
const HELP = `ConfigTrace ${schema_1.TOOL_VERSION} — local configuration provenance and forensics
|
|
25
|
+
|
|
26
|
+
configtrace keygen --out .configtrace/pair.key.json
|
|
27
|
+
configtrace run --watch DATABASE_URL --key .configtrace/pair.key.json --out bad.ct.json -- node app.mjs
|
|
28
|
+
configtrace explain DATABASE_URL --from bad.ct.json [--process ID] [--format text|json]
|
|
29
|
+
configtrace graph bad.ct.json [--key DATABASE_URL] [--process ID] [--out graph.json]
|
|
30
|
+
configtrace diff bad.ct.json good.ct.json [--format text|json|html] [--out FILE]
|
|
31
|
+
configtrace diagnose bad.ct.json good.ct.json [--format text|json] [--before-seq N] [--limit N]
|
|
32
|
+
configtrace verify bad.ct.json --policy configtrace-policy.yaml [--reference good.ct.json]
|
|
33
|
+
configtrace report bad.ct.json [good.ct.json] --out report.html
|
|
34
|
+
configtrace export bad.ct.json [good.ct.json] --out issue.ct.json [--policy FILE]
|
|
35
|
+
configtrace history add run.ct.json --dir .configtrace/history
|
|
36
|
+
configtrace history analyze .configtrace/history [--order filename|started-at] [--max-runs N]
|
|
37
|
+
configtrace mcp --trace broken=bad.ct.json --trace working=good.ct.json
|
|
38
|
+
configtrace adapters [--format text|json]
|
|
39
|
+
configtrace doctor --from bad.ct.json [--format text|json]
|
|
40
|
+
configtrace demo stale-env [--out new-directory]
|
|
41
|
+
|
|
42
|
+
run options:
|
|
43
|
+
--watch KEY,OTHER_KEY Repeatable; * and ? patterns (quote patterns in your shell).
|
|
44
|
+
--key FILE Private comparison key. Omit for an unpaired ephemeral domain.
|
|
45
|
+
--compare-with FILE Check --key against an earlier raw trace, not recover its secret.
|
|
46
|
+
--out FILE Required. Outputs are exclusively created, never overwritten.
|
|
47
|
+
--cwd DIR Application working directory (default: current directory).
|
|
48
|
+
--children Bounded asynchronous direct Node child capture, opt-in.
|
|
49
|
+
--workers Bounded Worker capture, opt-in; copied, explicit, and SHARE_ENV.
|
|
50
|
+
--max-workers N Session-wide instrumented Worker creation cap, 1–32 (default 16).
|
|
51
|
+
--source-maps Enable source-map cache and original-source attribution.
|
|
52
|
+
--no-dotenv Disable the eager dotenv adapter.
|
|
53
|
+
--no-native-env Disable native Node env-file observations (enabled by default).
|
|
54
|
+
--max-events N Events per context, 10–100000 (default 5000).
|
|
55
|
+
--child-drain-ms N Bounded descendant drain, 0–5000 (default 500).
|
|
56
|
+
--adapter FILE Repeatable trusted local CommonJS adapter; never from artifacts.
|
|
57
|
+
|
|
58
|
+
diff/diagnose: --left-process ID and --right-process ID select contexts explicitly.
|
|
59
|
+
diff --fail-on-diff returns 2 for differences, 3 for incomparable/incomplete evidence.
|
|
60
|
+
verify: --process ID, --reference-process ID, --format text|json, --out FILE.
|
|
61
|
+
Always returns 0 pass, 2 violation, 3 inconclusive. Invalid input is a separate error.
|
|
62
|
+
diagnose: Ranking is not proof of causality. Without a marker, failure timing is unknown.
|
|
63
|
+
history: Filename order by default, not inferred execution chronology. No automatic deletion.
|
|
64
|
+
mcp: Stdio, read-only, explicit artifact aliases. No arbitrary paths, raw values, or shell tool.
|
|
65
|
+
|
|
66
|
+
Source-only release: builds, type checks, tests, demos, and client interoperability are unverified.
|
|
67
|
+
No telemetry, hosted service, automatic fixes, raw-value output, or build-time tracing.
|
|
68
|
+
`;
|
|
69
|
+
const definitions = {
|
|
70
|
+
watch: { type: 'string', multiple: true }, key: { type: 'string' },
|
|
71
|
+
'compare-with': { type: 'string' }, out: { type: 'string' }, cwd: { type: 'string' },
|
|
72
|
+
children: { type: 'boolean' }, workers: { type: 'boolean' }, 'max-workers': { type: 'string' },
|
|
73
|
+
'source-maps': { type: 'boolean' }, 'no-dotenv': { type: 'boolean' }, 'no-native-env': { type: 'boolean' },
|
|
74
|
+
'max-events': { type: 'string' }, 'child-drain-ms': { type: 'string' }, adapter: { type: 'string', multiple: true },
|
|
75
|
+
from: { type: 'string' }, format: { type: 'string' }, policy: { type: 'string' },
|
|
76
|
+
process: { type: 'string' }, 'left-process': { type: 'string' }, 'right-process': { type: 'string' },
|
|
77
|
+
reference: { type: 'string' }, 'reference-process': { type: 'string' },
|
|
78
|
+
'before-seq': { type: 'string' }, limit: { type: 'string' },
|
|
79
|
+
dir: { type: 'string' }, order: { type: 'string' }, 'max-runs': { type: 'string' },
|
|
80
|
+
trace: { type: 'string', multiple: true }, 'fail-on-diff': { type: 'boolean' }, help: { type: 'boolean', short: 'h' },
|
|
81
|
+
};
|
|
82
|
+
const allowed = {
|
|
83
|
+
keygen: ['out'], run: ['watch', 'key', 'compare-with', 'out', 'cwd', 'children', 'workers', 'max-workers', 'source-maps', 'no-dotenv', 'no-native-env', 'max-events', 'child-drain-ms', 'adapter'],
|
|
84
|
+
explain: ['from', 'process', 'format', 'out'], graph: ['key', 'process', 'out'],
|
|
85
|
+
diff: ['format', 'out', 'left-process', 'right-process', 'fail-on-diff'],
|
|
86
|
+
diagnose: ['format', 'out', 'left-process', 'right-process', 'before-seq', 'limit'],
|
|
87
|
+
verify: ['policy', 'process', 'reference', 'reference-process', 'format', 'out'],
|
|
88
|
+
report: ['out', 'left-process', 'right-process'], export: ['out', 'policy'],
|
|
89
|
+
history: ['dir', 'order', 'max-runs', 'format', 'out'], mcp: ['trace'], adapters: ['format', 'out'],
|
|
90
|
+
doctor: ['from', 'format', 'out'], demo: ['out'],
|
|
91
|
+
};
|
|
92
|
+
async function main() {
|
|
93
|
+
const args = process.argv.slice(2), command = args.shift();
|
|
94
|
+
if (!command || command === '--help' || command === '-h') {
|
|
95
|
+
process.stdout.write(HELP);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
if (command === '--version') {
|
|
99
|
+
process.stdout.write(schema_1.TOOL_VERSION + '\n');
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
if (!Object.prototype.hasOwnProperty.call(allowed, command))
|
|
103
|
+
throw new io_1.UserError('Unknown command. Run configtrace --help.');
|
|
104
|
+
const boundary = args.indexOf('--');
|
|
105
|
+
const ownArgs = boundary < 0 ? args : args.slice(0, boundary);
|
|
106
|
+
if (ownArgs.includes('--help') || ownArgs.includes('-h')) {
|
|
107
|
+
process.stdout.write(HELP);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
let program = [];
|
|
111
|
+
if (command === 'run') {
|
|
112
|
+
if (boundary < 0)
|
|
113
|
+
throw new io_1.UserError('Separate the Node command with --.');
|
|
114
|
+
program = args.splice(boundary + 1);
|
|
115
|
+
args.splice(boundary);
|
|
116
|
+
}
|
|
117
|
+
const parsed = (() => {
|
|
118
|
+
try {
|
|
119
|
+
return (0, node_util_1.parseArgs)({ args, options: definitions, allowPositionals: true, strict: true });
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
throw new io_1.UserError('Invalid command options. Run configtrace --help.');
|
|
123
|
+
}
|
|
124
|
+
})();
|
|
125
|
+
const { values: v, positionals: p } = parsed;
|
|
126
|
+
if (v.help) {
|
|
127
|
+
process.stdout.write(HELP);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
for (const option of Object.keys(v))
|
|
131
|
+
if (!allowed[command].includes(option))
|
|
132
|
+
throw new io_1.UserError('An option is not supported by this command. Run configtrace --help.');
|
|
133
|
+
const requireOut = () => { if (!v.out)
|
|
134
|
+
throw new io_1.UserError('--out is required.'); return node_path_1.default.resolve(v.out); };
|
|
135
|
+
const count = (min, max = min) => { if (p.length < min || p.length > max)
|
|
136
|
+
throw new io_1.UserError('Wrong number of arguments. Run configtrace --help.'); };
|
|
137
|
+
const output = (text) => { if (v.out)
|
|
138
|
+
(0, io_1.writeNew)(v.out, text);
|
|
139
|
+
else
|
|
140
|
+
process.stdout.write(text); };
|
|
141
|
+
const format = (choices) => { const kind = v.format || 'text'; if (!choices.includes(kind))
|
|
142
|
+
throw new io_1.UserError('Unsupported output format.'); return kind; };
|
|
143
|
+
const json = (value) => JSON.stringify(value, null, 2) + '\n';
|
|
144
|
+
const pairOptions = { leftProcess: v['left-process'], rightProcess: v['right-process'] };
|
|
145
|
+
switch (command) {
|
|
146
|
+
case 'keygen':
|
|
147
|
+
count(0);
|
|
148
|
+
(0, privacy_1.writeComparisonKey)(requireOut());
|
|
149
|
+
process.stdout.write('Private pair key created. Do not commit or share it.\n');
|
|
150
|
+
break;
|
|
151
|
+
case 'run': {
|
|
152
|
+
count(0);
|
|
153
|
+
const result = await (0, launcher_1.run)({ command: program, watch: v.watch || [], out: requireOut(), cwd: v.cwd,
|
|
154
|
+
keyFile: v.key, compareWith: v['compare-with'], children: v.children, workers: v.workers,
|
|
155
|
+
maxWorkers: v['max-workers'] === undefined ? undefined : Number(v['max-workers']),
|
|
156
|
+
sourceMaps: v['source-maps'], dotenv: !v['no-dotenv'], nativeEnv: !v['no-native-env'],
|
|
157
|
+
maxEvents: v['max-events'] === undefined ? undefined : Number(v['max-events']),
|
|
158
|
+
childDrainMs: v['child-drain-ms'] === undefined ? undefined : Number(v['child-drain-ms']), adapters: v.adapter });
|
|
159
|
+
process.stderr.write(result.artifactWritten ? `[configtrace] ${result.trace.capture.status} artifact written. Application output was not captured or sanitized.\n` : '[configtrace] Artifact write failed. Application outcome is preserved.\n');
|
|
160
|
+
if (result.signal) {
|
|
161
|
+
if (process.platform !== 'win32') {
|
|
162
|
+
try {
|
|
163
|
+
process.kill(process.pid, result.signal);
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
catch { /* numeric fallback */ }
|
|
167
|
+
}
|
|
168
|
+
process.exitCode = 128 + (node_os_1.default.constants.signals[result.signal] || 1);
|
|
169
|
+
}
|
|
170
|
+
else
|
|
171
|
+
process.exitCode = result.exitCode ?? 1;
|
|
172
|
+
break;
|
|
173
|
+
}
|
|
174
|
+
case 'explain': {
|
|
175
|
+
count(1);
|
|
176
|
+
if (!v.from)
|
|
177
|
+
throw new io_1.UserError('--from is required.');
|
|
178
|
+
const trace = (0, io_1.readTrace)(v.from), graph = (0, provenance_1.buildProvenance)(trace, { key: p[0], processId: v.process });
|
|
179
|
+
output(format(['text', 'json']) === 'json' ? json({ ...(0, analyze_1.evidenceFor)(trace, p[0], v.process), provenance: graph })
|
|
180
|
+
: (0, analyze_1.explainText)(trace, p[0], v.process) + `\nProvenance: ${graph.nodes.length} nodes, ${graph.edges.length} links${graph.truncated ? ' (limited)' : ''}. Use --format json for the DAG.\n`);
|
|
181
|
+
break;
|
|
182
|
+
}
|
|
183
|
+
case 'graph':
|
|
184
|
+
count(1);
|
|
185
|
+
output(json((0, provenance_1.buildProvenance)((0, io_1.readTrace)(p[0]), { key: v.key, processId: v.process })));
|
|
186
|
+
break;
|
|
187
|
+
case 'diff': {
|
|
188
|
+
count(2);
|
|
189
|
+
const left = (0, io_1.readTrace)(p[0]), right = (0, io_1.readTrace)(p[1]), result = (0, analyze_1.diffTraces)(left, right, pairOptions);
|
|
190
|
+
const kind = format(['text', 'json', 'html']);
|
|
191
|
+
if (kind === 'html')
|
|
192
|
+
(0, io_1.writeNew)(requireOut(), (0, html_1.renderDiffHtml)(left, right, result));
|
|
193
|
+
else
|
|
194
|
+
output(kind === 'json' ? json(result) : (0, analyze_1.diffText)(result));
|
|
195
|
+
if (v['fail-on-diff'])
|
|
196
|
+
process.exitCode = !result.sameDomain || !result.completeStreams || !result.leftProcess || !result.rightProcess || result.coverageChanged ? 3 : result.changed ? 2 : 0;
|
|
197
|
+
break;
|
|
198
|
+
}
|
|
199
|
+
case 'diagnose': {
|
|
200
|
+
count(2);
|
|
201
|
+
const result = (0, diagnose_1.diagnoseTraces)((0, io_1.readTrace)(p[0]), (0, io_1.readTrace)(p[1]), { ...pairOptions,
|
|
202
|
+
beforeSeq: v['before-seq'] === undefined ? undefined : Number(v['before-seq']), limit: v.limit === undefined ? undefined : Number(v.limit) });
|
|
203
|
+
output(format(['text', 'json']) === 'json' ? json(result) : (0, diagnose_1.diagnosisText)(result));
|
|
204
|
+
break;
|
|
205
|
+
}
|
|
206
|
+
case 'verify': {
|
|
207
|
+
count(1);
|
|
208
|
+
if (!v.policy)
|
|
209
|
+
throw new io_1.UserError('--policy is required.');
|
|
210
|
+
const result = (0, policy_1.verifyTrace)((0, io_1.readTrace)(p[0]), (0, policy_1.readVerificationPolicy)(v.policy), { processId: v.process,
|
|
211
|
+
reference: v.reference ? (0, io_1.readTrace)(v.reference) : undefined, referenceProcess: v['reference-process'] });
|
|
212
|
+
output(format(['text', 'json']) === 'json' ? json(result) : (0, policy_1.verificationText)(result));
|
|
213
|
+
process.exitCode = result.exitCode;
|
|
214
|
+
break;
|
|
215
|
+
}
|
|
216
|
+
case 'report': {
|
|
217
|
+
count(1, 2);
|
|
218
|
+
const a = (0, io_1.readTrace)(p[0]), b = p[1] ? (0, io_1.readTrace)(p[1]) : undefined;
|
|
219
|
+
(0, io_1.writeNew)(requireOut(), b ? (0, html_1.renderDiffHtml)(a, b, (0, analyze_1.diffTraces)(a, b, pairOptions)) : (0, html_1.renderTraceHtml)(a));
|
|
220
|
+
break;
|
|
221
|
+
}
|
|
222
|
+
case 'export': {
|
|
223
|
+
count(1, 2);
|
|
224
|
+
const files = (0, export_1.exportArtifacts)(p.map(io_1.readTrace), requireOut(), (0, export_1.readExportPolicy)(v.policy));
|
|
225
|
+
process.stdout.write(`Created ${files.length} export file(s). Review metadata before sharing.\n`);
|
|
226
|
+
break;
|
|
227
|
+
}
|
|
228
|
+
case 'history': {
|
|
229
|
+
count(2);
|
|
230
|
+
if (p[0] === 'add') {
|
|
231
|
+
if (!v.dir)
|
|
232
|
+
throw new io_1.UserError('history add needs --dir.');
|
|
233
|
+
if (v.order || v['max-runs'])
|
|
234
|
+
throw new io_1.UserError('Ordering options apply to history analyze, not add.');
|
|
235
|
+
const file = (0, history_1.addHistory)(p[1], v.dir);
|
|
236
|
+
output(format(['text', 'json']) === 'json' ? json({ created: file }) : (0, io_1.terminalSafe)(`Saved history snapshot: ${file}`) + '\n');
|
|
237
|
+
}
|
|
238
|
+
else if (p[0] === 'analyze') {
|
|
239
|
+
if (v.dir)
|
|
240
|
+
throw new io_1.UserError('Pass the history directory as the analyze argument, not --dir.');
|
|
241
|
+
const order = v.order || 'filename';
|
|
242
|
+
if (order !== 'filename' && order !== 'started-at')
|
|
243
|
+
throw new io_1.UserError('--order must be filename or started-at.');
|
|
244
|
+
const entries = (0, history_1.readHistory)(p[1], { order, maxRuns: v['max-runs'] === undefined ? undefined : Number(v['max-runs']) });
|
|
245
|
+
const result = (0, history_1.analyzeHistory)(entries, order);
|
|
246
|
+
output(format(['text', 'json']) === 'json' ? json(result) : (0, history_1.historyText)(result));
|
|
247
|
+
}
|
|
248
|
+
else
|
|
249
|
+
throw new io_1.UserError('History actions: add or analyze.');
|
|
250
|
+
break;
|
|
251
|
+
}
|
|
252
|
+
case 'mcp':
|
|
253
|
+
count(0);
|
|
254
|
+
await (0, server_1.serveMcp)((0, server_1.loadAuthorizedTraces)(v.trace || []));
|
|
255
|
+
break;
|
|
256
|
+
case 'adapters': {
|
|
257
|
+
count(0);
|
|
258
|
+
const catalog = (0, registry_1.adapterCatalog)();
|
|
259
|
+
output(format(['text', 'json']) === 'json' ? json(catalog)
|
|
260
|
+
: (0, io_1.terminalSafe)(catalog.map(a => `${a.manifest.id}: ${a.state}\n ${a.manifest.supportedVersions}\n ${a.manifest.knownBypasses.join('; ')}`).join('\n'), true) + '\n');
|
|
261
|
+
break;
|
|
262
|
+
}
|
|
263
|
+
case 'doctor': {
|
|
264
|
+
count(0);
|
|
265
|
+
if (!v.from)
|
|
266
|
+
throw new io_1.UserError('--from is required.');
|
|
267
|
+
const trace = (0, io_1.readTrace)(v.from);
|
|
268
|
+
output(format(['text', 'json']) === 'json' ? json({ capture: trace.capture, coverage: trace.coverage, adapters: trace.adapters || [], processes: trace.processes })
|
|
269
|
+
: (0, io_1.terminalSafe)(`Capture: ${trace.capture.status}\n${trace.coverage.map(c => `${c.feature}: ${c.status} — ${c.reasons.join(', ')}`).join('\n')}\nNotices: ${trace.capture.notices.join(', ')}\n`, true));
|
|
270
|
+
process.exitCode = trace.capture.status === 'complete' ? 0 : 3;
|
|
271
|
+
break;
|
|
272
|
+
}
|
|
273
|
+
case 'demo':
|
|
274
|
+
count(1);
|
|
275
|
+
if (p[0] !== 'stale-env')
|
|
276
|
+
throw new io_1.UserError('Available demo: stale-env.');
|
|
277
|
+
process.stdout.write(`Synthetic demo written to ${(0, io_1.terminalSafe)(await (0, demo_1.createDemo)(v.out))}\n`);
|
|
278
|
+
break;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
main().catch(error => {
|
|
282
|
+
const safe = error instanceof io_1.UserError ? error : new io_1.UserError('ConfigTrace could not complete the operation. No raw exception details were printed.', 74);
|
|
283
|
+
process.stderr.write(`[configtrace] ${safe.message}\n`);
|
|
284
|
+
process.exitCode = safe.exitCode;
|
|
285
|
+
});
|
|
286
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { Trace, Observation, SafeValue } from './schema';
|
|
2
|
+
export type Equality = 'same' | 'different' | 'incomparable' | 'not-observed';
|
|
3
|
+
export interface KeyEvidence {
|
|
4
|
+
key: string;
|
|
5
|
+
processId?: string;
|
|
6
|
+
baseline?: Observation;
|
|
7
|
+
reads: Observation[];
|
|
8
|
+
loaderReads: number;
|
|
9
|
+
writes: Observation[];
|
|
10
|
+
candidates: Observation[];
|
|
11
|
+
skips: Observation[];
|
|
12
|
+
events: Observation[];
|
|
13
|
+
lastRead?: Observation;
|
|
14
|
+
}
|
|
15
|
+
export interface DiffRow {
|
|
16
|
+
key: string;
|
|
17
|
+
left: KeyEvidence;
|
|
18
|
+
right: KeyEvidence;
|
|
19
|
+
startup: Equality;
|
|
20
|
+
lastRead: Equality;
|
|
21
|
+
readSequence: Equality;
|
|
22
|
+
changes: string[];
|
|
23
|
+
}
|
|
24
|
+
export interface TraceDiff {
|
|
25
|
+
schemaVersion: 'configtrace-diff/1';
|
|
26
|
+
sameDomain: boolean;
|
|
27
|
+
coverageChanged: boolean;
|
|
28
|
+
leftProcess?: string;
|
|
29
|
+
rightProcess?: string;
|
|
30
|
+
completeStreams: boolean;
|
|
31
|
+
rows: DiffRow[];
|
|
32
|
+
changed: boolean;
|
|
33
|
+
caveats: string[];
|
|
34
|
+
}
|
|
35
|
+
export declare function processFor(trace: Trace, requested?: string): string | undefined;
|
|
36
|
+
export declare function evidenceFor(trace: Trace, key: string, requested?: string): KeyEvidence;
|
|
37
|
+
export declare function compareValue(a: SafeValue | undefined, b: SafeValue | undefined, sharedDomain: boolean): Equality;
|
|
38
|
+
export declare function siteLabel(e?: Observation): string;
|
|
39
|
+
export declare function originLabel(e?: Observation): string;
|
|
40
|
+
export declare function valueLabel(v?: SafeValue): string;
|
|
41
|
+
export declare function diffTraces(left: Trace, right: Trace, options?: {
|
|
42
|
+
leftProcess?: string;
|
|
43
|
+
rightProcess?: string;
|
|
44
|
+
}): TraceDiff;
|
|
45
|
+
export declare function explainText(trace: Trace, key: string, processId?: string): string;
|
|
46
|
+
export declare function diffText(diff: TraceDiff): string;
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.processFor = processFor;
|
|
4
|
+
exports.evidenceFor = evidenceFor;
|
|
5
|
+
exports.compareValue = compareValue;
|
|
6
|
+
exports.siteLabel = siteLabel;
|
|
7
|
+
exports.originLabel = originLabel;
|
|
8
|
+
exports.valueLabel = valueLabel;
|
|
9
|
+
exports.diffTraces = diffTraces;
|
|
10
|
+
exports.explainText = explainText;
|
|
11
|
+
exports.diffText = diffText;
|
|
12
|
+
const privacy_1 = require("./privacy");
|
|
13
|
+
const io_1 = require("./io");
|
|
14
|
+
function processFor(trace, requested) {
|
|
15
|
+
if (requested) {
|
|
16
|
+
if (!trace.processes.some(p => p.id === requested))
|
|
17
|
+
throw new io_1.UserError('Selected process does not exist in this artifact.', 65);
|
|
18
|
+
return requested;
|
|
19
|
+
}
|
|
20
|
+
return trace.processes.find(p => p.role === 'root')?.id;
|
|
21
|
+
}
|
|
22
|
+
function evidenceFor(trace, key, requested) {
|
|
23
|
+
const processId = processFor(trace, requested);
|
|
24
|
+
const caseMode = trace.processes.find(p => p.id === processId)?.caseMode || trace.capture.caseMode;
|
|
25
|
+
key = caseMode === 'insensitive' ? key.toUpperCase() : key;
|
|
26
|
+
const events = trace.events.filter(e => e.processId === processId && e.key === key);
|
|
27
|
+
const reads = events.filter(e => e.operation === 'read' && e.purpose !== 'loader');
|
|
28
|
+
return { key, processId, events, baseline: events.find(e => e.operation === 'baseline'), reads,
|
|
29
|
+
loaderReads: events.filter(e => e.operation === 'read' && e.purpose === 'loader').length,
|
|
30
|
+
writes: events.filter(e => e.operation === 'write' || e.operation === 'delete'),
|
|
31
|
+
candidates: events.filter(e => e.operation === 'candidate'), skips: events.filter(e => e.operation === 'skip'), lastRead: reads.at(-1) };
|
|
32
|
+
}
|
|
33
|
+
function compareValue(a, b, sharedDomain) {
|
|
34
|
+
if (!a || !b)
|
|
35
|
+
return 'not-observed';
|
|
36
|
+
if (a.state === 'omitted' || b.state === 'omitted')
|
|
37
|
+
return 'incomparable';
|
|
38
|
+
if (a.state !== b.state)
|
|
39
|
+
return 'different';
|
|
40
|
+
if (a.state === 'missing' && b.state === 'missing')
|
|
41
|
+
return 'same';
|
|
42
|
+
if (a.state === 'present' && b.state === 'present' && a.empty !== undefined && b.empty !== undefined && a.empty !== b.empty)
|
|
43
|
+
return 'different';
|
|
44
|
+
if (!sharedDomain)
|
|
45
|
+
return 'incomparable';
|
|
46
|
+
return (0, privacy_1.sameValue)(a, b) ? 'same' : 'different';
|
|
47
|
+
}
|
|
48
|
+
function siteLabel(e) {
|
|
49
|
+
return e?.site ? `${e.site.file}${e.site.line ? ':' + e.site.line : ''}${e.site.column ? ':' + e.site.column : ''}` : '<call site unavailable>';
|
|
50
|
+
}
|
|
51
|
+
function originLabel(e) {
|
|
52
|
+
return e?.origin ? `${e.origin.kind}${e.origin.file ? ' (' + e.origin.file + ')' : ''} / ${e.origin.confidence}` : 'unknown';
|
|
53
|
+
}
|
|
54
|
+
function valueLabel(v) {
|
|
55
|
+
return !v ? 'not observed' : v.state === 'missing' ? 'missing' : v.state === 'omitted' ? 'withheld' : v.state === 'present' && v.empty === true ? 'empty · masked' : 'present · masked';
|
|
56
|
+
}
|
|
57
|
+
function keysFor(trace, processId) {
|
|
58
|
+
const literalWatch = trace.capture.watch.filter(k => !/[*?]/.test(k))
|
|
59
|
+
.map(k => (trace.processes.find(p => p.id === processId)?.caseMode || trace.capture.caseMode) === 'insensitive' ? k.toUpperCase() : k);
|
|
60
|
+
return [...new Set([...literalWatch, ...trace.events.filter(e => e.processId === processId && e.key).map(e => e.key)])];
|
|
61
|
+
}
|
|
62
|
+
function equalLists(a, b) { return JSON.stringify(a) === JSON.stringify(b); }
|
|
63
|
+
function diffTraces(left, right, options = {}) {
|
|
64
|
+
const leftProcess = processFor(left, options.leftProcess);
|
|
65
|
+
const rightProcess = processFor(right, options.rightProcess);
|
|
66
|
+
const sameDomain = left.comparison.mode !== 'none' && left.comparison.mode === right.comparison.mode && left.comparison.domainId === right.comparison.domainId;
|
|
67
|
+
const coverageChanged = JSON.stringify(left.coverage) !== JSON.stringify(right.coverage)
|
|
68
|
+
|| left.capture.status !== right.capture.status || left.capture.caseMode !== right.capture.caseMode
|
|
69
|
+
|| (left.processes.find(p => p.id === leftProcess)?.caseMode || left.capture.caseMode) !== (right.processes.find(p => p.id === rightProcess)?.caseMode || right.capture.caseMode)
|
|
70
|
+
|| !equalLists([...left.capture.watch].sort(), [...right.capture.watch].sort());
|
|
71
|
+
const keys = [...new Set([...keysFor(left, leftProcess), ...keysFor(right, rightProcess)])].sort();
|
|
72
|
+
const rows = keys.map(key => {
|
|
73
|
+
const a = evidenceFor(left, key, leftProcess), b = evidenceFor(right, key, rightProcess);
|
|
74
|
+
const startup = compareValue(a.baseline?.value, b.baseline?.value, sameDomain);
|
|
75
|
+
const lastRead = compareValue(a.lastRead?.value, b.lastRead?.value, sameDomain);
|
|
76
|
+
let readSequence = !a.reads.length && !b.reads.length ? 'not-observed' : 'same';
|
|
77
|
+
if (a.reads.length !== b.reads.length)
|
|
78
|
+
readSequence = 'different';
|
|
79
|
+
else
|
|
80
|
+
for (let i = 0; i < a.reads.length; i++) {
|
|
81
|
+
const equality = compareValue(a.reads[i].value, b.reads[i].value, sameDomain);
|
|
82
|
+
if (equality === 'different' || siteLabel(a.reads[i]) !== siteLabel(b.reads[i])) {
|
|
83
|
+
readSequence = 'different';
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
if (equality !== 'same')
|
|
87
|
+
readSequence = equality;
|
|
88
|
+
}
|
|
89
|
+
const changes = [];
|
|
90
|
+
if (startup === 'different')
|
|
91
|
+
changes.push('startup state/value');
|
|
92
|
+
if (lastRead === 'different')
|
|
93
|
+
changes.push('last observed read');
|
|
94
|
+
if (readSequence === 'different')
|
|
95
|
+
changes.push('read sequence');
|
|
96
|
+
if (a.reads.length !== b.reads.length)
|
|
97
|
+
changes.push('read count');
|
|
98
|
+
if (!equalLists(a.reads.map(siteLabel), b.reads.map(siteLabel)))
|
|
99
|
+
changes.push('read sites');
|
|
100
|
+
if (!equalLists(a.reads.map(originLabel), b.reads.map(originLabel)))
|
|
101
|
+
changes.push('read origins');
|
|
102
|
+
const loaderSignature = (e) => e.events.filter(x => x.operation === 'skip' || x.operation === 'write' && ['dotenv', 'native-env'].includes(x.origin?.kind || ''))
|
|
103
|
+
.map(x => `${x.operation}:${x.outcome ?? ''}:${originLabel(x)}`);
|
|
104
|
+
if (!equalLists(loaderSignature(a), loaderSignature(b)))
|
|
105
|
+
changes.push('loader outcomes');
|
|
106
|
+
if (!equalLists(a.writes.map(x => `${x.operation}:${siteLabel(x)}:${originLabel(x)}`), b.writes.map(x => `${x.operation}:${siteLabel(x)}:${originLabel(x)}`)))
|
|
107
|
+
changes.push('mutation history');
|
|
108
|
+
else if (a.writes.some((x, i) => compareValue(x.value, b.writes[i]?.value, sameDomain) === 'different'))
|
|
109
|
+
changes.push('mutation values');
|
|
110
|
+
return { key, left: a, right: b, startup, lastRead, readSequence, changes };
|
|
111
|
+
});
|
|
112
|
+
const caveats = [
|
|
113
|
+
'Comparison covers the selected processes and captured operations only. Missing reads do not prove a key was unused.',
|
|
114
|
+
'Read sequences are compared by order and call site; they are not a causal alignment of concurrent activity.',
|
|
115
|
+
];
|
|
116
|
+
if (!sameDomain)
|
|
117
|
+
caveats.push('The runs do not share a comparison domain. Equality of present masked values is unknown; presence/absence remains observable.');
|
|
118
|
+
if (coverageChanged)
|
|
119
|
+
caveats.push('Coverage, watch selection, case handling, or capture status differs. An absent event may be a coverage difference.');
|
|
120
|
+
if (left.capture.status !== 'complete' || right.capture.status !== 'complete')
|
|
121
|
+
caveats.push('At least one capture is incomplete. Do not interpret a missing change as proof of equivalence.');
|
|
122
|
+
if (left.processes.length > 1 || right.processes.length > 1)
|
|
123
|
+
caveats.push('Child processes and Workers are not automatically matched. Select each context explicitly to compare it.');
|
|
124
|
+
return { schemaVersion: 'configtrace-diff/1', sameDomain, coverageChanged, leftProcess, rightProcess,
|
|
125
|
+
completeStreams: left.capture.status === 'complete' && right.capture.status === 'complete'
|
|
126
|
+
&& !!left.processes.find(p => p.id === leftProcess)?.ended && !!right.processes.find(p => p.id === rightProcess)?.ended, rows, changed: rows.some(r => r.changes.length > 0), caveats };
|
|
127
|
+
}
|
|
128
|
+
function explainText(trace, key, processId) {
|
|
129
|
+
const e = evidenceFor(trace, key, processId);
|
|
130
|
+
const lines = [key, '='.repeat(Math.min(key.length, 80)),
|
|
131
|
+
`Process: ${e.processId || 'not captured'}`, `Capture: ${trace.capture.status} (stream completeness, not universal coverage)`,
|
|
132
|
+
`At preload: ${valueLabel(e.baseline?.value)}`, `Captured application reads: ${e.reads.length}; loader reads: ${e.loaderReads}`];
|
|
133
|
+
if (!e.reads.length)
|
|
134
|
+
lines.push('No application read was observed in this selected process. The key may have been used outside coverage.');
|
|
135
|
+
else {
|
|
136
|
+
const last = e.lastRead;
|
|
137
|
+
lines.push(`Last read: ${siteLabel(last)}`, `Read value: ${valueLabel(last.value)}`, `Evidence-linked source: ${originLabel(last)}`);
|
|
138
|
+
if (last.causedBy)
|
|
139
|
+
lines.push(`Matching prior observation: ${last.causedBy} (inferred link; bypasses remain possible)`);
|
|
140
|
+
if (last.origin?.kind === 'startup')
|
|
141
|
+
lines.push(last.value?.state === 'missing'
|
|
142
|
+
? 'The key was missing at preload and this read matches that observation; unobserved history remains unknown.'
|
|
143
|
+
: 'The value was present at preload. A shell, earlier preload, Node startup option, or native operation may have supplied it; earlier history is unknown.');
|
|
144
|
+
if (last.origin?.kind === 'unknown')
|
|
145
|
+
lines.push('No matching captured write/baseline establishes this value. Do not guess its origin.');
|
|
146
|
+
}
|
|
147
|
+
if (trace.capture.notices.includes('worker_shared_env'))
|
|
148
|
+
lines.push('Shared environment: another thread may write without this context observing it; matching fingerprints do not establish the writer.');
|
|
149
|
+
if (e.skips.length)
|
|
150
|
+
lines.push(`Loaders: ${e.skips.length} candidate(s) were not applied to the watched environment in a supported loader observation.`);
|
|
151
|
+
lines.push('', 'Evidence (process-local order):');
|
|
152
|
+
for (const event of e.events.slice(0, 120))
|
|
153
|
+
lines.push(` #${event.seq} +${event.at.toFixed(3)}ms ${event.operation.padEnd(9)} ${valueLabel(event.value)} | ${originLabel(event)} | ${siteLabel(event)}`);
|
|
154
|
+
if (e.events.length > 120)
|
|
155
|
+
lines.push(` … ${e.events.length - 120} more event(s) retained in the JSON artifact.`);
|
|
156
|
+
lines.push('', 'Limits: native reads, original-object references, unconfirmed Workers, earlier startup history, and late exit-handler reads are not fully observed.');
|
|
157
|
+
return (0, io_1.terminalSafe)(lines.join('\n'), true) + '\n';
|
|
158
|
+
}
|
|
159
|
+
function diffText(diff) {
|
|
160
|
+
const lines = [`CONFIGTRACE / RUN COMPARISON`, `Value domain: ${diff.sameDomain ? 'shared' : 'unrelated — present values incomparable'}`,
|
|
161
|
+
`Processes: ${diff.leftProcess || 'missing'} → ${diff.rightProcess || 'missing'}`, ''];
|
|
162
|
+
for (const row of diff.rows) {
|
|
163
|
+
lines.push(row.key, ` startup: ${row.startup}; last read: ${row.lastRead}; read sequence: ${row.readSequence}`, ` reads: ${row.left.reads.length} → ${row.right.reads.length}; loader candidates not applied: ${row.left.skips.length} → ${row.right.skips.length}`, ` origins: ${originLabel(row.left.lastRead)} → ${originLabel(row.right.lastRead)}`, ` differences: ${row.changes.length ? row.changes.join(', ') : 'none established within the observations'}`, '');
|
|
164
|
+
}
|
|
165
|
+
lines.push('Caveats:', ...diff.caveats.map(x => ` ${x}`));
|
|
166
|
+
return (0, io_1.terminalSafe)(lines.join('\n'), true) + '\n';
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=analyze.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/core/analyze.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type Trace, type Notice, type Coverage } from './schema';
|
|
2
|
+
import type { RuntimeConfig } from '../runtime/api';
|
|
3
|
+
export declare function coverageFor(notices: Notice[]): Coverage[];
|
|
4
|
+
/** Recover complete records without pretending that interrupted/malformed tails are complete. */
|
|
5
|
+
export declare function collectTrace(config: RuntimeConfig, result: Trace['result']): Trace;
|