@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.
Files changed (209) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +839 -0
  3. package/dist/__tests__/cli.test.d.ts +2 -0
  4. package/dist/__tests__/cli.test.d.ts.map +1 -0
  5. package/dist/__tests__/cli.test.js +243 -0
  6. package/dist/__tests__/fixtures/safe-app/app/api/users/route.js +36 -0
  7. package/dist/__tests__/fixtures/vulnerable-app/app/api/users/route.js +28 -0
  8. package/dist/__tests__/fixtures/vulnerable-app/lib/config.d.ts +4 -0
  9. package/dist/__tests__/fixtures/vulnerable-app/lib/config.d.ts.map +1 -0
  10. package/dist/__tests__/fixtures/vulnerable-app/lib/config.js +6 -0
  11. package/dist/__tests__/scanners/env-config.test.d.ts +2 -0
  12. package/dist/__tests__/scanners/env-config.test.d.ts.map +1 -0
  13. package/dist/__tests__/scanners/env-config.test.js +142 -0
  14. package/dist/__tests__/scanners/nextjs-middleware.test.d.ts +2 -0
  15. package/dist/__tests__/scanners/nextjs-middleware.test.d.ts.map +1 -0
  16. package/dist/__tests__/scanners/nextjs-middleware.test.js +193 -0
  17. package/dist/__tests__/scanners/scanner-packs.test.d.ts +2 -0
  18. package/dist/__tests__/scanners/scanner-packs.test.d.ts.map +1 -0
  19. package/dist/__tests__/scanners/scanner-packs.test.js +126 -0
  20. package/dist/__tests__/scanners/unused-security-imports.test.d.ts +2 -0
  21. package/dist/__tests__/scanners/unused-security-imports.test.d.ts.map +1 -0
  22. package/dist/__tests__/scanners/unused-security-imports.test.js +145 -0
  23. package/dist/commands/demo-artifact.d.ts +7 -0
  24. package/dist/commands/demo-artifact.d.ts.map +1 -0
  25. package/dist/commands/demo-artifact.js +322 -0
  26. package/dist/commands/evaluate.d.ts +30 -0
  27. package/dist/commands/evaluate.d.ts.map +1 -0
  28. package/dist/commands/evaluate.js +258 -0
  29. package/dist/commands/explain.d.ts +12 -0
  30. package/dist/commands/explain.d.ts.map +1 -0
  31. package/dist/commands/explain.js +214 -0
  32. package/dist/commands/index.d.ts +7 -0
  33. package/dist/commands/index.d.ts.map +1 -0
  34. package/dist/commands/index.js +6 -0
  35. package/dist/commands/intent.d.ts +21 -0
  36. package/dist/commands/intent.d.ts.map +1 -0
  37. package/dist/commands/intent.js +192 -0
  38. package/dist/commands/scan.d.ts +44 -0
  39. package/dist/commands/scan.d.ts.map +1 -0
  40. package/dist/commands/scan.js +497 -0
  41. package/dist/commands/waivers.d.ts +30 -0
  42. package/dist/commands/waivers.d.ts.map +1 -0
  43. package/dist/commands/waivers.js +249 -0
  44. package/dist/index.d.ts +3 -0
  45. package/dist/index.d.ts.map +1 -0
  46. package/dist/index.js +17 -0
  47. package/dist/phase3/index.d.ts +11 -0
  48. package/dist/phase3/index.d.ts.map +1 -0
  49. package/dist/phase3/index.js +12 -0
  50. package/dist/phase3/intent-miner.d.ts +32 -0
  51. package/dist/phase3/intent-miner.d.ts.map +1 -0
  52. package/dist/phase3/intent-miner.js +323 -0
  53. package/dist/phase3/proof-trace-builder.d.ts +42 -0
  54. package/dist/phase3/proof-trace-builder.d.ts.map +1 -0
  55. package/dist/phase3/proof-trace-builder.js +441 -0
  56. package/dist/phase3/scanners/auth-by-ui-server-gap.d.ts +15 -0
  57. package/dist/phase3/scanners/auth-by-ui-server-gap.d.ts.map +1 -0
  58. package/dist/phase3/scanners/auth-by-ui-server-gap.js +237 -0
  59. package/dist/phase3/scanners/comment-claim-unproven.d.ts +14 -0
  60. package/dist/phase3/scanners/comment-claim-unproven.d.ts.map +1 -0
  61. package/dist/phase3/scanners/comment-claim-unproven.js +161 -0
  62. package/dist/phase3/scanners/index.d.ts +31 -0
  63. package/dist/phase3/scanners/index.d.ts.map +1 -0
  64. package/dist/phase3/scanners/index.js +40 -0
  65. package/dist/phase3/scanners/middleware-assumed-not-matching.d.ts +14 -0
  66. package/dist/phase3/scanners/middleware-assumed-not-matching.d.ts.map +1 -0
  67. package/dist/phase3/scanners/middleware-assumed-not-matching.js +172 -0
  68. package/dist/phase3/scanners/validation-claimed-missing.d.ts +15 -0
  69. package/dist/phase3/scanners/validation-claimed-missing.d.ts.map +1 -0
  70. package/dist/phase3/scanners/validation-claimed-missing.js +204 -0
  71. package/dist/scanners/abuse/compute-abuse.d.ts +20 -0
  72. package/dist/scanners/abuse/compute-abuse.d.ts.map +1 -0
  73. package/dist/scanners/abuse/compute-abuse.js +509 -0
  74. package/dist/scanners/abuse/index.d.ts +12 -0
  75. package/dist/scanners/abuse/index.d.ts.map +1 -0
  76. package/dist/scanners/abuse/index.js +15 -0
  77. package/dist/scanners/auth/index.d.ts +5 -0
  78. package/dist/scanners/auth/index.d.ts.map +1 -0
  79. package/dist/scanners/auth/index.js +10 -0
  80. package/dist/scanners/auth/middleware-gap.d.ts +22 -0
  81. package/dist/scanners/auth/middleware-gap.d.ts.map +1 -0
  82. package/dist/scanners/auth/middleware-gap.js +203 -0
  83. package/dist/scanners/auth/unprotected-api-route.d.ts +12 -0
  84. package/dist/scanners/auth/unprotected-api-route.d.ts.map +1 -0
  85. package/dist/scanners/auth/unprotected-api-route.js +126 -0
  86. package/dist/scanners/config/index.d.ts +5 -0
  87. package/dist/scanners/config/index.d.ts.map +1 -0
  88. package/dist/scanners/config/index.js +10 -0
  89. package/dist/scanners/config/insecure-defaults.d.ts +12 -0
  90. package/dist/scanners/config/insecure-defaults.d.ts.map +1 -0
  91. package/dist/scanners/config/insecure-defaults.js +77 -0
  92. package/dist/scanners/config/undocumented-env.d.ts +24 -0
  93. package/dist/scanners/config/undocumented-env.d.ts.map +1 -0
  94. package/dist/scanners/config/undocumented-env.js +159 -0
  95. package/dist/scanners/crypto/index.d.ts +6 -0
  96. package/dist/scanners/crypto/index.d.ts.map +1 -0
  97. package/dist/scanners/crypto/index.js +11 -0
  98. package/dist/scanners/crypto/jwt-decode-unverified.d.ts +14 -0
  99. package/dist/scanners/crypto/jwt-decode-unverified.d.ts.map +1 -0
  100. package/dist/scanners/crypto/jwt-decode-unverified.js +87 -0
  101. package/dist/scanners/crypto/math-random-tokens.d.ts +13 -0
  102. package/dist/scanners/crypto/math-random-tokens.d.ts.map +1 -0
  103. package/dist/scanners/crypto/math-random-tokens.js +80 -0
  104. package/dist/scanners/crypto/weak-hashing.d.ts +11 -0
  105. package/dist/scanners/crypto/weak-hashing.d.ts.map +1 -0
  106. package/dist/scanners/crypto/weak-hashing.js +95 -0
  107. package/dist/scanners/env-config.d.ts +24 -0
  108. package/dist/scanners/env-config.d.ts.map +1 -0
  109. package/dist/scanners/env-config.js +164 -0
  110. package/dist/scanners/hallucinations/index.d.ts +4 -0
  111. package/dist/scanners/hallucinations/index.d.ts.map +1 -0
  112. package/dist/scanners/hallucinations/index.js +8 -0
  113. package/dist/scanners/hallucinations/unused-security-imports.d.ts +36 -0
  114. package/dist/scanners/hallucinations/unused-security-imports.d.ts.map +1 -0
  115. package/dist/scanners/hallucinations/unused-security-imports.js +309 -0
  116. package/dist/scanners/helpers/ast-helpers.d.ts +6 -0
  117. package/dist/scanners/helpers/ast-helpers.d.ts.map +1 -0
  118. package/dist/scanners/helpers/ast-helpers.js +945 -0
  119. package/dist/scanners/helpers/context-builder.d.ts +17 -0
  120. package/dist/scanners/helpers/context-builder.d.ts.map +1 -0
  121. package/dist/scanners/helpers/context-builder.js +148 -0
  122. package/dist/scanners/helpers/index.d.ts +3 -0
  123. package/dist/scanners/helpers/index.d.ts.map +1 -0
  124. package/dist/scanners/helpers/index.js +2 -0
  125. package/dist/scanners/index.d.ts +30 -0
  126. package/dist/scanners/index.d.ts.map +1 -0
  127. package/dist/scanners/index.js +102 -0
  128. package/dist/scanners/middleware/index.d.ts +4 -0
  129. package/dist/scanners/middleware/index.d.ts.map +1 -0
  130. package/dist/scanners/middleware/index.js +7 -0
  131. package/dist/scanners/middleware/missing-rate-limit.d.ts +13 -0
  132. package/dist/scanners/middleware/missing-rate-limit.d.ts.map +1 -0
  133. package/dist/scanners/middleware/missing-rate-limit.js +140 -0
  134. package/dist/scanners/network/cors-misconfiguration.d.ts +14 -0
  135. package/dist/scanners/network/cors-misconfiguration.d.ts.map +1 -0
  136. package/dist/scanners/network/cors-misconfiguration.js +89 -0
  137. package/dist/scanners/network/index.d.ts +7 -0
  138. package/dist/scanners/network/index.d.ts.map +1 -0
  139. package/dist/scanners/network/index.js +18 -0
  140. package/dist/scanners/network/missing-timeout.d.ts +15 -0
  141. package/dist/scanners/network/missing-timeout.d.ts.map +1 -0
  142. package/dist/scanners/network/missing-timeout.js +93 -0
  143. package/dist/scanners/network/open-redirect.d.ts +15 -0
  144. package/dist/scanners/network/open-redirect.d.ts.map +1 -0
  145. package/dist/scanners/network/open-redirect.js +88 -0
  146. package/dist/scanners/network/ssrf-prone-fetch.d.ts +12 -0
  147. package/dist/scanners/network/ssrf-prone-fetch.d.ts.map +1 -0
  148. package/dist/scanners/network/ssrf-prone-fetch.js +90 -0
  149. package/dist/scanners/nextjs-middleware.d.ts +26 -0
  150. package/dist/scanners/nextjs-middleware.d.ts.map +1 -0
  151. package/dist/scanners/nextjs-middleware.js +246 -0
  152. package/dist/scanners/privacy/debug-flags.d.ts +13 -0
  153. package/dist/scanners/privacy/debug-flags.d.ts.map +1 -0
  154. package/dist/scanners/privacy/debug-flags.js +124 -0
  155. package/dist/scanners/privacy/index.d.ts +6 -0
  156. package/dist/scanners/privacy/index.d.ts.map +1 -0
  157. package/dist/scanners/privacy/index.js +11 -0
  158. package/dist/scanners/privacy/over-broad-response.d.ts +15 -0
  159. package/dist/scanners/privacy/over-broad-response.d.ts.map +1 -0
  160. package/dist/scanners/privacy/over-broad-response.js +109 -0
  161. package/dist/scanners/privacy/sensitive-logging.d.ts +11 -0
  162. package/dist/scanners/privacy/sensitive-logging.d.ts.map +1 -0
  163. package/dist/scanners/privacy/sensitive-logging.js +78 -0
  164. package/dist/scanners/types.d.ts +456 -0
  165. package/dist/scanners/types.d.ts.map +1 -0
  166. package/dist/scanners/types.js +16 -0
  167. package/dist/scanners/unused-security-imports.d.ts +34 -0
  168. package/dist/scanners/unused-security-imports.d.ts.map +1 -0
  169. package/dist/scanners/unused-security-imports.js +206 -0
  170. package/dist/scanners/uploads/index.d.ts +5 -0
  171. package/dist/scanners/uploads/index.d.ts.map +1 -0
  172. package/dist/scanners/uploads/index.js +9 -0
  173. package/dist/scanners/uploads/missing-constraints.d.ts +15 -0
  174. package/dist/scanners/uploads/missing-constraints.d.ts.map +1 -0
  175. package/dist/scanners/uploads/missing-constraints.js +109 -0
  176. package/dist/scanners/uploads/public-path.d.ts +11 -0
  177. package/dist/scanners/uploads/public-path.d.ts.map +1 -0
  178. package/dist/scanners/uploads/public-path.js +87 -0
  179. package/dist/scanners/validation/client-side-only.d.ts +14 -0
  180. package/dist/scanners/validation/client-side-only.d.ts.map +1 -0
  181. package/dist/scanners/validation/client-side-only.js +140 -0
  182. package/dist/scanners/validation/ignored-validation.d.ts +12 -0
  183. package/dist/scanners/validation/ignored-validation.d.ts.map +1 -0
  184. package/dist/scanners/validation/ignored-validation.js +119 -0
  185. package/dist/scanners/validation/index.d.ts +5 -0
  186. package/dist/scanners/validation/index.d.ts.map +1 -0
  187. package/dist/scanners/validation/index.js +9 -0
  188. package/dist/utils/exclude-patterns.d.ts +35 -0
  189. package/dist/utils/exclude-patterns.d.ts.map +1 -0
  190. package/dist/utils/exclude-patterns.js +78 -0
  191. package/dist/utils/file-utils.d.ts +37 -0
  192. package/dist/utils/file-utils.d.ts.map +1 -0
  193. package/dist/utils/file-utils.js +77 -0
  194. package/dist/utils/fingerprint.d.ts +25 -0
  195. package/dist/utils/fingerprint.d.ts.map +1 -0
  196. package/dist/utils/fingerprint.js +28 -0
  197. package/dist/utils/git-info.d.ts +14 -0
  198. package/dist/utils/git-info.d.ts.map +1 -0
  199. package/dist/utils/git-info.js +55 -0
  200. package/dist/utils/index.d.ts +4 -0
  201. package/dist/utils/index.d.ts.map +1 -0
  202. package/dist/utils/index.js +3 -0
  203. package/dist/utils/progress.d.ts +42 -0
  204. package/dist/utils/progress.d.ts.map +1 -0
  205. package/dist/utils/progress.js +165 -0
  206. package/dist/utils/sarif-formatter.d.ts +92 -0
  207. package/dist/utils/sarif-formatter.d.ts.map +1 -0
  208. package/dist/utils/sarif-formatter.js +172 -0
  209. 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"}