@vibecheckai/cli 3.2.4 → 3.2.6
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/lib/__tests__/entitlements-v2.test.js +295 -295
- package/bin/runners/lib/api-client.js +269 -0
- 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/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/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/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.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/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/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/runAgent.d.ts +5 -0
- package/bin/runners/runFirewall.d.ts +5 -0
- package/bin/runners/runFirewallHook.d.ts +5 -0
- package/bin/runners/runGuard.js +168 -168
- package/bin/runners/runScan.js +82 -0
- package/bin/runners/runTruth.d.ts +5 -0
- package/bin/vibecheck.js +45 -20
- package/mcp-server/index.js +85 -0
- package/mcp-server/lib/api-client.js +269 -0
- package/mcp-server/package.json +1 -1
- package/mcp-server/tier-auth.js +173 -113
- package/mcp-server/tools/index.js +72 -72
- package/mcp-server/vibecheck-mcp-server-3.2.0.tgz +0 -0
- package/package.json +1 -1
|
@@ -1,154 +1,154 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Replay Capsule Manager
|
|
3
|
-
* Handles saving, loading, and managing replay capsules
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
const fs = require('fs').promises;
|
|
7
|
-
const path = require('path');
|
|
8
|
-
const { v4: uuidv4 } = require('uuid');
|
|
9
|
-
const crypto = require('crypto');
|
|
10
|
-
|
|
11
|
-
class CapsuleManager {
|
|
12
|
-
constructor(basePath) {
|
|
13
|
-
this.basePath = path.join(basePath, '.vibecheck', 'replays');
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
async init() {
|
|
17
|
-
await fs.mkdir(this.basePath, { recursive: true });
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
async saveCapsule(capsule) {
|
|
21
|
-
const id = capsule.id || uuidv4();
|
|
22
|
-
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
23
|
-
const capsuleDir = path.join(this.basePath, `${timestamp}_${id}`);
|
|
24
|
-
|
|
25
|
-
await fs.mkdir(capsuleDir, { recursive: true });
|
|
26
|
-
|
|
27
|
-
// Save metadata
|
|
28
|
-
const metadata = {
|
|
29
|
-
id,
|
|
30
|
-
createdAt: new Date().toISOString(),
|
|
31
|
-
name: capsule.name || `Replay ${timestamp}`,
|
|
32
|
-
description: capsule.description || '',
|
|
33
|
-
tags: capsule.tags || [],
|
|
34
|
-
steps: capsule.steps ? capsule.steps.length : 0,
|
|
35
|
-
duration: capsule.duration || 0,
|
|
36
|
-
status: 'captured',
|
|
37
|
-
...capsule.metadata
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
// Save steps
|
|
41
|
-
const steps = capsule.steps || [];
|
|
42
|
-
|
|
43
|
-
// Generate deterministic hash for the capsule
|
|
44
|
-
const hash = crypto
|
|
45
|
-
.createHash('sha256')
|
|
46
|
-
.update(JSON.stringify({ metadata, steps }))
|
|
47
|
-
.digest('hex');
|
|
48
|
-
|
|
49
|
-
metadata.hash = hash;
|
|
50
|
-
|
|
51
|
-
await Promise.all([
|
|
52
|
-
fs.writeFile(
|
|
53
|
-
path.join(capsuleDir, 'metadata.json'),
|
|
54
|
-
JSON.stringify(metadata, null, 2),
|
|
55
|
-
'utf8'
|
|
56
|
-
),
|
|
57
|
-
fs.writeFile(
|
|
58
|
-
path.join(capsuleDir, 'steps.json'),
|
|
59
|
-
JSON.stringify(steps, null, 2),
|
|
60
|
-
'utf8'
|
|
61
|
-
)
|
|
62
|
-
]);
|
|
63
|
-
|
|
64
|
-
return { id, path: capsuleDir, metadata };
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
async loadCapsule(capsuleId) {
|
|
68
|
-
const capsules = await this.listCapsules();
|
|
69
|
-
const capsule = capsules.find(c => c.id === capsuleId || c.metadata.id === capsuleId);
|
|
70
|
-
|
|
71
|
-
if (!capsule) {
|
|
72
|
-
throw new Error(`Capsule ${capsuleId} not found`);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
const [metadata, steps] = await Promise.all([
|
|
76
|
-
fs.readFile(path.join(capsule.path, 'metadata.json'), 'utf8')
|
|
77
|
-
.then(JSON.parse),
|
|
78
|
-
fs.readFile(path.join(capsule.path, 'steps.json'), 'utf8')
|
|
79
|
-
.then(JSON.parse)
|
|
80
|
-
]);
|
|
81
|
-
|
|
82
|
-
return { metadata, steps };
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
async listCapsules() {
|
|
86
|
-
try {
|
|
87
|
-
const dirs = await fs.readdir(this.basePath, { withFileTypes: true });
|
|
88
|
-
const capsules = [];
|
|
89
|
-
|
|
90
|
-
for (const dir of dirs) {
|
|
91
|
-
if (!dir.isDirectory()) continue;
|
|
92
|
-
|
|
93
|
-
try {
|
|
94
|
-
const metadataPath = path.join(this.basePath, dir.name, 'metadata.json');
|
|
95
|
-
const metadata = JSON.parse(await fs.readFile(metadataPath, 'utf8'));
|
|
96
|
-
|
|
97
|
-
capsules.push({
|
|
98
|
-
id: metadata.id,
|
|
99
|
-
name: metadata.name,
|
|
100
|
-
path: path.join(this.basePath, dir.name),
|
|
101
|
-
metadata,
|
|
102
|
-
timestamp: new Date(metadata.createdAt).getTime()
|
|
103
|
-
});
|
|
104
|
-
} catch (err) {
|
|
105
|
-
console.error(`Error loading capsule ${dir.name}:`, err.message);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
// Sort by timestamp, newest first
|
|
110
|
-
return capsules.sort((a, b) => b.timestamp - a.timestamp);
|
|
111
|
-
} catch (err) {
|
|
112
|
-
if (err.code === 'ENOENT') {
|
|
113
|
-
return [];
|
|
114
|
-
}
|
|
115
|
-
throw err;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
async deleteCapsule(capsuleId) {
|
|
120
|
-
const capsules = await this.listCapsules();
|
|
121
|
-
const capsule = capsules.find(c => c.id === capsuleId || c.metadata.id === capsuleId);
|
|
122
|
-
|
|
123
|
-
if (!capsule) {
|
|
124
|
-
throw new Error(`Capsule ${capsuleId} not found`);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
await fs.rm(capsule.path, { recursive: true, force: true });
|
|
128
|
-
return true;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
async exportCapsule(capsuleId, outputPath) {
|
|
132
|
-
const { metadata, steps } = await this.loadCapsule(capsuleId);
|
|
133
|
-
const exportData = { metadata, steps };
|
|
134
|
-
|
|
135
|
-
await fs.writeFile(
|
|
136
|
-
outputPath,
|
|
137
|
-
JSON.stringify(exportData, null, 2),
|
|
138
|
-
'utf8'
|
|
139
|
-
);
|
|
140
|
-
|
|
141
|
-
return outputPath;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
async importCapsule(filePath) {
|
|
145
|
-
const data = JSON.parse(await fs.readFile(filePath, 'utf8'));
|
|
146
|
-
return this.saveCapsule({
|
|
147
|
-
...data.metadata,
|
|
148
|
-
steps: data.steps,
|
|
149
|
-
imported: true
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
module.exports = CapsuleManager;
|
|
1
|
+
/**
|
|
2
|
+
* Replay Capsule Manager
|
|
3
|
+
* Handles saving, loading, and managing replay capsules
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const fs = require('fs').promises;
|
|
7
|
+
const path = require('path');
|
|
8
|
+
const { v4: uuidv4 } = require('uuid');
|
|
9
|
+
const crypto = require('crypto');
|
|
10
|
+
|
|
11
|
+
class CapsuleManager {
|
|
12
|
+
constructor(basePath) {
|
|
13
|
+
this.basePath = path.join(basePath, '.vibecheck', 'replays');
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
async init() {
|
|
17
|
+
await fs.mkdir(this.basePath, { recursive: true });
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
async saveCapsule(capsule) {
|
|
21
|
+
const id = capsule.id || uuidv4();
|
|
22
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
23
|
+
const capsuleDir = path.join(this.basePath, `${timestamp}_${id}`);
|
|
24
|
+
|
|
25
|
+
await fs.mkdir(capsuleDir, { recursive: true });
|
|
26
|
+
|
|
27
|
+
// Save metadata
|
|
28
|
+
const metadata = {
|
|
29
|
+
id,
|
|
30
|
+
createdAt: new Date().toISOString(),
|
|
31
|
+
name: capsule.name || `Replay ${timestamp}`,
|
|
32
|
+
description: capsule.description || '',
|
|
33
|
+
tags: capsule.tags || [],
|
|
34
|
+
steps: capsule.steps ? capsule.steps.length : 0,
|
|
35
|
+
duration: capsule.duration || 0,
|
|
36
|
+
status: 'captured',
|
|
37
|
+
...capsule.metadata
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
// Save steps
|
|
41
|
+
const steps = capsule.steps || [];
|
|
42
|
+
|
|
43
|
+
// Generate deterministic hash for the capsule
|
|
44
|
+
const hash = crypto
|
|
45
|
+
.createHash('sha256')
|
|
46
|
+
.update(JSON.stringify({ metadata, steps }))
|
|
47
|
+
.digest('hex');
|
|
48
|
+
|
|
49
|
+
metadata.hash = hash;
|
|
50
|
+
|
|
51
|
+
await Promise.all([
|
|
52
|
+
fs.writeFile(
|
|
53
|
+
path.join(capsuleDir, 'metadata.json'),
|
|
54
|
+
JSON.stringify(metadata, null, 2),
|
|
55
|
+
'utf8'
|
|
56
|
+
),
|
|
57
|
+
fs.writeFile(
|
|
58
|
+
path.join(capsuleDir, 'steps.json'),
|
|
59
|
+
JSON.stringify(steps, null, 2),
|
|
60
|
+
'utf8'
|
|
61
|
+
)
|
|
62
|
+
]);
|
|
63
|
+
|
|
64
|
+
return { id, path: capsuleDir, metadata };
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
async loadCapsule(capsuleId) {
|
|
68
|
+
const capsules = await this.listCapsules();
|
|
69
|
+
const capsule = capsules.find(c => c.id === capsuleId || c.metadata.id === capsuleId);
|
|
70
|
+
|
|
71
|
+
if (!capsule) {
|
|
72
|
+
throw new Error(`Capsule ${capsuleId} not found`);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const [metadata, steps] = await Promise.all([
|
|
76
|
+
fs.readFile(path.join(capsule.path, 'metadata.json'), 'utf8')
|
|
77
|
+
.then(JSON.parse),
|
|
78
|
+
fs.readFile(path.join(capsule.path, 'steps.json'), 'utf8')
|
|
79
|
+
.then(JSON.parse)
|
|
80
|
+
]);
|
|
81
|
+
|
|
82
|
+
return { metadata, steps };
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
async listCapsules() {
|
|
86
|
+
try {
|
|
87
|
+
const dirs = await fs.readdir(this.basePath, { withFileTypes: true });
|
|
88
|
+
const capsules = [];
|
|
89
|
+
|
|
90
|
+
for (const dir of dirs) {
|
|
91
|
+
if (!dir.isDirectory()) continue;
|
|
92
|
+
|
|
93
|
+
try {
|
|
94
|
+
const metadataPath = path.join(this.basePath, dir.name, 'metadata.json');
|
|
95
|
+
const metadata = JSON.parse(await fs.readFile(metadataPath, 'utf8'));
|
|
96
|
+
|
|
97
|
+
capsules.push({
|
|
98
|
+
id: metadata.id,
|
|
99
|
+
name: metadata.name,
|
|
100
|
+
path: path.join(this.basePath, dir.name),
|
|
101
|
+
metadata,
|
|
102
|
+
timestamp: new Date(metadata.createdAt).getTime()
|
|
103
|
+
});
|
|
104
|
+
} catch (err) {
|
|
105
|
+
console.error(`Error loading capsule ${dir.name}:`, err.message);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Sort by timestamp, newest first
|
|
110
|
+
return capsules.sort((a, b) => b.timestamp - a.timestamp);
|
|
111
|
+
} catch (err) {
|
|
112
|
+
if (err.code === 'ENOENT') {
|
|
113
|
+
return [];
|
|
114
|
+
}
|
|
115
|
+
throw err;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
async deleteCapsule(capsuleId) {
|
|
120
|
+
const capsules = await this.listCapsules();
|
|
121
|
+
const capsule = capsules.find(c => c.id === capsuleId || c.metadata.id === capsuleId);
|
|
122
|
+
|
|
123
|
+
if (!capsule) {
|
|
124
|
+
throw new Error(`Capsule ${capsuleId} not found`);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
await fs.rm(capsule.path, { recursive: true, force: true });
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
async exportCapsule(capsuleId, outputPath) {
|
|
132
|
+
const { metadata, steps } = await this.loadCapsule(capsuleId);
|
|
133
|
+
const exportData = { metadata, steps };
|
|
134
|
+
|
|
135
|
+
await fs.writeFile(
|
|
136
|
+
outputPath,
|
|
137
|
+
JSON.stringify(exportData, null, 2),
|
|
138
|
+
'utf8'
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
return outputPath;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
async importCapsule(filePath) {
|
|
145
|
+
const data = JSON.parse(await fs.readFile(filePath, 'utf8'));
|
|
146
|
+
return this.saveCapsule({
|
|
147
|
+
...data.metadata,
|
|
148
|
+
steps: data.steps,
|
|
149
|
+
imported: true
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
module.exports = CapsuleManager;
|