@vibecheckai/cli 3.5.0 → 3.5.2
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/registry.js +214 -237
- package/bin/runners/cli-utils.js +33 -2
- package/bin/runners/context/analyzer.js +52 -1
- package/bin/runners/context/generators/cursor.js +2 -49
- package/bin/runners/context/git-context.js +3 -1
- package/bin/runners/context/team-conventions.js +33 -7
- package/bin/runners/lib/analysis-core.js +25 -5
- package/bin/runners/lib/analyzers.js +431 -481
- package/bin/runners/lib/default-config.js +127 -0
- package/bin/runners/lib/doctor/modules/security.js +3 -1
- package/bin/runners/lib/engine/ast-cache.js +210 -0
- package/bin/runners/lib/engine/auth-extractor.js +211 -0
- package/bin/runners/lib/engine/billing-extractor.js +112 -0
- package/bin/runners/lib/engine/enforcement-extractor.js +100 -0
- package/bin/runners/lib/engine/env-extractor.js +207 -0
- package/bin/runners/lib/engine/express-extractor.js +208 -0
- package/bin/runners/lib/engine/extractors.js +849 -0
- package/bin/runners/lib/engine/index.js +207 -0
- package/bin/runners/lib/engine/repo-index.js +514 -0
- package/bin/runners/lib/engine/types.js +124 -0
- package/bin/runners/lib/engines/accessibility-engine.js +18 -218
- package/bin/runners/lib/engines/api-consistency-engine.js +30 -335
- package/bin/runners/lib/engines/cross-file-analysis-engine.js +27 -292
- package/bin/runners/lib/engines/empty-catch-engine.js +17 -127
- package/bin/runners/lib/engines/mock-data-engine.js +10 -53
- package/bin/runners/lib/engines/performance-issues-engine.js +36 -176
- package/bin/runners/lib/engines/security-vulnerabilities-engine.js +54 -382
- package/bin/runners/lib/engines/type-aware-engine.js +39 -263
- package/bin/runners/lib/engines/vibecheck-engines/index.js +13 -122
- package/bin/runners/lib/engines/vibecheck-engines/lib/ast-cache.js +164 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/code-quality-engine.js +291 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/console-logs-engine.js +83 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/dead-code-engine.js +198 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/deprecated-api-engine.js +275 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/empty-catch-engine.js +167 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/file-filter.js +217 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/hardcoded-secrets-engine.js +73 -373
- package/bin/runners/lib/engines/vibecheck-engines/lib/mock-data-engine.js +140 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/parallel-processor.js +164 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/performance-issues-engine.js +234 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/type-aware-engine.js +217 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/unsafe-regex-engine.js +78 -0
- package/bin/runners/lib/entitlements-v2.js +73 -97
- package/bin/runners/lib/error-handler.js +44 -3
- package/bin/runners/lib/error-messages.js +289 -0
- package/bin/runners/lib/evidence-pack.js +7 -1
- package/bin/runners/lib/finding-id.js +69 -0
- package/bin/runners/lib/finding-sorter.js +89 -0
- package/bin/runners/lib/html-proof-report.js +700 -350
- package/bin/runners/lib/missions/plan.js +6 -46
- package/bin/runners/lib/missions/templates.js +0 -232
- package/bin/runners/lib/next-action.js +560 -0
- package/bin/runners/lib/prerequisites.js +149 -0
- package/bin/runners/lib/route-detection.js +137 -68
- package/bin/runners/lib/scan-output.js +91 -76
- package/bin/runners/lib/scan-runner.js +135 -0
- package/bin/runners/lib/schemas/ajv-validator.js +464 -0
- package/bin/runners/lib/schemas/error-envelope.schema.json +105 -0
- package/bin/runners/lib/schemas/finding-v3.schema.json +151 -0
- package/bin/runners/lib/schemas/report-artifact.schema.json +120 -0
- package/bin/runners/lib/schemas/run-request.schema.json +108 -0
- package/bin/runners/lib/schemas/validator.js +27 -0
- package/bin/runners/lib/schemas/verdict.schema.json +140 -0
- package/bin/runners/lib/ship-output-enterprise.js +23 -23
- package/bin/runners/lib/ship-output.js +75 -31
- package/bin/runners/lib/terminal-ui.js +6 -113
- package/bin/runners/lib/truth.js +351 -10
- package/bin/runners/lib/unified-cli-output.js +430 -603
- package/bin/runners/lib/unified-output.js +13 -9
- package/bin/runners/runAIAgent.js +10 -5
- package/bin/runners/runAgent.js +0 -3
- package/bin/runners/runAllowlist.js +389 -0
- package/bin/runners/runApprove.js +0 -33
- package/bin/runners/runAuth.js +73 -45
- package/bin/runners/runCheckpoint.js +51 -11
- package/bin/runners/runClassify.js +85 -21
- package/bin/runners/runContext.js +0 -3
- package/bin/runners/runDoctor.js +41 -28
- package/bin/runners/runEvidencePack.js +362 -0
- package/bin/runners/runFirewall.js +0 -3
- package/bin/runners/runFirewallHook.js +0 -3
- package/bin/runners/runFix.js +66 -76
- package/bin/runners/runGuard.js +18 -411
- package/bin/runners/runInit.js +113 -30
- package/bin/runners/runLabs.js +424 -0
- package/bin/runners/runMcp.js +19 -25
- package/bin/runners/runPolish.js +64 -240
- package/bin/runners/runPromptFirewall.js +12 -5
- package/bin/runners/runProve.js +57 -22
- package/bin/runners/runQuickstart.js +531 -0
- package/bin/runners/runReality.js +59 -68
- package/bin/runners/runReport.js +38 -33
- package/bin/runners/runRuntime.js +8 -5
- package/bin/runners/runScan.js +1413 -190
- package/bin/runners/runShip.js +113 -719
- package/bin/runners/runTruth.js +0 -3
- package/bin/runners/runValidate.js +13 -9
- package/bin/runners/runWatch.js +23 -14
- package/bin/scan.js +6 -1
- package/bin/vibecheck.js +204 -185
- package/mcp-server/deprecation-middleware.js +282 -0
- package/mcp-server/handlers/index.ts +15 -0
- package/mcp-server/handlers/tool-handler.ts +554 -0
- package/mcp-server/index-v1.js +698 -0
- package/mcp-server/index.js +210 -238
- package/mcp-server/lib/cache-wrapper.cjs +383 -0
- package/mcp-server/lib/error-envelope.js +138 -0
- package/mcp-server/lib/executor.ts +499 -0
- package/mcp-server/lib/index.ts +19 -0
- package/mcp-server/lib/rate-limiter.js +166 -0
- package/mcp-server/lib/sandbox.test.ts +519 -0
- package/mcp-server/lib/sandbox.ts +395 -0
- package/mcp-server/lib/types.ts +267 -0
- package/mcp-server/package.json +12 -3
- package/mcp-server/registry/tool-registry.js +794 -0
- package/mcp-server/registry/tools.json +605 -0
- package/mcp-server/registry.test.ts +334 -0
- package/mcp-server/tests/tier-gating.test.js +297 -0
- package/mcp-server/tier-auth.js +378 -45
- package/mcp-server/tools-v3.js +353 -442
- package/mcp-server/tsconfig.json +37 -0
- package/mcp-server/vibecheck-2.0-tools.js +14 -1
- package/package.json +1 -1
- package/bin/runners/lib/agent-firewall/learning/learning-engine.js +0 -849
- package/bin/runners/lib/audit-logger.js +0 -532
- package/bin/runners/lib/authority/authorities/architecture.js +0 -364
- package/bin/runners/lib/authority/authorities/compliance.js +0 -341
- package/bin/runners/lib/authority/authorities/human.js +0 -343
- package/bin/runners/lib/authority/authorities/quality.js +0 -420
- package/bin/runners/lib/authority/authorities/security.js +0 -228
- package/bin/runners/lib/authority/index.js +0 -293
- package/bin/runners/lib/bundle/bundle-intelligence.js +0 -846
- package/bin/runners/lib/cli-charts.js +0 -368
- package/bin/runners/lib/cli-config-display.js +0 -405
- package/bin/runners/lib/cli-demo.js +0 -275
- package/bin/runners/lib/cli-errors.js +0 -438
- package/bin/runners/lib/cli-help-formatter.js +0 -439
- package/bin/runners/lib/cli-interactive-menu.js +0 -509
- package/bin/runners/lib/cli-prompts.js +0 -441
- package/bin/runners/lib/cli-scan-cards.js +0 -362
- package/bin/runners/lib/compliance-reporter.js +0 -710
- package/bin/runners/lib/conductor/index.js +0 -671
- package/bin/runners/lib/easy/README.md +0 -123
- package/bin/runners/lib/easy/index.js +0 -140
- package/bin/runners/lib/easy/interactive-wizard.js +0 -788
- package/bin/runners/lib/easy/one-click-firewall.js +0 -564
- package/bin/runners/lib/easy/zero-config-reality.js +0 -714
- package/bin/runners/lib/engines/async-patterns-engine.js +0 -444
- package/bin/runners/lib/engines/bundle-size-engine.js +0 -433
- package/bin/runners/lib/engines/confidence-scoring.js +0 -276
- package/bin/runners/lib/engines/context-detection.js +0 -264
- package/bin/runners/lib/engines/database-patterns-engine.js +0 -429
- package/bin/runners/lib/engines/duplicate-code-engine.js +0 -354
- package/bin/runners/lib/engines/env-variables-engine.js +0 -458
- package/bin/runners/lib/engines/error-handling-engine.js +0 -437
- package/bin/runners/lib/engines/false-positive-prevention.js +0 -630
- package/bin/runners/lib/engines/framework-adapters/index.js +0 -607
- package/bin/runners/lib/engines/framework-detection.js +0 -508
- package/bin/runners/lib/engines/import-order-engine.js +0 -429
- package/bin/runners/lib/engines/naming-conventions-engine.js +0 -544
- package/bin/runners/lib/engines/noise-reduction-engine.js +0 -452
- package/bin/runners/lib/engines/orchestrator.js +0 -334
- package/bin/runners/lib/engines/react-patterns-engine.js +0 -457
- package/bin/runners/lib/engines/vibecheck-engines/lib/ai-hallucination-engine.js +0 -806
- package/bin/runners/lib/engines/vibecheck-engines/lib/smart-fix-engine.js +0 -577
- package/bin/runners/lib/engines/vibecheck-engines/lib/vibe-score-engine.js +0 -543
- package/bin/runners/lib/engines/vibecheck-engines.js +0 -514
- package/bin/runners/lib/enhanced-features/index.js +0 -305
- package/bin/runners/lib/enhanced-output.js +0 -631
- package/bin/runners/lib/enterprise.js +0 -300
- package/bin/runners/lib/firewall/command-validator.js +0 -351
- package/bin/runners/lib/firewall/config.js +0 -341
- package/bin/runners/lib/firewall/content-validator.js +0 -519
- package/bin/runners/lib/firewall/index.js +0 -101
- package/bin/runners/lib/firewall/path-validator.js +0 -256
- package/bin/runners/lib/intelligence/cross-repo-intelligence.js +0 -817
- package/bin/runners/lib/mcp-utils.js +0 -425
- package/bin/runners/lib/output/index.js +0 -1022
- package/bin/runners/lib/policy-engine.js +0 -652
- package/bin/runners/lib/polish/autofix/accessibility-fixes.js +0 -333
- package/bin/runners/lib/polish/autofix/async-handlers.js +0 -273
- package/bin/runners/lib/polish/autofix/dead-code.js +0 -280
- package/bin/runners/lib/polish/autofix/imports-optimizer.js +0 -344
- package/bin/runners/lib/polish/autofix/index.js +0 -200
- package/bin/runners/lib/polish/autofix/remove-consoles.js +0 -209
- package/bin/runners/lib/polish/autofix/strengthen-types.js +0 -245
- package/bin/runners/lib/polish/backend-checks.js +0 -148
- package/bin/runners/lib/polish/documentation-checks.js +0 -111
- package/bin/runners/lib/polish/frontend-checks.js +0 -168
- package/bin/runners/lib/polish/index.js +0 -71
- package/bin/runners/lib/polish/infrastructure-checks.js +0 -131
- package/bin/runners/lib/polish/library-detection.js +0 -175
- package/bin/runners/lib/polish/performance-checks.js +0 -100
- package/bin/runners/lib/polish/security-checks.js +0 -148
- package/bin/runners/lib/polish/utils.js +0 -203
- package/bin/runners/lib/prompt-builder.js +0 -540
- package/bin/runners/lib/proof-certificate.js +0 -634
- package/bin/runners/lib/reality/accessibility-audit.js +0 -946
- package/bin/runners/lib/reality/api-contract-validator.js +0 -1012
- package/bin/runners/lib/reality/chaos-engineering.js +0 -1084
- package/bin/runners/lib/reality/performance-tracker.js +0 -1077
- package/bin/runners/lib/reality/scenario-generator.js +0 -1404
- package/bin/runners/lib/reality/visual-regression.js +0 -852
- package/bin/runners/lib/reality-profiler.js +0 -717
- package/bin/runners/lib/replay/flight-recorder-viewer.js +0 -1160
- package/bin/runners/lib/review/ai-code-review.js +0 -832
- package/bin/runners/lib/rules/custom-rule-engine.js +0 -985
- package/bin/runners/lib/sbom-generator.js +0 -641
- package/bin/runners/lib/scan-output-enhanced.js +0 -512
- package/bin/runners/lib/security/owasp-scanner.js +0 -939
- package/bin/runners/lib/validators/contract-validator.js +0 -283
- package/bin/runners/lib/validators/dead-export-detector.js +0 -279
- package/bin/runners/lib/validators/dep-audit.js +0 -245
- package/bin/runners/lib/validators/env-validator.js +0 -319
- package/bin/runners/lib/validators/index.js +0 -120
- package/bin/runners/lib/validators/license-checker.js +0 -252
- package/bin/runners/lib/validators/route-validator.js +0 -290
- package/bin/runners/runAuthority.js +0 -528
- package/bin/runners/runConductor.js +0 -772
- package/bin/runners/runContainer.js +0 -366
- package/bin/runners/runEasy.js +0 -410
- package/bin/runners/runIaC.js +0 -372
- package/bin/runners/runVibe.js +0 -791
- package/mcp-server/tools.js +0 -495
|
@@ -1,540 +0,0 @@
|
|
|
1
|
-
// bin/runners/lib/prompt-builder.js
|
|
2
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
3
|
-
// CONSOLIDATED PROMPT BUILDER SERVICE
|
|
4
|
-
// Combines mission templates, reality firewall, and advanced enforcement
|
|
5
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
6
|
-
|
|
7
|
-
const path = require("path");
|
|
8
|
-
const fs = require("fs");
|
|
9
|
-
const { templateForMissionType } = require("./missions/templates");
|
|
10
|
-
const { CATEGORY_TO_MISSION_TYPE, MISSION_PRIORITY } = require("./missions/plan");
|
|
11
|
-
|
|
12
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
13
|
-
// PROMPT TEMPLATES - System prompts for different modes
|
|
14
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
15
|
-
|
|
16
|
-
const SYSTEM_PROMPTS = {
|
|
17
|
-
fix: `You are Vibecheck Fix Engine - a surgical code fixer that produces minimal, correct patches.
|
|
18
|
-
|
|
19
|
-
REALITY RULES (non-negotiable):
|
|
20
|
-
- Do NOT invent files, routes, env vars, middleware, or functions
|
|
21
|
-
- You may ONLY edit files in ALLOWED_FILES
|
|
22
|
-
- Use ONLY the provided evidence/snippets
|
|
23
|
-
- If evidence is insufficient, return {"status":"needs_info","questions":[...]} and STOP
|
|
24
|
-
- Output MUST be valid JSON only. No markdown. No commentary.`,
|
|
25
|
-
|
|
26
|
-
analyze: `You are Vibecheck Analyzer - an expert code reviewer that identifies issues.
|
|
27
|
-
|
|
28
|
-
ANALYSIS RULES:
|
|
29
|
-
- Base findings on evidence only
|
|
30
|
-
- Include file paths and line numbers when possible
|
|
31
|
-
- Provide actionable fix hints
|
|
32
|
-
- Categorize issues by severity (BLOCK, WARN, INFO)
|
|
33
|
-
- Include confidence scores (0-1)`,
|
|
34
|
-
|
|
35
|
-
verify: `You are Vibecheck Verifier - you validate fixes and check for regressions.
|
|
36
|
-
|
|
37
|
-
VERIFICATION RULES:
|
|
38
|
-
- Check that fixes address the original issue
|
|
39
|
-
- Verify no new issues are introduced
|
|
40
|
-
- Confirm allowed files constraint is respected
|
|
41
|
-
- Check for pattern compliance`,
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
45
|
-
// OUTPUT SCHEMAS - Expected response formats
|
|
46
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
47
|
-
|
|
48
|
-
const OUTPUT_SCHEMAS = {
|
|
49
|
-
fix: {
|
|
50
|
-
status: "ok | needs_info | cannot_fix",
|
|
51
|
-
summary: "one sentence describing the fix",
|
|
52
|
-
edits: [
|
|
53
|
-
{
|
|
54
|
-
path: "relative/file/path (must be in ALLOWED_FILES)",
|
|
55
|
-
diff: "unified diff starting with ---/+++",
|
|
56
|
-
reason: "why this edit fixes the mission",
|
|
57
|
-
},
|
|
58
|
-
],
|
|
59
|
-
notes: ["optional context or warnings"],
|
|
60
|
-
questions: ["only when status is needs_info"],
|
|
61
|
-
},
|
|
62
|
-
|
|
63
|
-
analyze: {
|
|
64
|
-
findings: [
|
|
65
|
-
{
|
|
66
|
-
id: "unique identifier",
|
|
67
|
-
severity: "BLOCK | WARN | INFO",
|
|
68
|
-
category: "category name",
|
|
69
|
-
title: "short title",
|
|
70
|
-
message: "detailed description",
|
|
71
|
-
file: "affected file",
|
|
72
|
-
line: "line number if applicable",
|
|
73
|
-
fixHint: "suggested fix approach",
|
|
74
|
-
confidence: "0-1 confidence score",
|
|
75
|
-
},
|
|
76
|
-
],
|
|
77
|
-
summary: "overall analysis summary",
|
|
78
|
-
},
|
|
79
|
-
|
|
80
|
-
verify: {
|
|
81
|
-
passed: "boolean",
|
|
82
|
-
checks: [
|
|
83
|
-
{
|
|
84
|
-
name: "check name",
|
|
85
|
-
status: "pass | fail | warning",
|
|
86
|
-
message: "result description",
|
|
87
|
-
evidence: "supporting evidence",
|
|
88
|
-
},
|
|
89
|
-
],
|
|
90
|
-
blockers: ["list of blocking issues"],
|
|
91
|
-
score: "0-100 overall score",
|
|
92
|
-
},
|
|
93
|
-
};
|
|
94
|
-
|
|
95
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
96
|
-
// ENFORCEMENT PATTERNS - What to check/enforce
|
|
97
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
98
|
-
|
|
99
|
-
const ENFORCEMENT_PATTERNS = {
|
|
100
|
-
// Files that should NEVER be edited
|
|
101
|
-
forbiddenFiles: [
|
|
102
|
-
/node_modules\//,
|
|
103
|
-
/\.git\//,
|
|
104
|
-
/package-lock\.json$/,
|
|
105
|
-
/pnpm-lock\.yaml$/,
|
|
106
|
-
/yarn\.lock$/,
|
|
107
|
-
/\.env$/,
|
|
108
|
-
/\.env\.local$/,
|
|
109
|
-
/dist\//,
|
|
110
|
-
/build\//,
|
|
111
|
-
/\.next\//,
|
|
112
|
-
],
|
|
113
|
-
|
|
114
|
-
// Patterns that indicate hallucination
|
|
115
|
-
hallucinationIndicators: [
|
|
116
|
-
/TODO:?\s*implement/i,
|
|
117
|
-
/TODO:?\s*add/i,
|
|
118
|
-
/\.\.\.\s*more\s+code/i,
|
|
119
|
-
/\/\/\s*rest\s+of/i,
|
|
120
|
-
/placeholder/i,
|
|
121
|
-
/example\.com/i,
|
|
122
|
-
/foo|bar|baz|qux/i,
|
|
123
|
-
],
|
|
124
|
-
|
|
125
|
-
// Required patterns for certain mission types
|
|
126
|
-
requiredPatterns: {
|
|
127
|
-
FIX_STRIPE_WEBHOOKS: [
|
|
128
|
-
/stripe\.webhooks\.constructEvent/,
|
|
129
|
-
/rawBody|text\(\)|arrayBuffer\(\)/,
|
|
130
|
-
],
|
|
131
|
-
ADD_SERVER_AUTH: [
|
|
132
|
-
/getServerSession|getSession|useAuth|withAuth/,
|
|
133
|
-
/401|403|unauthorized|forbidden/i,
|
|
134
|
-
],
|
|
135
|
-
FIX_HARDCODED_SECRETS: [/process\.env\./],
|
|
136
|
-
FIX_TEST_KEYS: [/process\.env\./],
|
|
137
|
-
},
|
|
138
|
-
};
|
|
139
|
-
|
|
140
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
141
|
-
// PROMPT BUILDER CLASS
|
|
142
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
143
|
-
|
|
144
|
-
class PromptBuilder {
|
|
145
|
-
constructor(projectPath) {
|
|
146
|
-
this.projectPath = projectPath;
|
|
147
|
-
this.enforcementEnabled = true;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* Build a fix prompt with full context and enforcement
|
|
152
|
-
*/
|
|
153
|
-
buildFixPrompt({
|
|
154
|
-
mission,
|
|
155
|
-
findings,
|
|
156
|
-
truthpackSummary,
|
|
157
|
-
fileSnippets,
|
|
158
|
-
allowedFiles,
|
|
159
|
-
options = {},
|
|
160
|
-
}) {
|
|
161
|
-
// Get mission template
|
|
162
|
-
const template = templateForMissionType(mission.type);
|
|
163
|
-
|
|
164
|
-
// Validate allowed files
|
|
165
|
-
const validatedFiles = this.validateAllowedFiles(allowedFiles);
|
|
166
|
-
|
|
167
|
-
// Build the prompt sections
|
|
168
|
-
const sections = [];
|
|
169
|
-
|
|
170
|
-
// System prompt
|
|
171
|
-
sections.push(SYSTEM_PROMPTS.fix);
|
|
172
|
-
|
|
173
|
-
// Allowed files constraint
|
|
174
|
-
sections.push(`
|
|
175
|
-
ALLOWED_FILES (you may ONLY edit these):
|
|
176
|
-
${JSON.stringify(validatedFiles, null, 2)}`);
|
|
177
|
-
|
|
178
|
-
// Mission template with instructions
|
|
179
|
-
sections.push(`
|
|
180
|
-
MISSION TEMPLATE:
|
|
181
|
-
Intent: ${template.intent}
|
|
182
|
-
|
|
183
|
-
DO:
|
|
184
|
-
${template.do.map((d, i) => `${i + 1}. ${d}`).join("\n")}
|
|
185
|
-
|
|
186
|
-
DON'T:
|
|
187
|
-
${template.dont.map((d) => `- ${d}`).join("\n")}
|
|
188
|
-
|
|
189
|
-
SUCCESS CRITERIA:
|
|
190
|
-
${template.success.map((s) => `- ${s}`).join("\n")}`);
|
|
191
|
-
|
|
192
|
-
// Output schema
|
|
193
|
-
sections.push(`
|
|
194
|
-
OUTPUT SCHEMA (return ONLY this JSON structure):
|
|
195
|
-
${JSON.stringify(OUTPUT_SCHEMAS.fix, null, 2)}`);
|
|
196
|
-
|
|
197
|
-
// Truthpack context
|
|
198
|
-
if (truthpackSummary) {
|
|
199
|
-
sections.push(`
|
|
200
|
-
TRUTHPACK SUMMARY (project reality - DO NOT contradict):
|
|
201
|
-
${JSON.stringify(truthpackSummary, null, 2)}`);
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
// Mission details
|
|
205
|
-
sections.push(`
|
|
206
|
-
MISSION:
|
|
207
|
-
${JSON.stringify(
|
|
208
|
-
{
|
|
209
|
-
id: mission.id,
|
|
210
|
-
type: mission.type,
|
|
211
|
-
title: mission.title,
|
|
212
|
-
severity: mission.severity,
|
|
213
|
-
targetFindingIds: mission.targetFindingIds,
|
|
214
|
-
},
|
|
215
|
-
null,
|
|
216
|
-
2
|
|
217
|
-
)}`);
|
|
218
|
-
|
|
219
|
-
// Target findings
|
|
220
|
-
sections.push(`
|
|
221
|
-
TARGET FINDINGS (what to fix):
|
|
222
|
-
${JSON.stringify(findings, null, 2)}`);
|
|
223
|
-
|
|
224
|
-
// Evidence snippets
|
|
225
|
-
if (fileSnippets && Object.keys(fileSnippets).length > 0) {
|
|
226
|
-
sections.push(`
|
|
227
|
-
EVIDENCE SNIPPETS (use these as reference):
|
|
228
|
-
${JSON.stringify(fileSnippets, null, 2)}`);
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
// Final instruction
|
|
232
|
-
sections.push(`
|
|
233
|
-
TASK:
|
|
234
|
-
Produce the smallest correct patch(es) to satisfy the mission success criteria.
|
|
235
|
-
Return ONLY valid JSON matching the OUTPUT SCHEMA.`);
|
|
236
|
-
|
|
237
|
-
const prompt = sections.join("\n\n");
|
|
238
|
-
|
|
239
|
-
// Enforce constraints if enabled
|
|
240
|
-
if (this.enforcementEnabled && !options.skipEnforcement) {
|
|
241
|
-
return this.enforcePromptConstraints(prompt, {
|
|
242
|
-
missionType: mission.type,
|
|
243
|
-
allowedFiles: validatedFiles,
|
|
244
|
-
});
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
return { prompt, valid: true, warnings: [] };
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
/**
|
|
251
|
-
* Build an analysis prompt
|
|
252
|
-
*/
|
|
253
|
-
buildAnalysisPrompt({ code, filePath, category, options = {} }) {
|
|
254
|
-
const sections = [];
|
|
255
|
-
|
|
256
|
-
sections.push(SYSTEM_PROMPTS.analyze);
|
|
257
|
-
sections.push(`
|
|
258
|
-
OUTPUT SCHEMA:
|
|
259
|
-
${JSON.stringify(OUTPUT_SCHEMAS.analyze, null, 2)}`);
|
|
260
|
-
|
|
261
|
-
sections.push(`
|
|
262
|
-
FILE: ${filePath}
|
|
263
|
-
CATEGORY: ${category || "general"}`);
|
|
264
|
-
|
|
265
|
-
if (options.patterns) {
|
|
266
|
-
sections.push(`
|
|
267
|
-
PATTERNS TO CHECK:
|
|
268
|
-
${JSON.stringify(options.patterns, null, 2)}`);
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
sections.push(`
|
|
272
|
-
CODE:
|
|
273
|
-
\`\`\`
|
|
274
|
-
${code}
|
|
275
|
-
\`\`\``);
|
|
276
|
-
|
|
277
|
-
sections.push(`
|
|
278
|
-
TASK:
|
|
279
|
-
Analyze the code and return findings in the OUTPUT SCHEMA format.`);
|
|
280
|
-
|
|
281
|
-
return { prompt: sections.join("\n\n"), valid: true, warnings: [] };
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
/**
|
|
285
|
-
* Build a verification prompt
|
|
286
|
-
*/
|
|
287
|
-
buildVerificationPrompt({ originalCode, patchedCode, mission, findings }) {
|
|
288
|
-
const template = templateForMissionType(mission.type);
|
|
289
|
-
const sections = [];
|
|
290
|
-
|
|
291
|
-
sections.push(SYSTEM_PROMPTS.verify);
|
|
292
|
-
sections.push(`
|
|
293
|
-
OUTPUT SCHEMA:
|
|
294
|
-
${JSON.stringify(OUTPUT_SCHEMAS.verify, null, 2)}`);
|
|
295
|
-
|
|
296
|
-
sections.push(`
|
|
297
|
-
MISSION TYPE: ${mission.type}
|
|
298
|
-
SUCCESS CRITERIA:
|
|
299
|
-
${template.success.map((s) => `- ${s}`).join("\n")}`);
|
|
300
|
-
|
|
301
|
-
sections.push(`
|
|
302
|
-
ORIGINAL FINDINGS:
|
|
303
|
-
${JSON.stringify(findings, null, 2)}`);
|
|
304
|
-
|
|
305
|
-
sections.push(`
|
|
306
|
-
BEFORE (original code):
|
|
307
|
-
\`\`\`
|
|
308
|
-
${originalCode}
|
|
309
|
-
\`\`\`
|
|
310
|
-
|
|
311
|
-
AFTER (patched code):
|
|
312
|
-
\`\`\`
|
|
313
|
-
${patchedCode}
|
|
314
|
-
\`\`\``);
|
|
315
|
-
|
|
316
|
-
sections.push(`
|
|
317
|
-
TASK:
|
|
318
|
-
Verify the patch fixes the original findings without introducing new issues.
|
|
319
|
-
Return verification result in the OUTPUT SCHEMA format.`);
|
|
320
|
-
|
|
321
|
-
return { prompt: sections.join("\n\n"), valid: true, warnings: [] };
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
/**
|
|
325
|
-
* Validate allowed files against forbidden patterns
|
|
326
|
-
*/
|
|
327
|
-
validateAllowedFiles(allowedFiles) {
|
|
328
|
-
if (!allowedFiles || !Array.isArray(allowedFiles)) return [];
|
|
329
|
-
|
|
330
|
-
return allowedFiles.filter((file) => {
|
|
331
|
-
// Check against forbidden patterns
|
|
332
|
-
for (const pattern of ENFORCEMENT_PATTERNS.forbiddenFiles) {
|
|
333
|
-
if (pattern.test(file)) {
|
|
334
|
-
return false;
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
return true;
|
|
338
|
-
});
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
/**
|
|
342
|
-
* Enforce prompt constraints and check for issues
|
|
343
|
-
*/
|
|
344
|
-
enforcePromptConstraints(prompt, { missionType, allowedFiles }) {
|
|
345
|
-
const warnings = [];
|
|
346
|
-
let valid = true;
|
|
347
|
-
|
|
348
|
-
// Check for hallucination indicators in any provided code snippets
|
|
349
|
-
for (const pattern of ENFORCEMENT_PATTERNS.hallucinationIndicators) {
|
|
350
|
-
if (pattern.test(prompt)) {
|
|
351
|
-
warnings.push(
|
|
352
|
-
`Potential hallucination indicator detected: ${pattern.source}`
|
|
353
|
-
);
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
// Check that required patterns are mentioned for specific mission types
|
|
358
|
-
const required = ENFORCEMENT_PATTERNS.requiredPatterns[missionType];
|
|
359
|
-
if (required) {
|
|
360
|
-
const missingPatterns = required.filter((p) => !p.test(prompt));
|
|
361
|
-
if (missingPatterns.length > 0) {
|
|
362
|
-
warnings.push(
|
|
363
|
-
`Mission type ${missionType} may need: ${missingPatterns.map((p) => p.source).join(", ")}`
|
|
364
|
-
);
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
// Validate that allowed files are actually needed
|
|
369
|
-
if (!allowedFiles || allowedFiles.length === 0) {
|
|
370
|
-
warnings.push("No allowed files specified - LLM may hallucinate files");
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
// Check prompt length (very long prompts may hit token limits)
|
|
374
|
-
if (prompt.length > 50000) {
|
|
375
|
-
warnings.push(
|
|
376
|
-
`Prompt is very long (${prompt.length} chars) - consider reducing context`
|
|
377
|
-
);
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
return {
|
|
381
|
-
prompt,
|
|
382
|
-
valid,
|
|
383
|
-
warnings,
|
|
384
|
-
};
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
/**
|
|
388
|
-
* Validate LLM response against expected schema
|
|
389
|
-
*/
|
|
390
|
-
validateResponse(response, mode = "fix") {
|
|
391
|
-
const errors = [];
|
|
392
|
-
const schema = OUTPUT_SCHEMAS[mode];
|
|
393
|
-
|
|
394
|
-
if (!response) {
|
|
395
|
-
errors.push("Response is empty");
|
|
396
|
-
return { valid: false, errors };
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
// Check required fields based on mode
|
|
400
|
-
if (mode === "fix") {
|
|
401
|
-
if (!response.status) {
|
|
402
|
-
errors.push("Missing required field: status");
|
|
403
|
-
} else if (!["ok", "needs_info", "cannot_fix"].includes(response.status)) {
|
|
404
|
-
errors.push(
|
|
405
|
-
`Invalid status: ${response.status} (expected ok, needs_info, or cannot_fix)`
|
|
406
|
-
);
|
|
407
|
-
}
|
|
408
|
-
|
|
409
|
-
if (response.status === "ok" && (!response.edits || !Array.isArray(response.edits))) {
|
|
410
|
-
errors.push("Status is 'ok' but no edits array provided");
|
|
411
|
-
}
|
|
412
|
-
|
|
413
|
-
if (response.status === "needs_info" && (!response.questions || !Array.isArray(response.questions))) {
|
|
414
|
-
errors.push(
|
|
415
|
-
"Status is 'needs_info' but no questions array provided"
|
|
416
|
-
);
|
|
417
|
-
}
|
|
418
|
-
|
|
419
|
-
// Validate each edit
|
|
420
|
-
if (response.edits) {
|
|
421
|
-
for (const edit of response.edits) {
|
|
422
|
-
if (!edit.path) errors.push("Edit missing path");
|
|
423
|
-
if (!edit.diff) errors.push("Edit missing diff");
|
|
424
|
-
if (!edit.reason) errors.push("Edit missing reason");
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
if (mode === "analyze") {
|
|
430
|
-
if (!response.findings || !Array.isArray(response.findings)) {
|
|
431
|
-
errors.push("Missing required field: findings array");
|
|
432
|
-
}
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
if (mode === "verify") {
|
|
436
|
-
if (typeof response.passed !== "boolean") {
|
|
437
|
-
errors.push("Missing required field: passed (boolean)");
|
|
438
|
-
}
|
|
439
|
-
if (!response.checks || !Array.isArray(response.checks)) {
|
|
440
|
-
errors.push("Missing required field: checks array");
|
|
441
|
-
}
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
return {
|
|
445
|
-
valid: errors.length === 0,
|
|
446
|
-
errors,
|
|
447
|
-
};
|
|
448
|
-
}
|
|
449
|
-
|
|
450
|
-
/**
|
|
451
|
-
* Validate that edits only touch allowed files
|
|
452
|
-
*/
|
|
453
|
-
validateEditsAgainstAllowedFiles(edits, allowedFiles) {
|
|
454
|
-
const violations = [];
|
|
455
|
-
const allowedSet = new Set(allowedFiles.map((f) => f.replace(/\\/g, "/")));
|
|
456
|
-
|
|
457
|
-
for (const edit of edits || []) {
|
|
458
|
-
const normalizedPath = (edit.path || "").replace(/\\/g, "/");
|
|
459
|
-
if (!allowedSet.has(normalizedPath)) {
|
|
460
|
-
violations.push({
|
|
461
|
-
path: edit.path,
|
|
462
|
-
message: `File "${edit.path}" is not in allowed files list`,
|
|
463
|
-
});
|
|
464
|
-
}
|
|
465
|
-
}
|
|
466
|
-
|
|
467
|
-
return {
|
|
468
|
-
valid: violations.length === 0,
|
|
469
|
-
violations,
|
|
470
|
-
};
|
|
471
|
-
}
|
|
472
|
-
|
|
473
|
-
/**
|
|
474
|
-
* Get mission template by type
|
|
475
|
-
*/
|
|
476
|
-
getMissionTemplate(missionType) {
|
|
477
|
-
return templateForMissionType(missionType);
|
|
478
|
-
}
|
|
479
|
-
|
|
480
|
-
/**
|
|
481
|
-
* Get mission type for a category
|
|
482
|
-
*/
|
|
483
|
-
getMissionTypeForCategory(category) {
|
|
484
|
-
return CATEGORY_TO_MISSION_TYPE[category] || "GENERIC_FIX";
|
|
485
|
-
}
|
|
486
|
-
|
|
487
|
-
/**
|
|
488
|
-
* Get priority for a mission type
|
|
489
|
-
*/
|
|
490
|
-
getMissionPriority(missionType) {
|
|
491
|
-
return MISSION_PRIORITY[missionType] || 99;
|
|
492
|
-
}
|
|
493
|
-
|
|
494
|
-
/**
|
|
495
|
-
* Enable/disable enforcement
|
|
496
|
-
*/
|
|
497
|
-
setEnforcement(enabled) {
|
|
498
|
-
this.enforcementEnabled = enabled;
|
|
499
|
-
}
|
|
500
|
-
}
|
|
501
|
-
|
|
502
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
503
|
-
// LEGACY COMPATIBILITY - buildRealityFirewall
|
|
504
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
505
|
-
|
|
506
|
-
/**
|
|
507
|
-
* Legacy function for backward compatibility
|
|
508
|
-
* Maps to PromptBuilder.buildFixPrompt
|
|
509
|
-
*/
|
|
510
|
-
function buildRealityFirewall({
|
|
511
|
-
truthpackSummary,
|
|
512
|
-
mission,
|
|
513
|
-
template,
|
|
514
|
-
findings,
|
|
515
|
-
fileSnippets,
|
|
516
|
-
allowedFiles,
|
|
517
|
-
}) {
|
|
518
|
-
const builder = new PromptBuilder(process.cwd());
|
|
519
|
-
const result = builder.buildFixPrompt({
|
|
520
|
-
mission,
|
|
521
|
-
findings,
|
|
522
|
-
truthpackSummary,
|
|
523
|
-
fileSnippets,
|
|
524
|
-
allowedFiles,
|
|
525
|
-
options: { skipEnforcement: true }, // Legacy doesn't use enforcement
|
|
526
|
-
});
|
|
527
|
-
return result.prompt;
|
|
528
|
-
}
|
|
529
|
-
|
|
530
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
531
|
-
// EXPORTS
|
|
532
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
533
|
-
|
|
534
|
-
module.exports = {
|
|
535
|
-
PromptBuilder,
|
|
536
|
-
buildRealityFirewall, // Legacy compatibility
|
|
537
|
-
SYSTEM_PROMPTS,
|
|
538
|
-
OUTPUT_SCHEMAS,
|
|
539
|
-
ENFORCEMENT_PATTERNS,
|
|
540
|
-
};
|