@vyuhlabs/dxkit 2.9.3 → 2.9.4

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 (36) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +9 -0
  3. package/dist/analyzers/developer/gather.d.ts +16 -0
  4. package/dist/analyzers/developer/gather.d.ts.map +1 -1
  5. package/dist/analyzers/developer/gather.js +2 -0
  6. package/dist/analyzers/developer/gather.js.map +1 -1
  7. package/dist/analyzers/developer/ownership.d.ts +86 -0
  8. package/dist/analyzers/developer/ownership.d.ts.map +1 -0
  9. package/dist/analyzers/developer/ownership.js +180 -0
  10. package/dist/analyzers/developer/ownership.js.map +1 -0
  11. package/dist/analyzers/quality/detailed.d.ts +5 -1
  12. package/dist/analyzers/quality/detailed.d.ts.map +1 -1
  13. package/dist/analyzers/quality/detailed.js +30 -29
  14. package/dist/analyzers/quality/detailed.js.map +1 -1
  15. package/dist/analyzers/security/detailed.d.ts +7 -1
  16. package/dist/analyzers/security/detailed.d.ts.map +1 -1
  17. package/dist/analyzers/security/detailed.js +31 -15
  18. package/dist/analyzers/security/detailed.js.map +1 -1
  19. package/dist/analyzers/tests/detailed.d.ts +5 -1
  20. package/dist/analyzers/tests/detailed.d.ts.map +1 -1
  21. package/dist/analyzers/tests/detailed.js +27 -20
  22. package/dist/analyzers/tests/detailed.js.map +1 -1
  23. package/dist/attribution/attribute.d.ts +57 -0
  24. package/dist/attribution/attribute.d.ts.map +1 -0
  25. package/dist/attribution/attribute.js +149 -0
  26. package/dist/attribution/attribute.js.map +1 -0
  27. package/dist/cli.d.ts.map +1 -1
  28. package/dist/cli.js +53 -5
  29. package/dist/cli.js.map +1 -1
  30. package/dist/reviewers-cli.d.ts +57 -0
  31. package/dist/reviewers-cli.d.ts.map +1 -0
  32. package/dist/reviewers-cli.js +263 -0
  33. package/dist/reviewers-cli.js.map +1 -0
  34. package/package.json +1 -1
  35. package/templates/.claude/skills/dxkit-action/SKILL.md +2 -0
  36. package/templates/.claude/skills/dxkit-pr/SKILL.md +22 -1
package/CHANGELOG.md CHANGED
@@ -7,6 +7,38 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.9.4] - 2026-06-09
11
+
12
+ ### Connecting findings + PRs to the people who know the code
13
+
14
+ Two features on a shared **active-owner model** — recency-weighted git history
15
+ scoped to who is still active, with bots and departed contributors filtered, the
16
+ change author excluded, and a bus-factor signal. Output renders names + GitHub
17
+ @handles, never raw emails (the @handle is both privacy-safe and the actionable
18
+ identifier — it's @-mentionable and feeds `gh --reviewer`).
19
+
20
+ - **`vyuh-dxkit reviewers`** suggests reviewers for a change (`--base <ref>` /
21
+ `--staged`). It ranks the active owners of the touched files — recency-weighted,
22
+ bot-free, departed-dev-aware, author-excluded — blended with `CODEOWNERS`, and
23
+ warns on a bus factor of 1. The differentiation over a platform's naive
24
+ last-touch suggestion is the activity grounding + active-only scoping. The
25
+ `dxkit-pr` skill consumes it for a "Suggested reviewers" block and
26
+ `gh pr create --reviewer`.
27
+ - **`--attribute` "who to ask"** on the detailed vulnerability / test-gaps /
28
+ quality reports. For a pre-existing finding it adds a "Who to ask" column:
29
+ line-level findings are `git blame`d and routed through the owner model (an
30
+ inactive author is forwarded to the file's current owner); file-level findings
31
+ (test gaps) attribute to the file's current owner. Opt-in and historical only —
32
+ a net-new finding the guardrail just blocked was introduced by your own change,
33
+ so its owner is the PR author. The column is honest that blame is last-touch,
34
+ not necessarily who introduced the finding.
35
+
36
+ ### Privacy
37
+
38
+ Author emails are used only as the internal identity key for clustering; they
39
+ are never rendered in any report or PR output. Everything user-facing is a
40
+ display name or a GitHub @handle.
41
+
10
42
  ## [2.9.3] - 2026-06-09
11
43
 
12
44
  ### Targetable fix loop + test generation
package/README.md CHANGED
@@ -210,6 +210,15 @@ dxkit builds a deterministic code graph of your repo (its symbols, call edges, a
210
210
 
211
211
  This is an additive, fail-open layer. When the graph is missing, or a language's call edges can't be resolved, every command behaves exactly as it did before. It's reliable on TypeScript, Python, and Go. Where the call graph can't be resolved (C#), blast radius is suppressed rather than faked, so a "no callers" reading is never mistaken for "safe to change."
212
212
 
213
+ ### Connect findings and PRs to the people who know the code
214
+
215
+ A finding or a PR is more actionable when you know who to ask. dxkit grounds that in an **active-owner model** — recency-weighted git history, scoped to who is still active, with bots and departed contributors filtered, the change author excluded, and a bus-factor signal.
216
+
217
+ - **`vyuh-dxkit reviewers`** suggests reviewers for a change, ranked by active ownership of the touched files and blended with `CODEOWNERS` — a better signal than a platform's naive last-touch suggestion. The `dxkit-pr` skill folds it into the PR body.
218
+ - **`--attribute`** adds a "who to ask" column to a detailed report: a pre-existing finding is traced to its current owner (an inactive author is routed to whoever owns the file now). It's opt-in and historical — a net-new finding is introduced by your own change.
219
+
220
+ Output is names + GitHub @handles, never raw emails — the @handle is both privacy-safe and @-mentionable.
221
+
213
222
  ### Deep SAST: interprocedural findings from any engine
214
223
 
215
224
  dxkit's bundled SAST (community semgrep) is intraprocedural — it can't follow tainted data across function boundaries, so it misses the path-traversal / information-exposure / SSRF / injection class that an interprocedural engine like Snyk Code or CodeQL catches. dxkit doesn't try to re-detect that class; it **ingests** it and makes it first-class.
@@ -1,4 +1,20 @@
1
1
  import { ContributorStats, HotFile, CommitQuality, WeeklyVelocity } from './types';
2
+ /**
3
+ * True when an author looks like an automation account rather than a
4
+ * human contributor. Common bot patterns: GitHub App naming
5
+ * convention (`[bot]` suffix), known service accounts, and CI-only
6
+ * placeholders (`root`, `unknown`). Bot rows still appear in the
7
+ * leaderboard but get tagged so they don't crowd out human signal.
8
+ */
9
+ export declare function isBotAuthor(name: string, email: string): boolean;
10
+ /**
11
+ * Normalize an email for clustering. GitHub's privacy-relay emails
12
+ * (`123456+username@users.noreply.github.com`) sometimes get used
13
+ * alongside the real address; drop the leading `<digits>+` so both
14
+ * collapse to the same cluster key. Lowercase the whole thing so
15
+ * casing differences don't split a cluster.
16
+ */
17
+ export declare function normalizeEmail(email: string): string;
2
18
  export declare function gatherContributors(cwd: string, since: string): ContributorStats[];
3
19
  export declare function gatherCommitQuality(cwd: string, since: string): CommitQuality;
4
20
  export declare function gatherHotFiles(cwd: string, since: string, top?: number): HotFile[];
@@ -1 +1 @@
1
- {"version":3,"file":"gather.d.ts","sourceRoot":"","sources":["../../../src/analyzers/developer/gather.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AA8BnF,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAkKjF;AAQD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,CA0B7E;AAID,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAK,GAAG,OAAO,EAAE,CAkC9E;AAkBD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,cAAc,EAAE,CAwB3E;AAsCD,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,MAAM,EAAE,CAY1F;AAID,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,GACZ;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAIhD"}
1
+ {"version":3,"file":"gather.d.ts","sourceRoot":"","sources":["../../../src/analyzers/developer/gather.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAInF;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAMhE;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAkKjF;AAQD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,CA0B7E;AAID,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAK,GAAG,OAAO,EAAE,CAkC9E;AAkBD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,cAAc,EAAE,CAwB3E;AAsCD,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,MAAM,EAAE,CAY1F;AAID,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,GACZ;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAIhD"}
@@ -1,5 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isBotAuthor = isBotAuthor;
4
+ exports.normalizeEmail = normalizeEmail;
3
5
  exports.gatherContributors = gatherContributors;
4
6
  exports.gatherCommitQuality = gatherCommitQuality;
5
7
  exports.gatherHotFiles = gatherHotFiles;
@@ -1 +1 @@
1
- {"version":3,"file":"gather.js","sourceRoot":"","sources":["../../../src/analyzers/developer/gather.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gather.js","sourceRoot":"","sources":["../../../src/analyzers/developer/gather.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Best-effort GitHub handle from a commit email, offline + deterministic.
3
+ * GitHub's privacy-relay emails encode the login:
4
+ * `username@users.noreply.github.com` → `username`
5
+ * `12345+username@users.noreply.github.com` → `username`
6
+ * Returns `undefined` for any other email (a real handle then needs the
7
+ * GitHub API, which the reviewers CLI may resolve where available).
8
+ */
9
+ export declare function handleFromEmail(email: string): string | undefined;
10
+ /** One commit that touched the queried files. */
11
+ export interface CommitTouch {
12
+ readonly name: string;
13
+ readonly email: string;
14
+ /** Author date, ISO 8601 (`%aI`). */
15
+ readonly dateISO: string;
16
+ }
17
+ /** A ranked owner of the queried files. */
18
+ export interface FileOwner {
19
+ readonly name: string;
20
+ /** Internal join key only — git's stable identity. NEVER render this in
21
+ * committed output; use `name` / `githubHandle` instead. */
22
+ readonly email: string;
23
+ /** GitHub @handle when resolvable offline from the email (privacy-safe,
24
+ * @-mentionable, feeds `gh --reviewer`). Absent ⇒ render `name`. */
25
+ readonly githubHandle?: string;
26
+ /** Commits (within the knowledge window) touching the queried files. */
27
+ readonly commits: number;
28
+ /** ISO date of this owner's most recent touch of the files. */
29
+ readonly lastTouched: string;
30
+ /** Whether the owner is still active repo-wide (in the recent window). */
31
+ readonly active: boolean;
32
+ /** Recency-weighted score; higher = stronger current ownership. */
33
+ readonly score: number;
34
+ }
35
+ export interface OwnershipResult {
36
+ /** Owners sorted by score desc. Includes inactive owners (flagged) so
37
+ * attribution can say "original author inactive" rather than hiding them. */
38
+ readonly ranked: ReadonlyArray<FileOwner>;
39
+ /** Number of distinct ACTIVE owners whose combined score covers ~50% of
40
+ * the active ownership — a bus-factor signal. 0 when no active owner. */
41
+ readonly busFactor: number;
42
+ /** True when no ACTIVE human owner was found (everyone who knows these
43
+ * files has gone quiet / left). Callers fall back to current ownership. */
44
+ readonly allInactive: boolean;
45
+ }
46
+ export interface RankOwnersOptions {
47
+ /** Normalized emails to drop from the ranking (e.g. the PR author). */
48
+ readonly excludeEmails?: ReadonlySet<string>;
49
+ /** "Now" for recency decay — injectable for deterministic tests. */
50
+ readonly now: Date;
51
+ /** Half-life (days) for the recency decay. Default 180 (~2 quarters). */
52
+ readonly halfLifeDays?: number;
53
+ }
54
+ /**
55
+ * Pure ranking core. `activeEmails` is the set of NORMALIZED emails
56
+ * considered currently active (repo-wide recent window). `touches` is one
57
+ * entry per commit that touched the queried files (bots included — they're
58
+ * filtered here).
59
+ */
60
+ export declare function rankOwners(touches: ReadonlyArray<CommitTouch>, activeEmails: ReadonlySet<string>, opts: RankOwnersOptions): OwnershipResult;
61
+ /**
62
+ * The set of NORMALIZED author emails considered currently active — anyone
63
+ * with a non-merge commit repo-wide within `since`. Departed contributors
64
+ * (no recent commit anywhere) are absent. Shared by the ownership ranking
65
+ * and by finding attribution (to decide whether a blamed author is still
66
+ * around to ask).
67
+ */
68
+ export declare function gatherActiveEmails(cwd: string, since?: string): Set<string>;
69
+ export interface OwnersForOptions {
70
+ /** Recent-activity window for "active" (git `--since`). Default 6 months. */
71
+ readonly activeSince?: string;
72
+ /** Knowledge-window for who-touched-the-files (git `--since`). Omit for
73
+ * full history (recency decay handles down-weighting old work). */
74
+ readonly knowledgeSince?: string;
75
+ /** Normalized emails to exclude (e.g. the PR author). */
76
+ readonly excludeEmails?: ReadonlySet<string>;
77
+ readonly now?: Date;
78
+ readonly halfLifeDays?: number;
79
+ }
80
+ /**
81
+ * Gather ownership for `files` via git, then rank. Returns an empty result
82
+ * (no owners) when git produces nothing — callers treat that as "unknown,"
83
+ * never as "no owners exist."
84
+ */
85
+ export declare function ownersFor(cwd: string, files: ReadonlyArray<string>, opts?: OwnersForOptions): OwnershipResult;
86
+ //# sourceMappingURL=ownership.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ownership.d.ts","sourceRoot":"","sources":["../../../src/analyzers/developer/ownership.ts"],"names":[],"mappings":"AAuCA;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKjE;AAED,iDAAiD;AACjD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,qCAAqC;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,2CAA2C;AAC3C,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;iEAC6D;IAC7D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB;yEACqE;IACrE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,wEAAwE;IACxE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,+DAA+D;IAC/D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,0EAA0E;IAC1E,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,mEAAmE;IACnE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B;kFAC8E;IAC9E,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IAC1C;8EAC0E;IAC1E,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B;gFAC4E;IAC5E,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,iBAAiB;IAChC,uEAAuE;IACvE,QAAQ,CAAC,aAAa,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7C,oEAAoE;IACpE,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC;IACnB,yEAAyE;IACzE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAKD;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,aAAa,CAAC,WAAW,CAAC,EACnC,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,EACjC,IAAI,EAAE,iBAAiB,GACtB,eAAe,CAwEjB;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,SAAiB,GAAG,GAAG,CAAC,MAAM,CAAC,CAQnF;AAED,MAAM,WAAW,gBAAgB;IAC/B,6EAA6E;IAC7E,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B;wEACoE;IACpE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,yDAAyD;IACzD,QAAQ,CAAC,aAAa,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7C,QAAQ,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,EAC5B,IAAI,GAAE,gBAAqB,GAC1B,eAAe,CA6BjB"}
@@ -0,0 +1,180 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleFromEmail = handleFromEmail;
4
+ exports.rankOwners = rankOwners;
5
+ exports.gatherActiveEmails = gatherActiveEmails;
6
+ exports.ownersFor = ownersFor;
7
+ /**
8
+ * Active-owner model — who knows a set of files, and which of them are
9
+ * still around to ask. Shared substrate for finding attribution ("who
10
+ * introduced / who to ask") and reviewer recommendation ("who should
11
+ * review this"). All git-based; `git` is a builtin (tool-registry
12
+ * exemption).
13
+ *
14
+ * The module is split so the ranking logic is testable without git:
15
+ * - `rankOwners(touches, activeEmails, opts)` — PURE. Given per-commit
16
+ * authorship touching the files plus the set of currently-active
17
+ * authors, produces the ranked owners + bus-factor + all-inactive flag.
18
+ * - `ownersFor(cwd, files, opts)` — IO wrapper. Gathers the touches +
19
+ * the active-author set via git, then delegates to `rankOwners`.
20
+ *
21
+ * Edge cases (the make-or-break list) all live in `rankOwners`:
22
+ * - Active = present in the repo-wide recent window. A contributor who
23
+ * last touched a file two years ago and hasn't committed since is
24
+ * marked `active: false` (left the team / went quiet) — never silently
25
+ * recommended.
26
+ * - Bots excluded (reuses `isBotAuthor`).
27
+ * - Recency-weighted — a single commit long ago ranks far below sustained
28
+ * recent work (exponential half-life decay).
29
+ * - `excludeEmails` drops e.g. the PR author from the ranking.
30
+ * - `busFactor` surfaces single-point-of-failure ownership.
31
+ * - `allInactive` lets callers fall back to current ownership / CODEOWNERS
32
+ * and SAY SO rather than naming someone unreachable.
33
+ *
34
+ * Identity vs output: `email` is the INTERNAL join key (git's stable
35
+ * identity for clustering aliases) — it is NOT for display. Committed
36
+ * output (reports / PR bodies) renders `name` + the GitHub `@handle`
37
+ * (resolved offline from `…@users.noreply.github.com` emails when
38
+ * possible), never the raw email. The handle is both the privacy-safe
39
+ * identifier AND the actionable one — it's @-mentionable and is what
40
+ * `gh pr create --reviewer` consumes. Callers must not surface `email`
41
+ * in any committed artifact.
42
+ */
43
+ const runner_1 = require("../tools/runner");
44
+ const gather_1 = require("./gather");
45
+ /**
46
+ * Best-effort GitHub handle from a commit email, offline + deterministic.
47
+ * GitHub's privacy-relay emails encode the login:
48
+ * `username@users.noreply.github.com` → `username`
49
+ * `12345+username@users.noreply.github.com` → `username`
50
+ * Returns `undefined` for any other email (a real handle then needs the
51
+ * GitHub API, which the reviewers CLI may resolve where available).
52
+ */
53
+ function handleFromEmail(email) {
54
+ const m = email
55
+ .toLowerCase()
56
+ .match(/^(?:\d+\+)?([a-z0-9](?:[a-z0-9-]*[a-z0-9])?)@users\.noreply\.github\.com$/);
57
+ return m ? m[1] : undefined;
58
+ }
59
+ const DEFAULT_HALF_LIFE_DAYS = 180;
60
+ const MS_PER_DAY = 24 * 60 * 60 * 1000;
61
+ /**
62
+ * Pure ranking core. `activeEmails` is the set of NORMALIZED emails
63
+ * considered currently active (repo-wide recent window). `touches` is one
64
+ * entry per commit that touched the queried files (bots included — they're
65
+ * filtered here).
66
+ */
67
+ function rankOwners(touches, activeEmails, opts) {
68
+ const halfLife = opts.halfLifeDays ?? DEFAULT_HALF_LIFE_DAYS;
69
+ const nowMs = opts.now.getTime();
70
+ const exclude = opts.excludeEmails ?? new Set();
71
+ const byEmail = new Map();
72
+ for (const t of touches) {
73
+ if ((0, gather_1.isBotAuthor)(t.name, t.email))
74
+ continue;
75
+ const key = (0, gather_1.normalizeEmail)(t.email);
76
+ if (exclude.has(key))
77
+ continue;
78
+ const touchedMs = Date.parse(t.dateISO);
79
+ if (Number.isNaN(touchedMs))
80
+ continue;
81
+ const ageDays = Math.max(0, (nowMs - touchedMs) / MS_PER_DAY);
82
+ const weight = Math.pow(0.5, ageDays / halfLife);
83
+ const handle = handleFromEmail(t.email);
84
+ const existing = byEmail.get(key);
85
+ if (existing) {
86
+ existing.commits += 1;
87
+ existing.score += weight;
88
+ // Keep any resolvable handle, even if it came from a different alias.
89
+ if (!existing.handle && handle)
90
+ existing.handle = handle;
91
+ if (touchedMs > existing.lastTouchedMs) {
92
+ existing.lastTouchedMs = touchedMs;
93
+ existing.name = t.name; // prefer the name on the most recent commit
94
+ }
95
+ }
96
+ else {
97
+ byEmail.set(key, {
98
+ name: t.name,
99
+ email: t.email,
100
+ ...(handle ? { handle } : {}),
101
+ commits: 1,
102
+ score: weight,
103
+ lastTouchedMs: touchedMs,
104
+ });
105
+ }
106
+ }
107
+ const ranked = [...byEmail.entries()]
108
+ .map(([key, a]) => ({
109
+ name: a.name,
110
+ email: a.email,
111
+ ...(a.handle ? { githubHandle: a.handle } : {}),
112
+ commits: a.commits,
113
+ lastTouched: new Date(a.lastTouchedMs).toISOString().slice(0, 10),
114
+ active: activeEmails.has(key),
115
+ score: a.score,
116
+ }))
117
+ .sort((x, y) => y.score - x.score || y.commits - x.commits || x.name.localeCompare(y.name));
118
+ // Bus factor: among active owners, how many cover ~50% of active score.
119
+ const activeOwners = ranked.filter((o) => o.active);
120
+ const activeTotal = activeOwners.reduce((s, o) => s + o.score, 0);
121
+ let busFactor = 0;
122
+ if (activeTotal > 0) {
123
+ let cum = 0;
124
+ for (const o of activeOwners) {
125
+ busFactor += 1;
126
+ cum += o.score;
127
+ if (cum >= activeTotal * 0.5)
128
+ break;
129
+ }
130
+ }
131
+ return { ranked, busFactor, allInactive: activeOwners.length === 0 };
132
+ }
133
+ /**
134
+ * The set of NORMALIZED author emails considered currently active — anyone
135
+ * with a non-merge commit repo-wide within `since`. Departed contributors
136
+ * (no recent commit anywhere) are absent. Shared by the ownership ranking
137
+ * and by finding attribution (to decide whether a blamed author is still
138
+ * around to ask).
139
+ */
140
+ function gatherActiveEmails(cwd, since = '6 months ago') {
141
+ const out = (0, runner_1.run)(`git shortlog -sne --no-merges --since='${since}' HEAD`, cwd, 30000);
142
+ const emails = new Set();
143
+ for (const line of (out || '').split('\n')) {
144
+ const m = line.trim().match(/^\d+\s+.+?\s+<([^>]+)>$/);
145
+ if (m)
146
+ emails.add((0, gather_1.normalizeEmail)(m[1]));
147
+ }
148
+ return emails;
149
+ }
150
+ /**
151
+ * Gather ownership for `files` via git, then rank. Returns an empty result
152
+ * (no owners) when git produces nothing — callers treat that as "unknown,"
153
+ * never as "no owners exist."
154
+ */
155
+ function ownersFor(cwd, files, opts = {}) {
156
+ const now = opts.now ?? new Date();
157
+ if (files.length === 0) {
158
+ return { ranked: [], busFactor: 0, allInactive: true };
159
+ }
160
+ // Per-file authorship: one line per commit touching any of the files.
161
+ // `%x1f` (unit separator) avoids collisions with names/emails.
162
+ const since = opts.knowledgeSince ? `--since='${opts.knowledgeSince}'` : '';
163
+ const pathArgs = files.map((f) => `'${f.replace(/'/g, "'\\''")}'`).join(' ');
164
+ const logOut = (0, runner_1.run)(`git log --no-merges ${since} --format='%aN%x1f%aE%x1f%aI' -- ${pathArgs}`, cwd, 30000);
165
+ const touches = [];
166
+ for (const line of (logOut || '').split('\n')) {
167
+ if (!line.trim())
168
+ continue;
169
+ const [name, email, dateISO] = line.split('\x1f');
170
+ if (name && email && dateISO)
171
+ touches.push({ name, email, dateISO });
172
+ }
173
+ const activeEmails = gatherActiveEmails(cwd, opts.activeSince ?? '6 months ago');
174
+ return rankOwners(touches, activeEmails, {
175
+ excludeEmails: opts.excludeEmails,
176
+ now,
177
+ ...(opts.halfLifeDays !== undefined ? { halfLifeDays: opts.halfLifeDays } : {}),
178
+ });
179
+ }
180
+ //# sourceMappingURL=ownership.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ownership.js","sourceRoot":"","sources":["../../../src/analyzers/developer/ownership.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,7 @@
7
7
  import { QualityReport, QualityMetrics } from './types';
8
8
  import { RankedAction } from '../remediation';
9
9
  import { type DetailedGraphContext } from '../../explore/finding-context';
10
+ import { type DetailedAttribution } from '../../attribution/attribute';
10
11
  export interface QualityDetailedReport extends QualityReport {
11
12
  /** Schema version for agent consumers. Bump on breaking shape changes. */
12
13
  schemaVersion: string;
@@ -18,7 +19,10 @@ export interface QualityDetailedReport extends QualityReport {
18
19
  * loaded.
19
20
  */
20
21
  graphContext?: DetailedGraphContext;
22
+ /** Per-file "who to ask" (owner), keyed by file path. Present only when
23
+ * the run passed `--attribute`. */
24
+ attribution?: DetailedAttribution;
21
25
  }
22
- export declare function buildQualityDetailed(report: QualityReport, graphContext?: DetailedGraphContext): QualityDetailedReport;
26
+ export declare function buildQualityDetailed(report: QualityReport, graphContext?: DetailedGraphContext, attribution?: DetailedAttribution): QualityDetailedReport;
23
27
  export declare function formatQualityDetailedMarkdown(detailed: QualityDetailedReport, elapsed: string): string;
24
28
  //# sourceMappingURL=detailed.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"detailed.d.ts","sourceRoot":"","sources":["../../../src/analyzers/quality/detailed.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACxD,OAAO,EAAE,YAAY,EAAQ,MAAM,gBAAgB,CAAC;AAKpD,OAAO,EAIL,KAAK,oBAAoB,EAC1B,MAAM,+BAA+B,CAAC;AAEvC,MAAM,WAAW,qBAAsB,SAAQ,aAAa;IAC1D,0EAA0E;IAC1E,aAAa,EAAE,MAAM,CAAC;IACtB,8DAA8D;IAC9D,OAAO,EAAE,KAAK,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC;IAC7C;;;;OAIG;IACH,YAAY,CAAC,EAAE,oBAAoB,CAAC;CACrC;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,aAAa,EACrB,YAAY,CAAC,EAAE,oBAAoB,GAClC,qBAAqB,CAUvB;AAED,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,qBAAqB,EAC/B,OAAO,EAAE,MAAM,GACd,MAAM,CAiJR"}
1
+ {"version":3,"file":"detailed.d.ts","sourceRoot":"","sources":["../../../src/analyzers/quality/detailed.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACxD,OAAO,EAAE,YAAY,EAAQ,MAAM,gBAAgB,CAAC;AAKpD,OAAO,EAIL,KAAK,oBAAoB,EAC1B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,6BAA6B,CAAC;AAErC,MAAM,WAAW,qBAAsB,SAAQ,aAAa;IAC1D,0EAA0E;IAC1E,aAAa,EAAE,MAAM,CAAC;IACtB,8DAA8D;IAC9D,OAAO,EAAE,KAAK,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC;IAC7C;;;;OAIG;IACH,YAAY,CAAC,EAAE,oBAAoB,CAAC;IACpC;wCACoC;IACpC,WAAW,CAAC,EAAE,mBAAmB,CAAC;CACnC;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,aAAa,EACrB,YAAY,CAAC,EAAE,oBAAoB,EACnC,WAAW,CAAC,EAAE,mBAAmB,GAChC,qBAAqB,CAWvB;AAED,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,qBAAqB,EAC/B,OAAO,EAAE,MAAM,GACd,MAAM,CAyIR"}
@@ -8,13 +8,15 @@ const index_1 = require("./index");
8
8
  const scoring_1 = require("../../scoring");
9
9
  const tools_unavailable_prose_1 = require("../tools/tools-unavailable-prose");
10
10
  const finding_context_1 = require("../../explore/finding-context");
11
- function buildQualityDetailed(report, graphContext) {
11
+ const attribute_1 = require("../../attribution/attribute");
12
+ function buildQualityDetailed(report, graphContext, attribution) {
12
13
  const actions = (0, remediation_1.rank)((0, actions_1.buildSlopActions)(report.metrics), report.metrics, (m) => (0, scoring_1.evaluateSpec)(scoring_1.QUALITY_SCORING_SPEC, (0, index_1.qualityMetricsToScoreInput)(m)));
13
14
  return {
14
15
  ...report,
15
16
  schemaVersion: '11',
16
17
  actions,
17
18
  ...(graphContext ? { graphContext } : {}),
19
+ ...(attribution ? { attribution } : {}),
18
20
  };
19
21
  }
20
22
  function formatQualityDetailedMarkdown(detailed, elapsed) {
@@ -88,50 +90,49 @@ function formatQualityDetailedMarkdown(detailed, elapsed) {
88
90
  // when --graph-context ran, so a reader sees how central each
89
91
  // offender file is before deciding to touch it.
90
92
  const gc = detailed.graphContext;
93
+ const attr = detailed.attribution;
91
94
  let provenancePrinted = false;
92
95
  const offenderProvenance = () => {
93
- if (gc && !provenancePrinted) {
96
+ if (provenancePrinted)
97
+ return;
98
+ if (gc)
94
99
  L.push((0, finding_context_1.graphContextProvenanceLine)(gc));
100
+ if (attr)
101
+ L.push((0, attribute_1.attributionProvenanceLine)());
102
+ if (gc || attr)
95
103
  L.push('');
96
- provenancePrinted = true;
104
+ provenancePrinted = true;
105
+ };
106
+ // Column-driven offender table — graph context + attribution compose.
107
+ const offenderTable = (files) => {
108
+ const headers = ['File', 'Count'];
109
+ if (gc)
110
+ headers.push('Graph context');
111
+ if (attr)
112
+ headers.push('Who to ask');
113
+ L.push(`| ${headers.join(' | ')} |`);
114
+ L.push(`|${headers.map((h) => (h === 'Count' ? '-----:' : '---')).join('|')}|`);
115
+ for (const f of files) {
116
+ const cells = [`\`${f.file}\``, String(f.count)];
117
+ if (gc)
118
+ cells.push((0, finding_context_1.formatGraphContextCell)(gc.contexts[(0, finding_context_1.locationKey)(f.file)]));
119
+ if (attr)
120
+ cells.push((0, attribute_1.formatAttributionCell)(attr.attributions[(0, finding_context_1.locationKey)(f.file)]));
121
+ L.push(`| ${cells.join(' | ')} |`);
97
122
  }
98
123
  };
99
124
  if (m.topConsoleFiles && m.topConsoleFiles.length > 0) {
100
125
  L.push('## Files with Most Console Statements');
101
126
  L.push('');
102
127
  offenderProvenance();
103
- if (gc) {
104
- L.push('| File | Count | Graph context |');
105
- L.push('|------|------:|----------------|');
106
- for (const f of m.topConsoleFiles) {
107
- L.push(`| \`${f.file}\` | ${f.count} | ${(0, finding_context_1.formatGraphContextCell)(gc.contexts[(0, finding_context_1.locationKey)(f.file)])} |`);
108
- }
109
- }
110
- else {
111
- L.push('| File | Count |');
112
- L.push('|------|------:|');
113
- for (const f of m.topConsoleFiles)
114
- L.push(`| \`${f.file}\` | ${f.count} |`);
115
- }
128
+ offenderTable(m.topConsoleFiles);
116
129
  L.push('');
117
130
  }
118
131
  if (m.topTodoFiles && m.topTodoFiles.length > 0) {
119
132
  L.push('## Files with Most TODO/FIXME/HACK');
120
133
  L.push('');
121
134
  offenderProvenance();
122
- if (gc) {
123
- L.push('| File | Count | Graph context |');
124
- L.push('|------|------:|----------------|');
125
- for (const f of m.topTodoFiles) {
126
- L.push(`| \`${f.file}\` | ${f.count} | ${(0, finding_context_1.formatGraphContextCell)(gc.contexts[(0, finding_context_1.locationKey)(f.file)])} |`);
127
- }
128
- }
129
- else {
130
- L.push('| File | Count |');
131
- L.push('|------|------:|');
132
- for (const f of m.topTodoFiles)
133
- L.push(`| \`${f.file}\` | ${f.count} |`);
134
- }
135
+ offenderTable(m.topTodoFiles);
135
136
  L.push('');
136
137
  }
137
138
  if (m.staleFiles.length > 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"detailed.js","sourceRoot":"","sources":["../../../src/analyzers/quality/detailed.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"detailed.js","sourceRoot":"","sources":["../../../src/analyzers/quality/detailed.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import { SecurityReport } from './types';
2
2
  import { RankedAction } from '../remediation';
3
3
  import { SecurityScoreInput } from '../../scoring';
4
4
  import { type DetailedGraphContext } from '../../explore/finding-context';
5
+ import { type DetailedAttribution } from '../../attribution/attribute';
5
6
  export interface SecurityDetailedReport extends SecurityReport {
6
7
  schemaVersion: string;
7
8
  securityScore: number;
@@ -12,7 +13,12 @@ export interface SecurityDetailedReport extends SecurityReport {
12
13
  * AND a graph.json was loadable; absent otherwise (fail-open).
13
14
  */
14
15
  graphContext?: DetailedGraphContext;
16
+ /**
17
+ * Per-finding "who to ask" attribution, keyed by `file:line`. Present
18
+ * only when the run passed `--attribute`; absent otherwise (fail-open).
19
+ */
20
+ attribution?: DetailedAttribution;
15
21
  }
16
- export declare function buildSecurityDetailed(report: SecurityReport, graphContext?: DetailedGraphContext): SecurityDetailedReport;
22
+ export declare function buildSecurityDetailed(report: SecurityReport, graphContext?: DetailedGraphContext, attribution?: DetailedAttribution): SecurityDetailedReport;
17
23
  export declare function formatSecurityDetailedMarkdown(detailed: SecurityDetailedReport, elapsed: string): string;
18
24
  //# sourceMappingURL=detailed.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"detailed.d.ts","sourceRoot":"","sources":["../../../src/analyzers/security/detailed.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAA6B,MAAM,SAAS,CAAC;AACpE,OAAO,EAAE,YAAY,EAAQ,MAAM,gBAAgB,CAAC;AAEpD,OAAO,EAAyB,kBAAkB,EAAgB,MAAM,eAAe,CAAC;AAExF,OAAO,EAIL,KAAK,oBAAoB,EAC1B,MAAM,+BAA+B,CAAC;AAEvC,MAAM,WAAW,sBAAuB,SAAQ,cAAc;IAC5D,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,KAAK,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACjD;;;;OAIG;IACH,YAAY,CAAC,EAAE,oBAAoB,CAAC;CACrC;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,cAAc,EACtB,YAAY,CAAC,EAAE,oBAAoB,GAClC,sBAAsB,CAaxB;AAID,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,sBAAsB,EAChC,OAAO,EAAE,MAAM,GACd,MAAM,CAgLR"}
1
+ {"version":3,"file":"detailed.d.ts","sourceRoot":"","sources":["../../../src/analyzers/security/detailed.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAA6B,MAAM,SAAS,CAAC;AACpE,OAAO,EAAE,YAAY,EAAQ,MAAM,gBAAgB,CAAC;AAEpD,OAAO,EAAyB,kBAAkB,EAAgB,MAAM,eAAe,CAAC;AAExF,OAAO,EAIL,KAAK,oBAAoB,EAC1B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,6BAA6B,CAAC;AAErC,MAAM,WAAW,sBAAuB,SAAQ,cAAc;IAC5D,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,KAAK,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACjD;;;;OAIG;IACH,YAAY,CAAC,EAAE,oBAAoB,CAAC;IACpC;;;OAGG;IACH,WAAW,CAAC,EAAE,mBAAmB,CAAC;CACnC;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,cAAc,EACtB,YAAY,CAAC,EAAE,oBAAoB,EACnC,WAAW,CAAC,EAAE,mBAAmB,GAChC,sBAAsB,CAcxB;AAID,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,sBAAsB,EAChC,OAAO,EAAE,MAAM,GACd,MAAM,CAoLR"}