@vibecheckai/cli 3.0.3 → 3.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/bin/cli-hygiene.js +241 -0
  2. package/bin/dev/run-v2-torture.js +30 -0
  3. package/bin/guardrail.js +843 -0
  4. package/bin/runners/cli-utils.js +1070 -0
  5. package/bin/runners/context/ai-task-decomposer.js +337 -0
  6. package/bin/runners/context/analyzer.js +462 -0
  7. package/bin/runners/context/api-contracts.js +427 -0
  8. package/bin/runners/context/context-diff.js +342 -0
  9. package/bin/runners/context/context-pruner.js +291 -0
  10. package/bin/runners/context/dependency-graph.js +414 -0
  11. package/bin/runners/context/generators/claude.js +107 -0
  12. package/bin/runners/context/generators/codex.js +108 -0
  13. package/bin/runners/context/generators/copilot.js +119 -0
  14. package/bin/runners/context/generators/cursor.js +514 -0
  15. package/bin/runners/context/generators/mcp.js +151 -0
  16. package/bin/runners/context/generators/windsurf.js +180 -0
  17. package/bin/runners/context/git-context.js +302 -0
  18. package/bin/runners/context/index.js +1042 -0
  19. package/bin/runners/context/insights.js +173 -0
  20. package/bin/runners/context/mcp-server/generate-rules.js +337 -0
  21. package/bin/runners/context/mcp-server/index.js +1176 -0
  22. package/bin/runners/context/mcp-server/package.json +24 -0
  23. package/bin/runners/context/memory.js +200 -0
  24. package/bin/runners/context/monorepo.js +215 -0
  25. package/bin/runners/context/multi-repo-federation.js +404 -0
  26. package/bin/runners/context/patterns.js +253 -0
  27. package/bin/runners/context/proof-context.js +972 -0
  28. package/bin/runners/context/security-scanner.js +303 -0
  29. package/bin/runners/context/semantic-search.js +350 -0
  30. package/bin/runners/context/shared.js +264 -0
  31. package/bin/runners/context/team-conventions.js +310 -0
  32. package/bin/runners/lib/ai-bridge.js +416 -0
  33. package/bin/runners/lib/analysis-core.js +271 -0
  34. package/bin/runners/lib/analyzers.js +579 -0
  35. package/bin/runners/lib/assets/vibecheck-logo.png +0 -0
  36. package/bin/runners/lib/audit-bridge.js +391 -0
  37. package/bin/runners/lib/auth-truth.js +193 -0
  38. package/bin/runners/lib/auth.js +215 -0
  39. package/bin/runners/lib/backup.js +62 -0
  40. package/bin/runners/lib/billing.js +107 -0
  41. package/bin/runners/lib/claims.js +118 -0
  42. package/bin/runners/lib/cli-ui.js +540 -0
  43. package/bin/runners/lib/compliance-bridge-new.js +0 -0
  44. package/bin/runners/lib/compliance-bridge.js +165 -0
  45. package/bin/runners/lib/contracts/auth-contract.js +202 -0
  46. package/bin/runners/lib/contracts/env-contract.js +181 -0
  47. package/bin/runners/lib/contracts/external-contract.js +206 -0
  48. package/bin/runners/lib/contracts/guard.js +168 -0
  49. package/bin/runners/lib/contracts/index.js +89 -0
  50. package/bin/runners/lib/contracts/plan-validator.js +311 -0
  51. package/bin/runners/lib/contracts/route-contract.js +199 -0
  52. package/bin/runners/lib/contracts.js +804 -0
  53. package/bin/runners/lib/detect.js +89 -0
  54. package/bin/runners/lib/detectors-v2.js +703 -0
  55. package/bin/runners/lib/doctor/autofix.js +254 -0
  56. package/bin/runners/lib/doctor/index.js +37 -0
  57. package/bin/runners/lib/doctor/modules/dependencies.js +325 -0
  58. package/bin/runners/lib/doctor/modules/index.js +46 -0
  59. package/bin/runners/lib/doctor/modules/network.js +250 -0
  60. package/bin/runners/lib/doctor/modules/project.js +312 -0
  61. package/bin/runners/lib/doctor/modules/runtime.js +224 -0
  62. package/bin/runners/lib/doctor/modules/security.js +348 -0
  63. package/bin/runners/lib/doctor/modules/system.js +213 -0
  64. package/bin/runners/lib/doctor/modules/vibecheck.js +394 -0
  65. package/bin/runners/lib/doctor/reporter.js +262 -0
  66. package/bin/runners/lib/doctor/service.js +262 -0
  67. package/bin/runners/lib/doctor/types.js +113 -0
  68. package/bin/runners/lib/doctor/ui.js +263 -0
  69. package/bin/runners/lib/doctor-enhanced.js +233 -0
  70. package/bin/runners/lib/doctor-v2.js +608 -0
  71. package/bin/runners/lib/drift.js +425 -0
  72. package/bin/runners/lib/enforcement.js +72 -0
  73. package/bin/runners/lib/entitlements.js +8 -3
  74. package/bin/runners/lib/env-resolver.js +417 -0
  75. package/bin/runners/lib/extractors/client-calls.js +990 -0
  76. package/bin/runners/lib/extractors/fastify-route-dump.js +573 -0
  77. package/bin/runners/lib/extractors/fastify-routes.js +426 -0
  78. package/bin/runners/lib/extractors/index.js +363 -0
  79. package/bin/runners/lib/extractors/next-routes.js +524 -0
  80. package/bin/runners/lib/extractors/proof-graph.js +431 -0
  81. package/bin/runners/lib/extractors/route-matcher.js +451 -0
  82. package/bin/runners/lib/extractors/truthpack-v2.js +377 -0
  83. package/bin/runners/lib/extractors/ui-bindings.js +547 -0
  84. package/bin/runners/lib/findings-schema.js +281 -0
  85. package/bin/runners/lib/html-report.js +650 -0
  86. package/bin/runners/lib/missions/templates.js +45 -0
  87. package/bin/runners/lib/policy.js +295 -0
  88. package/bin/runners/lib/reality/correlation-detectors.js +359 -0
  89. package/bin/runners/lib/reality/index.js +318 -0
  90. package/bin/runners/lib/reality/request-hashing.js +416 -0
  91. package/bin/runners/lib/reality/request-mapper.js +453 -0
  92. package/bin/runners/lib/reality/safety-rails.js +463 -0
  93. package/bin/runners/lib/reality/semantic-snapshot.js +408 -0
  94. package/bin/runners/lib/reality/toast-detector.js +393 -0
  95. package/bin/runners/lib/route-truth.js +10 -10
  96. package/bin/runners/lib/schema-validator.js +350 -0
  97. package/bin/runners/lib/schemas/contracts.schema.json +160 -0
  98. package/bin/runners/lib/schemas/finding.schema.json +100 -0
  99. package/bin/runners/lib/schemas/mission-pack.schema.json +206 -0
  100. package/bin/runners/lib/schemas/proof-graph.schema.json +176 -0
  101. package/bin/runners/lib/schemas/reality-report.schema.json +162 -0
  102. package/bin/runners/lib/schemas/share-pack.schema.json +180 -0
  103. package/bin/runners/lib/schemas/ship-report.schema.json +117 -0
  104. package/bin/runners/lib/schemas/truthpack-v2.schema.json +303 -0
  105. package/bin/runners/lib/schemas/validator.js +438 -0
  106. package/bin/runners/lib/verdict-engine.js +628 -0
  107. package/bin/runners/runAIAgent.js +228 -1
  108. package/bin/runners/runBadge.js +181 -1
  109. package/bin/runners/runCtxDiff.js +301 -0
  110. package/bin/runners/runInitGha.js +78 -15
  111. package/bin/runners/runLaunch.js +180 -1
  112. package/bin/runners/runProve.js +23 -0
  113. package/bin/runners/runReplay.js +114 -84
  114. package/bin/runners/runScan.js +111 -32
  115. package/bin/runners/runShip.js +23 -2
  116. package/bin/runners/runTruthpack.js +9 -7
  117. package/bin/runners/runValidate.js +161 -1
  118. package/bin/vibecheck.js +6 -1
  119. package/package.json +1 -1
@@ -0,0 +1,241 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * vibecheck Repo Hygiene CLI
5
+ *
6
+ * Enhanced false-positive detection for framework-managed files.
7
+ *
8
+ * Usage:
9
+ * node bin/cli-hygiene.js [command] [options]
10
+ *
11
+ * Commands:
12
+ * scan Full hygiene scan (default)
13
+ * duplicates Scan for duplicate files only
14
+ * unused Scan for unused files only
15
+ * errors Scan for lint/type errors only
16
+ *
17
+ * Options:
18
+ * --path, -p Project path (default: current directory)
19
+ * --json Output JSON instead of markdown
20
+ * --no-interactive Skip prompts
21
+ */
22
+
23
+ const path = require("path");
24
+ const fs = require("fs");
25
+
26
+ // Import hygiene modules
27
+ const {
28
+ findDuplicates,
29
+ findUnusedFiles,
30
+ collectAllErrors,
31
+ analyzeRootDirectory,
32
+ generateHygieneReport,
33
+ calculateHygieneScore,
34
+ } = require("../scripts/hygiene");
35
+
36
+ // Parse arguments
37
+ const args = process.argv.slice(2);
38
+ const command = args.find((a) => !a.startsWith("-")) || "scan";
39
+ const projectPath = getArg("--path", "-p") || ".";
40
+ const jsonOutput = args.includes("--json");
41
+
42
+ function getArg(long, short) {
43
+ const longIdx = args.findIndex((a) => a.startsWith(long + "=") || a === long);
44
+ if (longIdx !== -1) {
45
+ if (args[longIdx].includes("=")) return args[longIdx].split("=")[1];
46
+ return args[longIdx + 1];
47
+ }
48
+ if (short) {
49
+ const shortIdx = args.findIndex((a) => a === short);
50
+ if (shortIdx !== -1) return args[shortIdx + 1];
51
+ }
52
+ return null;
53
+ }
54
+
55
+ async function runFullScan(resolvedPath) {
56
+ console.log("šŸ” Scanning for duplicates...");
57
+ const duplicates = findDuplicates(resolvedPath);
58
+
59
+ console.log("šŸ“¦ Building import graph...");
60
+ const unused = findUnusedFiles(resolvedPath);
61
+
62
+ console.log("šŸ”“ Collecting errors...");
63
+ const errors = collectAllErrors(resolvedPath);
64
+
65
+ console.log("šŸ  Analyzing root directory...");
66
+ const rootCleanup = analyzeRootDirectory(resolvedPath);
67
+
68
+ return { projectPath: resolvedPath, duplicates, unused, errors, rootCleanup };
69
+ }
70
+
71
+ async function main() {
72
+ const resolvedPath = path.resolve(projectPath);
73
+
74
+ console.log(`\n🧹 vibecheck Repo Hygiene\n`);
75
+ console.log(`šŸ“ Project: ${resolvedPath}\n`);
76
+
77
+ switch (command) {
78
+ case "scan":
79
+ await handleScan(resolvedPath);
80
+ break;
81
+ case "duplicates":
82
+ await handleDuplicates(resolvedPath);
83
+ break;
84
+ case "unused":
85
+ await handleUnused(resolvedPath);
86
+ break;
87
+ case "errors":
88
+ await handleErrors(resolvedPath);
89
+ break;
90
+ default:
91
+ console.error(`Unknown command: ${command}`);
92
+ console.error("Available: scan, duplicates, unused, errors");
93
+ process.exit(1);
94
+ }
95
+ }
96
+
97
+ async function handleScan(resolvedPath) {
98
+ const results = await runFullScan(resolvedPath);
99
+ const score = calculateHygieneScore(results);
100
+
101
+ if (jsonOutput) {
102
+ console.log(JSON.stringify({ ...results, score }, null, 2));
103
+ return;
104
+ }
105
+
106
+ // Print report
107
+ const report = generateHygieneReport(results);
108
+ console.log("\n" + report);
109
+
110
+ // Print false-positive summary
111
+ printFalsePositiveSummary(results.unused);
112
+
113
+ // Save artifacts
114
+ const reportDir = path.join(resolvedPath, ".vibecheck");
115
+ if (!fs.existsSync(reportDir)) fs.mkdirSync(reportDir, { recursive: true });
116
+
117
+ fs.writeFileSync(path.join(reportDir, "hygiene-report.md"), report);
118
+ fs.writeFileSync(
119
+ path.join(reportDir, "hygiene-results.json"),
120
+ JSON.stringify(results, null, 2),
121
+ );
122
+ fs.writeFileSync(
123
+ path.join(reportDir, "hygiene-score.json"),
124
+ JSON.stringify(score, null, 2),
125
+ );
126
+ fs.writeFileSync(
127
+ path.join(reportDir, "unused-files.json"),
128
+ JSON.stringify(results.unused, null, 2),
129
+ );
130
+ fs.writeFileSync(
131
+ path.join(reportDir, "duplicates.json"),
132
+ JSON.stringify(results.duplicates, null, 2),
133
+ );
134
+
135
+ console.log(`\nšŸ“„ Reports saved to: ${reportDir}/\n`);
136
+
137
+ // Exit code based on score
138
+ if (score.score < 60) {
139
+ process.exit(1);
140
+ }
141
+ }
142
+
143
+ function printFalsePositiveSummary(unused) {
144
+ if (!unused?.stats) return;
145
+
146
+ const { falsePositives, trueUnused } = unused.stats;
147
+
148
+ console.log("\n" + "─".repeat(60));
149
+ console.log("\nšŸ“Š **False-Positive Detection Summary**\n");
150
+ console.log(` āœ… Framework-managed files detected: ${falsePositives || 0}`);
151
+ console.log(` šŸ—‘ļø Truly unused files: ${trueUnused || 0}`);
152
+
153
+ if (unused.unused?.definitelyUnused?.length > 0) {
154
+ console.log("\n **Safe to delete:**");
155
+ for (const file of unused.unused.definitelyUnused.slice(0, 10)) {
156
+ console.log(` - ${file.file}`);
157
+ }
158
+ if (unused.unused.definitelyUnused.length > 10) {
159
+ console.log(
160
+ ` ... and ${unused.unused.definitelyUnused.length - 10} more`,
161
+ );
162
+ }
163
+ }
164
+
165
+ console.log("");
166
+ }
167
+
168
+ async function handleDuplicates(resolvedPath) {
169
+ console.log("šŸ” Scanning for duplicates...");
170
+ const duplicates = findDuplicates(resolvedPath);
171
+
172
+ if (jsonOutput) {
173
+ console.log(JSON.stringify(duplicates, null, 2));
174
+ return;
175
+ }
176
+
177
+ console.log("\n## Duplicate Analysis\n");
178
+ console.log(`| Type | Count |`);
179
+ console.log(`|------|-------|`);
180
+ console.log(`| Exact duplicates | ${duplicates.exact?.length || 0} |`);
181
+ console.log(`| Near-duplicates | ${duplicates.near?.length || 0} |`);
182
+ console.log(`| Copy-paste blocks | ${duplicates.copyPaste?.length || 0} |`);
183
+
184
+ if (duplicates.exact?.length > 0) {
185
+ console.log("\n### Exact Duplicates\n");
186
+ for (const dup of duplicates.exact.slice(0, 10)) {
187
+ console.log(
188
+ `- ${dup.files?.map((f) => f.path).join(" = ") || JSON.stringify(dup)}`,
189
+ );
190
+ }
191
+ }
192
+ }
193
+
194
+ async function handleUnused(resolvedPath) {
195
+ console.log("šŸ“¦ Building import graph...");
196
+ const unused = findUnusedFiles(resolvedPath);
197
+
198
+ if (jsonOutput) {
199
+ console.log(JSON.stringify(unused, null, 2));
200
+ return;
201
+ }
202
+
203
+ console.log("\n## Unused File Analysis\n");
204
+ console.log(`| Category | Count |`);
205
+ console.log(`|----------|-------|`);
206
+ console.log(
207
+ `| Framework-managed (false positives) | ${unused.unused?.falsePositives?.length || 0} |`,
208
+ );
209
+ console.log(
210
+ `| Definitely unused | ${unused.unused?.definitelyUnused?.length || 0} |`,
211
+ );
212
+ console.log(
213
+ `| Probably unused | ${unused.unused?.probablyUnused?.length || 0} |`,
214
+ );
215
+ console.log(`| Test files | ${unused.unused?.testOnly?.length || 0} |`);
216
+
217
+ printFalsePositiveSummary(unused);
218
+ }
219
+
220
+ async function handleErrors(resolvedPath) {
221
+ console.log("šŸ”“ Collecting errors...");
222
+ const errors = collectAllErrors(resolvedPath);
223
+
224
+ if (jsonOutput) {
225
+ console.log(JSON.stringify(errors, null, 2));
226
+ return;
227
+ }
228
+
229
+ console.log("\n## Error Analysis\n");
230
+ console.log(`| Type | Count |`);
231
+ console.log(`|------|-------|`);
232
+ console.log(`| TypeScript errors | ${errors.typescript?.length || 0} |`);
233
+ console.log(`| ESLint errors | ${errors.eslint?.length || 0} |`);
234
+ console.log(`| Syntax errors | ${errors.syntax?.length || 0} |`);
235
+ console.log(`| Import errors | ${errors.imports?.length || 0} |`);
236
+ }
237
+
238
+ main().catch((err) => {
239
+ console.error("Error:", err.message);
240
+ process.exit(1);
241
+ });
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Run Spec v2 Torture Suite
4
+ *
5
+ * Quick confidence builder for spec v2 implementation.
6
+ *
7
+ * Usage:
8
+ * node bin/dev/run-v2-torture.js
9
+ * pnpm test:v2
10
+ */
11
+
12
+ "use strict";
13
+
14
+ const path = require("path");
15
+
16
+ // Run the torture suite
17
+ const { TortureTestRunner } = require("../../tests/e2e/spec-v2.torture.test.js");
18
+
19
+ async function main() {
20
+ const runner = new TortureTestRunner();
21
+ const results = await runner.run();
22
+
23
+ // Exit with appropriate code
24
+ process.exit(results.failed > 0 ? 1 : 0);
25
+ }
26
+
27
+ main().catch(err => {
28
+ console.error("āŒ Torture suite crashed:", err);
29
+ process.exit(1);
30
+ });