@grafema/util 0.3.0-beta
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 +190 -0
- package/dist/api/GraphAPI.d.ts +87 -0
- package/dist/api/GraphAPI.d.ts.map +1 -0
- package/dist/api/GraphAPI.js +212 -0
- package/dist/api/GraphAPI.js.map +1 -0
- package/dist/api/GuaranteeAPI.d.ts +147 -0
- package/dist/api/GuaranteeAPI.d.ts.map +1 -0
- package/dist/api/GuaranteeAPI.js +290 -0
- package/dist/api/GuaranteeAPI.js.map +1 -0
- package/dist/config/ConfigLoader.d.ts +214 -0
- package/dist/config/ConfigLoader.d.ts.map +1 -0
- package/dist/config/ConfigLoader.js +441 -0
- package/dist/config/ConfigLoader.js.map +1 -0
- package/dist/config/index.d.ts +6 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +5 -0
- package/dist/config/index.js.map +1 -0
- package/dist/core/CoverageAnalyzer.d.ts +65 -0
- package/dist/core/CoverageAnalyzer.d.ts.map +1 -0
- package/dist/core/CoverageAnalyzer.js +199 -0
- package/dist/core/CoverageAnalyzer.js.map +1 -0
- package/dist/core/FileExplainer.d.ts +101 -0
- package/dist/core/FileExplainer.d.ts.map +1 -0
- package/dist/core/FileExplainer.js +140 -0
- package/dist/core/FileExplainer.js.map +1 -0
- package/dist/core/FileOverview.d.ts +124 -0
- package/dist/core/FileOverview.d.ts.map +1 -0
- package/dist/core/FileOverview.js +279 -0
- package/dist/core/FileOverview.js.map +1 -0
- package/dist/core/GrafemaUri.d.ts +66 -0
- package/dist/core/GrafemaUri.d.ts.map +1 -0
- package/dist/core/GrafemaUri.js +191 -0
- package/dist/core/GrafemaUri.js.map +1 -0
- package/dist/core/GraphBackend.d.ts +158 -0
- package/dist/core/GraphBackend.d.ts.map +1 -0
- package/dist/core/GraphBackend.js +85 -0
- package/dist/core/GraphBackend.js.map +1 -0
- package/dist/core/GraphFreshnessChecker.d.ts +33 -0
- package/dist/core/GraphFreshnessChecker.d.ts.map +1 -0
- package/dist/core/GraphFreshnessChecker.js +104 -0
- package/dist/core/GraphFreshnessChecker.js.map +1 -0
- package/dist/core/GuaranteeManager.d.ts +254 -0
- package/dist/core/GuaranteeManager.d.ts.map +1 -0
- package/dist/core/GuaranteeManager.js +447 -0
- package/dist/core/GuaranteeManager.js.map +1 -0
- package/dist/core/HashUtils.d.ts +24 -0
- package/dist/core/HashUtils.d.ts.map +1 -0
- package/dist/core/HashUtils.js +46 -0
- package/dist/core/HashUtils.js.map +1 -0
- package/dist/core/IncrementalReanalyzer.d.ts +33 -0
- package/dist/core/IncrementalReanalyzer.d.ts.map +1 -0
- package/dist/core/IncrementalReanalyzer.js +67 -0
- package/dist/core/IncrementalReanalyzer.js.map +1 -0
- package/dist/core/ResourceRegistry.d.ts +17 -0
- package/dist/core/ResourceRegistry.d.ts.map +1 -0
- package/dist/core/ResourceRegistry.js +32 -0
- package/dist/core/ResourceRegistry.js.map +1 -0
- package/dist/core/SemanticId.d.ts +159 -0
- package/dist/core/SemanticId.d.ts.map +1 -0
- package/dist/core/SemanticId.js +291 -0
- package/dist/core/SemanticId.js.map +1 -0
- package/dist/core/VersionManager.d.ts +166 -0
- package/dist/core/VersionManager.d.ts.map +1 -0
- package/dist/core/VersionManager.js +239 -0
- package/dist/core/VersionManager.js.map +1 -0
- package/dist/core/brandNodeInternal.d.ts +14 -0
- package/dist/core/brandNodeInternal.d.ts.map +1 -0
- package/dist/core/brandNodeInternal.js +4 -0
- package/dist/core/brandNodeInternal.js.map +1 -0
- package/dist/core/nodes/GuaranteeNode.d.ts +76 -0
- package/dist/core/nodes/GuaranteeNode.d.ts.map +1 -0
- package/dist/core/nodes/GuaranteeNode.js +118 -0
- package/dist/core/nodes/GuaranteeNode.js.map +1 -0
- package/dist/core/nodes/IssueNode.d.ts +73 -0
- package/dist/core/nodes/IssueNode.d.ts.map +1 -0
- package/dist/core/nodes/IssueNode.js +130 -0
- package/dist/core/nodes/IssueNode.js.map +1 -0
- package/dist/core/nodes/NodeKind.d.ts +104 -0
- package/dist/core/nodes/NodeKind.d.ts.map +1 -0
- package/dist/core/nodes/NodeKind.js +166 -0
- package/dist/core/nodes/NodeKind.js.map +1 -0
- package/dist/diagnostics/DiagnosticCollector.d.ts +103 -0
- package/dist/diagnostics/DiagnosticCollector.d.ts.map +1 -0
- package/dist/diagnostics/DiagnosticCollector.js +133 -0
- package/dist/diagnostics/DiagnosticCollector.js.map +1 -0
- package/dist/diagnostics/DiagnosticReporter.d.ts +122 -0
- package/dist/diagnostics/DiagnosticReporter.d.ts.map +1 -0
- package/dist/diagnostics/DiagnosticReporter.js +300 -0
- package/dist/diagnostics/DiagnosticReporter.js.map +1 -0
- package/dist/diagnostics/DiagnosticWriter.d.ts +31 -0
- package/dist/diagnostics/DiagnosticWriter.d.ts.map +1 -0
- package/dist/diagnostics/DiagnosticWriter.js +44 -0
- package/dist/diagnostics/DiagnosticWriter.js.map +1 -0
- package/dist/diagnostics/categories.d.ts +57 -0
- package/dist/diagnostics/categories.d.ts.map +1 -0
- package/dist/diagnostics/categories.js +71 -0
- package/dist/diagnostics/categories.js.map +1 -0
- package/dist/diagnostics/index.d.ts +17 -0
- package/dist/diagnostics/index.d.ts.map +1 -0
- package/dist/diagnostics/index.js +15 -0
- package/dist/diagnostics/index.js.map +1 -0
- package/dist/errors/GrafemaError.d.ts +200 -0
- package/dist/errors/GrafemaError.d.ts.map +1 -0
- package/dist/errors/GrafemaError.js +209 -0
- package/dist/errors/GrafemaError.js.map +1 -0
- package/dist/index.d.ts +75 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +76 -0
- package/dist/index.js.map +1 -0
- package/dist/instructions/index.d.ts +8 -0
- package/dist/instructions/index.d.ts.map +1 -0
- package/dist/instructions/index.js +20 -0
- package/dist/instructions/index.js.map +1 -0
- package/dist/instructions/onboarding.md +133 -0
- package/dist/knowledge/KnowledgeBase.d.ts +113 -0
- package/dist/knowledge/KnowledgeBase.d.ts.map +1 -0
- package/dist/knowledge/KnowledgeBase.js +420 -0
- package/dist/knowledge/KnowledgeBase.js.map +1 -0
- package/dist/knowledge/SemanticAddressResolver.d.ts +59 -0
- package/dist/knowledge/SemanticAddressResolver.d.ts.map +1 -0
- package/dist/knowledge/SemanticAddressResolver.js +160 -0
- package/dist/knowledge/SemanticAddressResolver.js.map +1 -0
- package/dist/knowledge/git-ingest.d.ts +58 -0
- package/dist/knowledge/git-ingest.d.ts.map +1 -0
- package/dist/knowledge/git-ingest.js +301 -0
- package/dist/knowledge/git-ingest.js.map +1 -0
- package/dist/knowledge/git-queries.d.ts +86 -0
- package/dist/knowledge/git-queries.d.ts.map +1 -0
- package/dist/knowledge/git-queries.js +177 -0
- package/dist/knowledge/git-queries.js.map +1 -0
- package/dist/knowledge/index.d.ts +14 -0
- package/dist/knowledge/index.d.ts.map +1 -0
- package/dist/knowledge/index.js +10 -0
- package/dist/knowledge/index.js.map +1 -0
- package/dist/knowledge/parser.d.ts +39 -0
- package/dist/knowledge/parser.d.ts.map +1 -0
- package/dist/knowledge/parser.js +292 -0
- package/dist/knowledge/parser.js.map +1 -0
- package/dist/knowledge/types.d.ts +133 -0
- package/dist/knowledge/types.d.ts.map +1 -0
- package/dist/knowledge/types.js +8 -0
- package/dist/knowledge/types.js.map +1 -0
- package/dist/logging/Logger.d.ts +98 -0
- package/dist/logging/Logger.d.ts.map +1 -0
- package/dist/logging/Logger.js +274 -0
- package/dist/logging/Logger.js.map +1 -0
- package/dist/notation/archetypes.d.ts +36 -0
- package/dist/notation/archetypes.d.ts.map +1 -0
- package/dist/notation/archetypes.js +173 -0
- package/dist/notation/archetypes.js.map +1 -0
- package/dist/notation/fold.d.ts +25 -0
- package/dist/notation/fold.d.ts.map +1 -0
- package/dist/notation/fold.js +598 -0
- package/dist/notation/fold.js.map +1 -0
- package/dist/notation/index.d.ts +18 -0
- package/dist/notation/index.d.ts.map +1 -0
- package/dist/notation/index.js +16 -0
- package/dist/notation/index.js.map +1 -0
- package/dist/notation/lodExtractor.d.ts +32 -0
- package/dist/notation/lodExtractor.d.ts.map +1 -0
- package/dist/notation/lodExtractor.js +149 -0
- package/dist/notation/lodExtractor.js.map +1 -0
- package/dist/notation/nameShortener.d.ts +22 -0
- package/dist/notation/nameShortener.d.ts.map +1 -0
- package/dist/notation/nameShortener.js +24 -0
- package/dist/notation/nameShortener.js.map +1 -0
- package/dist/notation/perspectives.d.ts +11 -0
- package/dist/notation/perspectives.d.ts.map +1 -0
- package/dist/notation/perspectives.js +16 -0
- package/dist/notation/perspectives.js.map +1 -0
- package/dist/notation/renderer.d.ts +31 -0
- package/dist/notation/renderer.d.ts.map +1 -0
- package/dist/notation/renderer.js +315 -0
- package/dist/notation/renderer.js.map +1 -0
- package/dist/notation/traceRenderer.d.ts +39 -0
- package/dist/notation/traceRenderer.d.ts.map +1 -0
- package/dist/notation/traceRenderer.js +358 -0
- package/dist/notation/traceRenderer.js.map +1 -0
- package/dist/notation/types.d.ts +66 -0
- package/dist/notation/types.d.ts.map +1 -0
- package/dist/notation/types.js +10 -0
- package/dist/notation/types.js.map +1 -0
- package/dist/queries/NodeContext.d.ts +81 -0
- package/dist/queries/NodeContext.d.ts.map +1 -0
- package/dist/queries/NodeContext.js +196 -0
- package/dist/queries/NodeContext.js.map +1 -0
- package/dist/queries/findCallsInFunction.d.ts +62 -0
- package/dist/queries/findCallsInFunction.d.ts.map +1 -0
- package/dist/queries/findCallsInFunction.js +169 -0
- package/dist/queries/findCallsInFunction.js.map +1 -0
- package/dist/queries/findContainingFunction.d.ts +57 -0
- package/dist/queries/findContainingFunction.d.ts.map +1 -0
- package/dist/queries/findContainingFunction.js +91 -0
- package/dist/queries/findContainingFunction.js.map +1 -0
- package/dist/queries/index.d.ts +18 -0
- package/dist/queries/index.d.ts.map +1 -0
- package/dist/queries/index.js +14 -0
- package/dist/queries/index.js.map +1 -0
- package/dist/queries/traceDataflow.d.ts +65 -0
- package/dist/queries/traceDataflow.d.ts.map +1 -0
- package/dist/queries/traceDataflow.js +754 -0
- package/dist/queries/traceDataflow.js.map +1 -0
- package/dist/queries/traceValues.d.ts +70 -0
- package/dist/queries/traceValues.d.ts.map +1 -0
- package/dist/queries/traceValues.js +373 -0
- package/dist/queries/traceValues.js.map +1 -0
- package/dist/queries/types.d.ts +166 -0
- package/dist/queries/types.d.ts.map +1 -0
- package/dist/queries/types.js +10 -0
- package/dist/queries/types.js.map +1 -0
- package/dist/schema/GraphSchemaExtractor.d.ts +53 -0
- package/dist/schema/GraphSchemaExtractor.d.ts.map +1 -0
- package/dist/schema/GraphSchemaExtractor.js +125 -0
- package/dist/schema/GraphSchemaExtractor.js.map +1 -0
- package/dist/schema/InterfaceSchemaExtractor.d.ts +73 -0
- package/dist/schema/InterfaceSchemaExtractor.d.ts.map +1 -0
- package/dist/schema/InterfaceSchemaExtractor.js +113 -0
- package/dist/schema/InterfaceSchemaExtractor.js.map +1 -0
- package/dist/schema/index.d.ts +5 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +3 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/storage/backends/RFDBServerBackend.d.ts +356 -0
- package/dist/storage/backends/RFDBServerBackend.d.ts.map +1 -0
- package/dist/storage/backends/RFDBServerBackend.js +748 -0
- package/dist/storage/backends/RFDBServerBackend.js.map +1 -0
- package/dist/storage/backends/typeValidation.d.ts +47 -0
- package/dist/storage/backends/typeValidation.d.ts.map +1 -0
- package/dist/storage/backends/typeValidation.js +141 -0
- package/dist/storage/backends/typeValidation.js.map +1 -0
- package/dist/utils/findRfdbBinary.d.ts +67 -0
- package/dist/utils/findRfdbBinary.d.ts.map +1 -0
- package/dist/utils/findRfdbBinary.js +261 -0
- package/dist/utils/findRfdbBinary.js.map +1 -0
- package/dist/utils/lazyDownload.d.ts +43 -0
- package/dist/utils/lazyDownload.d.ts.map +1 -0
- package/dist/utils/lazyDownload.js +175 -0
- package/dist/utils/lazyDownload.js.map +1 -0
- package/dist/utils/moduleResolution.d.ts +134 -0
- package/dist/utils/moduleResolution.d.ts.map +1 -0
- package/dist/utils/moduleResolution.js +189 -0
- package/dist/utils/moduleResolution.js.map +1 -0
- package/dist/utils/resolveNodeFile.d.ts +13 -0
- package/dist/utils/resolveNodeFile.d.ts.map +1 -0
- package/dist/utils/resolveNodeFile.js +18 -0
- package/dist/utils/resolveNodeFile.js.map +1 -0
- package/dist/utils/startRfdbServer.d.ts +63 -0
- package/dist/utils/startRfdbServer.d.ts.map +1 -0
- package/dist/utils/startRfdbServer.js +142 -0
- package/dist/utils/startRfdbServer.js.map +1 -0
- package/dist/validation/PathValidator.d.ts +80 -0
- package/dist/validation/PathValidator.d.ts.map +1 -0
- package/dist/validation/PathValidator.js +252 -0
- package/dist/validation/PathValidator.js.map +1 -0
- package/dist/version.d.ts +11 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +26 -0
- package/dist/version.js.map +1 -0
- package/package.json +50 -0
- package/src/api/GraphAPI.ts +307 -0
- package/src/api/GuaranteeAPI.ts +402 -0
- package/src/config/ConfigLoader.ts +653 -0
- package/src/config/index.ts +13 -0
- package/src/core/CoverageAnalyzer.ts +243 -0
- package/src/core/FileExplainer.ts +179 -0
- package/src/core/FileOverview.ts +397 -0
- package/src/core/GrafemaUri.ts +216 -0
- package/src/core/GraphBackend.ts +266 -0
- package/src/core/GraphFreshnessChecker.ts +145 -0
- package/src/core/GuaranteeManager.ts +684 -0
- package/src/core/HashUtils.ts +48 -0
- package/src/core/IncrementalReanalyzer.ts +106 -0
- package/src/core/ResourceRegistry.ts +39 -0
- package/src/core/SemanticId.ts +423 -0
- package/src/core/VersionManager.ts +405 -0
- package/src/core/brandNodeInternal.ts +16 -0
- package/src/core/nodes/GuaranteeNode.ts +162 -0
- package/src/core/nodes/IssueNode.ts +177 -0
- package/src/core/nodes/NodeKind.ts +192 -0
- package/src/diagnostics/DiagnosticCollector.ts +170 -0
- package/src/diagnostics/DiagnosticReporter.ts +395 -0
- package/src/diagnostics/DiagnosticWriter.ts +50 -0
- package/src/diagnostics/categories.ts +104 -0
- package/src/diagnostics/index.ts +30 -0
- package/src/errors/GrafemaError.ts +297 -0
- package/src/index.ts +261 -0
- package/src/instructions/index.ts +21 -0
- package/src/instructions/onboarding.md +133 -0
- package/src/knowledge/KnowledgeBase.ts +486 -0
- package/src/knowledge/SemanticAddressResolver.ts +191 -0
- package/src/knowledge/git-ingest.ts +402 -0
- package/src/knowledge/git-queries.ts +269 -0
- package/src/knowledge/index.ts +29 -0
- package/src/knowledge/parser.ts +294 -0
- package/src/knowledge/types.ts +146 -0
- package/src/logging/Logger.ts +303 -0
- package/src/notation/archetypes.ts +189 -0
- package/src/notation/fold.ts +696 -0
- package/src/notation/index.ts +27 -0
- package/src/notation/lodExtractor.ts +177 -0
- package/src/notation/nameShortener.ts +24 -0
- package/src/notation/perspectives.ts +18 -0
- package/src/notation/renderer.ts +394 -0
- package/src/notation/traceRenderer.ts +458 -0
- package/src/notation/types.ts +79 -0
- package/src/queries/NodeContext.ts +280 -0
- package/src/queries/findCallsInFunction.ts +249 -0
- package/src/queries/findContainingFunction.ts +124 -0
- package/src/queries/index.ts +44 -0
- package/src/queries/traceDataflow.ts +838 -0
- package/src/queries/traceValues.ts +531 -0
- package/src/queries/types.ts +191 -0
- package/src/schema/GraphSchemaExtractor.ts +177 -0
- package/src/schema/InterfaceSchemaExtractor.ts +173 -0
- package/src/schema/index.ts +5 -0
- package/src/storage/backends/RFDBServerBackend.ts +895 -0
- package/src/storage/backends/typeValidation.ts +154 -0
- package/src/utils/findRfdbBinary.ts +288 -0
- package/src/utils/lazyDownload.ts +206 -0
- package/src/utils/moduleResolution.ts +271 -0
- package/src/utils/resolveNodeFile.ts +18 -0
- package/src/utils/startRfdbServer.ts +197 -0
- package/src/validation/PathValidator.ts +334 -0
- package/src/version.ts +28 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export interface RawCommit {
|
|
2
|
+
hash: string;
|
|
3
|
+
message: string;
|
|
4
|
+
authorName: string;
|
|
5
|
+
authorEmail: string;
|
|
6
|
+
date: string;
|
|
7
|
+
files: FileChange[];
|
|
8
|
+
}
|
|
9
|
+
export interface FileChange {
|
|
10
|
+
path: string;
|
|
11
|
+
added: number;
|
|
12
|
+
removed: number;
|
|
13
|
+
}
|
|
14
|
+
export interface AuthorEntry {
|
|
15
|
+
id: string;
|
|
16
|
+
type: 'AUTHOR';
|
|
17
|
+
name: string;
|
|
18
|
+
emails: string[];
|
|
19
|
+
aliases: string[];
|
|
20
|
+
projections: string[];
|
|
21
|
+
}
|
|
22
|
+
export interface CommitEntry {
|
|
23
|
+
type: 'COMMIT';
|
|
24
|
+
hash: string;
|
|
25
|
+
message: string;
|
|
26
|
+
author_ref: string;
|
|
27
|
+
date: string;
|
|
28
|
+
files: FileChange[];
|
|
29
|
+
projections: string[];
|
|
30
|
+
}
|
|
31
|
+
export interface IngestResult {
|
|
32
|
+
commits: number;
|
|
33
|
+
authors: number;
|
|
34
|
+
filesChanged: number;
|
|
35
|
+
}
|
|
36
|
+
export interface Meta {
|
|
37
|
+
last_commit: string;
|
|
38
|
+
last_ingest: string;
|
|
39
|
+
branch: string;
|
|
40
|
+
}
|
|
41
|
+
export declare function parseGitLog(rawOutput: string): RawCommit[];
|
|
42
|
+
export declare function normalizeAuthors(commits: RawCommit[]): Map<string, AuthorEntry>;
|
|
43
|
+
export declare class GitIngest {
|
|
44
|
+
private knowledgeDir;
|
|
45
|
+
constructor(knowledgeDir: string);
|
|
46
|
+
ingestFull(repoPath: string, branch?: string, since?: string): Promise<IngestResult>;
|
|
47
|
+
ingestIncremental(repoPath: string, branch?: string): Promise<IngestResult>;
|
|
48
|
+
private runGitLog;
|
|
49
|
+
private writeAuthors;
|
|
50
|
+
private writeCommits;
|
|
51
|
+
private writeMeta;
|
|
52
|
+
private readMeta;
|
|
53
|
+
private readExistingAuthors;
|
|
54
|
+
private mergeAuthors;
|
|
55
|
+
private mergeCommits;
|
|
56
|
+
private toCommitEntry;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=git-ingest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-ingest.d.ts","sourceRoot":"","sources":["../../src/knowledge/git-ingest.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,IAAI;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAcD,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,CAqC1D;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAgD/E;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,YAAY,CAAS;gBAEjB,YAAY,EAAE,MAAM;IAI1B,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IA+BpF,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAsCjF,OAAO,CAAC,SAAS;IAoBjB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,YAAY;IAqBpB,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,QAAQ;IAYhB,OAAO,CAAC,mBAAmB;IAqB3B,OAAO,CAAC,YAAY;IAwBpB,OAAO,CAAC,YAAY;IAuCpB,OAAO,CAAC,aAAa;CAmBtB"}
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
import { execSync } from 'child_process';
|
|
2
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync, rmSync } from 'fs';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';
|
|
5
|
+
function slugify(name) {
|
|
6
|
+
return name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');
|
|
7
|
+
}
|
|
8
|
+
function resolveRenamedPath(rawPath) {
|
|
9
|
+
const match = rawPath.match(/\{[^}]* => ([^}]*)\}/);
|
|
10
|
+
if (match) {
|
|
11
|
+
return rawPath.replace(/\{[^}]* => [^}]*\}/, match[1]);
|
|
12
|
+
}
|
|
13
|
+
return rawPath;
|
|
14
|
+
}
|
|
15
|
+
export function parseGitLog(rawOutput) {
|
|
16
|
+
const commits = [];
|
|
17
|
+
const blocks = rawOutput.split('COMMIT_START\n').filter(b => b.trim());
|
|
18
|
+
for (const block of blocks) {
|
|
19
|
+
const lines = block.split('\n');
|
|
20
|
+
if (lines.length < 5)
|
|
21
|
+
continue;
|
|
22
|
+
const hash = lines[0].trim();
|
|
23
|
+
const message = lines[1].trim();
|
|
24
|
+
const authorName = lines[2].trim();
|
|
25
|
+
const authorEmail = lines[3].trim();
|
|
26
|
+
const date = lines[4].trim();
|
|
27
|
+
const files = [];
|
|
28
|
+
for (let i = 5; i < lines.length; i++) {
|
|
29
|
+
const line = lines[i].trim();
|
|
30
|
+
if (!line)
|
|
31
|
+
continue;
|
|
32
|
+
const parts = line.split('\t');
|
|
33
|
+
if (parts.length < 3)
|
|
34
|
+
continue;
|
|
35
|
+
const addedRaw = parts[0];
|
|
36
|
+
const removedRaw = parts[1];
|
|
37
|
+
const rawPath = parts.slice(2).join('\t');
|
|
38
|
+
const path = resolveRenamedPath(rawPath);
|
|
39
|
+
const added = addedRaw === '-' ? 0 : parseInt(addedRaw, 10) || 0;
|
|
40
|
+
const removed = removedRaw === '-' ? 0 : parseInt(removedRaw, 10) || 0;
|
|
41
|
+
files.push({ path, added, removed });
|
|
42
|
+
}
|
|
43
|
+
commits.push({ hash, message, authorName, authorEmail, date, files });
|
|
44
|
+
}
|
|
45
|
+
return commits;
|
|
46
|
+
}
|
|
47
|
+
export function normalizeAuthors(commits) {
|
|
48
|
+
const emailGroups = new Map();
|
|
49
|
+
for (const commit of commits) {
|
|
50
|
+
const emailKey = commit.authorEmail.toLowerCase();
|
|
51
|
+
let group = emailGroups.get(emailKey);
|
|
52
|
+
if (!group) {
|
|
53
|
+
group = { names: new Map(), emails: new Set() };
|
|
54
|
+
emailGroups.set(emailKey, group);
|
|
55
|
+
}
|
|
56
|
+
group.emails.add(commit.authorEmail);
|
|
57
|
+
const count = group.names.get(commit.authorName) || 0;
|
|
58
|
+
group.names.set(commit.authorName, count + 1);
|
|
59
|
+
}
|
|
60
|
+
const authors = new Map();
|
|
61
|
+
for (const [, group] of emailGroups) {
|
|
62
|
+
let primaryName = '';
|
|
63
|
+
let maxCount = 0;
|
|
64
|
+
for (const [name, count] of group.names) {
|
|
65
|
+
if (count > maxCount) {
|
|
66
|
+
maxCount = count;
|
|
67
|
+
primaryName = name;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const aliases = [];
|
|
71
|
+
for (const [name] of group.names) {
|
|
72
|
+
if (name !== primaryName) {
|
|
73
|
+
aliases.push(name);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const id = slugify(primaryName);
|
|
77
|
+
const emails = Array.from(group.emails);
|
|
78
|
+
authors.set(id, {
|
|
79
|
+
id,
|
|
80
|
+
type: 'AUTHOR',
|
|
81
|
+
name: primaryName,
|
|
82
|
+
emails,
|
|
83
|
+
aliases,
|
|
84
|
+
projections: ['temporal', 'organizational'],
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
return authors;
|
|
88
|
+
}
|
|
89
|
+
export class GitIngest {
|
|
90
|
+
knowledgeDir;
|
|
91
|
+
constructor(knowledgeDir) {
|
|
92
|
+
this.knowledgeDir = knowledgeDir;
|
|
93
|
+
}
|
|
94
|
+
async ingestFull(repoPath, branch, since) {
|
|
95
|
+
const derivedDir = join(this.knowledgeDir, 'derived');
|
|
96
|
+
if (existsSync(derivedDir)) {
|
|
97
|
+
rmSync(derivedDir, { recursive: true, force: true });
|
|
98
|
+
}
|
|
99
|
+
const raw = this.runGitLog(repoPath, undefined, branch, since);
|
|
100
|
+
const rawCommits = parseGitLog(raw);
|
|
101
|
+
const authors = normalizeAuthors(rawCommits);
|
|
102
|
+
const commitEntries = rawCommits.map(rc => this.toCommitEntry(rc, authors));
|
|
103
|
+
this.writeAuthors(authors);
|
|
104
|
+
this.writeCommits(commitEntries);
|
|
105
|
+
const meta = {
|
|
106
|
+
last_commit: rawCommits.length > 0 ? rawCommits[0].hash : '',
|
|
107
|
+
last_ingest: new Date().toISOString(),
|
|
108
|
+
branch: branch || 'HEAD',
|
|
109
|
+
};
|
|
110
|
+
this.writeMeta(meta);
|
|
111
|
+
const filesChanged = new Set(rawCommits.flatMap(c => c.files.map(f => f.path))).size;
|
|
112
|
+
return {
|
|
113
|
+
commits: rawCommits.length,
|
|
114
|
+
authors: authors.size,
|
|
115
|
+
filesChanged,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
async ingestIncremental(repoPath, branch) {
|
|
119
|
+
const meta = this.readMeta();
|
|
120
|
+
if (!meta) {
|
|
121
|
+
return this.ingestFull(repoPath, branch);
|
|
122
|
+
}
|
|
123
|
+
const lastCommitHash = meta.last_commit;
|
|
124
|
+
const raw = this.runGitLog(repoPath, lastCommitHash, branch);
|
|
125
|
+
const rawCommits = parseGitLog(raw);
|
|
126
|
+
if (rawCommits.length === 0) {
|
|
127
|
+
return { commits: 0, authors: 0, filesChanged: 0 };
|
|
128
|
+
}
|
|
129
|
+
const newAuthors = normalizeAuthors(rawCommits);
|
|
130
|
+
const existingAuthors = this.readExistingAuthors();
|
|
131
|
+
const mergedAuthors = this.mergeAuthors(existingAuthors, newAuthors);
|
|
132
|
+
const newCommitEntries = rawCommits.map(rc => this.toCommitEntry(rc, mergedAuthors));
|
|
133
|
+
this.mergeCommits(newCommitEntries);
|
|
134
|
+
this.writeAuthors(mergedAuthors);
|
|
135
|
+
const updatedMeta = {
|
|
136
|
+
last_commit: rawCommits[0].hash,
|
|
137
|
+
last_ingest: new Date().toISOString(),
|
|
138
|
+
branch: branch || meta.branch,
|
|
139
|
+
};
|
|
140
|
+
this.writeMeta(updatedMeta);
|
|
141
|
+
const filesChanged = new Set(rawCommits.flatMap(c => c.files.map(f => f.path))).size;
|
|
142
|
+
return {
|
|
143
|
+
commits: rawCommits.length,
|
|
144
|
+
authors: newAuthors.size,
|
|
145
|
+
filesChanged,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
runGitLog(repoPath, afterCommit, branch, sinceDate) {
|
|
149
|
+
const ref = branch || 'HEAD';
|
|
150
|
+
const range = afterCommit ? `${afterCommit}..${ref}` : ref;
|
|
151
|
+
const sinceFlag = sinceDate ? ` --since="${sinceDate}"` : '';
|
|
152
|
+
const cmd = `git log --numstat --format="COMMIT_START%n%H%n%s%n%an%n%ae%n%aI"${sinceFlag} ${range}`;
|
|
153
|
+
try {
|
|
154
|
+
return execSync(cmd, { cwd: repoPath, encoding: 'utf-8', maxBuffer: 100 * 1024 * 1024 });
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
// Git exits with 128 for "fatal" errors (empty repo, bad revision, etc.)
|
|
158
|
+
// These are expected cases, not failures worth surfacing.
|
|
159
|
+
const exitCode = error.status;
|
|
160
|
+
if (exitCode === 128) {
|
|
161
|
+
return '';
|
|
162
|
+
}
|
|
163
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
164
|
+
throw new Error(`git log failed: ${msg}`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
writeAuthors(authors) {
|
|
168
|
+
const derivedDir = join(this.knowledgeDir, 'derived');
|
|
169
|
+
mkdirSync(derivedDir, { recursive: true });
|
|
170
|
+
const entries = Array.from(authors.values());
|
|
171
|
+
const filePath = join(derivedDir, 'authors.yaml');
|
|
172
|
+
writeFileSync(filePath, stringifyYaml(entries), 'utf-8');
|
|
173
|
+
}
|
|
174
|
+
writeCommits(commits) {
|
|
175
|
+
const commitsDir = join(this.knowledgeDir, 'derived', 'commits');
|
|
176
|
+
mkdirSync(commitsDir, { recursive: true });
|
|
177
|
+
const monthGroups = new Map();
|
|
178
|
+
for (const commit of commits) {
|
|
179
|
+
const month = commit.date.slice(0, 7); // YYYY-MM
|
|
180
|
+
let group = monthGroups.get(month);
|
|
181
|
+
if (!group) {
|
|
182
|
+
group = [];
|
|
183
|
+
monthGroups.set(month, group);
|
|
184
|
+
}
|
|
185
|
+
group.push(commit);
|
|
186
|
+
}
|
|
187
|
+
for (const [month, group] of monthGroups) {
|
|
188
|
+
const filePath = join(commitsDir, `${month}.yaml`);
|
|
189
|
+
writeFileSync(filePath, stringifyYaml(group), 'utf-8');
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
writeMeta(meta) {
|
|
193
|
+
const derivedDir = join(this.knowledgeDir, 'derived');
|
|
194
|
+
mkdirSync(derivedDir, { recursive: true });
|
|
195
|
+
const filePath = join(derivedDir, 'meta.yaml');
|
|
196
|
+
writeFileSync(filePath, stringifyYaml(meta), 'utf-8');
|
|
197
|
+
}
|
|
198
|
+
readMeta() {
|
|
199
|
+
const filePath = join(this.knowledgeDir, 'derived', 'meta.yaml');
|
|
200
|
+
if (!existsSync(filePath))
|
|
201
|
+
return null;
|
|
202
|
+
try {
|
|
203
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
204
|
+
return parseYaml(content);
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
readExistingAuthors() {
|
|
211
|
+
const filePath = join(this.knowledgeDir, 'derived', 'authors.yaml');
|
|
212
|
+
const authors = new Map();
|
|
213
|
+
if (!existsSync(filePath))
|
|
214
|
+
return authors;
|
|
215
|
+
try {
|
|
216
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
217
|
+
const entries = parseYaml(content);
|
|
218
|
+
if (Array.isArray(entries)) {
|
|
219
|
+
for (const entry of entries) {
|
|
220
|
+
authors.set(entry.id, entry);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
// ignore parse errors
|
|
226
|
+
}
|
|
227
|
+
return authors;
|
|
228
|
+
}
|
|
229
|
+
mergeAuthors(existing, incoming) {
|
|
230
|
+
const merged = new Map(existing);
|
|
231
|
+
for (const [id, entry] of incoming) {
|
|
232
|
+
const existingEntry = merged.get(id);
|
|
233
|
+
if (existingEntry) {
|
|
234
|
+
const allEmails = new Set([...existingEntry.emails, ...entry.emails]);
|
|
235
|
+
const allAliases = new Set([...existingEntry.aliases, ...entry.aliases]);
|
|
236
|
+
merged.set(id, {
|
|
237
|
+
...existingEntry,
|
|
238
|
+
emails: Array.from(allEmails),
|
|
239
|
+
aliases: Array.from(allAliases),
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
merged.set(id, entry);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
return merged;
|
|
247
|
+
}
|
|
248
|
+
mergeCommits(newCommits) {
|
|
249
|
+
const commitsDir = join(this.knowledgeDir, 'derived', 'commits');
|
|
250
|
+
mkdirSync(commitsDir, { recursive: true });
|
|
251
|
+
const monthGroups = new Map();
|
|
252
|
+
for (const commit of newCommits) {
|
|
253
|
+
const month = commit.date.slice(0, 7);
|
|
254
|
+
let group = monthGroups.get(month);
|
|
255
|
+
if (!group) {
|
|
256
|
+
group = [];
|
|
257
|
+
monthGroups.set(month, group);
|
|
258
|
+
}
|
|
259
|
+
group.push(commit);
|
|
260
|
+
}
|
|
261
|
+
for (const [month, group] of monthGroups) {
|
|
262
|
+
const filePath = join(commitsDir, `${month}.yaml`);
|
|
263
|
+
let existing = [];
|
|
264
|
+
if (existsSync(filePath)) {
|
|
265
|
+
try {
|
|
266
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
267
|
+
const parsed = parseYaml(content);
|
|
268
|
+
if (Array.isArray(parsed)) {
|
|
269
|
+
existing = parsed;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
catch {
|
|
273
|
+
// ignore parse errors, start fresh
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
const existingHashes = new Set(existing.map(c => c.hash));
|
|
277
|
+
const dedupedNew = group.filter(c => !existingHashes.has(c.hash));
|
|
278
|
+
const merged = [...existing, ...dedupedNew];
|
|
279
|
+
writeFileSync(filePath, stringifyYaml(merged), 'utf-8');
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
toCommitEntry(rc, authors) {
|
|
283
|
+
let authorRef = '';
|
|
284
|
+
for (const [id, author] of authors) {
|
|
285
|
+
if (author.emails.some(e => e.toLowerCase() === rc.authorEmail.toLowerCase())) {
|
|
286
|
+
authorRef = `kb:author:${id}`;
|
|
287
|
+
break;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
return {
|
|
291
|
+
type: 'COMMIT',
|
|
292
|
+
hash: rc.hash,
|
|
293
|
+
message: rc.message,
|
|
294
|
+
author_ref: authorRef,
|
|
295
|
+
date: rc.date,
|
|
296
|
+
files: rc.files,
|
|
297
|
+
projections: ['temporal', 'organizational'],
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
//# sourceMappingURL=git-ingest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-ingest.js","sourceRoot":"","sources":["../../src/knowledge/git-ingest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git Query Functions for KnowledgeBase
|
|
3
|
+
*
|
|
4
|
+
* Provides analytical queries over git data (COMMIT, AUTHOR nodes)
|
|
5
|
+
* stored in the KnowledgeBase. Operates on KBNode arrays loaded from
|
|
6
|
+
* YAML files into the KB index.
|
|
7
|
+
*
|
|
8
|
+
* COMMIT nodes carry raw YAML fields: hash, message, author_ref, date, files.
|
|
9
|
+
* AUTHOR nodes carry: name, emails, aliases.
|
|
10
|
+
* These are accessed via type assertion since they're extra properties
|
|
11
|
+
* on KBNode objects loaded from YAML frontmatter.
|
|
12
|
+
*/
|
|
13
|
+
import type { KnowledgeBase } from './KnowledgeBase.js';
|
|
14
|
+
export interface ChurnEntry {
|
|
15
|
+
path: string;
|
|
16
|
+
changeCount: number;
|
|
17
|
+
totalAdded: number;
|
|
18
|
+
totalRemoved: number;
|
|
19
|
+
}
|
|
20
|
+
export interface CoChangeEntry {
|
|
21
|
+
path: string;
|
|
22
|
+
coChangeCount: number;
|
|
23
|
+
support: number;
|
|
24
|
+
}
|
|
25
|
+
export interface OwnershipEntry {
|
|
26
|
+
authorId: string;
|
|
27
|
+
authorName: string;
|
|
28
|
+
commits: number;
|
|
29
|
+
linesAdded: number;
|
|
30
|
+
linesRemoved: number;
|
|
31
|
+
}
|
|
32
|
+
export interface ArchaeologyEntry {
|
|
33
|
+
path: string;
|
|
34
|
+
lastCommitHash: string;
|
|
35
|
+
lastCommitDate: string;
|
|
36
|
+
lastAuthor: string;
|
|
37
|
+
firstCommitDate: string;
|
|
38
|
+
firstAuthor: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Compute file churn: how many commits touch each file and total lines added/removed.
|
|
42
|
+
*
|
|
43
|
+
* @param kb - KnowledgeBase instance (must be loaded)
|
|
44
|
+
* @param opts.limit - Return only the top N entries
|
|
45
|
+
* @param opts.since - ISO date string; only consider commits on or after this date
|
|
46
|
+
* @returns Churn entries sorted by changeCount descending
|
|
47
|
+
*/
|
|
48
|
+
export declare function getChurn(kb: KnowledgeBase, opts?: {
|
|
49
|
+
limit?: number;
|
|
50
|
+
since?: string;
|
|
51
|
+
}): Promise<ChurnEntry[]>;
|
|
52
|
+
/**
|
|
53
|
+
* Find files that frequently change together with the given file.
|
|
54
|
+
*
|
|
55
|
+
* For every commit that touches `filePath`, counts how many of those commits
|
|
56
|
+
* also touch each other file. `support` is the ratio of co-change count to
|
|
57
|
+
* the total number of commits touching `filePath`.
|
|
58
|
+
*
|
|
59
|
+
* @param kb - KnowledgeBase instance (must be loaded)
|
|
60
|
+
* @param filePath - The file to find co-changes for
|
|
61
|
+
* @param opts.minSupport - Minimum support threshold (default 0.1 = 10%)
|
|
62
|
+
* @returns Co-change entries sorted by coChangeCount descending
|
|
63
|
+
*/
|
|
64
|
+
export declare function getCoChanges(kb: KnowledgeBase, filePath: string, opts?: {
|
|
65
|
+
minSupport?: number;
|
|
66
|
+
}): Promise<CoChangeEntry[]>;
|
|
67
|
+
/**
|
|
68
|
+
* Compute ownership of a file: who committed changes and how much.
|
|
69
|
+
*
|
|
70
|
+
* Groups commits touching `filePath` by author_ref, sums commit count and
|
|
71
|
+
* lines added/removed. Looks up author names from AUTHOR nodes in the KB.
|
|
72
|
+
*
|
|
73
|
+
* @param kb - KnowledgeBase instance (must be loaded)
|
|
74
|
+
* @param filePath - The file to compute ownership for
|
|
75
|
+
* @returns Ownership entries sorted by commits descending
|
|
76
|
+
*/
|
|
77
|
+
export declare function getOwnership(kb: KnowledgeBase, filePath: string): Promise<OwnershipEntry[]>;
|
|
78
|
+
/**
|
|
79
|
+
* Dig into the history of a file: when it was first created, last modified, and by whom.
|
|
80
|
+
*
|
|
81
|
+
* @param kb - KnowledgeBase instance (must be loaded)
|
|
82
|
+
* @param filePath - The file to investigate
|
|
83
|
+
* @returns Archaeology entry with first/last commit info, or empty strings if no commits found
|
|
84
|
+
*/
|
|
85
|
+
export declare function getArchaeology(kb: KnowledgeBase, filePath: string): Promise<ArchaeologyEntry>;
|
|
86
|
+
//# sourceMappingURL=git-queries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-queries.d.ts","sourceRoot":"","sources":["../../src/knowledge/git-queries.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAIxD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;CACrB;AAgCD;;;;;;;GAOG;AACH,wBAAsB,QAAQ,CAC5B,EAAE,EAAE,aAAa,EACjB,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACxC,OAAO,CAAC,UAAU,EAAE,CAAC,CAyBvB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,YAAY,CAChC,EAAE,EAAE,aAAa,EACjB,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7B,OAAO,CAAC,aAAa,EAAE,CAAC,CAgC1B;AAED;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAChC,EAAE,EAAE,aAAa,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,cAAc,EAAE,CAAC,CA0C3B;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,EAAE,EAAE,aAAa,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,CAAC,CAmC3B"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git Query Functions for KnowledgeBase
|
|
3
|
+
*
|
|
4
|
+
* Provides analytical queries over git data (COMMIT, AUTHOR nodes)
|
|
5
|
+
* stored in the KnowledgeBase. Operates on KBNode arrays loaded from
|
|
6
|
+
* YAML files into the KB index.
|
|
7
|
+
*
|
|
8
|
+
* COMMIT nodes carry raw YAML fields: hash, message, author_ref, date, files.
|
|
9
|
+
* AUTHOR nodes carry: name, emails, aliases.
|
|
10
|
+
* These are accessed via type assertion since they're extra properties
|
|
11
|
+
* on KBNode objects loaded from YAML frontmatter.
|
|
12
|
+
*/
|
|
13
|
+
function getCommitHash(node) {
|
|
14
|
+
return node.hash ?? '';
|
|
15
|
+
}
|
|
16
|
+
function getCommitDate(node) {
|
|
17
|
+
return node.date ?? '';
|
|
18
|
+
}
|
|
19
|
+
function getCommitFiles(node) {
|
|
20
|
+
return node.files ?? [];
|
|
21
|
+
}
|
|
22
|
+
function getCommitAuthorRef(node) {
|
|
23
|
+
return node.author_ref ?? '';
|
|
24
|
+
}
|
|
25
|
+
function getAuthorName(node) {
|
|
26
|
+
return node.name ?? '';
|
|
27
|
+
}
|
|
28
|
+
// -- Query functions --
|
|
29
|
+
/**
|
|
30
|
+
* Compute file churn: how many commits touch each file and total lines added/removed.
|
|
31
|
+
*
|
|
32
|
+
* @param kb - KnowledgeBase instance (must be loaded)
|
|
33
|
+
* @param opts.limit - Return only the top N entries
|
|
34
|
+
* @param opts.since - ISO date string; only consider commits on or after this date
|
|
35
|
+
* @returns Churn entries sorted by changeCount descending
|
|
36
|
+
*/
|
|
37
|
+
export async function getChurn(kb, opts) {
|
|
38
|
+
const commits = await kb.queryNodes({ type: 'COMMIT' });
|
|
39
|
+
const filtered = opts?.since
|
|
40
|
+
? commits.filter(c => getCommitDate(c) >= opts.since)
|
|
41
|
+
: commits;
|
|
42
|
+
const map = new Map();
|
|
43
|
+
for (const commit of filtered) {
|
|
44
|
+
for (const file of getCommitFiles(commit)) {
|
|
45
|
+
let entry = map.get(file.path);
|
|
46
|
+
if (!entry) {
|
|
47
|
+
entry = { path: file.path, changeCount: 0, totalAdded: 0, totalRemoved: 0 };
|
|
48
|
+
map.set(file.path, entry);
|
|
49
|
+
}
|
|
50
|
+
entry.changeCount += 1;
|
|
51
|
+
entry.totalAdded += file.added;
|
|
52
|
+
entry.totalRemoved += file.removed;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const sorted = Array.from(map.values()).sort((a, b) => b.changeCount - a.changeCount);
|
|
56
|
+
return opts?.limit ? sorted.slice(0, opts.limit) : sorted;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Find files that frequently change together with the given file.
|
|
60
|
+
*
|
|
61
|
+
* For every commit that touches `filePath`, counts how many of those commits
|
|
62
|
+
* also touch each other file. `support` is the ratio of co-change count to
|
|
63
|
+
* the total number of commits touching `filePath`.
|
|
64
|
+
*
|
|
65
|
+
* @param kb - KnowledgeBase instance (must be loaded)
|
|
66
|
+
* @param filePath - The file to find co-changes for
|
|
67
|
+
* @param opts.minSupport - Minimum support threshold (default 0.1 = 10%)
|
|
68
|
+
* @returns Co-change entries sorted by coChangeCount descending
|
|
69
|
+
*/
|
|
70
|
+
export async function getCoChanges(kb, filePath, opts) {
|
|
71
|
+
const commits = await kb.queryNodes({ type: 'COMMIT' });
|
|
72
|
+
const minSupport = opts?.minSupport ?? 0.1;
|
|
73
|
+
// Find commits that touch the target file
|
|
74
|
+
const touchingCommits = commits.filter(c => getCommitFiles(c).some(f => f.path === filePath));
|
|
75
|
+
const totalTouching = touchingCommits.length;
|
|
76
|
+
if (totalTouching === 0)
|
|
77
|
+
return [];
|
|
78
|
+
// Count co-occurrences of other files
|
|
79
|
+
const coMap = new Map();
|
|
80
|
+
for (const commit of touchingCommits) {
|
|
81
|
+
for (const file of getCommitFiles(commit)) {
|
|
82
|
+
if (file.path === filePath)
|
|
83
|
+
continue;
|
|
84
|
+
coMap.set(file.path, (coMap.get(file.path) ?? 0) + 1);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const entries = [];
|
|
88
|
+
for (const [path, count] of coMap) {
|
|
89
|
+
const support = count / totalTouching;
|
|
90
|
+
if (support >= minSupport) {
|
|
91
|
+
entries.push({ path, coChangeCount: count, support });
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return entries.sort((a, b) => b.coChangeCount - a.coChangeCount);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Compute ownership of a file: who committed changes and how much.
|
|
98
|
+
*
|
|
99
|
+
* Groups commits touching `filePath` by author_ref, sums commit count and
|
|
100
|
+
* lines added/removed. Looks up author names from AUTHOR nodes in the KB.
|
|
101
|
+
*
|
|
102
|
+
* @param kb - KnowledgeBase instance (must be loaded)
|
|
103
|
+
* @param filePath - The file to compute ownership for
|
|
104
|
+
* @returns Ownership entries sorted by commits descending
|
|
105
|
+
*/
|
|
106
|
+
export async function getOwnership(kb, filePath) {
|
|
107
|
+
const commits = await kb.queryNodes({ type: 'COMMIT' });
|
|
108
|
+
const authors = await kb.queryNodes({ type: 'AUTHOR' });
|
|
109
|
+
// Build author name lookup: id -> name
|
|
110
|
+
const authorNameById = new Map();
|
|
111
|
+
for (const author of authors) {
|
|
112
|
+
authorNameById.set(author.id, getAuthorName(author));
|
|
113
|
+
}
|
|
114
|
+
// Accumulate per-author stats
|
|
115
|
+
const map = new Map();
|
|
116
|
+
for (const commit of commits) {
|
|
117
|
+
const files = getCommitFiles(commit);
|
|
118
|
+
const fileEntry = files.find(f => f.path === filePath);
|
|
119
|
+
if (!fileEntry)
|
|
120
|
+
continue;
|
|
121
|
+
const authorRef = getCommitAuthorRef(commit);
|
|
122
|
+
let stats = map.get(authorRef);
|
|
123
|
+
if (!stats) {
|
|
124
|
+
stats = { commits: 0, linesAdded: 0, linesRemoved: 0 };
|
|
125
|
+
map.set(authorRef, stats);
|
|
126
|
+
}
|
|
127
|
+
stats.commits += 1;
|
|
128
|
+
stats.linesAdded += fileEntry.added;
|
|
129
|
+
stats.linesRemoved += fileEntry.removed;
|
|
130
|
+
}
|
|
131
|
+
const entries = [];
|
|
132
|
+
for (const [authorId, stats] of map) {
|
|
133
|
+
entries.push({
|
|
134
|
+
authorId,
|
|
135
|
+
authorName: authorNameById.get(authorId) ?? authorId,
|
|
136
|
+
commits: stats.commits,
|
|
137
|
+
linesAdded: stats.linesAdded,
|
|
138
|
+
linesRemoved: stats.linesRemoved,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
return entries.sort((a, b) => b.commits - a.commits);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Dig into the history of a file: when it was first created, last modified, and by whom.
|
|
145
|
+
*
|
|
146
|
+
* @param kb - KnowledgeBase instance (must be loaded)
|
|
147
|
+
* @param filePath - The file to investigate
|
|
148
|
+
* @returns Archaeology entry with first/last commit info, or empty strings if no commits found
|
|
149
|
+
*/
|
|
150
|
+
export async function getArchaeology(kb, filePath) {
|
|
151
|
+
const commits = await kb.queryNodes({ type: 'COMMIT' });
|
|
152
|
+
// Filter to commits touching this file
|
|
153
|
+
const touching = commits.filter(c => getCommitFiles(c).some(f => f.path === filePath));
|
|
154
|
+
if (touching.length === 0) {
|
|
155
|
+
return {
|
|
156
|
+
path: filePath,
|
|
157
|
+
lastCommitHash: '',
|
|
158
|
+
lastCommitDate: '',
|
|
159
|
+
lastAuthor: '',
|
|
160
|
+
firstCommitDate: '',
|
|
161
|
+
firstAuthor: '',
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
// Sort by date ascending
|
|
165
|
+
const sorted = touching.sort((a, b) => getCommitDate(a).localeCompare(getCommitDate(b)));
|
|
166
|
+
const first = sorted[0];
|
|
167
|
+
const last = sorted[sorted.length - 1];
|
|
168
|
+
return {
|
|
169
|
+
path: filePath,
|
|
170
|
+
lastCommitHash: getCommitHash(last),
|
|
171
|
+
lastCommitDate: getCommitDate(last),
|
|
172
|
+
lastAuthor: getCommitAuthorRef(last),
|
|
173
|
+
firstCommitDate: getCommitDate(first),
|
|
174
|
+
firstAuthor: getCommitAuthorRef(first),
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=git-queries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-queries.js","sourceRoot":"","sources":["../../src/knowledge/git-queries.ts"],"names":[],"mappings":"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"}
|