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 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAGxD,YAAY,EACV,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,aAAa,EACb,SAAS,GACV,MAAM,YAAY,CAAC;AAGpB,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACnF,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,YAAY,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAClF,YAAY,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,YAAY,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,YAAY,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAClF,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
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
|
+
// API functions
|
|
25
|
+
export { specGenInit } from './init.js';
|
|
26
|
+
export { specGenAnalyze } from './analyze.js';
|
|
27
|
+
export { specGenGenerate } from './generate.js';
|
|
28
|
+
export { specGenVerify } from './verify.js';
|
|
29
|
+
export { specGenDrift } from './drift.js';
|
|
30
|
+
export { specGenRun } from './run.js';
|
|
31
|
+
export { specGenGetSpecRequirements } from './specs.js';
|
|
32
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,gBAAgB;AAChB,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* spec-gen init — programmatic API
|
|
3
|
+
*
|
|
4
|
+
* Detects project type and creates spec-gen configuration.
|
|
5
|
+
* No side effects (no process.exit, no console.log).
|
|
6
|
+
*/
|
|
7
|
+
import type { InitApiOptions, InitResult } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Initialize spec-gen in a project directory.
|
|
10
|
+
*
|
|
11
|
+
* Creates `.spec-gen/config.json`, the `openspec/` directory structure,
|
|
12
|
+
* and updates `.gitignore`.
|
|
13
|
+
*
|
|
14
|
+
* @throws Error if openspec path is outside project root
|
|
15
|
+
* @throws Error if config exists and force is false
|
|
16
|
+
*/
|
|
17
|
+
export declare function specGenInit(options?: InitApiOptions): Promise<InitResult>;
|
|
18
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +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"}
|
package/dist/api/init.js
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* spec-gen init — programmatic API
|
|
3
|
+
*
|
|
4
|
+
* Detects project type and creates spec-gen configuration.
|
|
5
|
+
* No side effects (no process.exit, no console.log).
|
|
6
|
+
*/
|
|
7
|
+
import { resolve, relative } from 'node:path';
|
|
8
|
+
import { detectProjectType, getProjectTypeName, } from '../core/services/project-detector.js';
|
|
9
|
+
import { getDefaultConfig, writeSpecGenConfig, specGenConfigExists, openspecDirExists, createOpenSpecStructure, } from '../core/services/config-manager.js';
|
|
10
|
+
import { gitignoreExists, isInGitignore, addToGitignore, } from '../core/services/gitignore-manager.js';
|
|
11
|
+
function progress(onProgress, step, status, detail) {
|
|
12
|
+
onProgress?.({ phase: 'init', step, status, detail });
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Initialize spec-gen in a project directory.
|
|
16
|
+
*
|
|
17
|
+
* Creates `.spec-gen/config.json`, the `openspec/` directory structure,
|
|
18
|
+
* and updates `.gitignore`.
|
|
19
|
+
*
|
|
20
|
+
* @throws Error if openspec path is outside project root
|
|
21
|
+
* @throws Error if config exists and force is false
|
|
22
|
+
*/
|
|
23
|
+
export async function specGenInit(options = {}) {
|
|
24
|
+
const rootPath = options.rootPath ?? process.cwd();
|
|
25
|
+
const openspecRelPath = options.openspecPath ?? './openspec';
|
|
26
|
+
const openspecFullPath = resolve(rootPath, openspecRelPath);
|
|
27
|
+
const force = options.force ?? false;
|
|
28
|
+
const { onProgress } = options;
|
|
29
|
+
// Validate path traversal
|
|
30
|
+
const relPath = relative(rootPath, openspecFullPath);
|
|
31
|
+
if (relPath.startsWith('..')) {
|
|
32
|
+
throw new Error('OpenSpec path must be within the project directory.');
|
|
33
|
+
}
|
|
34
|
+
// Detect project type
|
|
35
|
+
progress(onProgress, 'Detecting project type', 'start');
|
|
36
|
+
const detection = await detectProjectType(rootPath);
|
|
37
|
+
const projectType = getProjectTypeName(detection.projectType);
|
|
38
|
+
progress(onProgress, 'Detecting project type', 'complete', projectType);
|
|
39
|
+
// Check existing config
|
|
40
|
+
const configExists = await specGenConfigExists(rootPath);
|
|
41
|
+
if (configExists && !force) {
|
|
42
|
+
progress(onProgress, 'Configuration exists', 'skip');
|
|
43
|
+
return {
|
|
44
|
+
configPath: '.spec-gen/config.json',
|
|
45
|
+
openspecPath: openspecRelPath,
|
|
46
|
+
projectType,
|
|
47
|
+
created: false,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
// Create config
|
|
51
|
+
progress(onProgress, 'Creating configuration', 'start');
|
|
52
|
+
const config = getDefaultConfig(detection.projectType, openspecRelPath);
|
|
53
|
+
await writeSpecGenConfig(rootPath, config);
|
|
54
|
+
progress(onProgress, 'Creating configuration', 'complete');
|
|
55
|
+
// Create openspec directory
|
|
56
|
+
const hasOpenspec = await openspecDirExists(openspecFullPath);
|
|
57
|
+
if (!hasOpenspec) {
|
|
58
|
+
progress(onProgress, 'Creating openspec directory', 'start');
|
|
59
|
+
await createOpenSpecStructure(openspecFullPath);
|
|
60
|
+
progress(onProgress, 'Creating openspec directory', 'complete');
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
progress(onProgress, 'OpenSpec directory exists', 'skip');
|
|
64
|
+
}
|
|
65
|
+
// Update .gitignore
|
|
66
|
+
const hasGitignore = await gitignoreExists(rootPath);
|
|
67
|
+
if (hasGitignore) {
|
|
68
|
+
const alreadyIgnored = await isInGitignore(rootPath, '.spec-gen/');
|
|
69
|
+
if (!alreadyIgnored) {
|
|
70
|
+
progress(onProgress, 'Updating .gitignore', 'start');
|
|
71
|
+
await addToGitignore(rootPath, '.spec-gen/', 'spec-gen analysis artifacts');
|
|
72
|
+
progress(onProgress, 'Updating .gitignore', 'complete');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
configPath: '.spec-gen/config.json',
|
|
77
|
+
openspecPath: openspecRelPath,
|
|
78
|
+
projectType,
|
|
79
|
+
created: true,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/api/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* spec-gen run — programmatic API
|
|
3
|
+
*
|
|
4
|
+
* Runs the full pipeline: init → analyze → generate.
|
|
5
|
+
* Smart defaults skip unnecessary steps.
|
|
6
|
+
* No side effects (no process.exit, no console.log).
|
|
7
|
+
*/
|
|
8
|
+
import type { RunApiOptions, RunResult } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Run the full spec-gen pipeline: init → analyze → generate.
|
|
11
|
+
*
|
|
12
|
+
* Uses smart defaults to skip unnecessary steps (e.g., skips init
|
|
13
|
+
* if config exists, skips analysis if recent).
|
|
14
|
+
*
|
|
15
|
+
* @throws Error if no LLM API key found
|
|
16
|
+
* @throws Error if pipeline fails
|
|
17
|
+
*/
|
|
18
|
+
export declare function specGenRun(options?: RunApiOptions): Promise<RunResult>;
|
|
19
|
+
//# sourceMappingURL=run.d.ts.map
|
|
@@ -0,0 +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"}
|
package/dist/api/run.js
ADDED
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* spec-gen run — programmatic API
|
|
3
|
+
*
|
|
4
|
+
* Runs the full pipeline: init → analyze → generate.
|
|
5
|
+
* Smart defaults skip unnecessary steps.
|
|
6
|
+
* No side effects (no process.exit, no console.log).
|
|
7
|
+
*/
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
import { access, stat, readFile, mkdir, writeFile } from 'node:fs/promises';
|
|
10
|
+
import { detectProjectType, getProjectTypeName, } from '../core/services/project-detector.js';
|
|
11
|
+
import { getDefaultConfig, readSpecGenConfig, writeSpecGenConfig, specGenConfigExists, openspecDirExists, createOpenSpecStructure, } from '../core/services/config-manager.js';
|
|
12
|
+
import { gitignoreExists, isInGitignore, addToGitignore, } from '../core/services/gitignore-manager.js';
|
|
13
|
+
import { createLLMService } from '../core/services/llm-service.js';
|
|
14
|
+
import { RepositoryMapper } from '../core/analyzer/repository-mapper.js';
|
|
15
|
+
import { DependencyGraphBuilder } from '../core/analyzer/dependency-graph.js';
|
|
16
|
+
import { AnalysisArtifactGenerator } from '../core/analyzer/artifact-generator.js';
|
|
17
|
+
import { SpecGenerationPipeline } from '../core/generator/spec-pipeline.js';
|
|
18
|
+
import { OpenSpecFormatGenerator } from '../core/generator/openspec-format-generator.js';
|
|
19
|
+
import { OpenSpecWriter } from '../core/generator/openspec-writer.js';
|
|
20
|
+
import { ADRGenerator } from '../core/generator/adr-generator.js';
|
|
21
|
+
function progress(onProgress, step, status, detail) {
|
|
22
|
+
onProgress?.({ phase: 'run', step, status, detail });
|
|
23
|
+
}
|
|
24
|
+
async function fileExists(path) {
|
|
25
|
+
try {
|
|
26
|
+
await access(path);
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Run the full spec-gen pipeline: init → analyze → generate.
|
|
35
|
+
*
|
|
36
|
+
* Uses smart defaults to skip unnecessary steps (e.g., skips init
|
|
37
|
+
* if config exists, skips analysis if recent).
|
|
38
|
+
*
|
|
39
|
+
* @throws Error if no LLM API key found
|
|
40
|
+
* @throws Error if pipeline fails
|
|
41
|
+
*/
|
|
42
|
+
export async function specGenRun(options = {}) {
|
|
43
|
+
const startTime = Date.now();
|
|
44
|
+
const rootPath = options.rootPath ?? process.cwd();
|
|
45
|
+
const force = options.force ?? false;
|
|
46
|
+
const reanalyze = options.reanalyze ?? false;
|
|
47
|
+
const maxFiles = options.maxFiles ?? 500;
|
|
48
|
+
const adr = options.adr ?? false;
|
|
49
|
+
const { onProgress } = options;
|
|
50
|
+
// ========================================================================
|
|
51
|
+
// STEP 1: INITIALIZATION
|
|
52
|
+
// ========================================================================
|
|
53
|
+
progress(onProgress, 'Initialization', 'start');
|
|
54
|
+
const detection = await detectProjectType(rootPath);
|
|
55
|
+
const projectType = getProjectTypeName(detection.projectType);
|
|
56
|
+
let initResult;
|
|
57
|
+
const configExists = await specGenConfigExists(rootPath);
|
|
58
|
+
let specGenConfig = configExists ? await readSpecGenConfig(rootPath) : null;
|
|
59
|
+
if (configExists && !force) {
|
|
60
|
+
initResult = {
|
|
61
|
+
configPath: '.spec-gen/config.json',
|
|
62
|
+
openspecPath: specGenConfig?.openspecPath ?? './openspec',
|
|
63
|
+
projectType,
|
|
64
|
+
created: false,
|
|
65
|
+
};
|
|
66
|
+
progress(onProgress, 'Initialization', 'skip', 'Config exists');
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
const openspecPath = './openspec';
|
|
70
|
+
specGenConfig = getDefaultConfig(detection.projectType, openspecPath);
|
|
71
|
+
await writeSpecGenConfig(rootPath, specGenConfig);
|
|
72
|
+
const fullOpenspecPath = join(rootPath, openspecPath);
|
|
73
|
+
if (!(await openspecDirExists(fullOpenspecPath))) {
|
|
74
|
+
await createOpenSpecStructure(fullOpenspecPath);
|
|
75
|
+
}
|
|
76
|
+
const hasGitignore = await gitignoreExists(rootPath);
|
|
77
|
+
if (hasGitignore) {
|
|
78
|
+
const alreadyIgnored = await isInGitignore(rootPath, '.spec-gen/');
|
|
79
|
+
if (!alreadyIgnored) {
|
|
80
|
+
await addToGitignore(rootPath, '.spec-gen/', 'spec-gen analysis artifacts');
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
initResult = {
|
|
84
|
+
configPath: '.spec-gen/config.json',
|
|
85
|
+
openspecPath: openspecPath,
|
|
86
|
+
projectType,
|
|
87
|
+
created: true,
|
|
88
|
+
};
|
|
89
|
+
progress(onProgress, 'Initialization', 'complete');
|
|
90
|
+
}
|
|
91
|
+
// Ensure we have config
|
|
92
|
+
if (!specGenConfig) {
|
|
93
|
+
specGenConfig = await readSpecGenConfig(rootPath);
|
|
94
|
+
if (!specGenConfig) {
|
|
95
|
+
throw new Error('Failed to load configuration');
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// ========================================================================
|
|
99
|
+
// STEP 2: ANALYSIS
|
|
100
|
+
// ========================================================================
|
|
101
|
+
progress(onProgress, 'Analysis', 'start');
|
|
102
|
+
const analysisPath = join(rootPath, '.spec-gen', 'analysis');
|
|
103
|
+
let analyzeResult;
|
|
104
|
+
// Check for existing recent analysis
|
|
105
|
+
const repoStructurePath = join(analysisPath, 'repo-structure.json');
|
|
106
|
+
let useExisting = false;
|
|
107
|
+
if (await fileExists(repoStructurePath)) {
|
|
108
|
+
const stats = await stat(repoStructurePath);
|
|
109
|
+
const age = Date.now() - stats.mtime.getTime();
|
|
110
|
+
const oneHour = 60 * 60 * 1000;
|
|
111
|
+
if (age < oneHour && !reanalyze && !force) {
|
|
112
|
+
useExisting = true;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
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);
|
|
123
|
+
}
|
|
124
|
+
analyzeResult = {
|
|
125
|
+
repoMap: repoStructure,
|
|
126
|
+
depGraph: depGraph ?? { nodes: [], edges: [], statistics: { nodeCount: 0, edgeCount: 0, clusterCount: 0, cycleCount: 0, avgDegree: 0 } },
|
|
127
|
+
artifacts: { repoStructure },
|
|
128
|
+
duration: 0,
|
|
129
|
+
};
|
|
130
|
+
progress(onProgress, 'Analysis', 'skip', 'Recent analysis exists');
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
await mkdir(analysisPath, { recursive: true });
|
|
134
|
+
const mapper = new RepositoryMapper(rootPath, { maxFiles });
|
|
135
|
+
const repoMap = await mapper.map();
|
|
136
|
+
const graphBuilder = new DependencyGraphBuilder({ rootDir: rootPath });
|
|
137
|
+
const depGraph = await graphBuilder.build(repoMap.allFiles);
|
|
138
|
+
const artifactGenerator = new AnalysisArtifactGenerator({
|
|
139
|
+
rootDir: rootPath,
|
|
140
|
+
outputDir: analysisPath,
|
|
141
|
+
maxDeepAnalysisFiles: Math.min(20, Math.ceil(repoMap.highValueFiles.length * 0.3)),
|
|
142
|
+
maxValidationFiles: 5,
|
|
143
|
+
});
|
|
144
|
+
const artifacts = await artifactGenerator.generateAndSave(repoMap, depGraph);
|
|
145
|
+
await writeFile(join(analysisPath, 'dependency-graph.json'), JSON.stringify(depGraph, null, 2));
|
|
146
|
+
analyzeResult = {
|
|
147
|
+
repoMap,
|
|
148
|
+
depGraph,
|
|
149
|
+
artifacts,
|
|
150
|
+
duration: Date.now() - startTime,
|
|
151
|
+
};
|
|
152
|
+
progress(onProgress, 'Analysis', 'complete', `${repoMap.summary.analyzedFiles} files`);
|
|
153
|
+
}
|
|
154
|
+
// ========================================================================
|
|
155
|
+
// STEP 3: GENERATION
|
|
156
|
+
// ========================================================================
|
|
157
|
+
if (options.dryRun) {
|
|
158
|
+
progress(onProgress, 'Generation', 'skip', 'Dry run');
|
|
159
|
+
return {
|
|
160
|
+
init: initResult,
|
|
161
|
+
analysis: analyzeResult,
|
|
162
|
+
generation: {
|
|
163
|
+
report: {
|
|
164
|
+
timestamp: new Date().toISOString(),
|
|
165
|
+
openspecVersion: specGenConfig?.version ?? '1.0.0',
|
|
166
|
+
specGenVersion: '1.0.0',
|
|
167
|
+
filesWritten: [],
|
|
168
|
+
filesSkipped: [],
|
|
169
|
+
filesBackedUp: [],
|
|
170
|
+
filesMerged: [],
|
|
171
|
+
configUpdated: false,
|
|
172
|
+
validationErrors: [],
|
|
173
|
+
warnings: [],
|
|
174
|
+
nextSteps: ['Run without --dry-run to generate specs'],
|
|
175
|
+
},
|
|
176
|
+
pipelineResult: {},
|
|
177
|
+
duration: 0,
|
|
178
|
+
},
|
|
179
|
+
duration: Date.now() - startTime,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
progress(onProgress, 'Generation', 'start');
|
|
183
|
+
// Check for API key
|
|
184
|
+
const anthropicKey = process.env.ANTHROPIC_API_KEY;
|
|
185
|
+
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.');
|
|
188
|
+
}
|
|
189
|
+
// Create LLM service
|
|
190
|
+
const provider = options.provider ?? (anthropicKey ? 'anthropic' : 'openai');
|
|
191
|
+
const model = options.model ?? 'claude-sonnet-4-20250514';
|
|
192
|
+
let llm;
|
|
193
|
+
try {
|
|
194
|
+
llm = createLLMService({
|
|
195
|
+
provider,
|
|
196
|
+
model,
|
|
197
|
+
apiBase: options.apiBase ?? specGenConfig.llm?.apiBase,
|
|
198
|
+
sslVerify: options.sslVerify ?? specGenConfig.llm?.sslVerify ?? true,
|
|
199
|
+
openaiCompatBaseUrl: options.openaiCompatBaseUrl,
|
|
200
|
+
enableLogging: true,
|
|
201
|
+
logDir: join(rootPath, '.spec-gen', 'logs'),
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
catch (error) {
|
|
205
|
+
throw new Error(`Failed to create LLM service: ${error.message}`);
|
|
206
|
+
}
|
|
207
|
+
// 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
|
+
};
|
|
220
|
+
}
|
|
221
|
+
const repoStructureContent = await readFile(repoStructurePath, 'utf-8');
|
|
222
|
+
const repoStructure = JSON.parse(repoStructureContent);
|
|
223
|
+
// Run pipeline
|
|
224
|
+
const pipeline = new SpecGenerationPipeline(llm, {
|
|
225
|
+
outputDir: join(rootPath, '.spec-gen', 'generation'),
|
|
226
|
+
saveIntermediate: true,
|
|
227
|
+
generateADRs: adr,
|
|
228
|
+
});
|
|
229
|
+
let pipelineResult;
|
|
230
|
+
try {
|
|
231
|
+
pipelineResult = await pipeline.run(repoStructure, llmContext, analyzeResult.depGraph);
|
|
232
|
+
}
|
|
233
|
+
catch (error) {
|
|
234
|
+
await llm.saveLogs().catch(() => { });
|
|
235
|
+
throw new Error(`Pipeline failed: ${error.message}`);
|
|
236
|
+
}
|
|
237
|
+
// Format and write specs
|
|
238
|
+
const formatGenerator = new OpenSpecFormatGenerator({
|
|
239
|
+
version: specGenConfig.version ?? '1.0.0',
|
|
240
|
+
includeConfidence: true,
|
|
241
|
+
includeTechnicalNotes: true,
|
|
242
|
+
});
|
|
243
|
+
const generatedSpecs = formatGenerator.generateSpecs(pipelineResult);
|
|
244
|
+
if (adr && pipelineResult.adrs && pipelineResult.adrs.length > 0) {
|
|
245
|
+
const adrGenerator = new ADRGenerator({
|
|
246
|
+
version: specGenConfig.version ?? '1.0.0',
|
|
247
|
+
includeMermaid: true,
|
|
248
|
+
});
|
|
249
|
+
const adrSpecs = adrGenerator.generateADRs(pipelineResult);
|
|
250
|
+
generatedSpecs.push(...adrSpecs);
|
|
251
|
+
}
|
|
252
|
+
const writer = new OpenSpecWriter({
|
|
253
|
+
rootPath,
|
|
254
|
+
writeMode: 'replace',
|
|
255
|
+
version: specGenConfig.version ?? '1.0.0',
|
|
256
|
+
createBackups: true,
|
|
257
|
+
updateConfig: true,
|
|
258
|
+
validateBeforeWrite: true,
|
|
259
|
+
});
|
|
260
|
+
const report = await writer.writeSpecs(generatedSpecs, pipelineResult.survey);
|
|
261
|
+
// Save LLM logs
|
|
262
|
+
await llm.saveLogs().catch(() => { });
|
|
263
|
+
progress(onProgress, 'Generation', 'complete', `${report.filesWritten.length} specs written`);
|
|
264
|
+
// Save run metadata
|
|
265
|
+
const duration = Date.now() - startTime;
|
|
266
|
+
const runsDir = join(rootPath, '.spec-gen', 'runs');
|
|
267
|
+
await mkdir(runsDir, { recursive: true });
|
|
268
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
269
|
+
await writeFile(join(runsDir, `${timestamp}.json`), JSON.stringify({
|
|
270
|
+
version: '1.0.0',
|
|
271
|
+
timestamp: new Date().toISOString(),
|
|
272
|
+
duration,
|
|
273
|
+
steps: {
|
|
274
|
+
init: { status: initResult.created ? 'completed' : 'skipped' },
|
|
275
|
+
analyze: { status: useExisting ? 'skipped' : 'completed' },
|
|
276
|
+
generate: { status: 'completed', specsGenerated: report.filesWritten.length },
|
|
277
|
+
},
|
|
278
|
+
result: 'success',
|
|
279
|
+
}, null, 2));
|
|
280
|
+
return {
|
|
281
|
+
init: initResult,
|
|
282
|
+
analysis: analyzeResult,
|
|
283
|
+
generation: {
|
|
284
|
+
report,
|
|
285
|
+
pipelineResult,
|
|
286
|
+
duration: Date.now() - startTime,
|
|
287
|
+
},
|
|
288
|
+
duration,
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/api/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* spec-gen API: spec requirements extractor
|
|
3
|
+
*
|
|
4
|
+
* Reads `.spec-gen/analysis/mapping.json` and extracts the exact requirement
|
|
5
|
+
* blocks from the spec files referenced by each mapping entry.
|
|
6
|
+
*
|
|
7
|
+
* The function returns a mapping from the mapping.requirement key to a
|
|
8
|
+
* structured object:
|
|
9
|
+
*
|
|
10
|
+
* {
|
|
11
|
+
* title: string, // requirement heading as found in the file
|
|
12
|
+
* body: string, // markdown body of the requirement (everything after the heading)
|
|
13
|
+
* specFile?: string, // spec file path exactly as referenced in mapping.json
|
|
14
|
+
* domain?: string, // domain from mapping
|
|
15
|
+
* service?: string // service from mapping
|
|
16
|
+
* }
|
|
17
|
+
*
|
|
18
|
+
* Behavior:
|
|
19
|
+
* - For each mapping entry we read the referenced spec file (exact path).
|
|
20
|
+
* - We attempt a deterministic (case-insensitive) equality match of the
|
|
21
|
+
* requirement heading (the text right after "### Requirement:").
|
|
22
|
+
* - If found, we return the extracted body. If not found or the file cannot
|
|
23
|
+
* be read, an empty body string is returned (the caller can interpret this
|
|
24
|
+
* as "not available").
|
|
25
|
+
*
|
|
26
|
+
* This API intentionally avoids fuzzy heuristics — it uses the exact specFile
|
|
27
|
+
* path coming from mapping.json and only performs case-insensitive title
|
|
28
|
+
* equality checks.
|
|
29
|
+
*/
|
|
30
|
+
import type { BaseOptions } from './types.js';
|
|
31
|
+
export type SpecRequirement = {
|
|
32
|
+
title: string;
|
|
33
|
+
body: string;
|
|
34
|
+
specFile?: string;
|
|
35
|
+
domain?: string;
|
|
36
|
+
service?: string;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Read spec requirements referenced in mapping.json.
|
|
40
|
+
*
|
|
41
|
+
* @param options.rootPath project root (default: process.cwd())
|
|
42
|
+
* @returns an object keyed by mapping.requirement with SpecRequirement values
|
|
43
|
+
*/
|
|
44
|
+
export declare function specGenGetSpecRequirements(options?: BaseOptions): Promise<{
|
|
45
|
+
generatedAt?: string;
|
|
46
|
+
requirements: Record<string, SpecRequirement>;
|
|
47
|
+
}>;
|
|
48
|
+
export default specGenGetSpecRequirements;
|
|
49
|
+
//# sourceMappingURL=specs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"specs.d.ts","sourceRoot":"","sources":["../../src/api/specs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC;IACnF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAC/C,CAAC,CAoGD;AAED,eAAe,0BAA0B,CAAC"}
|