@mneme-ai/core 0.11.1 → 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.
- package/dist/insights/chronicle.d.ts +41 -0
- package/dist/insights/chronicle.d.ts.map +1 -0
- package/dist/insights/chronicle.js +169 -0
- package/dist/insights/chronicle.js.map +1 -0
- package/dist/insights/chronicle.test.d.ts +2 -0
- package/dist/insights/chronicle.test.d.ts.map +1 -0
- package/dist/insights/chronicle.test.js +92 -0
- package/dist/insights/chronicle.test.js.map +1 -0
- package/dist/insights/constellation.d.ts +63 -0
- package/dist/insights/constellation.d.ts.map +1 -0
- package/dist/insights/constellation.js +147 -0
- package/dist/insights/constellation.js.map +1 -0
- package/dist/insights/constellation.test.d.ts +2 -0
- package/dist/insights/constellation.test.d.ts.map +1 -0
- package/dist/insights/constellation.test.js +105 -0
- package/dist/insights/constellation.test.js.map +1 -0
- package/dist/insights/dna.d.ts +100 -0
- package/dist/insights/dna.d.ts.map +1 -0
- package/dist/insights/dna.js +264 -0
- package/dist/insights/dna.js.map +1 -0
- package/dist/insights/dna.test.d.ts +2 -0
- package/dist/insights/dna.test.d.ts.map +1 -0
- package/dist/insights/dna.test.js +142 -0
- package/dist/insights/dna.test.js.map +1 -0
- package/dist/insights/drift.d.ts +43 -0
- package/dist/insights/drift.d.ts.map +1 -0
- package/dist/insights/drift.js +170 -0
- package/dist/insights/drift.js.map +1 -0
- package/dist/insights/drift.test.d.ts +2 -0
- package/dist/insights/drift.test.d.ts.map +1 -0
- package/dist/insights/drift.test.js +126 -0
- package/dist/insights/drift.test.js.map +1 -0
- package/dist/insights/index.d.ts +5 -0
- package/dist/insights/index.d.ts.map +1 -1
- package/dist/insights/index.js +5 -0
- package/dist/insights/index.js.map +1 -1
- package/dist/insights/oracle.d.ts +59 -0
- package/dist/insights/oracle.d.ts.map +1 -0
- package/dist/insights/oracle.js +0 -0
- package/dist/insights/oracle.js.map +1 -0
- package/dist/insights/oracle.test.d.ts +2 -0
- package/dist/insights/oracle.test.d.ts.map +1 -0
- package/dist/insights/oracle.test.js +133 -0
- package/dist/insights/oracle.test.js.map +1 -0
- 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 @@
|
|
|
1
|
+
{"version":3,"file":"dna.test.d.ts","sourceRoot":"","sources":["../../src/insights/dna.test.ts"],"names":[],"mappings":""}
|