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,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VectorIndex
|
|
3
|
+
*
|
|
4
|
+
* Builds and queries a LanceDB vector index over the call graph functions.
|
|
5
|
+
* Each function is represented by a document combining its signature, docstring,
|
|
6
|
+
* file path, language, and topological metadata (fanIn/fanOut, hub, entry point).
|
|
7
|
+
*
|
|
8
|
+
* Storage: <outputDir>/vector-index/ (LanceDB database folder)
|
|
9
|
+
* Table name: "functions"
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* // Build (after spec-gen analyze --embed)
|
|
13
|
+
* await VectorIndex.build(outputDir, nodes, signatures, hubIds, entryPointIds, embedSvc);
|
|
14
|
+
*
|
|
15
|
+
* // Search
|
|
16
|
+
* const results = await VectorIndex.search(outputDir, "authenticate user with JWT", embedSvc);
|
|
17
|
+
*/
|
|
18
|
+
import { existsSync } from 'node:fs';
|
|
19
|
+
import { join } from 'node:path';
|
|
20
|
+
// ============================================================================
|
|
21
|
+
// CONSTANTS
|
|
22
|
+
// ============================================================================
|
|
23
|
+
const DB_FOLDER = 'vector-index';
|
|
24
|
+
const TABLE_NAME = 'functions';
|
|
25
|
+
// ============================================================================
|
|
26
|
+
// HELPERS
|
|
27
|
+
// ============================================================================
|
|
28
|
+
/**
|
|
29
|
+
* Build the text to embed for a function.
|
|
30
|
+
* Combines language, path, qualified name, signature, and docstring.
|
|
31
|
+
*/
|
|
32
|
+
function buildText(node, signature, docstring) {
|
|
33
|
+
const qualifiedName = node.className
|
|
34
|
+
? `${node.className}.${node.name}`
|
|
35
|
+
: node.name;
|
|
36
|
+
const parts = [`[${node.language}] ${node.filePath} ${qualifiedName}`];
|
|
37
|
+
if (signature)
|
|
38
|
+
parts.push(signature);
|
|
39
|
+
if (docstring)
|
|
40
|
+
parts.push(docstring);
|
|
41
|
+
return parts.join('\n');
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Build a lookup map: filePath → entries[] from FileSignatureMap[]
|
|
45
|
+
*/
|
|
46
|
+
function buildSignatureIndex(signatures) {
|
|
47
|
+
const index = new Map();
|
|
48
|
+
for (const fsm of signatures) {
|
|
49
|
+
index.set(fsm.path, fsm.entries);
|
|
50
|
+
}
|
|
51
|
+
return index;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Find the best matching signature entry for a FunctionNode.
|
|
55
|
+
*/
|
|
56
|
+
function findSignatureEntry(node, sigIndex) {
|
|
57
|
+
const entries = sigIndex.get(node.filePath) ?? [];
|
|
58
|
+
const match = entries.find(e => e.name === node.name);
|
|
59
|
+
if (!match)
|
|
60
|
+
return { signature: '', docstring: '' };
|
|
61
|
+
return {
|
|
62
|
+
signature: match.signature ?? '',
|
|
63
|
+
docstring: match.docstring ?? '',
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
// ============================================================================
|
|
67
|
+
// VECTOR INDEX
|
|
68
|
+
// ============================================================================
|
|
69
|
+
export class VectorIndex {
|
|
70
|
+
/**
|
|
71
|
+
* Build (or rebuild) the vector index from call graph nodes + signatures.
|
|
72
|
+
* Overwrites any existing index.
|
|
73
|
+
*/
|
|
74
|
+
static async build(outputDir, nodes, signatures, hubIds, entryPointIds, embedSvc) {
|
|
75
|
+
const { connect } = await import('@lancedb/lancedb');
|
|
76
|
+
if (nodes.length === 0) {
|
|
77
|
+
throw new Error('No functions to index');
|
|
78
|
+
}
|
|
79
|
+
const sigIndex = buildSignatureIndex(signatures);
|
|
80
|
+
// Build records (without vectors first, to batch-embed all texts)
|
|
81
|
+
const records = nodes.map(node => {
|
|
82
|
+
const { signature, docstring } = findSignatureEntry(node, sigIndex);
|
|
83
|
+
return {
|
|
84
|
+
id: node.id,
|
|
85
|
+
name: node.name,
|
|
86
|
+
filePath: node.filePath,
|
|
87
|
+
className: node.className ?? '',
|
|
88
|
+
language: node.language,
|
|
89
|
+
signature,
|
|
90
|
+
docstring,
|
|
91
|
+
fanIn: node.fanIn,
|
|
92
|
+
fanOut: node.fanOut,
|
|
93
|
+
isHub: hubIds.has(node.id),
|
|
94
|
+
isEntryPoint: entryPointIds.has(node.id),
|
|
95
|
+
text: buildText(node, signature, docstring),
|
|
96
|
+
};
|
|
97
|
+
});
|
|
98
|
+
// Batch-embed all texts
|
|
99
|
+
const texts = records.map(r => r.text);
|
|
100
|
+
const vectors = await embedSvc.embed(texts);
|
|
101
|
+
if (vectors.length !== records.length) {
|
|
102
|
+
throw new Error(`Embedding count mismatch: expected ${records.length}, got ${vectors.length}`);
|
|
103
|
+
}
|
|
104
|
+
// Assemble final records with vectors
|
|
105
|
+
const fullRecords = records.map((r, i) => ({
|
|
106
|
+
...r,
|
|
107
|
+
vector: vectors[i],
|
|
108
|
+
}));
|
|
109
|
+
// Connect to LanceDB and write table
|
|
110
|
+
const dbPath = join(outputDir, DB_FOLDER);
|
|
111
|
+
const db = await connect(dbPath);
|
|
112
|
+
await db.createTable(TABLE_NAME, fullRecords, { mode: 'overwrite' });
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Semantic search over the index.
|
|
116
|
+
* Returns up to `limit` results sorted by similarity (closest first).
|
|
117
|
+
*/
|
|
118
|
+
static async search(outputDir, query, embedSvc, opts = {}) {
|
|
119
|
+
const { connect } = await import('@lancedb/lancedb');
|
|
120
|
+
const { limit = 10, language, minFanIn } = opts;
|
|
121
|
+
// Embed the query
|
|
122
|
+
const [queryVector] = await embedSvc.embed([query]);
|
|
123
|
+
if (!queryVector) {
|
|
124
|
+
throw new Error('Failed to embed query');
|
|
125
|
+
}
|
|
126
|
+
const dbPath = join(outputDir, DB_FOLDER);
|
|
127
|
+
if (!VectorIndex.exists(outputDir)) {
|
|
128
|
+
throw new Error('Vector index not found. Run "spec-gen analyze --embed" first.');
|
|
129
|
+
}
|
|
130
|
+
const db = await connect(dbPath);
|
|
131
|
+
const table = await db.openTable(TABLE_NAME);
|
|
132
|
+
// Fetch more candidates than requested so post-filtering still yields `limit` results.
|
|
133
|
+
// We over-fetch by 10x (capped at 1000) to compensate for filtered-out rows.
|
|
134
|
+
const fetchLimit = Math.min(limit * 10, 1000);
|
|
135
|
+
const rows = await table.query().nearestTo(queryVector).limit(fetchLimit).toArray();
|
|
136
|
+
// Post-filter in JavaScript (avoids SQL case-sensitivity issues with column names)
|
|
137
|
+
const filtered = rows.filter(row => {
|
|
138
|
+
if (language && row.language !== language)
|
|
139
|
+
return false;
|
|
140
|
+
if (minFanIn !== undefined && minFanIn > 0 && row.fanIn < minFanIn)
|
|
141
|
+
return false;
|
|
142
|
+
return true;
|
|
143
|
+
}).slice(0, limit);
|
|
144
|
+
return filtered.map(row => ({
|
|
145
|
+
record: {
|
|
146
|
+
id: row.id,
|
|
147
|
+
name: row.name,
|
|
148
|
+
filePath: row.filePath,
|
|
149
|
+
className: row.className,
|
|
150
|
+
language: row.language,
|
|
151
|
+
signature: row.signature,
|
|
152
|
+
docstring: row.docstring,
|
|
153
|
+
fanIn: row.fanIn,
|
|
154
|
+
fanOut: row.fanOut,
|
|
155
|
+
isHub: row.isHub,
|
|
156
|
+
isEntryPoint: row.isEntryPoint,
|
|
157
|
+
text: row.text,
|
|
158
|
+
},
|
|
159
|
+
score: row._distance,
|
|
160
|
+
}));
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Returns true if a vector index has been built for this output directory.
|
|
164
|
+
*/
|
|
165
|
+
static exists(outputDir) {
|
|
166
|
+
return existsSync(join(outputDir, DB_FOLDER));
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=vector-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vector-index.js","sourceRoot":"","sources":["../../../src/core/analyzer/vector-index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drift Detection Engine
|
|
3
|
+
*
|
|
4
|
+
* Compares code changes (from git) against existing specs (from spec-mapper)
|
|
5
|
+
* to detect gaps, stale specs, uncovered files, and orphaned specs.
|
|
6
|
+
*/
|
|
7
|
+
import type { ChangedFile, DriftIssue, DriftIssueKind, DriftResult, DriftSeverity, SpecMap } from '../../types/index.js';
|
|
8
|
+
import { type ADRMap } from './spec-mapper.js';
|
|
9
|
+
import type { LLMService } from '../services/llm-service.js';
|
|
10
|
+
export interface DriftDetectorOptions {
|
|
11
|
+
rootPath: string;
|
|
12
|
+
specMap: SpecMap;
|
|
13
|
+
changedFiles: ChangedFile[];
|
|
14
|
+
failOn: DriftSeverity;
|
|
15
|
+
llm?: LLMService;
|
|
16
|
+
domainFilter?: string[];
|
|
17
|
+
/** Relative path to the openspec directory (e.g. "openspec"). Used for spec-change detection. */
|
|
18
|
+
openspecRelPath?: string;
|
|
19
|
+
/** Git base ref for fetching file diffs (needed for LLM enhancement). */
|
|
20
|
+
baseRef?: string;
|
|
21
|
+
/** Maximum number of LLM calls per run (default: 10). */
|
|
22
|
+
maxLlmCalls?: number;
|
|
23
|
+
/** Optional ADR map for ADR drift detection. */
|
|
24
|
+
adrMap?: ADRMap;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Determine if a changed file is relevant for spec drift detection.
|
|
28
|
+
* Filters out test files, generated files, lock files, assets, etc.
|
|
29
|
+
* @param openspecRelPath - relative path to the openspec directory (default: "openspec")
|
|
30
|
+
*/
|
|
31
|
+
export declare function isSpecRelevantChange(file: ChangedFile, openspecRelPath?: string): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Compute severity based on issue kind and change magnitude
|
|
34
|
+
*/
|
|
35
|
+
export declare function computeSeverity(kind: DriftIssueKind, file: ChangedFile): DriftSeverity;
|
|
36
|
+
/**
|
|
37
|
+
* Extract domain names whose specs were also changed in this changeset.
|
|
38
|
+
* Must be called on the FULL changedFiles list (before isSpecRelevantChange
|
|
39
|
+
* filtering), because spec files live under openspec/ which isSpecRelevantChange
|
|
40
|
+
* intentionally excludes from source-drift analysis.
|
|
41
|
+
*
|
|
42
|
+
* @param openspecRelPath - relative path prefix for spec files (default: "openspec")
|
|
43
|
+
*/
|
|
44
|
+
export declare function extractChangedSpecDomains(changedFiles: ChangedFile[], openspecRelPath?: string): Set<string>;
|
|
45
|
+
/**
|
|
46
|
+
* Detect gaps: code changed in a domain but spec wasn't updated.
|
|
47
|
+
* Pass pre-computed changedSpecDomains to avoid depending on openspec/ files
|
|
48
|
+
* being present in changedFiles (they are excluded by isSpecRelevantChange).
|
|
49
|
+
*/
|
|
50
|
+
export declare function detectGaps(changedFiles: ChangedFile[], specMap: SpecMap, changedSpecDomains?: Set<string>, openspecRelPath?: string): DriftIssue[];
|
|
51
|
+
/**
|
|
52
|
+
* Detect stale specs: spec references files that were deleted or heavily modified
|
|
53
|
+
*/
|
|
54
|
+
export declare function detectStaleSpecs(changedFiles: ChangedFile[], specMap: SpecMap): DriftIssue[];
|
|
55
|
+
/**
|
|
56
|
+
* Detect uncovered files: new files that don't map to any spec domain
|
|
57
|
+
*/
|
|
58
|
+
export declare function detectUncoveredFiles(changedFiles: ChangedFile[], specMap: SpecMap, openspecRelPath?: string): DriftIssue[];
|
|
59
|
+
/**
|
|
60
|
+
* Detect orphaned specs: spec declares source files that don't exist on disk.
|
|
61
|
+
* Skips meta-domains (overview, architecture) which often have generic paths.
|
|
62
|
+
*/
|
|
63
|
+
export declare function detectOrphanedSpecs(specMap: SpecMap, rootPath: string): Promise<DriftIssue[]>;
|
|
64
|
+
/**
|
|
65
|
+
* Extract ADR IDs that were changed in this changeset.
|
|
66
|
+
* Matches files like: openspec/decisions/adr-0001-foo.md
|
|
67
|
+
*/
|
|
68
|
+
export declare function extractChangedADRIds(changedFiles: ChangedFile[], openspecRelPath?: string): Set<string>;
|
|
69
|
+
/**
|
|
70
|
+
* Detect ADR gaps: code changed in a domain referenced by an ADR,
|
|
71
|
+
* but the ADR wasn't updated. Reports once per ADR, not per file.
|
|
72
|
+
* Severity is always 'info' — most code changes don't invalidate decisions.
|
|
73
|
+
*/
|
|
74
|
+
export declare function detectADRGaps(changedFiles: ChangedFile[], adrMap: ADRMap, specMap: SpecMap, changedADRIds: Set<string>, openspecRelPath?: string): DriftIssue[];
|
|
75
|
+
/**
|
|
76
|
+
* Detect orphaned ADRs: ADR references domains that no longer exist in specs.
|
|
77
|
+
*/
|
|
78
|
+
export declare function detectADROrphaned(adrMap: ADRMap, specMap: SpecMap): DriftIssue[];
|
|
79
|
+
/**
|
|
80
|
+
* Post-process gap issues using an LLM to determine if code changes
|
|
81
|
+
* actually affect spec-documented behavior. This reduces false positives
|
|
82
|
+
* by dismissing purely internal changes (refactoring, formatting, etc.).
|
|
83
|
+
*
|
|
84
|
+
* Only processes 'gap' issues. Other issue types (stale, uncovered, orphaned)
|
|
85
|
+
* are structural and don't benefit from semantic analysis.
|
|
86
|
+
*/
|
|
87
|
+
export declare function enhanceGapsWithLLM(issues: DriftIssue[], options: {
|
|
88
|
+
llm: LLMService;
|
|
89
|
+
rootPath: string;
|
|
90
|
+
specMap: SpecMap;
|
|
91
|
+
baseRef: string;
|
|
92
|
+
maxLlmCalls?: number;
|
|
93
|
+
/** Override diff fetching (for testing) */
|
|
94
|
+
_getDiff?: (rootPath: string, filePath: string, baseRef: string) => Promise<string>;
|
|
95
|
+
/** Override spec content fetching (for testing) */
|
|
96
|
+
_getSpec?: (domain: string, specMap: SpecMap, rootPath: string) => Promise<string | null>;
|
|
97
|
+
}): Promise<DriftIssue[]>;
|
|
98
|
+
/**
|
|
99
|
+
* Run all drift detection algorithms and produce a combined result
|
|
100
|
+
*/
|
|
101
|
+
export declare function detectDrift(options: DriftDetectorOptions): Promise<DriftResult>;
|
|
102
|
+
//# sourceMappingURL=drift-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drift-detector.d.ts","sourceRoot":"","sources":["../../../src/core/drift/drift-detector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,cAAc,EACd,WAAW,EACX,aAAa,EACb,OAAO,EACR,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAsC,KAAK,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEnF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAO7D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,MAAM,EAAE,aAAa,CAAC;IACtB,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,iGAAiG;IACjG,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gDAAgD;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAaD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,WAAW,EAAE,eAAe,GAAE,MAAmB,GAAG,OAAO,CAmDrG;AAUD;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,GAAG,aAAa,CAmBtF;AAMD;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,WAAW,EAAE,EAAE,eAAe,GAAE,MAAmB,GAAG,GAAG,CAAC,MAAM,CAAC,CAYxH;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,YAAY,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,UAAU,EAAE,CAmClJ;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,UAAU,EAAE,CA4C5F;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,UAAU,EAAE,CA0B1H;AAKD;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CA2BnG;AAMD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,WAAW,EAAE,EAAE,eAAe,GAAE,MAAmB,GAAG,GAAG,CAAC,MAAM,CAAC,CAWnH;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,YAAY,EAAE,WAAW,EAAE,EAC3B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,EAC1B,eAAe,CAAC,EAAE,MAAM,GACvB,UAAU,EAAE,CAmCd;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,UAAU,EAAE,CAoBhF;AAsCD;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,UAAU,EAAE,EACpB,OAAO,EAAE;IACP,GAAG,EAAE,UAAU,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACpF,mDAAmD;IACnD,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAC3F,GACA,OAAO,CAAC,UAAU,EAAE,CAAC,CAyFvB;AAwCD;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,WAAW,CAAC,CA4FrF"}
|