@mneme-ai/core 0.11.0 → 0.12.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.
Files changed (45) hide show
  1. package/dist/insights/chronicle.d.ts +41 -0
  2. package/dist/insights/chronicle.d.ts.map +1 -0
  3. package/dist/insights/chronicle.js +169 -0
  4. package/dist/insights/chronicle.js.map +1 -0
  5. package/dist/insights/chronicle.test.d.ts +2 -0
  6. package/dist/insights/chronicle.test.d.ts.map +1 -0
  7. package/dist/insights/chronicle.test.js +92 -0
  8. package/dist/insights/chronicle.test.js.map +1 -0
  9. package/dist/insights/constellation.d.ts +63 -0
  10. package/dist/insights/constellation.d.ts.map +1 -0
  11. package/dist/insights/constellation.js +147 -0
  12. package/dist/insights/constellation.js.map +1 -0
  13. package/dist/insights/constellation.test.d.ts +2 -0
  14. package/dist/insights/constellation.test.d.ts.map +1 -0
  15. package/dist/insights/constellation.test.js +105 -0
  16. package/dist/insights/constellation.test.js.map +1 -0
  17. package/dist/insights/dna.d.ts +100 -0
  18. package/dist/insights/dna.d.ts.map +1 -0
  19. package/dist/insights/dna.js +264 -0
  20. package/dist/insights/dna.js.map +1 -0
  21. package/dist/insights/dna.test.d.ts +2 -0
  22. package/dist/insights/dna.test.d.ts.map +1 -0
  23. package/dist/insights/dna.test.js +142 -0
  24. package/dist/insights/dna.test.js.map +1 -0
  25. package/dist/insights/drift.d.ts +43 -0
  26. package/dist/insights/drift.d.ts.map +1 -0
  27. package/dist/insights/drift.js +170 -0
  28. package/dist/insights/drift.js.map +1 -0
  29. package/dist/insights/drift.test.d.ts +2 -0
  30. package/dist/insights/drift.test.d.ts.map +1 -0
  31. package/dist/insights/drift.test.js +126 -0
  32. package/dist/insights/drift.test.js.map +1 -0
  33. package/dist/insights/index.d.ts +5 -0
  34. package/dist/insights/index.d.ts.map +1 -1
  35. package/dist/insights/index.js +5 -0
  36. package/dist/insights/index.js.map +1 -1
  37. package/dist/insights/oracle.d.ts +59 -0
  38. package/dist/insights/oracle.d.ts.map +1 -0
  39. package/dist/insights/oracle.js +0 -0
  40. package/dist/insights/oracle.js.map +1 -0
  41. package/dist/insights/oracle.test.d.ts +2 -0
  42. package/dist/insights/oracle.test.d.ts.map +1 -0
  43. package/dist/insights/oracle.test.js +133 -0
  44. package/dist/insights/oracle.test.js.map +1 -0
  45. package/package.json +1 -1
@@ -0,0 +1,105 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { buildConstellation, renderConstellationAscii } from "./constellation.js";
3
+ function mk(p) {
4
+ return {
5
+ hash: p.hash,
6
+ shortHash: p.hash.slice(0, 7),
7
+ authorName: p.author,
8
+ authorEmail: p.author.toLowerCase() + "@x.com",
9
+ authorDate: p.date,
10
+ committerDate: p.date,
11
+ subject: p.subject,
12
+ body: "",
13
+ files: p.files ?? [],
14
+ parents: [],
15
+ };
16
+ }
17
+ describe("buildConstellation", () => {
18
+ it("returns empty constellation for no commits", () => {
19
+ const c = buildConstellation([]);
20
+ expect(c.fileStars).toHaveLength(0);
21
+ expect(c.authorOrbitals).toHaveLength(0);
22
+ expect(c.fileEdges).toHaveLength(0);
23
+ });
24
+ it("builds file stars sorted by weight descending", () => {
25
+ const commits = [
26
+ ...Array.from({ length: 5 }, (_, i) => mk({ hash: `a${i}`, date: `2024-01-${(i + 1).toString().padStart(2, "0")}`, subject: "x", author: "Alice", files: ["src/hot.ts"] })),
27
+ ...Array.from({ length: 2 }, (_, i) => mk({ hash: `b${i}`, date: `2024-01-${(i + 1).toString().padStart(2, "0")}`, subject: "x", author: "Alice", files: ["src/cool.ts"] })),
28
+ ];
29
+ const c = buildConstellation(commits);
30
+ expect(c.fileStars[0].filePath).toBe("src/hot.ts");
31
+ expect(c.fileStars[0].weight).toBe(5);
32
+ });
33
+ it("filters out files below minFileTouches", () => {
34
+ const commits = [
35
+ mk({ hash: "a1", date: "2024-01-01", subject: "x", author: "Alice", files: ["src/rare.ts"] }),
36
+ ];
37
+ const c = buildConstellation(commits, { minFileTouches: 2 });
38
+ expect(c.fileStars).toHaveLength(0);
39
+ });
40
+ it("builds author orbitals sorted by weight desc", () => {
41
+ const commits = [
42
+ ...Array.from({ length: 5 }, (_, i) => mk({ hash: `a${i}`, date: `2024-01-${(i + 1).toString().padStart(2, "0")}`, subject: "x", author: "Alice", files: ["src/x.ts"] })),
43
+ ...Array.from({ length: 3 }, (_, i) => mk({ hash: `b${i}`, date: `2024-01-${(i + 1).toString().padStart(2, "0")}`, subject: "x", author: "Bob", files: ["src/x.ts"] })),
44
+ ];
45
+ const c = buildConstellation(commits);
46
+ expect(c.authorOrbitals[0].author).toBe("Alice");
47
+ expect(c.authorOrbitals[0].weight).toBe(5);
48
+ });
49
+ it("creates co-edit edges between files committed together", () => {
50
+ const commits = [
51
+ mk({ hash: "a1", date: "2024-01-01", subject: "x", author: "Alice", files: ["src/a.ts", "src/b.ts"] }),
52
+ mk({ hash: "a2", date: "2024-01-02", subject: "x", author: "Alice", files: ["src/a.ts", "src/b.ts"] }),
53
+ ];
54
+ const c = buildConstellation(commits);
55
+ const edge = c.fileEdges.find((e) => (e.fileA === "src/a.ts" && e.fileB === "src/b.ts") || (e.fileA === "src/b.ts" && e.fileB === "src/a.ts"));
56
+ expect(edge).toBeDefined();
57
+ expect(edge.coEdits).toBe(2);
58
+ });
59
+ it("file edges always have fileA < fileB alphabetically", () => {
60
+ const commits = [
61
+ mk({ hash: "a1", date: "2024-01-01", subject: "x", author: "Alice", files: ["src/z.ts", "src/a.ts"] }),
62
+ mk({ hash: "a2", date: "2024-01-02", subject: "x", author: "Alice", files: ["src/z.ts", "src/a.ts"] }),
63
+ ];
64
+ const c = buildConstellation(commits);
65
+ for (const e of c.fileEdges) {
66
+ expect(e.fileA.localeCompare(e.fileB)).toBeLessThan(0);
67
+ }
68
+ });
69
+ it("clusterCount counts distinct top-level directories", () => {
70
+ const commits = [
71
+ mk({ hash: "a1", date: "2024-01-01", subject: "x", author: "A", files: ["src/auth/x.ts", "src/auth/y.ts"] }),
72
+ mk({ hash: "a2", date: "2024-01-02", subject: "x", author: "A", files: ["src/auth/x.ts"] }),
73
+ mk({ hash: "b1", date: "2024-01-03", subject: "x", author: "B", files: ["packages/x.ts"] }),
74
+ mk({ hash: "b2", date: "2024-01-04", subject: "x", author: "B", files: ["packages/x.ts"] }),
75
+ ];
76
+ const c = buildConstellation(commits);
77
+ expect(c.clusterCount).toBeGreaterThanOrEqual(2);
78
+ });
79
+ it("renderConstellationAscii produces non-empty string with key sections", () => {
80
+ const commits = [
81
+ mk({ hash: "a1", date: "2024-01-01", subject: "x", author: "Alice", files: ["src/a.ts", "src/b.ts"] }),
82
+ mk({ hash: "a2", date: "2024-01-02", subject: "x", author: "Alice", files: ["src/a.ts", "src/b.ts"] }),
83
+ ];
84
+ const c = buildConstellation(commits);
85
+ const ascii = renderConstellationAscii(c);
86
+ expect(ascii).toContain("Brightest stars");
87
+ expect(ascii).toContain("Closest orbitals");
88
+ expect(ascii).toContain("co-edit");
89
+ });
90
+ it("respects maxStars cap", () => {
91
+ const commits = [];
92
+ for (let i = 0; i < 50; i++) {
93
+ commits.push(mk({
94
+ hash: `c${i}`,
95
+ date: `2024-01-${((i % 28) + 1).toString().padStart(2, "0")}`,
96
+ subject: "x",
97
+ author: "A",
98
+ files: [`src/f${i}.ts`, `src/f${i}.ts`], // touched twice so it survives min filter
99
+ }));
100
+ }
101
+ const c = buildConstellation(commits, { maxStars: 10 });
102
+ expect(c.fileStars.length).toBeLessThanOrEqual(10);
103
+ });
104
+ });
105
+ //# sourceMappingURL=constellation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constellation.test.js","sourceRoot":"","sources":["../../src/insights/constellation.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * `mneme dna [@author]` — extract a "Codebase DNA" fingerprint for a
3
+ * contributor: their preferred patterns, message style, hours, and file
4
+ * affinity, packaged as an exportable JSON artifact.
5
+ *
6
+ * What makes this novel:
7
+ * - Existing tools either show *snapshot* metrics (HowYouCode) or
8
+ * ownership / hotspots (Hercules). None extract a stable, exportable,
9
+ * comparable per-developer fingerprint from commit *history*.
10
+ * - DNA is shareable as JSON — collaborators can compare strands,
11
+ * teams can baseline, the same person can track themselves over time.
12
+ * - Compatibility scoring (Jaccard over multiple feature axes) gives
13
+ * "how genetically similar are two coders?" in one number.
14
+ *
15
+ * Pure data extraction. CLI renders + writes JSON.
16
+ */
17
+ import type { Commit } from "../types.js";
18
+ export interface CodebaseDna {
19
+ /** Author email or login this strand was extracted from. */
20
+ author: string;
21
+ /** Number of commits used to build this strand. */
22
+ commitCount: number;
23
+ /** Date range covered by this strand. */
24
+ fromDate: string;
25
+ toDate: string;
26
+ /** Style genome — surface-level coding habits inferred from commits. */
27
+ style: StyleGenome;
28
+ /** Commit message DNA — how this person writes. */
29
+ message: MessageGenome;
30
+ /** Working hours pattern (UTC). */
31
+ hours: HoursGenome;
32
+ /** File affinity — what they touch and avoid. */
33
+ files: FilesGenome;
34
+ /**
35
+ * Stable hash of the strand — short identifier suitable for sharing
36
+ * ("DNA hash"), like a git SHA prefix. Computed deterministically from
37
+ * the genome contents.
38
+ */
39
+ hash: string;
40
+ }
41
+ export interface StyleGenome {
42
+ /** Median number of files touched per commit. */
43
+ filesPerCommit: number;
44
+ /** Mean churn per commit (insertions + deletions, capped). */
45
+ churnPerCommit: number;
46
+ /** Fraction of commits touching tests (path includes test/spec). */
47
+ testRatio: number;
48
+ /** Fraction of commits referencing an issue or PR. */
49
+ issueRefRatio: number;
50
+ /** Fraction of commits whose subject starts with a conventional prefix. */
51
+ conventionalRatio: number;
52
+ }
53
+ export interface MessageGenome {
54
+ /** Mean subject length in characters. */
55
+ avgSubjectLength: number;
56
+ /** Fraction of subjects in imperative mood (rough heuristic). */
57
+ imperativeRatio: number;
58
+ /** Fraction of commits that include a body. */
59
+ bodyRatio: number;
60
+ /** Top 5 leading verbs / prefixes used. */
61
+ topVerbs: Array<{
62
+ verb: string;
63
+ count: number;
64
+ }>;
65
+ }
66
+ export interface HoursGenome {
67
+ /** Hour-of-day histogram (UTC). 24 buckets. */
68
+ byHour: number[];
69
+ /** Day-of-week histogram (0=Sunday). 7 buckets. */
70
+ byWeekday: number[];
71
+ /** Fraction of commits on Sat/Sun. */
72
+ weekendRatio: number;
73
+ /** The peak window as "HH:00–HH:00" UTC. */
74
+ peakWindow: string;
75
+ }
76
+ export interface FilesGenome {
77
+ /** Top directories by commit count, normalized. */
78
+ topDirs: Array<{
79
+ dir: string;
80
+ share: number;
81
+ }>;
82
+ /** Top file extensions by commit count. */
83
+ topExts: Array<{
84
+ ext: string;
85
+ share: number;
86
+ }>;
87
+ }
88
+ /** Build a Codebase DNA strand for the given author from commits they made. */
89
+ export declare function extractDna(commits: Commit[], author: string, opts?: {
90
+ now?: number;
91
+ }): CodebaseDna;
92
+ /** Compatibility score 0..1 between two DNA strands. */
93
+ export declare function compareDna(a: CodebaseDna, b: CodebaseDna): {
94
+ similarity: number;
95
+ axes: Array<{
96
+ axis: string;
97
+ similarity: number;
98
+ }>;
99
+ };
100
+ //# sourceMappingURL=dna.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dna.d.ts","sourceRoot":"","sources":["../../src/insights/dna.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,WAAW;IAC1B,4DAA4D;IAC5D,MAAM,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,WAAW,EAAE,MAAM,CAAC;IACpB,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,KAAK,EAAE,WAAW,CAAC;IACnB,mDAAmD;IACnD,OAAO,EAAE,aAAa,CAAC;IACvB,mCAAmC;IACnC,KAAK,EAAE,WAAW,CAAC;IACnB,iDAAiD;IACjD,KAAK,EAAE,WAAW,CAAC;IACnB;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,iDAAiD;IACjD,cAAc,EAAE,MAAM,CAAC;IACvB,8DAA8D;IAC9D,cAAc,EAAE,MAAM,CAAC;IACvB,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC;IAClB,sDAAsD;IACtD,aAAa,EAAE,MAAM,CAAC;IACtB,2EAA2E;IAC3E,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,yCAAyC;IACzC,gBAAgB,EAAE,MAAM,CAAC;IACzB,iEAAiE;IACjE,eAAe,EAAE,MAAM,CAAC;IACxB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,2CAA2C;IAC3C,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClD;AAED,MAAM,WAAW,WAAW;IAC1B,+CAA+C;IAC/C,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,mDAAmD;IACnD,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,sCAAsC;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,mDAAmD;IACnD,OAAO,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,2CAA2C;IAC3C,OAAO,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChD;AAYD,+EAA+E;AAC/E,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,EAAE,EACjB,MAAM,EAAE,MAAM,EACd,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAC1B,WAAW,CAkCb;AAED,wDAAwD;AACxD,wBAAgB,UAAU,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,GAAG;IAC1D,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnD,CAYA"}
@@ -0,0 +1,264 @@
1
+ const CONVENTIONAL_RE = /^(feat|fix|chore|docs|style|refactor|test|perf|build|ci|revert)(\([^)]*\))?:/;
2
+ const IMPERATIVE_FIRST_WORDS = new Set([
3
+ "add", "fix", "update", "remove", "refactor", "improve", "rename", "move",
4
+ "extract", "introduce", "implement", "support", "drop", "use", "make", "ensure",
5
+ "prevent", "handle", "wire", "expose", "switch", "replace", "migrate",
6
+ "polish", "simplify", "consolidate", "split", "delete", "init", "scaffold",
7
+ "bump", "release", "publish", "ship", "build", "configure", "enable", "disable",
8
+ "create", "test", "document", "clarify", "tighten", "guard", "validate",
9
+ ]);
10
+ /** Build a Codebase DNA strand for the given author from commits they made. */
11
+ export function extractDna(commits, author, opts = {}) {
12
+ const filtered = commits.filter((c) => c.authorEmail.toLowerCase() === author.toLowerCase() ||
13
+ c.authorName.toLowerCase() === author.toLowerCase());
14
+ if (filtered.length === 0) {
15
+ return emptyDna(author);
16
+ }
17
+ const sorted = [...filtered].sort((a, b) => a.authorDate.localeCompare(b.authorDate));
18
+ const fromDate = sorted[0].authorDate.slice(0, 10);
19
+ const toDate = sorted[sorted.length - 1].authorDate.slice(0, 10);
20
+ const style = computeStyle(sorted);
21
+ const message = computeMessage(sorted);
22
+ const hours = computeHours(sorted);
23
+ const files = computeFiles(sorted);
24
+ const dna = {
25
+ author,
26
+ commitCount: sorted.length,
27
+ fromDate,
28
+ toDate,
29
+ style,
30
+ message,
31
+ hours,
32
+ files,
33
+ hash: "", // filled in below
34
+ };
35
+ dna.hash = stableHash(dna);
36
+ return dna;
37
+ }
38
+ /** Compatibility score 0..1 between two DNA strands. */
39
+ export function compareDna(a, b) {
40
+ const axes = [];
41
+ axes.push({ axis: "style", similarity: styleSim(a.style, b.style) });
42
+ axes.push({ axis: "message", similarity: messageSim(a.message, b.message) });
43
+ axes.push({ axis: "hours", similarity: hoursSim(a.hours, b.hours) });
44
+ axes.push({ axis: "files", similarity: filesSim(a.files, b.files) });
45
+ const overall = axes.reduce((s, x) => s + x.similarity, 0) / Math.max(1, axes.length);
46
+ return {
47
+ similarity: Number(overall.toFixed(3)),
48
+ axes: axes.map((a) => ({ axis: a.axis, similarity: Number(a.similarity.toFixed(3)) })),
49
+ };
50
+ }
51
+ // ─── computation ───────────────────────────────────────────────────────
52
+ function computeStyle(cs) {
53
+ const filesPer = median(cs.map((c) => c.files.length));
54
+ let testHits = 0;
55
+ let issueHits = 0;
56
+ let convHits = 0;
57
+ for (const c of cs) {
58
+ if (c.files.some((f) => /\b(test|spec|__tests__)\b|\.test\.|\.spec\./.test(f))) {
59
+ testHits++;
60
+ }
61
+ if (c.issueRefs?.length || c.prNumber)
62
+ issueHits++;
63
+ if (CONVENTIONAL_RE.test(c.subject))
64
+ convHits++;
65
+ }
66
+ return {
67
+ filesPerCommit: filesPer,
68
+ churnPerCommit: 0, // cheap default — caller can pass changes if needed
69
+ testRatio: cs.length === 0 ? 0 : testHits / cs.length,
70
+ issueRefRatio: cs.length === 0 ? 0 : issueHits / cs.length,
71
+ conventionalRatio: cs.length === 0 ? 0 : convHits / cs.length,
72
+ };
73
+ }
74
+ function computeMessage(cs) {
75
+ let totalLen = 0;
76
+ let imp = 0;
77
+ let body = 0;
78
+ const verbs = new Map();
79
+ for (const c of cs) {
80
+ const subj = c.subject.trim();
81
+ totalLen += subj.length;
82
+ if (c.body && c.body.trim().length > 0)
83
+ body++;
84
+ // strip conventional prefix
85
+ const cleaned = subj.replace(CONVENTIONAL_RE, "").trim();
86
+ const firstWord = (cleaned.match(/^[A-Za-z]+/)?.[0] || "").toLowerCase();
87
+ if (IMPERATIVE_FIRST_WORDS.has(firstWord))
88
+ imp++;
89
+ if (firstWord)
90
+ verbs.set(firstWord, (verbs.get(firstWord) ?? 0) + 1);
91
+ }
92
+ const top = [...verbs.entries()]
93
+ .sort((a, b) => b[1] - a[1])
94
+ .slice(0, 5)
95
+ .map(([verb, count]) => ({ verb, count }));
96
+ return {
97
+ avgSubjectLength: cs.length === 0 ? 0 : Math.round(totalLen / cs.length),
98
+ imperativeRatio: cs.length === 0 ? 0 : imp / cs.length,
99
+ bodyRatio: cs.length === 0 ? 0 : body / cs.length,
100
+ topVerbs: top,
101
+ };
102
+ }
103
+ function computeHours(cs) {
104
+ const byHour = new Array(24).fill(0);
105
+ const byWeekday = new Array(7).fill(0);
106
+ let weekend = 0;
107
+ for (const c of cs) {
108
+ const d = new Date(c.authorDate);
109
+ if (Number.isNaN(d.getTime()))
110
+ continue;
111
+ byHour[d.getUTCHours()] = (byHour[d.getUTCHours()] ?? 0) + 1;
112
+ const w = d.getUTCDay();
113
+ byWeekday[w] = (byWeekday[w] ?? 0) + 1;
114
+ if (w === 0 || w === 6)
115
+ weekend++;
116
+ }
117
+ // peak window = 4-hour band with highest sum
118
+ let bestStart = 0;
119
+ let bestSum = -1;
120
+ for (let i = 0; i < 24; i++) {
121
+ let s = 0;
122
+ for (let k = 0; k < 4; k++)
123
+ s += byHour[(i + k) % 24] ?? 0;
124
+ if (s > bestSum) {
125
+ bestSum = s;
126
+ bestStart = i;
127
+ }
128
+ }
129
+ const peak = `${pad2(bestStart)}:00–${pad2((bestStart + 4) % 24)}:00`;
130
+ return {
131
+ byHour,
132
+ byWeekday,
133
+ weekendRatio: cs.length === 0 ? 0 : weekend / cs.length,
134
+ peakWindow: peak,
135
+ };
136
+ }
137
+ function computeFiles(cs) {
138
+ const dirCounts = new Map();
139
+ const extCounts = new Map();
140
+ let totalFiles = 0;
141
+ for (const c of cs) {
142
+ for (const f of c.files) {
143
+ totalFiles++;
144
+ const dir = f.split("/").slice(0, 2).join("/") || "(root)";
145
+ dirCounts.set(dir, (dirCounts.get(dir) ?? 0) + 1);
146
+ const ext = (f.match(/\.[A-Za-z0-9]+$/)?.[0] || "(none)").toLowerCase();
147
+ extCounts.set(ext, (extCounts.get(ext) ?? 0) + 1);
148
+ }
149
+ }
150
+ const topDirs = [...dirCounts.entries()]
151
+ .sort((a, b) => b[1] - a[1])
152
+ .slice(0, 5)
153
+ .map(([dir, n]) => ({ dir, share: totalFiles === 0 ? 0 : n / totalFiles }));
154
+ const topExts = [...extCounts.entries()]
155
+ .sort((a, b) => b[1] - a[1])
156
+ .slice(0, 5)
157
+ .map(([ext, n]) => ({ ext, share: totalFiles === 0 ? 0 : n / totalFiles }));
158
+ return { topDirs, topExts };
159
+ }
160
+ // ─── similarity helpers ────────────────────────────────────────────────
161
+ function styleSim(a, b) {
162
+ const axes = [
163
+ 1 - clamp(Math.abs(a.filesPerCommit - b.filesPerCommit) / 10),
164
+ 1 - clamp(Math.abs(a.testRatio - b.testRatio)),
165
+ 1 - clamp(Math.abs(a.issueRefRatio - b.issueRefRatio)),
166
+ 1 - clamp(Math.abs(a.conventionalRatio - b.conventionalRatio)),
167
+ ];
168
+ return mean(axes);
169
+ }
170
+ function messageSim(a, b) {
171
+ const lenSim = 1 - clamp(Math.abs(a.avgSubjectLength - b.avgSubjectLength) / 80);
172
+ const impSim = 1 - clamp(Math.abs(a.imperativeRatio - b.imperativeRatio));
173
+ const bodySim = 1 - clamp(Math.abs(a.bodyRatio - b.bodyRatio));
174
+ const verbSim = jaccard(new Set(a.topVerbs.map((v) => v.verb)), new Set(b.topVerbs.map((v) => v.verb)));
175
+ return mean([lenSim, impSim, bodySim, verbSim]);
176
+ }
177
+ function hoursSim(a, b) {
178
+ return cosineSimArr(normalize(a.byHour), normalize(b.byHour));
179
+ }
180
+ function filesSim(a, b) {
181
+ return jaccard(new Set(a.topDirs.map((d) => d.dir)), new Set(b.topDirs.map((d) => d.dir)));
182
+ }
183
+ function jaccard(a, b) {
184
+ if (a.size === 0 && b.size === 0)
185
+ return 1;
186
+ let inter = 0;
187
+ for (const x of a)
188
+ if (b.has(x))
189
+ inter++;
190
+ const union = a.size + b.size - inter;
191
+ return union === 0 ? 0 : inter / union;
192
+ }
193
+ function cosineSimArr(a, b) {
194
+ let dot = 0;
195
+ let na = 0;
196
+ let nb = 0;
197
+ const n = Math.min(a.length, b.length);
198
+ for (let i = 0; i < n; i++) {
199
+ const ai = a[i] ?? 0;
200
+ const bi = b[i] ?? 0;
201
+ dot += ai * bi;
202
+ na += ai * ai;
203
+ nb += bi * bi;
204
+ }
205
+ const denom = Math.sqrt(na) * Math.sqrt(nb);
206
+ return denom === 0 ? 0 : dot / denom;
207
+ }
208
+ function normalize(xs) {
209
+ const sum = xs.reduce((s, x) => s + x, 0);
210
+ if (sum === 0)
211
+ return xs.slice();
212
+ return xs.map((x) => x / sum);
213
+ }
214
+ function clamp(v) {
215
+ if (v < 0)
216
+ return 0;
217
+ if (v > 1)
218
+ return 1;
219
+ return v;
220
+ }
221
+ function mean(xs) {
222
+ if (xs.length === 0)
223
+ return 0;
224
+ return xs.reduce((s, x) => s + x, 0) / xs.length;
225
+ }
226
+ function median(xs) {
227
+ if (xs.length === 0)
228
+ return 0;
229
+ const s = [...xs].sort((a, b) => a - b);
230
+ const m = Math.floor(s.length / 2);
231
+ return s.length % 2 === 1 ? s[m] : (s[m - 1] + s[m]) / 2;
232
+ }
233
+ function pad2(n) {
234
+ return n < 10 ? "0" + n : "" + n;
235
+ }
236
+ function emptyDna(author) {
237
+ return {
238
+ author,
239
+ commitCount: 0,
240
+ fromDate: "",
241
+ toDate: "",
242
+ style: { filesPerCommit: 0, churnPerCommit: 0, testRatio: 0, issueRefRatio: 0, conventionalRatio: 0 },
243
+ message: { avgSubjectLength: 0, imperativeRatio: 0, bodyRatio: 0, topVerbs: [] },
244
+ hours: { byHour: new Array(24).fill(0), byWeekday: new Array(7).fill(0), weekendRatio: 0, peakWindow: "00:00–00:00" },
245
+ files: { topDirs: [], topExts: [] },
246
+ hash: "0000000",
247
+ };
248
+ }
249
+ function stableHash(dna) {
250
+ // FNV-1a 32-bit hash over a canonical string representation
251
+ const json = JSON.stringify({
252
+ author: dna.author,
253
+ style: dna.style,
254
+ message: { ...dna.message, topVerbs: dna.message.topVerbs.map((v) => v.verb) },
255
+ files: { topDirs: dna.files.topDirs.map((d) => d.dir), topExts: dna.files.topExts.map((e) => e.ext) },
256
+ });
257
+ let h = 0x811c9dc5;
258
+ for (let i = 0; i < json.length; i++) {
259
+ h ^= json.charCodeAt(i);
260
+ h = Math.imul(h, 0x01000193);
261
+ }
262
+ return (h >>> 0).toString(16).padStart(8, "0").slice(0, 7);
263
+ }
264
+ //# sourceMappingURL=dna.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dna.js","sourceRoot":"","sources":["../../src/insights/dna.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=dna.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dna.test.d.ts","sourceRoot":"","sources":["../../src/insights/dna.test.ts"],"names":[],"mappings":""}