@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,148 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Backend Polish Checks
|
|
3
|
-
*
|
|
4
|
-
* Checks for backend production readiness:
|
|
5
|
-
* - Health endpoints
|
|
6
|
-
* - Graceful shutdown
|
|
7
|
-
* - Rate limiting
|
|
8
|
-
* - Input validation
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
"use strict";
|
|
12
|
-
|
|
13
|
-
const path = require("path");
|
|
14
|
-
const { pathExists, findAllFiles, fileContains, readFileSafe } = require('./utils');
|
|
15
|
-
const { detectInstalledLibraries } = require('./library-detection');
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Check for health endpoint
|
|
19
|
-
*/
|
|
20
|
-
async function checkHealthEndpoint(projectPath, options = {}) {
|
|
21
|
-
const findings = [];
|
|
22
|
-
|
|
23
|
-
// Search for health endpoint patterns
|
|
24
|
-
const files = await findAllFiles(projectPath, /\.(ts|js)$/);
|
|
25
|
-
let hasHealthEndpoint = false;
|
|
26
|
-
|
|
27
|
-
for (const file of files) {
|
|
28
|
-
const content = await readFileSafe(file);
|
|
29
|
-
if (content && /\/health|\/healthz|\/ready|\/live/i.test(content)) {
|
|
30
|
-
hasHealthEndpoint = true;
|
|
31
|
-
break;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
if (!hasHealthEndpoint) {
|
|
36
|
-
findings.push({
|
|
37
|
-
id: 'missing-health-endpoint',
|
|
38
|
-
category: 'backend',
|
|
39
|
-
priority: 'high',
|
|
40
|
-
title: 'Missing Health Check Endpoint',
|
|
41
|
-
description: 'No health check endpoint found. Required for container orchestration (K8s, ECS).',
|
|
42
|
-
fix: 'Add a /health or /healthz endpoint that returns 200 OK',
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
return findings;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Check for graceful shutdown handling
|
|
51
|
-
*/
|
|
52
|
-
async function checkGracefulShutdown(projectPath, options = {}) {
|
|
53
|
-
const findings = [];
|
|
54
|
-
|
|
55
|
-
const files = await findAllFiles(projectPath, /\.(ts|js)$/);
|
|
56
|
-
let hasGracefulShutdown = false;
|
|
57
|
-
|
|
58
|
-
for (const file of files) {
|
|
59
|
-
const content = await readFileSafe(file);
|
|
60
|
-
if (content && /SIGTERM|SIGINT|graceful.*shutdown|process\.on.*exit/i.test(content)) {
|
|
61
|
-
hasGracefulShutdown = true;
|
|
62
|
-
break;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
if (!hasGracefulShutdown) {
|
|
67
|
-
findings.push({
|
|
68
|
-
id: 'missing-graceful-shutdown',
|
|
69
|
-
category: 'backend',
|
|
70
|
-
priority: 'medium',
|
|
71
|
-
title: 'No Graceful Shutdown Handler',
|
|
72
|
-
description: 'No SIGTERM/SIGINT handlers found. Server may not shut down cleanly.',
|
|
73
|
-
fix: 'Add process.on("SIGTERM", ...) to handle graceful shutdown',
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
return findings;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Check for rate limiting
|
|
82
|
-
*/
|
|
83
|
-
async function checkRateLimiting(projectPath, options = {}) {
|
|
84
|
-
const findings = [];
|
|
85
|
-
const { coverage } = detectInstalledLibraries(projectPath);
|
|
86
|
-
|
|
87
|
-
if (coverage.rateLimiting && coverage.rateLimiting.length > 0) {
|
|
88
|
-
return findings;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// Search for rate limiting patterns
|
|
92
|
-
const files = await findAllFiles(projectPath, /\.(ts|js)$/);
|
|
93
|
-
let hasRateLimiting = false;
|
|
94
|
-
|
|
95
|
-
for (const file of files) {
|
|
96
|
-
const content = await readFileSafe(file);
|
|
97
|
-
if (content && /rateLimit|rate-limit|throttle|limiter/i.test(content)) {
|
|
98
|
-
hasRateLimiting = true;
|
|
99
|
-
break;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
if (!hasRateLimiting) {
|
|
104
|
-
findings.push({
|
|
105
|
-
id: 'missing-rate-limiting',
|
|
106
|
-
category: 'backend',
|
|
107
|
-
priority: 'high',
|
|
108
|
-
title: 'No Rate Limiting',
|
|
109
|
-
description: 'No rate limiting found. API is vulnerable to abuse and DoS attacks.',
|
|
110
|
-
fix: 'Install express-rate-limit or similar package to protect your API',
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
return findings;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* Run all backend checks
|
|
119
|
-
*/
|
|
120
|
-
async function runChecks(projectPath, options = {}) {
|
|
121
|
-
const allFindings = [];
|
|
122
|
-
|
|
123
|
-
const checks = [
|
|
124
|
-
checkHealthEndpoint,
|
|
125
|
-
checkGracefulShutdown,
|
|
126
|
-
checkRateLimiting,
|
|
127
|
-
];
|
|
128
|
-
|
|
129
|
-
for (const check of checks) {
|
|
130
|
-
try {
|
|
131
|
-
const findings = await check(projectPath, options);
|
|
132
|
-
allFindings.push(...findings);
|
|
133
|
-
} catch (error) {
|
|
134
|
-
if (options.verbose) {
|
|
135
|
-
console.warn(`Check failed: ${check.name}`, error.message);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
return allFindings;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
module.exports = {
|
|
144
|
-
runChecks,
|
|
145
|
-
checkHealthEndpoint,
|
|
146
|
-
checkGracefulShutdown,
|
|
147
|
-
checkRateLimiting,
|
|
148
|
-
};
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Documentation Polish Checks
|
|
3
|
-
*
|
|
4
|
-
* Checks for documentation completeness:
|
|
5
|
-
* - README.md
|
|
6
|
-
* - API documentation
|
|
7
|
-
* - CHANGELOG
|
|
8
|
-
* - Contributing guide
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
"use strict";
|
|
12
|
-
|
|
13
|
-
const path = require("path");
|
|
14
|
-
const { pathExists, readFileSafe } = require('./utils');
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Check for README.md
|
|
18
|
-
*/
|
|
19
|
-
async function checkReadme(projectPath, options = {}) {
|
|
20
|
-
const findings = [];
|
|
21
|
-
|
|
22
|
-
const hasReadme = await pathExists(path.join(projectPath, 'README.md'));
|
|
23
|
-
|
|
24
|
-
if (!hasReadme) {
|
|
25
|
-
findings.push({
|
|
26
|
-
id: 'missing-readme',
|
|
27
|
-
category: 'documentation',
|
|
28
|
-
priority: 'medium',
|
|
29
|
-
title: 'Missing README.md',
|
|
30
|
-
description: 'No README.md found. New users won\'t know how to use this project.',
|
|
31
|
-
fix: 'Create a README.md with setup instructions and usage examples',
|
|
32
|
-
});
|
|
33
|
-
return findings;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
// Check README quality
|
|
37
|
-
const readme = await readFileSafe(path.join(projectPath, 'README.md'));
|
|
38
|
-
if (readme && readme.length < 200) {
|
|
39
|
-
findings.push({
|
|
40
|
-
id: 'readme-too-short',
|
|
41
|
-
category: 'documentation',
|
|
42
|
-
priority: 'low',
|
|
43
|
-
title: 'README.md Too Short',
|
|
44
|
-
description: 'README has minimal content. Consider adding more details.',
|
|
45
|
-
fix: 'Expand README with installation, usage, and configuration sections',
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
return findings;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Check for CHANGELOG
|
|
54
|
-
*/
|
|
55
|
-
async function checkChangelog(projectPath, options = {}) {
|
|
56
|
-
const findings = [];
|
|
57
|
-
|
|
58
|
-
const changelogPaths = ['CHANGELOG.md', 'HISTORY.md', 'CHANGES.md'];
|
|
59
|
-
let hasChangelog = false;
|
|
60
|
-
|
|
61
|
-
for (const p of changelogPaths) {
|
|
62
|
-
if (await pathExists(path.join(projectPath, p))) {
|
|
63
|
-
hasChangelog = true;
|
|
64
|
-
break;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
if (!hasChangelog) {
|
|
69
|
-
findings.push({
|
|
70
|
-
id: 'missing-changelog',
|
|
71
|
-
category: 'documentation',
|
|
72
|
-
priority: 'low',
|
|
73
|
-
title: 'Missing CHANGELOG',
|
|
74
|
-
description: 'No changelog found. Hard to track version changes.',
|
|
75
|
-
fix: 'Create CHANGELOG.md to document version history',
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
return findings;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* Run all documentation checks
|
|
84
|
-
*/
|
|
85
|
-
async function runChecks(projectPath, options = {}) {
|
|
86
|
-
const allFindings = [];
|
|
87
|
-
|
|
88
|
-
const checks = [
|
|
89
|
-
checkReadme,
|
|
90
|
-
checkChangelog,
|
|
91
|
-
];
|
|
92
|
-
|
|
93
|
-
for (const check of checks) {
|
|
94
|
-
try {
|
|
95
|
-
const findings = await check(projectPath, options);
|
|
96
|
-
allFindings.push(...findings);
|
|
97
|
-
} catch (error) {
|
|
98
|
-
if (options.verbose) {
|
|
99
|
-
console.warn(`Check failed: ${check.name}`, error.message);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
return allFindings;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
module.exports = {
|
|
108
|
-
runChecks,
|
|
109
|
-
checkReadme,
|
|
110
|
-
checkChangelog,
|
|
111
|
-
};
|
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Frontend Polish Checks
|
|
3
|
-
*
|
|
4
|
-
* Checks for frontend production readiness:
|
|
5
|
-
* - Error boundaries
|
|
6
|
-
* - 404 pages
|
|
7
|
-
* - Loading states
|
|
8
|
-
* - Empty states
|
|
9
|
-
* - Toast notifications
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
"use strict";
|
|
13
|
-
|
|
14
|
-
const path = require("path");
|
|
15
|
-
const { pathExists, findAllFiles, fileContains, readFileSafe } = require('./utils');
|
|
16
|
-
const { hasLibrary, detectInstalledLibraries } = require('./library-detection');
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Check for error boundary implementation
|
|
20
|
-
*/
|
|
21
|
-
async function checkErrorBoundary(projectPath, options = {}) {
|
|
22
|
-
const findings = [];
|
|
23
|
-
const { deps, coverage } = detectInstalledLibraries(projectPath);
|
|
24
|
-
|
|
25
|
-
// Skip if using error boundary library
|
|
26
|
-
if (coverage.errorBoundary && coverage.errorBoundary.length > 0) {
|
|
27
|
-
return findings;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
// Check for custom error boundary
|
|
31
|
-
const files = await findAllFiles(projectPath, /\.(tsx?|jsx?)$/);
|
|
32
|
-
let hasErrorBoundary = false;
|
|
33
|
-
|
|
34
|
-
for (const file of files) {
|
|
35
|
-
const content = await readFileSafe(file);
|
|
36
|
-
if (content && /componentDidCatch|ErrorBoundary|error-boundary/i.test(content)) {
|
|
37
|
-
hasErrorBoundary = true;
|
|
38
|
-
break;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
if (!hasErrorBoundary) {
|
|
43
|
-
findings.push({
|
|
44
|
-
id: 'missing-error-boundary',
|
|
45
|
-
category: 'frontend',
|
|
46
|
-
priority: 'high',
|
|
47
|
-
title: 'Missing Error Boundary',
|
|
48
|
-
description: 'No React Error Boundary found. Add one to gracefully handle JavaScript errors.',
|
|
49
|
-
fix: 'Install react-error-boundary or create a custom ErrorBoundary component',
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
return findings;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Check for 404 page
|
|
58
|
-
*/
|
|
59
|
-
async function check404Page(projectPath, options = {}) {
|
|
60
|
-
const findings = [];
|
|
61
|
-
|
|
62
|
-
// Check common 404 page locations
|
|
63
|
-
const possiblePaths = [
|
|
64
|
-
'pages/404.tsx',
|
|
65
|
-
'pages/404.jsx',
|
|
66
|
-
'pages/404.js',
|
|
67
|
-
'app/not-found.tsx',
|
|
68
|
-
'app/not-found.jsx',
|
|
69
|
-
'app/not-found.js',
|
|
70
|
-
'src/pages/404.tsx',
|
|
71
|
-
'src/pages/404.jsx',
|
|
72
|
-
'src/app/not-found.tsx',
|
|
73
|
-
];
|
|
74
|
-
|
|
75
|
-
let has404 = false;
|
|
76
|
-
for (const p of possiblePaths) {
|
|
77
|
-
if (await pathExists(path.join(projectPath, p))) {
|
|
78
|
-
has404 = true;
|
|
79
|
-
break;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
if (!has404) {
|
|
84
|
-
findings.push({
|
|
85
|
-
id: 'missing-404-page',
|
|
86
|
-
category: 'frontend',
|
|
87
|
-
priority: 'medium',
|
|
88
|
-
title: 'Missing 404 Page',
|
|
89
|
-
description: 'No custom 404 page found. Users will see a generic error.',
|
|
90
|
-
fix: 'Create a pages/404.tsx (Next.js Pages) or app/not-found.tsx (Next.js App Router)',
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
return findings;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* Check for loading states
|
|
99
|
-
*/
|
|
100
|
-
async function checkLoadingStates(projectPath, options = {}) {
|
|
101
|
-
const findings = [];
|
|
102
|
-
const { coverage } = detectInstalledLibraries(projectPath);
|
|
103
|
-
|
|
104
|
-
// Skip if using loading/skeleton libraries
|
|
105
|
-
if ((coverage.spinner && coverage.spinner.length > 0) ||
|
|
106
|
-
(coverage.skeleton && coverage.skeleton.length > 0)) {
|
|
107
|
-
return findings;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
// Check for loading patterns in code
|
|
111
|
-
const files = await findAllFiles(projectPath, /\.(tsx?|jsx?)$/);
|
|
112
|
-
let hasLoadingPattern = false;
|
|
113
|
-
|
|
114
|
-
for (const file of files) {
|
|
115
|
-
const content = await readFileSafe(file);
|
|
116
|
-
if (content && /isLoading|loading\s*\?|Spinner|Skeleton|LoadingState/i.test(content)) {
|
|
117
|
-
hasLoadingPattern = true;
|
|
118
|
-
break;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
if (!hasLoadingPattern) {
|
|
123
|
-
findings.push({
|
|
124
|
-
id: 'missing-loading-states',
|
|
125
|
-
category: 'frontend',
|
|
126
|
-
priority: 'medium',
|
|
127
|
-
title: 'No Loading States Found',
|
|
128
|
-
description: 'No loading indicators found. Users may think the app is frozen during data fetching.',
|
|
129
|
-
fix: 'Add loading states to async operations using isLoading flags or skeleton components',
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
return findings;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
/**
|
|
137
|
-
* Run all frontend checks
|
|
138
|
-
*/
|
|
139
|
-
async function runChecks(projectPath, options = {}) {
|
|
140
|
-
const allFindings = [];
|
|
141
|
-
|
|
142
|
-
const checks = [
|
|
143
|
-
checkErrorBoundary,
|
|
144
|
-
check404Page,
|
|
145
|
-
checkLoadingStates,
|
|
146
|
-
];
|
|
147
|
-
|
|
148
|
-
for (const check of checks) {
|
|
149
|
-
try {
|
|
150
|
-
const findings = await check(projectPath, options);
|
|
151
|
-
allFindings.push(...findings);
|
|
152
|
-
} catch (error) {
|
|
153
|
-
// Log but don't fail
|
|
154
|
-
if (options.verbose) {
|
|
155
|
-
console.warn(`Check failed: ${check.name}`, error.message);
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
return allFindings;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
module.exports = {
|
|
164
|
-
runChecks,
|
|
165
|
-
checkErrorBoundary,
|
|
166
|
-
check404Page,
|
|
167
|
-
checkLoadingStates,
|
|
168
|
-
};
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Polish Checks - Modular Production Readiness Checks
|
|
3
|
-
*
|
|
4
|
-
* Extracted from runPolish.js for maintainability and testability.
|
|
5
|
-
* Each category has its own module with specific checks.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
"use strict";
|
|
9
|
-
|
|
10
|
-
// Re-export check modules
|
|
11
|
-
const frontendChecks = require('./frontend-checks');
|
|
12
|
-
const backendChecks = require('./backend-checks');
|
|
13
|
-
const securityChecks = require('./security-checks');
|
|
14
|
-
const performanceChecks = require('./performance-checks');
|
|
15
|
-
const documentationChecks = require('./documentation-checks');
|
|
16
|
-
const infrastructureChecks = require('./infrastructure-checks');
|
|
17
|
-
|
|
18
|
-
// Utility functions
|
|
19
|
-
const { pathExists, readFileSafe, fileContains, findAllFiles } = require('./utils');
|
|
20
|
-
|
|
21
|
-
// Library detection
|
|
22
|
-
const { LIBRARY_ALTERNATIVES, hasLibrary, detectInstalledLibraries } = require('./library-detection');
|
|
23
|
-
|
|
24
|
-
module.exports = {
|
|
25
|
-
// Check modules
|
|
26
|
-
frontendChecks,
|
|
27
|
-
backendChecks,
|
|
28
|
-
securityChecks,
|
|
29
|
-
performanceChecks,
|
|
30
|
-
documentationChecks,
|
|
31
|
-
infrastructureChecks,
|
|
32
|
-
|
|
33
|
-
// Utilities
|
|
34
|
-
pathExists,
|
|
35
|
-
readFileSafe,
|
|
36
|
-
fileContains,
|
|
37
|
-
findAllFiles,
|
|
38
|
-
|
|
39
|
-
// Library detection
|
|
40
|
-
LIBRARY_ALTERNATIVES,
|
|
41
|
-
hasLibrary,
|
|
42
|
-
detectInstalledLibraries,
|
|
43
|
-
|
|
44
|
-
// Run all checks
|
|
45
|
-
async runAllChecks(projectPath, options = {}) {
|
|
46
|
-
const results = {
|
|
47
|
-
frontend: await frontendChecks.runChecks(projectPath, options),
|
|
48
|
-
backend: await backendChecks.runChecks(projectPath, options),
|
|
49
|
-
security: await securityChecks.runChecks(projectPath, options),
|
|
50
|
-
performance: await performanceChecks.runChecks(projectPath, options),
|
|
51
|
-
documentation: await documentationChecks.runChecks(projectPath, options),
|
|
52
|
-
infrastructure: await infrastructureChecks.runChecks(projectPath, options),
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
// Calculate totals
|
|
56
|
-
const allFindings = Object.values(results).flat();
|
|
57
|
-
const byPriority = {
|
|
58
|
-
critical: allFindings.filter(f => f.priority === 'critical').length,
|
|
59
|
-
high: allFindings.filter(f => f.priority === 'high').length,
|
|
60
|
-
medium: allFindings.filter(f => f.priority === 'medium').length,
|
|
61
|
-
low: allFindings.filter(f => f.priority === 'low').length,
|
|
62
|
-
};
|
|
63
|
-
|
|
64
|
-
return {
|
|
65
|
-
findings: allFindings,
|
|
66
|
-
byCategory: results,
|
|
67
|
-
byPriority,
|
|
68
|
-
total: allFindings.length,
|
|
69
|
-
};
|
|
70
|
-
},
|
|
71
|
-
};
|
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Infrastructure Polish Checks
|
|
3
|
-
*
|
|
4
|
-
* Checks for infrastructure configuration:
|
|
5
|
-
* - Docker setup
|
|
6
|
-
* - CI/CD configuration
|
|
7
|
-
* - Monitoring setup
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
"use strict";
|
|
11
|
-
|
|
12
|
-
const path = require("path");
|
|
13
|
-
const { pathExists, readFileSafe } = require('./utils');
|
|
14
|
-
const { detectInstalledLibraries } = require('./library-detection');
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Check for Docker configuration
|
|
18
|
-
*/
|
|
19
|
-
async function checkDocker(projectPath, options = {}) {
|
|
20
|
-
const findings = [];
|
|
21
|
-
|
|
22
|
-
const hasDockerfile = await pathExists(path.join(projectPath, 'Dockerfile'));
|
|
23
|
-
const hasDockerCompose = await pathExists(path.join(projectPath, 'docker-compose.yml')) ||
|
|
24
|
-
await pathExists(path.join(projectPath, 'docker-compose.yaml'));
|
|
25
|
-
|
|
26
|
-
if (!hasDockerfile) {
|
|
27
|
-
findings.push({
|
|
28
|
-
id: 'missing-dockerfile',
|
|
29
|
-
category: 'infrastructure',
|
|
30
|
-
priority: 'medium',
|
|
31
|
-
title: 'Missing Dockerfile',
|
|
32
|
-
description: 'No Dockerfile found. Containerization recommended for production.',
|
|
33
|
-
fix: 'Create a Dockerfile for consistent deployments',
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
return findings;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Check for CI/CD configuration
|
|
42
|
-
*/
|
|
43
|
-
async function checkCICD(projectPath, options = {}) {
|
|
44
|
-
const findings = [];
|
|
45
|
-
|
|
46
|
-
const ciPaths = [
|
|
47
|
-
'.github/workflows',
|
|
48
|
-
'.gitlab-ci.yml',
|
|
49
|
-
'.circleci/config.yml',
|
|
50
|
-
'Jenkinsfile',
|
|
51
|
-
'.travis.yml',
|
|
52
|
-
'azure-pipelines.yml',
|
|
53
|
-
];
|
|
54
|
-
|
|
55
|
-
let hasCICD = false;
|
|
56
|
-
for (const p of ciPaths) {
|
|
57
|
-
if (await pathExists(path.join(projectPath, p))) {
|
|
58
|
-
hasCICD = true;
|
|
59
|
-
break;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
if (!hasCICD) {
|
|
64
|
-
findings.push({
|
|
65
|
-
id: 'missing-cicd',
|
|
66
|
-
category: 'infrastructure',
|
|
67
|
-
priority: 'medium',
|
|
68
|
-
title: 'No CI/CD Configuration',
|
|
69
|
-
description: 'No CI/CD pipeline found. Automated testing and deployment recommended.',
|
|
70
|
-
fix: 'Add GitHub Actions, GitLab CI, or similar CI/CD configuration',
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
return findings;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Check for monitoring setup
|
|
79
|
-
*/
|
|
80
|
-
async function checkMonitoring(projectPath, options = {}) {
|
|
81
|
-
const findings = [];
|
|
82
|
-
const { coverage } = detectInstalledLibraries(projectPath);
|
|
83
|
-
|
|
84
|
-
if (coverage.monitoring && coverage.monitoring.length > 0) {
|
|
85
|
-
return findings;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
findings.push({
|
|
89
|
-
id: 'no-monitoring',
|
|
90
|
-
category: 'infrastructure',
|
|
91
|
-
priority: 'medium',
|
|
92
|
-
title: 'No Monitoring Configured',
|
|
93
|
-
description: 'No monitoring/observability libraries found. Hard to debug production issues.',
|
|
94
|
-
fix: 'Add Sentry, DataDog, or OpenTelemetry for monitoring',
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
return findings;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Run all infrastructure checks
|
|
102
|
-
*/
|
|
103
|
-
async function runChecks(projectPath, options = {}) {
|
|
104
|
-
const allFindings = [];
|
|
105
|
-
|
|
106
|
-
const checks = [
|
|
107
|
-
checkDocker,
|
|
108
|
-
checkCICD,
|
|
109
|
-
checkMonitoring,
|
|
110
|
-
];
|
|
111
|
-
|
|
112
|
-
for (const check of checks) {
|
|
113
|
-
try {
|
|
114
|
-
const findings = await check(projectPath, options);
|
|
115
|
-
allFindings.push(...findings);
|
|
116
|
-
} catch (error) {
|
|
117
|
-
if (options.verbose) {
|
|
118
|
-
console.warn(`Check failed: ${check.name}`, error.message);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
return allFindings;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
module.exports = {
|
|
127
|
-
runChecks,
|
|
128
|
-
checkDocker,
|
|
129
|
-
checkCICD,
|
|
130
|
-
checkMonitoring,
|
|
131
|
-
};
|