spec-gen-cli 1.0.0 → 1.2.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 (212) hide show
  1. package/README.md +163 -77
  2. package/dist/api/analyze.d.ts.map +1 -1
  3. package/dist/api/analyze.js +56 -27
  4. package/dist/api/analyze.js.map +1 -1
  5. package/dist/api/drift.d.ts.map +1 -1
  6. package/dist/api/drift.js +26 -20
  7. package/dist/api/drift.js.map +1 -1
  8. package/dist/api/generate.d.ts.map +1 -1
  9. package/dist/api/generate.js +19 -43
  10. package/dist/api/generate.js.map +1 -1
  11. package/dist/api/init.d.ts.map +1 -1
  12. package/dist/api/init.js +6 -5
  13. package/dist/api/init.js.map +1 -1
  14. package/dist/api/run.d.ts.map +1 -1
  15. package/dist/api/run.js +67 -51
  16. package/dist/api/run.js.map +1 -1
  17. package/dist/api/specs.d.ts.map +1 -1
  18. package/dist/api/specs.js +5 -4
  19. package/dist/api/specs.js.map +1 -1
  20. package/dist/api/types.d.ts +7 -1
  21. package/dist/api/types.d.ts.map +1 -1
  22. package/dist/api/verify.d.ts.map +1 -1
  23. package/dist/api/verify.js +31 -32
  24. package/dist/api/verify.js.map +1 -1
  25. package/dist/cli/commands/analyze.d.ts.map +1 -1
  26. package/dist/cli/commands/analyze.js +97 -60
  27. package/dist/cli/commands/analyze.js.map +1 -1
  28. package/dist/cli/commands/doctor.d.ts +9 -0
  29. package/dist/cli/commands/doctor.d.ts.map +1 -0
  30. package/dist/cli/commands/doctor.js +273 -0
  31. package/dist/cli/commands/doctor.js.map +1 -0
  32. package/dist/cli/commands/drift.d.ts.map +1 -1
  33. package/dist/cli/commands/drift.js +18 -32
  34. package/dist/cli/commands/drift.js.map +1 -1
  35. package/dist/cli/commands/generate.d.ts.map +1 -1
  36. package/dist/cli/commands/generate.js +40 -101
  37. package/dist/cli/commands/generate.js.map +1 -1
  38. package/dist/cli/commands/init.d.ts.map +1 -1
  39. package/dist/cli/commands/init.js +17 -15
  40. package/dist/cli/commands/init.js.map +1 -1
  41. package/dist/cli/commands/mcp.d.ts +65 -2
  42. package/dist/cli/commands/mcp.d.ts.map +1 -1
  43. package/dist/cli/commands/mcp.js +60 -3
  44. package/dist/cli/commands/mcp.js.map +1 -1
  45. package/dist/cli/commands/run.d.ts +0 -15
  46. package/dist/cli/commands/run.d.ts.map +1 -1
  47. package/dist/cli/commands/run.js +61 -111
  48. package/dist/cli/commands/run.js.map +1 -1
  49. package/dist/cli/commands/verify.d.ts.map +1 -1
  50. package/dist/cli/commands/verify.js +18 -52
  51. package/dist/cli/commands/verify.js.map +1 -1
  52. package/dist/cli/commands/view.d.ts +4 -0
  53. package/dist/cli/commands/view.d.ts.map +1 -1
  54. package/dist/cli/commands/view.js +29 -24
  55. package/dist/cli/commands/view.js.map +1 -1
  56. package/dist/cli/index.js +22 -4
  57. package/dist/cli/index.js.map +1 -1
  58. package/dist/constants.d.ts +254 -0
  59. package/dist/constants.d.ts.map +1 -0
  60. package/dist/constants.js +320 -0
  61. package/dist/constants.js.map +1 -0
  62. package/dist/core/analyzer/artifact-generator.d.ts +8 -0
  63. package/dist/core/analyzer/artifact-generator.d.ts.map +1 -1
  64. package/dist/core/analyzer/artifact-generator.js +59 -11
  65. package/dist/core/analyzer/artifact-generator.js.map +1 -1
  66. package/dist/core/analyzer/call-graph.d.ts.map +1 -1
  67. package/dist/core/analyzer/call-graph.js +135 -1
  68. package/dist/core/analyzer/call-graph.js.map +1 -1
  69. package/dist/core/analyzer/dependency-graph.d.ts +32 -0
  70. package/dist/core/analyzer/dependency-graph.d.ts.map +1 -1
  71. package/dist/core/analyzer/dependency-graph.js +104 -10
  72. package/dist/core/analyzer/dependency-graph.js.map +1 -1
  73. package/dist/core/analyzer/duplicate-detector.d.ts.map +1 -1
  74. package/dist/core/analyzer/duplicate-detector.js +4 -0
  75. package/dist/core/analyzer/duplicate-detector.js.map +1 -1
  76. package/dist/core/analyzer/embedding-service.d.ts +6 -0
  77. package/dist/core/analyzer/embedding-service.d.ts.map +1 -1
  78. package/dist/core/analyzer/embedding-service.js +15 -1
  79. package/dist/core/analyzer/embedding-service.js.map +1 -1
  80. package/dist/core/analyzer/file-walker.d.ts.map +1 -1
  81. package/dist/core/analyzer/file-walker.js +4 -3
  82. package/dist/core/analyzer/file-walker.js.map +1 -1
  83. package/dist/core/analyzer/http-route-parser.d.ts +111 -0
  84. package/dist/core/analyzer/http-route-parser.d.ts.map +1 -0
  85. package/dist/core/analyzer/http-route-parser.js +466 -0
  86. package/dist/core/analyzer/http-route-parser.js.map +1 -0
  87. package/dist/core/analyzer/import-parser.d.ts.map +1 -1
  88. package/dist/core/analyzer/import-parser.js +19 -5
  89. package/dist/core/analyzer/import-parser.js.map +1 -1
  90. package/dist/core/analyzer/refactor-analyzer.d.ts.map +1 -1
  91. package/dist/core/analyzer/refactor-analyzer.js +8 -7
  92. package/dist/core/analyzer/refactor-analyzer.js.map +1 -1
  93. package/dist/core/analyzer/repository-mapper.d.ts.map +1 -1
  94. package/dist/core/analyzer/repository-mapper.js +12 -13
  95. package/dist/core/analyzer/repository-mapper.js.map +1 -1
  96. package/dist/core/analyzer/signature-extractor.d.ts +1 -1
  97. package/dist/core/analyzer/signature-extractor.d.ts.map +1 -1
  98. package/dist/core/analyzer/signature-extractor.js +69 -1
  99. package/dist/core/analyzer/signature-extractor.js.map +1 -1
  100. package/dist/core/analyzer/spec-vector-index.d.ts +68 -0
  101. package/dist/core/analyzer/spec-vector-index.d.ts.map +1 -0
  102. package/dist/core/analyzer/spec-vector-index.js +296 -0
  103. package/dist/core/analyzer/spec-vector-index.js.map +1 -0
  104. package/dist/core/analyzer/vector-index.d.ts.map +1 -1
  105. package/dist/core/analyzer/vector-index.js +29 -1
  106. package/dist/core/analyzer/vector-index.js.map +1 -1
  107. package/dist/core/drift/drift-detector.d.ts.map +1 -1
  108. package/dist/core/drift/drift-detector.js +7 -6
  109. package/dist/core/drift/drift-detector.js.map +1 -1
  110. package/dist/core/drift/git-diff.d.ts.map +1 -1
  111. package/dist/core/drift/git-diff.js +28 -16
  112. package/dist/core/drift/git-diff.js.map +1 -1
  113. package/dist/core/generator/mapping-generator.d.ts.map +1 -1
  114. package/dist/core/generator/mapping-generator.js +11 -10
  115. package/dist/core/generator/mapping-generator.js.map +1 -1
  116. package/dist/core/generator/openspec-compat.d.ts.map +1 -1
  117. package/dist/core/generator/openspec-compat.js +3 -2
  118. package/dist/core/generator/openspec-compat.js.map +1 -1
  119. package/dist/core/generator/openspec-format-generator.js.map +1 -1
  120. package/dist/core/generator/openspec-writer.d.ts +0 -4
  121. package/dist/core/generator/openspec-writer.d.ts.map +1 -1
  122. package/dist/core/generator/openspec-writer.js +30 -41
  123. package/dist/core/generator/openspec-writer.js.map +1 -1
  124. package/dist/core/generator/spec-pipeline.d.ts.map +1 -1
  125. package/dist/core/generator/spec-pipeline.js +4 -4
  126. package/dist/core/generator/spec-pipeline.js.map +1 -1
  127. package/dist/core/generator/stages/stage1-survey.d.ts.map +1 -1
  128. package/dist/core/generator/stages/stage1-survey.js +5 -3
  129. package/dist/core/generator/stages/stage1-survey.js.map +1 -1
  130. package/dist/core/generator/stages/stage2-entities.d.ts.map +1 -1
  131. package/dist/core/generator/stages/stage2-entities.js +10 -9
  132. package/dist/core/generator/stages/stage2-entities.js.map +1 -1
  133. package/dist/core/generator/stages/stage3-services.d.ts.map +1 -1
  134. package/dist/core/generator/stages/stage3-services.js +9 -8
  135. package/dist/core/generator/stages/stage3-services.js.map +1 -1
  136. package/dist/core/generator/stages/stage4-api.d.ts.map +1 -1
  137. package/dist/core/generator/stages/stage4-api.js +10 -9
  138. package/dist/core/generator/stages/stage4-api.js.map +1 -1
  139. package/dist/core/generator/stages/stage5-architecture.d.ts.map +1 -1
  140. package/dist/core/generator/stages/stage5-architecture.js +5 -4
  141. package/dist/core/generator/stages/stage5-architecture.js.map +1 -1
  142. package/dist/core/generator/stages/stage6-adr.d.ts.map +1 -1
  143. package/dist/core/generator/stages/stage6-adr.js +7 -2
  144. package/dist/core/generator/stages/stage6-adr.js.map +1 -1
  145. package/dist/core/services/chat-agent.d.ts +7 -7
  146. package/dist/core/services/chat-agent.d.ts.map +1 -1
  147. package/dist/core/services/chat-agent.js +74 -29
  148. package/dist/core/services/chat-agent.js.map +1 -1
  149. package/dist/core/services/chat-tools.d.ts +2 -2
  150. package/dist/core/services/chat-tools.d.ts.map +1 -1
  151. package/dist/core/services/chat-tools.js +57 -3
  152. package/dist/core/services/chat-tools.js.map +1 -1
  153. package/dist/core/services/config-manager.d.ts.map +1 -1
  154. package/dist/core/services/config-manager.js +32 -26
  155. package/dist/core/services/config-manager.js.map +1 -1
  156. package/dist/core/services/gitignore-manager.d.ts.map +1 -1
  157. package/dist/core/services/gitignore-manager.js +2 -13
  158. package/dist/core/services/gitignore-manager.js.map +1 -1
  159. package/dist/core/services/llm-service.d.ts.map +1 -1
  160. package/dist/core/services/llm-service.js +33 -35
  161. package/dist/core/services/llm-service.js.map +1 -1
  162. package/dist/core/services/mcp-handlers/analysis.d.ts.map +1 -1
  163. package/dist/core/services/mcp-handlers/analysis.js +23 -14
  164. package/dist/core/services/mcp-handlers/analysis.js.map +1 -1
  165. package/dist/core/services/mcp-handlers/graph.d.ts.map +1 -1
  166. package/dist/core/services/mcp-handlers/graph.js +24 -23
  167. package/dist/core/services/mcp-handlers/graph.js.map +1 -1
  168. package/dist/core/services/mcp-handlers/semantic.d.ts +12 -2
  169. package/dist/core/services/mcp-handlers/semantic.d.ts.map +1 -1
  170. package/dist/core/services/mcp-handlers/semantic.js +83 -12
  171. package/dist/core/services/mcp-handlers/semantic.js.map +1 -1
  172. package/dist/core/services/mcp-handlers/utils.d.ts.map +1 -1
  173. package/dist/core/services/mcp-handlers/utils.js +4 -3
  174. package/dist/core/services/mcp-handlers/utils.js.map +1 -1
  175. package/dist/core/services/project-detector.d.ts.map +1 -1
  176. package/dist/core/services/project-detector.js +2 -13
  177. package/dist/core/services/project-detector.js.map +1 -1
  178. package/dist/core/verifier/verification-engine.d.ts +9 -3
  179. package/dist/core/verifier/verification-engine.d.ts.map +1 -1
  180. package/dist/core/verifier/verification-engine.js +25 -13
  181. package/dist/core/verifier/verification-engine.js.map +1 -1
  182. package/dist/types/index.d.ts +2 -0
  183. package/dist/types/index.d.ts.map +1 -1
  184. package/dist/utils/command-helpers.d.ts +38 -0
  185. package/dist/utils/command-helpers.d.ts.map +1 -0
  186. package/dist/utils/command-helpers.js +82 -0
  187. package/dist/utils/command-helpers.js.map +1 -0
  188. package/dist/utils/errors.d.ts.map +1 -1
  189. package/dist/utils/errors.js +4 -3
  190. package/dist/utils/errors.js.map +1 -1
  191. package/dist/utils/logger.d.ts.map +1 -1
  192. package/dist/utils/logger.js +14 -3
  193. package/dist/utils/logger.js.map +1 -1
  194. package/dist/utils/progress.d.ts +1 -1
  195. package/dist/utils/progress.d.ts.map +1 -1
  196. package/dist/utils/progress.js +15 -12
  197. package/dist/utils/progress.js.map +1 -1
  198. package/dist/utils/shutdown.d.ts.map +1 -1
  199. package/dist/utils/shutdown.js +4 -3
  200. package/dist/utils/shutdown.js.map +1 -1
  201. package/package.json +9 -5
  202. package/src/viewer/InteractiveGraphViewer.jsx +182 -139
  203. package/src/viewer/components/ArchitectureView.jsx +19 -19
  204. package/src/viewer/components/ChatPanel.jsx +40 -40
  205. package/src/viewer/components/ClusterGraph.jsx +34 -22
  206. package/src/viewer/components/FilterBar.jsx +26 -26
  207. package/src/viewer/components/FlatGraph.jsx +22 -15
  208. package/src/viewer/components/MicroComponents.jsx +14 -12
  209. package/src/viewer/utils/constants.js +17 -0
  210. package/src/viewer/utils/graph-helpers.js +7 -3
  211. package/src/viewer/utils/graph-helpers.test.ts +39 -0
  212. package/src/viewer/utils/themes.js +170 -0
package/dist/api/drift.js CHANGED
@@ -5,22 +5,14 @@
5
5
  * No side effects (no process.exit, no console.log).
6
6
  */
7
7
  import { join } from 'node:path';
8
- import { access } from 'node:fs/promises';
8
+ import { DEFAULT_DRIFT_MAX_FILES, DEFAULT_ANTHROPIC_MODEL, DEFAULT_OPENAI_MODEL, DEFAULT_GEMINI_MODEL, DEFAULT_OPENAI_COMPAT_MODEL, SPEC_GEN_DIR, SPEC_GEN_ANALYSIS_SUBDIR, SPEC_GEN_LOGS_SUBDIR, OPENSPEC_DIR, OPENSPEC_SPECS_SUBDIR, ARTIFACT_REPO_STRUCTURE } from '../constants.js';
9
+ import { fileExists } from '../utils/command-helpers.js';
9
10
  import { readSpecGenConfig } from '../core/services/config-manager.js';
10
11
  import { getChangedFiles, isGitRepository, buildSpecMap, buildADRMap, detectDrift, } from '../core/drift/index.js';
11
12
  import { createLLMService } from '../core/services/llm-service.js';
12
13
  function progress(onProgress, step, status, detail) {
13
14
  onProgress?.({ phase: 'drift', step, status, detail });
14
15
  }
15
- async function fileExists(path) {
16
- try {
17
- await access(path);
18
- return true;
19
- }
20
- catch {
21
- return false;
22
- }
23
- }
24
16
  /**
25
17
  * Detect spec drift in a project.
26
18
  *
@@ -40,7 +32,7 @@ export async function specGenDrift(options = {}) {
40
32
  const domains = options.domains ?? [];
41
33
  const llmEnhanced = options.llmEnhanced ?? false;
42
34
  const failOn = options.failOn ?? 'warning';
43
- const maxFiles = options.maxFiles ?? 100;
35
+ const maxFiles = options.maxFiles ?? DEFAULT_DRIFT_MAX_FILES;
44
36
  const { onProgress } = options;
45
37
  // Validate git repo
46
38
  if (!(await isGitRepository(rootPath))) {
@@ -52,26 +44,40 @@ export async function specGenDrift(options = {}) {
52
44
  throw new Error('No spec-gen configuration found. Run specGenInit() first.');
53
45
  }
54
46
  // Check specs exist
55
- const openspecPath = join(rootPath, specGenConfig.openspecPath ?? 'openspec');
56
- const specsPath = join(openspecPath, 'specs');
47
+ const openspecPath = join(rootPath, specGenConfig.openspecPath ?? OPENSPEC_DIR);
48
+ const specsPath = join(openspecPath, OPENSPEC_SPECS_SUBDIR);
57
49
  if (!(await fileExists(specsPath))) {
58
50
  throw new Error('No specs found. Run specGenGenerate() first.');
59
51
  }
60
- // Create LLM service if needed
52
+ // Create LLM service if needed — support all four providers
61
53
  let llm;
62
54
  if (llmEnhanced) {
63
55
  const anthropicKey = process.env.ANTHROPIC_API_KEY;
64
56
  const openaiKey = process.env.OPENAI_API_KEY;
65
- if (!anthropicKey && !openaiKey) {
66
- throw new Error('No LLM API key found. LLM-enhanced drift requires ANTHROPIC_API_KEY or OPENAI_API_KEY.');
57
+ const openaiCompatKey = process.env.OPENAI_COMPAT_API_KEY;
58
+ const geminiKey = process.env.GEMINI_API_KEY;
59
+ if (!anthropicKey && !openaiKey && !openaiCompatKey && !geminiKey) {
60
+ throw new Error('No LLM API key found. LLM-enhanced drift requires ANTHROPIC_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY, or OPENAI_COMPAT_API_KEY.');
67
61
  }
68
- const provider = options.provider ?? (anthropicKey ? 'anthropic' : 'openai');
62
+ const envDetectedProvider = anthropicKey ? 'anthropic'
63
+ : geminiKey ? 'gemini'
64
+ : openaiCompatKey ? 'openai-compat'
65
+ : 'openai';
66
+ const provider = options.provider ?? envDetectedProvider;
67
+ const defaultModels = {
68
+ anthropic: DEFAULT_ANTHROPIC_MODEL,
69
+ gemini: DEFAULT_GEMINI_MODEL,
70
+ 'openai-compat': DEFAULT_OPENAI_COMPAT_MODEL,
71
+ openai: DEFAULT_OPENAI_MODEL,
72
+ };
69
73
  llm = createLLMService({
70
74
  provider,
75
+ model: options.model ?? defaultModels[provider] ?? DEFAULT_ANTHROPIC_MODEL,
71
76
  apiBase: options.apiBase ?? specGenConfig.llm?.apiBase,
77
+ openaiCompatBaseUrl: options.openaiCompatBaseUrl,
72
78
  sslVerify: options.sslVerify ?? specGenConfig.llm?.sslVerify ?? true,
73
79
  enableLogging: true,
74
- logDir: join(rootPath, '.spec-gen', 'logs'),
80
+ logDir: join(rootPath, SPEC_GEN_DIR, SPEC_GEN_LOGS_SUBDIR),
75
81
  });
76
82
  }
77
83
  // Get changed files
@@ -103,7 +109,7 @@ export async function specGenDrift(options = {}) {
103
109
  }
104
110
  // Build spec map
105
111
  progress(onProgress, 'Loading spec mappings', 'start');
106
- const repoStructurePath = join(rootPath, '.spec-gen', 'analysis', 'repo-structure.json');
112
+ const repoStructurePath = join(rootPath, SPEC_GEN_DIR, SPEC_GEN_ANALYSIS_SUBDIR, ARTIFACT_REPO_STRUCTURE);
107
113
  const hasRepoStructure = await fileExists(repoStructurePath);
108
114
  const specMap = await buildSpecMap({
109
115
  rootPath,
@@ -125,7 +131,7 @@ export async function specGenDrift(options = {}) {
125
131
  changedFiles: gitResult.files,
126
132
  failOn,
127
133
  domainFilter: domains.length > 0 ? domains : undefined,
128
- openspecRelPath: specGenConfig.openspecPath ?? 'openspec',
134
+ openspecRelPath: specGenConfig.openspecPath ?? OPENSPEC_DIR,
129
135
  llm,
130
136
  baseRef: gitResult.resolvedBase,
131
137
  adrMap: adrMap ?? undefined,
@@ -1 +1 @@
1
- {"version":3,"file":"drift.js","sourceRoot":"","sources":["../../src/api/drift.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"drift.js","sourceRoot":"","sources":["../../src/api/drift.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/api/generate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAiBH,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAoB,MAAM,YAAY,CAAC;AAqDvF;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,cAAc,CAAC,CA8M/F"}
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/api/generate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAiBH,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAoB,MAAM,YAAY,CAAC;AAoDvF;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,cAAc,CAAC,CA8M/F"}
@@ -5,7 +5,7 @@
5
5
  * No side effects (no process.exit, no console.log).
6
6
  */
7
7
  import { join } from 'node:path';
8
- import { access, readFile } from 'node:fs/promises';
8
+ import { readJsonFile } from '../utils/command-helpers.js';
9
9
  import { readSpecGenConfig, readOpenSpecConfig, } from '../core/services/config-manager.js';
10
10
  import { createLLMService } from '../core/services/llm-service.js';
11
11
  import { SpecGenerationPipeline } from '../core/generator/spec-pipeline.js';
@@ -13,44 +13,20 @@ import { OpenSpecFormatGenerator } from '../core/generator/openspec-format-gener
13
13
  import { OpenSpecWriter } from '../core/generator/openspec-writer.js';
14
14
  import { ADRGenerator } from '../core/generator/adr-generator.js';
15
15
  import { MappingGenerator } from '../core/generator/mapping-generator.js';
16
+ import { DEFAULT_ANTHROPIC_MODEL, DEFAULT_OPENAI_MODEL, DEFAULT_OPENAI_COMPAT_MODEL, DEFAULT_GEMINI_MODEL, SPEC_GEN_DIR, SPEC_GEN_ANALYSIS_SUBDIR, SPEC_GEN_LOGS_SUBDIR, SPEC_GEN_ANALYSIS_REL_PATH, SPEC_GEN_GENERATION_SUBDIR, OPENSPEC_DIR, ARTIFACT_REPO_STRUCTURE, ARTIFACT_LLM_CONTEXT, ARTIFACT_DEPENDENCY_GRAPH, } from '../constants.js';
16
17
  function progress(onProgress, step, status, detail) {
17
18
  onProgress?.({ phase: 'generate', step, status, detail });
18
19
  }
19
- async function fileExists(path) {
20
- try {
21
- await access(path);
22
- return true;
23
- }
24
- catch {
25
- return false;
26
- }
27
- }
28
20
  async function loadAnalysisData(analysisPath) {
29
- const repoStructurePath = join(analysisPath, 'repo-structure.json');
30
- if (!(await fileExists(repoStructurePath))) {
21
+ const repoStructure = await readJsonFile(join(analysisPath, ARTIFACT_REPO_STRUCTURE), ARTIFACT_REPO_STRUCTURE);
22
+ if (!repoStructure)
31
23
  return null;
32
- }
33
- const repoStructureContent = await readFile(repoStructurePath, 'utf-8');
34
- const repoStructure = JSON.parse(repoStructureContent);
35
- let llmContext;
36
- const llmContextPath = join(analysisPath, 'llm-context.json');
37
- if (await fileExists(llmContextPath)) {
38
- const content = await readFile(llmContextPath, 'utf-8');
39
- llmContext = JSON.parse(content);
40
- }
41
- else {
42
- llmContext = {
43
- phase1_survey: { purpose: 'Initial survey', files: [], estimatedTokens: 0 },
44
- phase2_deep: { purpose: 'Deep analysis', files: [], totalTokens: 0 },
45
- phase3_validation: { purpose: 'Validation', files: [], totalTokens: 0 },
46
- };
47
- }
48
- let depGraph;
49
- const depGraphPath = join(analysisPath, 'dependency-graph.json');
50
- if (await fileExists(depGraphPath)) {
51
- const content = await readFile(depGraphPath, 'utf-8');
52
- depGraph = JSON.parse(content);
53
- }
24
+ const llmContext = await readJsonFile(join(analysisPath, ARTIFACT_LLM_CONTEXT), ARTIFACT_LLM_CONTEXT) ?? {
25
+ phase1_survey: { purpose: 'Initial survey', files: [], estimatedTokens: 0 },
26
+ phase2_deep: { purpose: 'Deep analysis', files: [], totalTokens: 0 },
27
+ phase3_validation: { purpose: 'Validation', files: [], totalTokens: 0 },
28
+ };
29
+ const depGraph = await readJsonFile(join(analysisPath, ARTIFACT_DEPENDENCY_GRAPH), ARTIFACT_DEPENDENCY_GRAPH) ?? undefined;
54
30
  return { repoStructure, llmContext, depGraph };
55
31
  }
56
32
  /**
@@ -65,7 +41,7 @@ async function loadAnalysisData(analysisPath) {
65
41
  export async function specGenGenerate(options = {}) {
66
42
  const startTime = Date.now();
67
43
  const rootPath = options.rootPath ?? process.cwd();
68
- const analysisRelPath = options.analysisPath ?? '.spec-gen/analysis/';
44
+ const analysisRelPath = options.analysisPath ?? `${SPEC_GEN_ANALYSIS_REL_PATH}/`;
69
45
  const analysisPath = join(rootPath, analysisRelPath);
70
46
  const { onProgress } = options;
71
47
  // Load config
@@ -74,7 +50,7 @@ export async function specGenGenerate(options = {}) {
74
50
  if (!specGenConfig) {
75
51
  throw new Error('No spec-gen configuration found. Run specGenInit() first.');
76
52
  }
77
- const openspecRelPath = specGenConfig.openspecPath ?? 'openspec';
53
+ const openspecRelPath = specGenConfig.openspecPath ?? OPENSPEC_DIR;
78
54
  const fullOpenspecPath = join(rootPath, openspecRelPath);
79
55
  await readOpenSpecConfig(fullOpenspecPath); // Ensure it's readable
80
56
  progress(onProgress, 'Loading configuration', 'complete');
@@ -100,10 +76,10 @@ export async function specGenGenerate(options = {}) {
100
76
  : 'openai';
101
77
  const effectiveProvider = options.provider ?? specGenConfig.generation.provider ?? envDetectedProvider;
102
78
  const defaultModels = {
103
- anthropic: 'claude-sonnet-4-20250514',
104
- gemini: 'gemini-2.0-flash',
105
- 'openai-compat': 'mistral-large-latest',
106
- openai: 'gpt-4o',
79
+ anthropic: DEFAULT_ANTHROPIC_MODEL,
80
+ gemini: DEFAULT_GEMINI_MODEL,
81
+ 'openai-compat': DEFAULT_OPENAI_COMPAT_MODEL,
82
+ openai: DEFAULT_OPENAI_MODEL,
107
83
  };
108
84
  const effectiveModel = options.model || specGenConfig.generation.model || defaultModels[effectiveProvider];
109
85
  const rootConfig = specGenConfig;
@@ -127,7 +103,7 @@ export async function specGenGenerate(options = {}) {
127
103
  apiBase: options.apiBase ?? specGenConfig.llm?.apiBase,
128
104
  sslVerify,
129
105
  enableLogging: true,
130
- logDir: join(rootPath, '.spec-gen', 'logs'),
106
+ logDir: join(rootPath, SPEC_GEN_DIR, SPEC_GEN_LOGS_SUBDIR),
131
107
  });
132
108
  }
133
109
  catch (error) {
@@ -160,7 +136,7 @@ export async function specGenGenerate(options = {}) {
160
136
  const adr = options.adr ?? false;
161
137
  const adrOnly = options.adrOnly ?? false;
162
138
  const pipeline = new SpecGenerationPipeline(llm, {
163
- outputDir: join(rootPath, '.spec-gen', 'generation'),
139
+ outputDir: join(rootPath, SPEC_GEN_DIR, SPEC_GEN_GENERATION_SUBDIR),
164
140
  saveIntermediate: true,
165
141
  generateADRs: adr || adrOnly,
166
142
  });
@@ -213,7 +189,7 @@ export async function specGenGenerate(options = {}) {
213
189
  if ((options.mapping ?? true) && depGraph) {
214
190
  try {
215
191
  let semanticSearch;
216
- const analysisDir = join(rootPath, '.spec-gen', 'analysis');
192
+ const analysisDir = join(rootPath, SPEC_GEN_DIR, SPEC_GEN_ANALYSIS_SUBDIR);
217
193
  const { VectorIndex } = await import('../core/analyzer/vector-index.js');
218
194
  if (VectorIndex.exists(analysisDir)) {
219
195
  const { EmbeddingService } = await import('../core/analyzer/embedding-service.js');
@@ -1 +1 @@
1
- {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/api/generate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/api/generate.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/api/init.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAmBH,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAoB,MAAM,YAAY,CAAC;AAM/E;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CAgEnF"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/api/init.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAoBH,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAoB,MAAM,YAAY,CAAC;AAM/E;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CAgEnF"}
package/dist/api/init.js CHANGED
@@ -5,6 +5,7 @@
5
5
  * No side effects (no process.exit, no console.log).
6
6
  */
7
7
  import { resolve, relative } from 'node:path';
8
+ import { SPEC_GEN_DIR, SPEC_GEN_CONFIG_REL_PATH, DEFAULT_OPENSPEC_PATH } from '../constants.js';
8
9
  import { detectProjectType, getProjectTypeName, } from '../core/services/project-detector.js';
9
10
  import { getDefaultConfig, writeSpecGenConfig, specGenConfigExists, openspecDirExists, createOpenSpecStructure, } from '../core/services/config-manager.js';
10
11
  import { gitignoreExists, isInGitignore, addToGitignore, } from '../core/services/gitignore-manager.js';
@@ -22,7 +23,7 @@ function progress(onProgress, step, status, detail) {
22
23
  */
23
24
  export async function specGenInit(options = {}) {
24
25
  const rootPath = options.rootPath ?? process.cwd();
25
- const openspecRelPath = options.openspecPath ?? './openspec';
26
+ const openspecRelPath = options.openspecPath ?? DEFAULT_OPENSPEC_PATH;
26
27
  const openspecFullPath = resolve(rootPath, openspecRelPath);
27
28
  const force = options.force ?? false;
28
29
  const { onProgress } = options;
@@ -41,7 +42,7 @@ export async function specGenInit(options = {}) {
41
42
  if (configExists && !force) {
42
43
  progress(onProgress, 'Configuration exists', 'skip');
43
44
  return {
44
- configPath: '.spec-gen/config.json',
45
+ configPath: SPEC_GEN_CONFIG_REL_PATH,
45
46
  openspecPath: openspecRelPath,
46
47
  projectType,
47
48
  created: false,
@@ -65,15 +66,15 @@ export async function specGenInit(options = {}) {
65
66
  // Update .gitignore
66
67
  const hasGitignore = await gitignoreExists(rootPath);
67
68
  if (hasGitignore) {
68
- const alreadyIgnored = await isInGitignore(rootPath, '.spec-gen/');
69
+ const alreadyIgnored = await isInGitignore(rootPath, `${SPEC_GEN_DIR}/`);
69
70
  if (!alreadyIgnored) {
70
71
  progress(onProgress, 'Updating .gitignore', 'start');
71
- await addToGitignore(rootPath, '.spec-gen/', 'spec-gen analysis artifacts');
72
+ await addToGitignore(rootPath, `${SPEC_GEN_DIR}/`, 'spec-gen analysis artifacts');
72
73
  progress(onProgress, 'Updating .gitignore', 'complete');
73
74
  }
74
75
  }
75
76
  return {
76
- configPath: '.spec-gen/config.json',
77
+ configPath: SPEC_GEN_CONFIG_REL_PATH,
77
78
  openspecPath: openspecRelPath,
78
79
  projectType,
79
80
  created: true,
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/api/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/api/init.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/api/run.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA+BH,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAA+C,MAAM,YAAY,CAAC;AAexG;;;;;;;;GAQG;AACH,wBAAsB,UAAU,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,SAAS,CAAC,CA8RhF"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/api/run.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAiCH,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAA+C,MAAM,YAAY,CAAC;AA0BxG;;;;;;;;GAQG;AACH,wBAAsB,UAAU,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,SAAS,CAAC,CA2ShF"}
package/dist/api/run.js CHANGED
@@ -6,14 +6,16 @@
6
6
  * No side effects (no process.exit, no console.log).
7
7
  */
8
8
  import { join } from 'node:path';
9
- import { access, stat, readFile, mkdir, writeFile } from 'node:fs/promises';
9
+ import { readFile, stat, mkdir, writeFile } from 'node:fs/promises';
10
+ import { ANALYSIS_REUSE_THRESHOLD_MS, DEFAULT_MAX_FILES, DEFAULT_ANTHROPIC_MODEL, DEFAULT_OPENAI_MODEL, DEFAULT_GEMINI_MODEL, DEFAULT_OPENAI_COMPAT_MODEL, SPEC_GEN_DIR, SPEC_GEN_ANALYSIS_SUBDIR, SPEC_GEN_LOGS_SUBDIR, SPEC_GEN_CONFIG_REL_PATH, SPEC_GEN_GENERATION_SUBDIR, SPEC_GEN_RUNS_SUBDIR, DEFAULT_OPENSPEC_PATH, ARTIFACT_REPO_STRUCTURE, ARTIFACT_DEPENDENCY_GRAPH, ARTIFACT_LLM_CONTEXT } from '../constants.js';
11
+ import { fileExists, readJsonFile } from '../utils/command-helpers.js';
10
12
  import { detectProjectType, getProjectTypeName, } from '../core/services/project-detector.js';
11
13
  import { getDefaultConfig, readSpecGenConfig, writeSpecGenConfig, specGenConfigExists, openspecDirExists, createOpenSpecStructure, } from '../core/services/config-manager.js';
12
14
  import { gitignoreExists, isInGitignore, addToGitignore, } from '../core/services/gitignore-manager.js';
13
15
  import { createLLMService } from '../core/services/llm-service.js';
14
16
  import { RepositoryMapper } from '../core/analyzer/repository-mapper.js';
15
17
  import { DependencyGraphBuilder } from '../core/analyzer/dependency-graph.js';
16
- import { AnalysisArtifactGenerator } from '../core/analyzer/artifact-generator.js';
18
+ import { AnalysisArtifactGenerator, repoStructureToRepoMap } from '../core/analyzer/artifact-generator.js';
17
19
  import { SpecGenerationPipeline } from '../core/generator/spec-pipeline.js';
18
20
  import { OpenSpecFormatGenerator } from '../core/generator/openspec-format-generator.js';
19
21
  import { OpenSpecWriter } from '../core/generator/openspec-writer.js';
@@ -21,14 +23,22 @@ import { ADRGenerator } from '../core/generator/adr-generator.js';
21
23
  function progress(onProgress, step, status, detail) {
22
24
  onProgress?.({ phase: 'run', step, status, detail });
23
25
  }
24
- async function fileExists(path) {
26
+ /**
27
+ * Load cached analysis artifacts from disk.
28
+ */
29
+ async function loadCachedArtifacts(analysisPath, repoStructure) {
30
+ const llmContext = await readJsonFile(join(analysisPath, ARTIFACT_LLM_CONTEXT), ARTIFACT_LLM_CONTEXT) ?? { phase1_survey: { purpose: '', files: [] }, phase2_deep: { purpose: '', files: [] }, phase3_validation: { purpose: '', files: [] } };
31
+ let summaryMarkdown = '';
32
+ let dependencyDiagram = '';
25
33
  try {
26
- await access(path);
27
- return true;
34
+ summaryMarkdown = await readFile(join(analysisPath, 'SUMMARY.md'), 'utf-8');
28
35
  }
29
- catch {
30
- return false;
36
+ catch { /* optional */ }
37
+ try {
38
+ dependencyDiagram = await readFile(join(analysisPath, 'dependencies.mermaid'), 'utf-8');
31
39
  }
40
+ catch { /* optional */ }
41
+ return { repoStructure, summaryMarkdown, dependencyDiagram, llmContext };
32
42
  }
33
43
  /**
34
44
  * Run the full spec-gen pipeline: init → analyze → generate.
@@ -44,7 +54,7 @@ export async function specGenRun(options = {}) {
44
54
  const rootPath = options.rootPath ?? process.cwd();
45
55
  const force = options.force ?? false;
46
56
  const reanalyze = options.reanalyze ?? false;
47
- const maxFiles = options.maxFiles ?? 500;
57
+ const maxFiles = options.maxFiles ?? DEFAULT_MAX_FILES;
48
58
  const adr = options.adr ?? false;
49
59
  const { onProgress } = options;
50
60
  // ========================================================================
@@ -58,15 +68,15 @@ export async function specGenRun(options = {}) {
58
68
  let specGenConfig = configExists ? await readSpecGenConfig(rootPath) : null;
59
69
  if (configExists && !force) {
60
70
  initResult = {
61
- configPath: '.spec-gen/config.json',
62
- openspecPath: specGenConfig?.openspecPath ?? './openspec',
71
+ configPath: SPEC_GEN_CONFIG_REL_PATH,
72
+ openspecPath: specGenConfig?.openspecPath ?? DEFAULT_OPENSPEC_PATH,
63
73
  projectType,
64
74
  created: false,
65
75
  };
66
76
  progress(onProgress, 'Initialization', 'skip', 'Config exists');
67
77
  }
68
78
  else {
69
- const openspecPath = './openspec';
79
+ const openspecPath = DEFAULT_OPENSPEC_PATH;
70
80
  specGenConfig = getDefaultConfig(detection.projectType, openspecPath);
71
81
  await writeSpecGenConfig(rootPath, specGenConfig);
72
82
  const fullOpenspecPath = join(rootPath, openspecPath);
@@ -75,13 +85,13 @@ export async function specGenRun(options = {}) {
75
85
  }
76
86
  const hasGitignore = await gitignoreExists(rootPath);
77
87
  if (hasGitignore) {
78
- const alreadyIgnored = await isInGitignore(rootPath, '.spec-gen/');
88
+ const alreadyIgnored = await isInGitignore(rootPath, `${SPEC_GEN_DIR}/`);
79
89
  if (!alreadyIgnored) {
80
- await addToGitignore(rootPath, '.spec-gen/', 'spec-gen analysis artifacts');
90
+ await addToGitignore(rootPath, `${SPEC_GEN_DIR}/`, 'spec-gen analysis artifacts');
81
91
  }
82
92
  }
83
93
  initResult = {
84
- configPath: '.spec-gen/config.json',
94
+ configPath: SPEC_GEN_CONFIG_REL_PATH,
85
95
  openspecPath: openspecPath,
86
96
  projectType,
87
97
  created: true,
@@ -99,32 +109,32 @@ export async function specGenRun(options = {}) {
99
109
  // STEP 2: ANALYSIS
100
110
  // ========================================================================
101
111
  progress(onProgress, 'Analysis', 'start');
102
- const analysisPath = join(rootPath, '.spec-gen', 'analysis');
112
+ const analysisPath = join(rootPath, SPEC_GEN_DIR, SPEC_GEN_ANALYSIS_SUBDIR);
103
113
  let analyzeResult;
104
114
  // Check for existing recent analysis
105
- const repoStructurePath = join(analysisPath, 'repo-structure.json');
115
+ const repoStructurePath = join(analysisPath, ARTIFACT_REPO_STRUCTURE);
106
116
  let useExisting = false;
107
117
  if (await fileExists(repoStructurePath)) {
108
118
  const stats = await stat(repoStructurePath);
109
119
  const age = Date.now() - stats.mtime.getTime();
110
- const oneHour = 60 * 60 * 1000;
111
- if (age < oneHour && !reanalyze && !force) {
120
+ if (age < ANALYSIS_REUSE_THRESHOLD_MS && !reanalyze && !force) {
112
121
  useExisting = true;
113
122
  }
114
123
  }
115
124
  if (useExisting) {
116
- const repoStructureContent = await readFile(repoStructurePath, 'utf-8');
117
- const repoStructure = JSON.parse(repoStructureContent);
118
- let depGraph;
119
- const depGraphPath = join(analysisPath, 'dependency-graph.json');
120
- if (await fileExists(depGraphPath)) {
121
- const content = await readFile(depGraphPath, 'utf-8');
122
- depGraph = JSON.parse(content);
125
+ const repoStructure = await readJsonFile(repoStructurePath, ARTIFACT_REPO_STRUCTURE);
126
+ if (!repoStructure) {
127
+ throw new Error(`Failed to load ${ARTIFACT_REPO_STRUCTURE} — run spec-gen analyze to regenerate`);
123
128
  }
129
+ const depGraph = await readJsonFile(join(analysisPath, ARTIFACT_DEPENDENCY_GRAPH), ARTIFACT_DEPENDENCY_GRAPH) ?? undefined;
124
130
  analyzeResult = {
125
- repoMap: repoStructure,
126
- depGraph: depGraph ?? { nodes: [], edges: [], statistics: { nodeCount: 0, edgeCount: 0, clusterCount: 0, cycleCount: 0, avgDegree: 0 } },
127
- artifacts: { repoStructure },
131
+ repoMap: repoStructureToRepoMap(repoStructure),
132
+ depGraph: depGraph ?? {
133
+ nodes: [], edges: [], clusters: [], structuralClusters: [], cycles: [],
134
+ rankings: { byImportance: [], byConnectivity: [], clusterCenters: [], leafNodes: [], bridgeNodes: [], orphanNodes: [] },
135
+ statistics: { nodeCount: 0, edgeCount: 0, importEdgeCount: 0, httpEdgeCount: 0, avgDegree: 0, density: 0, clusterCount: 0, structuralClusterCount: 0, cycleCount: 0 },
136
+ },
137
+ artifacts: await loadCachedArtifacts(analysisPath, repoStructure),
128
138
  duration: 0,
129
139
  };
130
140
  progress(onProgress, 'Analysis', 'skip', 'Recent analysis exists');
@@ -142,7 +152,7 @@ export async function specGenRun(options = {}) {
142
152
  maxValidationFiles: 5,
143
153
  });
144
154
  const artifacts = await artifactGenerator.generateAndSave(repoMap, depGraph);
145
- await writeFile(join(analysisPath, 'dependency-graph.json'), JSON.stringify(depGraph, null, 2));
155
+ await writeFile(join(analysisPath, ARTIFACT_DEPENDENCY_GRAPH), JSON.stringify(depGraph, null, 2));
146
156
  analyzeResult = {
147
157
  repoMap,
148
158
  depGraph,
@@ -180,15 +190,27 @@ export async function specGenRun(options = {}) {
180
190
  };
181
191
  }
182
192
  progress(onProgress, 'Generation', 'start');
183
- // Check for API key
193
+ // Check for API key — support all four providers
184
194
  const anthropicKey = process.env.ANTHROPIC_API_KEY;
185
195
  const openaiKey = process.env.OPENAI_API_KEY;
186
- if (!anthropicKey && !openaiKey) {
187
- throw new Error('No LLM API key found. Set ANTHROPIC_API_KEY or OPENAI_API_KEY.');
196
+ const openaiCompatKey = process.env.OPENAI_COMPAT_API_KEY;
197
+ const geminiKey = process.env.GEMINI_API_KEY;
198
+ if (!anthropicKey && !openaiKey && !openaiCompatKey && !geminiKey) {
199
+ throw new Error('No LLM API key found. Set ANTHROPIC_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY, or OPENAI_COMPAT_API_KEY.');
188
200
  }
189
201
  // Create LLM service
190
- const provider = options.provider ?? (anthropicKey ? 'anthropic' : 'openai');
191
- const model = options.model ?? 'claude-sonnet-4-20250514';
202
+ const envDetectedProvider = anthropicKey ? 'anthropic'
203
+ : geminiKey ? 'gemini'
204
+ : openaiCompatKey ? 'openai-compat'
205
+ : 'openai';
206
+ const provider = options.provider ?? envDetectedProvider;
207
+ const defaultModels = {
208
+ anthropic: DEFAULT_ANTHROPIC_MODEL,
209
+ gemini: DEFAULT_GEMINI_MODEL,
210
+ 'openai-compat': DEFAULT_OPENAI_COMPAT_MODEL,
211
+ openai: DEFAULT_OPENAI_MODEL,
212
+ };
213
+ const model = options.model ?? defaultModels[provider] ?? DEFAULT_ANTHROPIC_MODEL;
192
214
  let llm;
193
215
  try {
194
216
  llm = createLLMService({
@@ -198,31 +220,25 @@ export async function specGenRun(options = {}) {
198
220
  sslVerify: options.sslVerify ?? specGenConfig.llm?.sslVerify ?? true,
199
221
  openaiCompatBaseUrl: options.openaiCompatBaseUrl,
200
222
  enableLogging: true,
201
- logDir: join(rootPath, '.spec-gen', 'logs'),
223
+ logDir: join(rootPath, SPEC_GEN_DIR, SPEC_GEN_LOGS_SUBDIR),
202
224
  });
203
225
  }
204
226
  catch (error) {
205
227
  throw new Error(`Failed to create LLM service: ${error.message}`);
206
228
  }
207
229
  // Load analysis data for pipeline
208
- const llmContextPath = join(analysisPath, 'llm-context.json');
209
- let llmContext;
210
- if (await fileExists(llmContextPath)) {
211
- const content = await readFile(llmContextPath, 'utf-8');
212
- llmContext = JSON.parse(content);
213
- }
214
- else {
215
- llmContext = {
216
- phase1_survey: { purpose: 'Initial survey', files: [], estimatedTokens: 0 },
217
- phase2_deep: { purpose: 'Deep analysis', files: [], totalTokens: 0 },
218
- phase3_validation: { purpose: 'Validation', files: [], totalTokens: 0 },
219
- };
230
+ const llmContext = await readJsonFile(join(analysisPath, ARTIFACT_LLM_CONTEXT), ARTIFACT_LLM_CONTEXT) ?? {
231
+ phase1_survey: { purpose: 'Initial survey', files: [], estimatedTokens: 0 },
232
+ phase2_deep: { purpose: 'Deep analysis', files: [], totalTokens: 0 },
233
+ phase3_validation: { purpose: 'Validation', files: [], totalTokens: 0 },
234
+ };
235
+ const repoStructure = await readJsonFile(repoStructurePath, ARTIFACT_REPO_STRUCTURE);
236
+ if (!repoStructure) {
237
+ throw new Error(`Failed to load ${ARTIFACT_REPO_STRUCTURE} — run spec-gen analyze to regenerate`);
220
238
  }
221
- const repoStructureContent = await readFile(repoStructurePath, 'utf-8');
222
- const repoStructure = JSON.parse(repoStructureContent);
223
239
  // Run pipeline
224
240
  const pipeline = new SpecGenerationPipeline(llm, {
225
- outputDir: join(rootPath, '.spec-gen', 'generation'),
241
+ outputDir: join(rootPath, SPEC_GEN_DIR, SPEC_GEN_GENERATION_SUBDIR),
226
242
  saveIntermediate: true,
227
243
  generateADRs: adr,
228
244
  });
@@ -263,7 +279,7 @@ export async function specGenRun(options = {}) {
263
279
  progress(onProgress, 'Generation', 'complete', `${report.filesWritten.length} specs written`);
264
280
  // Save run metadata
265
281
  const duration = Date.now() - startTime;
266
- const runsDir = join(rootPath, '.spec-gen', 'runs');
282
+ const runsDir = join(rootPath, SPEC_GEN_DIR, SPEC_GEN_RUNS_SUBDIR);
267
283
  await mkdir(runsDir, { recursive: true });
268
284
  const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
269
285
  await writeFile(join(runsDir, `${timestamp}.json`), JSON.stringify({