@oculum/scanner 1.0.0
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/dist/formatters/cli-terminal.d.ts +27 -0
- package/dist/formatters/cli-terminal.d.ts.map +1 -0
- package/dist/formatters/cli-terminal.js +412 -0
- package/dist/formatters/cli-terminal.js.map +1 -0
- package/dist/formatters/github-comment.d.ts +41 -0
- package/dist/formatters/github-comment.d.ts.map +1 -0
- package/dist/formatters/github-comment.js +306 -0
- package/dist/formatters/github-comment.js.map +1 -0
- package/dist/formatters/grouping.d.ts +52 -0
- package/dist/formatters/grouping.d.ts.map +1 -0
- package/dist/formatters/grouping.js +152 -0
- package/dist/formatters/grouping.js.map +1 -0
- package/dist/formatters/index.d.ts +9 -0
- package/dist/formatters/index.d.ts.map +1 -0
- package/dist/formatters/index.js +35 -0
- package/dist/formatters/index.js.map +1 -0
- package/dist/formatters/vscode-diagnostic.d.ts +103 -0
- package/dist/formatters/vscode-diagnostic.d.ts.map +1 -0
- package/dist/formatters/vscode-diagnostic.js +151 -0
- package/dist/formatters/vscode-diagnostic.js.map +1 -0
- package/dist/index.d.ts +52 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +648 -0
- package/dist/index.js.map +1 -0
- package/dist/layer1/comments.d.ts +8 -0
- package/dist/layer1/comments.d.ts.map +1 -0
- package/dist/layer1/comments.js +203 -0
- package/dist/layer1/comments.js.map +1 -0
- package/dist/layer1/config-audit.d.ts +8 -0
- package/dist/layer1/config-audit.d.ts.map +1 -0
- package/dist/layer1/config-audit.js +252 -0
- package/dist/layer1/config-audit.js.map +1 -0
- package/dist/layer1/entropy.d.ts +8 -0
- package/dist/layer1/entropy.d.ts.map +1 -0
- package/dist/layer1/entropy.js +500 -0
- package/dist/layer1/entropy.js.map +1 -0
- package/dist/layer1/file-flags.d.ts +7 -0
- package/dist/layer1/file-flags.d.ts.map +1 -0
- package/dist/layer1/file-flags.js +112 -0
- package/dist/layer1/file-flags.js.map +1 -0
- package/dist/layer1/index.d.ts +36 -0
- package/dist/layer1/index.d.ts.map +1 -0
- package/dist/layer1/index.js +132 -0
- package/dist/layer1/index.js.map +1 -0
- package/dist/layer1/patterns.d.ts +8 -0
- package/dist/layer1/patterns.d.ts.map +1 -0
- package/dist/layer1/patterns.js +482 -0
- package/dist/layer1/patterns.js.map +1 -0
- package/dist/layer1/urls.d.ts +8 -0
- package/dist/layer1/urls.d.ts.map +1 -0
- package/dist/layer1/urls.js +296 -0
- package/dist/layer1/urls.js.map +1 -0
- package/dist/layer1/weak-crypto.d.ts +7 -0
- package/dist/layer1/weak-crypto.d.ts.map +1 -0
- package/dist/layer1/weak-crypto.js +291 -0
- package/dist/layer1/weak-crypto.js.map +1 -0
- package/dist/layer2/ai-agent-tools.d.ts +19 -0
- package/dist/layer2/ai-agent-tools.d.ts.map +1 -0
- package/dist/layer2/ai-agent-tools.js +528 -0
- package/dist/layer2/ai-agent-tools.js.map +1 -0
- package/dist/layer2/ai-endpoint-protection.d.ts +36 -0
- package/dist/layer2/ai-endpoint-protection.d.ts.map +1 -0
- package/dist/layer2/ai-endpoint-protection.js +332 -0
- package/dist/layer2/ai-endpoint-protection.js.map +1 -0
- package/dist/layer2/ai-execution-sinks.d.ts +18 -0
- package/dist/layer2/ai-execution-sinks.d.ts.map +1 -0
- package/dist/layer2/ai-execution-sinks.js +496 -0
- package/dist/layer2/ai-execution-sinks.js.map +1 -0
- package/dist/layer2/ai-fingerprinting.d.ts +7 -0
- package/dist/layer2/ai-fingerprinting.d.ts.map +1 -0
- package/dist/layer2/ai-fingerprinting.js +654 -0
- package/dist/layer2/ai-fingerprinting.js.map +1 -0
- package/dist/layer2/ai-prompt-hygiene.d.ts +19 -0
- package/dist/layer2/ai-prompt-hygiene.d.ts.map +1 -0
- package/dist/layer2/ai-prompt-hygiene.js +356 -0
- package/dist/layer2/ai-prompt-hygiene.js.map +1 -0
- package/dist/layer2/ai-rag-safety.d.ts +21 -0
- package/dist/layer2/ai-rag-safety.d.ts.map +1 -0
- package/dist/layer2/ai-rag-safety.js +459 -0
- package/dist/layer2/ai-rag-safety.js.map +1 -0
- package/dist/layer2/ai-schema-validation.d.ts +25 -0
- package/dist/layer2/ai-schema-validation.d.ts.map +1 -0
- package/dist/layer2/ai-schema-validation.js +375 -0
- package/dist/layer2/ai-schema-validation.js.map +1 -0
- package/dist/layer2/auth-antipatterns.d.ts +20 -0
- package/dist/layer2/auth-antipatterns.d.ts.map +1 -0
- package/dist/layer2/auth-antipatterns.js +333 -0
- package/dist/layer2/auth-antipatterns.js.map +1 -0
- package/dist/layer2/byok-patterns.d.ts +12 -0
- package/dist/layer2/byok-patterns.d.ts.map +1 -0
- package/dist/layer2/byok-patterns.js +299 -0
- package/dist/layer2/byok-patterns.js.map +1 -0
- package/dist/layer2/dangerous-functions.d.ts +7 -0
- package/dist/layer2/dangerous-functions.d.ts.map +1 -0
- package/dist/layer2/dangerous-functions.js +1375 -0
- package/dist/layer2/dangerous-functions.js.map +1 -0
- package/dist/layer2/data-exposure.d.ts +16 -0
- package/dist/layer2/data-exposure.d.ts.map +1 -0
- package/dist/layer2/data-exposure.js +279 -0
- package/dist/layer2/data-exposure.js.map +1 -0
- package/dist/layer2/framework-checks.d.ts +7 -0
- package/dist/layer2/framework-checks.d.ts.map +1 -0
- package/dist/layer2/framework-checks.js +388 -0
- package/dist/layer2/framework-checks.js.map +1 -0
- package/dist/layer2/index.d.ts +58 -0
- package/dist/layer2/index.d.ts.map +1 -0
- package/dist/layer2/index.js +380 -0
- package/dist/layer2/index.js.map +1 -0
- package/dist/layer2/logic-gates.d.ts +7 -0
- package/dist/layer2/logic-gates.d.ts.map +1 -0
- package/dist/layer2/logic-gates.js +182 -0
- package/dist/layer2/logic-gates.js.map +1 -0
- package/dist/layer2/risky-imports.d.ts +7 -0
- package/dist/layer2/risky-imports.d.ts.map +1 -0
- package/dist/layer2/risky-imports.js +161 -0
- package/dist/layer2/risky-imports.js.map +1 -0
- package/dist/layer2/variables.d.ts +8 -0
- package/dist/layer2/variables.d.ts.map +1 -0
- package/dist/layer2/variables.js +152 -0
- package/dist/layer2/variables.js.map +1 -0
- package/dist/layer3/anthropic.d.ts +83 -0
- package/dist/layer3/anthropic.d.ts.map +1 -0
- package/dist/layer3/anthropic.js +1745 -0
- package/dist/layer3/anthropic.js.map +1 -0
- package/dist/layer3/index.d.ts +24 -0
- package/dist/layer3/index.d.ts.map +1 -0
- package/dist/layer3/index.js +119 -0
- package/dist/layer3/index.js.map +1 -0
- package/dist/layer3/openai.d.ts +25 -0
- package/dist/layer3/openai.d.ts.map +1 -0
- package/dist/layer3/openai.js +238 -0
- package/dist/layer3/openai.js.map +1 -0
- package/dist/layer3/package-check.d.ts +63 -0
- package/dist/layer3/package-check.d.ts.map +1 -0
- package/dist/layer3/package-check.js +508 -0
- package/dist/layer3/package-check.js.map +1 -0
- package/dist/modes/incremental.d.ts +66 -0
- package/dist/modes/incremental.d.ts.map +1 -0
- package/dist/modes/incremental.js +200 -0
- package/dist/modes/incremental.js.map +1 -0
- package/dist/tiers.d.ts +125 -0
- package/dist/tiers.d.ts.map +1 -0
- package/dist/tiers.js +234 -0
- package/dist/tiers.js.map +1 -0
- package/dist/types.d.ts +175 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +50 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/auth-helper-detector.d.ts +56 -0
- package/dist/utils/auth-helper-detector.d.ts.map +1 -0
- package/dist/utils/auth-helper-detector.js +360 -0
- package/dist/utils/auth-helper-detector.js.map +1 -0
- package/dist/utils/context-helpers.d.ts +96 -0
- package/dist/utils/context-helpers.d.ts.map +1 -0
- package/dist/utils/context-helpers.js +493 -0
- package/dist/utils/context-helpers.js.map +1 -0
- package/dist/utils/diff-detector.d.ts +53 -0
- package/dist/utils/diff-detector.d.ts.map +1 -0
- package/dist/utils/diff-detector.js +104 -0
- package/dist/utils/diff-detector.js.map +1 -0
- package/dist/utils/diff-parser.d.ts +80 -0
- package/dist/utils/diff-parser.d.ts.map +1 -0
- package/dist/utils/diff-parser.js +202 -0
- package/dist/utils/diff-parser.js.map +1 -0
- package/dist/utils/imported-auth-detector.d.ts +37 -0
- package/dist/utils/imported-auth-detector.d.ts.map +1 -0
- package/dist/utils/imported-auth-detector.js +251 -0
- package/dist/utils/imported-auth-detector.js.map +1 -0
- package/dist/utils/middleware-detector.d.ts +55 -0
- package/dist/utils/middleware-detector.d.ts.map +1 -0
- package/dist/utils/middleware-detector.js +260 -0
- package/dist/utils/middleware-detector.js.map +1 -0
- package/dist/utils/oauth-flow-detector.d.ts +41 -0
- package/dist/utils/oauth-flow-detector.d.ts.map +1 -0
- package/dist/utils/oauth-flow-detector.js +202 -0
- package/dist/utils/oauth-flow-detector.js.map +1 -0
- package/dist/utils/path-exclusions.d.ts +55 -0
- package/dist/utils/path-exclusions.d.ts.map +1 -0
- package/dist/utils/path-exclusions.js +222 -0
- package/dist/utils/path-exclusions.js.map +1 -0
- package/dist/utils/project-context-builder.d.ts +119 -0
- package/dist/utils/project-context-builder.d.ts.map +1 -0
- package/dist/utils/project-context-builder.js +534 -0
- package/dist/utils/project-context-builder.js.map +1 -0
- package/dist/utils/registry-clients.d.ts +93 -0
- package/dist/utils/registry-clients.d.ts.map +1 -0
- package/dist/utils/registry-clients.js +273 -0
- package/dist/utils/registry-clients.js.map +1 -0
- package/dist/utils/trpc-analyzer.d.ts +78 -0
- package/dist/utils/trpc-analyzer.d.ts.map +1 -0
- package/dist/utils/trpc-analyzer.js +297 -0
- package/dist/utils/trpc-analyzer.js.map +1 -0
- package/package.json +45 -0
- package/src/__tests__/benchmark/fixtures/false-positives.ts +227 -0
- package/src/__tests__/benchmark/fixtures/index.ts +68 -0
- package/src/__tests__/benchmark/fixtures/layer1/config-audit.ts +364 -0
- package/src/__tests__/benchmark/fixtures/layer1/hardcoded-secrets.ts +173 -0
- package/src/__tests__/benchmark/fixtures/layer1/high-entropy.ts +234 -0
- package/src/__tests__/benchmark/fixtures/layer1/index.ts +31 -0
- package/src/__tests__/benchmark/fixtures/layer1/sensitive-urls.ts +90 -0
- package/src/__tests__/benchmark/fixtures/layer1/weak-crypto.ts +197 -0
- package/src/__tests__/benchmark/fixtures/layer2/ai-agent-tools.ts +170 -0
- package/src/__tests__/benchmark/fixtures/layer2/ai-endpoint-protection.ts +418 -0
- package/src/__tests__/benchmark/fixtures/layer2/ai-execution-sinks.ts +189 -0
- package/src/__tests__/benchmark/fixtures/layer2/ai-fingerprinting.ts +316 -0
- package/src/__tests__/benchmark/fixtures/layer2/ai-prompt-hygiene.ts +178 -0
- package/src/__tests__/benchmark/fixtures/layer2/ai-rag-safety.ts +184 -0
- package/src/__tests__/benchmark/fixtures/layer2/ai-schema-validation.ts +434 -0
- package/src/__tests__/benchmark/fixtures/layer2/auth-antipatterns.ts +159 -0
- package/src/__tests__/benchmark/fixtures/layer2/byok-patterns.ts +112 -0
- package/src/__tests__/benchmark/fixtures/layer2/dangerous-functions.ts +246 -0
- package/src/__tests__/benchmark/fixtures/layer2/data-exposure.ts +168 -0
- package/src/__tests__/benchmark/fixtures/layer2/framework-checks.ts +346 -0
- package/src/__tests__/benchmark/fixtures/layer2/index.ts +67 -0
- package/src/__tests__/benchmark/fixtures/layer2/injection-vulnerabilities.ts +239 -0
- package/src/__tests__/benchmark/fixtures/layer2/logic-gates.ts +246 -0
- package/src/__tests__/benchmark/fixtures/layer2/risky-imports.ts +231 -0
- package/src/__tests__/benchmark/fixtures/layer2/variables.ts +167 -0
- package/src/__tests__/benchmark/index.ts +29 -0
- package/src/__tests__/benchmark/run-benchmark.ts +144 -0
- package/src/__tests__/benchmark/run-depth-validation.ts +206 -0
- package/src/__tests__/benchmark/run-real-world-test.ts +243 -0
- package/src/__tests__/benchmark/security-benchmark-script.ts +1737 -0
- package/src/__tests__/benchmark/tier-integration-script.ts +177 -0
- package/src/__tests__/benchmark/types.ts +144 -0
- package/src/__tests__/benchmark/utils/test-runner.ts +475 -0
- package/src/__tests__/regression/known-false-positives.test.ts +467 -0
- package/src/__tests__/snapshots/__snapshots__/scan-depth.test.ts.snap +178 -0
- package/src/__tests__/snapshots/scan-depth.test.ts +258 -0
- package/src/__tests__/validation/analyze-results.ts +542 -0
- package/src/__tests__/validation/extract-for-triage.ts +146 -0
- package/src/__tests__/validation/fp-deep-analysis.ts +327 -0
- package/src/__tests__/validation/run-validation.ts +364 -0
- package/src/__tests__/validation/triage-template.md +132 -0
- package/src/formatters/cli-terminal.ts +446 -0
- package/src/formatters/github-comment.ts +382 -0
- package/src/formatters/grouping.ts +190 -0
- package/src/formatters/index.ts +47 -0
- package/src/formatters/vscode-diagnostic.ts +243 -0
- package/src/index.ts +823 -0
- package/src/layer1/comments.ts +218 -0
- package/src/layer1/config-audit.ts +289 -0
- package/src/layer1/entropy.ts +583 -0
- package/src/layer1/file-flags.ts +127 -0
- package/src/layer1/index.ts +181 -0
- package/src/layer1/patterns.ts +516 -0
- package/src/layer1/urls.ts +334 -0
- package/src/layer1/weak-crypto.ts +328 -0
- package/src/layer2/ai-agent-tools.ts +601 -0
- package/src/layer2/ai-endpoint-protection.ts +387 -0
- package/src/layer2/ai-execution-sinks.ts +580 -0
- package/src/layer2/ai-fingerprinting.ts +758 -0
- package/src/layer2/ai-prompt-hygiene.ts +411 -0
- package/src/layer2/ai-rag-safety.ts +511 -0
- package/src/layer2/ai-schema-validation.ts +421 -0
- package/src/layer2/auth-antipatterns.ts +394 -0
- package/src/layer2/byok-patterns.ts +336 -0
- package/src/layer2/dangerous-functions.ts +1563 -0
- package/src/layer2/data-exposure.ts +315 -0
- package/src/layer2/framework-checks.ts +433 -0
- package/src/layer2/index.ts +473 -0
- package/src/layer2/logic-gates.ts +206 -0
- package/src/layer2/risky-imports.ts +186 -0
- package/src/layer2/variables.ts +166 -0
- package/src/layer3/anthropic.ts +2030 -0
- package/src/layer3/index.ts +130 -0
- package/src/layer3/package-check.ts +604 -0
- package/src/modes/incremental.ts +293 -0
- package/src/tiers.ts +318 -0
- package/src/types.ts +284 -0
- package/src/utils/auth-helper-detector.ts +443 -0
- package/src/utils/context-helpers.ts +535 -0
- package/src/utils/diff-detector.ts +135 -0
- package/src/utils/diff-parser.ts +272 -0
- package/src/utils/imported-auth-detector.ts +320 -0
- package/src/utils/middleware-detector.ts +333 -0
- package/src/utils/oauth-flow-detector.ts +246 -0
- package/src/utils/path-exclusions.ts +266 -0
- package/src/utils/project-context-builder.ts +707 -0
- package/src/utils/registry-clients.ts +351 -0
- package/src/utils/trpc-analyzer.ts +382 -0
|
@@ -0,0 +1,534 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Project Context Builder
|
|
4
|
+
*
|
|
5
|
+
* Builds a generic project context summary for AI validation by analyzing
|
|
6
|
+
* common patterns across the codebase. This context helps the AI validator
|
|
7
|
+
* understand the project's security architecture without hardcoding any
|
|
8
|
+
* specific framework or vendor.
|
|
9
|
+
*
|
|
10
|
+
* Key areas analyzed:
|
|
11
|
+
* - Authentication & access control patterns
|
|
12
|
+
* - Data access patterns (ORMs, query builders, raw queries)
|
|
13
|
+
* - Secrets & configuration handling
|
|
14
|
+
* - Framework detection
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.buildProjectContext = buildProjectContext;
|
|
18
|
+
exports.getFileValidationContext = getFileValidationContext;
|
|
19
|
+
const middleware_detector_1 = require("./middleware-detector");
|
|
20
|
+
const auth_helper_detector_1 = require("./auth-helper-detector");
|
|
21
|
+
const oauth_flow_detector_1 = require("./oauth-flow-detector");
|
|
22
|
+
const trpc_analyzer_1 = require("./trpc-analyzer");
|
|
23
|
+
// ============================================================================
|
|
24
|
+
// Pattern Definitions
|
|
25
|
+
// ============================================================================
|
|
26
|
+
const AUTH_HELPER_PATTERNS = [
|
|
27
|
+
{ pattern: /getCurrentUser|getUser|fetchUser/i, name: 'getCurrentUser' },
|
|
28
|
+
{ pattern: /getCurrentUserId|getUserId/i, name: 'getCurrentUserId' },
|
|
29
|
+
{ pattern: /getSession|getServerSession/i, name: 'getSession' },
|
|
30
|
+
{ pattern: /requireAuth|ensureAuth|checkAuth/i, name: 'requireAuth' },
|
|
31
|
+
{ pattern: /verifyToken|validateToken/i, name: 'verifyToken' },
|
|
32
|
+
{ pattern: /isAuthenticated|isLoggedIn/i, name: 'isAuthenticated' },
|
|
33
|
+
{ pattern: /withAuth|authGuard/i, name: 'withAuth' },
|
|
34
|
+
{ pattern: /useAuth|useSession/i, name: 'useAuth (hook)' },
|
|
35
|
+
{ pattern: /auth\(\)|getAuth\(\)/i, name: 'auth()' },
|
|
36
|
+
];
|
|
37
|
+
const ORM_PATTERNS = [
|
|
38
|
+
{ pattern: /from\s+['"]@prisma\/client['"]|PrismaClient/i, orm: 'prisma' },
|
|
39
|
+
{ pattern: /from\s+['"]drizzle-orm['"]|drizzle\(/i, orm: 'drizzle' },
|
|
40
|
+
{ pattern: /from\s+['"]@supabase\/supabase-js['"]|createClient.*supabase/i, orm: 'supabase' },
|
|
41
|
+
{ pattern: /from\s+['"]mongoose['"]|mongoose\.connect/i, orm: 'mongoose' },
|
|
42
|
+
{ pattern: /from\s+['"]sequelize['"]|Sequelize/i, orm: 'sequelize' },
|
|
43
|
+
{ pattern: /from\s+['"]typeorm['"]|DataSource/i, orm: 'typeorm' },
|
|
44
|
+
{ pattern: /from\s+['"]knex['"]|knex\(/i, orm: 'knex' },
|
|
45
|
+
];
|
|
46
|
+
const VALIDATION_LIBRARY_PATTERNS = [
|
|
47
|
+
{ pattern: /from\s+['"]zod['"]|z\.object/i, lib: 'zod' },
|
|
48
|
+
{ pattern: /from\s+['"]yup['"]|yup\.object/i, lib: 'yup' },
|
|
49
|
+
{ pattern: /from\s+['"]joi['"]|Joi\.object/i, lib: 'joi' },
|
|
50
|
+
{ pattern: /from\s+['"]valibot['"]|v\.object/i, lib: 'valibot' },
|
|
51
|
+
{ pattern: /from\s+['"]class-validator['"]|@IsString|@IsEmail/i, lib: 'class-validator' },
|
|
52
|
+
];
|
|
53
|
+
const SECRET_MANAGER_PATTERNS = [
|
|
54
|
+
{ pattern: /aws-sdk.*secretsmanager|SecretsManager/i, type: 'AWS Secrets Manager' },
|
|
55
|
+
{ pattern: /google-cloud.*secret-manager|SecretManagerServiceClient/i, type: 'Google Secret Manager' },
|
|
56
|
+
{ pattern: /@azure\/keyvault|KeyVaultSecret/i, type: 'Azure Key Vault' },
|
|
57
|
+
{ pattern: /hashicorp.*vault|vault\.read/i, type: 'HashiCorp Vault' },
|
|
58
|
+
{ pattern: /doppler|infisical/i, type: 'Doppler/Infisical' },
|
|
59
|
+
];
|
|
60
|
+
// ============================================================================
|
|
61
|
+
// Main Builder Function
|
|
62
|
+
// ============================================================================
|
|
63
|
+
/**
|
|
64
|
+
* Build a comprehensive project context from scanned files
|
|
65
|
+
* This context is used to inform AI validation decisions
|
|
66
|
+
*/
|
|
67
|
+
function buildProjectContext(files) {
|
|
68
|
+
// Detect middleware configuration
|
|
69
|
+
const middlewareConfig = (0, middleware_detector_1.detectGlobalAuthMiddleware)(files);
|
|
70
|
+
// Build individual context sections
|
|
71
|
+
const auth = buildAuthContext(files, middlewareConfig);
|
|
72
|
+
const dataAccess = buildDataAccessContext(files);
|
|
73
|
+
const secrets = buildSecretsContext(files);
|
|
74
|
+
const frameworks = buildFrameworkContext(files);
|
|
75
|
+
const structure = buildStructureContext(files);
|
|
76
|
+
const oauth = (0, oauth_flow_detector_1.detectOAuthFlow)(files);
|
|
77
|
+
const trpc = (0, trpc_analyzer_1.analyzeTRPCRouters)(files);
|
|
78
|
+
// Generate summary string for AI prompt
|
|
79
|
+
const summary = generateContextSummary({
|
|
80
|
+
auth,
|
|
81
|
+
dataAccess,
|
|
82
|
+
secrets,
|
|
83
|
+
frameworks,
|
|
84
|
+
structure,
|
|
85
|
+
oauth,
|
|
86
|
+
trpc,
|
|
87
|
+
});
|
|
88
|
+
return {
|
|
89
|
+
summary,
|
|
90
|
+
auth,
|
|
91
|
+
dataAccess,
|
|
92
|
+
secrets,
|
|
93
|
+
frameworks,
|
|
94
|
+
structure,
|
|
95
|
+
oauth,
|
|
96
|
+
trpc,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
// ============================================================================
|
|
100
|
+
// Context Builders
|
|
101
|
+
// ============================================================================
|
|
102
|
+
function buildAuthContext(files, middlewareConfig) {
|
|
103
|
+
const authHelperNames = [];
|
|
104
|
+
let hasUserScoping = false;
|
|
105
|
+
const userScopingPatterns = [];
|
|
106
|
+
// Detect auth helpers using the dedicated detector (includes throwing detection)
|
|
107
|
+
const authHelperContext = (0, auth_helper_detector_1.detectAuthHelpers)(files);
|
|
108
|
+
const throwingAuthHelpers = authHelperContext.helpers.filter(h => h.throwsOnMissing);
|
|
109
|
+
// Scan all files for additional auth patterns and user scoping
|
|
110
|
+
for (const file of files) {
|
|
111
|
+
// Skip non-code files
|
|
112
|
+
if (!isCodeFile(file.path))
|
|
113
|
+
continue;
|
|
114
|
+
// Detect auth helper functions by name patterns
|
|
115
|
+
for (const { pattern, name } of AUTH_HELPER_PATTERNS) {
|
|
116
|
+
if (pattern.test(file.content) && !authHelperNames.includes(name)) {
|
|
117
|
+
authHelperNames.push(name);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Detect user scoping patterns
|
|
121
|
+
const scoping = (0, middleware_detector_1.detectUserScopingPatterns)(file.content);
|
|
122
|
+
if (scoping.hasUserScoping) {
|
|
123
|
+
hasUserScoping = true;
|
|
124
|
+
for (const p of scoping.patterns) {
|
|
125
|
+
if (!userScopingPatterns.includes(p)) {
|
|
126
|
+
userScopingPatterns.push(p);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// Merge detected helper names from both sources
|
|
132
|
+
for (const helper of authHelperContext.helpers) {
|
|
133
|
+
if (!authHelperNames.includes(helper.name)) {
|
|
134
|
+
authHelperNames.push(helper.name);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return {
|
|
138
|
+
hasGlobalMiddleware: middlewareConfig.hasAuthMiddleware,
|
|
139
|
+
authProvider: middlewareConfig.authType,
|
|
140
|
+
middlewareFile: middlewareConfig.middlewareFile,
|
|
141
|
+
protectedPaths: middlewareConfig.protectedPaths,
|
|
142
|
+
publicPaths: middlewareConfig.publicPaths,
|
|
143
|
+
authHelpers: authHelperNames,
|
|
144
|
+
authHelperContext,
|
|
145
|
+
throwingAuthHelpers,
|
|
146
|
+
hasUserScoping,
|
|
147
|
+
userScopingPatterns,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
function buildDataAccessContext(files) {
|
|
151
|
+
let orm = undefined;
|
|
152
|
+
let usesParameterizedQueries = false;
|
|
153
|
+
let databaseType = undefined;
|
|
154
|
+
let hasRLS = false;
|
|
155
|
+
let validationLibrary = undefined;
|
|
156
|
+
for (const file of files) {
|
|
157
|
+
if (!isCodeFile(file.path))
|
|
158
|
+
continue;
|
|
159
|
+
const content = file.content;
|
|
160
|
+
// Detect ORM
|
|
161
|
+
if (!orm) {
|
|
162
|
+
for (const { pattern, orm: ormType } of ORM_PATTERNS) {
|
|
163
|
+
if (pattern.test(content)) {
|
|
164
|
+
orm = ormType;
|
|
165
|
+
break;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// Detect parameterized queries
|
|
170
|
+
if (!usesParameterizedQueries) {
|
|
171
|
+
// Prisma, Drizzle, Supabase all use parameterized by default
|
|
172
|
+
if (orm === 'prisma' || orm === 'drizzle' || orm === 'supabase') {
|
|
173
|
+
usesParameterizedQueries = true;
|
|
174
|
+
}
|
|
175
|
+
// Check for explicit parameterized patterns
|
|
176
|
+
if (/\$\d+|\?\s*,|\?(?=\s*\))|:[\w]+/i.test(content) && /query|execute|sql/i.test(content)) {
|
|
177
|
+
usesParameterizedQueries = true;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// Detect database type
|
|
181
|
+
if (!databaseType) {
|
|
182
|
+
if (/postgres|pg\.|@vercel\/postgres/i.test(content)) {
|
|
183
|
+
databaseType = 'postgres';
|
|
184
|
+
}
|
|
185
|
+
else if (/mysql|mysql2/i.test(content)) {
|
|
186
|
+
databaseType = 'mysql';
|
|
187
|
+
}
|
|
188
|
+
else if (/mongodb|mongoose/i.test(content)) {
|
|
189
|
+
databaseType = 'mongodb';
|
|
190
|
+
}
|
|
191
|
+
else if (/sqlite|better-sqlite/i.test(content)) {
|
|
192
|
+
databaseType = 'sqlite';
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
// Detect RLS
|
|
196
|
+
if (!hasRLS && /row.?level.?security|RLS|\.rls\(|enable_rls/i.test(content)) {
|
|
197
|
+
hasRLS = true;
|
|
198
|
+
}
|
|
199
|
+
// Detect validation library
|
|
200
|
+
if (!validationLibrary) {
|
|
201
|
+
for (const { pattern, lib } of VALIDATION_LIBRARY_PATTERNS) {
|
|
202
|
+
if (pattern.test(content)) {
|
|
203
|
+
validationLibrary = lib;
|
|
204
|
+
break;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
// If no ORM detected but SQL patterns found, mark as raw_sql
|
|
210
|
+
if (!orm) {
|
|
211
|
+
const hasRawSql = files.some(f => /SELECT\s+.*FROM|INSERT\s+INTO|UPDATE\s+.*SET|DELETE\s+FROM/i.test(f.content));
|
|
212
|
+
if (hasRawSql) {
|
|
213
|
+
orm = 'raw_sql';
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return {
|
|
217
|
+
orm,
|
|
218
|
+
usesParameterizedQueries,
|
|
219
|
+
databaseType,
|
|
220
|
+
hasRLS,
|
|
221
|
+
validationLibrary,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
function buildSecretsContext(files) {
|
|
225
|
+
let usesEnvVars = false;
|
|
226
|
+
let usesSecretManager = false;
|
|
227
|
+
let secretManagerType = undefined;
|
|
228
|
+
let hasEnvFiles = false;
|
|
229
|
+
let hasClientExposedEnvVars = false;
|
|
230
|
+
for (const file of files) {
|
|
231
|
+
// Check for .env files
|
|
232
|
+
if (file.path.includes('.env')) {
|
|
233
|
+
hasEnvFiles = true;
|
|
234
|
+
}
|
|
235
|
+
// Check for env var usage
|
|
236
|
+
if (/process\.env\.|import\.meta\.env\.|Deno\.env/i.test(file.content)) {
|
|
237
|
+
usesEnvVars = true;
|
|
238
|
+
}
|
|
239
|
+
// Check for NEXT_PUBLIC_ pattern
|
|
240
|
+
if (/NEXT_PUBLIC_/i.test(file.content)) {
|
|
241
|
+
hasClientExposedEnvVars = true;
|
|
242
|
+
}
|
|
243
|
+
// Check for secret managers
|
|
244
|
+
if (!usesSecretManager) {
|
|
245
|
+
for (const { pattern, type } of SECRET_MANAGER_PATTERNS) {
|
|
246
|
+
if (pattern.test(file.content)) {
|
|
247
|
+
usesSecretManager = true;
|
|
248
|
+
secretManagerType = type;
|
|
249
|
+
break;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return {
|
|
255
|
+
usesEnvVars,
|
|
256
|
+
usesSecretManager,
|
|
257
|
+
secretManagerType,
|
|
258
|
+
hasEnvFiles,
|
|
259
|
+
hasClientExposedEnvVars,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
function buildFrameworkContext(files) {
|
|
263
|
+
let primary = undefined;
|
|
264
|
+
let frontend = undefined;
|
|
265
|
+
let isMonorepo = false;
|
|
266
|
+
let usesTypeScript = false;
|
|
267
|
+
let usesServerComponents = false;
|
|
268
|
+
let usesServerActions = false;
|
|
269
|
+
// Check for package.json to detect frameworks
|
|
270
|
+
const packageJson = files.find(f => f.path === 'package.json' || f.path.endsWith('/package.json'));
|
|
271
|
+
if (packageJson) {
|
|
272
|
+
const content = packageJson.content;
|
|
273
|
+
// Primary framework detection
|
|
274
|
+
if (/["']next["']/i.test(content)) {
|
|
275
|
+
primary = 'nextjs';
|
|
276
|
+
}
|
|
277
|
+
else if (/["']express["']/i.test(content)) {
|
|
278
|
+
primary = 'express';
|
|
279
|
+
}
|
|
280
|
+
else if (/["']fastify["']/i.test(content)) {
|
|
281
|
+
primary = 'fastify';
|
|
282
|
+
}
|
|
283
|
+
else if (/["']@nestjs\/core["']/i.test(content)) {
|
|
284
|
+
primary = 'nestjs';
|
|
285
|
+
}
|
|
286
|
+
// Frontend framework detection
|
|
287
|
+
if (/["']react["']/i.test(content)) {
|
|
288
|
+
frontend = 'react';
|
|
289
|
+
}
|
|
290
|
+
else if (/["']vue["']/i.test(content)) {
|
|
291
|
+
frontend = 'vue';
|
|
292
|
+
}
|
|
293
|
+
else if (/["']svelte["']/i.test(content)) {
|
|
294
|
+
frontend = 'svelte';
|
|
295
|
+
}
|
|
296
|
+
else if (/["']@angular\/core["']/i.test(content)) {
|
|
297
|
+
frontend = 'angular';
|
|
298
|
+
}
|
|
299
|
+
// Monorepo detection
|
|
300
|
+
if (/["']workspaces["']|turbo\.json|lerna\.json|pnpm-workspace/i.test(content)) {
|
|
301
|
+
isMonorepo = true;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
// Check for TypeScript
|
|
305
|
+
usesTypeScript = files.some(f => f.path.endsWith('.ts') || f.path.endsWith('.tsx'));
|
|
306
|
+
// Check for Next.js 13+ patterns
|
|
307
|
+
for (const file of files) {
|
|
308
|
+
if (/['"]use server['"]/.test(file.content)) {
|
|
309
|
+
usesServerActions = true;
|
|
310
|
+
}
|
|
311
|
+
if (/['"]use client['"]/.test(file.content) || file.path.includes('/app/')) {
|
|
312
|
+
usesServerComponents = true; // App Router implies server components
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
return {
|
|
316
|
+
primary,
|
|
317
|
+
frontend,
|
|
318
|
+
isMonorepo,
|
|
319
|
+
usesTypeScript,
|
|
320
|
+
usesServerComponents,
|
|
321
|
+
usesServerActions,
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
function buildStructureContext(files) {
|
|
325
|
+
const fileTypes = {};
|
|
326
|
+
let hasApiRoutes = false;
|
|
327
|
+
let hasMiddleware = false;
|
|
328
|
+
let hasServerActions = false;
|
|
329
|
+
for (const file of files) {
|
|
330
|
+
// Count file types
|
|
331
|
+
const ext = getFileExtension(file.path);
|
|
332
|
+
fileTypes[ext] = (fileTypes[ext] || 0) + 1;
|
|
333
|
+
// Check for API routes
|
|
334
|
+
if (/\/api\/|route\.(ts|js)$|\/routes\//i.test(file.path)) {
|
|
335
|
+
hasApiRoutes = true;
|
|
336
|
+
}
|
|
337
|
+
// Check for middleware
|
|
338
|
+
if (/middleware\.(ts|js)$/i.test(file.path)) {
|
|
339
|
+
hasMiddleware = true;
|
|
340
|
+
}
|
|
341
|
+
// Check for server actions
|
|
342
|
+
if (/\/actions\/|\.action\.(ts|js)$/i.test(file.path) || /['"]use server['"]/.test(file.content)) {
|
|
343
|
+
hasServerActions = true;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
return {
|
|
347
|
+
hasApiRoutes,
|
|
348
|
+
hasMiddleware,
|
|
349
|
+
hasServerActions,
|
|
350
|
+
totalFiles: files.length,
|
|
351
|
+
fileTypes,
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
// ============================================================================
|
|
355
|
+
// Summary Generator
|
|
356
|
+
// ============================================================================
|
|
357
|
+
function generateContextSummary(ctx) {
|
|
358
|
+
const lines = [];
|
|
359
|
+
lines.push('## Project Security Context');
|
|
360
|
+
lines.push('');
|
|
361
|
+
// Framework info
|
|
362
|
+
if (ctx.frameworks.primary) {
|
|
363
|
+
lines.push(`**Framework:** ${ctx.frameworks.primary}${ctx.frameworks.frontend ? ` + ${ctx.frameworks.frontend}` : ''}`);
|
|
364
|
+
}
|
|
365
|
+
if (ctx.frameworks.usesTypeScript) {
|
|
366
|
+
lines.push('**Language:** TypeScript');
|
|
367
|
+
}
|
|
368
|
+
if (ctx.frameworks.usesServerComponents || ctx.frameworks.usesServerActions) {
|
|
369
|
+
lines.push(`**Patterns:** ${[
|
|
370
|
+
ctx.frameworks.usesServerComponents && 'Server Components',
|
|
371
|
+
ctx.frameworks.usesServerActions && 'Server Actions',
|
|
372
|
+
].filter(Boolean).join(', ')}`);
|
|
373
|
+
}
|
|
374
|
+
lines.push('');
|
|
375
|
+
// Auth info
|
|
376
|
+
lines.push('### Authentication & Access Control');
|
|
377
|
+
if (ctx.auth.hasGlobalMiddleware) {
|
|
378
|
+
lines.push(`- **Global auth middleware detected** (${ctx.auth.authProvider || 'custom'})`);
|
|
379
|
+
if (ctx.auth.middlewareFile) {
|
|
380
|
+
lines.push(` - Middleware file: \`${ctx.auth.middlewareFile}\``);
|
|
381
|
+
}
|
|
382
|
+
if (ctx.auth.protectedPaths.length > 0) {
|
|
383
|
+
lines.push(` - Protected paths: ${ctx.auth.protectedPaths.join(', ')}`);
|
|
384
|
+
}
|
|
385
|
+
if (ctx.auth.publicPaths.length > 0) {
|
|
386
|
+
lines.push(` - Public paths: ${ctx.auth.publicPaths.join(', ')}`);
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
else {
|
|
390
|
+
lines.push('- No global auth middleware detected');
|
|
391
|
+
}
|
|
392
|
+
if (ctx.auth.authHelpers.length > 0) {
|
|
393
|
+
lines.push(`- **Auth helpers found:** ${ctx.auth.authHelpers.join(', ')}`);
|
|
394
|
+
}
|
|
395
|
+
// Throwing auth helpers - CRITICAL for AI validation
|
|
396
|
+
if (ctx.auth.throwingAuthHelpers && ctx.auth.throwingAuthHelpers.length > 0) {
|
|
397
|
+
lines.push('- **Throwing auth helpers detected** (these GUARANTEE authenticated context):');
|
|
398
|
+
for (const helper of ctx.auth.throwingAuthHelpers) {
|
|
399
|
+
const location = helper.definedIn ? ` (in ${helper.definedIn})` : '';
|
|
400
|
+
lines.push(` - \`${helper.name}()\`${location} - throws/redirects on missing auth`);
|
|
401
|
+
}
|
|
402
|
+
lines.push(' - Code AFTER these calls is guaranteed to have an authenticated user');
|
|
403
|
+
lines.push(' - Do NOT flag "missing auth" or suggest `if (!userId)` checks after these calls');
|
|
404
|
+
}
|
|
405
|
+
if (ctx.auth.hasUserScoping) {
|
|
406
|
+
lines.push('- **User scoping detected** in database queries (data is filtered by user/tenant ID)');
|
|
407
|
+
}
|
|
408
|
+
lines.push('');
|
|
409
|
+
// Data access info
|
|
410
|
+
lines.push('### Data Access');
|
|
411
|
+
if (ctx.dataAccess.orm) {
|
|
412
|
+
lines.push(`- **ORM/Query Builder:** ${ctx.dataAccess.orm}`);
|
|
413
|
+
if (ctx.dataAccess.usesParameterizedQueries) {
|
|
414
|
+
lines.push(' - Uses parameterized queries by default (SQL injection protection)');
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
if (ctx.dataAccess.databaseType) {
|
|
418
|
+
lines.push(`- **Database:** ${ctx.dataAccess.databaseType}`);
|
|
419
|
+
}
|
|
420
|
+
if (ctx.dataAccess.hasRLS) {
|
|
421
|
+
lines.push('- **Row Level Security (RLS)** is enabled');
|
|
422
|
+
}
|
|
423
|
+
if (ctx.dataAccess.validationLibrary) {
|
|
424
|
+
lines.push(`- **Input validation:** ${ctx.dataAccess.validationLibrary}`);
|
|
425
|
+
}
|
|
426
|
+
lines.push('');
|
|
427
|
+
// Secrets info
|
|
428
|
+
lines.push('### Secrets & Configuration');
|
|
429
|
+
if (ctx.secrets.usesEnvVars) {
|
|
430
|
+
lines.push('- Uses environment variables for configuration');
|
|
431
|
+
}
|
|
432
|
+
if (ctx.secrets.usesSecretManager) {
|
|
433
|
+
lines.push(`- Uses secret manager: ${ctx.secrets.secretManagerType}`);
|
|
434
|
+
}
|
|
435
|
+
if (ctx.secrets.hasClientExposedEnvVars) {
|
|
436
|
+
lines.push('- Has NEXT_PUBLIC_ env vars (intentionally client-exposed)');
|
|
437
|
+
}
|
|
438
|
+
lines.push('');
|
|
439
|
+
// Validation guidance
|
|
440
|
+
lines.push('### Validation Guidance');
|
|
441
|
+
lines.push('Based on this context:');
|
|
442
|
+
if (ctx.auth.hasGlobalMiddleware) {
|
|
443
|
+
lines.push(`- Routes under protected paths are guarded by ${ctx.auth.authProvider || 'auth'} middleware`);
|
|
444
|
+
lines.push('- Downgrade "missing auth" findings for routes covered by middleware');
|
|
445
|
+
}
|
|
446
|
+
if (ctx.auth.throwingAuthHelpers && ctx.auth.throwingAuthHelpers.length > 0) {
|
|
447
|
+
lines.push('- Throwing auth helpers provide guaranteed auth context - do NOT suggest redundant null checks');
|
|
448
|
+
}
|
|
449
|
+
if (ctx.auth.hasUserScoping) {
|
|
450
|
+
lines.push('- Database queries are scoped by user ID - cross-tenant access is mitigated');
|
|
451
|
+
}
|
|
452
|
+
if (ctx.dataAccess.usesParameterizedQueries) {
|
|
453
|
+
lines.push('- SQL injection risk is low due to parameterized queries');
|
|
454
|
+
}
|
|
455
|
+
if (ctx.dataAccess.hasRLS) {
|
|
456
|
+
lines.push('- RLS provides database-level access control');
|
|
457
|
+
}
|
|
458
|
+
// OAuth flow context
|
|
459
|
+
if (ctx.oauth && (ctx.oauth.hasStateGeneration || ctx.oauth.hasStateValidation || ctx.oauth.hasCodeVerifier)) {
|
|
460
|
+
lines.push('');
|
|
461
|
+
lines.push('### OAuth Flow');
|
|
462
|
+
if ((0, oauth_flow_detector_1.isOAuthStateImplemented)(ctx.oauth)) {
|
|
463
|
+
lines.push('- **OAuth state is properly implemented** across files');
|
|
464
|
+
if (ctx.oauth.stateGenerationFile) {
|
|
465
|
+
lines.push(` - State generated in: \`${ctx.oauth.stateGenerationFile}\``);
|
|
466
|
+
}
|
|
467
|
+
if (ctx.oauth.stateValidationFile) {
|
|
468
|
+
lines.push(` - State validated in: \`${ctx.oauth.stateValidationFile}\``);
|
|
469
|
+
}
|
|
470
|
+
lines.push('- Do NOT flag "OAuth state missing" - it is implemented correctly');
|
|
471
|
+
}
|
|
472
|
+
else if (ctx.oauth.flowType === 'client_credentials') {
|
|
473
|
+
lines.push('- **Client credentials flow detected** - no state parameter needed');
|
|
474
|
+
}
|
|
475
|
+
else if (ctx.oauth.hasCodeVerifier) {
|
|
476
|
+
lines.push('- **PKCE flow detected** - code_verifier provides CSRF protection');
|
|
477
|
+
}
|
|
478
|
+
if (ctx.oauth.providers.length > 0) {
|
|
479
|
+
lines.push(`- OAuth providers: ${ctx.oauth.providers.join(', ')}`);
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
// tRPC context
|
|
483
|
+
if (ctx.trpc && ctx.trpc.hasTRPC) {
|
|
484
|
+
lines.push('');
|
|
485
|
+
lines.push('### tRPC');
|
|
486
|
+
lines.push(`- ${(0, trpc_analyzer_1.getTRPCSummary)(ctx.trpc)}`);
|
|
487
|
+
const protectedRouters = Array.from(ctx.trpc.routers.values()).filter(r => r.isProtected);
|
|
488
|
+
if (protectedRouters.length > 0) {
|
|
489
|
+
lines.push('- **Protected tRPC routers detected:**');
|
|
490
|
+
for (const router of protectedRouters) {
|
|
491
|
+
lines.push(` - \`${router.name}\` router is protected by auth middleware`);
|
|
492
|
+
}
|
|
493
|
+
lines.push('- Frontend calls to protected tRPC procedures are SAFE - backend handles auth');
|
|
494
|
+
lines.push('- Do NOT flag "missing role check" on frontend components calling protected tRPC procedures');
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
return lines.join('\n');
|
|
498
|
+
}
|
|
499
|
+
// ============================================================================
|
|
500
|
+
// Helpers
|
|
501
|
+
// ============================================================================
|
|
502
|
+
function isCodeFile(path) {
|
|
503
|
+
return /\.(ts|tsx|js|jsx|mjs|cjs|py|rb|php|go|java|cs)$/i.test(path);
|
|
504
|
+
}
|
|
505
|
+
function getFileExtension(path) {
|
|
506
|
+
const match = path.match(/\.([^.]+)$/);
|
|
507
|
+
return match ? `.${match[1]}` : 'unknown';
|
|
508
|
+
}
|
|
509
|
+
/**
|
|
510
|
+
* Generate a compact context string for a single file validation
|
|
511
|
+
* Used when validating findings in a specific file
|
|
512
|
+
*/
|
|
513
|
+
function getFileValidationContext(file, projectContext) {
|
|
514
|
+
const lines = [];
|
|
515
|
+
// Include relevant project context
|
|
516
|
+
lines.push(projectContext.summary);
|
|
517
|
+
lines.push('');
|
|
518
|
+
// Add file-specific context
|
|
519
|
+
lines.push(`### Current File: \`${file.path}\``);
|
|
520
|
+
// Determine if this file is server-only
|
|
521
|
+
const isServerFile = /\/api\/|\/server\/|\.server\.|\/actions\/|route\.(ts|js)$|middleware\.(ts|js)$/i.test(file.path);
|
|
522
|
+
if (isServerFile) {
|
|
523
|
+
lines.push('- This is a **server-only** file (not bundled to client)');
|
|
524
|
+
}
|
|
525
|
+
// Check if file is under protected routes
|
|
526
|
+
if (projectContext.auth.hasGlobalMiddleware) {
|
|
527
|
+
const isProtected = projectContext.auth.protectedPaths.some(p => file.path.includes(p.replace(/\*\*/g, '').replace(/\*/g, '')));
|
|
528
|
+
if (isProtected) {
|
|
529
|
+
lines.push(`- This route is **protected by ${projectContext.auth.authProvider || 'auth'} middleware**`);
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
return lines.join('\n');
|
|
533
|
+
}
|
|
534
|
+
//# sourceMappingURL=project-context-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-context-builder.js","sourceRoot":"","sources":["../../src/utils/project-context-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry Clients for Package Metadata
|
|
3
|
+
* Fetches package information from npm and PyPI registries
|
|
4
|
+
* Used by the Hallucination Firewall (Story C) to assess dependency risk
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* NPM Package Metadata Interface
|
|
8
|
+
*/
|
|
9
|
+
export interface NPMPackageMetadata {
|
|
10
|
+
name: string;
|
|
11
|
+
version: string;
|
|
12
|
+
description?: string;
|
|
13
|
+
maintainers: Array<{
|
|
14
|
+
name: string;
|
|
15
|
+
email?: string;
|
|
16
|
+
}>;
|
|
17
|
+
time: {
|
|
18
|
+
created: string;
|
|
19
|
+
modified: string;
|
|
20
|
+
[version: string]: string;
|
|
21
|
+
};
|
|
22
|
+
repository?: {
|
|
23
|
+
type: string;
|
|
24
|
+
url: string;
|
|
25
|
+
};
|
|
26
|
+
homepage?: string;
|
|
27
|
+
license?: string;
|
|
28
|
+
downloads?: {
|
|
29
|
+
weekly: number;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* PyPI Package Metadata Interface
|
|
34
|
+
*/
|
|
35
|
+
export interface PyPIPackageMetadata {
|
|
36
|
+
name: string;
|
|
37
|
+
version: string;
|
|
38
|
+
summary?: string;
|
|
39
|
+
author?: string;
|
|
40
|
+
authorEmail?: string;
|
|
41
|
+
license?: string;
|
|
42
|
+
projectUrls?: Record<string, string>;
|
|
43
|
+
releaseDate?: string;
|
|
44
|
+
requiresPython?: string;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Extracted dependency information
|
|
48
|
+
*/
|
|
49
|
+
export interface ExtractedDependency {
|
|
50
|
+
name: string;
|
|
51
|
+
version?: string;
|
|
52
|
+
source: 'dependencies' | 'devDependencies' | 'peerDependencies' | 'optionalDependencies' | 'requirements';
|
|
53
|
+
line: number;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Fetch package metadata from npm registry
|
|
57
|
+
* Returns null if package doesn't exist
|
|
58
|
+
*/
|
|
59
|
+
export declare function fetchNPMMetadata(packageName: string): Promise<NPMPackageMetadata | null>;
|
|
60
|
+
/**
|
|
61
|
+
* Fetch package metadata from PyPI registry
|
|
62
|
+
* Returns null if package doesn't exist
|
|
63
|
+
*/
|
|
64
|
+
export declare function fetchPyPIMetadata(packageName: string): Promise<PyPIPackageMetadata | null>;
|
|
65
|
+
/**
|
|
66
|
+
* Extract dependencies from package.json content
|
|
67
|
+
*/
|
|
68
|
+
export declare function extractNpmDependencies(content: string): ExtractedDependency[];
|
|
69
|
+
/**
|
|
70
|
+
* Extract dependencies from requirements.txt content
|
|
71
|
+
*/
|
|
72
|
+
export declare function extractPythonRequirements(content: string): ExtractedDependency[];
|
|
73
|
+
/**
|
|
74
|
+
* Extract dependencies from pyproject.toml content
|
|
75
|
+
*/
|
|
76
|
+
export declare function extractPyprojectDependencies(content: string): ExtractedDependency[];
|
|
77
|
+
/**
|
|
78
|
+
* Determine the package file type from path
|
|
79
|
+
*/
|
|
80
|
+
export declare function getPackageFileType(filePath: string): 'npm' | 'python' | null;
|
|
81
|
+
/**
|
|
82
|
+
* Calculate package age in days from creation date
|
|
83
|
+
*/
|
|
84
|
+
export declare function calculatePackageAgeDays(createdDate: string | undefined): number;
|
|
85
|
+
/**
|
|
86
|
+
* Rate limiter helper - adds delay between registry requests
|
|
87
|
+
*/
|
|
88
|
+
export declare function rateLimitDelay(): Promise<void>;
|
|
89
|
+
/**
|
|
90
|
+
* Clear all caches (useful for testing)
|
|
91
|
+
*/
|
|
92
|
+
export declare function clearRegistryCaches(): void;
|
|
93
|
+
//# sourceMappingURL=registry-clients.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-clients.d.ts","sourceRoot":"","sources":["../../src/utils/registry-clients.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACpD,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAA;QACf,QAAQ,EAAE,MAAM,CAAA;QAChB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAA;KAC1B,CAAA;IACD,UAAU,CAAC,EAAE;QACX,IAAI,EAAE,MAAM,CAAA;QACZ,GAAG,EAAE,MAAM,CAAA;KACZ,CAAA;IACD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE;QACV,MAAM,EAAE,MAAM,CAAA;KACf,CAAA;CACF;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACpC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,cAAc,GAAG,iBAAiB,GAAG,kBAAkB,GAAG,sBAAsB,GAAG,cAAc,CAAA;IACzG,IAAI,EAAE,MAAM,CAAA;CACb;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CA8D9F;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAqDhG;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAiC7E;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAyBhF;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAoCnF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,IAAI,CAkB5E;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAW/E;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAEpD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAG1C"}
|