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,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git diff integration for drift detection
|
|
3
|
+
*
|
|
4
|
+
* Shells out to git to determine what files changed between the current
|
|
5
|
+
* working tree and a base ref (typically main/master).
|
|
6
|
+
*/
|
|
7
|
+
import type { ChangedFile } from '../../types/index.js';
|
|
8
|
+
export interface GitDiffOptions {
|
|
9
|
+
rootPath: string;
|
|
10
|
+
baseRef: string;
|
|
11
|
+
pathFilter?: string[];
|
|
12
|
+
includeUnstaged: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface GitDiffResult {
|
|
15
|
+
resolvedBase: string;
|
|
16
|
+
files: ChangedFile[];
|
|
17
|
+
hasUnstagedChanges: boolean;
|
|
18
|
+
currentBranch: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Classify a file path as test/config/generated
|
|
22
|
+
*/
|
|
23
|
+
export declare function classifyFile(filePath: string): Pick<ChangedFile, 'isTest' | 'isConfig' | 'isGenerated' | 'extension'>;
|
|
24
|
+
/**
|
|
25
|
+
* Check if a file is a skippable binary/lock file
|
|
26
|
+
*/
|
|
27
|
+
export declare function isSkippableFile(filePath: string): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Check if the given path is a git repository
|
|
30
|
+
*/
|
|
31
|
+
export declare function isGitRepository(rootPath: string): Promise<boolean>;
|
|
32
|
+
/**
|
|
33
|
+
* Get the current branch name
|
|
34
|
+
*/
|
|
35
|
+
export declare function getCurrentBranch(rootPath: string): Promise<string>;
|
|
36
|
+
/**
|
|
37
|
+
* Validate a user-supplied git ref to prevent unexpected git argument injection.
|
|
38
|
+
* Allows branch/tag names, SHA hashes, relative refs (HEAD~1, @{upstream}), and
|
|
39
|
+
* the empty-tree SHA. Rejects refs containing shell metacharacters or null bytes.
|
|
40
|
+
*/
|
|
41
|
+
export declare function validateGitRef(ref: string): void;
|
|
42
|
+
/**
|
|
43
|
+
* Resolve a base ref, falling back through main → master → HEAD~1
|
|
44
|
+
*/
|
|
45
|
+
export declare function resolveBaseRef(rootPath: string, preferredRef: string): Promise<string>;
|
|
46
|
+
/**
|
|
47
|
+
* Get the unified diff content for a specific file against a base ref.
|
|
48
|
+
* Returns the diff text, truncated to maxChars to fit LLM context windows.
|
|
49
|
+
*/
|
|
50
|
+
export declare function getFileDiff(rootPath: string, filePath: string, baseRef: string, maxChars?: number): Promise<string>;
|
|
51
|
+
/**
|
|
52
|
+
* Get changed files between working tree and a base ref
|
|
53
|
+
*/
|
|
54
|
+
export declare function getChangedFiles(options: GitDiffOptions): Promise<GitDiffResult>;
|
|
55
|
+
//# sourceMappingURL=git-diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-diff.d.ts","sourceRoot":"","sources":["../../../src/core/drift/git-diff.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAWxD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;CACvB;AAuDD;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,QAAQ,GAAG,UAAU,GAAG,aAAa,GAAG,WAAW,CAAC,CAkBrH;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAIzD;AAMD;;GAEG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOxE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAOxE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAMhD;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA8B5F;AA6ED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,MAAa,GACtB,OAAO,CAAC,MAAM,CAAC,CAoCjB;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAkHrF"}
|
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git diff integration for drift detection
|
|
3
|
+
*
|
|
4
|
+
* Shells out to git to determine what files changed between the current
|
|
5
|
+
* working tree and a base ref (typically main/master).
|
|
6
|
+
*/
|
|
7
|
+
import { execFile } from 'node:child_process';
|
|
8
|
+
import { access } from 'node:fs/promises';
|
|
9
|
+
import { join, extname, basename } from 'node:path';
|
|
10
|
+
import { promisify } from 'node:util';
|
|
11
|
+
const execFileAsync = promisify(execFile);
|
|
12
|
+
/** Git's well-known empty tree SHA — used as base ref for single-commit repos */
|
|
13
|
+
const GIT_EMPTY_TREE_SHA = '4b825dc642cb6eb9a060e54bf899d15f71049056';
|
|
14
|
+
// ============================================================================
|
|
15
|
+
// FILE CLASSIFICATION (mirrors FileWalker heuristics)
|
|
16
|
+
// ============================================================================
|
|
17
|
+
const TEST_DIR_PATTERNS = [
|
|
18
|
+
/\/test\//,
|
|
19
|
+
/\/tests\//,
|
|
20
|
+
/\/__tests__\//,
|
|
21
|
+
/\/spec\//,
|
|
22
|
+
/\/specs\//,
|
|
23
|
+
/^test\//,
|
|
24
|
+
/^tests\//,
|
|
25
|
+
/^__tests__\//,
|
|
26
|
+
];
|
|
27
|
+
const TEST_FILE_PATTERNS = [
|
|
28
|
+
/\.test\.[^.]+$/,
|
|
29
|
+
/\.spec\.[^.]+$/,
|
|
30
|
+
/_test\.[^.]+$/,
|
|
31
|
+
/_spec\.[^.]+$/,
|
|
32
|
+
/^test_.*\.[^.]+$/,
|
|
33
|
+
];
|
|
34
|
+
const CONFIG_PATTERNS = [
|
|
35
|
+
/^\..*rc$/,
|
|
36
|
+
/^\..*rc\.(js|json|yaml|yml)$/,
|
|
37
|
+
/config\./,
|
|
38
|
+
/\.config\./,
|
|
39
|
+
/settings\./,
|
|
40
|
+
/^tsconfig.*\.json$/,
|
|
41
|
+
/^package\.json$/,
|
|
42
|
+
/^pyproject\.toml$/,
|
|
43
|
+
/^Cargo\.toml$/,
|
|
44
|
+
/^go\.mod$/,
|
|
45
|
+
/^Gemfile$/,
|
|
46
|
+
/^composer\.json$/,
|
|
47
|
+
];
|
|
48
|
+
const SKIP_EXTENSIONS = new Set([
|
|
49
|
+
'.lock', '.lockb', '.map',
|
|
50
|
+
'.png', '.jpg', '.jpeg', '.gif', '.svg', '.ico', '.webp', '.bmp',
|
|
51
|
+
'.woff', '.woff2', '.ttf', '.eot', '.otf',
|
|
52
|
+
'.mp3', '.mp4', '.wav', '.avi', '.mov', '.webm',
|
|
53
|
+
'.pdf', '.doc', '.docx', '.xls', '.xlsx',
|
|
54
|
+
'.zip', '.tar', '.gz', '.rar', '.7z',
|
|
55
|
+
'.pyc', '.pyo', '.class', '.o', '.so', '.dll', '.exe',
|
|
56
|
+
]);
|
|
57
|
+
const SKIP_FILENAMES = new Set([
|
|
58
|
+
'package-lock.json', 'pnpm-lock.yaml', 'yarn.lock',
|
|
59
|
+
'.DS_Store', 'Thumbs.db',
|
|
60
|
+
]);
|
|
61
|
+
/**
|
|
62
|
+
* Classify a file path as test/config/generated
|
|
63
|
+
*/
|
|
64
|
+
export function classifyFile(filePath) {
|
|
65
|
+
const fileName = basename(filePath);
|
|
66
|
+
const ext = extname(filePath);
|
|
67
|
+
const isTest = TEST_DIR_PATTERNS.some(p => p.test(filePath)) ||
|
|
68
|
+
TEST_FILE_PATTERNS.some(p => p.test(fileName));
|
|
69
|
+
const isConfig = CONFIG_PATTERNS.some(p => p.test(fileName));
|
|
70
|
+
const isGenerated = fileName.endsWith('.d.ts') ||
|
|
71
|
+
fileName.endsWith('.generated.ts') ||
|
|
72
|
+
fileName.endsWith('.generated.js') ||
|
|
73
|
+
filePath.includes('/generated/') ||
|
|
74
|
+
filePath.includes('/__generated__/');
|
|
75
|
+
return { isTest, isConfig, isGenerated, extension: ext };
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Check if a file is a skippable binary/lock file
|
|
79
|
+
*/
|
|
80
|
+
export function isSkippableFile(filePath) {
|
|
81
|
+
const fileName = basename(filePath);
|
|
82
|
+
const ext = extname(filePath);
|
|
83
|
+
return SKIP_EXTENSIONS.has(ext) || SKIP_FILENAMES.has(fileName);
|
|
84
|
+
}
|
|
85
|
+
// ============================================================================
|
|
86
|
+
// GIT OPERATIONS
|
|
87
|
+
// ============================================================================
|
|
88
|
+
/**
|
|
89
|
+
* Check if the given path is a git repository
|
|
90
|
+
*/
|
|
91
|
+
export async function isGitRepository(rootPath) {
|
|
92
|
+
try {
|
|
93
|
+
await access(join(rootPath, '.git'));
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Get the current branch name
|
|
102
|
+
*/
|
|
103
|
+
export async function getCurrentBranch(rootPath) {
|
|
104
|
+
try {
|
|
105
|
+
const { stdout } = await execFileAsync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { cwd: rootPath });
|
|
106
|
+
return stdout.trim();
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return 'unknown';
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Validate a user-supplied git ref to prevent unexpected git argument injection.
|
|
114
|
+
* Allows branch/tag names, SHA hashes, relative refs (HEAD~1, @{upstream}), and
|
|
115
|
+
* the empty-tree SHA. Rejects refs containing shell metacharacters or null bytes.
|
|
116
|
+
*/
|
|
117
|
+
export function validateGitRef(ref) {
|
|
118
|
+
if (ref === GIT_EMPTY_TREE_SHA || ref === 'auto')
|
|
119
|
+
return;
|
|
120
|
+
// Allow: alphanumeric, -, _, ., /, ~, ^, @, {, }, :
|
|
121
|
+
if (!/^[\w\-./~^@{}:]+$/.test(ref)) {
|
|
122
|
+
throw new Error(`Invalid git ref: "${ref}". Refs must contain only alphanumeric characters and -_./ ~^@{}:`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Resolve a base ref, falling back through main → master → HEAD~1
|
|
127
|
+
*/
|
|
128
|
+
export async function resolveBaseRef(rootPath, preferredRef) {
|
|
129
|
+
if (preferredRef && preferredRef !== 'auto') {
|
|
130
|
+
validateGitRef(preferredRef);
|
|
131
|
+
try {
|
|
132
|
+
await execFileAsync('git', ['rev-parse', '--verify', preferredRef], { cwd: rootPath });
|
|
133
|
+
return preferredRef;
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
// Fall through to defaults
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// Try common default branches
|
|
140
|
+
for (const ref of ['main', 'master']) {
|
|
141
|
+
try {
|
|
142
|
+
await execFileAsync('git', ['rev-parse', '--verify', ref], { cwd: rootPath });
|
|
143
|
+
return ref;
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Try HEAD~1 (previous commit)
|
|
150
|
+
try {
|
|
151
|
+
await execFileAsync('git', ['rev-parse', '--verify', 'HEAD~1'], { cwd: rootPath });
|
|
152
|
+
return 'HEAD~1';
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
// Single-commit repo or detached HEAD with no parent — use the empty tree SHA
|
|
156
|
+
// so git diff shows all files as "added"
|
|
157
|
+
return GIT_EMPTY_TREE_SHA;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Parse a git status character into a ChangedFile status
|
|
162
|
+
*/
|
|
163
|
+
function parseGitStatus(statusChar) {
|
|
164
|
+
switch (statusChar) {
|
|
165
|
+
case 'A': return 'added';
|
|
166
|
+
case 'D': return 'deleted';
|
|
167
|
+
case 'M': return 'modified';
|
|
168
|
+
case 'R': return 'renamed';
|
|
169
|
+
case 'C': return 'added'; // copied = effectively added
|
|
170
|
+
default: return 'modified';
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Parse git diff --name-status output into file entries
|
|
175
|
+
*/
|
|
176
|
+
function parseNameStatus(output) {
|
|
177
|
+
const entries = [];
|
|
178
|
+
const lines = output.trim().split('\n').filter(Boolean);
|
|
179
|
+
for (const line of lines) {
|
|
180
|
+
const parts = line.split('\t');
|
|
181
|
+
if (parts.length < 2)
|
|
182
|
+
continue;
|
|
183
|
+
const statusRaw = parts[0].charAt(0); // R100 → R
|
|
184
|
+
const status = parseGitStatus(statusRaw);
|
|
185
|
+
if (statusRaw === 'R' && parts.length >= 3) {
|
|
186
|
+
entries.push({ path: parts[2], status: 'renamed', oldPath: parts[1] });
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
entries.push({ path: parts[1], status });
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return entries;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Parse git diff --numstat output into addition/deletion counts.
|
|
196
|
+
* Handles rename format: "10\t5\told/path => new/path" or "10\t5\t{dir => dir2}/file.ts"
|
|
197
|
+
*/
|
|
198
|
+
function parseNumstat(output) {
|
|
199
|
+
const stats = new Map();
|
|
200
|
+
const lines = output.trim().split('\n').filter(Boolean);
|
|
201
|
+
for (const line of lines) {
|
|
202
|
+
const parts = line.split('\t');
|
|
203
|
+
if (parts.length < 3)
|
|
204
|
+
continue;
|
|
205
|
+
// Binary files show '-' for additions/deletions
|
|
206
|
+
const additions = parts[0] === '-' ? 0 : parseInt(parts[0], 10);
|
|
207
|
+
const deletions = parts[1] === '-' ? 0 : parseInt(parts[1], 10);
|
|
208
|
+
let filePath = parts.slice(2).join('\t'); // Rejoin in case path contained tabs
|
|
209
|
+
// Handle rename formats:
|
|
210
|
+
// "old/path => new/path" → extract "new/path"
|
|
211
|
+
// "{old => new}/file.ts" → expand to "new/file.ts"
|
|
212
|
+
if (filePath.includes(' => ')) {
|
|
213
|
+
const braceMatch = filePath.match(/^(.*?)\{[^}]* => ([^}]*)\}(.*)$/);
|
|
214
|
+
if (braceMatch) {
|
|
215
|
+
// "{old => new}/file.ts" format
|
|
216
|
+
filePath = braceMatch[1] + braceMatch[2] + braceMatch[3];
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
// "old/path => new/path" format
|
|
220
|
+
filePath = filePath.split(' => ').pop();
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
stats.set(filePath, { additions, deletions });
|
|
224
|
+
}
|
|
225
|
+
return stats;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Get the unified diff content for a specific file against a base ref.
|
|
229
|
+
* Returns the diff text, truncated to maxChars to fit LLM context windows.
|
|
230
|
+
*/
|
|
231
|
+
export async function getFileDiff(rootPath, filePath, baseRef, maxChars = 4000) {
|
|
232
|
+
// Try three-dot diff first (merge-base), fall back to two-dot
|
|
233
|
+
for (const separator of ['...', '..']) {
|
|
234
|
+
try {
|
|
235
|
+
const { stdout } = await execFileAsync('git', ['diff', `${baseRef}${separator}HEAD`, '--', filePath], { cwd: rootPath });
|
|
236
|
+
if (stdout.trim()) {
|
|
237
|
+
return stdout.length > maxChars
|
|
238
|
+
? stdout.slice(0, maxChars) + '\n... (truncated)'
|
|
239
|
+
: stdout;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
catch {
|
|
243
|
+
// Try next separator
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
// Fall back to unstaged/staged diff (for uncommitted changes)
|
|
247
|
+
try {
|
|
248
|
+
const { stdout } = await execFileAsync('git', ['diff', 'HEAD', '--', filePath], { cwd: rootPath });
|
|
249
|
+
if (stdout.trim()) {
|
|
250
|
+
return stdout.length > maxChars
|
|
251
|
+
? stdout.slice(0, maxChars) + '\n... (truncated)'
|
|
252
|
+
: stdout;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
catch {
|
|
256
|
+
// ignore
|
|
257
|
+
}
|
|
258
|
+
return '';
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Get changed files between working tree and a base ref
|
|
262
|
+
*/
|
|
263
|
+
export async function getChangedFiles(options) {
|
|
264
|
+
const { rootPath, baseRef, includeUnstaged } = options;
|
|
265
|
+
// Resolve base ref
|
|
266
|
+
const resolvedBase = await resolveBaseRef(rootPath, baseRef);
|
|
267
|
+
const currentBranch = await getCurrentBranch(rootPath);
|
|
268
|
+
const fileMap = new Map();
|
|
269
|
+
// Get committed changes on branch vs base
|
|
270
|
+
try {
|
|
271
|
+
const { stdout } = await execFileAsync('git', ['diff', '--name-status', '--diff-filter=ACDMR', `${resolvedBase}...HEAD`], { cwd: rootPath });
|
|
272
|
+
for (const entry of parseNameStatus(stdout)) {
|
|
273
|
+
fileMap.set(entry.path, { status: entry.status, oldPath: entry.oldPath });
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
catch {
|
|
277
|
+
// If three-dot diff fails (e.g., no common ancestor), try two-dot
|
|
278
|
+
try {
|
|
279
|
+
const { stdout } = await execFileAsync('git', ['diff', '--name-status', '--diff-filter=ACDMR', `${resolvedBase}..HEAD`], { cwd: rootPath });
|
|
280
|
+
for (const entry of parseNameStatus(stdout)) {
|
|
281
|
+
fileMap.set(entry.path, { status: entry.status, oldPath: entry.oldPath });
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
catch {
|
|
285
|
+
// If that also fails, fall through with empty committed changes
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
// Get unstaged + staged changes if requested
|
|
289
|
+
let hasUnstagedChanges = false;
|
|
290
|
+
if (includeUnstaged) {
|
|
291
|
+
// Staged changes
|
|
292
|
+
try {
|
|
293
|
+
const { stdout } = await execFileAsync('git', ['diff', '--cached', '--name-status', '--diff-filter=ACDMR'], { cwd: rootPath });
|
|
294
|
+
for (const entry of parseNameStatus(stdout)) {
|
|
295
|
+
if (!fileMap.has(entry.path)) {
|
|
296
|
+
fileMap.set(entry.path, { status: entry.status, oldPath: entry.oldPath });
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
catch { /* ignore */ }
|
|
301
|
+
// Unstaged working tree changes
|
|
302
|
+
try {
|
|
303
|
+
const { stdout } = await execFileAsync('git', ['diff', '--name-status', '--diff-filter=ACDMR'], { cwd: rootPath });
|
|
304
|
+
const unstaged = parseNameStatus(stdout);
|
|
305
|
+
if (unstaged.length > 0) {
|
|
306
|
+
hasUnstagedChanges = true;
|
|
307
|
+
for (const entry of unstaged) {
|
|
308
|
+
if (!fileMap.has(entry.path)) {
|
|
309
|
+
fileMap.set(entry.path, { status: entry.status, oldPath: entry.oldPath });
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
catch { /* ignore */ }
|
|
315
|
+
}
|
|
316
|
+
// Get line-level stats
|
|
317
|
+
let numstatMap = new Map();
|
|
318
|
+
try {
|
|
319
|
+
const { stdout } = await execFileAsync('git', ['diff', '--numstat', `${resolvedBase}...HEAD`], { cwd: rootPath });
|
|
320
|
+
numstatMap = parseNumstat(stdout);
|
|
321
|
+
}
|
|
322
|
+
catch {
|
|
323
|
+
try {
|
|
324
|
+
const { stdout } = await execFileAsync('git', ['diff', '--numstat', `${resolvedBase}..HEAD`], { cwd: rootPath });
|
|
325
|
+
numstatMap = parseNumstat(stdout);
|
|
326
|
+
}
|
|
327
|
+
catch { /* ignore */ }
|
|
328
|
+
}
|
|
329
|
+
// Build ChangedFile list
|
|
330
|
+
const files = [];
|
|
331
|
+
for (const [path, { status, oldPath }] of fileMap) {
|
|
332
|
+
if (isSkippableFile(path))
|
|
333
|
+
continue;
|
|
334
|
+
const stats = numstatMap.get(path) ?? { additions: 0, deletions: 0 };
|
|
335
|
+
const classification = classifyFile(path);
|
|
336
|
+
files.push({
|
|
337
|
+
path,
|
|
338
|
+
status,
|
|
339
|
+
oldPath,
|
|
340
|
+
additions: stats.additions,
|
|
341
|
+
deletions: stats.deletions,
|
|
342
|
+
...classification,
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
// Apply path filter if provided
|
|
346
|
+
const filtered = options.pathFilter?.length
|
|
347
|
+
? files.filter(f => options.pathFilter.some(p => f.path.startsWith(p) || f.path === p))
|
|
348
|
+
: files;
|
|
349
|
+
return {
|
|
350
|
+
resolvedBase,
|
|
351
|
+
files: filtered,
|
|
352
|
+
hasUnstagedChanges,
|
|
353
|
+
currentBranch,
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
//# sourceMappingURL=git-diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-diff.js","sourceRoot":"","sources":["../../../src/core/drift/git-diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drift detection module
|
|
3
|
+
*
|
|
4
|
+
* Detects when code changes diverge from existing OpenSpec specifications.
|
|
5
|
+
*/
|
|
6
|
+
export { getChangedFiles, getFileDiff, isGitRepository, getCurrentBranch, resolveBaseRef, classifyFile } from './git-diff.js';
|
|
7
|
+
export type { GitDiffOptions, GitDiffResult } from './git-diff.js';
|
|
8
|
+
export { buildSpecMap, matchFileToDomains, getSpecContent, parseSpecHeader, parseSpecReferences, inferDomainFromPath, buildADRMap, parseADRRelated } from './spec-mapper.js';
|
|
9
|
+
export type { SpecMapperOptions, ADRMapping, ADRMap } from './spec-mapper.js';
|
|
10
|
+
export { detectDrift, detectGaps, detectStaleSpecs, detectUncoveredFiles, detectOrphanedSpecs, isSpecRelevantChange, computeSeverity, extractChangedSpecDomains, enhanceGapsWithLLM, detectADRGaps, detectADROrphaned, extractChangedADRIds } from './drift-detector.js';
|
|
11
|
+
export type { DriftDetectorOptions } from './drift-detector.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/drift/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,eAAe,EAAE,gBAAgB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC9H,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnE,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,eAAe,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC7K,YAAY,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE9E,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,eAAe,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,aAAa,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AACzQ,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drift detection module
|
|
3
|
+
*
|
|
4
|
+
* Detects when code changes diverge from existing OpenSpec specifications.
|
|
5
|
+
*/
|
|
6
|
+
export { getChangedFiles, getFileDiff, isGitRepository, getCurrentBranch, resolveBaseRef, classifyFile } from './git-diff.js';
|
|
7
|
+
export { buildSpecMap, matchFileToDomains, getSpecContent, parseSpecHeader, parseSpecReferences, inferDomainFromPath, buildADRMap, parseADRRelated } from './spec-mapper.js';
|
|
8
|
+
export { detectDrift, detectGaps, detectStaleSpecs, detectUncoveredFiles, detectOrphanedSpecs, isSpecRelevantChange, computeSeverity, extractChangedSpecDomains, enhanceGapsWithLLM, detectADRGaps, detectADROrphaned, extractChangedADRIds } from './drift-detector.js';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/drift/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,eAAe,EAAE,gBAAgB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAG9H,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,eAAe,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAG7K,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,eAAe,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,aAAa,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spec-to-File Mapper
|
|
3
|
+
*
|
|
4
|
+
* Reads existing OpenSpec specs and builds a bidirectional mapping
|
|
5
|
+
* between spec domains and source files. This is the core data structure
|
|
6
|
+
* that enables drift detection.
|
|
7
|
+
*/
|
|
8
|
+
import type { SpecMap } from '../../types/index.js';
|
|
9
|
+
export interface SpecMapperOptions {
|
|
10
|
+
rootPath: string;
|
|
11
|
+
openspecPath: string;
|
|
12
|
+
repoStructurePath?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Extract source files from the spec header line:
|
|
16
|
+
* > Source files: src/foo.ts, src/bar.ts
|
|
17
|
+
*/
|
|
18
|
+
export declare function parseSpecHeader(content: string): {
|
|
19
|
+
sourceFiles: string[];
|
|
20
|
+
generatedDate: string | null;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Extract file references, requirements, and entities from spec body
|
|
24
|
+
*/
|
|
25
|
+
export declare function parseSpecReferences(content: string): {
|
|
26
|
+
files: string[];
|
|
27
|
+
requirements: string[];
|
|
28
|
+
entities: string[];
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Try to infer a domain for a file path based on directory structure.
|
|
32
|
+
* Uses word-boundary matching to avoid false positives (e.g., domain "auth"
|
|
33
|
+
* should match "auth-service.ts" but not "authorize.ts").
|
|
34
|
+
*/
|
|
35
|
+
export declare function inferDomainFromPath(filePath: string, knownDomains: string[]): string | null;
|
|
36
|
+
/**
|
|
37
|
+
* Build a bidirectional map between spec domains and source files
|
|
38
|
+
*/
|
|
39
|
+
export declare function buildSpecMap(options: SpecMapperOptions): Promise<SpecMap>;
|
|
40
|
+
/**
|
|
41
|
+
* Load spec content for a domain, reading the spec file from disk.
|
|
42
|
+
* Returns the markdown content truncated to maxChars, or null if unavailable.
|
|
43
|
+
*/
|
|
44
|
+
export declare function getSpecContent(domain: string, specMap: SpecMap, rootPath: string, maxChars?: number): Promise<string | null>;
|
|
45
|
+
/**
|
|
46
|
+
* Find which domains a file maps to, using direct lookup + directory inference
|
|
47
|
+
*/
|
|
48
|
+
export declare function matchFileToDomains(filePath: string, specMap: SpecMap): string[];
|
|
49
|
+
export interface ADRMapping {
|
|
50
|
+
id: string;
|
|
51
|
+
title: string;
|
|
52
|
+
adrPath: string;
|
|
53
|
+
relatedDomains: string[];
|
|
54
|
+
relatedLayers: string[];
|
|
55
|
+
status: string;
|
|
56
|
+
}
|
|
57
|
+
export interface ADRMap {
|
|
58
|
+
byId: Map<string, ADRMapping>;
|
|
59
|
+
byDomain: Map<string, string[]>;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Parse the ## Related section from an ADR file to extract domains and layers.
|
|
63
|
+
*/
|
|
64
|
+
export declare function parseADRRelated(content: string): {
|
|
65
|
+
domains: string[];
|
|
66
|
+
layers: string[];
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* Build an ADR map by reading all ADR files from the decisions directory.
|
|
70
|
+
* Returns null if no decisions directory exists.
|
|
71
|
+
*/
|
|
72
|
+
export declare function buildADRMap(options: SpecMapperOptions): Promise<ADRMap | null>;
|
|
73
|
+
//# sourceMappingURL=spec-mapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-mapper.d.ts","sourceRoot":"","sources":["../../../src/core/drift/spec-mapper.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAe,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAOjE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAYD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,WAAW,EAAE,MAAM,EAAE,CAAC;IAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAwBxG;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG;IACpD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAgDA;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CA8B3F;AAMD;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,CA8G/E;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,MAAa,GACtB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAcxB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,CAe/E;AAMD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC9B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACjC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAexF;AA0BD;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAqDpF"}
|