@quantracode/vibecheck 0.0.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.
- package/LICENSE +21 -0
- package/README.md +839 -0
- package/dist/__tests__/cli.test.d.ts +2 -0
- package/dist/__tests__/cli.test.d.ts.map +1 -0
- package/dist/__tests__/cli.test.js +243 -0
- package/dist/__tests__/fixtures/safe-app/app/api/users/route.js +36 -0
- package/dist/__tests__/fixtures/vulnerable-app/app/api/users/route.js +28 -0
- package/dist/__tests__/fixtures/vulnerable-app/lib/config.d.ts +4 -0
- package/dist/__tests__/fixtures/vulnerable-app/lib/config.d.ts.map +1 -0
- package/dist/__tests__/fixtures/vulnerable-app/lib/config.js +6 -0
- package/dist/__tests__/scanners/env-config.test.d.ts +2 -0
- package/dist/__tests__/scanners/env-config.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/env-config.test.js +142 -0
- package/dist/__tests__/scanners/nextjs-middleware.test.d.ts +2 -0
- package/dist/__tests__/scanners/nextjs-middleware.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/nextjs-middleware.test.js +193 -0
- package/dist/__tests__/scanners/scanner-packs.test.d.ts +2 -0
- package/dist/__tests__/scanners/scanner-packs.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/scanner-packs.test.js +126 -0
- package/dist/__tests__/scanners/unused-security-imports.test.d.ts +2 -0
- package/dist/__tests__/scanners/unused-security-imports.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/unused-security-imports.test.js +145 -0
- package/dist/commands/demo-artifact.d.ts +7 -0
- package/dist/commands/demo-artifact.d.ts.map +1 -0
- package/dist/commands/demo-artifact.js +322 -0
- package/dist/commands/evaluate.d.ts +30 -0
- package/dist/commands/evaluate.d.ts.map +1 -0
- package/dist/commands/evaluate.js +258 -0
- package/dist/commands/explain.d.ts +12 -0
- package/dist/commands/explain.d.ts.map +1 -0
- package/dist/commands/explain.js +214 -0
- package/dist/commands/index.d.ts +7 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +6 -0
- package/dist/commands/intent.d.ts +21 -0
- package/dist/commands/intent.d.ts.map +1 -0
- package/dist/commands/intent.js +192 -0
- package/dist/commands/scan.d.ts +44 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +497 -0
- package/dist/commands/waivers.d.ts +30 -0
- package/dist/commands/waivers.d.ts.map +1 -0
- package/dist/commands/waivers.js +249 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/phase3/index.d.ts +11 -0
- package/dist/phase3/index.d.ts.map +1 -0
- package/dist/phase3/index.js +12 -0
- package/dist/phase3/intent-miner.d.ts +32 -0
- package/dist/phase3/intent-miner.d.ts.map +1 -0
- package/dist/phase3/intent-miner.js +323 -0
- package/dist/phase3/proof-trace-builder.d.ts +42 -0
- package/dist/phase3/proof-trace-builder.d.ts.map +1 -0
- package/dist/phase3/proof-trace-builder.js +441 -0
- package/dist/phase3/scanners/auth-by-ui-server-gap.d.ts +15 -0
- package/dist/phase3/scanners/auth-by-ui-server-gap.d.ts.map +1 -0
- package/dist/phase3/scanners/auth-by-ui-server-gap.js +237 -0
- package/dist/phase3/scanners/comment-claim-unproven.d.ts +14 -0
- package/dist/phase3/scanners/comment-claim-unproven.d.ts.map +1 -0
- package/dist/phase3/scanners/comment-claim-unproven.js +161 -0
- package/dist/phase3/scanners/index.d.ts +31 -0
- package/dist/phase3/scanners/index.d.ts.map +1 -0
- package/dist/phase3/scanners/index.js +40 -0
- package/dist/phase3/scanners/middleware-assumed-not-matching.d.ts +14 -0
- package/dist/phase3/scanners/middleware-assumed-not-matching.d.ts.map +1 -0
- package/dist/phase3/scanners/middleware-assumed-not-matching.js +172 -0
- package/dist/phase3/scanners/validation-claimed-missing.d.ts +15 -0
- package/dist/phase3/scanners/validation-claimed-missing.d.ts.map +1 -0
- package/dist/phase3/scanners/validation-claimed-missing.js +204 -0
- package/dist/scanners/abuse/compute-abuse.d.ts +20 -0
- package/dist/scanners/abuse/compute-abuse.d.ts.map +1 -0
- package/dist/scanners/abuse/compute-abuse.js +509 -0
- package/dist/scanners/abuse/index.d.ts +12 -0
- package/dist/scanners/abuse/index.d.ts.map +1 -0
- package/dist/scanners/abuse/index.js +15 -0
- package/dist/scanners/auth/index.d.ts +5 -0
- package/dist/scanners/auth/index.d.ts.map +1 -0
- package/dist/scanners/auth/index.js +10 -0
- package/dist/scanners/auth/middleware-gap.d.ts +22 -0
- package/dist/scanners/auth/middleware-gap.d.ts.map +1 -0
- package/dist/scanners/auth/middleware-gap.js +203 -0
- package/dist/scanners/auth/unprotected-api-route.d.ts +12 -0
- package/dist/scanners/auth/unprotected-api-route.d.ts.map +1 -0
- package/dist/scanners/auth/unprotected-api-route.js +126 -0
- package/dist/scanners/config/index.d.ts +5 -0
- package/dist/scanners/config/index.d.ts.map +1 -0
- package/dist/scanners/config/index.js +10 -0
- package/dist/scanners/config/insecure-defaults.d.ts +12 -0
- package/dist/scanners/config/insecure-defaults.d.ts.map +1 -0
- package/dist/scanners/config/insecure-defaults.js +77 -0
- package/dist/scanners/config/undocumented-env.d.ts +24 -0
- package/dist/scanners/config/undocumented-env.d.ts.map +1 -0
- package/dist/scanners/config/undocumented-env.js +159 -0
- package/dist/scanners/crypto/index.d.ts +6 -0
- package/dist/scanners/crypto/index.d.ts.map +1 -0
- package/dist/scanners/crypto/index.js +11 -0
- package/dist/scanners/crypto/jwt-decode-unverified.d.ts +14 -0
- package/dist/scanners/crypto/jwt-decode-unverified.d.ts.map +1 -0
- package/dist/scanners/crypto/jwt-decode-unverified.js +87 -0
- package/dist/scanners/crypto/math-random-tokens.d.ts +13 -0
- package/dist/scanners/crypto/math-random-tokens.d.ts.map +1 -0
- package/dist/scanners/crypto/math-random-tokens.js +80 -0
- package/dist/scanners/crypto/weak-hashing.d.ts +11 -0
- package/dist/scanners/crypto/weak-hashing.d.ts.map +1 -0
- package/dist/scanners/crypto/weak-hashing.js +95 -0
- package/dist/scanners/env-config.d.ts +24 -0
- package/dist/scanners/env-config.d.ts.map +1 -0
- package/dist/scanners/env-config.js +164 -0
- package/dist/scanners/hallucinations/index.d.ts +4 -0
- package/dist/scanners/hallucinations/index.d.ts.map +1 -0
- package/dist/scanners/hallucinations/index.js +8 -0
- package/dist/scanners/hallucinations/unused-security-imports.d.ts +36 -0
- package/dist/scanners/hallucinations/unused-security-imports.d.ts.map +1 -0
- package/dist/scanners/hallucinations/unused-security-imports.js +309 -0
- package/dist/scanners/helpers/ast-helpers.d.ts +6 -0
- package/dist/scanners/helpers/ast-helpers.d.ts.map +1 -0
- package/dist/scanners/helpers/ast-helpers.js +945 -0
- package/dist/scanners/helpers/context-builder.d.ts +17 -0
- package/dist/scanners/helpers/context-builder.d.ts.map +1 -0
- package/dist/scanners/helpers/context-builder.js +148 -0
- package/dist/scanners/helpers/index.d.ts +3 -0
- package/dist/scanners/helpers/index.d.ts.map +1 -0
- package/dist/scanners/helpers/index.js +2 -0
- package/dist/scanners/index.d.ts +30 -0
- package/dist/scanners/index.d.ts.map +1 -0
- package/dist/scanners/index.js +102 -0
- package/dist/scanners/middleware/index.d.ts +4 -0
- package/dist/scanners/middleware/index.d.ts.map +1 -0
- package/dist/scanners/middleware/index.js +7 -0
- package/dist/scanners/middleware/missing-rate-limit.d.ts +13 -0
- package/dist/scanners/middleware/missing-rate-limit.d.ts.map +1 -0
- package/dist/scanners/middleware/missing-rate-limit.js +140 -0
- package/dist/scanners/network/cors-misconfiguration.d.ts +14 -0
- package/dist/scanners/network/cors-misconfiguration.d.ts.map +1 -0
- package/dist/scanners/network/cors-misconfiguration.js +89 -0
- package/dist/scanners/network/index.d.ts +7 -0
- package/dist/scanners/network/index.d.ts.map +1 -0
- package/dist/scanners/network/index.js +18 -0
- package/dist/scanners/network/missing-timeout.d.ts +15 -0
- package/dist/scanners/network/missing-timeout.d.ts.map +1 -0
- package/dist/scanners/network/missing-timeout.js +93 -0
- package/dist/scanners/network/open-redirect.d.ts +15 -0
- package/dist/scanners/network/open-redirect.d.ts.map +1 -0
- package/dist/scanners/network/open-redirect.js +88 -0
- package/dist/scanners/network/ssrf-prone-fetch.d.ts +12 -0
- package/dist/scanners/network/ssrf-prone-fetch.d.ts.map +1 -0
- package/dist/scanners/network/ssrf-prone-fetch.js +90 -0
- package/dist/scanners/nextjs-middleware.d.ts +26 -0
- package/dist/scanners/nextjs-middleware.d.ts.map +1 -0
- package/dist/scanners/nextjs-middleware.js +246 -0
- package/dist/scanners/privacy/debug-flags.d.ts +13 -0
- package/dist/scanners/privacy/debug-flags.d.ts.map +1 -0
- package/dist/scanners/privacy/debug-flags.js +124 -0
- package/dist/scanners/privacy/index.d.ts +6 -0
- package/dist/scanners/privacy/index.d.ts.map +1 -0
- package/dist/scanners/privacy/index.js +11 -0
- package/dist/scanners/privacy/over-broad-response.d.ts +15 -0
- package/dist/scanners/privacy/over-broad-response.d.ts.map +1 -0
- package/dist/scanners/privacy/over-broad-response.js +109 -0
- package/dist/scanners/privacy/sensitive-logging.d.ts +11 -0
- package/dist/scanners/privacy/sensitive-logging.d.ts.map +1 -0
- package/dist/scanners/privacy/sensitive-logging.js +78 -0
- package/dist/scanners/types.d.ts +456 -0
- package/dist/scanners/types.d.ts.map +1 -0
- package/dist/scanners/types.js +16 -0
- package/dist/scanners/unused-security-imports.d.ts +34 -0
- package/dist/scanners/unused-security-imports.d.ts.map +1 -0
- package/dist/scanners/unused-security-imports.js +206 -0
- package/dist/scanners/uploads/index.d.ts +5 -0
- package/dist/scanners/uploads/index.d.ts.map +1 -0
- package/dist/scanners/uploads/index.js +9 -0
- package/dist/scanners/uploads/missing-constraints.d.ts +15 -0
- package/dist/scanners/uploads/missing-constraints.d.ts.map +1 -0
- package/dist/scanners/uploads/missing-constraints.js +109 -0
- package/dist/scanners/uploads/public-path.d.ts +11 -0
- package/dist/scanners/uploads/public-path.d.ts.map +1 -0
- package/dist/scanners/uploads/public-path.js +87 -0
- package/dist/scanners/validation/client-side-only.d.ts +14 -0
- package/dist/scanners/validation/client-side-only.d.ts.map +1 -0
- package/dist/scanners/validation/client-side-only.js +140 -0
- package/dist/scanners/validation/ignored-validation.d.ts +12 -0
- package/dist/scanners/validation/ignored-validation.d.ts.map +1 -0
- package/dist/scanners/validation/ignored-validation.js +119 -0
- package/dist/scanners/validation/index.d.ts +5 -0
- package/dist/scanners/validation/index.d.ts.map +1 -0
- package/dist/scanners/validation/index.js +9 -0
- package/dist/utils/exclude-patterns.d.ts +35 -0
- package/dist/utils/exclude-patterns.d.ts.map +1 -0
- package/dist/utils/exclude-patterns.js +78 -0
- package/dist/utils/file-utils.d.ts +37 -0
- package/dist/utils/file-utils.d.ts.map +1 -0
- package/dist/utils/file-utils.js +77 -0
- package/dist/utils/fingerprint.d.ts +25 -0
- package/dist/utils/fingerprint.d.ts.map +1 -0
- package/dist/utils/fingerprint.js +28 -0
- package/dist/utils/git-info.d.ts +14 -0
- package/dist/utils/git-info.d.ts.map +1 -0
- package/dist/utils/git-info.js +55 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/progress.d.ts +42 -0
- package/dist/utils/progress.d.ts.map +1 -0
- package/dist/utils/progress.js +165 -0
- package/dist/utils/sarif-formatter.d.ts +92 -0
- package/dist/utils/sarif-formatter.d.ts.map +1 -0
- package/dist/utils/sarif-formatter.js +172 -0
- package/package.json +66 -0
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Intent Command
|
|
3
|
+
*
|
|
4
|
+
* Generates a security intent map baseline for the codebase.
|
|
5
|
+
* Useful for tracking drift over time.
|
|
6
|
+
*/
|
|
7
|
+
import path from "node:path";
|
|
8
|
+
import { ARTIFACT_VERSION } from "@vibecheck/schema";
|
|
9
|
+
import { writeFileSync, resolvePath } from "../utils/file-utils.js";
|
|
10
|
+
import { hashPath } from "../utils/fingerprint.js";
|
|
11
|
+
import { getGitInfo, getRepoName } from "../utils/git-info.js";
|
|
12
|
+
import { buildScanContext } from "../scanners/index.js";
|
|
13
|
+
import { buildRouteMap, buildMiddlewareMap, buildAllProofTraces, calculateCoverage, mineAllIntentClaims, } from "../phase3/index.js";
|
|
14
|
+
/**
|
|
15
|
+
* Execute the intent command
|
|
16
|
+
*/
|
|
17
|
+
export async function executeIntent(targetDir, options) {
|
|
18
|
+
const absoluteTarget = resolvePath(targetDir);
|
|
19
|
+
console.log(`Mining intent map: ${absoluteTarget}`);
|
|
20
|
+
const startTime = Date.now();
|
|
21
|
+
// Build scan context
|
|
22
|
+
console.log("Building scan context...");
|
|
23
|
+
const context = await buildScanContext(absoluteTarget);
|
|
24
|
+
console.log(`Found ${context.fileIndex.allSourceFiles.length} source files`);
|
|
25
|
+
// Build Phase 3 maps
|
|
26
|
+
console.log("\nBuilding route map...");
|
|
27
|
+
const routeMap = buildRouteMap(context);
|
|
28
|
+
console.log(` Found ${routeMap.length} routes`);
|
|
29
|
+
console.log("Building middleware map...");
|
|
30
|
+
const middlewareMap = buildMiddlewareMap(context);
|
|
31
|
+
console.log(` Found ${middlewareMap.length} middleware configurations`);
|
|
32
|
+
console.log("Mining intent claims...");
|
|
33
|
+
const intentMap = mineAllIntentClaims(context, routeMap);
|
|
34
|
+
console.log(` Found ${intentMap.length} intent claims`);
|
|
35
|
+
console.log("Building proof traces...");
|
|
36
|
+
const proofTraces = buildAllProofTraces(context, routeMap);
|
|
37
|
+
console.log(` Built ${proofTraces.size} proof traces`);
|
|
38
|
+
console.log("Calculating coverage...");
|
|
39
|
+
const coverage = calculateCoverage(routeMap, proofTraces, middlewareMap);
|
|
40
|
+
const endTime = Date.now();
|
|
41
|
+
console.log(`\nCompleted in ${endTime - startTime}ms`);
|
|
42
|
+
// Create artifact
|
|
43
|
+
const artifact = createIntentArtifact(routeMap, middlewareMap, intentMap, proofTraces, coverage, absoluteTarget, options.repoName);
|
|
44
|
+
// Determine output path
|
|
45
|
+
let outputPath = options.out;
|
|
46
|
+
if (!path.isAbsolute(outputPath)) {
|
|
47
|
+
outputPath = resolvePath(absoluteTarget, outputPath);
|
|
48
|
+
}
|
|
49
|
+
// Write artifact
|
|
50
|
+
if (options.format === "json") {
|
|
51
|
+
writeFileSync(outputPath, JSON.stringify(artifact, null, 2));
|
|
52
|
+
console.log(`\nIntent map written to: ${outputPath}`);
|
|
53
|
+
}
|
|
54
|
+
// Print summary
|
|
55
|
+
printIntentSummary(artifact);
|
|
56
|
+
return 0;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Create intent map artifact
|
|
60
|
+
*/
|
|
61
|
+
function createIntentArtifact(routeMap, middlewareMap, intentMap, proofTraces, coverage, targetDir, repoName) {
|
|
62
|
+
const gitInfo = getGitInfo(targetDir);
|
|
63
|
+
const name = repoName ?? getRepoName(targetDir);
|
|
64
|
+
// Convert proofTraces Map to schema format
|
|
65
|
+
const proofTracesRecord = {};
|
|
66
|
+
for (const [key, value] of proofTraces) {
|
|
67
|
+
proofTracesRecord[key] = {
|
|
68
|
+
summary: value.authProven
|
|
69
|
+
? "Auth proven"
|
|
70
|
+
: value.middlewareCovered
|
|
71
|
+
? "Protected by middleware"
|
|
72
|
+
: "No protection proven",
|
|
73
|
+
nodes: value.steps.map((step) => ({
|
|
74
|
+
kind: "handler",
|
|
75
|
+
label: step.label,
|
|
76
|
+
file: step.file,
|
|
77
|
+
line: step.line,
|
|
78
|
+
})),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
// Build middleware coverage
|
|
82
|
+
const allMatchers = middlewareMap.flatMap((m) => m.matchers);
|
|
83
|
+
const middlewareCoverage = routeMap.map((route) => {
|
|
84
|
+
const isRouteCovered = allMatchers.some((matcher) => {
|
|
85
|
+
const pattern = matcher.replace(/\*/g, ".*").replace(/\/:path\*/g, "/.*");
|
|
86
|
+
try {
|
|
87
|
+
return new RegExp(`^${pattern}`).test(route.path);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return route.path.startsWith(matcher.replace(/\/:path\*$/, ""));
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
return {
|
|
94
|
+
routeId: route.routeId,
|
|
95
|
+
covered: isRouteCovered,
|
|
96
|
+
};
|
|
97
|
+
});
|
|
98
|
+
// Calculate summary stats
|
|
99
|
+
const intentsByType = {};
|
|
100
|
+
const intentsBySource = {};
|
|
101
|
+
for (const intent of intentMap) {
|
|
102
|
+
intentsByType[intent.type] = (intentsByType[intent.type] || 0) + 1;
|
|
103
|
+
intentsBySource[intent.source] = (intentsBySource[intent.source] || 0) + 1;
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
artifactVersion: ARTIFACT_VERSION,
|
|
107
|
+
generatedAt: new Date().toISOString(),
|
|
108
|
+
tool: {
|
|
109
|
+
name: "vibecheck",
|
|
110
|
+
version: "0.0.1",
|
|
111
|
+
},
|
|
112
|
+
repo: {
|
|
113
|
+
name,
|
|
114
|
+
rootPathHash: hashPath(targetDir),
|
|
115
|
+
git: gitInfo,
|
|
116
|
+
},
|
|
117
|
+
routeMap: { routes: routeMap },
|
|
118
|
+
middlewareMap: {
|
|
119
|
+
middlewareFile: middlewareMap[0]?.file,
|
|
120
|
+
matcher: allMatchers,
|
|
121
|
+
coverage: middlewareCoverage,
|
|
122
|
+
},
|
|
123
|
+
intentMap: { intents: intentMap },
|
|
124
|
+
proofTraces: proofTracesRecord,
|
|
125
|
+
coverage,
|
|
126
|
+
summary: {
|
|
127
|
+
totalRoutes: routeMap.length,
|
|
128
|
+
totalIntents: intentMap.length,
|
|
129
|
+
authCoveragePercent: Math.round(coverage.authCoverage * 100),
|
|
130
|
+
validationCoveragePercent: Math.round(coverage.validationCoverage * 100),
|
|
131
|
+
middlewareCoveragePercent: Math.round(coverage.middlewareCoverage * 100),
|
|
132
|
+
intentsByType,
|
|
133
|
+
intentsBySource,
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Print intent map summary
|
|
139
|
+
*/
|
|
140
|
+
function printIntentSummary(artifact) {
|
|
141
|
+
const { summary, coverage } = artifact;
|
|
142
|
+
console.log("\n" + "=".repeat(60));
|
|
143
|
+
console.log("VibeCheck Intent Map Generated");
|
|
144
|
+
console.log("=".repeat(60));
|
|
145
|
+
console.log(`\nRoutes discovered: ${summary.totalRoutes}`);
|
|
146
|
+
console.log(`Intent claims found: ${summary.totalIntents}`);
|
|
147
|
+
console.log("\nCoverage metrics:");
|
|
148
|
+
console.log(` Auth coverage: ${formatPercent(coverage.authCoverage)}`);
|
|
149
|
+
console.log(` Validation coverage: ${formatPercent(coverage.validationCoverage)}`);
|
|
150
|
+
console.log(` Middleware coverage: ${formatPercent(coverage.middlewareCoverage)}`);
|
|
151
|
+
if (summary.totalIntents > 0) {
|
|
152
|
+
console.log("\nIntents by type:");
|
|
153
|
+
for (const [type, count] of Object.entries(summary.intentsByType)) {
|
|
154
|
+
console.log(` ${type}: ${count}`);
|
|
155
|
+
}
|
|
156
|
+
console.log("\nIntents by source:");
|
|
157
|
+
for (const [source, count] of Object.entries(summary.intentsBySource)) {
|
|
158
|
+
console.log(` ${source}: ${count}`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
console.log("");
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Format percentage with color
|
|
165
|
+
*/
|
|
166
|
+
function formatPercent(value) {
|
|
167
|
+
const percent = Math.round(value * 100);
|
|
168
|
+
let color = "\x1b[32m"; // Green
|
|
169
|
+
if (percent < 50) {
|
|
170
|
+
color = "\x1b[31m"; // Red
|
|
171
|
+
}
|
|
172
|
+
else if (percent < 80) {
|
|
173
|
+
color = "\x1b[33m"; // Yellow
|
|
174
|
+
}
|
|
175
|
+
return `${color}${percent}%\x1b[0m`;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Register intent command with commander
|
|
179
|
+
*/
|
|
180
|
+
export function registerIntentCommand(program) {
|
|
181
|
+
program
|
|
182
|
+
.command("intent [target]")
|
|
183
|
+
.description("Generate security intent map baseline")
|
|
184
|
+
.option("-o, --out <path>", "Output file path", "vibecheck-artifacts/intent-map.json")
|
|
185
|
+
.option("-f, --format <format>", "Output format", "json")
|
|
186
|
+
.option("--repo-name <name>", "Override repository name")
|
|
187
|
+
.action(async (target, options) => {
|
|
188
|
+
const targetDir = target ?? process.cwd();
|
|
189
|
+
const exitCode = await executeIntent(targetDir, options);
|
|
190
|
+
process.exit(exitCode);
|
|
191
|
+
});
|
|
192
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import { type Severity } from "@vibecheck/schema";
|
|
3
|
+
/**
|
|
4
|
+
* Valid output formats
|
|
5
|
+
*/
|
|
6
|
+
export type OutputFormat = "json" | "sarif" | "both";
|
|
7
|
+
/**
|
|
8
|
+
* Valid fail-on thresholds
|
|
9
|
+
*/
|
|
10
|
+
export type FailThreshold = "off" | Severity;
|
|
11
|
+
/**
|
|
12
|
+
* Scan command options
|
|
13
|
+
*/
|
|
14
|
+
export interface ScanOptions {
|
|
15
|
+
/** Output file/directory path */
|
|
16
|
+
out: string;
|
|
17
|
+
/** Output format: json, sarif, or both */
|
|
18
|
+
format: OutputFormat;
|
|
19
|
+
/** Override repository name */
|
|
20
|
+
repoName?: string;
|
|
21
|
+
/** Fail threshold: off, info, low, medium, high, critical */
|
|
22
|
+
failOn: FailThreshold;
|
|
23
|
+
/** Only scan changed files (not implemented) */
|
|
24
|
+
changed: boolean;
|
|
25
|
+
/** Include route map in output (default: true) */
|
|
26
|
+
emitRouteMap: boolean;
|
|
27
|
+
/** Include intent claims in output (default: true) */
|
|
28
|
+
emitIntents: boolean;
|
|
29
|
+
/** Include proof traces in output (default: true) */
|
|
30
|
+
emitTraces: boolean;
|
|
31
|
+
/** Additional glob patterns to exclude */
|
|
32
|
+
exclude: string[];
|
|
33
|
+
/** Include test files in scan */
|
|
34
|
+
includeTests: boolean;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Execute the scan command
|
|
38
|
+
*/
|
|
39
|
+
export declare function executeScan(targetDir: string, options: ScanOptions): Promise<number>;
|
|
40
|
+
/**
|
|
41
|
+
* Register scan command with commander
|
|
42
|
+
*/
|
|
43
|
+
export declare function registerScanCommand(program: Command): void;
|
|
44
|
+
//# sourceMappingURL=scan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAML,KAAK,QAAQ,EACd,MAAM,mBAAmB,CAAC;AA0B3B;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAErD;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,QAAQ,CAAC;AAE7C;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,iCAAiC;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,0CAA0C;IAC1C,MAAM,EAAE,YAAY,CAAC;IACrB,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,MAAM,EAAE,aAAa,CAAC;IACtB,gDAAgD;IAChD,OAAO,EAAE,OAAO,CAAC;IACjB,kDAAkD;IAClD,YAAY,EAAE,OAAO,CAAC;IACtB,sDAAsD;IACtD,WAAW,EAAE,OAAO,CAAC;IACrB,qDAAqD;IACrD,UAAU,EAAE,OAAO,CAAC;IACpB,0CAA0C;IAC1C,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,iCAAiC;IACjC,YAAY,EAAE,OAAO,CAAC;CACvB;AA0VD;;GAEG;AACH,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,MAAM,CAAC,CAwMjB;AASD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkH1D"}
|