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,128 @@
1
+ /**
2
+ * Custom error classes for spec-gen with helpful user-facing messages
3
+ */
4
+ /**
5
+ * Base error class for spec-gen with code and suggestion
6
+ */
7
+ export class SpecGenError extends Error {
8
+ code;
9
+ suggestion;
10
+ constructor(message, code, suggestion) {
11
+ super(message);
12
+ this.code = code;
13
+ this.suggestion = suggestion;
14
+ this.name = 'SpecGenError';
15
+ // Maintains proper stack trace for where error was thrown
16
+ Error.captureStackTrace?.(this, this.constructor);
17
+ }
18
+ /**
19
+ * Format error for CLI display with color support
20
+ */
21
+ format(useColor = true) {
22
+ const red = useColor ? '\x1b[31m' : '';
23
+ const yellow = useColor ? '\x1b[33m' : '';
24
+ const reset = useColor ? '\x1b[0m' : '';
25
+ const dim = useColor ? '\x1b[2m' : '';
26
+ let output = `${red}Error [${this.code}]:${reset} ${this.message}`;
27
+ if (this.suggestion) {
28
+ output += `\n\n${yellow}Suggestion:${reset} ${this.suggestion}`;
29
+ }
30
+ output += `\n\n${dim}For more help, see: https://github.com/clay-good/spec-gen#readme${reset}`;
31
+ return output;
32
+ }
33
+ }
34
+ /**
35
+ * Error factory functions with predefined messages and suggestions
36
+ */
37
+ export const errors = {
38
+ noApiKey() {
39
+ return new SpecGenError('No API key found for LLM provider', 'NO_API_KEY', `Set ANTHROPIC_API_KEY or OPENAI_API_KEY environment variable.
40
+ Get an API key at https://console.anthropic.com/ or https://platform.openai.com/`);
41
+ },
42
+ notARepository() {
43
+ return new SpecGenError('No .git directory found', 'NOT_A_REPOSITORY', `spec-gen works best in git repositories.
44
+ Run 'git init' or use --force to continue anyway.`);
45
+ },
46
+ openspecExists(path) {
47
+ return new SpecGenError(`openspec/specs/ already contains specifications at ${path}`, 'OPENSPEC_EXISTS', `Use --merge to add to existing specs, or --force to overwrite.
48
+ Existing specs will be backed up to .spec-gen/backups/`);
49
+ },
50
+ analysisTooOld(ageHours) {
51
+ return new SpecGenError(`Existing analysis is ${ageHours.toFixed(1)} hours old`, 'ANALYSIS_TOO_OLD', `Run 'spec-gen analyze' to refresh, or use --reanalyze flag.`);
52
+ },
53
+ noHighValueFiles() {
54
+ return new SpecGenError('Could not identify any high-value files to analyze', 'NO_HIGH_VALUE_FILES', `This might happen with unusual project structures.
55
+ Try adjusting scoring in .spec-gen/config.json or use --include patterns.`);
56
+ },
57
+ llmRateLimit(attempt, maxAttempts) {
58
+ return new SpecGenError('API rate limit exceeded', 'LLM_RATE_LIMIT', `Waiting and retrying... (attempt ${attempt} of ${maxAttempts})
59
+ If this persists, try a different model or wait a few minutes.`);
60
+ },
61
+ openspecValidationFailed(details) {
62
+ return new SpecGenError(`Generated specs failed OpenSpec validation${details ? `: ${details}` : ''}`, 'OPENSPEC_VALIDATION_FAILED', `Check .spec-gen/logs/ for details.
63
+ This may indicate a generation bug - please report it at https://github.com/clay-good/spec-gen/issues`);
64
+ },
65
+ analysisFailed(reason) {
66
+ return new SpecGenError(`Static analysis failed: ${reason}`, 'ANALYSIS_FAILED', `Check that the project directory is accessible and contains source files.
67
+ Try running with --verbose for more details.`);
68
+ },
69
+ generationFailed(reason) {
70
+ return new SpecGenError(`Spec generation failed: ${reason}`, 'GENERATION_FAILED', `This could be due to API issues or invalid analysis data.
71
+ Try running 'spec-gen analyze' first, then 'spec-gen generate'.`);
72
+ },
73
+ verificationFailed(reason) {
74
+ return new SpecGenError(`Verification failed: ${reason}`, 'VERIFICATION_FAILED', `Ensure specs exist in openspec/specs/ directory.
75
+ Run 'spec-gen generate' first if you haven't already.`);
76
+ },
77
+ configNotFound(path) {
78
+ return new SpecGenError(`Configuration file not found at ${path}`, 'CONFIG_NOT_FOUND', `Run 'spec-gen init' to create a configuration file.`);
79
+ },
80
+ invalidConfig(path, details) {
81
+ return new SpecGenError(`Invalid configuration file at ${path}${details ? `: ${details}` : ''}`, 'INVALID_CONFIG', `Check the configuration file format. You may need to delete it and run 'spec-gen init' again.`);
82
+ },
83
+ fileWriteError(path, reason) {
84
+ return new SpecGenError(`Failed to write file ${path}${reason ? `: ${reason}` : ''}`, 'FILE_WRITE_ERROR', `Check that you have write permissions for the directory.`);
85
+ },
86
+ fileReadError(path, reason) {
87
+ return new SpecGenError(`Failed to read file ${path}${reason ? `: ${reason}` : ''}`, 'FILE_READ_ERROR', `Check that the file exists and you have read permissions.`);
88
+ },
89
+ driftDetected(issueCount) {
90
+ return new SpecGenError(`Spec drift detected: ${issueCount} issue${issueCount === 1 ? '' : 's'} found`, 'DRIFT_DETECTED', `Run 'spec-gen drift' to see details, then update specs to match code changes.
91
+ Use 'spec-gen drift --verbose' for detailed issue descriptions.`);
92
+ },
93
+ noSpecsFound() {
94
+ return new SpecGenError('No OpenSpec specifications found', 'NO_SPECS_FOUND', `Run 'spec-gen generate' to create specifications from your codebase.`);
95
+ },
96
+ unknown(error) {
97
+ const message = error instanceof Error ? error.message : String(error);
98
+ return new SpecGenError(`An unexpected error occurred: ${message}`, 'UNKNOWN_ERROR', `Please report this issue at https://github.com/clay-good/spec-gen/issues`);
99
+ },
100
+ };
101
+ /**
102
+ * Type guard to check if an error is a SpecGenError
103
+ */
104
+ export function isSpecGenError(error) {
105
+ return error instanceof SpecGenError;
106
+ }
107
+ /**
108
+ * Format any error for CLI display
109
+ */
110
+ export function formatError(error, useColor = true) {
111
+ if (isSpecGenError(error)) {
112
+ return error.format(useColor);
113
+ }
114
+ if (error instanceof Error) {
115
+ return errors.unknown(error).format(useColor);
116
+ }
117
+ return errors.unknown(String(error)).format(useColor);
118
+ }
119
+ /**
120
+ * Handle errors in CLI commands by formatting and logging them
121
+ */
122
+ export function handleError(error, exit = true) {
123
+ console.error(formatError(error, process.stdout.isTTY));
124
+ if (exit) {
125
+ process.exit(1);
126
+ }
127
+ }
128
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,149 @@
1
+ /**
2
+ * Standardized logging interface for spec-gen
3
+ *
4
+ * Provides semantic log levels with specific visual treatments:
5
+ * - DISCOVERY: Finding files, detecting patterns, scanning directories
6
+ * - ANALYSIS: Parsing AST, building graphs, scoring significance
7
+ * - INFERENCE: LLM generating content, making decisions
8
+ * - SUCCESS: Tasks complete successfully
9
+ * - WARNING: Non-fatal issues, skipped files, fallback behavior
10
+ * - ERROR: Fatal errors, missing requirements
11
+ */
12
+ import { type Ora } from 'ora';
13
+ export type LogLevel = 'discovery' | 'analysis' | 'inference' | 'success' | 'warning' | 'error' | 'debug';
14
+ export interface LoggerOptions {
15
+ quiet: boolean;
16
+ verbose: boolean;
17
+ noColor: boolean;
18
+ timestamps: boolean;
19
+ }
20
+ /**
21
+ * Logger class providing semantic log levels and spinner support
22
+ */
23
+ export declare class Logger {
24
+ private options;
25
+ private activeSpinner;
26
+ constructor(options?: Partial<LoggerOptions>);
27
+ /**
28
+ * Update logger options
29
+ */
30
+ configure(options: Partial<LoggerOptions>): void;
31
+ /**
32
+ * Get current options
33
+ */
34
+ getOptions(): LoggerOptions;
35
+ /**
36
+ * Format a message with optional timestamp
37
+ */
38
+ private formatMessage;
39
+ /**
40
+ * Core log method
41
+ */
42
+ private log;
43
+ /**
44
+ * DISCOVERY - Finding files, detecting patterns, scanning directories
45
+ * @example logger.discovery("Discovered 847 files across 23 directories")
46
+ */
47
+ discovery(message: string): void;
48
+ /**
49
+ * ANALYSIS - Parsing AST, building graphs, scoring significance
50
+ * @example logger.analysis("Analyzing dependency graph...")
51
+ */
52
+ analysis(message: string): void;
53
+ /**
54
+ * INFERENCE - LLM is generating content, making decisions
55
+ * @example logger.inference("Inferring system intent from core modules...")
56
+ */
57
+ inference(message: string): void;
58
+ /**
59
+ * SUCCESS - Tasks complete successfully
60
+ * @example logger.success("Generated openspec/specs/auth/spec.md")
61
+ */
62
+ success(message: string): void;
63
+ /**
64
+ * WARNING - Non-fatal issues, skipped files, fallback behavior
65
+ * @example logger.warning("Skipped 12 binary files")
66
+ */
67
+ warning(message: string): void;
68
+ /**
69
+ * ERROR - Fatal errors, missing requirements
70
+ * @example logger.error("No .git directory found. Is this a repository?")
71
+ */
72
+ error(message: string): void;
73
+ /**
74
+ * DEBUG - Verbose debug information (only shown with --verbose)
75
+ * @example logger.debug("Processing file: src/utils/helper.ts")
76
+ */
77
+ debug(message: string): void;
78
+ /**
79
+ * Start a spinner for long-running operations
80
+ * @returns Spinner control object with succeed/fail/stop methods
81
+ */
82
+ spinner(message: string): SpinnerController;
83
+ /**
84
+ * Register an external spinner so log calls pause/resume it correctly
85
+ */
86
+ setActiveSpinner(spinner: Ora | null): void;
87
+ /**
88
+ * Clear the active spinner reference
89
+ */
90
+ clearSpinner(): void;
91
+ /**
92
+ * Print a blank line (respects quiet mode)
93
+ */
94
+ blank(): void;
95
+ /**
96
+ * Print a section header
97
+ */
98
+ section(title: string): void;
99
+ /**
100
+ * Print a key-value pair for summaries
101
+ */
102
+ info(key: string, value: string | number): void;
103
+ /**
104
+ * Print a list item
105
+ */
106
+ listItem(item: string, indent?: number): void;
107
+ }
108
+ /**
109
+ * Controller for spinner operations
110
+ */
111
+ export declare class SpinnerController {
112
+ private spinner;
113
+ private logger;
114
+ constructor(spinner: Ora | null, logger: Logger);
115
+ /**
116
+ * Update spinner text
117
+ */
118
+ update(message: string): void;
119
+ /**
120
+ * Mark spinner as succeeded
121
+ */
122
+ succeed(message?: string): void;
123
+ /**
124
+ * Mark spinner as failed
125
+ */
126
+ fail(message?: string): void;
127
+ /**
128
+ * Mark spinner as warning
129
+ */
130
+ warn(message?: string): void;
131
+ /**
132
+ * Stop spinner without status
133
+ */
134
+ stop(): void;
135
+ /**
136
+ * Stop spinner and show info
137
+ */
138
+ info(message?: string): void;
139
+ }
140
+ /**
141
+ * Singleton logger instance for use across the application
142
+ */
143
+ export declare const logger: Logger;
144
+ /**
145
+ * Configure the global logger instance
146
+ */
147
+ export declare function configureLogger(options: Partial<LoggerOptions>): void;
148
+ export default logger;
149
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAY,EAAE,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,MAAM,QAAQ,GAAG,WAAW,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AAE1G,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;CACrB;AAmCD;;GAEG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,aAAa,CAAoB;gBAE7B,OAAO,GAAE,OAAO,CAAC,aAAa,CAAM;IAIhD;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI;IAIhD;;OAEG;IACH,UAAU,IAAI,aAAa;IAI3B;;OAEG;IACH,OAAO,CAAC,aAAa;IAcrB;;OAEG;IACH,OAAO,CAAC,GAAG;IA8BX;;;OAGG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIhC;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI/B;;;OAGG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIhC;;;OAGG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI9B;;;OAGG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI9B;;;OAGG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI5B;;;OAGG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI5B;;;OAGG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB;IA6B3C;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI;IAI3C;;OAEG;IACH,YAAY,IAAI,IAAI;IAIpB;;OAEG;IACH,KAAK,IAAI,IAAI;IAMb;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAY5B;;OAEG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAU/C;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,MAAU,GAAG,IAAI;CAUjD;AAED;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,MAAM,CAAS;gBAEX,OAAO,EAAE,GAAG,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM;IAK/C;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAM7B;;OAEG;IACH,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAS/B;;OAEG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAS5B;;OAEG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAS5B;;OAEG;IACH,IAAI,IAAI,IAAI;IAOZ;;OAEG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;CAM7B;AAED;;GAEG;AACH,eAAO,MAAM,MAAM,QAAe,CAAC;AAEnC;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI,CAErE;AAED,eAAe,MAAM,CAAC"}
@@ -0,0 +1,331 @@
1
+ /**
2
+ * Standardized logging interface for spec-gen
3
+ *
4
+ * Provides semantic log levels with specific visual treatments:
5
+ * - DISCOVERY: Finding files, detecting patterns, scanning directories
6
+ * - ANALYSIS: Parsing AST, building graphs, scoring significance
7
+ * - INFERENCE: LLM generating content, making decisions
8
+ * - SUCCESS: Tasks complete successfully
9
+ * - WARNING: Non-fatal issues, skipped files, fallback behavior
10
+ * - ERROR: Fatal errors, missing requirements
11
+ */
12
+ import chalk from 'chalk';
13
+ import ora from 'ora';
14
+ const defaultOptions = {
15
+ quiet: false,
16
+ verbose: false,
17
+ noColor: false,
18
+ timestamps: false,
19
+ };
20
+ /**
21
+ * Semantic prefixes for each log level
22
+ */
23
+ const PREFIXES = {
24
+ discovery: '🔍',
25
+ analysis: '🔬',
26
+ inference: '🧠',
27
+ success: '✓',
28
+ warning: '⚠',
29
+ error: '✗',
30
+ debug: '→',
31
+ };
32
+ /**
33
+ * Color functions for each log level
34
+ */
35
+ const COLORS = {
36
+ discovery: chalk.cyan,
37
+ analysis: chalk.yellow,
38
+ inference: chalk.magenta,
39
+ success: chalk.green,
40
+ warning: chalk.hex('#FFA500'), // Orange
41
+ error: chalk.red,
42
+ debug: chalk.gray,
43
+ };
44
+ /**
45
+ * Logger class providing semantic log levels and spinner support
46
+ */
47
+ export class Logger {
48
+ options;
49
+ activeSpinner = null;
50
+ constructor(options = {}) {
51
+ this.options = { ...defaultOptions, ...options };
52
+ }
53
+ /**
54
+ * Update logger options
55
+ */
56
+ configure(options) {
57
+ this.options = { ...this.options, ...options };
58
+ }
59
+ /**
60
+ * Get current options
61
+ */
62
+ getOptions() {
63
+ return { ...this.options };
64
+ }
65
+ /**
66
+ * Format a message with optional timestamp
67
+ */
68
+ formatMessage(level, message) {
69
+ const prefix = PREFIXES[level];
70
+ const colorFn = this.options.noColor ? (s) => s : COLORS[level];
71
+ let formattedMessage = `${prefix} ${message}`;
72
+ if (this.options.timestamps) {
73
+ const timestamp = new Date().toISOString();
74
+ formattedMessage = `[${timestamp}] ${formattedMessage}`;
75
+ }
76
+ return colorFn(formattedMessage);
77
+ }
78
+ /**
79
+ * Core log method
80
+ */
81
+ log(level, message) {
82
+ // In quiet mode, only show errors
83
+ if (this.options.quiet && level !== 'error') {
84
+ return;
85
+ }
86
+ // Debug messages only show in verbose mode
87
+ if (level === 'debug' && !this.options.verbose) {
88
+ return;
89
+ }
90
+ // Pause spinner if active to prevent overlap
91
+ if (this.activeSpinner) {
92
+ this.activeSpinner.stop();
93
+ }
94
+ const formattedMessage = this.formatMessage(level, message);
95
+ if (level === 'error') {
96
+ console.error(formattedMessage);
97
+ }
98
+ else {
99
+ console.log(formattedMessage);
100
+ }
101
+ // Resume spinner if it was active
102
+ if (this.activeSpinner) {
103
+ this.activeSpinner.start();
104
+ }
105
+ }
106
+ /**
107
+ * DISCOVERY - Finding files, detecting patterns, scanning directories
108
+ * @example logger.discovery("Discovered 847 files across 23 directories")
109
+ */
110
+ discovery(message) {
111
+ this.log('discovery', message);
112
+ }
113
+ /**
114
+ * ANALYSIS - Parsing AST, building graphs, scoring significance
115
+ * @example logger.analysis("Analyzing dependency graph...")
116
+ */
117
+ analysis(message) {
118
+ this.log('analysis', message);
119
+ }
120
+ /**
121
+ * INFERENCE - LLM is generating content, making decisions
122
+ * @example logger.inference("Inferring system intent from core modules...")
123
+ */
124
+ inference(message) {
125
+ this.log('inference', message);
126
+ }
127
+ /**
128
+ * SUCCESS - Tasks complete successfully
129
+ * @example logger.success("Generated openspec/specs/auth/spec.md")
130
+ */
131
+ success(message) {
132
+ this.log('success', message);
133
+ }
134
+ /**
135
+ * WARNING - Non-fatal issues, skipped files, fallback behavior
136
+ * @example logger.warning("Skipped 12 binary files")
137
+ */
138
+ warning(message) {
139
+ this.log('warning', message);
140
+ }
141
+ /**
142
+ * ERROR - Fatal errors, missing requirements
143
+ * @example logger.error("No .git directory found. Is this a repository?")
144
+ */
145
+ error(message) {
146
+ this.log('error', message);
147
+ }
148
+ /**
149
+ * DEBUG - Verbose debug information (only shown with --verbose)
150
+ * @example logger.debug("Processing file: src/utils/helper.ts")
151
+ */
152
+ debug(message) {
153
+ this.log('debug', message);
154
+ }
155
+ /**
156
+ * Start a spinner for long-running operations
157
+ * @returns Spinner control object with succeed/fail/stop methods
158
+ */
159
+ spinner(message) {
160
+ // Don't show spinners in quiet mode or CI (timestamps mode)
161
+ if (this.options.quiet || this.options.timestamps) {
162
+ // Return a no-op controller
163
+ return new SpinnerController(null, this);
164
+ }
165
+ // Stop any existing spinner
166
+ if (this.activeSpinner) {
167
+ this.activeSpinner.stop();
168
+ }
169
+ const spinner = ora({
170
+ text: message,
171
+ color: 'cyan',
172
+ spinner: 'dots',
173
+ });
174
+ if (!this.options.noColor) {
175
+ spinner.start();
176
+ }
177
+ else {
178
+ // In no-color mode, just print the message
179
+ console.log(`... ${message}`);
180
+ }
181
+ this.activeSpinner = spinner;
182
+ return new SpinnerController(spinner, this);
183
+ }
184
+ /**
185
+ * Register an external spinner so log calls pause/resume it correctly
186
+ */
187
+ setActiveSpinner(spinner) {
188
+ this.activeSpinner = spinner;
189
+ }
190
+ /**
191
+ * Clear the active spinner reference
192
+ */
193
+ clearSpinner() {
194
+ this.activeSpinner = null;
195
+ }
196
+ /**
197
+ * Print a blank line (respects quiet mode)
198
+ */
199
+ blank() {
200
+ if (!this.options.quiet) {
201
+ console.log();
202
+ }
203
+ }
204
+ /**
205
+ * Print a section header
206
+ */
207
+ section(title) {
208
+ if (this.options.quiet)
209
+ return;
210
+ this.blank();
211
+ if (this.options.noColor) {
212
+ console.log(`=== ${title} ===`);
213
+ }
214
+ else {
215
+ console.log(chalk.bold.underline(title));
216
+ }
217
+ this.blank();
218
+ }
219
+ /**
220
+ * Print a key-value pair for summaries
221
+ */
222
+ info(key, value) {
223
+ if (this.options.quiet)
224
+ return;
225
+ if (this.options.noColor) {
226
+ console.log(` ${key}: ${value}`);
227
+ }
228
+ else {
229
+ console.log(` ${chalk.dim(key + ':')} ${value}`);
230
+ }
231
+ }
232
+ /**
233
+ * Print a list item
234
+ */
235
+ listItem(item, indent = 0) {
236
+ if (this.options.quiet)
237
+ return;
238
+ const prefix = ' '.repeat(indent) + '•';
239
+ if (this.options.noColor) {
240
+ console.log(`${prefix} ${item}`);
241
+ }
242
+ else {
243
+ console.log(`${chalk.dim(prefix)} ${item}`);
244
+ }
245
+ }
246
+ }
247
+ /**
248
+ * Controller for spinner operations
249
+ */
250
+ export class SpinnerController {
251
+ spinner;
252
+ logger;
253
+ constructor(spinner, logger) {
254
+ this.spinner = spinner;
255
+ this.logger = logger;
256
+ }
257
+ /**
258
+ * Update spinner text
259
+ */
260
+ update(message) {
261
+ if (this.spinner) {
262
+ this.spinner.text = message;
263
+ }
264
+ }
265
+ /**
266
+ * Mark spinner as succeeded
267
+ */
268
+ succeed(message) {
269
+ if (this.spinner) {
270
+ this.spinner.succeed(message);
271
+ }
272
+ else if (message) {
273
+ this.logger.success(message);
274
+ }
275
+ this.logger.clearSpinner();
276
+ }
277
+ /**
278
+ * Mark spinner as failed
279
+ */
280
+ fail(message) {
281
+ if (this.spinner) {
282
+ this.spinner.fail(message);
283
+ }
284
+ else if (message) {
285
+ this.logger.error(message);
286
+ }
287
+ this.logger.clearSpinner();
288
+ }
289
+ /**
290
+ * Mark spinner as warning
291
+ */
292
+ warn(message) {
293
+ if (this.spinner) {
294
+ this.spinner.warn(message);
295
+ }
296
+ else if (message) {
297
+ this.logger.warning(message);
298
+ }
299
+ this.logger.clearSpinner();
300
+ }
301
+ /**
302
+ * Stop spinner without status
303
+ */
304
+ stop() {
305
+ if (this.spinner) {
306
+ this.spinner.stop();
307
+ }
308
+ this.logger.clearSpinner();
309
+ }
310
+ /**
311
+ * Stop spinner and show info
312
+ */
313
+ info(message) {
314
+ if (this.spinner) {
315
+ this.spinner.info(message);
316
+ }
317
+ this.logger.clearSpinner();
318
+ }
319
+ }
320
+ /**
321
+ * Singleton logger instance for use across the application
322
+ */
323
+ export const logger = new Logger();
324
+ /**
325
+ * Configure the global logger instance
326
+ */
327
+ export function configureLogger(options) {
328
+ logger.configure(options);
329
+ }
330
+ export default logger;
331
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}