@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,341 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Firewall Configuration Loader
|
|
3
|
-
*
|
|
4
|
-
* Loads and validates firewall configuration from:
|
|
5
|
-
* - .vibecheck/firewall.json (project-level)
|
|
6
|
-
* - Default configuration (fallback)
|
|
7
|
-
*
|
|
8
|
-
* Configuration defines:
|
|
9
|
-
* - Forbidden paths (secrets, configs)
|
|
10
|
-
* - Allowed paths (src, lib, test)
|
|
11
|
-
* - Dangerous commands to block
|
|
12
|
-
* - Hallucination patterns to detect
|
|
13
|
-
* - Custom rules
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
"use strict";
|
|
17
|
-
|
|
18
|
-
const fs = require("fs");
|
|
19
|
-
const path = require("path");
|
|
20
|
-
|
|
21
|
-
// ============================================================================
|
|
22
|
-
// DEFAULT CONFIGURATION
|
|
23
|
-
// ============================================================================
|
|
24
|
-
|
|
25
|
-
const DEFAULT_CONFIG = {
|
|
26
|
-
version: "1.0",
|
|
27
|
-
mode: "observe",
|
|
28
|
-
|
|
29
|
-
// Path rules
|
|
30
|
-
paths: {
|
|
31
|
-
forbidden: [
|
|
32
|
-
// Secrets and credentials
|
|
33
|
-
".env",
|
|
34
|
-
".env.*",
|
|
35
|
-
"*.pem",
|
|
36
|
-
"*.key",
|
|
37
|
-
"*.p12",
|
|
38
|
-
"*.pfx",
|
|
39
|
-
"secrets/**",
|
|
40
|
-
"credentials/**",
|
|
41
|
-
".secrets/**",
|
|
42
|
-
|
|
43
|
-
// Config files with potential secrets
|
|
44
|
-
"config/production.*",
|
|
45
|
-
"config/secrets.*",
|
|
46
|
-
".aws/**",
|
|
47
|
-
".ssh/**",
|
|
48
|
-
|
|
49
|
-
// Package lock files (can cause issues)
|
|
50
|
-
"package-lock.json",
|
|
51
|
-
"pnpm-lock.yaml",
|
|
52
|
-
"yarn.lock",
|
|
53
|
-
|
|
54
|
-
// Git internals
|
|
55
|
-
".git/**",
|
|
56
|
-
".gitconfig",
|
|
57
|
-
],
|
|
58
|
-
allowed: [
|
|
59
|
-
// Source directories
|
|
60
|
-
"src/**",
|
|
61
|
-
"lib/**",
|
|
62
|
-
"app/**",
|
|
63
|
-
"apps/**",
|
|
64
|
-
"packages/**",
|
|
65
|
-
|
|
66
|
-
// Test directories
|
|
67
|
-
"test/**",
|
|
68
|
-
"tests/**",
|
|
69
|
-
"__tests__/**",
|
|
70
|
-
"spec/**",
|
|
71
|
-
|
|
72
|
-
// Common config (non-secret)
|
|
73
|
-
"*.config.js",
|
|
74
|
-
"*.config.ts",
|
|
75
|
-
"tsconfig.json",
|
|
76
|
-
"package.json",
|
|
77
|
-
],
|
|
78
|
-
// If true, only files in allowed paths can be written
|
|
79
|
-
enforceAllowList: false,
|
|
80
|
-
},
|
|
81
|
-
|
|
82
|
-
// Dangerous command patterns
|
|
83
|
-
commands: {
|
|
84
|
-
blocked: [
|
|
85
|
-
// Destructive operations
|
|
86
|
-
"rm -rf /",
|
|
87
|
-
"rm -rf /*",
|
|
88
|
-
"rm -rf ~",
|
|
89
|
-
"rm -rf .",
|
|
90
|
-
"rmdir /s /q",
|
|
91
|
-
|
|
92
|
-
// Remote code execution
|
|
93
|
-
"curl | bash",
|
|
94
|
-
"curl | sh",
|
|
95
|
-
"wget | bash",
|
|
96
|
-
"wget | sh",
|
|
97
|
-
"curl -s | bash",
|
|
98
|
-
|
|
99
|
-
// System modifications
|
|
100
|
-
"chmod 777",
|
|
101
|
-
"sudo rm",
|
|
102
|
-
"sudo chmod",
|
|
103
|
-
|
|
104
|
-
// Database drops
|
|
105
|
-
"DROP DATABASE",
|
|
106
|
-
"DROP TABLE",
|
|
107
|
-
"TRUNCATE TABLE",
|
|
108
|
-
|
|
109
|
-
// Git force operations
|
|
110
|
-
"git push --force",
|
|
111
|
-
"git push -f origin main",
|
|
112
|
-
"git reset --hard",
|
|
113
|
-
|
|
114
|
-
// NPM publish without verification
|
|
115
|
-
"npm publish",
|
|
116
|
-
],
|
|
117
|
-
// Patterns that require confirmation
|
|
118
|
-
requireConfirmation: [
|
|
119
|
-
"npm install",
|
|
120
|
-
"yarn add",
|
|
121
|
-
"pnpm add",
|
|
122
|
-
"git checkout",
|
|
123
|
-
"git merge",
|
|
124
|
-
],
|
|
125
|
-
},
|
|
126
|
-
|
|
127
|
-
// Content patterns to detect hallucinations
|
|
128
|
-
content: {
|
|
129
|
-
hallucinations: [
|
|
130
|
-
// Fake API endpoints
|
|
131
|
-
{ pattern: "fetch\\(['\"]https?://example\\.com", name: "fake-api-example.com" },
|
|
132
|
-
{ pattern: "api\\.example\\.com", name: "fake-api-domain" },
|
|
133
|
-
{ pattern: "https?://localhost:\\d+/api", name: "localhost-api", severity: "warn" },
|
|
134
|
-
|
|
135
|
-
// Fake API keys
|
|
136
|
-
{ pattern: "sk-[a-zA-Z0-9]{20,}", name: "fake-openai-key" },
|
|
137
|
-
{ pattern: "AKIA[0-9A-Z]{16}", name: "fake-aws-key" },
|
|
138
|
-
{ pattern: "ghp_[a-zA-Z0-9]{36}", name: "fake-github-token" },
|
|
139
|
-
|
|
140
|
-
// Placeholder patterns
|
|
141
|
-
{ pattern: "\\bTODO\\b.*\\bimplement\\b", name: "todo-implement", severity: "warn" },
|
|
142
|
-
{ pattern: "placeholder", name: "placeholder-text", severity: "warn" },
|
|
143
|
-
{ pattern: "fake.*data", name: "fake-data", severity: "warn" },
|
|
144
|
-
{ pattern: "mock.*response", name: "mock-response", severity: "warn" },
|
|
145
|
-
|
|
146
|
-
// Hardcoded test credentials
|
|
147
|
-
{ pattern: "password.*=.*['\"]test", name: "test-password" },
|
|
148
|
-
{ pattern: "password.*=.*['\"]123", name: "weak-password" },
|
|
149
|
-
{ pattern: "admin.*admin", name: "default-admin-creds" },
|
|
150
|
-
|
|
151
|
-
// AI-generated placeholder values
|
|
152
|
-
{ pattern: "your-api-key-here", name: "placeholder-api-key" },
|
|
153
|
-
{ pattern: "YOUR_.*_KEY", name: "placeholder-env-key" },
|
|
154
|
-
{ pattern: "<your-.*>", name: "placeholder-template" },
|
|
155
|
-
{ pattern: "\\[insert.*here\\]", name: "insert-placeholder" },
|
|
156
|
-
],
|
|
157
|
-
|
|
158
|
-
// Patterns that should never appear
|
|
159
|
-
forbidden: [
|
|
160
|
-
{ pattern: "eval\\(", name: "eval-usage", severity: "critical" },
|
|
161
|
-
{ pattern: "document\\.write\\(", name: "document-write", severity: "warn" },
|
|
162
|
-
{ pattern: "innerHTML\\s*=", name: "innerHTML-assignment", severity: "warn" },
|
|
163
|
-
{ pattern: "dangerouslySetInnerHTML", name: "dangerous-html", severity: "warn" },
|
|
164
|
-
],
|
|
165
|
-
},
|
|
166
|
-
|
|
167
|
-
// Scope limits
|
|
168
|
-
scope: {
|
|
169
|
-
maxFilesPerChange: 15,
|
|
170
|
-
maxLinesPerFile: 1000,
|
|
171
|
-
maxTotalLines: 5000,
|
|
172
|
-
},
|
|
173
|
-
|
|
174
|
-
// Output settings
|
|
175
|
-
output: {
|
|
176
|
-
logViolations: true,
|
|
177
|
-
logPath: ".vibecheck/firewall.log",
|
|
178
|
-
emitEvents: true,
|
|
179
|
-
},
|
|
180
|
-
};
|
|
181
|
-
|
|
182
|
-
// ============================================================================
|
|
183
|
-
// CONFIGURATION LOADER
|
|
184
|
-
// ============================================================================
|
|
185
|
-
|
|
186
|
-
/**
|
|
187
|
-
* Load firewall configuration from project or use defaults
|
|
188
|
-
* @param {string} configPath - Path to configuration file
|
|
189
|
-
* @returns {object} Merged configuration
|
|
190
|
-
*/
|
|
191
|
-
function loadFirewallConfig(configPath = ".vibecheck/firewall.json") {
|
|
192
|
-
const projectRoot = process.cwd();
|
|
193
|
-
const fullPath = path.isAbsolute(configPath)
|
|
194
|
-
? configPath
|
|
195
|
-
: path.join(projectRoot, configPath);
|
|
196
|
-
|
|
197
|
-
let userConfig = {};
|
|
198
|
-
|
|
199
|
-
// Try to load user configuration
|
|
200
|
-
if (fs.existsSync(fullPath)) {
|
|
201
|
-
try {
|
|
202
|
-
const content = fs.readFileSync(fullPath, "utf8");
|
|
203
|
-
userConfig = JSON.parse(content);
|
|
204
|
-
} catch (error) {
|
|
205
|
-
console.warn(`[Firewall] Failed to parse config: ${error.message}`);
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
// Deep merge with defaults
|
|
210
|
-
const config = deepMerge(DEFAULT_CONFIG, userConfig);
|
|
211
|
-
|
|
212
|
-
// Validate configuration
|
|
213
|
-
validateConfig(config);
|
|
214
|
-
|
|
215
|
-
return config;
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
/**
|
|
219
|
-
* Deep merge two objects
|
|
220
|
-
* @param {object} target - Target object
|
|
221
|
-
* @param {object} source - Source object
|
|
222
|
-
* @returns {object} Merged object
|
|
223
|
-
*/
|
|
224
|
-
function deepMerge(target, source) {
|
|
225
|
-
const output = { ...target };
|
|
226
|
-
|
|
227
|
-
for (const key of Object.keys(source)) {
|
|
228
|
-
if (source[key] instanceof Object && !Array.isArray(source[key])) {
|
|
229
|
-
if (target[key] instanceof Object && !Array.isArray(target[key])) {
|
|
230
|
-
output[key] = deepMerge(target[key], source[key]);
|
|
231
|
-
} else {
|
|
232
|
-
output[key] = { ...source[key] };
|
|
233
|
-
}
|
|
234
|
-
} else if (Array.isArray(source[key])) {
|
|
235
|
-
// For arrays, concatenate user config with defaults
|
|
236
|
-
output[key] = [...(target[key] || []), ...source[key]];
|
|
237
|
-
} else {
|
|
238
|
-
output[key] = source[key];
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
return output;
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
/**
|
|
246
|
-
* Validate configuration structure
|
|
247
|
-
* @param {object} config - Configuration to validate
|
|
248
|
-
* @throws {Error} If configuration is invalid
|
|
249
|
-
*/
|
|
250
|
-
function validateConfig(config) {
|
|
251
|
-
if (config.mode && !["observe", "enforce"].includes(config.mode)) {
|
|
252
|
-
throw new Error(`Invalid mode: ${config.mode}. Must be 'observe' or 'enforce'`);
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
if (config.paths) {
|
|
256
|
-
if (config.paths.forbidden && !Array.isArray(config.paths.forbidden)) {
|
|
257
|
-
throw new Error("paths.forbidden must be an array");
|
|
258
|
-
}
|
|
259
|
-
if (config.paths.allowed && !Array.isArray(config.paths.allowed)) {
|
|
260
|
-
throw new Error("paths.allowed must be an array");
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
if (config.commands) {
|
|
265
|
-
if (config.commands.blocked && !Array.isArray(config.commands.blocked)) {
|
|
266
|
-
throw new Error("commands.blocked must be an array");
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
if (config.content) {
|
|
271
|
-
if (config.content.hallucinations && !Array.isArray(config.content.hallucinations)) {
|
|
272
|
-
throw new Error("content.hallucinations must be an array");
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
/**
|
|
278
|
-
* Get default configuration
|
|
279
|
-
* @returns {object} Default configuration
|
|
280
|
-
*/
|
|
281
|
-
function getDefaultConfig() {
|
|
282
|
-
return JSON.parse(JSON.stringify(DEFAULT_CONFIG));
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
/**
|
|
286
|
-
* Save firewall configuration to file
|
|
287
|
-
* @param {string} configPath - Path to save configuration
|
|
288
|
-
* @param {object} config - Configuration to save
|
|
289
|
-
*/
|
|
290
|
-
function saveFirewallConfig(configPath, config) {
|
|
291
|
-
const projectRoot = process.cwd();
|
|
292
|
-
const fullPath = path.isAbsolute(configPath)
|
|
293
|
-
? configPath
|
|
294
|
-
: path.join(projectRoot, configPath);
|
|
295
|
-
|
|
296
|
-
// Ensure directory exists
|
|
297
|
-
const dir = path.dirname(fullPath);
|
|
298
|
-
if (!fs.existsSync(dir)) {
|
|
299
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
// Validate before saving
|
|
303
|
-
validateConfig(config);
|
|
304
|
-
|
|
305
|
-
fs.writeFileSync(fullPath, JSON.stringify(config, null, 2));
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
/**
|
|
309
|
-
* Initialize default firewall configuration in project
|
|
310
|
-
* @param {string} projectRoot - Project root directory
|
|
311
|
-
* @returns {string} Path to created config file
|
|
312
|
-
*/
|
|
313
|
-
function initFirewallConfig(projectRoot = process.cwd()) {
|
|
314
|
-
const configDir = path.join(projectRoot, ".vibecheck");
|
|
315
|
-
const configPath = path.join(configDir, "firewall.json");
|
|
316
|
-
|
|
317
|
-
// Check if already exists
|
|
318
|
-
if (fs.existsSync(configPath)) {
|
|
319
|
-
return configPath;
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
// Create directory
|
|
323
|
-
if (!fs.existsSync(configDir)) {
|
|
324
|
-
fs.mkdirSync(configDir, { recursive: true });
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
// Write default config
|
|
328
|
-
const config = getDefaultConfig();
|
|
329
|
-
fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
|
|
330
|
-
|
|
331
|
-
return configPath;
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
module.exports = {
|
|
335
|
-
loadFirewallConfig,
|
|
336
|
-
getDefaultConfig,
|
|
337
|
-
saveFirewallConfig,
|
|
338
|
-
initFirewallConfig,
|
|
339
|
-
validateConfig,
|
|
340
|
-
DEFAULT_CONFIG,
|
|
341
|
-
};
|