spec-gen-cli 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (303) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1078 -0
  3. package/dist/api/analyze.d.ts +17 -0
  4. package/dist/api/analyze.d.ts.map +1 -0
  5. package/dist/api/analyze.js +109 -0
  6. package/dist/api/analyze.js.map +1 -0
  7. package/dist/api/drift.d.ts +21 -0
  8. package/dist/api/drift.d.ts.map +1 -0
  9. package/dist/api/drift.js +145 -0
  10. package/dist/api/drift.js.map +1 -0
  11. package/dist/api/generate.d.ts +18 -0
  12. package/dist/api/generate.d.ts.map +1 -0
  13. package/dist/api/generate.js +251 -0
  14. package/dist/api/generate.js.map +1 -0
  15. package/dist/api/index.d.ts +39 -0
  16. package/dist/api/index.d.ts.map +1 -0
  17. package/dist/api/index.js +32 -0
  18. package/dist/api/index.js.map +1 -0
  19. package/dist/api/init.d.ts +18 -0
  20. package/dist/api/init.d.ts.map +1 -0
  21. package/dist/api/init.js +82 -0
  22. package/dist/api/init.js.map +1 -0
  23. package/dist/api/run.d.ts +19 -0
  24. package/dist/api/run.d.ts.map +1 -0
  25. package/dist/api/run.js +291 -0
  26. package/dist/api/run.js.map +1 -0
  27. package/dist/api/specs.d.ts +49 -0
  28. package/dist/api/specs.d.ts.map +1 -0
  29. package/dist/api/specs.js +136 -0
  30. package/dist/api/specs.js.map +1 -0
  31. package/dist/api/types.d.ts +176 -0
  32. package/dist/api/types.d.ts.map +1 -0
  33. package/dist/api/types.js +9 -0
  34. package/dist/api/types.js.map +1 -0
  35. package/dist/api/verify.d.ts +20 -0
  36. package/dist/api/verify.d.ts.map +1 -0
  37. package/dist/api/verify.js +117 -0
  38. package/dist/api/verify.js.map +1 -0
  39. package/dist/cli/commands/analyze.d.ts +27 -0
  40. package/dist/cli/commands/analyze.d.ts.map +1 -0
  41. package/dist/cli/commands/analyze.js +485 -0
  42. package/dist/cli/commands/analyze.js.map +1 -0
  43. package/dist/cli/commands/drift.d.ts +9 -0
  44. package/dist/cli/commands/drift.d.ts.map +1 -0
  45. package/dist/cli/commands/drift.js +540 -0
  46. package/dist/cli/commands/drift.js.map +1 -0
  47. package/dist/cli/commands/generate.d.ts +9 -0
  48. package/dist/cli/commands/generate.d.ts.map +1 -0
  49. package/dist/cli/commands/generate.js +633 -0
  50. package/dist/cli/commands/generate.js.map +1 -0
  51. package/dist/cli/commands/init.d.ts +9 -0
  52. package/dist/cli/commands/init.d.ts.map +1 -0
  53. package/dist/cli/commands/init.js +171 -0
  54. package/dist/cli/commands/init.js.map +1 -0
  55. package/dist/cli/commands/mcp.d.ts +638 -0
  56. package/dist/cli/commands/mcp.d.ts.map +1 -0
  57. package/dist/cli/commands/mcp.js +574 -0
  58. package/dist/cli/commands/mcp.js.map +1 -0
  59. package/dist/cli/commands/run.d.ts +24 -0
  60. package/dist/cli/commands/run.d.ts.map +1 -0
  61. package/dist/cli/commands/run.js +546 -0
  62. package/dist/cli/commands/run.js.map +1 -0
  63. package/dist/cli/commands/verify.d.ts +9 -0
  64. package/dist/cli/commands/verify.d.ts.map +1 -0
  65. package/dist/cli/commands/verify.js +417 -0
  66. package/dist/cli/commands/verify.js.map +1 -0
  67. package/dist/cli/commands/view.d.ts +9 -0
  68. package/dist/cli/commands/view.d.ts.map +1 -0
  69. package/dist/cli/commands/view.js +511 -0
  70. package/dist/cli/commands/view.js.map +1 -0
  71. package/dist/cli/index.d.ts +9 -0
  72. package/dist/cli/index.d.ts.map +1 -0
  73. package/dist/cli/index.js +83 -0
  74. package/dist/cli/index.js.map +1 -0
  75. package/dist/core/analyzer/architecture-writer.d.ts +67 -0
  76. package/dist/core/analyzer/architecture-writer.d.ts.map +1 -0
  77. package/dist/core/analyzer/architecture-writer.js +209 -0
  78. package/dist/core/analyzer/architecture-writer.js.map +1 -0
  79. package/dist/core/analyzer/artifact-generator.d.ts +222 -0
  80. package/dist/core/analyzer/artifact-generator.d.ts.map +1 -0
  81. package/dist/core/analyzer/artifact-generator.js +726 -0
  82. package/dist/core/analyzer/artifact-generator.js.map +1 -0
  83. package/dist/core/analyzer/call-graph.d.ts +83 -0
  84. package/dist/core/analyzer/call-graph.d.ts.map +1 -0
  85. package/dist/core/analyzer/call-graph.js +827 -0
  86. package/dist/core/analyzer/call-graph.js.map +1 -0
  87. package/dist/core/analyzer/code-shaper.d.ts +33 -0
  88. package/dist/core/analyzer/code-shaper.d.ts.map +1 -0
  89. package/dist/core/analyzer/code-shaper.js +149 -0
  90. package/dist/core/analyzer/code-shaper.js.map +1 -0
  91. package/dist/core/analyzer/dependency-graph.d.ts +179 -0
  92. package/dist/core/analyzer/dependency-graph.d.ts.map +1 -0
  93. package/dist/core/analyzer/dependency-graph.js +574 -0
  94. package/dist/core/analyzer/dependency-graph.js.map +1 -0
  95. package/dist/core/analyzer/duplicate-detector.d.ts +52 -0
  96. package/dist/core/analyzer/duplicate-detector.d.ts.map +1 -0
  97. package/dist/core/analyzer/duplicate-detector.js +279 -0
  98. package/dist/core/analyzer/duplicate-detector.js.map +1 -0
  99. package/dist/core/analyzer/embedding-service.d.ts +50 -0
  100. package/dist/core/analyzer/embedding-service.d.ts.map +1 -0
  101. package/dist/core/analyzer/embedding-service.js +104 -0
  102. package/dist/core/analyzer/embedding-service.js.map +1 -0
  103. package/dist/core/analyzer/file-walker.d.ts +78 -0
  104. package/dist/core/analyzer/file-walker.d.ts.map +1 -0
  105. package/dist/core/analyzer/file-walker.js +531 -0
  106. package/dist/core/analyzer/file-walker.js.map +1 -0
  107. package/dist/core/analyzer/import-parser.d.ts +91 -0
  108. package/dist/core/analyzer/import-parser.d.ts.map +1 -0
  109. package/dist/core/analyzer/import-parser.js +720 -0
  110. package/dist/core/analyzer/import-parser.js.map +1 -0
  111. package/dist/core/analyzer/index.d.ts +10 -0
  112. package/dist/core/analyzer/index.d.ts.map +1 -0
  113. package/dist/core/analyzer/index.js +10 -0
  114. package/dist/core/analyzer/index.js.map +1 -0
  115. package/dist/core/analyzer/refactor-analyzer.d.ts +80 -0
  116. package/dist/core/analyzer/refactor-analyzer.d.ts.map +1 -0
  117. package/dist/core/analyzer/refactor-analyzer.js +339 -0
  118. package/dist/core/analyzer/refactor-analyzer.js.map +1 -0
  119. package/dist/core/analyzer/repository-mapper.d.ts +150 -0
  120. package/dist/core/analyzer/repository-mapper.d.ts.map +1 -0
  121. package/dist/core/analyzer/repository-mapper.js +731 -0
  122. package/dist/core/analyzer/repository-mapper.js.map +1 -0
  123. package/dist/core/analyzer/signature-extractor.d.ts +31 -0
  124. package/dist/core/analyzer/signature-extractor.d.ts.map +1 -0
  125. package/dist/core/analyzer/signature-extractor.js +387 -0
  126. package/dist/core/analyzer/signature-extractor.js.map +1 -0
  127. package/dist/core/analyzer/significance-scorer.d.ts +79 -0
  128. package/dist/core/analyzer/significance-scorer.d.ts.map +1 -0
  129. package/dist/core/analyzer/significance-scorer.js +407 -0
  130. package/dist/core/analyzer/significance-scorer.js.map +1 -0
  131. package/dist/core/analyzer/subgraph-extractor.d.ts +43 -0
  132. package/dist/core/analyzer/subgraph-extractor.d.ts.map +1 -0
  133. package/dist/core/analyzer/subgraph-extractor.js +129 -0
  134. package/dist/core/analyzer/subgraph-extractor.js.map +1 -0
  135. package/dist/core/analyzer/vector-index.d.ts +63 -0
  136. package/dist/core/analyzer/vector-index.d.ts.map +1 -0
  137. package/dist/core/analyzer/vector-index.js +169 -0
  138. package/dist/core/analyzer/vector-index.js.map +1 -0
  139. package/dist/core/drift/drift-detector.d.ts +102 -0
  140. package/dist/core/drift/drift-detector.d.ts.map +1 -0
  141. package/dist/core/drift/drift-detector.js +597 -0
  142. package/dist/core/drift/drift-detector.js.map +1 -0
  143. package/dist/core/drift/git-diff.d.ts +55 -0
  144. package/dist/core/drift/git-diff.d.ts.map +1 -0
  145. package/dist/core/drift/git-diff.js +356 -0
  146. package/dist/core/drift/git-diff.js.map +1 -0
  147. package/dist/core/drift/index.d.ts +12 -0
  148. package/dist/core/drift/index.d.ts.map +1 -0
  149. package/dist/core/drift/index.js +9 -0
  150. package/dist/core/drift/index.js.map +1 -0
  151. package/dist/core/drift/spec-mapper.d.ts +73 -0
  152. package/dist/core/drift/spec-mapper.d.ts.map +1 -0
  153. package/dist/core/drift/spec-mapper.js +353 -0
  154. package/dist/core/drift/spec-mapper.js.map +1 -0
  155. package/dist/core/generator/adr-generator.d.ts +32 -0
  156. package/dist/core/generator/adr-generator.d.ts.map +1 -0
  157. package/dist/core/generator/adr-generator.js +192 -0
  158. package/dist/core/generator/adr-generator.js.map +1 -0
  159. package/dist/core/generator/index.d.ts +9 -0
  160. package/dist/core/generator/index.d.ts.map +1 -0
  161. package/dist/core/generator/index.js +12 -0
  162. package/dist/core/generator/index.js.map +1 -0
  163. package/dist/core/generator/mapping-generator.d.ts +54 -0
  164. package/dist/core/generator/mapping-generator.d.ts.map +1 -0
  165. package/dist/core/generator/mapping-generator.js +239 -0
  166. package/dist/core/generator/mapping-generator.js.map +1 -0
  167. package/dist/core/generator/openspec-compat.d.ts +160 -0
  168. package/dist/core/generator/openspec-compat.d.ts.map +1 -0
  169. package/dist/core/generator/openspec-compat.js +523 -0
  170. package/dist/core/generator/openspec-compat.js.map +1 -0
  171. package/dist/core/generator/openspec-format-generator.d.ts +111 -0
  172. package/dist/core/generator/openspec-format-generator.d.ts.map +1 -0
  173. package/dist/core/generator/openspec-format-generator.js +817 -0
  174. package/dist/core/generator/openspec-format-generator.js.map +1 -0
  175. package/dist/core/generator/openspec-writer.d.ts +131 -0
  176. package/dist/core/generator/openspec-writer.d.ts.map +1 -0
  177. package/dist/core/generator/openspec-writer.js +379 -0
  178. package/dist/core/generator/openspec-writer.js.map +1 -0
  179. package/dist/core/generator/prompts.d.ts +35 -0
  180. package/dist/core/generator/prompts.d.ts.map +1 -0
  181. package/dist/core/generator/prompts.js +212 -0
  182. package/dist/core/generator/prompts.js.map +1 -0
  183. package/dist/core/generator/spec-pipeline.d.ts +94 -0
  184. package/dist/core/generator/spec-pipeline.d.ts.map +1 -0
  185. package/dist/core/generator/spec-pipeline.js +474 -0
  186. package/dist/core/generator/spec-pipeline.js.map +1 -0
  187. package/dist/core/generator/stages/stage1-survey.d.ts +19 -0
  188. package/dist/core/generator/stages/stage1-survey.d.ts.map +1 -0
  189. package/dist/core/generator/stages/stage1-survey.js +105 -0
  190. package/dist/core/generator/stages/stage1-survey.js.map +1 -0
  191. package/dist/core/generator/stages/stage2-entities.d.ts +11 -0
  192. package/dist/core/generator/stages/stage2-entities.d.ts.map +1 -0
  193. package/dist/core/generator/stages/stage2-entities.js +67 -0
  194. package/dist/core/generator/stages/stage2-entities.js.map +1 -0
  195. package/dist/core/generator/stages/stage3-services.d.ts +11 -0
  196. package/dist/core/generator/stages/stage3-services.d.ts.map +1 -0
  197. package/dist/core/generator/stages/stage3-services.js +75 -0
  198. package/dist/core/generator/stages/stage3-services.js.map +1 -0
  199. package/dist/core/generator/stages/stage4-api.d.ts +11 -0
  200. package/dist/core/generator/stages/stage4-api.d.ts.map +1 -0
  201. package/dist/core/generator/stages/stage4-api.js +65 -0
  202. package/dist/core/generator/stages/stage4-api.js.map +1 -0
  203. package/dist/core/generator/stages/stage5-architecture.d.ts +10 -0
  204. package/dist/core/generator/stages/stage5-architecture.d.ts.map +1 -0
  205. package/dist/core/generator/stages/stage5-architecture.js +62 -0
  206. package/dist/core/generator/stages/stage5-architecture.js.map +1 -0
  207. package/dist/core/generator/stages/stage6-adr.d.ts +8 -0
  208. package/dist/core/generator/stages/stage6-adr.d.ts.map +1 -0
  209. package/dist/core/generator/stages/stage6-adr.js +41 -0
  210. package/dist/core/generator/stages/stage6-adr.js.map +1 -0
  211. package/dist/core/services/chat-agent.d.ts +45 -0
  212. package/dist/core/services/chat-agent.d.ts.map +1 -0
  213. package/dist/core/services/chat-agent.js +310 -0
  214. package/dist/core/services/chat-agent.js.map +1 -0
  215. package/dist/core/services/chat-tools.d.ts +32 -0
  216. package/dist/core/services/chat-tools.d.ts.map +1 -0
  217. package/dist/core/services/chat-tools.js +270 -0
  218. package/dist/core/services/chat-tools.js.map +1 -0
  219. package/dist/core/services/config-manager.d.ts +61 -0
  220. package/dist/core/services/config-manager.d.ts.map +1 -0
  221. package/dist/core/services/config-manager.js +143 -0
  222. package/dist/core/services/config-manager.js.map +1 -0
  223. package/dist/core/services/gitignore-manager.d.ts +29 -0
  224. package/dist/core/services/gitignore-manager.d.ts.map +1 -0
  225. package/dist/core/services/gitignore-manager.js +106 -0
  226. package/dist/core/services/gitignore-manager.js.map +1 -0
  227. package/dist/core/services/index.d.ts +8 -0
  228. package/dist/core/services/index.d.ts.map +1 -0
  229. package/dist/core/services/index.js +8 -0
  230. package/dist/core/services/index.js.map +1 -0
  231. package/dist/core/services/llm-service.d.ts +336 -0
  232. package/dist/core/services/llm-service.d.ts.map +1 -0
  233. package/dist/core/services/llm-service.js +1155 -0
  234. package/dist/core/services/llm-service.js.map +1 -0
  235. package/dist/core/services/mcp-handlers/analysis.d.ts +42 -0
  236. package/dist/core/services/mcp-handlers/analysis.d.ts.map +1 -0
  237. package/dist/core/services/mcp-handlers/analysis.js +300 -0
  238. package/dist/core/services/mcp-handlers/analysis.js.map +1 -0
  239. package/dist/core/services/mcp-handlers/graph.d.ts +65 -0
  240. package/dist/core/services/mcp-handlers/graph.d.ts.map +1 -0
  241. package/dist/core/services/mcp-handlers/graph.js +509 -0
  242. package/dist/core/services/mcp-handlers/graph.js.map +1 -0
  243. package/dist/core/services/mcp-handlers/semantic.d.ts +38 -0
  244. package/dist/core/services/mcp-handlers/semantic.d.ts.map +1 -0
  245. package/dist/core/services/mcp-handlers/semantic.js +172 -0
  246. package/dist/core/services/mcp-handlers/semantic.js.map +1 -0
  247. package/dist/core/services/mcp-handlers/utils.d.ts +21 -0
  248. package/dist/core/services/mcp-handlers/utils.d.ts.map +1 -0
  249. package/dist/core/services/mcp-handlers/utils.js +62 -0
  250. package/dist/core/services/mcp-handlers/utils.js.map +1 -0
  251. package/dist/core/services/project-detector.d.ts +32 -0
  252. package/dist/core/services/project-detector.d.ts.map +1 -0
  253. package/dist/core/services/project-detector.js +111 -0
  254. package/dist/core/services/project-detector.js.map +1 -0
  255. package/dist/core/verifier/index.d.ts +5 -0
  256. package/dist/core/verifier/index.d.ts.map +1 -0
  257. package/dist/core/verifier/index.js +5 -0
  258. package/dist/core/verifier/index.js.map +1 -0
  259. package/dist/core/verifier/verification-engine.d.ts +226 -0
  260. package/dist/core/verifier/verification-engine.d.ts.map +1 -0
  261. package/dist/core/verifier/verification-engine.js +681 -0
  262. package/dist/core/verifier/verification-engine.js.map +1 -0
  263. package/dist/types/index.d.ts +252 -0
  264. package/dist/types/index.d.ts.map +1 -0
  265. package/dist/types/index.js +5 -0
  266. package/dist/types/index.js.map +1 -0
  267. package/dist/types/pipeline.d.ts +148 -0
  268. package/dist/types/pipeline.d.ts.map +1 -0
  269. package/dist/types/pipeline.js +5 -0
  270. package/dist/types/pipeline.js.map +1 -0
  271. package/dist/utils/errors.d.ts +51 -0
  272. package/dist/utils/errors.d.ts.map +1 -0
  273. package/dist/utils/errors.js +128 -0
  274. package/dist/utils/errors.js.map +1 -0
  275. package/dist/utils/logger.d.ts +149 -0
  276. package/dist/utils/logger.d.ts.map +1 -0
  277. package/dist/utils/logger.js +331 -0
  278. package/dist/utils/logger.js.map +1 -0
  279. package/dist/utils/progress.d.ts +142 -0
  280. package/dist/utils/progress.d.ts.map +1 -0
  281. package/dist/utils/progress.js +280 -0
  282. package/dist/utils/progress.js.map +1 -0
  283. package/dist/utils/prompts.d.ts +53 -0
  284. package/dist/utils/prompts.d.ts.map +1 -0
  285. package/dist/utils/prompts.js +199 -0
  286. package/dist/utils/prompts.js.map +1 -0
  287. package/dist/utils/shutdown.d.ts +89 -0
  288. package/dist/utils/shutdown.d.ts.map +1 -0
  289. package/dist/utils/shutdown.js +237 -0
  290. package/dist/utils/shutdown.js.map +1 -0
  291. package/package.json +114 -0
  292. package/src/viewer/InteractiveGraphViewer.jsx +1486 -0
  293. package/src/viewer/app/index.html +17 -0
  294. package/src/viewer/app/main.jsx +13 -0
  295. package/src/viewer/components/ArchitectureView.jsx +177 -0
  296. package/src/viewer/components/ChatPanel.jsx +448 -0
  297. package/src/viewer/components/ClusterGraph.jsx +441 -0
  298. package/src/viewer/components/FilterBar.jsx +179 -0
  299. package/src/viewer/components/FlatGraph.jsx +275 -0
  300. package/src/viewer/components/MicroComponents.jsx +83 -0
  301. package/src/viewer/hooks/usePanZoom.js +79 -0
  302. package/src/viewer/utils/constants.js +47 -0
  303. package/src/viewer/utils/graph-helpers.js +291 -0
@@ -0,0 +1,417 @@
1
+ /**
2
+ * spec-gen verify command
3
+ *
4
+ * Tests generated spec accuracy against actual source code.
5
+ * Samples files and validates that specs accurately describe behavior.
6
+ */
7
+ import { Command } from 'commander';
8
+ import { access, readFile } from 'node:fs/promises';
9
+ import { join } from 'node:path';
10
+ import { logger } from '../../utils/logger.js';
11
+ import { readSpecGenConfig } from '../../core/services/config-manager.js';
12
+ import { createLLMService } from '../../core/services/llm-service.js';
13
+ import { SpecVerificationEngine, } from '../../core/verifier/verification-engine.js';
14
+ // ============================================================================
15
+ // HELPER FUNCTIONS
16
+ // ============================================================================
17
+ /**
18
+ * Parse comma-separated list
19
+ */
20
+ function parseList(value) {
21
+ return value.split(',').map((s) => s.trim()).filter(Boolean);
22
+ }
23
+ /**
24
+ * Check if a file exists
25
+ */
26
+ async function fileExists(path) {
27
+ try {
28
+ await access(path);
29
+ return true;
30
+ }
31
+ catch {
32
+ return false;
33
+ }
34
+ }
35
+ /**
36
+ * Format time duration for display
37
+ */
38
+ function formatDuration(ms) {
39
+ if (ms < 1000)
40
+ return `${ms}ms`;
41
+ if (ms < 60000)
42
+ return `${(ms / 1000).toFixed(1)}s`;
43
+ const minutes = Math.floor(ms / 60000);
44
+ const seconds = Math.floor((ms % 60000) / 1000);
45
+ return `${minutes}m ${seconds}s`;
46
+ }
47
+ /**
48
+ * Format score as bar
49
+ */
50
+ function formatScoreBar(score, width = 10) {
51
+ const filled = Math.round(score * width);
52
+ const empty = width - filled;
53
+ return '■'.repeat(filled) + '□'.repeat(empty);
54
+ }
55
+ /**
56
+ * Get status emoji based on score
57
+ */
58
+ function getStatusEmoji(score, threshold) {
59
+ if (score >= threshold)
60
+ return '✓';
61
+ if (score >= threshold * 0.8)
62
+ return '⚠';
63
+ return '✗';
64
+ }
65
+ /**
66
+ * Load dependency graph from analysis
67
+ */
68
+ async function loadDependencyGraph(analysisPath) {
69
+ try {
70
+ const depGraphPath = join(analysisPath, 'dependency-graph.json');
71
+ if (!(await fileExists(depGraphPath))) {
72
+ return null;
73
+ }
74
+ const content = await readFile(depGraphPath, 'utf-8');
75
+ return JSON.parse(content);
76
+ }
77
+ catch {
78
+ return null;
79
+ }
80
+ }
81
+ /**
82
+ * Load generation report
83
+ */
84
+ async function loadGenerationReport(rootPath) {
85
+ try {
86
+ const reportPath = join(rootPath, '.spec-gen', 'outputs', 'generation-report.json');
87
+ if (!(await fileExists(reportPath))) {
88
+ return null;
89
+ }
90
+ const content = await readFile(reportPath, 'utf-8');
91
+ return JSON.parse(content);
92
+ }
93
+ catch {
94
+ return null;
95
+ }
96
+ }
97
+ /**
98
+ * Display individual verification result
99
+ */
100
+ function displayResult(result, index, total, threshold, verbose) {
101
+ const status = getStatusEmoji(result.overallScore, threshold);
102
+ console.log('');
103
+ console.log(` [${index}/${total}] ${result.filePath}`);
104
+ // Purpose match
105
+ const purposeStatus = result.purposeMatch.similarity >= 0.5 ? '✓' : '⚠';
106
+ console.log(` Purpose: ${purposeStatus} ${result.purposeMatch.similarity >= 0.5 ? 'Correctly identified' : 'Partially matched'}`);
107
+ // Import match
108
+ const importPercent = (result.importMatch.f1Score * 100).toFixed(0);
109
+ console.log(` Imports: ${result.importMatch.predicted.length}/${result.importMatch.actual.length} predicted (${importPercent}%)`);
110
+ // Export match
111
+ const exportPercent = (result.exportMatch.f1Score * 100).toFixed(0);
112
+ console.log(` Exports: ${result.exportMatch.predicted.length}/${result.exportMatch.actual.length} predicted (${exportPercent}%)`);
113
+ // Requirement coverage
114
+ if (result.requirementCoverage.relatedRequirements.length > 0) {
115
+ const reqMatches = result.requirementCoverage.actuallyImplements.join(', ') || 'None';
116
+ console.log(` Requirements: ${reqMatches}`);
117
+ }
118
+ else {
119
+ console.log(` Requirements: Not in specs`);
120
+ }
121
+ // Overall score
122
+ console.log(` Score: ${(result.overallScore).toFixed(2)} ${status}`);
123
+ // Verbose output
124
+ if (verbose && result.feedback.length > 0) {
125
+ console.log(' Feedback:');
126
+ for (const fb of result.feedback) {
127
+ console.log(` - ${fb}`);
128
+ }
129
+ }
130
+ }
131
+ /**
132
+ * Display verification summary
133
+ */
134
+ function displaySummary(report, _threshold) {
135
+ console.log('');
136
+ console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
137
+ console.log('');
138
+ console.log('📊 Verification Results');
139
+ console.log('');
140
+ const confidencePercent = (report.overallConfidence * 100).toFixed(0);
141
+ const passedPercent = report.sampledFiles > 0
142
+ ? ((report.passedFiles / report.sampledFiles) * 100).toFixed(0)
143
+ : '0';
144
+ console.log(` Overall Confidence: ${confidencePercent}%`);
145
+ console.log(` Passed: ${report.passedFiles}/${report.sampledFiles} files (${passedPercent}%)`);
146
+ console.log('');
147
+ // Domain accuracy
148
+ if (report.domainBreakdown.length > 0) {
149
+ console.log(' Domain Accuracy:');
150
+ for (let i = 0; i < report.domainBreakdown.length; i++) {
151
+ const domain = report.domainBreakdown[i];
152
+ const scorePercent = (domain.averageScore * 100).toFixed(0);
153
+ const bar = formatScoreBar(domain.averageScore);
154
+ const prefix = i === report.domainBreakdown.length - 1 ? '└─' : '├─';
155
+ const paddedName = `${domain.domain}/spec.md:`.padEnd(20);
156
+ console.log(` ${prefix} ${paddedName} ${scorePercent}% ${bar}`);
157
+ }
158
+ console.log('');
159
+ }
160
+ // Identified gaps
161
+ if (report.commonGaps.length > 0) {
162
+ console.log('⚠️ Identified Gaps:');
163
+ for (let i = 0; i < report.commonGaps.length; i++) {
164
+ console.log(` ${i + 1}. ${report.commonGaps[i]}`);
165
+ }
166
+ console.log('');
167
+ }
168
+ // Suggested improvements
169
+ if (report.suggestedImprovements.length > 0) {
170
+ for (const improvement of report.suggestedImprovements) {
171
+ console.log(` ${improvement.domain}: ${improvement.issue}`);
172
+ console.log(` → ${improvement.suggestion}`);
173
+ }
174
+ console.log('');
175
+ }
176
+ // Recommendation
177
+ let recommendationIcon = '✅';
178
+ let recommendationText = 'READY';
179
+ let recommendationDetail = 'Specifications accurately describe the codebase.';
180
+ if (report.recommendation === 'needs-review') {
181
+ recommendationIcon = '⚠️';
182
+ recommendationText = 'NEEDS REVIEW';
183
+ recommendationDetail = 'The specs cover core functionality but may miss some areas.';
184
+ }
185
+ else if (report.recommendation === 'regenerate') {
186
+ recommendationIcon = '❌';
187
+ recommendationText = 'REGENERATE';
188
+ recommendationDetail = 'Specs have significant gaps. Consider regenerating with improved context.';
189
+ }
190
+ console.log(`📝 Recommendation: ${recommendationIcon} ${recommendationText}`);
191
+ console.log(` ${recommendationDetail}`);
192
+ console.log('');
193
+ console.log(` Full report: .spec-gen/verification/REPORT.md`);
194
+ console.log('');
195
+ }
196
+ // ============================================================================
197
+ // COMMAND
198
+ // ============================================================================
199
+ export const verifyCommand = new Command('verify')
200
+ .description('Verify generated specs against actual source code')
201
+ .option('--samples <n>', 'Number of files to sample for verification', '5')
202
+ .option('--threshold <0-1>', 'Minimum confidence score to pass verification', '0.7')
203
+ .option('--files <paths>', 'Specific files to verify (comma-separated)', parseList)
204
+ .option('--domains <list>', 'Only verify specific domains', parseList)
205
+ .option('--verbose', 'Show detailed prediction vs actual comparison', false)
206
+ .option('--json', 'Output results as JSON only', false)
207
+ .addHelpText('after', `
208
+ Examples:
209
+ $ spec-gen verify Verify with defaults (5 samples, 0.7 threshold)
210
+ $ spec-gen verify --samples 10 Sample more files for higher confidence
211
+ $ spec-gen verify --threshold 0.8 Require higher accuracy
212
+ $ spec-gen verify --verbose Show detailed comparisons
213
+ $ spec-gen verify --domains user,order
214
+ Only verify specific domains
215
+ $ spec-gen verify --json Output JSON for automation
216
+
217
+ Verification process:
218
+ 1. Loads generated specs from openspec/specs/
219
+ 2. Selects verification files NOT used in generation
220
+ 3. For each file, asks LLM to predict behavior from specs
221
+ 4. Compares predictions against actual code
222
+ 5. Reports accuracy score and identifies gaps
223
+
224
+ Output:
225
+ - Overall confidence score (0.0 - 1.0)
226
+ - Per-domain accuracy breakdown
227
+ - List of files with prediction mismatches
228
+ - Suggestions for spec improvements
229
+
230
+ A score >= threshold indicates specs are production-ready.
231
+ `)
232
+ .action(async function (options) {
233
+ const startTime = Date.now();
234
+ const rootPath = process.cwd();
235
+ // Inherit global options (--api-base, --insecure, etc.)
236
+ const globalOpts = this.optsWithGlobals?.() ?? {};
237
+ const opts = {
238
+ samples: typeof options.samples === 'string'
239
+ ? parseInt(options.samples, 10)
240
+ : options.samples ?? 5,
241
+ threshold: typeof options.threshold === 'string'
242
+ ? parseFloat(options.threshold)
243
+ : options.threshold ?? 0.7,
244
+ files: options.files ?? [],
245
+ domains: options.domains ?? [],
246
+ verbose: options.verbose ?? false,
247
+ json: options.json ?? false,
248
+ quiet: false,
249
+ noColor: false,
250
+ config: '.spec-gen/config.json',
251
+ };
252
+ // Validate threshold range
253
+ if (opts.threshold < 0 || opts.threshold > 1) {
254
+ logger.error('Threshold must be between 0 and 1');
255
+ process.exitCode = 1;
256
+ return;
257
+ }
258
+ try {
259
+ // ========================================================================
260
+ // PHASE 1: VALIDATION
261
+ // ========================================================================
262
+ if (!opts.json) {
263
+ logger.section('Verifying Specifications');
264
+ }
265
+ // Load spec-gen config
266
+ const specGenConfig = await readSpecGenConfig(rootPath);
267
+ if (!specGenConfig) {
268
+ logger.error('No spec-gen configuration found. Run "spec-gen init" first.');
269
+ process.exitCode = 1;
270
+ return;
271
+ }
272
+ // Determine openspec path
273
+ const openspecPath = join(rootPath, specGenConfig.openspecPath ?? 'openspec');
274
+ const specsPath = join(openspecPath, 'specs');
275
+ // Check if specs exist
276
+ if (!(await fileExists(specsPath))) {
277
+ logger.error('No specs found. Run "spec-gen generate" first.');
278
+ process.exitCode = 1;
279
+ return;
280
+ }
281
+ if (!opts.json) {
282
+ logger.discovery(`Loading generated specs from ${specGenConfig.openspecPath}/specs/`);
283
+ }
284
+ // Load generation report to get context files
285
+ const generationReport = await loadGenerationReport(rootPath);
286
+ const generationContext = generationReport?.filesWritten ?? [];
287
+ // Load dependency graph
288
+ const analysisPath = join(rootPath, '.spec-gen', 'analysis');
289
+ const depGraph = await loadDependencyGraph(analysisPath);
290
+ if (!depGraph) {
291
+ logger.error('No analysis found. Run "spec-gen analyze" first.');
292
+ process.exitCode = 1;
293
+ return;
294
+ }
295
+ if (!opts.json) {
296
+ logger.info('Files in analysis', depGraph.nodes.length);
297
+ logger.blank();
298
+ }
299
+ // ========================================================================
300
+ // PHASE 2: CHECK LLM API
301
+ // ========================================================================
302
+ const anthropicKey = process.env.ANTHROPIC_API_KEY;
303
+ const openaiKey = process.env.OPENAI_API_KEY;
304
+ if (!anthropicKey && !openaiKey) {
305
+ logger.error('No LLM API key found.');
306
+ logger.discovery('Set ANTHROPIC_API_KEY or OPENAI_API_KEY environment variable.');
307
+ process.exitCode = 1;
308
+ return;
309
+ }
310
+ // Create LLM service (CLI flags > env vars > config file)
311
+ const provider = anthropicKey ? 'anthropic' : 'openai';
312
+ let llm;
313
+ try {
314
+ llm = createLLMService({
315
+ provider,
316
+ apiBase: globalOpts.apiBase ?? specGenConfig.llm?.apiBase,
317
+ sslVerify: globalOpts.insecure != null ? !globalOpts.insecure : specGenConfig.llm?.sslVerify ?? true,
318
+ enableLogging: true,
319
+ logDir: join(rootPath, '.spec-gen', 'logs'),
320
+ });
321
+ }
322
+ catch (error) {
323
+ logger.error(`Failed to create LLM service: ${error.message}`);
324
+ process.exitCode = 1;
325
+ return;
326
+ }
327
+ // ========================================================================
328
+ // PHASE 3: RUN VERIFICATION
329
+ // ========================================================================
330
+ const verificationDir = join(rootPath, '.spec-gen', 'verification');
331
+ const engine = new SpecVerificationEngine(llm, {
332
+ rootPath,
333
+ openspecPath,
334
+ outputDir: verificationDir,
335
+ filesPerDomain: Math.ceil(opts.samples / 4), // Distribute across domains
336
+ passThreshold: opts.threshold,
337
+ generationContext,
338
+ });
339
+ if (!opts.json) {
340
+ logger.analysis(`Selecting verification files (${opts.samples} samples)...`);
341
+ logger.blank();
342
+ }
343
+ // Get candidates first to show selection
344
+ const candidates = engine.selectCandidates(depGraph);
345
+ if (candidates.length === 0) {
346
+ logger.error('No suitable verification candidates found.');
347
+ logger.discovery('Try running with a lower --samples value or check that analysis includes non-test files.');
348
+ process.exitCode = 1;
349
+ return;
350
+ }
351
+ // Limit to requested sample size
352
+ const selectedCandidates = candidates.slice(0, opts.samples);
353
+ if (!opts.json) {
354
+ logger.discovery(`Files selected for verification:`);
355
+ for (let i = 0; i < selectedCandidates.length; i++) {
356
+ const c = selectedCandidates[i];
357
+ logger.listItem(`${c.path} (${c.domain} domain)`);
358
+ }
359
+ logger.blank();
360
+ logger.analysis('Verifying specs against codebase...');
361
+ }
362
+ // Run verification
363
+ let report;
364
+ try {
365
+ report = await engine.verify(depGraph, specGenConfig.version);
366
+ }
367
+ catch (error) {
368
+ logger.error(`Verification failed: ${error.message}`);
369
+ process.exitCode = 1;
370
+ return;
371
+ }
372
+ // ========================================================================
373
+ // PHASE 4: DISPLAY RESULTS
374
+ // ========================================================================
375
+ if (opts.json) {
376
+ // JSON-only output
377
+ console.log(JSON.stringify(report, null, 2));
378
+ }
379
+ else {
380
+ // Display individual results
381
+ for (let i = 0; i < report.results.length; i++) {
382
+ displayResult(report.results[i], i + 1, report.results.length, opts.threshold, opts.verbose ?? false);
383
+ }
384
+ // Display summary
385
+ displaySummary(report, opts.threshold);
386
+ // Final status
387
+ const duration = Date.now() - startTime;
388
+ logger.info('Total time', formatDuration(duration));
389
+ logger.blank();
390
+ // Exit status based on recommendation
391
+ if (report.recommendation === 'regenerate') {
392
+ process.exitCode = 1;
393
+ }
394
+ else if (report.recommendation === 'needs-review') {
395
+ process.exitCode = 0; // Warning but not failure
396
+ }
397
+ else {
398
+ logger.success('Verification passed!');
399
+ }
400
+ }
401
+ // Save LLM logs
402
+ try {
403
+ await llm.saveLogs();
404
+ }
405
+ catch {
406
+ // Ignore log save errors
407
+ }
408
+ }
409
+ catch (error) {
410
+ logger.error(`Verify failed: ${error.message}`);
411
+ if (process.env.DEBUG) {
412
+ console.error(error);
413
+ }
414
+ process.exitCode = 1;
415
+ }
416
+ });
417
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../../src/cli/commands/verify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * spec-gen view command
3
+ *
4
+ * Starts a local React (Vite) server to visualize analysis graphs,
5
+ * then opens the user's browser.
6
+ */
7
+ import { Command } from 'commander';
8
+ export declare const viewCommand: Command;
9
+ //# sourceMappingURL=view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/view.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkDpC,eAAO,MAAM,WAAW,SAyfrB,CAAC"}