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.
- package/LICENSE +21 -0
- package/README.md +1078 -0
- package/dist/api/analyze.d.ts +17 -0
- package/dist/api/analyze.d.ts.map +1 -0
- package/dist/api/analyze.js +109 -0
- package/dist/api/analyze.js.map +1 -0
- package/dist/api/drift.d.ts +21 -0
- package/dist/api/drift.d.ts.map +1 -0
- package/dist/api/drift.js +145 -0
- package/dist/api/drift.js.map +1 -0
- package/dist/api/generate.d.ts +18 -0
- package/dist/api/generate.d.ts.map +1 -0
- package/dist/api/generate.js +251 -0
- package/dist/api/generate.js.map +1 -0
- package/dist/api/index.d.ts +39 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +32 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/init.d.ts +18 -0
- package/dist/api/init.d.ts.map +1 -0
- package/dist/api/init.js +82 -0
- package/dist/api/init.js.map +1 -0
- package/dist/api/run.d.ts +19 -0
- package/dist/api/run.d.ts.map +1 -0
- package/dist/api/run.js +291 -0
- package/dist/api/run.js.map +1 -0
- package/dist/api/specs.d.ts +49 -0
- package/dist/api/specs.d.ts.map +1 -0
- package/dist/api/specs.js +136 -0
- package/dist/api/specs.js.map +1 -0
- package/dist/api/types.d.ts +176 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +9 -0
- package/dist/api/types.js.map +1 -0
- package/dist/api/verify.d.ts +20 -0
- package/dist/api/verify.d.ts.map +1 -0
- package/dist/api/verify.js +117 -0
- package/dist/api/verify.js.map +1 -0
- package/dist/cli/commands/analyze.d.ts +27 -0
- package/dist/cli/commands/analyze.d.ts.map +1 -0
- package/dist/cli/commands/analyze.js +485 -0
- package/dist/cli/commands/analyze.js.map +1 -0
- package/dist/cli/commands/drift.d.ts +9 -0
- package/dist/cli/commands/drift.d.ts.map +1 -0
- package/dist/cli/commands/drift.js +540 -0
- package/dist/cli/commands/drift.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +9 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +633 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/cli/commands/init.d.ts +9 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +171 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +638 -0
- package/dist/cli/commands/mcp.d.ts.map +1 -0
- package/dist/cli/commands/mcp.js +574 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/commands/run.d.ts +24 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +546 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/verify.d.ts +9 -0
- package/dist/cli/commands/verify.d.ts.map +1 -0
- package/dist/cli/commands/verify.js +417 -0
- package/dist/cli/commands/verify.js.map +1 -0
- package/dist/cli/commands/view.d.ts +9 -0
- package/dist/cli/commands/view.d.ts.map +1 -0
- package/dist/cli/commands/view.js +511 -0
- package/dist/cli/commands/view.js.map +1 -0
- package/dist/cli/index.d.ts +9 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +83 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/analyzer/architecture-writer.d.ts +67 -0
- package/dist/core/analyzer/architecture-writer.d.ts.map +1 -0
- package/dist/core/analyzer/architecture-writer.js +209 -0
- package/dist/core/analyzer/architecture-writer.js.map +1 -0
- package/dist/core/analyzer/artifact-generator.d.ts +222 -0
- package/dist/core/analyzer/artifact-generator.d.ts.map +1 -0
- package/dist/core/analyzer/artifact-generator.js +726 -0
- package/dist/core/analyzer/artifact-generator.js.map +1 -0
- package/dist/core/analyzer/call-graph.d.ts +83 -0
- package/dist/core/analyzer/call-graph.d.ts.map +1 -0
- package/dist/core/analyzer/call-graph.js +827 -0
- package/dist/core/analyzer/call-graph.js.map +1 -0
- package/dist/core/analyzer/code-shaper.d.ts +33 -0
- package/dist/core/analyzer/code-shaper.d.ts.map +1 -0
- package/dist/core/analyzer/code-shaper.js +149 -0
- package/dist/core/analyzer/code-shaper.js.map +1 -0
- package/dist/core/analyzer/dependency-graph.d.ts +179 -0
- package/dist/core/analyzer/dependency-graph.d.ts.map +1 -0
- package/dist/core/analyzer/dependency-graph.js +574 -0
- package/dist/core/analyzer/dependency-graph.js.map +1 -0
- package/dist/core/analyzer/duplicate-detector.d.ts +52 -0
- package/dist/core/analyzer/duplicate-detector.d.ts.map +1 -0
- package/dist/core/analyzer/duplicate-detector.js +279 -0
- package/dist/core/analyzer/duplicate-detector.js.map +1 -0
- package/dist/core/analyzer/embedding-service.d.ts +50 -0
- package/dist/core/analyzer/embedding-service.d.ts.map +1 -0
- package/dist/core/analyzer/embedding-service.js +104 -0
- package/dist/core/analyzer/embedding-service.js.map +1 -0
- package/dist/core/analyzer/file-walker.d.ts +78 -0
- package/dist/core/analyzer/file-walker.d.ts.map +1 -0
- package/dist/core/analyzer/file-walker.js +531 -0
- package/dist/core/analyzer/file-walker.js.map +1 -0
- package/dist/core/analyzer/import-parser.d.ts +91 -0
- package/dist/core/analyzer/import-parser.d.ts.map +1 -0
- package/dist/core/analyzer/import-parser.js +720 -0
- package/dist/core/analyzer/import-parser.js.map +1 -0
- package/dist/core/analyzer/index.d.ts +10 -0
- package/dist/core/analyzer/index.d.ts.map +1 -0
- package/dist/core/analyzer/index.js +10 -0
- package/dist/core/analyzer/index.js.map +1 -0
- package/dist/core/analyzer/refactor-analyzer.d.ts +80 -0
- package/dist/core/analyzer/refactor-analyzer.d.ts.map +1 -0
- package/dist/core/analyzer/refactor-analyzer.js +339 -0
- package/dist/core/analyzer/refactor-analyzer.js.map +1 -0
- package/dist/core/analyzer/repository-mapper.d.ts +150 -0
- package/dist/core/analyzer/repository-mapper.d.ts.map +1 -0
- package/dist/core/analyzer/repository-mapper.js +731 -0
- package/dist/core/analyzer/repository-mapper.js.map +1 -0
- package/dist/core/analyzer/signature-extractor.d.ts +31 -0
- package/dist/core/analyzer/signature-extractor.d.ts.map +1 -0
- package/dist/core/analyzer/signature-extractor.js +387 -0
- package/dist/core/analyzer/signature-extractor.js.map +1 -0
- package/dist/core/analyzer/significance-scorer.d.ts +79 -0
- package/dist/core/analyzer/significance-scorer.d.ts.map +1 -0
- package/dist/core/analyzer/significance-scorer.js +407 -0
- package/dist/core/analyzer/significance-scorer.js.map +1 -0
- package/dist/core/analyzer/subgraph-extractor.d.ts +43 -0
- package/dist/core/analyzer/subgraph-extractor.d.ts.map +1 -0
- package/dist/core/analyzer/subgraph-extractor.js +129 -0
- package/dist/core/analyzer/subgraph-extractor.js.map +1 -0
- package/dist/core/analyzer/vector-index.d.ts +63 -0
- package/dist/core/analyzer/vector-index.d.ts.map +1 -0
- package/dist/core/analyzer/vector-index.js +169 -0
- package/dist/core/analyzer/vector-index.js.map +1 -0
- package/dist/core/drift/drift-detector.d.ts +102 -0
- package/dist/core/drift/drift-detector.d.ts.map +1 -0
- package/dist/core/drift/drift-detector.js +597 -0
- package/dist/core/drift/drift-detector.js.map +1 -0
- package/dist/core/drift/git-diff.d.ts +55 -0
- package/dist/core/drift/git-diff.d.ts.map +1 -0
- package/dist/core/drift/git-diff.js +356 -0
- package/dist/core/drift/git-diff.js.map +1 -0
- package/dist/core/drift/index.d.ts +12 -0
- package/dist/core/drift/index.d.ts.map +1 -0
- package/dist/core/drift/index.js +9 -0
- package/dist/core/drift/index.js.map +1 -0
- package/dist/core/drift/spec-mapper.d.ts +73 -0
- package/dist/core/drift/spec-mapper.d.ts.map +1 -0
- package/dist/core/drift/spec-mapper.js +353 -0
- package/dist/core/drift/spec-mapper.js.map +1 -0
- package/dist/core/generator/adr-generator.d.ts +32 -0
- package/dist/core/generator/adr-generator.d.ts.map +1 -0
- package/dist/core/generator/adr-generator.js +192 -0
- package/dist/core/generator/adr-generator.js.map +1 -0
- package/dist/core/generator/index.d.ts +9 -0
- package/dist/core/generator/index.d.ts.map +1 -0
- package/dist/core/generator/index.js +12 -0
- package/dist/core/generator/index.js.map +1 -0
- package/dist/core/generator/mapping-generator.d.ts +54 -0
- package/dist/core/generator/mapping-generator.d.ts.map +1 -0
- package/dist/core/generator/mapping-generator.js +239 -0
- package/dist/core/generator/mapping-generator.js.map +1 -0
- package/dist/core/generator/openspec-compat.d.ts +160 -0
- package/dist/core/generator/openspec-compat.d.ts.map +1 -0
- package/dist/core/generator/openspec-compat.js +523 -0
- package/dist/core/generator/openspec-compat.js.map +1 -0
- package/dist/core/generator/openspec-format-generator.d.ts +111 -0
- package/dist/core/generator/openspec-format-generator.d.ts.map +1 -0
- package/dist/core/generator/openspec-format-generator.js +817 -0
- package/dist/core/generator/openspec-format-generator.js.map +1 -0
- package/dist/core/generator/openspec-writer.d.ts +131 -0
- package/dist/core/generator/openspec-writer.d.ts.map +1 -0
- package/dist/core/generator/openspec-writer.js +379 -0
- package/dist/core/generator/openspec-writer.js.map +1 -0
- package/dist/core/generator/prompts.d.ts +35 -0
- package/dist/core/generator/prompts.d.ts.map +1 -0
- package/dist/core/generator/prompts.js +212 -0
- package/dist/core/generator/prompts.js.map +1 -0
- package/dist/core/generator/spec-pipeline.d.ts +94 -0
- package/dist/core/generator/spec-pipeline.d.ts.map +1 -0
- package/dist/core/generator/spec-pipeline.js +474 -0
- package/dist/core/generator/spec-pipeline.js.map +1 -0
- package/dist/core/generator/stages/stage1-survey.d.ts +19 -0
- package/dist/core/generator/stages/stage1-survey.d.ts.map +1 -0
- package/dist/core/generator/stages/stage1-survey.js +105 -0
- package/dist/core/generator/stages/stage1-survey.js.map +1 -0
- package/dist/core/generator/stages/stage2-entities.d.ts +11 -0
- package/dist/core/generator/stages/stage2-entities.d.ts.map +1 -0
- package/dist/core/generator/stages/stage2-entities.js +67 -0
- package/dist/core/generator/stages/stage2-entities.js.map +1 -0
- package/dist/core/generator/stages/stage3-services.d.ts +11 -0
- package/dist/core/generator/stages/stage3-services.d.ts.map +1 -0
- package/dist/core/generator/stages/stage3-services.js +75 -0
- package/dist/core/generator/stages/stage3-services.js.map +1 -0
- package/dist/core/generator/stages/stage4-api.d.ts +11 -0
- package/dist/core/generator/stages/stage4-api.d.ts.map +1 -0
- package/dist/core/generator/stages/stage4-api.js +65 -0
- package/dist/core/generator/stages/stage4-api.js.map +1 -0
- package/dist/core/generator/stages/stage5-architecture.d.ts +10 -0
- package/dist/core/generator/stages/stage5-architecture.d.ts.map +1 -0
- package/dist/core/generator/stages/stage5-architecture.js +62 -0
- package/dist/core/generator/stages/stage5-architecture.js.map +1 -0
- package/dist/core/generator/stages/stage6-adr.d.ts +8 -0
- package/dist/core/generator/stages/stage6-adr.d.ts.map +1 -0
- package/dist/core/generator/stages/stage6-adr.js +41 -0
- package/dist/core/generator/stages/stage6-adr.js.map +1 -0
- package/dist/core/services/chat-agent.d.ts +45 -0
- package/dist/core/services/chat-agent.d.ts.map +1 -0
- package/dist/core/services/chat-agent.js +310 -0
- package/dist/core/services/chat-agent.js.map +1 -0
- package/dist/core/services/chat-tools.d.ts +32 -0
- package/dist/core/services/chat-tools.d.ts.map +1 -0
- package/dist/core/services/chat-tools.js +270 -0
- package/dist/core/services/chat-tools.js.map +1 -0
- package/dist/core/services/config-manager.d.ts +61 -0
- package/dist/core/services/config-manager.d.ts.map +1 -0
- package/dist/core/services/config-manager.js +143 -0
- package/dist/core/services/config-manager.js.map +1 -0
- package/dist/core/services/gitignore-manager.d.ts +29 -0
- package/dist/core/services/gitignore-manager.d.ts.map +1 -0
- package/dist/core/services/gitignore-manager.js +106 -0
- package/dist/core/services/gitignore-manager.js.map +1 -0
- package/dist/core/services/index.d.ts +8 -0
- package/dist/core/services/index.d.ts.map +1 -0
- package/dist/core/services/index.js +8 -0
- package/dist/core/services/index.js.map +1 -0
- package/dist/core/services/llm-service.d.ts +336 -0
- package/dist/core/services/llm-service.d.ts.map +1 -0
- package/dist/core/services/llm-service.js +1155 -0
- package/dist/core/services/llm-service.js.map +1 -0
- package/dist/core/services/mcp-handlers/analysis.d.ts +42 -0
- package/dist/core/services/mcp-handlers/analysis.d.ts.map +1 -0
- package/dist/core/services/mcp-handlers/analysis.js +300 -0
- package/dist/core/services/mcp-handlers/analysis.js.map +1 -0
- package/dist/core/services/mcp-handlers/graph.d.ts +65 -0
- package/dist/core/services/mcp-handlers/graph.d.ts.map +1 -0
- package/dist/core/services/mcp-handlers/graph.js +509 -0
- package/dist/core/services/mcp-handlers/graph.js.map +1 -0
- package/dist/core/services/mcp-handlers/semantic.d.ts +38 -0
- package/dist/core/services/mcp-handlers/semantic.d.ts.map +1 -0
- package/dist/core/services/mcp-handlers/semantic.js +172 -0
- package/dist/core/services/mcp-handlers/semantic.js.map +1 -0
- package/dist/core/services/mcp-handlers/utils.d.ts +21 -0
- package/dist/core/services/mcp-handlers/utils.d.ts.map +1 -0
- package/dist/core/services/mcp-handlers/utils.js +62 -0
- package/dist/core/services/mcp-handlers/utils.js.map +1 -0
- package/dist/core/services/project-detector.d.ts +32 -0
- package/dist/core/services/project-detector.d.ts.map +1 -0
- package/dist/core/services/project-detector.js +111 -0
- package/dist/core/services/project-detector.js.map +1 -0
- package/dist/core/verifier/index.d.ts +5 -0
- package/dist/core/verifier/index.d.ts.map +1 -0
- package/dist/core/verifier/index.js +5 -0
- package/dist/core/verifier/index.js.map +1 -0
- package/dist/core/verifier/verification-engine.d.ts +226 -0
- package/dist/core/verifier/verification-engine.d.ts.map +1 -0
- package/dist/core/verifier/verification-engine.js +681 -0
- package/dist/core/verifier/verification-engine.js.map +1 -0
- package/dist/types/index.d.ts +252 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/pipeline.d.ts +148 -0
- package/dist/types/pipeline.d.ts.map +1 -0
- package/dist/types/pipeline.js +5 -0
- package/dist/types/pipeline.js.map +1 -0
- package/dist/utils/errors.d.ts +51 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +128 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +149 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +331 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/progress.d.ts +142 -0
- package/dist/utils/progress.d.ts.map +1 -0
- package/dist/utils/progress.js +280 -0
- package/dist/utils/progress.js.map +1 -0
- package/dist/utils/prompts.d.ts +53 -0
- package/dist/utils/prompts.d.ts.map +1 -0
- package/dist/utils/prompts.js +199 -0
- package/dist/utils/prompts.js.map +1 -0
- package/dist/utils/shutdown.d.ts +89 -0
- package/dist/utils/shutdown.d.ts.map +1 -0
- package/dist/utils/shutdown.js +237 -0
- package/dist/utils/shutdown.js.map +1 -0
- package/package.json +114 -0
- package/src/viewer/InteractiveGraphViewer.jsx +1486 -0
- package/src/viewer/app/index.html +17 -0
- package/src/viewer/app/main.jsx +13 -0
- package/src/viewer/components/ArchitectureView.jsx +177 -0
- package/src/viewer/components/ChatPanel.jsx +448 -0
- package/src/viewer/components/ClusterGraph.jsx +441 -0
- package/src/viewer/components/FilterBar.jsx +179 -0
- package/src/viewer/components/FlatGraph.jsx +275 -0
- package/src/viewer/components/MicroComponents.jsx +83 -0
- package/src/viewer/hooks/usePanZoom.js +79 -0
- package/src/viewer/utils/constants.js +47 -0
- package/src/viewer/utils/graph-helpers.js +291 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* spec-gen analyze — programmatic API
|
|
3
|
+
*
|
|
4
|
+
* Runs static analysis on the codebase (no LLM required).
|
|
5
|
+
* No side effects (no process.exit, no console.log).
|
|
6
|
+
*/
|
|
7
|
+
import type { AnalyzeApiOptions, AnalyzeResult } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Run static analysis on the codebase.
|
|
10
|
+
*
|
|
11
|
+
* Scans the repository, builds a dependency graph, and generates
|
|
12
|
+
* analysis artifacts. No LLM involvement.
|
|
13
|
+
*
|
|
14
|
+
* @throws Error if no spec-gen configuration found
|
|
15
|
+
*/
|
|
16
|
+
export declare function specGenAnalyze(options?: AnalyzeApiOptions): Promise<AnalyzeResult>;
|
|
17
|
+
//# sourceMappingURL=analyze.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/api/analyze.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAmC,MAAM,YAAY,CAAC;AAepG;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,aAAa,CAAC,CAwF5F"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* spec-gen analyze — programmatic API
|
|
3
|
+
*
|
|
4
|
+
* Runs static analysis on the codebase (no LLM required).
|
|
5
|
+
* No side effects (no process.exit, no console.log).
|
|
6
|
+
*/
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
import { access, stat, mkdir, writeFile } from 'node:fs/promises';
|
|
9
|
+
import { readSpecGenConfig } from '../core/services/config-manager.js';
|
|
10
|
+
import { RepositoryMapper } from '../core/analyzer/repository-mapper.js';
|
|
11
|
+
import { DependencyGraphBuilder } from '../core/analyzer/dependency-graph.js';
|
|
12
|
+
import { AnalysisArtifactGenerator } from '../core/analyzer/artifact-generator.js';
|
|
13
|
+
function progress(onProgress, step, status, detail) {
|
|
14
|
+
onProgress?.({ phase: 'analyze', step, status, detail });
|
|
15
|
+
}
|
|
16
|
+
async function fileExists(path) {
|
|
17
|
+
try {
|
|
18
|
+
await access(path);
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Run static analysis on the codebase.
|
|
27
|
+
*
|
|
28
|
+
* Scans the repository, builds a dependency graph, and generates
|
|
29
|
+
* analysis artifacts. No LLM involvement.
|
|
30
|
+
*
|
|
31
|
+
* @throws Error if no spec-gen configuration found
|
|
32
|
+
*/
|
|
33
|
+
export async function specGenAnalyze(options = {}) {
|
|
34
|
+
const startTime = Date.now();
|
|
35
|
+
const rootPath = options.rootPath ?? process.cwd();
|
|
36
|
+
const maxFiles = options.maxFiles ?? 500;
|
|
37
|
+
const excludePatterns = options.excludePatterns ?? [];
|
|
38
|
+
const force = options.force ?? false;
|
|
39
|
+
const outputRelPath = options.outputPath ?? '.spec-gen/analysis/';
|
|
40
|
+
const outputPath = join(rootPath, outputRelPath);
|
|
41
|
+
const { onProgress } = options;
|
|
42
|
+
// Validate config exists
|
|
43
|
+
const specGenConfig = await readSpecGenConfig(rootPath);
|
|
44
|
+
if (!specGenConfig) {
|
|
45
|
+
throw new Error('No spec-gen configuration found. Run specGenInit() first.');
|
|
46
|
+
}
|
|
47
|
+
// Check for existing recent analysis
|
|
48
|
+
if (!force) {
|
|
49
|
+
const repoStructurePath = join(outputPath, 'repo-structure.json');
|
|
50
|
+
if (await fileExists(repoStructurePath)) {
|
|
51
|
+
const stats = await stat(repoStructurePath);
|
|
52
|
+
const age = Date.now() - stats.mtime.getTime();
|
|
53
|
+
const oneHour = 60 * 60 * 1000;
|
|
54
|
+
if (age < oneHour) {
|
|
55
|
+
progress(onProgress, 'Recent analysis exists', 'skip', `${Math.floor(age / 60000)} minutes old`);
|
|
56
|
+
// Load and return existing analysis
|
|
57
|
+
const { readFile } = await import('node:fs/promises');
|
|
58
|
+
const repoStructureContent = await readFile(repoStructurePath, 'utf-8');
|
|
59
|
+
const repoStructure = JSON.parse(repoStructureContent);
|
|
60
|
+
const depGraphPath = join(outputPath, 'dependency-graph.json');
|
|
61
|
+
let depGraph;
|
|
62
|
+
if (await fileExists(depGraphPath)) {
|
|
63
|
+
const depGraphContent = await readFile(depGraphPath, 'utf-8');
|
|
64
|
+
depGraph = JSON.parse(depGraphContent);
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
repoMap: repoStructure,
|
|
68
|
+
depGraph: depGraph ?? {
|
|
69
|
+
nodes: [], edges: [], clusters: [], cycles: [],
|
|
70
|
+
rankings: { byImportance: [], byConnectivity: [], clusterCenters: [], leafNodes: [], bridgeNodes: [], orphanNodes: [] },
|
|
71
|
+
statistics: { nodeCount: 0, edgeCount: 0, clusterCount: 0, cycleCount: 0, avgDegree: 0, density: 0 },
|
|
72
|
+
},
|
|
73
|
+
artifacts: { repoStructure },
|
|
74
|
+
duration: Date.now() - startTime,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Ensure output directory exists
|
|
80
|
+
await mkdir(outputPath, { recursive: true });
|
|
81
|
+
// Phase 1: Repository Mapping
|
|
82
|
+
progress(onProgress, 'Scanning directory structure', 'start');
|
|
83
|
+
const mapper = new RepositoryMapper(rootPath, {
|
|
84
|
+
maxFiles,
|
|
85
|
+
excludePatterns: excludePatterns.length > 0 ? excludePatterns : undefined,
|
|
86
|
+
});
|
|
87
|
+
const repoMap = await mapper.map();
|
|
88
|
+
progress(onProgress, 'Scanning directory structure', 'complete', `${repoMap.summary.analyzedFiles} files`);
|
|
89
|
+
// Phase 2: Dependency Graph
|
|
90
|
+
progress(onProgress, 'Building dependency graph', 'start');
|
|
91
|
+
const graphBuilder = new DependencyGraphBuilder({ rootDir: rootPath });
|
|
92
|
+
const depGraph = await graphBuilder.build(repoMap.allFiles);
|
|
93
|
+
progress(onProgress, 'Building dependency graph', 'complete', `${depGraph.statistics.nodeCount} nodes, ${depGraph.statistics.edgeCount} edges`);
|
|
94
|
+
// Phase 3: Generate Artifacts
|
|
95
|
+
progress(onProgress, 'Generating analysis artifacts', 'start');
|
|
96
|
+
const artifactGenerator = new AnalysisArtifactGenerator({
|
|
97
|
+
rootDir: rootPath,
|
|
98
|
+
outputDir: outputPath,
|
|
99
|
+
maxDeepAnalysisFiles: Math.min(20, Math.ceil(repoMap.highValueFiles.length * 0.3)),
|
|
100
|
+
maxValidationFiles: 5,
|
|
101
|
+
});
|
|
102
|
+
const artifacts = await artifactGenerator.generateAndSave(repoMap, depGraph);
|
|
103
|
+
// Save dependency graph
|
|
104
|
+
await writeFile(join(outputPath, 'dependency-graph.json'), JSON.stringify(depGraph, null, 2));
|
|
105
|
+
progress(onProgress, 'Generating analysis artifacts', 'complete');
|
|
106
|
+
const duration = Date.now() - startTime;
|
|
107
|
+
return { repoMap, depGraph, artifacts, duration };
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=analyze.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/api/analyze.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* spec-gen drift — programmatic API
|
|
3
|
+
*
|
|
4
|
+
* Detects spec drift: finds code changes not reflected in specs.
|
|
5
|
+
* No side effects (no process.exit, no console.log).
|
|
6
|
+
*/
|
|
7
|
+
import type { DriftResult } from '../types/index.js';
|
|
8
|
+
import type { DriftApiOptions } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Detect spec drift in a project.
|
|
11
|
+
*
|
|
12
|
+
* Compares code changes against existing OpenSpec specifications
|
|
13
|
+
* and reports gaps, stale specs, uncovered files, and orphaned specs.
|
|
14
|
+
*
|
|
15
|
+
* @throws Error if not a git repository
|
|
16
|
+
* @throws Error if no spec-gen configuration found
|
|
17
|
+
* @throws Error if no specs found
|
|
18
|
+
* @throws Error if LLM enhanced mode requested but no API key
|
|
19
|
+
*/
|
|
20
|
+
export declare function specGenDrift(options?: DriftApiOptions): Promise<DriftResult>;
|
|
21
|
+
//# sourceMappingURL=drift.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drift.d.ts","sourceRoot":"","sources":["../../src/api/drift.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAcH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAoB,MAAM,YAAY,CAAC;AAepE;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,WAAW,CAAC,CAwHtF"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* spec-gen drift — programmatic API
|
|
3
|
+
*
|
|
4
|
+
* Detects spec drift: finds code changes not reflected in specs.
|
|
5
|
+
* No side effects (no process.exit, no console.log).
|
|
6
|
+
*/
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
import { access } from 'node:fs/promises';
|
|
9
|
+
import { readSpecGenConfig } from '../core/services/config-manager.js';
|
|
10
|
+
import { getChangedFiles, isGitRepository, buildSpecMap, buildADRMap, detectDrift, } from '../core/drift/index.js';
|
|
11
|
+
import { createLLMService } from '../core/services/llm-service.js';
|
|
12
|
+
function progress(onProgress, step, status, detail) {
|
|
13
|
+
onProgress?.({ phase: 'drift', step, status, detail });
|
|
14
|
+
}
|
|
15
|
+
async function fileExists(path) {
|
|
16
|
+
try {
|
|
17
|
+
await access(path);
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Detect spec drift in a project.
|
|
26
|
+
*
|
|
27
|
+
* Compares code changes against existing OpenSpec specifications
|
|
28
|
+
* and reports gaps, stale specs, uncovered files, and orphaned specs.
|
|
29
|
+
*
|
|
30
|
+
* @throws Error if not a git repository
|
|
31
|
+
* @throws Error if no spec-gen configuration found
|
|
32
|
+
* @throws Error if no specs found
|
|
33
|
+
* @throws Error if LLM enhanced mode requested but no API key
|
|
34
|
+
*/
|
|
35
|
+
export async function specGenDrift(options = {}) {
|
|
36
|
+
const startTime = Date.now();
|
|
37
|
+
const rootPath = options.rootPath ?? process.cwd();
|
|
38
|
+
const baseRef = options.baseRef ?? 'auto';
|
|
39
|
+
const files = options.files ?? [];
|
|
40
|
+
const domains = options.domains ?? [];
|
|
41
|
+
const llmEnhanced = options.llmEnhanced ?? false;
|
|
42
|
+
const failOn = options.failOn ?? 'warning';
|
|
43
|
+
const maxFiles = options.maxFiles ?? 100;
|
|
44
|
+
const { onProgress } = options;
|
|
45
|
+
// Validate git repo
|
|
46
|
+
if (!(await isGitRepository(rootPath))) {
|
|
47
|
+
throw new Error('Not a git repository. Drift detection requires git.');
|
|
48
|
+
}
|
|
49
|
+
// Load config
|
|
50
|
+
const specGenConfig = await readSpecGenConfig(rootPath);
|
|
51
|
+
if (!specGenConfig) {
|
|
52
|
+
throw new Error('No spec-gen configuration found. Run specGenInit() first.');
|
|
53
|
+
}
|
|
54
|
+
// Check specs exist
|
|
55
|
+
const openspecPath = join(rootPath, specGenConfig.openspecPath ?? 'openspec');
|
|
56
|
+
const specsPath = join(openspecPath, 'specs');
|
|
57
|
+
if (!(await fileExists(specsPath))) {
|
|
58
|
+
throw new Error('No specs found. Run specGenGenerate() first.');
|
|
59
|
+
}
|
|
60
|
+
// Create LLM service if needed
|
|
61
|
+
let llm;
|
|
62
|
+
if (llmEnhanced) {
|
|
63
|
+
const anthropicKey = process.env.ANTHROPIC_API_KEY;
|
|
64
|
+
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.');
|
|
67
|
+
}
|
|
68
|
+
const provider = options.provider ?? (anthropicKey ? 'anthropic' : 'openai');
|
|
69
|
+
llm = createLLMService({
|
|
70
|
+
provider,
|
|
71
|
+
apiBase: options.apiBase ?? specGenConfig.llm?.apiBase,
|
|
72
|
+
sslVerify: options.sslVerify ?? specGenConfig.llm?.sslVerify ?? true,
|
|
73
|
+
enableLogging: true,
|
|
74
|
+
logDir: join(rootPath, '.spec-gen', 'logs'),
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
// Get changed files
|
|
78
|
+
progress(onProgress, 'Analyzing git changes', 'start');
|
|
79
|
+
const gitResult = await getChangedFiles({
|
|
80
|
+
rootPath,
|
|
81
|
+
baseRef,
|
|
82
|
+
pathFilter: files.length > 0 ? files : undefined,
|
|
83
|
+
includeUnstaged: true,
|
|
84
|
+
});
|
|
85
|
+
progress(onProgress, 'Analyzing git changes', 'complete', `${gitResult.files.length} changed files`);
|
|
86
|
+
if (gitResult.files.length === 0) {
|
|
87
|
+
return {
|
|
88
|
+
timestamp: new Date().toISOString(),
|
|
89
|
+
baseRef: gitResult.resolvedBase,
|
|
90
|
+
totalChangedFiles: 0,
|
|
91
|
+
specRelevantFiles: 0,
|
|
92
|
+
issues: [],
|
|
93
|
+
summary: { gaps: 0, stale: 0, uncovered: 0, orphanedSpecs: 0, adrGaps: 0, adrOrphaned: 0, total: 0 },
|
|
94
|
+
hasDrift: false,
|
|
95
|
+
duration: Date.now() - startTime,
|
|
96
|
+
mode: 'static',
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
// Apply max-files limit
|
|
100
|
+
const actualChangedFiles = gitResult.files.length;
|
|
101
|
+
if (gitResult.files.length > maxFiles) {
|
|
102
|
+
gitResult.files = gitResult.files.slice(0, maxFiles);
|
|
103
|
+
}
|
|
104
|
+
// Build spec map
|
|
105
|
+
progress(onProgress, 'Loading spec mappings', 'start');
|
|
106
|
+
const repoStructurePath = join(rootPath, '.spec-gen', 'analysis', 'repo-structure.json');
|
|
107
|
+
const hasRepoStructure = await fileExists(repoStructurePath);
|
|
108
|
+
const specMap = await buildSpecMap({
|
|
109
|
+
rootPath,
|
|
110
|
+
openspecPath,
|
|
111
|
+
repoStructurePath: hasRepoStructure ? repoStructurePath : undefined,
|
|
112
|
+
});
|
|
113
|
+
// Build ADR map
|
|
114
|
+
const adrMap = await buildADRMap({
|
|
115
|
+
rootPath,
|
|
116
|
+
openspecPath,
|
|
117
|
+
repoStructurePath: hasRepoStructure ? repoStructurePath : undefined,
|
|
118
|
+
});
|
|
119
|
+
progress(onProgress, 'Loading spec mappings', 'complete', `${specMap.domainCount} domains`);
|
|
120
|
+
// Detect drift
|
|
121
|
+
progress(onProgress, 'Detecting drift', 'start');
|
|
122
|
+
const result = await detectDrift({
|
|
123
|
+
rootPath,
|
|
124
|
+
specMap,
|
|
125
|
+
changedFiles: gitResult.files,
|
|
126
|
+
failOn,
|
|
127
|
+
domainFilter: domains.length > 0 ? domains : undefined,
|
|
128
|
+
openspecRelPath: specGenConfig.openspecPath ?? 'openspec',
|
|
129
|
+
llm,
|
|
130
|
+
baseRef: gitResult.resolvedBase,
|
|
131
|
+
adrMap: adrMap ?? undefined,
|
|
132
|
+
});
|
|
133
|
+
result.baseRef = gitResult.resolvedBase;
|
|
134
|
+
result.totalChangedFiles = actualChangedFiles;
|
|
135
|
+
progress(onProgress, 'Detecting drift', 'complete', `${result.summary.total} issues`);
|
|
136
|
+
// Save LLM logs if applicable
|
|
137
|
+
if (llm) {
|
|
138
|
+
try {
|
|
139
|
+
await llm.saveLogs();
|
|
140
|
+
}
|
|
141
|
+
catch { /* best-effort */ }
|
|
142
|
+
}
|
|
143
|
+
return result;
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=drift.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drift.js","sourceRoot":"","sources":["../../src/api/drift.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* spec-gen generate — programmatic API
|
|
3
|
+
*
|
|
4
|
+
* Generates OpenSpec specification files from analysis results using LLM.
|
|
5
|
+
* No side effects (no process.exit, no console.log).
|
|
6
|
+
*/
|
|
7
|
+
import type { GenerateApiOptions, GenerateResult } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Generate OpenSpec specification files from analysis results using LLM.
|
|
10
|
+
*
|
|
11
|
+
* @throws Error if no spec-gen configuration found
|
|
12
|
+
* @throws Error if no analysis found
|
|
13
|
+
* @throws Error if no LLM API key found
|
|
14
|
+
* @throws Error if LLM API connectivity fails
|
|
15
|
+
* @throws Error if pipeline fails
|
|
16
|
+
*/
|
|
17
|
+
export declare function specGenGenerate(options?: GenerateApiOptions): Promise<GenerateResult>;
|
|
18
|
+
//# sourceMappingURL=generate.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* spec-gen generate — programmatic API
|
|
3
|
+
*
|
|
4
|
+
* Generates OpenSpec specification files from analysis results using LLM.
|
|
5
|
+
* No side effects (no process.exit, no console.log).
|
|
6
|
+
*/
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
import { access, readFile } from 'node:fs/promises';
|
|
9
|
+
import { readSpecGenConfig, readOpenSpecConfig, } from '../core/services/config-manager.js';
|
|
10
|
+
import { createLLMService } from '../core/services/llm-service.js';
|
|
11
|
+
import { SpecGenerationPipeline } from '../core/generator/spec-pipeline.js';
|
|
12
|
+
import { OpenSpecFormatGenerator } from '../core/generator/openspec-format-generator.js';
|
|
13
|
+
import { OpenSpecWriter } from '../core/generator/openspec-writer.js';
|
|
14
|
+
import { ADRGenerator } from '../core/generator/adr-generator.js';
|
|
15
|
+
import { MappingGenerator } from '../core/generator/mapping-generator.js';
|
|
16
|
+
function progress(onProgress, step, status, detail) {
|
|
17
|
+
onProgress?.({ phase: 'generate', step, status, detail });
|
|
18
|
+
}
|
|
19
|
+
async function fileExists(path) {
|
|
20
|
+
try {
|
|
21
|
+
await access(path);
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async function loadAnalysisData(analysisPath) {
|
|
29
|
+
const repoStructurePath = join(analysisPath, 'repo-structure.json');
|
|
30
|
+
if (!(await fileExists(repoStructurePath))) {
|
|
31
|
+
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
|
+
}
|
|
54
|
+
return { repoStructure, llmContext, depGraph };
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Generate OpenSpec specification files from analysis results using LLM.
|
|
58
|
+
*
|
|
59
|
+
* @throws Error if no spec-gen configuration found
|
|
60
|
+
* @throws Error if no analysis found
|
|
61
|
+
* @throws Error if no LLM API key found
|
|
62
|
+
* @throws Error if LLM API connectivity fails
|
|
63
|
+
* @throws Error if pipeline fails
|
|
64
|
+
*/
|
|
65
|
+
export async function specGenGenerate(options = {}) {
|
|
66
|
+
const startTime = Date.now();
|
|
67
|
+
const rootPath = options.rootPath ?? process.cwd();
|
|
68
|
+
const analysisRelPath = options.analysisPath ?? '.spec-gen/analysis/';
|
|
69
|
+
const analysisPath = join(rootPath, analysisRelPath);
|
|
70
|
+
const { onProgress } = options;
|
|
71
|
+
// Load config
|
|
72
|
+
progress(onProgress, 'Loading configuration', 'start');
|
|
73
|
+
const specGenConfig = await readSpecGenConfig(rootPath);
|
|
74
|
+
if (!specGenConfig) {
|
|
75
|
+
throw new Error('No spec-gen configuration found. Run specGenInit() first.');
|
|
76
|
+
}
|
|
77
|
+
const openspecRelPath = specGenConfig.openspecPath ?? 'openspec';
|
|
78
|
+
const fullOpenspecPath = join(rootPath, openspecRelPath);
|
|
79
|
+
await readOpenSpecConfig(fullOpenspecPath); // Ensure it's readable
|
|
80
|
+
progress(onProgress, 'Loading configuration', 'complete');
|
|
81
|
+
// Load analysis
|
|
82
|
+
progress(onProgress, 'Loading analysis', 'start');
|
|
83
|
+
const analysisData = await loadAnalysisData(analysisPath);
|
|
84
|
+
if (!analysisData) {
|
|
85
|
+
throw new Error('No analysis found. Run specGenAnalyze() first.');
|
|
86
|
+
}
|
|
87
|
+
const { repoStructure, llmContext, depGraph } = analysisData;
|
|
88
|
+
progress(onProgress, 'Loading analysis', 'complete', `${repoStructure.statistics.analyzedFiles} files`);
|
|
89
|
+
// Resolve provider
|
|
90
|
+
const anthropicKey = process.env.ANTHROPIC_API_KEY;
|
|
91
|
+
const openaiKey = process.env.OPENAI_API_KEY;
|
|
92
|
+
const openaiCompatKey = process.env.OPENAI_COMPAT_API_KEY;
|
|
93
|
+
const geminiKey = process.env.GEMINI_API_KEY;
|
|
94
|
+
if (!anthropicKey && !openaiKey && !openaiCompatKey && !geminiKey) {
|
|
95
|
+
throw new Error('No LLM API key found. Set ANTHROPIC_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY, or OPENAI_COMPAT_API_KEY.');
|
|
96
|
+
}
|
|
97
|
+
const envDetectedProvider = anthropicKey ? 'anthropic'
|
|
98
|
+
: geminiKey ? 'gemini'
|
|
99
|
+
: openaiCompatKey ? 'openai-compat'
|
|
100
|
+
: 'openai';
|
|
101
|
+
const effectiveProvider = options.provider ?? specGenConfig.generation.provider ?? envDetectedProvider;
|
|
102
|
+
const defaultModels = {
|
|
103
|
+
anthropic: 'claude-sonnet-4-20250514',
|
|
104
|
+
gemini: 'gemini-2.0-flash',
|
|
105
|
+
'openai-compat': 'mistral-large-latest',
|
|
106
|
+
openai: 'gpt-4o',
|
|
107
|
+
};
|
|
108
|
+
const effectiveModel = options.model || specGenConfig.generation.model || defaultModels[effectiveProvider];
|
|
109
|
+
const rootConfig = specGenConfig;
|
|
110
|
+
const effectiveBaseUrl = options.openaiCompatBaseUrl
|
|
111
|
+
?? process.env.OPENAI_COMPAT_BASE_URL
|
|
112
|
+
?? specGenConfig.generation.openaiCompatBaseUrl
|
|
113
|
+
?? rootConfig['openaiCompatBaseUrl'];
|
|
114
|
+
// Apply SSL verification setting
|
|
115
|
+
const sslVerify = options.sslVerify ?? specGenConfig.llm?.sslVerify ?? true;
|
|
116
|
+
if (!sslVerify || specGenConfig.generation.skipSslVerify || specGenConfig.embedding?.skipSslVerify) {
|
|
117
|
+
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
|
|
118
|
+
}
|
|
119
|
+
// Create LLM service
|
|
120
|
+
progress(onProgress, 'Creating LLM service', 'start');
|
|
121
|
+
let llm;
|
|
122
|
+
try {
|
|
123
|
+
llm = createLLMService({
|
|
124
|
+
provider: effectiveProvider,
|
|
125
|
+
model: effectiveModel,
|
|
126
|
+
openaiCompatBaseUrl: effectiveBaseUrl,
|
|
127
|
+
apiBase: options.apiBase ?? specGenConfig.llm?.apiBase,
|
|
128
|
+
sslVerify,
|
|
129
|
+
enableLogging: true,
|
|
130
|
+
logDir: join(rootPath, '.spec-gen', 'logs'),
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
throw new Error(`Failed to create LLM service: ${error.message}`);
|
|
135
|
+
}
|
|
136
|
+
progress(onProgress, 'Creating LLM service', 'complete', `${effectiveProvider}/${effectiveModel}`);
|
|
137
|
+
// Dry run — return empty result
|
|
138
|
+
if (options.dryRun) {
|
|
139
|
+
progress(onProgress, 'Dry run complete', 'complete');
|
|
140
|
+
return {
|
|
141
|
+
report: {
|
|
142
|
+
timestamp: new Date().toISOString(),
|
|
143
|
+
openspecVersion: specGenConfig.version ?? '1.0.0',
|
|
144
|
+
specGenVersion: '1.0.0',
|
|
145
|
+
filesWritten: [],
|
|
146
|
+
filesSkipped: [],
|
|
147
|
+
filesBackedUp: [],
|
|
148
|
+
filesMerged: [],
|
|
149
|
+
configUpdated: false,
|
|
150
|
+
validationErrors: [],
|
|
151
|
+
warnings: [],
|
|
152
|
+
nextSteps: ['Run without --dry-run to generate specs'],
|
|
153
|
+
},
|
|
154
|
+
pipelineResult: {},
|
|
155
|
+
duration: Date.now() - startTime,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
// Run pipeline
|
|
159
|
+
progress(onProgress, 'Running LLM generation pipeline', 'start');
|
|
160
|
+
const adr = options.adr ?? false;
|
|
161
|
+
const adrOnly = options.adrOnly ?? false;
|
|
162
|
+
const pipeline = new SpecGenerationPipeline(llm, {
|
|
163
|
+
outputDir: join(rootPath, '.spec-gen', 'generation'),
|
|
164
|
+
saveIntermediate: true,
|
|
165
|
+
generateADRs: adr || adrOnly,
|
|
166
|
+
});
|
|
167
|
+
let pipelineResult;
|
|
168
|
+
try {
|
|
169
|
+
pipelineResult = await pipeline.run(repoStructure, llmContext, depGraph);
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
await llm.saveLogs().catch(() => { });
|
|
173
|
+
throw new Error(`Pipeline failed: ${error.message}`);
|
|
174
|
+
}
|
|
175
|
+
progress(onProgress, 'Running LLM generation pipeline', 'complete');
|
|
176
|
+
// Format specs
|
|
177
|
+
progress(onProgress, 'Formatting specifications', 'start');
|
|
178
|
+
const formatGenerator = new OpenSpecFormatGenerator({
|
|
179
|
+
version: specGenConfig.version,
|
|
180
|
+
includeConfidence: true,
|
|
181
|
+
includeTechnicalNotes: true,
|
|
182
|
+
});
|
|
183
|
+
let generatedSpecs = adrOnly ? [] : formatGenerator.generateSpecs(pipelineResult);
|
|
184
|
+
// Filter by domains
|
|
185
|
+
if (!adrOnly && options.domains && options.domains.length > 0) {
|
|
186
|
+
const domainSet = new Set(options.domains.map(d => d.toLowerCase()));
|
|
187
|
+
generatedSpecs = generatedSpecs.filter(spec => spec.type === 'overview' || spec.type === 'architecture' || domainSet.has(spec.domain.toLowerCase()));
|
|
188
|
+
}
|
|
189
|
+
// Generate ADRs
|
|
190
|
+
if (adr || adrOnly) {
|
|
191
|
+
const adrGenerator = new ADRGenerator({
|
|
192
|
+
version: specGenConfig.version,
|
|
193
|
+
includeMermaid: true,
|
|
194
|
+
});
|
|
195
|
+
const adrSpecs = adrGenerator.generateADRs(pipelineResult);
|
|
196
|
+
generatedSpecs.push(...adrSpecs);
|
|
197
|
+
}
|
|
198
|
+
progress(onProgress, 'Formatting specifications', 'complete', `${generatedSpecs.length} files`);
|
|
199
|
+
// Write specs
|
|
200
|
+
progress(onProgress, 'Writing OpenSpec files', 'start');
|
|
201
|
+
const writeMode = options.writeMode ?? 'replace';
|
|
202
|
+
const writer = new OpenSpecWriter({
|
|
203
|
+
rootPath,
|
|
204
|
+
writeMode,
|
|
205
|
+
version: specGenConfig.version,
|
|
206
|
+
createBackups: true,
|
|
207
|
+
updateConfig: true,
|
|
208
|
+
validateBeforeWrite: true,
|
|
209
|
+
});
|
|
210
|
+
const report = await writer.writeSpecs(generatedSpecs, pipelineResult.survey);
|
|
211
|
+
progress(onProgress, 'Writing OpenSpec files', 'complete', `${report.filesWritten.length} written`);
|
|
212
|
+
// Generate mapping artifact
|
|
213
|
+
if ((options.mapping ?? true) && depGraph) {
|
|
214
|
+
try {
|
|
215
|
+
let semanticSearch;
|
|
216
|
+
const analysisDir = join(rootPath, '.spec-gen', 'analysis');
|
|
217
|
+
const { VectorIndex } = await import('../core/analyzer/vector-index.js');
|
|
218
|
+
if (VectorIndex.exists(analysisDir)) {
|
|
219
|
+
const { EmbeddingService } = await import('../core/analyzer/embedding-service.js');
|
|
220
|
+
let embedSvc;
|
|
221
|
+
try {
|
|
222
|
+
embedSvc = EmbeddingService.fromEnv();
|
|
223
|
+
}
|
|
224
|
+
catch { /* no env config */ }
|
|
225
|
+
if (!embedSvc) {
|
|
226
|
+
const svc = EmbeddingService.fromConfig(specGenConfig);
|
|
227
|
+
if (svc)
|
|
228
|
+
embedSvc = svc;
|
|
229
|
+
}
|
|
230
|
+
if (embedSvc) {
|
|
231
|
+
const svc = embedSvc;
|
|
232
|
+
semanticSearch = (query, limit) => VectorIndex.search(analysisDir, query, svc, { limit });
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
const mapper = new MappingGenerator(rootPath, openspecRelPath, semanticSearch);
|
|
236
|
+
await mapper.generate(pipelineResult, depGraph);
|
|
237
|
+
progress(onProgress, 'Generating mapping artifact', 'complete');
|
|
238
|
+
}
|
|
239
|
+
catch {
|
|
240
|
+
// Non-fatal
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
// Save LLM logs
|
|
244
|
+
await llm.saveLogs().catch(() => { });
|
|
245
|
+
return {
|
|
246
|
+
report,
|
|
247
|
+
pipelineResult,
|
|
248
|
+
duration: Date.now() - startTime,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/api/generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* spec-gen Programmatic API
|
|
3
|
+
*
|
|
4
|
+
* This is the public API surface for spec-gen. Consumers (like OpenSpec CLI)
|
|
5
|
+
* can import these functions to use spec-gen as a library.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { specGenRun, specGenDrift } from 'spec-gen';
|
|
10
|
+
*
|
|
11
|
+
* // Run the full pipeline
|
|
12
|
+
* const result = await specGenRun({
|
|
13
|
+
* rootPath: '/path/to/project',
|
|
14
|
+
* onProgress: (event) => console.log(event.step),
|
|
15
|
+
* });
|
|
16
|
+
*
|
|
17
|
+
* // Check for drift
|
|
18
|
+
* const drift = await specGenDrift({ rootPath: '/path/to/project' });
|
|
19
|
+
* if (drift.hasDrift) {
|
|
20
|
+
* console.warn(`${drift.summary.total} drift issues found`);
|
|
21
|
+
* }
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export { specGenInit } from './init.js';
|
|
25
|
+
export { specGenAnalyze } from './analyze.js';
|
|
26
|
+
export { specGenGenerate } from './generate.js';
|
|
27
|
+
export { specGenVerify } from './verify.js';
|
|
28
|
+
export { specGenDrift } from './drift.js';
|
|
29
|
+
export { specGenRun } from './run.js';
|
|
30
|
+
export { specGenGetSpecRequirements } from './specs.js';
|
|
31
|
+
export type { ProgressCallback, ProgressEvent, BaseOptions, InitApiOptions, InitResult, AnalyzeApiOptions, AnalyzeResult, GenerateApiOptions, GenerateResult, VerifyApiOptions, VerifyResult, DriftApiOptions, RunApiOptions, RunResult, } from './types.js';
|
|
32
|
+
export type { DriftResult, DriftSeverity, SpecGenConfig } from '../types/index.js';
|
|
33
|
+
export type { RepositoryMap } from './types.js';
|
|
34
|
+
export type { DependencyGraphResult } from '../core/analyzer/dependency-graph.js';
|
|
35
|
+
export type { PipelineResult } from '../core/generator/spec-pipeline.js';
|
|
36
|
+
export type { GenerationReport } from '../core/generator/openspec-writer.js';
|
|
37
|
+
export type { VerificationReport } from '../core/verifier/verification-engine.js';
|
|
38
|
+
export type { SpecRequirement } from './specs.js';
|
|
39
|
+
//# sourceMappingURL=index.d.ts.map
|