mneme-ai 0.27.1 → 0.28.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/commands/atrophy.d.ts +53 -0
- package/dist/commands/atrophy.d.ts.map +1 -0
- package/dist/commands/atrophy.js +405 -0
- package/dist/commands/atrophy.js.map +1 -0
- package/dist/commands/influence.d.ts +9 -0
- package/dist/commands/influence.d.ts.map +1 -0
- package/dist/commands/influence.js +195 -0
- package/dist/commands/influence.js.map +1 -0
- package/dist/commands/lineage.d.ts +8 -0
- package/dist/commands/lineage.d.ts.map +1 -0
- package/dist/commands/lineage.js +187 -0
- package/dist/commands/lineage.js.map +1 -0
- package/dist/commands/nemesis.d.ts +39 -0
- package/dist/commands/nemesis.d.ts.map +1 -0
- package/dist/commands/nemesis.js +207 -0
- package/dist/commands/nemesis.js.map +1 -0
- package/dist/commands/nervous-system.d.ts +12 -0
- package/dist/commands/nervous-system.d.ts.map +1 -0
- package/dist/commands/nervous-system.js +297 -0
- package/dist/commands/nervous-system.js.map +1 -0
- package/dist/commands/nervous-system.smoke.test.d.ts +9 -0
- package/dist/commands/nervous-system.smoke.test.d.ts.map +1 -0
- package/dist/commands/nervous-system.smoke.test.js +110 -0
- package/dist/commands/nervous-system.smoke.test.js.map +1 -0
- package/dist/commands/passport.d.ts +15 -0
- package/dist/commands/passport.d.ts.map +1 -0
- package/dist/commands/passport.js +324 -0
- package/dist/commands/passport.js.map +1 -0
- package/dist/commands/promise.d.ts +42 -0
- package/dist/commands/promise.d.ts.map +1 -0
- package/dist/commands/promise.js +282 -0
- package/dist/commands/promise.js.map +1 -0
- package/dist/commands/telepathy.d.ts +39 -0
- package/dist/commands/telepathy.d.ts.map +1 -0
- package/dist/commands/telepathy.js +214 -0
- package/dist/commands/telepathy.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +158 -0
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `mneme atrophy [author]` — knowledge half-life clock.
|
|
3
|
+
*
|
|
4
|
+
* Three modes:
|
|
5
|
+
* 1. (no args) → repo-wide heatmap (top authors + at-risk files)
|
|
6
|
+
* 2. <author email> → that author's knowledge map across files
|
|
7
|
+
* 3. --file <path> → who still remembers this file?
|
|
8
|
+
*
|
|
9
|
+
* --json shape (stable):
|
|
10
|
+
*
|
|
11
|
+
* Mode 1 (repo-wide):
|
|
12
|
+
* {
|
|
13
|
+
* "mode": "repo",
|
|
14
|
+
* "authors": Array<{
|
|
15
|
+
* "name": string, "email": string,
|
|
16
|
+
* "knowledgeMass": number, // sum of knowledge_score across all files
|
|
17
|
+
* "filesKnown": number,
|
|
18
|
+
* "filesStillFresh": number,
|
|
19
|
+
* "lastActiveAt": string
|
|
20
|
+
* }>,
|
|
21
|
+
* "atRiskFiles": Array<{
|
|
22
|
+
* "filePath": string, "totalTouches": number,
|
|
23
|
+
* "tier": "safe" | "warn" | "at-risk",
|
|
24
|
+
* "freshestKnowledge": number,
|
|
25
|
+
* "liveExperts": Array<{ name, email, knowledge, lastTouchDaysAgo, touchCount }>,
|
|
26
|
+
* "allKnowers": Array<{ name, email, knowledge, lastTouchDaysAgo, touchCount }>
|
|
27
|
+
* }>,
|
|
28
|
+
* "stats": {
|
|
29
|
+
* "halfLifeDays": number, "asOf": string,
|
|
30
|
+
* "authorCount": number, "fileCount": number, "totalCommits": number,
|
|
31
|
+
* "filesWithLiveExpert": number, "ghostedFiles": number
|
|
32
|
+
* }
|
|
33
|
+
* }
|
|
34
|
+
*
|
|
35
|
+
* Mode 2 (per author):
|
|
36
|
+
* { "mode": "author", "author": AuthorKnowledge,
|
|
37
|
+
* "topFiles": Array<{ filePath, knowledge, lastTouchDaysAgo, touchCount, band }> }
|
|
38
|
+
*
|
|
39
|
+
* Mode 3 (per file):
|
|
40
|
+
* { "mode": "file", "file": FileKnowledge }
|
|
41
|
+
*/
|
|
42
|
+
export interface AtrophyOptions {
|
|
43
|
+
cwd: string;
|
|
44
|
+
/** Optional positional — author email to focus on. */
|
|
45
|
+
author?: string;
|
|
46
|
+
/** Optional --file flag — show "who knows this file?" view. */
|
|
47
|
+
file?: string;
|
|
48
|
+
halfLifeDays?: number;
|
|
49
|
+
topN?: number;
|
|
50
|
+
json?: boolean;
|
|
51
|
+
}
|
|
52
|
+
export declare function atrophyCommand(opts: AtrophyOptions): Promise<number>;
|
|
53
|
+
//# sourceMappingURL=atrophy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atrophy.d.ts","sourceRoot":"","sources":["../../src/commands/atrophy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAgBH,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAoB1E"}
|
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `mneme atrophy [author]` — knowledge half-life clock.
|
|
3
|
+
*
|
|
4
|
+
* Three modes:
|
|
5
|
+
* 1. (no args) → repo-wide heatmap (top authors + at-risk files)
|
|
6
|
+
* 2. <author email> → that author's knowledge map across files
|
|
7
|
+
* 3. --file <path> → who still remembers this file?
|
|
8
|
+
*
|
|
9
|
+
* --json shape (stable):
|
|
10
|
+
*
|
|
11
|
+
* Mode 1 (repo-wide):
|
|
12
|
+
* {
|
|
13
|
+
* "mode": "repo",
|
|
14
|
+
* "authors": Array<{
|
|
15
|
+
* "name": string, "email": string,
|
|
16
|
+
* "knowledgeMass": number, // sum of knowledge_score across all files
|
|
17
|
+
* "filesKnown": number,
|
|
18
|
+
* "filesStillFresh": number,
|
|
19
|
+
* "lastActiveAt": string
|
|
20
|
+
* }>,
|
|
21
|
+
* "atRiskFiles": Array<{
|
|
22
|
+
* "filePath": string, "totalTouches": number,
|
|
23
|
+
* "tier": "safe" | "warn" | "at-risk",
|
|
24
|
+
* "freshestKnowledge": number,
|
|
25
|
+
* "liveExperts": Array<{ name, email, knowledge, lastTouchDaysAgo, touchCount }>,
|
|
26
|
+
* "allKnowers": Array<{ name, email, knowledge, lastTouchDaysAgo, touchCount }>
|
|
27
|
+
* }>,
|
|
28
|
+
* "stats": {
|
|
29
|
+
* "halfLifeDays": number, "asOf": string,
|
|
30
|
+
* "authorCount": number, "fileCount": number, "totalCommits": number,
|
|
31
|
+
* "filesWithLiveExpert": number, "ghostedFiles": number
|
|
32
|
+
* }
|
|
33
|
+
* }
|
|
34
|
+
*
|
|
35
|
+
* Mode 2 (per author):
|
|
36
|
+
* { "mode": "author", "author": AuthorKnowledge,
|
|
37
|
+
* "topFiles": Array<{ filePath, knowledge, lastTouchDaysAgo, touchCount, band }> }
|
|
38
|
+
*
|
|
39
|
+
* Mode 3 (per file):
|
|
40
|
+
* { "mode": "file", "file": FileKnowledge }
|
|
41
|
+
*/
|
|
42
|
+
import kleur from "kleur";
|
|
43
|
+
import { git, store, people } from "@mneme-ai/core";
|
|
44
|
+
import { dbPath } from "../paths.js";
|
|
45
|
+
import { ui, header, emptyState, pill } from "../ui.js";
|
|
46
|
+
import { iris, readIrisState, recordCommandRun, shouldShowVerboseGuide, } from "../iris/index.js";
|
|
47
|
+
const COMMAND_ID = "atrophy";
|
|
48
|
+
export async function atrophyCommand(opts) {
|
|
49
|
+
if (!(await git.isGitRepo(opts.cwd))) {
|
|
50
|
+
ui.error("Not in a git repo. Run `mneme init` first.");
|
|
51
|
+
return 1;
|
|
52
|
+
}
|
|
53
|
+
const meta = await git.getRepoMeta(opts.cwd);
|
|
54
|
+
const s = new store.MnemeStore(dbPath(meta.rootPath));
|
|
55
|
+
if (s.countCommits() === 0) {
|
|
56
|
+
s.close();
|
|
57
|
+
ui.error("Memory is empty. Run `mneme index` first.");
|
|
58
|
+
return 1;
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
if (opts.file)
|
|
62
|
+
return runFileMode(s, opts, meta.rootPath);
|
|
63
|
+
if (opts.author)
|
|
64
|
+
return runAuthorMode(s, opts, meta.rootPath);
|
|
65
|
+
return runRepoMode(s, opts, meta.rootPath);
|
|
66
|
+
}
|
|
67
|
+
finally {
|
|
68
|
+
s.close();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// ─── Mode 1 — repo-wide ───────────────────────────────────────────────
|
|
72
|
+
function runRepoMode(s, opts, repoRoot) {
|
|
73
|
+
const report = people.atrophy(s, {
|
|
74
|
+
halfLifeDays: opts.halfLifeDays,
|
|
75
|
+
topN: opts.topN ?? 10,
|
|
76
|
+
});
|
|
77
|
+
if (opts.json) {
|
|
78
|
+
process.stdout.write(JSON.stringify({ mode: "repo", ...report }, null, 2) + "\n");
|
|
79
|
+
return 0;
|
|
80
|
+
}
|
|
81
|
+
const showGuide = readShouldShowGuide(repoRoot);
|
|
82
|
+
// ─── Headline ────────────────────────────────────────────────────────
|
|
83
|
+
// We frame the headline around DEEP-knowledge ghosting (≥2 touches lost)
|
|
84
|
+
// because single-touch files were never deeply known. This matches what
|
|
85
|
+
// a manager actually wants to see ("real expertise is gone here").
|
|
86
|
+
const ghostedDeep = report.stats.ghostedDeepFiles;
|
|
87
|
+
const ghostedAll = report.stats.ghostedFiles;
|
|
88
|
+
const headline = ghostedDeep > 0
|
|
89
|
+
? `⚠ ${ghostedDeep} deep-history file${ghostedDeep === 1 ? "" : "s"} lost their last expert — ghost code risk`
|
|
90
|
+
: ghostedAll > 0
|
|
91
|
+
? `✦ Repo knowledge heatmap — ${report.authors.length} active expert${report.authors.length === 1 ? "" : "s"} · ${ghostedAll} shallow files (1 touch only)`
|
|
92
|
+
: `✦ Repo knowledge heatmap — ${report.authors.length} active expert${report.authors.length === 1 ? "" : "s"}, all files well-remembered`;
|
|
93
|
+
const dataPills = [];
|
|
94
|
+
if (report.stats.authorCount < 2) {
|
|
95
|
+
dataPills.push(pill("HEADS UP", "warn") + " " + kleur.gray("only 1 author in repo — atrophy still works but the per-author ranking is trivial."));
|
|
96
|
+
}
|
|
97
|
+
else if (report.stats.totalCommits < 30) {
|
|
98
|
+
dataPills.push(pill("HEADS UP", "warn") + " " + kleur.gray(`only ${report.stats.totalCommits} commits — knowledge math gets steadier with 50+ commits.`));
|
|
99
|
+
}
|
|
100
|
+
// ─── Lede — headline numbers in plain English ───────────────────────
|
|
101
|
+
const livePct = report.stats.fileCount > 0
|
|
102
|
+
? Math.round((report.stats.filesWithLiveExpert / report.stats.fileCount) * 100)
|
|
103
|
+
: 0;
|
|
104
|
+
const ledeLines = [
|
|
105
|
+
` ${kleur.gray("half-life:")} ${kleur.bold(report.stats.halfLifeDays + " days")} ${kleur.gray("(after this many days, knowledge decays to ~50%)")}`,
|
|
106
|
+
` ${kleur.gray("files with a live expert:")} ${kleur.bold(report.stats.filesWithLiveExpert + " / " + report.stats.fileCount)} ${kleur.gray(`(${livePct}% — someone still remembers these)`)}`,
|
|
107
|
+
` ${kleur.gray("ghost code (deep history lost):")} ${ghostedDeep > 0 ? kleur.red().bold(String(ghostedDeep)) : kleur.green("0")} ${kleur.gray("(≥2 historical touches, now no live expert — real re-onboarding)")}`,
|
|
108
|
+
` ${kleur.gray("shallow files (1 touch, never deep):")} ${kleur.gray().bold(String(report.stats.shallowFiles))} ${kleur.gray("(read fresh next time — never expected expertise here)")}`,
|
|
109
|
+
];
|
|
110
|
+
// ─── Top experts ────────────────────────────────────────────────────
|
|
111
|
+
const expertLines = [];
|
|
112
|
+
if (report.authors.length > 0) {
|
|
113
|
+
const maxMass = report.authors[0].knowledgeMass || 1;
|
|
114
|
+
for (let i = 0; i < report.authors.length; i++) {
|
|
115
|
+
const a = report.authors[i];
|
|
116
|
+
const ratio = a.knowledgeMass / maxMass;
|
|
117
|
+
const meter = bar(ratio, 12);
|
|
118
|
+
const freshPct = a.filesKnown > 0
|
|
119
|
+
? Math.round((a.filesStillFresh / a.filesKnown) * 100)
|
|
120
|
+
: 0;
|
|
121
|
+
expertLines.push(` ${kleur.cyan(meter)} ${kleur.bold(a.name.padEnd(22))} ${kleur.gray("mass")} ${kleur.bold(a.knowledgeMass.toFixed(1))} ${kleur.gray(`(${a.filesStillFresh}/${a.filesKnown} files still fresh — ${freshPct}%)`)}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// ─── At-risk files ──────────────────────────────────────────────────
|
|
125
|
+
const riskLines = [];
|
|
126
|
+
for (const f of report.atRiskFiles) {
|
|
127
|
+
const tag = renderTier(f.tier);
|
|
128
|
+
const pctFresh = Math.round(f.freshestKnowledge * 100);
|
|
129
|
+
const expert = f.allKnowers[0];
|
|
130
|
+
// Honest cause: shallow vs faded.
|
|
131
|
+
// shallow → only one or two touches; never deep. Read it cold.
|
|
132
|
+
// faded → had history but it's old. Re-read.
|
|
133
|
+
const cause = f.totalTouches <= 1
|
|
134
|
+
? "shallow knowledge — only 1 touch, not yet deep"
|
|
135
|
+
: f.freshestKnowledge < 0.1
|
|
136
|
+
? "ghost code — re-onboarding required"
|
|
137
|
+
: "knowledge faded — needs review before next change";
|
|
138
|
+
const expertStr = expert
|
|
139
|
+
? `${kleur.bold(expert.name)} ${kleur.gray(`(touched ${expert.touchCount}× · last ${humanDays(expert.lastTouchDaysAgo)})`)}`
|
|
140
|
+
: kleur.gray("(no knowers)");
|
|
141
|
+
riskLines.push(` ${tag} ${kleur.bold(f.filePath)} ${kleur.gray(`(top knower ${pctFresh}% fresh — ${cause})`)}`);
|
|
142
|
+
riskLines.push(` ${kleur.gray("freshest knower:")} ${expertStr} ${kleur.gray("·")} ${kleur.gray(f.totalTouches + " total touches")}`);
|
|
143
|
+
}
|
|
144
|
+
// ─── Sources ────────────────────────────────────────────────────────
|
|
145
|
+
const sourceLines = [];
|
|
146
|
+
if (report.atRiskFiles.length > 0) {
|
|
147
|
+
sourceLines.push(` ${kleur.cyan("$")} ${kleur.bold(`mneme atrophy --file ${report.atRiskFiles[0].filePath}`)} ${kleur.gray("(every author who ever knew this file)")}`);
|
|
148
|
+
}
|
|
149
|
+
if (report.authors.length > 0) {
|
|
150
|
+
sourceLines.push(` ${kleur.cyan("$")} ${kleur.bold(`mneme atrophy ${report.authors[0].email}`)} ${kleur.gray("(this author's full knowledge map)")}`);
|
|
151
|
+
}
|
|
152
|
+
sourceLines.push(` ${kleur.cyan("$")} ${kleur.bold("mneme bus-factor")} ${kleur.gray("(complementary view — files where one person owns ≥75%)")}`);
|
|
153
|
+
if (showGuide) {
|
|
154
|
+
sourceLines.push("");
|
|
155
|
+
sourceLines.push(` ${kleur.gray("📘 How to read:")} ${kleur.bold("knowledge_score")} ${kleur.gray("= exp(-days/half_life) × familiarity-from-touches. Range 0..1.")}`);
|
|
156
|
+
sourceLines.push(` ${kleur.gray("•")} ${kleur.green("safe")} ${kleur.gray("≥ 0.7 · ")}${kleur.yellow("warn")} ${kleur.gray("0.3–0.7 · ")}${kleur.red("at-risk")} ${kleur.gray("< 0.3 (no live expert)")}`);
|
|
157
|
+
sourceLines.push(` ${kleur.gray("•")} ${kleur.bold("knowledge mass")} ${kleur.gray("= the sum of every file score that author still owns. Higher = broader living memory.")}`);
|
|
158
|
+
}
|
|
159
|
+
// ─── Compose ────────────────────────────────────────────────────────
|
|
160
|
+
const sections = [];
|
|
161
|
+
if (dataPills.length > 0) {
|
|
162
|
+
sections.push({ tier: "lede", lines: dataPills.map((l) => ` ${l}`) });
|
|
163
|
+
}
|
|
164
|
+
sections.push({ tier: "lede", title: "✦ Repo-wide", lines: ledeLines });
|
|
165
|
+
if (expertLines.length > 0) {
|
|
166
|
+
sections.push({
|
|
167
|
+
tier: "key-facts",
|
|
168
|
+
title: `◆ Top experts by living knowledge (top ${report.authors.length})`,
|
|
169
|
+
lines: expertLines,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
if (riskLines.length > 0) {
|
|
173
|
+
sections.push({
|
|
174
|
+
tier: "body",
|
|
175
|
+
title: `⚠ Knowledge-risk files (top ${report.atRiskFiles.length})`,
|
|
176
|
+
lines: riskLines,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
if (sourceLines.length > 0) {
|
|
180
|
+
sections.push({ tier: "sources", title: "→ Try next", lines: sourceLines });
|
|
181
|
+
}
|
|
182
|
+
ui.banner();
|
|
183
|
+
if (report.stats.fileCount === 0) {
|
|
184
|
+
process.stdout.write(header("⏳", "Atrophy — knowledge half-life clock", "no indexed files", "Knowledge decays. This command shows who still remembers what.") + "\n\n");
|
|
185
|
+
process.stdout.write(emptyState("No files in the index — nothing to score.", [
|
|
186
|
+
"Run `mneme index` to populate the memory.",
|
|
187
|
+
]));
|
|
188
|
+
return 0;
|
|
189
|
+
}
|
|
190
|
+
process.stdout.write(iris.render({ headline, sections }) + "\n");
|
|
191
|
+
try {
|
|
192
|
+
recordCommandRun(repoRoot, COMMAND_ID);
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
/* best effort */
|
|
196
|
+
}
|
|
197
|
+
return 0;
|
|
198
|
+
}
|
|
199
|
+
// ─── Mode 2 — per author ──────────────────────────────────────────────
|
|
200
|
+
function runAuthorMode(s, opts, repoRoot) {
|
|
201
|
+
const detail = people.atrophyForAuthor(s, opts.author, {
|
|
202
|
+
halfLifeDays: opts.halfLifeDays,
|
|
203
|
+
topN: opts.topN ?? 20,
|
|
204
|
+
});
|
|
205
|
+
if (!detail) {
|
|
206
|
+
if (opts.json) {
|
|
207
|
+
process.stdout.write(JSON.stringify({ mode: "author", author: null }, null, 2) + "\n");
|
|
208
|
+
return 0;
|
|
209
|
+
}
|
|
210
|
+
ui.error(`No commits found for author <${opts.author}>.`);
|
|
211
|
+
return 1;
|
|
212
|
+
}
|
|
213
|
+
if (opts.json) {
|
|
214
|
+
process.stdout.write(JSON.stringify({ mode: "author", ...detail }, null, 2) + "\n");
|
|
215
|
+
return 0;
|
|
216
|
+
}
|
|
217
|
+
const a = detail.author;
|
|
218
|
+
const lastDays = a.lastActiveAt ? Math.round((Date.now() - Date.parse(a.lastActiveAt)) / 86_400_000) : null;
|
|
219
|
+
const headline = `⏳ ${a.name} — ${a.filesKnown} files known · ${a.filesStillFresh} still fresh`;
|
|
220
|
+
const showGuide = readShouldShowGuide(repoRoot);
|
|
221
|
+
const ledeLines = [
|
|
222
|
+
` ${kleur.gray("knowledge mass:")} ${kleur.bold(a.knowledgeMass.toFixed(1))} ${kleur.gray("(sum of every file score they still own)")}`,
|
|
223
|
+
` ${kleur.gray("last active:")} ${kleur.bold(formatDate(a.lastActiveAt))}${lastDays != null ? kleur.gray(` (${humanDays(lastDays)})`) : ""}`,
|
|
224
|
+
` ${kleur.gray("files still fresh:")} ${kleur.bold(String(a.filesStillFresh))} ${kleur.gray("of")} ${kleur.bold(String(a.filesKnown))} ${kleur.gray("(knowledge ≥ 0.3)")}`,
|
|
225
|
+
];
|
|
226
|
+
const fileLines = [];
|
|
227
|
+
for (const f of detail.topFiles) {
|
|
228
|
+
const band = renderBand(f.band);
|
|
229
|
+
const pctFresh = Math.round(f.knowledge * 100);
|
|
230
|
+
const explain = people.explainKnowledge(f.knowledge);
|
|
231
|
+
fileLines.push(` ${band} ${kleur.bold(f.filePath)} ${kleur.gray(`(${pctFresh}% fresh — ${explain})`)}`);
|
|
232
|
+
fileLines.push(` ${kleur.gray("touched")} ${kleur.bold(String(f.touchCount))} ${kleur.gray("times · last touch")} ${humanDays(f.lastTouchDaysAgo)}`);
|
|
233
|
+
}
|
|
234
|
+
const sourceLines = [];
|
|
235
|
+
sourceLines.push(` ${kleur.cyan("$")} ${kleur.bold("mneme atrophy")} ${kleur.gray("(repo-wide heatmap of all authors)")}`);
|
|
236
|
+
if (detail.topFiles.length > 0) {
|
|
237
|
+
sourceLines.push(` ${kleur.cyan("$")} ${kleur.bold(`mneme atrophy --file ${detail.topFiles[0].filePath}`)} ${kleur.gray("(everyone who ever knew this file)")}`);
|
|
238
|
+
}
|
|
239
|
+
if (showGuide) {
|
|
240
|
+
sourceLines.push("");
|
|
241
|
+
sourceLines.push(` ${kleur.gray("📘 How to read:")} ${kleur.gray("each row = one file. ")}${kleur.green("fresh")} ${kleur.gray("≥ 70% · ")}${kleur.yellow("warm")} ${kleur.gray("30–70% · ")}${kleur.gray("fading 10–30% · ghosted < 10%.")}`);
|
|
242
|
+
sourceLines.push(` ${kleur.gray("• A 50% file means ~30 minutes of refresh; 30% needs ~2 hours; <10% is full re-onboarding.")}`);
|
|
243
|
+
}
|
|
244
|
+
const sections = [
|
|
245
|
+
{ tier: "lede", title: "✦ Author knowledge profile", lines: ledeLines },
|
|
246
|
+
];
|
|
247
|
+
if (fileLines.length > 0) {
|
|
248
|
+
sections.push({
|
|
249
|
+
tier: "body",
|
|
250
|
+
title: `◆ Top files known (top ${detail.topFiles.length})`,
|
|
251
|
+
lines: fileLines,
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
sections.push({
|
|
256
|
+
tier: "body",
|
|
257
|
+
title: "◆ Files known",
|
|
258
|
+
lines: [` ${kleur.gray("(none above noise threshold)")}`],
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
if (sourceLines.length > 0) {
|
|
262
|
+
sections.push({ tier: "sources", title: "→ Try next", lines: sourceLines });
|
|
263
|
+
}
|
|
264
|
+
ui.banner();
|
|
265
|
+
process.stdout.write(iris.render({ headline, sections }) + "\n");
|
|
266
|
+
try {
|
|
267
|
+
recordCommandRun(repoRoot, COMMAND_ID);
|
|
268
|
+
}
|
|
269
|
+
catch {
|
|
270
|
+
/* best effort */
|
|
271
|
+
}
|
|
272
|
+
return 0;
|
|
273
|
+
}
|
|
274
|
+
// ─── Mode 3 — per file ────────────────────────────────────────────────
|
|
275
|
+
function runFileMode(s, opts, repoRoot) {
|
|
276
|
+
const file = people.atrophyForFile(s, opts.file, {
|
|
277
|
+
halfLifeDays: opts.halfLifeDays,
|
|
278
|
+
});
|
|
279
|
+
if (!file) {
|
|
280
|
+
if (opts.json) {
|
|
281
|
+
process.stdout.write(JSON.stringify({ mode: "file", file: null }, null, 2) + "\n");
|
|
282
|
+
return 0;
|
|
283
|
+
}
|
|
284
|
+
ui.error(`No commits found that touched ${opts.file}.`);
|
|
285
|
+
return 1;
|
|
286
|
+
}
|
|
287
|
+
if (opts.json) {
|
|
288
|
+
process.stdout.write(JSON.stringify({ mode: "file", file }, null, 2) + "\n");
|
|
289
|
+
return 0;
|
|
290
|
+
}
|
|
291
|
+
const tier = renderTier(file.tier);
|
|
292
|
+
const headline = file.tier === "at-risk"
|
|
293
|
+
? `⚠ ${file.filePath} — no live expert (${Math.round((1 - file.freshestKnowledge) * 100)}% decayed)`
|
|
294
|
+
: file.tier === "warn"
|
|
295
|
+
? `✦ ${file.filePath} — knowledge fading (top expert ${Math.round(file.freshestKnowledge * 100)}% fresh)`
|
|
296
|
+
: `✦ ${file.filePath} — well-remembered (top expert ${Math.round(file.freshestKnowledge * 100)}% fresh)`;
|
|
297
|
+
const showGuide = readShouldShowGuide(repoRoot);
|
|
298
|
+
const ledeLines = [
|
|
299
|
+
` ${kleur.gray("tier:")} ${tier} ${kleur.gray("·")} ${kleur.gray("total touches:")} ${kleur.bold(String(file.totalTouches))} ${kleur.gray("·")} ${kleur.gray("live experts:")} ${kleur.bold(String(file.liveExperts.length))}`,
|
|
300
|
+
];
|
|
301
|
+
const expertLines = [];
|
|
302
|
+
for (const e of file.allKnowers) {
|
|
303
|
+
const pct = Math.round(e.knowledge * 100);
|
|
304
|
+
const band = bandForScore(e.knowledge);
|
|
305
|
+
const bandTag = renderBand(band);
|
|
306
|
+
const explain = people.explainKnowledge(e.knowledge);
|
|
307
|
+
expertLines.push(` ${bandTag} ${kleur.bold(e.name.padEnd(22))} ${kleur.gray("<" + e.email + ">")}`);
|
|
308
|
+
expertLines.push(` ${kleur.gray("knowledge")} ${kleur.bold(pct + "%")} ${kleur.gray(`(${explain})`)} ${kleur.gray("· last touch")} ${humanDays(e.lastTouchDaysAgo)} ${kleur.gray("· touched")} ${kleur.bold(String(e.touchCount))} ${kleur.gray("times")}`);
|
|
309
|
+
}
|
|
310
|
+
const sourceLines = [
|
|
311
|
+
` ${kleur.cyan("$")} ${kleur.bold(`mneme atrophy ${file.allKnowers[0]?.email ?? ""}`)} ${kleur.gray("(this person's full knowledge profile)")}`,
|
|
312
|
+
` ${kleur.cyan("$")} ${kleur.bold("mneme bus-factor")} ${kleur.gray("(broader: every file with single-owner risk)")}`,
|
|
313
|
+
];
|
|
314
|
+
if (showGuide) {
|
|
315
|
+
sourceLines.push("");
|
|
316
|
+
sourceLines.push(` ${kleur.gray("📘 How to read:")} ${kleur.gray("each row is an author who ever touched the file. Rows are sorted by current knowledge — freshest first.")}`);
|
|
317
|
+
sourceLines.push(` ${kleur.gray("• A 'live expert' is anyone with ≥30% knowledge — pair them with someone fading to transfer context.")}`);
|
|
318
|
+
}
|
|
319
|
+
const sections = [
|
|
320
|
+
{ tier: "lede", title: "✦ File knowledge profile", lines: ledeLines },
|
|
321
|
+
{
|
|
322
|
+
tier: "body",
|
|
323
|
+
title: `◆ Who still knows ${file.filePath}`,
|
|
324
|
+
lines: expertLines.length > 0 ? expertLines : [` ${kleur.gray("(no knowers above noise threshold)")}`],
|
|
325
|
+
},
|
|
326
|
+
{ tier: "sources", title: "→ Try next", lines: sourceLines },
|
|
327
|
+
];
|
|
328
|
+
ui.banner();
|
|
329
|
+
process.stdout.write(iris.render({ headline, sections }) + "\n");
|
|
330
|
+
try {
|
|
331
|
+
recordCommandRun(repoRoot, COMMAND_ID);
|
|
332
|
+
}
|
|
333
|
+
catch {
|
|
334
|
+
/* best effort */
|
|
335
|
+
}
|
|
336
|
+
return 0;
|
|
337
|
+
}
|
|
338
|
+
// ─── helpers ──────────────────────────────────────────────────────────
|
|
339
|
+
function readShouldShowGuide(repoRoot) {
|
|
340
|
+
try {
|
|
341
|
+
const state = readIrisState(repoRoot);
|
|
342
|
+
return shouldShowVerboseGuide(state, COMMAND_ID);
|
|
343
|
+
}
|
|
344
|
+
catch {
|
|
345
|
+
return true;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
function renderTier(tier) {
|
|
349
|
+
switch (tier) {
|
|
350
|
+
case "safe":
|
|
351
|
+
return kleur.green().bold("SAFE ");
|
|
352
|
+
case "warn":
|
|
353
|
+
return kleur.yellow().bold("WARN ");
|
|
354
|
+
case "at-risk":
|
|
355
|
+
return kleur.red().bold("AT-RISK");
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
function renderBand(band) {
|
|
359
|
+
switch (band) {
|
|
360
|
+
case "fresh":
|
|
361
|
+
return kleur.green().bold("FRESH ");
|
|
362
|
+
case "warm":
|
|
363
|
+
return kleur.cyan().bold("WARM ");
|
|
364
|
+
case "fading":
|
|
365
|
+
return kleur.yellow().bold("FADING ");
|
|
366
|
+
case "ghosted":
|
|
367
|
+
return kleur.red().bold("GHOSTED");
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
function bandForScore(score) {
|
|
371
|
+
if (score >= 0.7)
|
|
372
|
+
return "fresh";
|
|
373
|
+
if (score >= 0.3)
|
|
374
|
+
return "warm";
|
|
375
|
+
if (score >= 0.1)
|
|
376
|
+
return "fading";
|
|
377
|
+
return "ghosted";
|
|
378
|
+
}
|
|
379
|
+
function bar(ratio, width) {
|
|
380
|
+
const r = Math.max(0, Math.min(1, ratio));
|
|
381
|
+
const filled = Math.round(r * width);
|
|
382
|
+
return "█".repeat(filled) + "░".repeat(width - filled);
|
|
383
|
+
}
|
|
384
|
+
function humanDays(days) {
|
|
385
|
+
if (days < 1)
|
|
386
|
+
return "today";
|
|
387
|
+
if (days < 2)
|
|
388
|
+
return "yesterday";
|
|
389
|
+
if (days < 14)
|
|
390
|
+
return `${Math.round(days)} days ago`;
|
|
391
|
+
if (days < 60)
|
|
392
|
+
return `${Math.round(days / 7)} weeks ago`;
|
|
393
|
+
if (days < 730)
|
|
394
|
+
return `${Math.round(days / 30)} months ago`;
|
|
395
|
+
return `${(days / 365).toFixed(1)} years ago`;
|
|
396
|
+
}
|
|
397
|
+
function formatDate(iso) {
|
|
398
|
+
if (!iso)
|
|
399
|
+
return "—";
|
|
400
|
+
const d = new Date(iso);
|
|
401
|
+
if (Number.isNaN(d.getTime()))
|
|
402
|
+
return iso;
|
|
403
|
+
return d.toISOString().slice(0, 10);
|
|
404
|
+
}
|
|
405
|
+
//# sourceMappingURL=atrophy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atrophy.js","sourceRoot":"","sources":["../../src/commands/atrophy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface InfluenceCommandOptions {
|
|
2
|
+
cwd: string;
|
|
3
|
+
topN?: number;
|
|
4
|
+
patternMinUses?: number;
|
|
5
|
+
authorEmail?: string;
|
|
6
|
+
json?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function influenceCommand(opts: InfluenceCommandOptions): Promise<number>;
|
|
9
|
+
//# sourceMappingURL=influence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"influence.d.ts","sourceRoot":"","sources":["../../src/commands/influence.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC,CAyBrF"}
|