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,546 @@
1
+ /**
2
+ * spec-gen run command (default pipeline)
3
+ *
4
+ * Runs the full pipeline: init → analyze → generate in sequence.
5
+ * Smart defaults skip unnecessary steps and detect existing setups.
6
+ */
7
+ import { Command } from 'commander';
8
+ import { access, stat, readFile, mkdir, writeFile } from 'node:fs/promises';
9
+ import { join, basename } from 'node:path';
10
+ import { confirm } from '@inquirer/prompts';
11
+ import { logger } from '../../utils/logger.js';
12
+ import { detectProjectType, getProjectTypeName, } from '../../core/services/project-detector.js';
13
+ import { getDefaultConfig, readSpecGenConfig, writeSpecGenConfig, specGenConfigExists, openspecDirExists, createOpenSpecStructure, } from '../../core/services/config-manager.js';
14
+ import { gitignoreExists, isInGitignore, addToGitignore, } from '../../core/services/gitignore-manager.js';
15
+ import { runAnalysis } from './analyze.js';
16
+ import { createLLMService, } from '../../core/services/llm-service.js';
17
+ import { SpecGenerationPipeline, } from '../../core/generator/spec-pipeline.js';
18
+ import { OpenSpecFormatGenerator, } from '../../core/generator/openspec-format-generator.js';
19
+ import { OpenSpecWriter, } from '../../core/generator/openspec-writer.js';
20
+ import { ADRGenerator } from '../../core/generator/adr-generator.js';
21
+ // ============================================================================
22
+ // HELPER FUNCTIONS
23
+ // ============================================================================
24
+ /**
25
+ * Check if a file exists
26
+ */
27
+ async function fileExists(path) {
28
+ try {
29
+ await access(path);
30
+ return true;
31
+ }
32
+ catch {
33
+ return false;
34
+ }
35
+ }
36
+ /**
37
+ * Format time duration for display
38
+ */
39
+ function formatDuration(ms) {
40
+ if (ms < 1000)
41
+ return `${ms}ms`;
42
+ if (ms < 60000)
43
+ return `${(ms / 1000).toFixed(1)}s`;
44
+ const minutes = Math.floor(ms / 60000);
45
+ const seconds = Math.floor((ms % 60000) / 1000);
46
+ return `${minutes}m ${seconds}s`;
47
+ }
48
+ /**
49
+ * Format age in human-readable form
50
+ */
51
+ function formatAge(ms) {
52
+ if (ms < 60000)
53
+ return 'just now';
54
+ if (ms < 3600000)
55
+ return `${Math.floor(ms / 60000)} minutes ago`;
56
+ if (ms < 86400000)
57
+ return `${Math.floor(ms / 3600000)} hours ago`;
58
+ return `${Math.floor(ms / 86400000)} days ago`;
59
+ }
60
+ /**
61
+ * Get analysis age if it exists
62
+ */
63
+ async function getAnalysisAge(analysisPath) {
64
+ try {
65
+ const repoStructurePath = join(analysisPath, 'repo-structure.json');
66
+ if (!(await fileExists(repoStructurePath))) {
67
+ return null;
68
+ }
69
+ const stats = await stat(repoStructurePath);
70
+ return Date.now() - stats.mtime.getTime();
71
+ }
72
+ catch {
73
+ return null;
74
+ }
75
+ }
76
+ /**
77
+ * Load analysis data from disk
78
+ */
79
+ async function loadAnalysis(analysisPath) {
80
+ try {
81
+ const repoStructurePath = join(analysisPath, 'repo-structure.json');
82
+ const llmContextPath = join(analysisPath, 'llm-context.json');
83
+ const depGraphPath = join(analysisPath, 'dependency-graph.json');
84
+ if (!(await fileExists(repoStructurePath))) {
85
+ return null;
86
+ }
87
+ const repoStructureContent = await readFile(repoStructurePath, 'utf-8');
88
+ const repoStructure = JSON.parse(repoStructureContent);
89
+ let llmContext;
90
+ if (await fileExists(llmContextPath)) {
91
+ const llmContextContent = await readFile(llmContextPath, 'utf-8');
92
+ llmContext = JSON.parse(llmContextContent);
93
+ }
94
+ else {
95
+ llmContext = {
96
+ phase1_survey: { purpose: 'Initial survey', files: [], estimatedTokens: 0 },
97
+ phase2_deep: { purpose: 'Deep analysis', files: [], totalTokens: 0 },
98
+ phase3_validation: { purpose: 'Validation', files: [], totalTokens: 0 },
99
+ };
100
+ }
101
+ let depGraph;
102
+ if (await fileExists(depGraphPath)) {
103
+ const depGraphContent = await readFile(depGraphPath, 'utf-8');
104
+ depGraph = JSON.parse(depGraphContent);
105
+ }
106
+ const stats = await stat(repoStructurePath);
107
+ const age = Date.now() - stats.mtime.getTime();
108
+ return { repoStructure, llmContext, depGraph, age };
109
+ }
110
+ catch {
111
+ return null;
112
+ }
113
+ }
114
+ /**
115
+ * Estimate cost for generation
116
+ */
117
+ function estimateCost(llmContext, model) {
118
+ let totalTokens = 0;
119
+ totalTokens += llmContext.phase1_survey.estimatedTokens ?? 2000;
120
+ for (const file of llmContext.phase2_deep.files) {
121
+ totalTokens += file.tokens;
122
+ }
123
+ const outputTokens = Math.ceil(totalTokens * 0.3);
124
+ totalTokens += outputTokens;
125
+ const pricing = {
126
+ 'claude-sonnet-4-20250514': { input: 3.0, output: 15.0 },
127
+ 'claude-3-5-sonnet-20241022': { input: 3.0, output: 15.0 },
128
+ 'claude-opus-4-20250514': { input: 15.0, output: 75.0 },
129
+ 'gpt-4o': { input: 5.0, output: 15.0 },
130
+ 'gpt-4o-mini': { input: 0.15, output: 0.6 },
131
+ default: { input: 3.0, output: 15.0 },
132
+ };
133
+ const modelPricing = pricing[model] ?? pricing.default;
134
+ const inputCost = (totalTokens * 0.7 / 1_000_000) * modelPricing.input;
135
+ const outputCost = (outputTokens / 1_000_000) * modelPricing.output;
136
+ const cost = inputCost + outputCost;
137
+ return { tokens: totalTokens, cost };
138
+ }
139
+ /**
140
+ * Save run metadata
141
+ */
142
+ async function saveRunMetadata(rootPath, metadata) {
143
+ const runsDir = join(rootPath, '.spec-gen', 'runs');
144
+ await mkdir(runsDir, { recursive: true });
145
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
146
+ const filename = `${timestamp}.json`;
147
+ await writeFile(join(runsDir, filename), JSON.stringify(metadata, null, 2));
148
+ }
149
+ /**
150
+ * Display the pipeline banner
151
+ */
152
+ function displayBanner(projectName, projectType, rootPath) {
153
+ console.log('');
154
+ console.log('╭─────────────────────────────────────────────────────╮');
155
+ console.log('│ spec-gen v1.0.0 — OpenSpec Reverse Engineering Tool │');
156
+ console.log('╰─────────────────────────────────────────────────────╯');
157
+ console.log('');
158
+ console.log(` Project: ${projectName}`);
159
+ console.log(` Type: ${projectType}`);
160
+ console.log(` Path: ${rootPath}`);
161
+ console.log('');
162
+ }
163
+ /**
164
+ * Display the completion banner
165
+ */
166
+ function displayCompletionBanner() {
167
+ console.log('');
168
+ console.log('╭─────────────────────────────────────────────────────╮');
169
+ console.log('│ Specifications generated successfully! │');
170
+ console.log('│ │');
171
+ console.log('│ Review your specs: openspec list --specs │');
172
+ console.log('│ Validate structure: openspec validate --all │');
173
+ console.log('│ Test accuracy: spec-gen verify │');
174
+ console.log('│ Start a change: openspec change my-feature │');
175
+ console.log('╰─────────────────────────────────────────────────────╯');
176
+ console.log('');
177
+ }
178
+ // ============================================================================
179
+ // COMMAND
180
+ // ============================================================================
181
+ export const runCommand = new Command('run')
182
+ .description('Run the full spec-gen pipeline (init → analyze → generate)')
183
+ .option('--force', 'Reinitialize even if config exists', false)
184
+ .option('--reanalyze', 'Force fresh analysis even if recent exists', false)
185
+ .option('--model <name>', 'LLM model to use for generation', 'claude-sonnet-4-20250514')
186
+ .option('--dry-run', 'Show what would be done without making changes', false)
187
+ .option('-y, --yes', 'Skip all confirmation prompts', false)
188
+ .option('--max-files <n>', 'Maximum files to analyze', '500')
189
+ .option('--adr', 'Also generate Architecture Decision Records', false)
190
+ .addHelpText('after', `
191
+ Examples:
192
+ $ spec-gen run Run full pipeline with smart defaults
193
+ $ spec-gen run --force Reinitialize and re-analyze
194
+ $ spec-gen run --reanalyze Force fresh analysis
195
+ $ spec-gen run --model claude-opus-4-20250514
196
+ Use a different model
197
+ $ spec-gen run --dry-run Preview what would happen
198
+ $ spec-gen run -y Skip all prompts
199
+
200
+ Smart Defaults:
201
+ - Skips init if .spec-gen/config.json exists
202
+ - Skips analyze if recent analysis exists (< 1 hour old)
203
+ - Always runs generate (the main purpose)
204
+ - Detects and works with existing openspec/ setup
205
+
206
+ The pipeline saves run metadata to .spec-gen/runs/ for tracking.
207
+ `)
208
+ .action(async function (options) {
209
+ const startTime = Date.now();
210
+ const rootPath = process.cwd();
211
+ // Inherit global options (--api-base, --insecure, etc.)
212
+ const globalOpts = this.optsWithGlobals?.() ?? {};
213
+ const opts = {
214
+ force: options.force ?? false,
215
+ reanalyze: options.reanalyze ?? false,
216
+ model: options.model ?? 'claude-sonnet-4-20250514',
217
+ dryRun: options.dryRun ?? false,
218
+ yes: options.yes ?? false,
219
+ maxFiles: typeof options.maxFiles === 'string'
220
+ ? parseInt(options.maxFiles, 10)
221
+ : options.maxFiles ?? 500,
222
+ adr: options.adr ?? false,
223
+ };
224
+ const metadata = {
225
+ version: '1.0.0',
226
+ timestamp: new Date().toISOString(),
227
+ duration: 0,
228
+ steps: {
229
+ init: { status: 'skipped' },
230
+ analyze: { status: 'skipped' },
231
+ generate: { status: 'skipped' },
232
+ },
233
+ result: 'success',
234
+ };
235
+ try {
236
+ // ========================================================================
237
+ // PRE-FLIGHT: DETECT PROJECT
238
+ // ========================================================================
239
+ const detection = await detectProjectType(rootPath);
240
+ const projectName = basename(rootPath);
241
+ const projectTypeName = getProjectTypeName(detection.projectType);
242
+ displayBanner(projectName, projectTypeName, rootPath);
243
+ if (opts.dryRun) {
244
+ logger.discovery('DRY RUN - No changes will be made');
245
+ console.log('');
246
+ }
247
+ // ========================================================================
248
+ // STEP 1/3: INITIALIZATION
249
+ // ========================================================================
250
+ console.log('[Step 1/3] Initialization');
251
+ const configExists = await specGenConfigExists(rootPath);
252
+ let specGenConfig = configExists ? await readSpecGenConfig(rootPath) : null;
253
+ if (configExists && !opts.force) {
254
+ console.log(' ✓ Configuration exists (.spec-gen/config.json)');
255
+ metadata.steps.init = { status: 'skipped', reason: 'Config exists' };
256
+ }
257
+ else {
258
+ if (opts.dryRun) {
259
+ console.log(' → Would create .spec-gen/config.json');
260
+ console.log(` → Would detect project type: ${projectTypeName}`);
261
+ }
262
+ else {
263
+ // Create config
264
+ const openspecPath = './openspec';
265
+ specGenConfig = getDefaultConfig(detection.projectType, openspecPath);
266
+ await writeSpecGenConfig(rootPath, specGenConfig);
267
+ console.log(' ✓ Created .spec-gen/config.json');
268
+ // Create openspec directory if needed
269
+ const fullOpenspecPath = join(rootPath, openspecPath);
270
+ if (!(await openspecDirExists(fullOpenspecPath))) {
271
+ await createOpenSpecStructure(fullOpenspecPath);
272
+ console.log(' ✓ Created openspec/ directory');
273
+ }
274
+ else {
275
+ console.log(' ✓ OpenSpec directory exists (./openspec)');
276
+ }
277
+ // Update gitignore
278
+ const hasGitignore = await gitignoreExists(rootPath);
279
+ if (hasGitignore) {
280
+ const alreadyIgnored = await isInGitignore(rootPath, '.spec-gen/');
281
+ if (!alreadyIgnored) {
282
+ await addToGitignore(rootPath, '.spec-gen/', 'spec-gen analysis artifacts');
283
+ console.log(' ✓ Added .spec-gen/ to .gitignore');
284
+ }
285
+ }
286
+ metadata.steps.init = { status: 'completed' };
287
+ }
288
+ }
289
+ // Ensure we have config
290
+ if (!specGenConfig && !opts.dryRun) {
291
+ specGenConfig = await readSpecGenConfig(rootPath);
292
+ if (!specGenConfig) {
293
+ throw new Error('Failed to load configuration');
294
+ }
295
+ }
296
+ // Check openspec directory
297
+ const openspecPath = specGenConfig?.openspecPath ?? './openspec';
298
+ const fullOpenspecPath = join(rootPath, openspecPath);
299
+ if (await openspecDirExists(fullOpenspecPath)) {
300
+ console.log(` ✓ OpenSpec directory exists (${openspecPath})`);
301
+ }
302
+ console.log('');
303
+ // ========================================================================
304
+ // STEP 2/3: ANALYSIS
305
+ // ========================================================================
306
+ console.log('[Step 2/3] Analysis');
307
+ const analysisPath = join(rootPath, '.spec-gen', 'analysis');
308
+ const analysisAge = await getAnalysisAge(analysisPath);
309
+ const oneHour = 60 * 60 * 1000;
310
+ let analysisData = null;
311
+ if (analysisAge !== null && analysisAge < oneHour && !opts.reanalyze && !opts.force) {
312
+ // Use existing analysis
313
+ console.log(` ✓ Recent analysis found (${formatAge(analysisAge)})`);
314
+ analysisData = await loadAnalysis(analysisPath);
315
+ if (analysisData) {
316
+ const { repoStructure } = analysisData;
317
+ console.log(` Using existing analysis: ${repoStructure.statistics.analyzedFiles} files, ${repoStructure.domains.length} domains`);
318
+ console.log(` Detected domains: ${repoStructure.domains.map(d => d.name).join(', ') || 'None'}`);
319
+ metadata.steps.analyze = {
320
+ status: 'skipped',
321
+ reason: `Recent analysis (${formatAge(analysisAge)})`,
322
+ filesAnalyzed: repoStructure.statistics.analyzedFiles,
323
+ };
324
+ }
325
+ }
326
+ if (!analysisData) {
327
+ if (opts.dryRun) {
328
+ console.log(' → Would scan codebase for files');
329
+ console.log(' → Would build dependency graph');
330
+ console.log(' → Would generate analysis artifacts');
331
+ }
332
+ else {
333
+ console.log(' Running analysis...');
334
+ await mkdir(analysisPath, { recursive: true });
335
+ const result = await runAnalysis(rootPath, analysisPath, {
336
+ maxFiles: opts.maxFiles,
337
+ include: [],
338
+ exclude: [],
339
+ });
340
+ analysisData = {
341
+ repoStructure: result.artifacts.repoStructure,
342
+ llmContext: result.artifacts.llmContext,
343
+ depGraph: result.depGraph,
344
+ age: 0,
345
+ };
346
+ console.log(` ✓ Analyzed ${result.repoMap.summary.analyzedFiles} files`);
347
+ console.log(` ✓ Found ${result.depGraph.statistics.clusterCount} clusters`);
348
+ console.log(` Detected domains: ${result.artifacts.repoStructure.domains.map(d => d.name).join(', ') || 'None'}`);
349
+ metadata.steps.analyze = {
350
+ status: 'completed',
351
+ filesAnalyzed: result.repoMap.summary.analyzedFiles,
352
+ };
353
+ }
354
+ }
355
+ console.log('');
356
+ // ========================================================================
357
+ // STEP 3/3: GENERATION
358
+ // ========================================================================
359
+ console.log('[Step 3/3] Generation');
360
+ if (!analysisData && !opts.dryRun) {
361
+ throw new Error('No analysis data available for generation');
362
+ }
363
+ // Check for API key
364
+ const anthropicKey = process.env.ANTHROPIC_API_KEY;
365
+ const openaiKey = process.env.OPENAI_API_KEY;
366
+ if (!anthropicKey && !openaiKey) {
367
+ console.log(' ✗ No LLM API key found');
368
+ console.log('');
369
+ logger.error('Set ANTHROPIC_API_KEY or OPENAI_API_KEY environment variable.');
370
+ logger.discovery('To get an API key:');
371
+ logger.discovery(' Anthropic: https://console.anthropic.com/');
372
+ logger.discovery(' OpenAI: https://platform.openai.com/');
373
+ metadata.result = 'failure';
374
+ metadata.error = 'No LLM API key';
375
+ process.exitCode = 1;
376
+ return;
377
+ }
378
+ // Estimate cost
379
+ if (analysisData) {
380
+ const estimate = estimateCost(analysisData.llmContext, opts.model);
381
+ console.log(` Estimated cost: ~$${estimate.cost.toFixed(2)}`);
382
+ // Confirmation prompt
383
+ if (!opts.dryRun && !opts.yes && estimate.cost > 0.1) {
384
+ if (process.stdin.isTTY) {
385
+ const shouldContinue = await confirm({
386
+ message: `Estimated cost: ~$${estimate.cost.toFixed(2)}. Continue?`,
387
+ default: true,
388
+ });
389
+ if (!shouldContinue) {
390
+ console.log(' Cancelled by user');
391
+ metadata.result = 'failure';
392
+ metadata.error = 'Cancelled by user';
393
+ return;
394
+ }
395
+ }
396
+ }
397
+ }
398
+ if (opts.dryRun) {
399
+ console.log('');
400
+ console.log(' → Would run LLM generation pipeline:');
401
+ console.log(' ├─ Project Survey');
402
+ console.log(' ├─ Entity Extraction');
403
+ console.log(' ├─ Service Analysis');
404
+ console.log(' ├─ API Extraction');
405
+ console.log(' └─ Architecture Synthesis');
406
+ console.log('');
407
+ console.log(' → Would write specifications:');
408
+ console.log(` ├─ ${openspecPath}/specs/overview/spec.md`);
409
+ console.log(` ├─ ${openspecPath}/specs/architecture/spec.md`);
410
+ if (analysisData) {
411
+ for (const domain of analysisData.repoStructure.domains.slice(0, 5)) {
412
+ console.log(` ├─ ${openspecPath}/specs/${domain.name}/spec.md`);
413
+ }
414
+ }
415
+ console.log(` └─ ${openspecPath}/specs/api/spec.md (if applicable)`);
416
+ console.log('');
417
+ console.log('DRY RUN COMPLETE - No changes were made');
418
+ return;
419
+ }
420
+ // Create LLM service (CLI flags > env vars > config file)
421
+ const provider = anthropicKey ? 'anthropic' : 'openai';
422
+ let llm;
423
+ try {
424
+ llm = createLLMService({
425
+ provider,
426
+ model: opts.model,
427
+ apiBase: globalOpts.apiBase ?? specGenConfig?.llm?.apiBase,
428
+ sslVerify: globalOpts.insecure != null ? !globalOpts.insecure : specGenConfig?.llm?.sslVerify ?? true,
429
+ enableLogging: true,
430
+ logDir: join(rootPath, '.spec-gen', 'logs'),
431
+ });
432
+ }
433
+ catch (error) {
434
+ throw new Error(`Failed to create LLM service: ${error.message}`);
435
+ }
436
+ console.log('');
437
+ console.log(' Generating specifications...');
438
+ // Run generation pipeline
439
+ const pipeline = new SpecGenerationPipeline(llm, {
440
+ outputDir: join(rootPath, '.spec-gen', 'generation'),
441
+ saveIntermediate: true,
442
+ generateADRs: opts.adr,
443
+ });
444
+ let pipelineResult;
445
+ try {
446
+ pipelineResult = await pipeline.run(analysisData.repoStructure, analysisData.llmContext, analysisData.depGraph);
447
+ }
448
+ catch (error) {
449
+ await llm.saveLogs().catch(() => { });
450
+ throw new Error(`Pipeline failed: ${error.message}`);
451
+ }
452
+ console.log(' ├─ Project Survey ✓');
453
+ console.log(' ├─ Entity Extraction ✓');
454
+ console.log(' ├─ Service Analysis ✓');
455
+ console.log(' ├─ API Extraction ✓');
456
+ console.log(` ${opts.adr ? '├' : '└'}─ Architecture Synthesis ✓`);
457
+ if (opts.adr) {
458
+ const adrStatus = pipelineResult.adrs && pipelineResult.adrs.length > 0
459
+ ? `✓ (${pipelineResult.adrs.length} decisions)`
460
+ : '○ (no decisions found)';
461
+ console.log(` └─ ADR Enrichment ${adrStatus}`);
462
+ }
463
+ console.log('');
464
+ // Format and write specs
465
+ console.log(' Writing OpenSpec specifications...');
466
+ const formatGenerator = new OpenSpecFormatGenerator({
467
+ version: specGenConfig?.version ?? '1.0.0',
468
+ includeConfidence: true,
469
+ includeTechnicalNotes: true,
470
+ });
471
+ const generatedSpecs = formatGenerator.generateSpecs(pipelineResult);
472
+ // Generate ADRs if requested
473
+ if (opts.adr && pipelineResult.adrs && pipelineResult.adrs.length > 0) {
474
+ const adrGenerator = new ADRGenerator({
475
+ version: specGenConfig?.version ?? '1.0.0',
476
+ includeMermaid: true,
477
+ });
478
+ const adrSpecs = adrGenerator.generateADRs(pipelineResult);
479
+ generatedSpecs.push(...adrSpecs);
480
+ }
481
+ const writer = new OpenSpecWriter({
482
+ rootPath,
483
+ writeMode: 'replace',
484
+ version: specGenConfig?.version ?? '1.0.0',
485
+ createBackups: true,
486
+ updateConfig: true,
487
+ validateBeforeWrite: true,
488
+ });
489
+ let report;
490
+ try {
491
+ report = await writer.writeSpecs(generatedSpecs, pipelineResult.survey);
492
+ }
493
+ catch (error) {
494
+ throw new Error(`Failed to write specs: ${error.message}`);
495
+ }
496
+ // Display written files
497
+ for (let i = 0; i < report.filesWritten.length; i++) {
498
+ const file = report.filesWritten[i];
499
+ const isLast = i === report.filesWritten.length - 1;
500
+ const prefix = isLast ? '└─' : '├─';
501
+ console.log(` ${prefix} ${file} ✓`);
502
+ }
503
+ // Save LLM logs
504
+ await llm.saveLogs().catch(() => { });
505
+ metadata.steps.generate = {
506
+ status: 'completed',
507
+ specsGenerated: report.filesWritten.length,
508
+ };
509
+ // ========================================================================
510
+ // COMPLETION
511
+ // ========================================================================
512
+ displayCompletionBanner();
513
+ const duration = Date.now() - startTime;
514
+ metadata.duration = duration;
515
+ console.log(` Full report: .spec-gen/outputs/generation-report.json`);
516
+ console.log(` Total time: ${formatDuration(duration)}`);
517
+ console.log('');
518
+ // Save run metadata
519
+ await saveRunMetadata(rootPath, metadata);
520
+ }
521
+ catch (error) {
522
+ const duration = Date.now() - startTime;
523
+ metadata.duration = duration;
524
+ metadata.result = 'failure';
525
+ metadata.error = error.message;
526
+ await saveRunMetadata(rootPath, metadata).catch(() => { });
527
+ logger.error(`Pipeline failed: ${error.message}`);
528
+ if (process.env.DEBUG) {
529
+ console.error(error);
530
+ }
531
+ process.exitCode = 1;
532
+ }
533
+ });
534
+ /**
535
+ * Create the default action for spec-gen (no subcommand)
536
+ * This wraps runCommand to be used as the default action
537
+ */
538
+ export async function runDefaultPipeline(path, options) {
539
+ // Change to the specified path if provided and different from cwd
540
+ if (path && path !== '.') {
541
+ process.chdir(path);
542
+ }
543
+ // Invoke the run command action
544
+ await runCommand.parseAsync(['node', 'spec-gen', 'run', ...(options.yes ? ['-y'] : [])], { from: 'user' });
545
+ }
546
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/cli/commands/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
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
+ export declare const verifyCommand: Command;
9
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/verify.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwOpC,eAAO,MAAM,aAAa,SA2QtB,CAAC"}