@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.
Files changed (324) hide show
  1. package/LICENSE +190 -0
  2. package/dist/api/GraphAPI.d.ts +87 -0
  3. package/dist/api/GraphAPI.d.ts.map +1 -0
  4. package/dist/api/GraphAPI.js +212 -0
  5. package/dist/api/GraphAPI.js.map +1 -0
  6. package/dist/api/GuaranteeAPI.d.ts +147 -0
  7. package/dist/api/GuaranteeAPI.d.ts.map +1 -0
  8. package/dist/api/GuaranteeAPI.js +290 -0
  9. package/dist/api/GuaranteeAPI.js.map +1 -0
  10. package/dist/config/ConfigLoader.d.ts +214 -0
  11. package/dist/config/ConfigLoader.d.ts.map +1 -0
  12. package/dist/config/ConfigLoader.js +441 -0
  13. package/dist/config/ConfigLoader.js.map +1 -0
  14. package/dist/config/index.d.ts +6 -0
  15. package/dist/config/index.d.ts.map +1 -0
  16. package/dist/config/index.js +5 -0
  17. package/dist/config/index.js.map +1 -0
  18. package/dist/core/CoverageAnalyzer.d.ts +65 -0
  19. package/dist/core/CoverageAnalyzer.d.ts.map +1 -0
  20. package/dist/core/CoverageAnalyzer.js +199 -0
  21. package/dist/core/CoverageAnalyzer.js.map +1 -0
  22. package/dist/core/FileExplainer.d.ts +101 -0
  23. package/dist/core/FileExplainer.d.ts.map +1 -0
  24. package/dist/core/FileExplainer.js +140 -0
  25. package/dist/core/FileExplainer.js.map +1 -0
  26. package/dist/core/FileOverview.d.ts +124 -0
  27. package/dist/core/FileOverview.d.ts.map +1 -0
  28. package/dist/core/FileOverview.js +279 -0
  29. package/dist/core/FileOverview.js.map +1 -0
  30. package/dist/core/GrafemaUri.d.ts +66 -0
  31. package/dist/core/GrafemaUri.d.ts.map +1 -0
  32. package/dist/core/GrafemaUri.js +191 -0
  33. package/dist/core/GrafemaUri.js.map +1 -0
  34. package/dist/core/GraphBackend.d.ts +158 -0
  35. package/dist/core/GraphBackend.d.ts.map +1 -0
  36. package/dist/core/GraphBackend.js +85 -0
  37. package/dist/core/GraphBackend.js.map +1 -0
  38. package/dist/core/GraphFreshnessChecker.d.ts +33 -0
  39. package/dist/core/GraphFreshnessChecker.d.ts.map +1 -0
  40. package/dist/core/GraphFreshnessChecker.js +104 -0
  41. package/dist/core/GraphFreshnessChecker.js.map +1 -0
  42. package/dist/core/GuaranteeManager.d.ts +254 -0
  43. package/dist/core/GuaranteeManager.d.ts.map +1 -0
  44. package/dist/core/GuaranteeManager.js +447 -0
  45. package/dist/core/GuaranteeManager.js.map +1 -0
  46. package/dist/core/HashUtils.d.ts +24 -0
  47. package/dist/core/HashUtils.d.ts.map +1 -0
  48. package/dist/core/HashUtils.js +46 -0
  49. package/dist/core/HashUtils.js.map +1 -0
  50. package/dist/core/IncrementalReanalyzer.d.ts +33 -0
  51. package/dist/core/IncrementalReanalyzer.d.ts.map +1 -0
  52. package/dist/core/IncrementalReanalyzer.js +67 -0
  53. package/dist/core/IncrementalReanalyzer.js.map +1 -0
  54. package/dist/core/ResourceRegistry.d.ts +17 -0
  55. package/dist/core/ResourceRegistry.d.ts.map +1 -0
  56. package/dist/core/ResourceRegistry.js +32 -0
  57. package/dist/core/ResourceRegistry.js.map +1 -0
  58. package/dist/core/SemanticId.d.ts +159 -0
  59. package/dist/core/SemanticId.d.ts.map +1 -0
  60. package/dist/core/SemanticId.js +291 -0
  61. package/dist/core/SemanticId.js.map +1 -0
  62. package/dist/core/VersionManager.d.ts +166 -0
  63. package/dist/core/VersionManager.d.ts.map +1 -0
  64. package/dist/core/VersionManager.js +239 -0
  65. package/dist/core/VersionManager.js.map +1 -0
  66. package/dist/core/brandNodeInternal.d.ts +14 -0
  67. package/dist/core/brandNodeInternal.d.ts.map +1 -0
  68. package/dist/core/brandNodeInternal.js +4 -0
  69. package/dist/core/brandNodeInternal.js.map +1 -0
  70. package/dist/core/nodes/GuaranteeNode.d.ts +76 -0
  71. package/dist/core/nodes/GuaranteeNode.d.ts.map +1 -0
  72. package/dist/core/nodes/GuaranteeNode.js +118 -0
  73. package/dist/core/nodes/GuaranteeNode.js.map +1 -0
  74. package/dist/core/nodes/IssueNode.d.ts +73 -0
  75. package/dist/core/nodes/IssueNode.d.ts.map +1 -0
  76. package/dist/core/nodes/IssueNode.js +130 -0
  77. package/dist/core/nodes/IssueNode.js.map +1 -0
  78. package/dist/core/nodes/NodeKind.d.ts +104 -0
  79. package/dist/core/nodes/NodeKind.d.ts.map +1 -0
  80. package/dist/core/nodes/NodeKind.js +166 -0
  81. package/dist/core/nodes/NodeKind.js.map +1 -0
  82. package/dist/diagnostics/DiagnosticCollector.d.ts +103 -0
  83. package/dist/diagnostics/DiagnosticCollector.d.ts.map +1 -0
  84. package/dist/diagnostics/DiagnosticCollector.js +133 -0
  85. package/dist/diagnostics/DiagnosticCollector.js.map +1 -0
  86. package/dist/diagnostics/DiagnosticReporter.d.ts +122 -0
  87. package/dist/diagnostics/DiagnosticReporter.d.ts.map +1 -0
  88. package/dist/diagnostics/DiagnosticReporter.js +300 -0
  89. package/dist/diagnostics/DiagnosticReporter.js.map +1 -0
  90. package/dist/diagnostics/DiagnosticWriter.d.ts +31 -0
  91. package/dist/diagnostics/DiagnosticWriter.d.ts.map +1 -0
  92. package/dist/diagnostics/DiagnosticWriter.js +44 -0
  93. package/dist/diagnostics/DiagnosticWriter.js.map +1 -0
  94. package/dist/diagnostics/categories.d.ts +57 -0
  95. package/dist/diagnostics/categories.d.ts.map +1 -0
  96. package/dist/diagnostics/categories.js +71 -0
  97. package/dist/diagnostics/categories.js.map +1 -0
  98. package/dist/diagnostics/index.d.ts +17 -0
  99. package/dist/diagnostics/index.d.ts.map +1 -0
  100. package/dist/diagnostics/index.js +15 -0
  101. package/dist/diagnostics/index.js.map +1 -0
  102. package/dist/errors/GrafemaError.d.ts +200 -0
  103. package/dist/errors/GrafemaError.d.ts.map +1 -0
  104. package/dist/errors/GrafemaError.js +209 -0
  105. package/dist/errors/GrafemaError.js.map +1 -0
  106. package/dist/index.d.ts +75 -0
  107. package/dist/index.d.ts.map +1 -0
  108. package/dist/index.js +76 -0
  109. package/dist/index.js.map +1 -0
  110. package/dist/instructions/index.d.ts +8 -0
  111. package/dist/instructions/index.d.ts.map +1 -0
  112. package/dist/instructions/index.js +20 -0
  113. package/dist/instructions/index.js.map +1 -0
  114. package/dist/instructions/onboarding.md +133 -0
  115. package/dist/knowledge/KnowledgeBase.d.ts +113 -0
  116. package/dist/knowledge/KnowledgeBase.d.ts.map +1 -0
  117. package/dist/knowledge/KnowledgeBase.js +420 -0
  118. package/dist/knowledge/KnowledgeBase.js.map +1 -0
  119. package/dist/knowledge/SemanticAddressResolver.d.ts +59 -0
  120. package/dist/knowledge/SemanticAddressResolver.d.ts.map +1 -0
  121. package/dist/knowledge/SemanticAddressResolver.js +160 -0
  122. package/dist/knowledge/SemanticAddressResolver.js.map +1 -0
  123. package/dist/knowledge/git-ingest.d.ts +58 -0
  124. package/dist/knowledge/git-ingest.d.ts.map +1 -0
  125. package/dist/knowledge/git-ingest.js +301 -0
  126. package/dist/knowledge/git-ingest.js.map +1 -0
  127. package/dist/knowledge/git-queries.d.ts +86 -0
  128. package/dist/knowledge/git-queries.d.ts.map +1 -0
  129. package/dist/knowledge/git-queries.js +177 -0
  130. package/dist/knowledge/git-queries.js.map +1 -0
  131. package/dist/knowledge/index.d.ts +14 -0
  132. package/dist/knowledge/index.d.ts.map +1 -0
  133. package/dist/knowledge/index.js +10 -0
  134. package/dist/knowledge/index.js.map +1 -0
  135. package/dist/knowledge/parser.d.ts +39 -0
  136. package/dist/knowledge/parser.d.ts.map +1 -0
  137. package/dist/knowledge/parser.js +292 -0
  138. package/dist/knowledge/parser.js.map +1 -0
  139. package/dist/knowledge/types.d.ts +133 -0
  140. package/dist/knowledge/types.d.ts.map +1 -0
  141. package/dist/knowledge/types.js +8 -0
  142. package/dist/knowledge/types.js.map +1 -0
  143. package/dist/logging/Logger.d.ts +98 -0
  144. package/dist/logging/Logger.d.ts.map +1 -0
  145. package/dist/logging/Logger.js +274 -0
  146. package/dist/logging/Logger.js.map +1 -0
  147. package/dist/notation/archetypes.d.ts +36 -0
  148. package/dist/notation/archetypes.d.ts.map +1 -0
  149. package/dist/notation/archetypes.js +173 -0
  150. package/dist/notation/archetypes.js.map +1 -0
  151. package/dist/notation/fold.d.ts +25 -0
  152. package/dist/notation/fold.d.ts.map +1 -0
  153. package/dist/notation/fold.js +598 -0
  154. package/dist/notation/fold.js.map +1 -0
  155. package/dist/notation/index.d.ts +18 -0
  156. package/dist/notation/index.d.ts.map +1 -0
  157. package/dist/notation/index.js +16 -0
  158. package/dist/notation/index.js.map +1 -0
  159. package/dist/notation/lodExtractor.d.ts +32 -0
  160. package/dist/notation/lodExtractor.d.ts.map +1 -0
  161. package/dist/notation/lodExtractor.js +149 -0
  162. package/dist/notation/lodExtractor.js.map +1 -0
  163. package/dist/notation/nameShortener.d.ts +22 -0
  164. package/dist/notation/nameShortener.d.ts.map +1 -0
  165. package/dist/notation/nameShortener.js +24 -0
  166. package/dist/notation/nameShortener.js.map +1 -0
  167. package/dist/notation/perspectives.d.ts +11 -0
  168. package/dist/notation/perspectives.d.ts.map +1 -0
  169. package/dist/notation/perspectives.js +16 -0
  170. package/dist/notation/perspectives.js.map +1 -0
  171. package/dist/notation/renderer.d.ts +31 -0
  172. package/dist/notation/renderer.d.ts.map +1 -0
  173. package/dist/notation/renderer.js +315 -0
  174. package/dist/notation/renderer.js.map +1 -0
  175. package/dist/notation/traceRenderer.d.ts +39 -0
  176. package/dist/notation/traceRenderer.d.ts.map +1 -0
  177. package/dist/notation/traceRenderer.js +358 -0
  178. package/dist/notation/traceRenderer.js.map +1 -0
  179. package/dist/notation/types.d.ts +66 -0
  180. package/dist/notation/types.d.ts.map +1 -0
  181. package/dist/notation/types.js +10 -0
  182. package/dist/notation/types.js.map +1 -0
  183. package/dist/queries/NodeContext.d.ts +81 -0
  184. package/dist/queries/NodeContext.d.ts.map +1 -0
  185. package/dist/queries/NodeContext.js +196 -0
  186. package/dist/queries/NodeContext.js.map +1 -0
  187. package/dist/queries/findCallsInFunction.d.ts +62 -0
  188. package/dist/queries/findCallsInFunction.d.ts.map +1 -0
  189. package/dist/queries/findCallsInFunction.js +169 -0
  190. package/dist/queries/findCallsInFunction.js.map +1 -0
  191. package/dist/queries/findContainingFunction.d.ts +57 -0
  192. package/dist/queries/findContainingFunction.d.ts.map +1 -0
  193. package/dist/queries/findContainingFunction.js +91 -0
  194. package/dist/queries/findContainingFunction.js.map +1 -0
  195. package/dist/queries/index.d.ts +18 -0
  196. package/dist/queries/index.d.ts.map +1 -0
  197. package/dist/queries/index.js +14 -0
  198. package/dist/queries/index.js.map +1 -0
  199. package/dist/queries/traceDataflow.d.ts +65 -0
  200. package/dist/queries/traceDataflow.d.ts.map +1 -0
  201. package/dist/queries/traceDataflow.js +754 -0
  202. package/dist/queries/traceDataflow.js.map +1 -0
  203. package/dist/queries/traceValues.d.ts +70 -0
  204. package/dist/queries/traceValues.d.ts.map +1 -0
  205. package/dist/queries/traceValues.js +373 -0
  206. package/dist/queries/traceValues.js.map +1 -0
  207. package/dist/queries/types.d.ts +166 -0
  208. package/dist/queries/types.d.ts.map +1 -0
  209. package/dist/queries/types.js +10 -0
  210. package/dist/queries/types.js.map +1 -0
  211. package/dist/schema/GraphSchemaExtractor.d.ts +53 -0
  212. package/dist/schema/GraphSchemaExtractor.d.ts.map +1 -0
  213. package/dist/schema/GraphSchemaExtractor.js +125 -0
  214. package/dist/schema/GraphSchemaExtractor.js.map +1 -0
  215. package/dist/schema/InterfaceSchemaExtractor.d.ts +73 -0
  216. package/dist/schema/InterfaceSchemaExtractor.d.ts.map +1 -0
  217. package/dist/schema/InterfaceSchemaExtractor.js +113 -0
  218. package/dist/schema/InterfaceSchemaExtractor.js.map +1 -0
  219. package/dist/schema/index.d.ts +5 -0
  220. package/dist/schema/index.d.ts.map +1 -0
  221. package/dist/schema/index.js +3 -0
  222. package/dist/schema/index.js.map +1 -0
  223. package/dist/storage/backends/RFDBServerBackend.d.ts +356 -0
  224. package/dist/storage/backends/RFDBServerBackend.d.ts.map +1 -0
  225. package/dist/storage/backends/RFDBServerBackend.js +748 -0
  226. package/dist/storage/backends/RFDBServerBackend.js.map +1 -0
  227. package/dist/storage/backends/typeValidation.d.ts +47 -0
  228. package/dist/storage/backends/typeValidation.d.ts.map +1 -0
  229. package/dist/storage/backends/typeValidation.js +141 -0
  230. package/dist/storage/backends/typeValidation.js.map +1 -0
  231. package/dist/utils/findRfdbBinary.d.ts +67 -0
  232. package/dist/utils/findRfdbBinary.d.ts.map +1 -0
  233. package/dist/utils/findRfdbBinary.js +261 -0
  234. package/dist/utils/findRfdbBinary.js.map +1 -0
  235. package/dist/utils/lazyDownload.d.ts +43 -0
  236. package/dist/utils/lazyDownload.d.ts.map +1 -0
  237. package/dist/utils/lazyDownload.js +175 -0
  238. package/dist/utils/lazyDownload.js.map +1 -0
  239. package/dist/utils/moduleResolution.d.ts +134 -0
  240. package/dist/utils/moduleResolution.d.ts.map +1 -0
  241. package/dist/utils/moduleResolution.js +189 -0
  242. package/dist/utils/moduleResolution.js.map +1 -0
  243. package/dist/utils/resolveNodeFile.d.ts +13 -0
  244. package/dist/utils/resolveNodeFile.d.ts.map +1 -0
  245. package/dist/utils/resolveNodeFile.js +18 -0
  246. package/dist/utils/resolveNodeFile.js.map +1 -0
  247. package/dist/utils/startRfdbServer.d.ts +63 -0
  248. package/dist/utils/startRfdbServer.d.ts.map +1 -0
  249. package/dist/utils/startRfdbServer.js +142 -0
  250. package/dist/utils/startRfdbServer.js.map +1 -0
  251. package/dist/validation/PathValidator.d.ts +80 -0
  252. package/dist/validation/PathValidator.d.ts.map +1 -0
  253. package/dist/validation/PathValidator.js +252 -0
  254. package/dist/validation/PathValidator.js.map +1 -0
  255. package/dist/version.d.ts +11 -0
  256. package/dist/version.d.ts.map +1 -0
  257. package/dist/version.js +26 -0
  258. package/dist/version.js.map +1 -0
  259. package/package.json +50 -0
  260. package/src/api/GraphAPI.ts +307 -0
  261. package/src/api/GuaranteeAPI.ts +402 -0
  262. package/src/config/ConfigLoader.ts +653 -0
  263. package/src/config/index.ts +13 -0
  264. package/src/core/CoverageAnalyzer.ts +243 -0
  265. package/src/core/FileExplainer.ts +179 -0
  266. package/src/core/FileOverview.ts +397 -0
  267. package/src/core/GrafemaUri.ts +216 -0
  268. package/src/core/GraphBackend.ts +266 -0
  269. package/src/core/GraphFreshnessChecker.ts +145 -0
  270. package/src/core/GuaranteeManager.ts +684 -0
  271. package/src/core/HashUtils.ts +48 -0
  272. package/src/core/IncrementalReanalyzer.ts +106 -0
  273. package/src/core/ResourceRegistry.ts +39 -0
  274. package/src/core/SemanticId.ts +423 -0
  275. package/src/core/VersionManager.ts +405 -0
  276. package/src/core/brandNodeInternal.ts +16 -0
  277. package/src/core/nodes/GuaranteeNode.ts +162 -0
  278. package/src/core/nodes/IssueNode.ts +177 -0
  279. package/src/core/nodes/NodeKind.ts +192 -0
  280. package/src/diagnostics/DiagnosticCollector.ts +170 -0
  281. package/src/diagnostics/DiagnosticReporter.ts +395 -0
  282. package/src/diagnostics/DiagnosticWriter.ts +50 -0
  283. package/src/diagnostics/categories.ts +104 -0
  284. package/src/diagnostics/index.ts +30 -0
  285. package/src/errors/GrafemaError.ts +297 -0
  286. package/src/index.ts +261 -0
  287. package/src/instructions/index.ts +21 -0
  288. package/src/instructions/onboarding.md +133 -0
  289. package/src/knowledge/KnowledgeBase.ts +486 -0
  290. package/src/knowledge/SemanticAddressResolver.ts +191 -0
  291. package/src/knowledge/git-ingest.ts +402 -0
  292. package/src/knowledge/git-queries.ts +269 -0
  293. package/src/knowledge/index.ts +29 -0
  294. package/src/knowledge/parser.ts +294 -0
  295. package/src/knowledge/types.ts +146 -0
  296. package/src/logging/Logger.ts +303 -0
  297. package/src/notation/archetypes.ts +189 -0
  298. package/src/notation/fold.ts +696 -0
  299. package/src/notation/index.ts +27 -0
  300. package/src/notation/lodExtractor.ts +177 -0
  301. package/src/notation/nameShortener.ts +24 -0
  302. package/src/notation/perspectives.ts +18 -0
  303. package/src/notation/renderer.ts +394 -0
  304. package/src/notation/traceRenderer.ts +458 -0
  305. package/src/notation/types.ts +79 -0
  306. package/src/queries/NodeContext.ts +280 -0
  307. package/src/queries/findCallsInFunction.ts +249 -0
  308. package/src/queries/findContainingFunction.ts +124 -0
  309. package/src/queries/index.ts +44 -0
  310. package/src/queries/traceDataflow.ts +838 -0
  311. package/src/queries/traceValues.ts +531 -0
  312. package/src/queries/types.ts +191 -0
  313. package/src/schema/GraphSchemaExtractor.ts +177 -0
  314. package/src/schema/InterfaceSchemaExtractor.ts +173 -0
  315. package/src/schema/index.ts +5 -0
  316. package/src/storage/backends/RFDBServerBackend.ts +895 -0
  317. package/src/storage/backends/typeValidation.ts +154 -0
  318. package/src/utils/findRfdbBinary.ts +288 -0
  319. package/src/utils/lazyDownload.ts +206 -0
  320. package/src/utils/moduleResolution.ts +271 -0
  321. package/src/utils/resolveNodeFile.ts +18 -0
  322. package/src/utils/startRfdbServer.ts +197 -0
  323. package/src/validation/PathValidator.ts +334 -0
  324. 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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"}