@vibecheckai/cli 3.2.2 → 3.2.4
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/bin/.generated +25 -25
- package/bin/dev/run-v2-torture.js +30 -30
- package/bin/runners/ENHANCEMENT_GUIDE.md +121 -121
- package/bin/runners/lib/__tests__/entitlements-v2.test.js +295 -295
- package/bin/runners/lib/agent-firewall/ai/false-positive-analyzer.js +474 -0
- package/bin/runners/lib/agent-firewall/claims/extractor.js +117 -28
- package/bin/runners/lib/agent-firewall/evidence/env-evidence.js +23 -14
- package/bin/runners/lib/agent-firewall/evidence/route-evidence.js +72 -1
- package/bin/runners/lib/agent-firewall/interceptor/base.js +2 -2
- package/bin/runners/lib/agent-firewall/policy/default-policy.json +6 -0
- package/bin/runners/lib/agent-firewall/policy/engine.js +34 -3
- package/bin/runners/lib/agent-firewall/policy/rules/fake-success.js +29 -4
- package/bin/runners/lib/agent-firewall/policy/rules/ghost-route.js +12 -0
- package/bin/runners/lib/agent-firewall/truthpack/loader.js +21 -0
- package/bin/runners/lib/agent-firewall/utils/ignore-checker.js +118 -0
- package/bin/runners/lib/analyzers.js +606 -325
- package/bin/runners/lib/auth-truth.js +193 -193
- package/bin/runners/lib/backup.js +62 -62
- package/bin/runners/lib/billing.js +107 -107
- package/bin/runners/lib/claims.js +118 -118
- package/bin/runners/lib/cli-ui.js +540 -540
- package/bin/runners/lib/contracts/auth-contract.js +202 -202
- package/bin/runners/lib/contracts/env-contract.js +181 -181
- package/bin/runners/lib/contracts/external-contract.js +206 -206
- package/bin/runners/lib/contracts/guard.js +168 -168
- package/bin/runners/lib/contracts/index.js +89 -89
- package/bin/runners/lib/contracts/plan-validator.js +311 -311
- package/bin/runners/lib/contracts/route-contract.js +199 -199
- package/bin/runners/lib/contracts.js +804 -804
- package/bin/runners/lib/detect.js +89 -89
- package/bin/runners/lib/doctor/autofix.js +254 -254
- package/bin/runners/lib/doctor/index.js +37 -37
- package/bin/runners/lib/doctor/modules/dependencies.js +325 -325
- package/bin/runners/lib/doctor/modules/index.js +46 -46
- package/bin/runners/lib/doctor/modules/network.js +250 -250
- package/bin/runners/lib/doctor/modules/project.js +312 -312
- package/bin/runners/lib/doctor/modules/runtime.js +224 -224
- package/bin/runners/lib/doctor/modules/security.js +348 -348
- package/bin/runners/lib/doctor/modules/system.js +213 -213
- package/bin/runners/lib/doctor/modules/vibecheck.js +394 -394
- package/bin/runners/lib/doctor/reporter.js +262 -262
- package/bin/runners/lib/doctor/service.js +262 -262
- package/bin/runners/lib/doctor/types.js +113 -113
- package/bin/runners/lib/doctor/ui.js +263 -263
- package/bin/runners/lib/doctor-v2.js +608 -608
- package/bin/runners/lib/drift.js +425 -425
- package/bin/runners/lib/enforcement.js +72 -72
- package/bin/runners/lib/engines/accessibility-engine.js +190 -0
- package/bin/runners/lib/engines/api-consistency-engine.js +162 -0
- package/bin/runners/lib/engines/ast-cache.js +99 -0
- package/bin/runners/lib/engines/code-quality-engine.js +255 -0
- package/bin/runners/lib/engines/console-logs-engine.js +115 -0
- package/bin/runners/lib/engines/cross-file-analysis-engine.js +268 -0
- package/bin/runners/lib/engines/dead-code-engine.js +198 -0
- package/bin/runners/lib/engines/deprecated-api-engine.js +226 -0
- package/bin/runners/lib/engines/empty-catch-engine.js +150 -0
- package/bin/runners/lib/engines/file-filter.js +131 -0
- package/bin/runners/lib/engines/hardcoded-secrets-engine.js +251 -0
- package/bin/runners/lib/engines/mock-data-engine.js +272 -0
- package/bin/runners/lib/engines/parallel-processor.js +71 -0
- package/bin/runners/lib/engines/performance-issues-engine.js +265 -0
- package/bin/runners/lib/engines/security-vulnerabilities-engine.js +243 -0
- package/bin/runners/lib/engines/todo-fixme-engine.js +115 -0
- package/bin/runners/lib/engines/type-aware-engine.js +152 -0
- package/bin/runners/lib/engines/unsafe-regex-engine.js +225 -0
- package/bin/runners/lib/engines/vibecheck-engines/README.md +53 -0
- package/bin/runners/lib/engines/vibecheck-engines/index.js +15 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/ast-cache.js +164 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/code-quality-engine.js +291 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/console-logs-engine.js +83 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/dead-code-engine.js +198 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/deprecated-api-engine.js +275 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/empty-catch-engine.js +167 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/file-filter.js +217 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/hardcoded-secrets-engine.js +139 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/mock-data-engine.js +140 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/parallel-processor.js +164 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/performance-issues-engine.js +234 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/type-aware-engine.js +217 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/unsafe-regex-engine.js +78 -0
- package/bin/runners/lib/engines/vibecheck-engines/package.json +13 -0
- package/bin/runners/lib/enterprise-detect.js +603 -603
- package/bin/runners/lib/enterprise-init.js +942 -942
- package/bin/runners/lib/env-resolver.js +417 -417
- package/bin/runners/lib/env-template.js +66 -66
- package/bin/runners/lib/env.js +189 -189
- package/bin/runners/lib/extractors/client-calls.js +990 -990
- package/bin/runners/lib/extractors/fastify-route-dump.js +573 -573
- package/bin/runners/lib/extractors/fastify-routes.js +426 -426
- package/bin/runners/lib/extractors/index.js +363 -363
- package/bin/runners/lib/extractors/next-routes.js +524 -524
- package/bin/runners/lib/extractors/proof-graph.js +431 -431
- package/bin/runners/lib/extractors/route-matcher.js +451 -451
- package/bin/runners/lib/extractors/truthpack-v2.js +377 -377
- package/bin/runners/lib/extractors/ui-bindings.js +547 -547
- package/bin/runners/lib/findings-schema.js +281 -281
- package/bin/runners/lib/firewall-prompt.js +50 -50
- package/bin/runners/lib/global-flags.js +213 -213
- package/bin/runners/lib/graph/graph-builder.js +265 -265
- package/bin/runners/lib/graph/html-renderer.js +413 -413
- package/bin/runners/lib/graph/index.js +32 -32
- package/bin/runners/lib/graph/runtime-collector.js +215 -215
- package/bin/runners/lib/graph/static-extractor.js +518 -518
- package/bin/runners/lib/html-report.js +650 -650
- package/bin/runners/lib/interactive-menu.js +1496 -1496
- package/bin/runners/lib/llm.js +75 -75
- package/bin/runners/lib/meter.js +61 -61
- package/bin/runners/lib/missions/evidence.js +126 -126
- package/bin/runners/lib/patch.js +40 -40
- package/bin/runners/lib/permissions/auth-model.js +213 -213
- package/bin/runners/lib/permissions/idor-prover.js +205 -205
- package/bin/runners/lib/permissions/index.js +45 -45
- package/bin/runners/lib/permissions/matrix-builder.js +198 -198
- package/bin/runners/lib/pkgjson.js +28 -28
- package/bin/runners/lib/policy.js +295 -295
- package/bin/runners/lib/preflight.js +142 -142
- package/bin/runners/lib/reality/correlation-detectors.js +359 -359
- package/bin/runners/lib/reality/index.js +318 -318
- package/bin/runners/lib/reality/request-hashing.js +416 -416
- package/bin/runners/lib/reality/request-mapper.js +453 -453
- package/bin/runners/lib/reality/safety-rails.js +463 -463
- package/bin/runners/lib/reality/semantic-snapshot.js +408 -408
- package/bin/runners/lib/reality/toast-detector.js +393 -393
- package/bin/runners/lib/reality-findings.js +84 -84
- package/bin/runners/lib/receipts.js +179 -179
- package/bin/runners/lib/redact.js +29 -29
- package/bin/runners/lib/replay/capsule-manager.js +154 -154
- package/bin/runners/lib/replay/index.js +263 -263
- package/bin/runners/lib/replay/player.js +348 -348
- package/bin/runners/lib/replay/recorder.js +331 -331
- package/bin/runners/lib/report-output.js +187 -187
- package/bin/runners/lib/report.js +135 -135
- package/bin/runners/lib/route-detection.js +1140 -1140
- package/bin/runners/lib/sandbox/index.js +59 -59
- package/bin/runners/lib/sandbox/proof-chain.js +399 -399
- package/bin/runners/lib/sandbox/sandbox-runner.js +205 -205
- package/bin/runners/lib/sandbox/worktree.js +174 -174
- package/bin/runners/lib/scan-output.js +525 -190
- package/bin/runners/lib/schema-validator.js +350 -350
- package/bin/runners/lib/schemas/contracts.schema.json +160 -160
- package/bin/runners/lib/schemas/finding.schema.json +100 -100
- package/bin/runners/lib/schemas/mission-pack.schema.json +206 -206
- package/bin/runners/lib/schemas/proof-graph.schema.json +176 -176
- package/bin/runners/lib/schemas/reality-report.schema.json +162 -162
- package/bin/runners/lib/schemas/share-pack.schema.json +180 -180
- package/bin/runners/lib/schemas/ship-report.schema.json +117 -117
- package/bin/runners/lib/schemas/truthpack-v2.schema.json +303 -303
- package/bin/runners/lib/schemas/validator.js +438 -438
- package/bin/runners/lib/score-history.js +282 -282
- package/bin/runners/lib/share-pack.js +239 -239
- package/bin/runners/lib/snippets.js +67 -67
- package/bin/runners/lib/status-output.js +253 -253
- package/bin/runners/lib/terminal-ui.js +351 -271
- package/bin/runners/lib/upsell.js +510 -510
- package/bin/runners/lib/usage.js +153 -153
- package/bin/runners/lib/validate-patch.js +156 -156
- package/bin/runners/lib/verdict-engine.js +628 -628
- package/bin/runners/reality/engine.js +917 -917
- package/bin/runners/reality/flows.js +122 -122
- package/bin/runners/reality/report.js +378 -378
- package/bin/runners/reality/session.js +193 -193
- package/bin/runners/runGuard.js +168 -168
- package/bin/runners/runProof.zip +0 -0
- package/bin/runners/runProve.js +8 -0
- package/bin/runners/runReality.js +14 -0
- package/bin/runners/runScan.js +17 -1
- package/bin/runners/runTruth.js +15 -3
- package/mcp-server/tier-auth.js +4 -4
- package/mcp-server/tools/index.js +72 -72
- package/package.json +1 -1
|
@@ -1,205 +1,205 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Sandbox Runner
|
|
3
|
-
* Orchestrates the complete sandbox workflow:
|
|
4
|
-
* 1. Create isolated workspace
|
|
5
|
-
* 2. Apply patches
|
|
6
|
-
* 3. Run proof chain
|
|
7
|
-
* 4. Merge back or rollback
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
"use strict";
|
|
11
|
-
|
|
12
|
-
const fs = require("fs");
|
|
13
|
-
const path = require("path");
|
|
14
|
-
const {
|
|
15
|
-
isGitRepo,
|
|
16
|
-
isGitClean,
|
|
17
|
-
createWorktree,
|
|
18
|
-
removeWorktree,
|
|
19
|
-
copyChangesBack,
|
|
20
|
-
runInSandbox,
|
|
21
|
-
getChangedFiles
|
|
22
|
-
} = require("./worktree");
|
|
23
|
-
const { runProofChain, PROOF_LEVELS } = require("./proof-chain");
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Run patch in sandbox with proof chain
|
|
27
|
-
*/
|
|
28
|
-
async function runPatchInSandbox(repoRoot, patchFn, options = {}) {
|
|
29
|
-
const result = {
|
|
30
|
-
ok: false,
|
|
31
|
-
sandboxPath: null,
|
|
32
|
-
patchApplied: false,
|
|
33
|
-
proofPassed: false,
|
|
34
|
-
mergedBack: false,
|
|
35
|
-
proofResult: null,
|
|
36
|
-
changedFiles: [],
|
|
37
|
-
error: null,
|
|
38
|
-
duration: 0
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
const startTime = Date.now();
|
|
42
|
-
|
|
43
|
-
// Verify git repo
|
|
44
|
-
if (!isGitRepo(repoRoot)) {
|
|
45
|
-
result.error = "Not a git repository. Sandbox requires git.";
|
|
46
|
-
return result;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// Create worktree
|
|
50
|
-
const worktree = createWorktree(repoRoot);
|
|
51
|
-
if (!worktree.ok) {
|
|
52
|
-
result.error = `Failed to create worktree: ${worktree.error}`;
|
|
53
|
-
return result;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
result.sandboxPath = worktree.path;
|
|
57
|
-
|
|
58
|
-
try {
|
|
59
|
-
// Apply patch in sandbox
|
|
60
|
-
const patchResult = await patchFn(worktree.path);
|
|
61
|
-
|
|
62
|
-
if (!patchResult.ok) {
|
|
63
|
-
result.error = `Patch failed: ${patchResult.error}`;
|
|
64
|
-
return result;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
result.patchApplied = true;
|
|
68
|
-
result.changedFiles = getChangedFiles(worktree.path);
|
|
69
|
-
|
|
70
|
-
// Run proof chain
|
|
71
|
-
const proofResult = await runProofChain(worktree.path, {
|
|
72
|
-
level: options.proofLevel || "balanced",
|
|
73
|
-
url: options.url,
|
|
74
|
-
changedFiles: result.changedFiles
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
result.proofResult = proofResult;
|
|
78
|
-
result.proofPassed = proofResult.passed;
|
|
79
|
-
|
|
80
|
-
if (!proofResult.passed) {
|
|
81
|
-
result.error = `Proof chain failed at ${proofResult.failedAt}: ${proofResult.reason}`;
|
|
82
|
-
return result;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
// Copy changes back to main worktree
|
|
86
|
-
if (options.apply !== false) {
|
|
87
|
-
const copyResult = copyChangesBack(worktree.path, repoRoot, result.changedFiles);
|
|
88
|
-
|
|
89
|
-
if (copyResult.failed.length > 0) {
|
|
90
|
-
result.error = `Failed to copy some files: ${copyResult.failed.map(f => f.file).join(", ")}`;
|
|
91
|
-
return result;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
result.mergedBack = true;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
result.ok = true;
|
|
98
|
-
} finally {
|
|
99
|
-
// Cleanup worktree
|
|
100
|
-
removeWorktree(repoRoot, worktree.path);
|
|
101
|
-
result.duration = Date.now() - startTime;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
return result;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* Apply unified diff in sandbox
|
|
109
|
-
*/
|
|
110
|
-
function applyDiffInSandbox(sandboxPath, diff) {
|
|
111
|
-
const { applyUnifiedDiff } = require("../patch");
|
|
112
|
-
return applyUnifiedDiff(sandboxPath, diff);
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* Create sandbox, apply edits, and verify
|
|
117
|
-
*/
|
|
118
|
-
async function sandboxApplyEdits(repoRoot, edits, options = {}) {
|
|
119
|
-
return runPatchInSandbox(repoRoot, async (sandboxPath) => {
|
|
120
|
-
const results = [];
|
|
121
|
-
|
|
122
|
-
for (const edit of edits) {
|
|
123
|
-
if (edit.diff) {
|
|
124
|
-
const res = applyDiffInSandbox(sandboxPath, edit.diff);
|
|
125
|
-
results.push(res);
|
|
126
|
-
if (!res.ok) {
|
|
127
|
-
return { ok: false, error: res.error, results };
|
|
128
|
-
}
|
|
129
|
-
} else if (edit.file && edit.content) {
|
|
130
|
-
// Direct file write
|
|
131
|
-
try {
|
|
132
|
-
const filePath = path.join(sandboxPath, edit.file);
|
|
133
|
-
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
134
|
-
fs.writeFileSync(filePath, edit.content, "utf8");
|
|
135
|
-
results.push({ ok: true, file: edit.file });
|
|
136
|
-
} catch (e) {
|
|
137
|
-
return { ok: false, error: e.message, results };
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
return { ok: true, results };
|
|
143
|
-
}, options);
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* Write proof result to output directory
|
|
148
|
-
*/
|
|
149
|
-
function writeProofResult(outDir, result) {
|
|
150
|
-
fs.mkdirSync(outDir, { recursive: true });
|
|
151
|
-
|
|
152
|
-
const proofPath = path.join(outDir, "proof.json");
|
|
153
|
-
fs.writeFileSync(proofPath, JSON.stringify(result, null, 2), "utf8");
|
|
154
|
-
|
|
155
|
-
// Write human-readable log
|
|
156
|
-
const logLines = [
|
|
157
|
-
`# Sandbox Proof Result`,
|
|
158
|
-
``,
|
|
159
|
-
`**Status**: ${result.ok ? "✅ PASSED" : "❌ FAILED"}`,
|
|
160
|
-
`**Duration**: ${result.duration}ms`,
|
|
161
|
-
`**Proof Level**: ${result.proofResult?.level || "unknown"}`,
|
|
162
|
-
``
|
|
163
|
-
];
|
|
164
|
-
|
|
165
|
-
if (result.changedFiles.length) {
|
|
166
|
-
logLines.push(`## Changed Files`);
|
|
167
|
-
for (const f of result.changedFiles) {
|
|
168
|
-
logLines.push(`- ${f}`);
|
|
169
|
-
}
|
|
170
|
-
logLines.push(``);
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
if (result.proofResult?.stages) {
|
|
174
|
-
logLines.push(`## Proof Stages`);
|
|
175
|
-
for (const stage of result.proofResult.stages) {
|
|
176
|
-
const icon = stage.passed ? "✅" : "❌";
|
|
177
|
-
logLines.push(`### ${icon} ${stage.stage} (${stage.duration}ms)`);
|
|
178
|
-
|
|
179
|
-
for (const check of stage.checks || []) {
|
|
180
|
-
const checkIcon = check.passed ? "✓" : "✗";
|
|
181
|
-
logLines.push(`- ${checkIcon} ${check.name}`);
|
|
182
|
-
if (check.error) logLines.push(` Error: ${check.error}`);
|
|
183
|
-
}
|
|
184
|
-
logLines.push(``);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
if (result.error) {
|
|
189
|
-
logLines.push(`## Error`);
|
|
190
|
-
logLines.push(result.error);
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
const logPath = path.join(outDir, "proof.md");
|
|
194
|
-
fs.writeFileSync(logPath, logLines.join("\n"), "utf8");
|
|
195
|
-
|
|
196
|
-
return { proofPath, logPath };
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
module.exports = {
|
|
200
|
-
runPatchInSandbox,
|
|
201
|
-
sandboxApplyEdits,
|
|
202
|
-
applyDiffInSandbox,
|
|
203
|
-
writeProofResult,
|
|
204
|
-
PROOF_LEVELS
|
|
205
|
-
};
|
|
1
|
+
/**
|
|
2
|
+
* Sandbox Runner
|
|
3
|
+
* Orchestrates the complete sandbox workflow:
|
|
4
|
+
* 1. Create isolated workspace
|
|
5
|
+
* 2. Apply patches
|
|
6
|
+
* 3. Run proof chain
|
|
7
|
+
* 4. Merge back or rollback
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
"use strict";
|
|
11
|
+
|
|
12
|
+
const fs = require("fs");
|
|
13
|
+
const path = require("path");
|
|
14
|
+
const {
|
|
15
|
+
isGitRepo,
|
|
16
|
+
isGitClean,
|
|
17
|
+
createWorktree,
|
|
18
|
+
removeWorktree,
|
|
19
|
+
copyChangesBack,
|
|
20
|
+
runInSandbox,
|
|
21
|
+
getChangedFiles
|
|
22
|
+
} = require("./worktree");
|
|
23
|
+
const { runProofChain, PROOF_LEVELS } = require("./proof-chain");
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Run patch in sandbox with proof chain
|
|
27
|
+
*/
|
|
28
|
+
async function runPatchInSandbox(repoRoot, patchFn, options = {}) {
|
|
29
|
+
const result = {
|
|
30
|
+
ok: false,
|
|
31
|
+
sandboxPath: null,
|
|
32
|
+
patchApplied: false,
|
|
33
|
+
proofPassed: false,
|
|
34
|
+
mergedBack: false,
|
|
35
|
+
proofResult: null,
|
|
36
|
+
changedFiles: [],
|
|
37
|
+
error: null,
|
|
38
|
+
duration: 0
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const startTime = Date.now();
|
|
42
|
+
|
|
43
|
+
// Verify git repo
|
|
44
|
+
if (!isGitRepo(repoRoot)) {
|
|
45
|
+
result.error = "Not a git repository. Sandbox requires git.";
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Create worktree
|
|
50
|
+
const worktree = createWorktree(repoRoot);
|
|
51
|
+
if (!worktree.ok) {
|
|
52
|
+
result.error = `Failed to create worktree: ${worktree.error}`;
|
|
53
|
+
return result;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
result.sandboxPath = worktree.path;
|
|
57
|
+
|
|
58
|
+
try {
|
|
59
|
+
// Apply patch in sandbox
|
|
60
|
+
const patchResult = await patchFn(worktree.path);
|
|
61
|
+
|
|
62
|
+
if (!patchResult.ok) {
|
|
63
|
+
result.error = `Patch failed: ${patchResult.error}`;
|
|
64
|
+
return result;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
result.patchApplied = true;
|
|
68
|
+
result.changedFiles = getChangedFiles(worktree.path);
|
|
69
|
+
|
|
70
|
+
// Run proof chain
|
|
71
|
+
const proofResult = await runProofChain(worktree.path, {
|
|
72
|
+
level: options.proofLevel || "balanced",
|
|
73
|
+
url: options.url,
|
|
74
|
+
changedFiles: result.changedFiles
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
result.proofResult = proofResult;
|
|
78
|
+
result.proofPassed = proofResult.passed;
|
|
79
|
+
|
|
80
|
+
if (!proofResult.passed) {
|
|
81
|
+
result.error = `Proof chain failed at ${proofResult.failedAt}: ${proofResult.reason}`;
|
|
82
|
+
return result;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Copy changes back to main worktree
|
|
86
|
+
if (options.apply !== false) {
|
|
87
|
+
const copyResult = copyChangesBack(worktree.path, repoRoot, result.changedFiles);
|
|
88
|
+
|
|
89
|
+
if (copyResult.failed.length > 0) {
|
|
90
|
+
result.error = `Failed to copy some files: ${copyResult.failed.map(f => f.file).join(", ")}`;
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
result.mergedBack = true;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
result.ok = true;
|
|
98
|
+
} finally {
|
|
99
|
+
// Cleanup worktree
|
|
100
|
+
removeWorktree(repoRoot, worktree.path);
|
|
101
|
+
result.duration = Date.now() - startTime;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
return result;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Apply unified diff in sandbox
|
|
109
|
+
*/
|
|
110
|
+
function applyDiffInSandbox(sandboxPath, diff) {
|
|
111
|
+
const { applyUnifiedDiff } = require("../patch");
|
|
112
|
+
return applyUnifiedDiff(sandboxPath, diff);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Create sandbox, apply edits, and verify
|
|
117
|
+
*/
|
|
118
|
+
async function sandboxApplyEdits(repoRoot, edits, options = {}) {
|
|
119
|
+
return runPatchInSandbox(repoRoot, async (sandboxPath) => {
|
|
120
|
+
const results = [];
|
|
121
|
+
|
|
122
|
+
for (const edit of edits) {
|
|
123
|
+
if (edit.diff) {
|
|
124
|
+
const res = applyDiffInSandbox(sandboxPath, edit.diff);
|
|
125
|
+
results.push(res);
|
|
126
|
+
if (!res.ok) {
|
|
127
|
+
return { ok: false, error: res.error, results };
|
|
128
|
+
}
|
|
129
|
+
} else if (edit.file && edit.content) {
|
|
130
|
+
// Direct file write
|
|
131
|
+
try {
|
|
132
|
+
const filePath = path.join(sandboxPath, edit.file);
|
|
133
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
134
|
+
fs.writeFileSync(filePath, edit.content, "utf8");
|
|
135
|
+
results.push({ ok: true, file: edit.file });
|
|
136
|
+
} catch (e) {
|
|
137
|
+
return { ok: false, error: e.message, results };
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return { ok: true, results };
|
|
143
|
+
}, options);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Write proof result to output directory
|
|
148
|
+
*/
|
|
149
|
+
function writeProofResult(outDir, result) {
|
|
150
|
+
fs.mkdirSync(outDir, { recursive: true });
|
|
151
|
+
|
|
152
|
+
const proofPath = path.join(outDir, "proof.json");
|
|
153
|
+
fs.writeFileSync(proofPath, JSON.stringify(result, null, 2), "utf8");
|
|
154
|
+
|
|
155
|
+
// Write human-readable log
|
|
156
|
+
const logLines = [
|
|
157
|
+
`# Sandbox Proof Result`,
|
|
158
|
+
``,
|
|
159
|
+
`**Status**: ${result.ok ? "✅ PASSED" : "❌ FAILED"}`,
|
|
160
|
+
`**Duration**: ${result.duration}ms`,
|
|
161
|
+
`**Proof Level**: ${result.proofResult?.level || "unknown"}`,
|
|
162
|
+
``
|
|
163
|
+
];
|
|
164
|
+
|
|
165
|
+
if (result.changedFiles.length) {
|
|
166
|
+
logLines.push(`## Changed Files`);
|
|
167
|
+
for (const f of result.changedFiles) {
|
|
168
|
+
logLines.push(`- ${f}`);
|
|
169
|
+
}
|
|
170
|
+
logLines.push(``);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
if (result.proofResult?.stages) {
|
|
174
|
+
logLines.push(`## Proof Stages`);
|
|
175
|
+
for (const stage of result.proofResult.stages) {
|
|
176
|
+
const icon = stage.passed ? "✅" : "❌";
|
|
177
|
+
logLines.push(`### ${icon} ${stage.stage} (${stage.duration}ms)`);
|
|
178
|
+
|
|
179
|
+
for (const check of stage.checks || []) {
|
|
180
|
+
const checkIcon = check.passed ? "✓" : "✗";
|
|
181
|
+
logLines.push(`- ${checkIcon} ${check.name}`);
|
|
182
|
+
if (check.error) logLines.push(` Error: ${check.error}`);
|
|
183
|
+
}
|
|
184
|
+
logLines.push(``);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
if (result.error) {
|
|
189
|
+
logLines.push(`## Error`);
|
|
190
|
+
logLines.push(result.error);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
const logPath = path.join(outDir, "proof.md");
|
|
194
|
+
fs.writeFileSync(logPath, logLines.join("\n"), "utf8");
|
|
195
|
+
|
|
196
|
+
return { proofPath, logPath };
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
module.exports = {
|
|
200
|
+
runPatchInSandbox,
|
|
201
|
+
sandboxApplyEdits,
|
|
202
|
+
applyDiffInSandbox,
|
|
203
|
+
writeProofResult,
|
|
204
|
+
PROOF_LEVELS
|
|
205
|
+
};
|