@vibecheckai/cli 3.4.0 → 3.5.1

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.
Files changed (228) hide show
  1. package/bin/registry.js +154 -338
  2. package/bin/runners/context/generators/mcp.js +13 -15
  3. package/bin/runners/context/proof-context.js +1 -248
  4. package/bin/runners/lib/analysis-core.js +180 -198
  5. package/bin/runners/lib/analyzers.js +223 -1669
  6. package/bin/runners/lib/cli-output.js +210 -242
  7. package/bin/runners/lib/detectors-v2.js +785 -547
  8. package/bin/runners/lib/entitlements-v2.js +458 -96
  9. package/bin/runners/lib/error-handler.js +9 -16
  10. package/bin/runners/lib/global-flags.js +0 -37
  11. package/bin/runners/lib/route-truth.js +322 -1167
  12. package/bin/runners/lib/scan-output.js +469 -448
  13. package/bin/runners/lib/ship-output.js +27 -280
  14. package/bin/runners/lib/terminal-ui.js +733 -231
  15. package/bin/runners/lib/truth.js +321 -1004
  16. package/bin/runners/lib/unified-output.js +158 -162
  17. package/bin/runners/lib/upsell.js +204 -104
  18. package/bin/runners/runAllowlist.js +324 -0
  19. package/bin/runners/runAuth.js +95 -324
  20. package/bin/runners/runCheckpoint.js +21 -39
  21. package/bin/runners/runContext.js +24 -136
  22. package/bin/runners/runDoctor.js +67 -115
  23. package/bin/runners/runEvidencePack.js +219 -0
  24. package/bin/runners/runFix.js +5 -6
  25. package/bin/runners/runGuard.js +118 -212
  26. package/bin/runners/runInit.js +2 -14
  27. package/bin/runners/runInstall.js +281 -0
  28. package/bin/runners/runLabs.js +341 -0
  29. package/bin/runners/runMcp.js +52 -130
  30. package/bin/runners/runPolish.js +20 -43
  31. package/bin/runners/runProve.js +3 -13
  32. package/bin/runners/runReality.js +0 -14
  33. package/bin/runners/runReport.js +2 -3
  34. package/bin/runners/runScan.js +44 -511
  35. package/bin/runners/runShip.js +14 -28
  36. package/bin/runners/runValidate.js +2 -19
  37. package/bin/runners/runWatch.js +54 -118
  38. package/bin/vibecheck.js +41 -148
  39. package/mcp-server/ARCHITECTURE.md +339 -0
  40. package/mcp-server/__tests__/cache.test.ts +313 -0
  41. package/mcp-server/__tests__/executor.test.ts +239 -0
  42. package/mcp-server/__tests__/fixtures/exclusion-test/.cache/webpack/cache.pack +1 -0
  43. package/mcp-server/__tests__/fixtures/exclusion-test/.next/server/chunk.js +3 -0
  44. package/mcp-server/__tests__/fixtures/exclusion-test/.turbo/cache.json +3 -0
  45. package/mcp-server/__tests__/fixtures/exclusion-test/.venv/lib/env.py +3 -0
  46. package/mcp-server/__tests__/fixtures/exclusion-test/dist/bundle.js +3 -0
  47. package/mcp-server/__tests__/fixtures/exclusion-test/package.json +5 -0
  48. package/mcp-server/__tests__/fixtures/exclusion-test/src/app.ts +5 -0
  49. package/mcp-server/__tests__/fixtures/exclusion-test/venv/lib/config.py +4 -0
  50. package/mcp-server/__tests__/ids.test.ts +345 -0
  51. package/mcp-server/__tests__/integration/tools.test.ts +410 -0
  52. package/mcp-server/__tests__/registry.test.ts +365 -0
  53. package/mcp-server/__tests__/sandbox.test.ts +323 -0
  54. package/mcp-server/__tests__/schemas.test.ts +372 -0
  55. package/mcp-server/benchmarks/run-benchmarks.ts +304 -0
  56. package/mcp-server/examples/doctor.request.json +14 -0
  57. package/mcp-server/examples/doctor.response.json +53 -0
  58. package/mcp-server/examples/error.response.json +15 -0
  59. package/mcp-server/examples/scan.request.json +14 -0
  60. package/mcp-server/examples/scan.response.json +108 -0
  61. package/mcp-server/handlers/tool-handler.ts +671 -0
  62. package/mcp-server/index-v3.ts +293 -0
  63. package/mcp-server/index.js +1072 -1573
  64. package/mcp-server/index.old.js +4137 -0
  65. package/mcp-server/lib/cache.ts +341 -0
  66. package/mcp-server/lib/errors.ts +346 -0
  67. package/mcp-server/lib/executor.ts +792 -0
  68. package/mcp-server/lib/ids.ts +238 -0
  69. package/mcp-server/lib/logger.ts +368 -0
  70. package/mcp-server/lib/metrics.ts +365 -0
  71. package/mcp-server/lib/sandbox.ts +337 -0
  72. package/mcp-server/lib/validator.ts +229 -0
  73. package/mcp-server/package-lock.json +165 -0
  74. package/mcp-server/package.json +32 -7
  75. package/mcp-server/premium-tools.js +2 -2
  76. package/mcp-server/registry/tools.json +476 -0
  77. package/mcp-server/schemas/error-envelope.schema.json +125 -0
  78. package/mcp-server/schemas/finding.schema.json +167 -0
  79. package/mcp-server/schemas/report-artifact.schema.json +88 -0
  80. package/mcp-server/schemas/run-request.schema.json +75 -0
  81. package/mcp-server/schemas/verdict.schema.json +168 -0
  82. package/mcp-server/tier-auth.d.ts +71 -0
  83. package/mcp-server/tier-auth.js +371 -183
  84. package/mcp-server/truth-context.js +90 -131
  85. package/mcp-server/truth-firewall-tools.js +1000 -1611
  86. package/mcp-server/tsconfig.json +34 -0
  87. package/mcp-server/vibecheck-tools.js +2 -2
  88. package/mcp-server/vitest.config.ts +16 -0
  89. package/package.json +3 -4
  90. package/bin/runners/lib/agent-firewall/ai/false-positive-analyzer.js +0 -474
  91. package/bin/runners/lib/agent-firewall/change-packet/builder.js +0 -488
  92. package/bin/runners/lib/agent-firewall/change-packet/schema.json +0 -228
  93. package/bin/runners/lib/agent-firewall/change-packet/store.js +0 -200
  94. package/bin/runners/lib/agent-firewall/claims/claim-types.js +0 -21
  95. package/bin/runners/lib/agent-firewall/claims/extractor.js +0 -303
  96. package/bin/runners/lib/agent-firewall/claims/patterns.js +0 -24
  97. package/bin/runners/lib/agent-firewall/critic/index.js +0 -151
  98. package/bin/runners/lib/agent-firewall/critic/judge.js +0 -432
  99. package/bin/runners/lib/agent-firewall/critic/prompts.js +0 -305
  100. package/bin/runners/lib/agent-firewall/evidence/auth-evidence.js +0 -88
  101. package/bin/runners/lib/agent-firewall/evidence/contract-evidence.js +0 -75
  102. package/bin/runners/lib/agent-firewall/evidence/env-evidence.js +0 -127
  103. package/bin/runners/lib/agent-firewall/evidence/resolver.js +0 -102
  104. package/bin/runners/lib/agent-firewall/evidence/route-evidence.js +0 -213
  105. package/bin/runners/lib/agent-firewall/evidence/side-effect-evidence.js +0 -145
  106. package/bin/runners/lib/agent-firewall/fs-hook/daemon.js +0 -19
  107. package/bin/runners/lib/agent-firewall/fs-hook/installer.js +0 -87
  108. package/bin/runners/lib/agent-firewall/fs-hook/watcher.js +0 -184
  109. package/bin/runners/lib/agent-firewall/git-hook/pre-commit.js +0 -163
  110. package/bin/runners/lib/agent-firewall/ide-extension/cursor.js +0 -107
  111. package/bin/runners/lib/agent-firewall/ide-extension/vscode.js +0 -68
  112. package/bin/runners/lib/agent-firewall/ide-extension/windsurf.js +0 -66
  113. package/bin/runners/lib/agent-firewall/interceptor/base.js +0 -304
  114. package/bin/runners/lib/agent-firewall/interceptor/cursor.js +0 -35
  115. package/bin/runners/lib/agent-firewall/interceptor/vscode.js +0 -35
  116. package/bin/runners/lib/agent-firewall/interceptor/windsurf.js +0 -34
  117. package/bin/runners/lib/agent-firewall/lawbook/distributor.js +0 -465
  118. package/bin/runners/lib/agent-firewall/lawbook/evaluator.js +0 -604
  119. package/bin/runners/lib/agent-firewall/lawbook/index.js +0 -304
  120. package/bin/runners/lib/agent-firewall/lawbook/registry.js +0 -514
  121. package/bin/runners/lib/agent-firewall/lawbook/schema.js +0 -420
  122. package/bin/runners/lib/agent-firewall/logger.js +0 -141
  123. package/bin/runners/lib/agent-firewall/policy/default-policy.json +0 -90
  124. package/bin/runners/lib/agent-firewall/policy/engine.js +0 -103
  125. package/bin/runners/lib/agent-firewall/policy/loader.js +0 -451
  126. package/bin/runners/lib/agent-firewall/policy/rules/auth-drift.js +0 -50
  127. package/bin/runners/lib/agent-firewall/policy/rules/contract-drift.js +0 -50
  128. package/bin/runners/lib/agent-firewall/policy/rules/fake-success.js +0 -86
  129. package/bin/runners/lib/agent-firewall/policy/rules/ghost-env.js +0 -162
  130. package/bin/runners/lib/agent-firewall/policy/rules/ghost-route.js +0 -189
  131. package/bin/runners/lib/agent-firewall/policy/rules/scope.js +0 -93
  132. package/bin/runners/lib/agent-firewall/policy/rules/unsafe-side-effect.js +0 -57
  133. package/bin/runners/lib/agent-firewall/policy/schema.json +0 -183
  134. package/bin/runners/lib/agent-firewall/policy/verdict.js +0 -54
  135. package/bin/runners/lib/agent-firewall/proposal/extractor.js +0 -394
  136. package/bin/runners/lib/agent-firewall/proposal/index.js +0 -212
  137. package/bin/runners/lib/agent-firewall/proposal/schema.js +0 -251
  138. package/bin/runners/lib/agent-firewall/proposal/validator.js +0 -386
  139. package/bin/runners/lib/agent-firewall/reality/index.js +0 -332
  140. package/bin/runners/lib/agent-firewall/reality/state.js +0 -625
  141. package/bin/runners/lib/agent-firewall/reality/watcher.js +0 -322
  142. package/bin/runners/lib/agent-firewall/risk/index.js +0 -173
  143. package/bin/runners/lib/agent-firewall/risk/scorer.js +0 -328
  144. package/bin/runners/lib/agent-firewall/risk/thresholds.js +0 -321
  145. package/bin/runners/lib/agent-firewall/risk/vectors.js +0 -421
  146. package/bin/runners/lib/agent-firewall/simulator/diff-simulator.js +0 -472
  147. package/bin/runners/lib/agent-firewall/simulator/import-resolver.js +0 -346
  148. package/bin/runners/lib/agent-firewall/simulator/index.js +0 -181
  149. package/bin/runners/lib/agent-firewall/simulator/route-validator.js +0 -380
  150. package/bin/runners/lib/agent-firewall/time-machine/incident-correlator.js +0 -661
  151. package/bin/runners/lib/agent-firewall/time-machine/index.js +0 -267
  152. package/bin/runners/lib/agent-firewall/time-machine/replay-engine.js +0 -436
  153. package/bin/runners/lib/agent-firewall/time-machine/state-reconstructor.js +0 -490
  154. package/bin/runners/lib/agent-firewall/time-machine/timeline-builder.js +0 -530
  155. package/bin/runners/lib/agent-firewall/truthpack/index.js +0 -67
  156. package/bin/runners/lib/agent-firewall/truthpack/loader.js +0 -137
  157. package/bin/runners/lib/agent-firewall/unblock/planner.js +0 -337
  158. package/bin/runners/lib/agent-firewall/utils/ignore-checker.js +0 -118
  159. package/bin/runners/lib/api-client.js +0 -269
  160. package/bin/runners/lib/authority-badge.js +0 -425
  161. package/bin/runners/lib/engines/accessibility-engine.js +0 -190
  162. package/bin/runners/lib/engines/api-consistency-engine.js +0 -162
  163. package/bin/runners/lib/engines/ast-cache.js +0 -99
  164. package/bin/runners/lib/engines/code-quality-engine.js +0 -255
  165. package/bin/runners/lib/engines/console-logs-engine.js +0 -115
  166. package/bin/runners/lib/engines/cross-file-analysis-engine.js +0 -268
  167. package/bin/runners/lib/engines/dead-code-engine.js +0 -198
  168. package/bin/runners/lib/engines/deprecated-api-engine.js +0 -226
  169. package/bin/runners/lib/engines/empty-catch-engine.js +0 -150
  170. package/bin/runners/lib/engines/file-filter.js +0 -131
  171. package/bin/runners/lib/engines/hardcoded-secrets-engine.js +0 -251
  172. package/bin/runners/lib/engines/mock-data-engine.js +0 -272
  173. package/bin/runners/lib/engines/parallel-processor.js +0 -71
  174. package/bin/runners/lib/engines/performance-issues-engine.js +0 -265
  175. package/bin/runners/lib/engines/security-vulnerabilities-engine.js +0 -243
  176. package/bin/runners/lib/engines/todo-fixme-engine.js +0 -115
  177. package/bin/runners/lib/engines/type-aware-engine.js +0 -152
  178. package/bin/runners/lib/engines/unsafe-regex-engine.js +0 -225
  179. package/bin/runners/lib/engines/vibecheck-engines/README.md +0 -53
  180. package/bin/runners/lib/engines/vibecheck-engines/index.js +0 -15
  181. package/bin/runners/lib/engines/vibecheck-engines/lib/ast-cache.js +0 -164
  182. package/bin/runners/lib/engines/vibecheck-engines/lib/code-quality-engine.js +0 -291
  183. package/bin/runners/lib/engines/vibecheck-engines/lib/console-logs-engine.js +0 -83
  184. package/bin/runners/lib/engines/vibecheck-engines/lib/dead-code-engine.js +0 -198
  185. package/bin/runners/lib/engines/vibecheck-engines/lib/deprecated-api-engine.js +0 -275
  186. package/bin/runners/lib/engines/vibecheck-engines/lib/empty-catch-engine.js +0 -167
  187. package/bin/runners/lib/engines/vibecheck-engines/lib/file-filter.js +0 -217
  188. package/bin/runners/lib/engines/vibecheck-engines/lib/hardcoded-secrets-engine.js +0 -139
  189. package/bin/runners/lib/engines/vibecheck-engines/lib/mock-data-engine.js +0 -140
  190. package/bin/runners/lib/engines/vibecheck-engines/lib/parallel-processor.js +0 -164
  191. package/bin/runners/lib/engines/vibecheck-engines/lib/performance-issues-engine.js +0 -234
  192. package/bin/runners/lib/engines/vibecheck-engines/lib/type-aware-engine.js +0 -217
  193. package/bin/runners/lib/engines/vibecheck-engines/lib/unsafe-regex-engine.js +0 -78
  194. package/bin/runners/lib/engines/vibecheck-engines/package.json +0 -13
  195. package/bin/runners/lib/exit-codes.js +0 -275
  196. package/bin/runners/lib/fingerprint.js +0 -377
  197. package/bin/runners/lib/help-formatter.js +0 -413
  198. package/bin/runners/lib/logger.js +0 -38
  199. package/bin/runners/lib/ship-output-enterprise.js +0 -239
  200. package/bin/runners/lib/unified-cli-output.js +0 -604
  201. package/bin/runners/runAgent.d.ts +0 -5
  202. package/bin/runners/runAgent.js +0 -161
  203. package/bin/runners/runApprove.js +0 -1200
  204. package/bin/runners/runClassify.js +0 -859
  205. package/bin/runners/runContext.d.ts +0 -4
  206. package/bin/runners/runFirewall.d.ts +0 -5
  207. package/bin/runners/runFirewall.js +0 -134
  208. package/bin/runners/runFirewallHook.d.ts +0 -5
  209. package/bin/runners/runFirewallHook.js +0 -56
  210. package/bin/runners/runPolish.d.ts +0 -4
  211. package/bin/runners/runProof.zip +0 -0
  212. package/bin/runners/runTruth.d.ts +0 -5
  213. package/bin/runners/runTruth.js +0 -101
  214. package/mcp-server/HARDENING_SUMMARY.md +0 -299
  215. package/mcp-server/agent-firewall-interceptor.js +0 -500
  216. package/mcp-server/authority-tools.js +0 -569
  217. package/mcp-server/conductor/conflict-resolver.js +0 -588
  218. package/mcp-server/conductor/execution-planner.js +0 -544
  219. package/mcp-server/conductor/index.js +0 -377
  220. package/mcp-server/conductor/lock-manager.js +0 -615
  221. package/mcp-server/conductor/request-queue.js +0 -550
  222. package/mcp-server/conductor/session-manager.js +0 -500
  223. package/mcp-server/conductor/tools.js +0 -510
  224. package/mcp-server/lib/api-client.cjs +0 -13
  225. package/mcp-server/lib/logger.cjs +0 -30
  226. package/mcp-server/logger.js +0 -173
  227. package/mcp-server/tools-v3.js +0 -706
  228. package/mcp-server/vibecheck-mcp-server-3.2.0.tgz +0 -0
@@ -1,488 +0,0 @@
1
- /**
2
- * Change Packet Builder
3
- *
4
- * Builds change packets from diffs + agent intent.
5
- * Each packet is a complete audit artifact of an AI code change attempt.
6
- *
7
- * Enhanced with:
8
- * - Risk scoring
9
- * - Simulation results
10
- * - Critic verdict
11
- * - Override tracking
12
- */
13
-
14
- "use strict";
15
-
16
- const crypto = require("crypto");
17
- const path = require("path");
18
-
19
- /**
20
- * @typedef {Object} ProofArtifact
21
- * @property {string} changeId - Unique change identifier
22
- * @property {string} decision - ALLOW, BLOCK, or REQUIRE_CONFIRMATION
23
- * @property {Array} rulesTriggered - Rules that were triggered
24
- * @property {Array} assumptionsFailed - Failed assumptions
25
- * @property {number} riskScore - Numerical risk score
26
- * @property {string} riskLevel - LOW, MEDIUM, HIGH, CRITICAL
27
- * @property {Object} simulationResult - Result of diff simulation
28
- * @property {Object} criticVerdict - Critic LLM verdict
29
- * @property {string} timestamp - ISO timestamp
30
- * @property {boolean} overrideUsed - Whether override was used
31
- * @property {string} overrideBy - Who overrode (if applicable)
32
- * @property {string} overrideReason - Reason for override
33
- */
34
-
35
- /**
36
- * Build a change packet from diff and agent intent
37
- * @param {object} params
38
- * @param {string} params.agentId - Agent identifier
39
- * @param {string} params.intent - Agent's stated intent
40
- * @param {object} params.diff - Diff object { before, after, unified }
41
- * @param {string} params.filePath - File path (relative to repo root)
42
- * @param {object} params.claims - Extracted claims
43
- * @param {object} params.evidence - Evidence resolution results
44
- * @param {object} params.verdict - Policy verdict
45
- * @param {object} params.unblockPlan - Unblock plan (if blocked)
46
- * @param {object} params.policy - Policy used for evaluation
47
- * @param {object} params.riskScore - Risk scoring result
48
- * @param {object} params.simulationResult - Diff simulation result
49
- * @param {object} params.criticVerdict - Critic LLM verdict
50
- * @param {object} params.proposal - Structured change proposal
51
- * @param {object} params.override - Override information
52
- * @returns {object} Change packet
53
- */
54
- function buildChangePacket({
55
- agentId,
56
- intent,
57
- diff,
58
- filePath,
59
- claims = [],
60
- evidence = [],
61
- verdict,
62
- unblockPlan = null,
63
- policy = null,
64
- riskScore = null,
65
- simulationResult = null,
66
- criticVerdict = null,
67
- proposal = null,
68
- override = null
69
- }) {
70
- const timestamp = new Date().toISOString();
71
-
72
- // Generate unique packet ID from content hash
73
- const packetContent = JSON.stringify({
74
- agentId,
75
- intent,
76
- filePath,
77
- timestamp,
78
- diff: diff?.unified || ""
79
- });
80
- const id = crypto.createHash("sha256")
81
- .update(packetContent)
82
- .digest("hex")
83
- .slice(0, 16);
84
-
85
- // Calculate file statistics
86
- const linesChanged = diff?.unified
87
- ? diff.unified.split('\n').filter(line => line.startsWith('+') || line.startsWith('-')).length
88
- : 0;
89
-
90
- const files = [{
91
- path: filePath,
92
- linesChanged,
93
- domain: classifyFileDomain(filePath)
94
- }];
95
-
96
- // Extract failed assumptions from evidence
97
- const assumptionsFailed = evidence
98
- .filter(e => e.status === "UNPROVEN" || !e.verified)
99
- .map(e => e.claim?.key || e.claim?.type || e.assumption || "unknown");
100
-
101
- // Extract triggered rules from verdict
102
- const rulesTriggered = (verdict?.violations || [])
103
- .map(v => v.rule || v.type || v.id)
104
- .filter(Boolean);
105
-
106
- // Build packet with enhanced proof artifact fields
107
- const packet = {
108
- id,
109
- timestamp,
110
- agentId,
111
- intent: intent || "No intent provided",
112
-
113
- // Original fields
114
- diff: diff || null,
115
- files,
116
- claims,
117
- evidence,
118
-
119
- // Verdict and decision
120
- verdict: verdict || {
121
- decision: "ALLOW",
122
- violations: [],
123
- message: "No verdict provided"
124
- },
125
- unblockPlan: unblockPlan || null,
126
-
127
- // Enhanced proof artifact fields
128
- proof: {
129
- changeId: `c-${id}`,
130
- decision: verdict?.decision || "ALLOW",
131
- rulesTriggered,
132
- assumptionsFailed,
133
- riskScore: riskScore?.total ?? null,
134
- riskLevel: riskScore?.level || null,
135
- riskFactors: riskScore?.reasons || [],
136
- simulationResult: simulationResult ? {
137
- passed: simulationResult.passed,
138
- errorCount: simulationResult.errors?.length || 0,
139
- warningCount: simulationResult.warnings?.length || 0,
140
- errors: (simulationResult.errors || []).slice(0, 5).map(e => e.message || e),
141
- warnings: (simulationResult.warnings || []).slice(0, 5).map(w => w.message || w),
142
- } : null,
143
- criticVerdict: criticVerdict ? {
144
- verdict: criticVerdict.verdict,
145
- confidence: criticVerdict.confidence,
146
- reasoning: criticVerdict.reasoning || [],
147
- violations: criticVerdict.violations || [],
148
- } : null,
149
- overrideUsed: override?.used || false,
150
- overrideBy: override?.by || null,
151
- overrideReason: override?.reason || null,
152
- overrideTimestamp: override?.timestamp || null,
153
- },
154
-
155
- // Structured proposal (if provided)
156
- proposal: proposal ? {
157
- intent: proposal.intent,
158
- summary: proposal.summary,
159
- confidence: proposal.confidence,
160
- assumptions: proposal.assumptions,
161
- filesTouched: proposal.filesTouched,
162
- operationCount: proposal.operations?.length || 0,
163
- } : null,
164
-
165
- // Metadata
166
- metadata: {
167
- totalFiles: files.length,
168
- totalLines: linesChanged,
169
- policyVersion: policy?.version || "unknown",
170
- policyProfile: policy?.profile || "unknown",
171
- policyMode: policy?.mode || "unknown",
172
- domains: [...new Set(files.map(f => f.domain))],
173
- }
174
- };
175
-
176
- return packet;
177
- }
178
-
179
- /**
180
- * Build change packet from multiple files
181
- * @param {object} params
182
- * @param {string} params.agentId - Agent identifier
183
- * @param {string} params.intent - Agent's stated intent
184
- * @param {array} params.changes - Array of { filePath, diff, claims }
185
- * @param {array} params.evidence - Evidence resolution results
186
- * @param {object} params.verdict - Policy verdict
187
- * @param {object} params.unblockPlan - Unblock plan (if blocked)
188
- * @param {object} params.policy - Policy used for evaluation
189
- * @param {object} params.riskScore - Risk scoring result
190
- * @param {object} params.simulationResult - Diff simulation result
191
- * @param {object} params.criticVerdict - Critic LLM verdict
192
- * @param {object} params.proposal - Structured change proposal
193
- * @param {object} params.override - Override information
194
- * @returns {object} Change packet
195
- */
196
- function buildMultiFileChangePacket({
197
- agentId,
198
- intent,
199
- changes = [],
200
- evidence = [],
201
- verdict,
202
- unblockPlan = null,
203
- policy = null,
204
- riskScore = null,
205
- simulationResult = null,
206
- criticVerdict = null,
207
- proposal = null,
208
- override = null
209
- }) {
210
- const timestamp = new Date().toISOString();
211
-
212
- // Aggregate all file changes
213
- const files = changes.map(change => ({
214
- path: change.filePath,
215
- linesChanged: calculateLinesChanged(change.diff),
216
- domain: classifyFileDomain(change.filePath)
217
- }));
218
-
219
- // Aggregate all claims
220
- const claims = changes.flatMap(change =>
221
- (change.claims || []).map(claim => ({
222
- ...claim,
223
- file: change.filePath
224
- }))
225
- );
226
-
227
- // Generate unique packet ID from all changes
228
- const packetContent = JSON.stringify({
229
- agentId,
230
- intent,
231
- timestamp,
232
- files: files.map(f => f.path),
233
- claims: claims.map(c => `${c.type}:${c.value}`)
234
- });
235
- const id = crypto.createHash("sha256")
236
- .update(packetContent)
237
- .digest("hex")
238
- .slice(0, 16);
239
-
240
- // Build unified diff (concatenate all diffs)
241
- const unifiedDiff = changes
242
- .map(change => {
243
- const diff = change.diff?.unified || "";
244
- return diff ? `--- ${change.filePath}\n+++ ${change.filePath}\n${diff}` : "";
245
- })
246
- .filter(Boolean)
247
- .join("\n\n");
248
-
249
- // Extract failed assumptions from evidence
250
- const assumptionsFailed = evidence
251
- .filter(e => e.status === "UNPROVEN" || !e.verified)
252
- .map(e => e.claim?.key || e.claim?.type || e.assumption || "unknown");
253
-
254
- // Extract triggered rules from verdict
255
- const rulesTriggered = (verdict?.violations || [])
256
- .map(v => v.rule || v.type || v.id)
257
- .filter(Boolean);
258
-
259
- const packet = {
260
- id,
261
- timestamp,
262
- agentId,
263
- intent: intent || "No intent provided",
264
-
265
- // Original fields
266
- diff: unifiedDiff ? {
267
- unified: unifiedDiff,
268
- before: null,
269
- after: null
270
- } : null,
271
- files,
272
- claims,
273
- evidence,
274
-
275
- // Verdict and decision
276
- verdict: verdict || {
277
- decision: "ALLOW",
278
- violations: [],
279
- message: "No verdict provided"
280
- },
281
- unblockPlan: unblockPlan || null,
282
-
283
- // Enhanced proof artifact fields
284
- proof: {
285
- changeId: `c-${id}`,
286
- decision: verdict?.decision || "ALLOW",
287
- rulesTriggered,
288
- assumptionsFailed,
289
- riskScore: riskScore?.total ?? null,
290
- riskLevel: riskScore?.level || null,
291
- riskFactors: riskScore?.reasons || [],
292
- simulationResult: simulationResult ? {
293
- passed: simulationResult.passed,
294
- errorCount: simulationResult.errors?.length || 0,
295
- warningCount: simulationResult.warnings?.length || 0,
296
- errors: (simulationResult.errors || []).slice(0, 5).map(e => e.message || e),
297
- warnings: (simulationResult.warnings || []).slice(0, 5).map(w => w.message || w),
298
- } : null,
299
- criticVerdict: criticVerdict ? {
300
- verdict: criticVerdict.verdict,
301
- confidence: criticVerdict.confidence,
302
- reasoning: criticVerdict.reasoning || [],
303
- violations: criticVerdict.violations || [],
304
- } : null,
305
- overrideUsed: override?.used || false,
306
- overrideBy: override?.by || null,
307
- overrideReason: override?.reason || null,
308
- overrideTimestamp: override?.timestamp || null,
309
- },
310
-
311
- // Structured proposal (if provided)
312
- proposal: proposal ? {
313
- intent: proposal.intent,
314
- summary: proposal.summary,
315
- confidence: proposal.confidence,
316
- assumptions: proposal.assumptions,
317
- filesTouched: proposal.filesTouched,
318
- operationCount: proposal.operations?.length || 0,
319
- } : null,
320
-
321
- // Metadata
322
- metadata: {
323
- totalFiles: files.length,
324
- totalLines: files.reduce((sum, f) => sum + f.linesChanged, 0),
325
- policyVersion: policy?.version || "unknown",
326
- policyProfile: policy?.profile || "unknown",
327
- policyMode: policy?.mode || "unknown",
328
- domains: [...new Set(files.map(f => f.domain))],
329
- }
330
- };
331
-
332
- return packet;
333
- }
334
-
335
- /**
336
- * Calculate number of lines changed from diff
337
- * @param {object} diff - Diff object
338
- * @returns {number} Number of lines changed
339
- */
340
- function calculateLinesChanged(diff) {
341
- if (!diff || !diff.unified) return 0;
342
- return diff.unified
343
- .split('\n')
344
- .filter(line => line.startsWith('+') || line.startsWith('-'))
345
- .length;
346
- }
347
-
348
- /**
349
- * Classify file domain from path
350
- * @param {string} filePath - File path
351
- * @returns {string} Domain classification
352
- */
353
- function classifyFileDomain(filePath) {
354
- const s = filePath.toLowerCase();
355
- if (s.includes("auth")) return "auth";
356
- if (s.includes("stripe") || s.includes("payment")) return "payments";
357
- if (s.includes("routes") || s.includes("router") || s.includes("api")) return "routes";
358
- if (s.includes("schema") || s.includes("contract") || s.includes("openapi")) return "contracts";
359
- if (s.includes("ui") || s.includes("components") || s.includes("pages")) return "ui";
360
- return "general";
361
- }
362
-
363
- /**
364
- * Build a standalone proof artifact for compliance
365
- * @param {object} params - Proof parameters
366
- * @returns {ProofArtifact} Proof artifact
367
- */
368
- function buildProofArtifact({
369
- changeId,
370
- decision,
371
- rulesTriggered = [],
372
- assumptionsFailed = [],
373
- riskScore = null,
374
- simulationResult = null,
375
- criticVerdict = null,
376
- override = null,
377
- }) {
378
- const timestamp = new Date().toISOString();
379
-
380
- return {
381
- changeId: changeId || `c-${crypto.randomBytes(8).toString("hex")}`,
382
- decision: decision || "BLOCK",
383
- rulesTriggered,
384
- assumptionsFailed,
385
- riskScore: riskScore?.total ?? null,
386
- riskLevel: riskScore?.level || "UNKNOWN",
387
- riskFactors: riskScore?.reasons || [],
388
- simulationResult: simulationResult ? {
389
- passed: simulationResult.passed,
390
- errorCount: simulationResult.errors?.length || 0,
391
- warningCount: simulationResult.warnings?.length || 0,
392
- brokenImports: (simulationResult.errors || [])
393
- .filter(e => e.type === "broken_import" || e.type === "unresolved_import")
394
- .map(e => e.import),
395
- } : null,
396
- criticVerdict: criticVerdict ? {
397
- verdict: criticVerdict.verdict,
398
- confidence: criticVerdict.confidence,
399
- reasoning: criticVerdict.reasoning || [],
400
- } : null,
401
- timestamp,
402
- overrideUsed: override?.used || false,
403
- overrideBy: override?.by || null,
404
- overrideReason: override?.reason || null,
405
- };
406
- }
407
-
408
- /**
409
- * Extract proof artifact from a change packet
410
- * @param {object} packet - Change packet
411
- * @returns {ProofArtifact} Proof artifact
412
- */
413
- function extractProofArtifact(packet) {
414
- if (packet.proof) {
415
- return {
416
- ...packet.proof,
417
- timestamp: packet.timestamp,
418
- };
419
- }
420
-
421
- // Build from legacy packet format
422
- return {
423
- changeId: `c-${packet.id}`,
424
- decision: packet.verdict?.decision || "UNKNOWN",
425
- rulesTriggered: (packet.verdict?.violations || []).map(v => v.rule || v.type),
426
- assumptionsFailed: packet.evidence
427
- ?.filter(e => e.status === "UNPROVEN")
428
- .map(e => e.claim?.key) || [],
429
- riskScore: null,
430
- riskLevel: "UNKNOWN",
431
- simulationResult: null,
432
- criticVerdict: null,
433
- timestamp: packet.timestamp,
434
- overrideUsed: false,
435
- overrideBy: null,
436
- overrideReason: null,
437
- };
438
- }
439
-
440
- /**
441
- * Format proof artifact for display
442
- * @param {ProofArtifact} proof - Proof artifact
443
- * @returns {string} Formatted string
444
- */
445
- function formatProofArtifact(proof) {
446
- const lines = [
447
- `Change ID: ${proof.changeId}`,
448
- `Decision: ${proof.decision}`,
449
- `Timestamp: ${proof.timestamp}`,
450
- "",
451
- ];
452
-
453
- if (proof.riskScore !== null) {
454
- lines.push(`Risk Score: ${proof.riskScore} (${proof.riskLevel})`);
455
- }
456
-
457
- if (proof.rulesTriggered.length > 0) {
458
- lines.push(`Rules Triggered: ${proof.rulesTriggered.join(", ")}`);
459
- }
460
-
461
- if (proof.assumptionsFailed.length > 0) {
462
- lines.push(`Assumptions Failed: ${proof.assumptionsFailed.join(", ")}`);
463
- }
464
-
465
- if (proof.simulationResult) {
466
- lines.push(`Simulation: ${proof.simulationResult.passed ? "PASSED" : "FAILED"} (${proof.simulationResult.errorCount} errors)`);
467
- }
468
-
469
- if (proof.criticVerdict) {
470
- lines.push(`Critic: ${proof.criticVerdict.verdict} (${(proof.criticVerdict.confidence * 100).toFixed(0)}% confidence)`);
471
- }
472
-
473
- if (proof.overrideUsed) {
474
- lines.push(`Override: Used by ${proof.overrideBy} - ${proof.overrideReason}`);
475
- }
476
-
477
- return lines.join("\n");
478
- }
479
-
480
- module.exports = {
481
- buildChangePacket,
482
- buildMultiFileChangePacket,
483
- buildProofArtifact,
484
- extractProofArtifact,
485
- formatProofArtifact,
486
- calculateLinesChanged,
487
- classifyFileDomain
488
- };
@@ -1,228 +0,0 @@
1
- {
2
- "$schema": "http://json-schema.org/draft-07/schema#",
3
- "type": "object",
4
- "required": ["id", "timestamp", "agentId", "intent", "files", "claims", "verdict"],
5
- "properties": {
6
- "id": {
7
- "type": "string",
8
- "description": "Unique packet ID (hash-based)"
9
- },
10
- "timestamp": {
11
- "type": "string",
12
- "format": "date-time",
13
- "description": "ISO timestamp of the change"
14
- },
15
- "agentId": {
16
- "type": "string",
17
- "description": "Identifier for the AI agent (e.g., 'cursor', 'windsurf', 'copilot')"
18
- },
19
- "intent": {
20
- "type": "string",
21
- "description": "Agent's stated intent for the change"
22
- },
23
- "diff": {
24
- "type": "object",
25
- "properties": {
26
- "before": {
27
- "type": "string",
28
- "description": "File content before change"
29
- },
30
- "after": {
31
- "type": "string",
32
- "description": "File content after change"
33
- },
34
- "unified": {
35
- "type": "string",
36
- "description": "Unified diff format"
37
- }
38
- }
39
- },
40
- "files": {
41
- "type": "array",
42
- "items": {
43
- "type": "object",
44
- "required": ["path", "linesChanged"],
45
- "properties": {
46
- "path": {
47
- "type": "string",
48
- "description": "Relative file path"
49
- },
50
- "linesChanged": {
51
- "type": "number",
52
- "description": "Number of lines changed"
53
- },
54
- "domain": {
55
- "type": "string",
56
- "enum": ["auth", "payments", "routes", "contracts", "ui", "general"],
57
- "description": "File domain classification"
58
- }
59
- }
60
- },
61
- "description": "List of changed files"
62
- },
63
- "claims": {
64
- "type": "array",
65
- "items": {
66
- "type": "object",
67
- "required": ["type", "value", "criticality"],
68
- "properties": {
69
- "type": {
70
- "type": "string",
71
- "enum": ["route", "env_used", "auth_boundary", "data_contract", "http_call", "ui_success_claim", "side_effect"],
72
- "description": "Claim type"
73
- },
74
- "value": {
75
- "type": "string",
76
- "description": "Claim value (e.g., route path, env var name)"
77
- },
78
- "criticality": {
79
- "type": "string",
80
- "enum": ["hard", "soft"],
81
- "description": "Claim criticality"
82
- },
83
- "pointer": {
84
- "type": "string",
85
- "description": "File:line pointer (e.g., 'file.ts:42-45')"
86
- },
87
- "reason": {
88
- "type": "string",
89
- "description": "Reason for claim extraction"
90
- },
91
- "file": {
92
- "type": "string",
93
- "description": "File where claim was found"
94
- },
95
- "domain": {
96
- "type": "string",
97
- "enum": ["auth", "payments", "routes", "contracts", "ui", "general"]
98
- }
99
- }
100
- },
101
- "description": "Extracted claims from the change"
102
- },
103
- "evidence": {
104
- "type": "array",
105
- "items": {
106
- "type": "object",
107
- "required": ["claimId", "result"],
108
- "properties": {
109
- "claimId": {
110
- "type": "string",
111
- "description": "Reference to claim in claims array"
112
- },
113
- "result": {
114
- "type": "string",
115
- "enum": ["PROVEN", "UNPROVEN", "CONTRADICTS"],
116
- "description": "Evidence resolution result"
117
- },
118
- "sources": {
119
- "type": "array",
120
- "items": {
121
- "type": "object",
122
- "properties": {
123
- "type": {
124
- "type": "string",
125
- "enum": ["truthpack.routes", "truthpack.env", "truthpack.auth", "truthpack.contracts", "repo.search"]
126
- },
127
- "pointer": {
128
- "type": "string"
129
- },
130
- "confidence": {
131
- "type": "number",
132
- "minimum": 0,
133
- "maximum": 1
134
- }
135
- }
136
- }
137
- }
138
- }
139
- },
140
- "description": "Evidence resolution results"
141
- },
142
- "verdict": {
143
- "type": "object",
144
- "required": ["decision", "violations"],
145
- "properties": {
146
- "decision": {
147
- "type": "string",
148
- "enum": ["ALLOW", "WARN", "BLOCK"],
149
- "description": "Final verdict"
150
- },
151
- "violations": {
152
- "type": "array",
153
- "items": {
154
- "type": "object",
155
- "required": ["rule", "severity", "message"],
156
- "properties": {
157
- "rule": {
158
- "type": "string",
159
- "description": "Rule ID that was violated"
160
- },
161
- "severity": {
162
- "type": "string",
163
- "enum": ["allow", "warn", "block"]
164
- },
165
- "message": {
166
- "type": "string",
167
- "description": "Violation message"
168
- },
169
- "claimId": {
170
- "type": "string",
171
- "description": "Related claim ID"
172
- }
173
- }
174
- }
175
- },
176
- "message": {
177
- "type": "string",
178
- "description": "Human-readable verdict message"
179
- }
180
- }
181
- },
182
- "unblockPlan": {
183
- "type": "object",
184
- "properties": {
185
- "steps": {
186
- "type": "array",
187
- "items": {
188
- "type": "object",
189
- "required": ["action", "file", "description"],
190
- "properties": {
191
- "action": {
192
- "type": "string",
193
- "enum": ["add", "modify", "create"]
194
- },
195
- "file": {
196
- "type": "string"
197
- },
198
- "line": {
199
- "type": "number"
200
- },
201
- "description": {
202
- "type": "string"
203
- }
204
- }
205
- }
206
- }
207
- },
208
- "description": "Plan to unblock if verdict is BLOCK"
209
- },
210
- "metadata": {
211
- "type": "object",
212
- "properties": {
213
- "totalFiles": {
214
- "type": "number"
215
- },
216
- "totalLines": {
217
- "type": "number"
218
- },
219
- "policyVersion": {
220
- "type": "string"
221
- },
222
- "policyProfile": {
223
- "type": "string"
224
- }
225
- }
226
- }
227
- }
228
- }