spec-gen-cli 1.1.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.
- package/README.md +163 -77
- package/dist/api/analyze.d.ts.map +1 -1
- package/dist/api/analyze.js +56 -27
- package/dist/api/analyze.js.map +1 -1
- package/dist/api/drift.d.ts.map +1 -1
- package/dist/api/drift.js +26 -20
- package/dist/api/drift.js.map +1 -1
- package/dist/api/generate.d.ts.map +1 -1
- package/dist/api/generate.js +19 -43
- package/dist/api/generate.js.map +1 -1
- package/dist/api/init.d.ts.map +1 -1
- package/dist/api/init.js +6 -5
- package/dist/api/init.js.map +1 -1
- package/dist/api/run.d.ts.map +1 -1
- package/dist/api/run.js +67 -51
- package/dist/api/run.js.map +1 -1
- package/dist/api/specs.d.ts.map +1 -1
- package/dist/api/specs.js +5 -4
- package/dist/api/specs.js.map +1 -1
- package/dist/api/types.d.ts +7 -1
- package/dist/api/types.d.ts.map +1 -1
- package/dist/api/verify.d.ts.map +1 -1
- package/dist/api/verify.js +31 -32
- package/dist/api/verify.js.map +1 -1
- package/dist/cli/commands/analyze.d.ts.map +1 -1
- package/dist/cli/commands/analyze.js +41 -62
- package/dist/cli/commands/analyze.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts +9 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +273 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/drift.d.ts.map +1 -1
- package/dist/cli/commands/drift.js +18 -32
- package/dist/cli/commands/drift.js.map +1 -1
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +40 -101
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +17 -15
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/mcp.d.ts.map +1 -1
- package/dist/cli/commands/mcp.js +2 -1
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/run.d.ts +0 -15
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +61 -111
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/verify.d.ts.map +1 -1
- package/dist/cli/commands/verify.js +18 -52
- package/dist/cli/commands/verify.js.map +1 -1
- package/dist/cli/commands/view.d.ts +4 -0
- package/dist/cli/commands/view.d.ts.map +1 -1
- package/dist/cli/commands/view.js +29 -24
- package/dist/cli/commands/view.js.map +1 -1
- package/dist/cli/index.js +22 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/constants.d.ts +254 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +320 -0
- package/dist/constants.js.map +1 -0
- package/dist/core/analyzer/artifact-generator.d.ts +8 -0
- package/dist/core/analyzer/artifact-generator.d.ts.map +1 -1
- package/dist/core/analyzer/artifact-generator.js +59 -11
- package/dist/core/analyzer/artifact-generator.js.map +1 -1
- package/dist/core/analyzer/call-graph.d.ts.map +1 -1
- package/dist/core/analyzer/call-graph.js +135 -1
- package/dist/core/analyzer/call-graph.js.map +1 -1
- package/dist/core/analyzer/dependency-graph.d.ts +32 -0
- package/dist/core/analyzer/dependency-graph.d.ts.map +1 -1
- package/dist/core/analyzer/dependency-graph.js +104 -10
- package/dist/core/analyzer/dependency-graph.js.map +1 -1
- package/dist/core/analyzer/duplicate-detector.d.ts.map +1 -1
- package/dist/core/analyzer/duplicate-detector.js +4 -0
- package/dist/core/analyzer/duplicate-detector.js.map +1 -1
- package/dist/core/analyzer/embedding-service.d.ts +6 -0
- package/dist/core/analyzer/embedding-service.d.ts.map +1 -1
- package/dist/core/analyzer/embedding-service.js +15 -1
- package/dist/core/analyzer/embedding-service.js.map +1 -1
- package/dist/core/analyzer/file-walker.d.ts.map +1 -1
- package/dist/core/analyzer/file-walker.js +4 -3
- package/dist/core/analyzer/file-walker.js.map +1 -1
- package/dist/core/analyzer/http-route-parser.d.ts +111 -0
- package/dist/core/analyzer/http-route-parser.d.ts.map +1 -0
- package/dist/core/analyzer/http-route-parser.js +466 -0
- package/dist/core/analyzer/http-route-parser.js.map +1 -0
- package/dist/core/analyzer/import-parser.d.ts.map +1 -1
- package/dist/core/analyzer/import-parser.js +19 -5
- package/dist/core/analyzer/import-parser.js.map +1 -1
- package/dist/core/analyzer/refactor-analyzer.d.ts.map +1 -1
- package/dist/core/analyzer/refactor-analyzer.js +8 -7
- package/dist/core/analyzer/refactor-analyzer.js.map +1 -1
- package/dist/core/analyzer/repository-mapper.d.ts.map +1 -1
- package/dist/core/analyzer/repository-mapper.js +12 -13
- package/dist/core/analyzer/repository-mapper.js.map +1 -1
- package/dist/core/analyzer/signature-extractor.d.ts +1 -1
- package/dist/core/analyzer/signature-extractor.d.ts.map +1 -1
- package/dist/core/analyzer/signature-extractor.js +69 -1
- package/dist/core/analyzer/signature-extractor.js.map +1 -1
- package/dist/core/analyzer/spec-vector-index.d.ts.map +1 -1
- package/dist/core/analyzer/spec-vector-index.js +4 -3
- package/dist/core/analyzer/spec-vector-index.js.map +1 -1
- package/dist/core/analyzer/vector-index.d.ts.map +1 -1
- package/dist/core/analyzer/vector-index.js +29 -1
- package/dist/core/analyzer/vector-index.js.map +1 -1
- package/dist/core/drift/drift-detector.d.ts.map +1 -1
- package/dist/core/drift/drift-detector.js +7 -6
- package/dist/core/drift/drift-detector.js.map +1 -1
- package/dist/core/drift/git-diff.d.ts.map +1 -1
- package/dist/core/drift/git-diff.js +28 -16
- package/dist/core/drift/git-diff.js.map +1 -1
- package/dist/core/generator/mapping-generator.d.ts.map +1 -1
- package/dist/core/generator/mapping-generator.js +11 -10
- package/dist/core/generator/mapping-generator.js.map +1 -1
- package/dist/core/generator/openspec-compat.d.ts.map +1 -1
- package/dist/core/generator/openspec-compat.js +3 -2
- package/dist/core/generator/openspec-compat.js.map +1 -1
- package/dist/core/generator/openspec-format-generator.js.map +1 -1
- package/dist/core/generator/openspec-writer.d.ts +0 -4
- package/dist/core/generator/openspec-writer.d.ts.map +1 -1
- package/dist/core/generator/openspec-writer.js +30 -41
- package/dist/core/generator/openspec-writer.js.map +1 -1
- package/dist/core/generator/spec-pipeline.d.ts.map +1 -1
- package/dist/core/generator/spec-pipeline.js +4 -4
- package/dist/core/generator/spec-pipeline.js.map +1 -1
- package/dist/core/generator/stages/stage1-survey.d.ts.map +1 -1
- package/dist/core/generator/stages/stage1-survey.js +5 -3
- package/dist/core/generator/stages/stage1-survey.js.map +1 -1
- package/dist/core/generator/stages/stage2-entities.d.ts.map +1 -1
- package/dist/core/generator/stages/stage2-entities.js +10 -9
- package/dist/core/generator/stages/stage2-entities.js.map +1 -1
- package/dist/core/generator/stages/stage3-services.d.ts.map +1 -1
- package/dist/core/generator/stages/stage3-services.js +9 -8
- package/dist/core/generator/stages/stage3-services.js.map +1 -1
- package/dist/core/generator/stages/stage4-api.d.ts.map +1 -1
- package/dist/core/generator/stages/stage4-api.js +10 -9
- package/dist/core/generator/stages/stage4-api.js.map +1 -1
- package/dist/core/generator/stages/stage5-architecture.d.ts.map +1 -1
- package/dist/core/generator/stages/stage5-architecture.js +5 -4
- package/dist/core/generator/stages/stage5-architecture.js.map +1 -1
- package/dist/core/generator/stages/stage6-adr.d.ts.map +1 -1
- package/dist/core/generator/stages/stage6-adr.js +7 -2
- package/dist/core/generator/stages/stage6-adr.js.map +1 -1
- package/dist/core/services/chat-agent.d.ts.map +1 -1
- package/dist/core/services/chat-agent.js +46 -15
- package/dist/core/services/chat-agent.js.map +1 -1
- package/dist/core/services/config-manager.d.ts.map +1 -1
- package/dist/core/services/config-manager.js +32 -26
- package/dist/core/services/config-manager.js.map +1 -1
- package/dist/core/services/gitignore-manager.d.ts.map +1 -1
- package/dist/core/services/gitignore-manager.js +2 -13
- package/dist/core/services/gitignore-manager.js.map +1 -1
- package/dist/core/services/llm-service.d.ts.map +1 -1
- package/dist/core/services/llm-service.js +33 -35
- package/dist/core/services/llm-service.js.map +1 -1
- package/dist/core/services/mcp-handlers/analysis.d.ts.map +1 -1
- package/dist/core/services/mcp-handlers/analysis.js +23 -14
- package/dist/core/services/mcp-handlers/analysis.js.map +1 -1
- package/dist/core/services/mcp-handlers/graph.d.ts.map +1 -1
- package/dist/core/services/mcp-handlers/graph.js +24 -23
- package/dist/core/services/mcp-handlers/graph.js.map +1 -1
- package/dist/core/services/mcp-handlers/semantic.d.ts +1 -1
- package/dist/core/services/mcp-handlers/semantic.d.ts.map +1 -1
- package/dist/core/services/mcp-handlers/semantic.js +17 -16
- package/dist/core/services/mcp-handlers/semantic.js.map +1 -1
- package/dist/core/services/mcp-handlers/utils.d.ts.map +1 -1
- package/dist/core/services/mcp-handlers/utils.js +4 -3
- package/dist/core/services/mcp-handlers/utils.js.map +1 -1
- package/dist/core/services/project-detector.d.ts.map +1 -1
- package/dist/core/services/project-detector.js +2 -13
- package/dist/core/services/project-detector.js.map +1 -1
- package/dist/core/verifier/verification-engine.d.ts +9 -3
- package/dist/core/verifier/verification-engine.d.ts.map +1 -1
- package/dist/core/verifier/verification-engine.js +25 -13
- package/dist/core/verifier/verification-engine.js.map +1 -1
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/command-helpers.d.ts +38 -0
- package/dist/utils/command-helpers.d.ts.map +1 -0
- package/dist/utils/command-helpers.js +82 -0
- package/dist/utils/command-helpers.js.map +1 -0
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +4 -3
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +14 -3
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/progress.d.ts +1 -1
- package/dist/utils/progress.d.ts.map +1 -1
- package/dist/utils/progress.js +15 -12
- package/dist/utils/progress.js.map +1 -1
- package/dist/utils/shutdown.d.ts.map +1 -1
- package/dist/utils/shutdown.js +4 -3
- package/dist/utils/shutdown.js.map +1 -1
- package/package.json +9 -5
- package/src/viewer/InteractiveGraphViewer.jsx +182 -139
- package/src/viewer/components/ArchitectureView.jsx +19 -19
- package/src/viewer/components/ChatPanel.jsx +40 -40
- package/src/viewer/components/ClusterGraph.jsx +34 -22
- package/src/viewer/components/FilterBar.jsx +26 -26
- package/src/viewer/components/FlatGraph.jsx +22 -15
- package/src/viewer/components/MicroComponents.jsx +14 -12
- package/src/viewer/utils/constants.js +17 -0
- package/src/viewer/utils/graph-helpers.js +7 -3
- package/src/viewer/utils/graph-helpers.test.ts +39 -0
- 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 {
|
|
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 ??
|
|
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 ??
|
|
56
|
-
const specsPath = join(openspecPath,
|
|
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
|
-
|
|
66
|
-
|
|
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
|
|
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,
|
|
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,
|
|
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 ??
|
|
134
|
+
openspecRelPath: specGenConfig.openspecPath ?? OPENSPEC_DIR,
|
|
129
135
|
llm,
|
|
130
136
|
baseRef: gitResult.resolvedBase,
|
|
131
137
|
adrMap: adrMap ?? undefined,
|
package/dist/api/drift.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drift.js","sourceRoot":"","sources":["../../src/api/drift.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,
|
|
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;
|
|
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"}
|
package/dist/api/generate.js
CHANGED
|
@@ -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 {
|
|
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
|
|
30
|
-
if (!
|
|
21
|
+
const repoStructure = await readJsonFile(join(analysisPath, ARTIFACT_REPO_STRUCTURE), ARTIFACT_REPO_STRUCTURE);
|
|
22
|
+
if (!repoStructure)
|
|
31
23
|
return null;
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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 ??
|
|
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 ??
|
|
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:
|
|
104
|
-
gemini:
|
|
105
|
-
'openai-compat':
|
|
106
|
-
openai:
|
|
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,
|
|
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,
|
|
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,
|
|
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');
|
package/dist/api/generate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/api/generate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/api/generate.ts"],"names":[],"mappings":"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"}
|
package/dist/api/init.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/api/init.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
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 ??
|
|
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:
|
|
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,
|
|
69
|
+
const alreadyIgnored = await isInGitignore(rootPath, `${SPEC_GEN_DIR}/`);
|
|
69
70
|
if (!alreadyIgnored) {
|
|
70
71
|
progress(onProgress, 'Updating .gitignore', 'start');
|
|
71
|
-
await addToGitignore(rootPath,
|
|
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:
|
|
77
|
+
configPath: SPEC_GEN_CONFIG_REL_PATH,
|
|
77
78
|
openspecPath: openspecRelPath,
|
|
78
79
|
projectType,
|
|
79
80
|
created: true,
|
package/dist/api/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/api/init.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EACL,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,eAAe,EACf,aAAa,EACb,cAAc,GACf,MAAM,uCAAuC,CAAC;AAG/C,SAAS,QAAQ,CAAC,UAAwC,EAAE,IAAY,EAAE,MAAkD,EAAE,MAAe;IAC3I,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;AACxD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,UAA0B,EAAE;IAC5D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACnD,MAAM,eAAe,GAAG,OAAO,CAAC,YAAY,IAAI,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/api/init.ts"],"names":[],"mappings":"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"}
|
package/dist/api/run.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/api/run.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
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 {
|
|
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
|
-
|
|
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
|
|
27
|
-
return true;
|
|
34
|
+
summaryMarkdown = await readFile(join(analysisPath, 'SUMMARY.md'), 'utf-8');
|
|
28
35
|
}
|
|
29
|
-
catch {
|
|
30
|
-
|
|
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 ??
|
|
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:
|
|
62
|
-
openspecPath: specGenConfig?.openspecPath ??
|
|
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 =
|
|
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,
|
|
88
|
+
const alreadyIgnored = await isInGitignore(rootPath, `${SPEC_GEN_DIR}/`);
|
|
79
89
|
if (!alreadyIgnored) {
|
|
80
|
-
await addToGitignore(rootPath,
|
|
90
|
+
await addToGitignore(rootPath, `${SPEC_GEN_DIR}/`, 'spec-gen analysis artifacts');
|
|
81
91
|
}
|
|
82
92
|
}
|
|
83
93
|
initResult = {
|
|
84
|
-
configPath:
|
|
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,
|
|
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,
|
|
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
|
-
|
|
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
|
|
117
|
-
|
|
118
|
-
|
|
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 ?? {
|
|
127
|
-
|
|
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,
|
|
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
|
-
|
|
187
|
-
|
|
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
|
|
191
|
-
|
|
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,
|
|
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
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
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,
|
|
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,
|
|
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({
|