@vyuhlabs/dxkit 2.9.2 → 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.
- package/CHANGELOG.md +68 -0
- package/README.md +20 -9
- package/dist/analyzers/developer/gather.d.ts +16 -0
- package/dist/analyzers/developer/gather.d.ts.map +1 -1
- package/dist/analyzers/developer/gather.js +2 -0
- package/dist/analyzers/developer/gather.js.map +1 -1
- package/dist/analyzers/developer/ownership.d.ts +86 -0
- package/dist/analyzers/developer/ownership.d.ts.map +1 -0
- package/dist/analyzers/developer/ownership.js +180 -0
- package/dist/analyzers/developer/ownership.js.map +1 -0
- package/dist/analyzers/quality/detailed.d.ts +5 -1
- package/dist/analyzers/quality/detailed.d.ts.map +1 -1
- package/dist/analyzers/quality/detailed.js +30 -29
- package/dist/analyzers/quality/detailed.js.map +1 -1
- package/dist/analyzers/security/detailed.d.ts +7 -1
- package/dist/analyzers/security/detailed.d.ts.map +1 -1
- package/dist/analyzers/security/detailed.js +31 -15
- package/dist/analyzers/security/detailed.js.map +1 -1
- package/dist/analyzers/tests/actions.d.ts +18 -1
- package/dist/analyzers/tests/actions.d.ts.map +1 -1
- package/dist/analyzers/tests/actions.js +37 -1
- package/dist/analyzers/tests/actions.js.map +1 -1
- package/dist/analyzers/tests/detailed.d.ts +5 -1
- package/dist/analyzers/tests/detailed.d.ts.map +1 -1
- package/dist/analyzers/tests/detailed.js +42 -23
- package/dist/analyzers/tests/detailed.js.map +1 -1
- package/dist/analyzers/tests/types.d.ts +10 -0
- package/dist/analyzers/tests/types.d.ts.map +1 -1
- package/dist/attribution/attribute.d.ts +57 -0
- package/dist/attribution/attribute.d.ts.map +1 -0
- package/dist/attribution/attribute.js +149 -0
- package/dist/attribution/attribute.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +53 -5
- package/dist/cli.js.map +1 -1
- package/dist/generator.d.ts.map +1 -1
- package/dist/generator.js +12 -0
- package/dist/generator.js.map +1 -1
- package/dist/reviewers-cli.d.ts +57 -0
- package/dist/reviewers-cli.d.ts.map +1 -0
- package/dist/reviewers-cli.js +263 -0
- package/dist/reviewers-cli.js.map +1 -0
- package/package.json +1 -1
- package/templates/.claude/skills/dxkit-action/SKILL.md +42 -1
- package/templates/.claude/skills/dxkit-docs/SKILL.md +2 -0
- package/templates/.claude/skills/dxkit-feature/SKILL.md +14 -3
- package/templates/.claude/skills/dxkit-init/SKILL.md +1 -1
- package/templates/.claude/skills/dxkit-onboard/SKILL.md +2 -2
- package/templates/.claude/skills/dxkit-pr/SKILL.md +163 -0
- package/templates/.claude/skills/dxkit-reports/SKILL.md +1 -1
- package/templates/.claude/skills/dxkit-test/SKILL.md +130 -0
- package/templates/.claude/skills/dxkit-update/SKILL.md +4 -0
- package/templates/AGENTS.md.template +9 -3
- package/templates/CLAUDE.md.template +9 -3
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,74 @@ 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
|
+
|
|
42
|
+
## [2.9.3] - 2026-06-09
|
|
43
|
+
|
|
44
|
+
### Targetable fix loop + test generation
|
|
45
|
+
|
|
46
|
+
A workflow-depth release: make the fix loop targetable, add the test-writing
|
|
47
|
+
skill the suite was missing, and surface the riskiest test gaps first. Almost
|
|
48
|
+
entirely agent-skill + docs work; one contained, flag-gated analyzer change.
|
|
49
|
+
|
|
50
|
+
- **Scoped fixes.** `dxkit-action` can burn down one category at a time —
|
|
51
|
+
dependency/BOM vulnerabilities, security, code quality, tests, or docs. It
|
|
52
|
+
runs the report that partitions that dimension and works only that worklist,
|
|
53
|
+
with the usual severity → reachability → blast-radius prioritization applied
|
|
54
|
+
within the scope. Tests/docs scopes hand off to `dxkit-test` / `dxkit-docs`.
|
|
55
|
+
- **New `dxkit-test` skill** — the testing mirror of `dxkit-docs`. Reads the
|
|
56
|
+
test-gaps worklist, orients on real behavior via the code graph, and writes
|
|
57
|
+
meaningful tests that close the highest-risk gaps and move the Tests score
|
|
58
|
+
without coverage theater (real assertions, the repo's framework, the suite +
|
|
59
|
+
coverage run to prove it).
|
|
60
|
+
- **Test-gap blast-radius weighting.** With a code graph present
|
|
61
|
+
(`test-gaps --graph-context`), the untested-file worklist is ranked within
|
|
62
|
+
each risk tier by how many files depend on each one — the most-depended-on
|
|
63
|
+
gaps surface first instead of just the largest by line count. Ordering only;
|
|
64
|
+
the Tests score is unchanged (it derives from the tier counts). Files the
|
|
65
|
+
graph can't resolve fall back to line-count ranking and are never dropped.
|
|
66
|
+
- **New `dxkit-pr` skill** — opens a pull request with a title + body grounded
|
|
67
|
+
in the branch's real commits and diff (features, fixes, findings closed),
|
|
68
|
+
the dxkit signals a reviewer needs (guardrail verdict, allowlist activity,
|
|
69
|
+
score deltas), and a checklist tailored to the actual change. `dxkit-feature`
|
|
70
|
+
now offers to write tests for a newly built surface (on confirmation) and
|
|
71
|
+
hands off to `dxkit-test`.
|
|
72
|
+
- **Docs + roadmap refresh.** Every doc surface updated for the current skill
|
|
73
|
+
set; the roadmap records why deep-SAST (code-path) reachability is deferred —
|
|
74
|
+
it needs interprocedural taint analysis dxkit can't do natively (semgrep is
|
|
75
|
+
intraprocedural; the call graph is too sparse), so the realistic path is
|
|
76
|
+
surfacing an ingested engine's reachability rather than computing our own.
|
|
77
|
+
|
|
10
78
|
## [2.9.2] - 2026-06-09
|
|
11
79
|
|
|
12
80
|
### Allowlist lifecycle + Snyk credential ergonomics
|
package/README.md
CHANGED
|
@@ -184,15 +184,17 @@ Orphaned annotations become their own findings. The TypeScript `@ts-expect-error
|
|
|
184
184
|
|
|
185
185
|
dxkit ships a suite of Claude Code skills under `.claude/skills/dxkit-*`. They wrap the CLI in conversational flows:
|
|
186
186
|
|
|
187
|
-
| Skill | What it does
|
|
188
|
-
| --------------------------------------------------------------------------------------------------------- |
|
|
189
|
-
| `dxkit-onboard` | Walks a customer through the full first-install journey
|
|
190
|
-
| `dxkit-reports` | Runs analyzers and explains the output
|
|
191
|
-
| `dxkit-action` | Reads a report, prioritizes findings, plans and runs fixes, re-verifies
|
|
192
|
-
| `dxkit-ingest` | Brings external SAST findings (Snyk Code, CodeQL, SARIF) into dxkit
|
|
193
|
-
| `dxkit-fix` | Repairs a broken install from doctor output
|
|
194
|
-
| `dxkit-allowlist` | Manages the suppression lifecycle: audit, remove, prune, export to Snyk
|
|
195
|
-
| `dxkit-
|
|
187
|
+
| Skill | What it does |
|
|
188
|
+
| --------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- |
|
|
189
|
+
| `dxkit-onboard` | Walks a customer through the full first-install journey |
|
|
190
|
+
| `dxkit-reports` | Runs analyzers and explains the output |
|
|
191
|
+
| `dxkit-action` | Reads a report, prioritizes findings, plans and runs fixes, re-verifies |
|
|
192
|
+
| `dxkit-ingest` | Brings external SAST findings (Snyk Code, CodeQL, SARIF) into dxkit |
|
|
193
|
+
| `dxkit-fix` | Repairs a broken install from doctor output |
|
|
194
|
+
| `dxkit-allowlist` | Manages the suppression lifecycle: audit, remove, prune, export to Snyk |
|
|
195
|
+
| `dxkit-test` | Writes the missing tests to close gaps + raise the Tests score |
|
|
196
|
+
| `dxkit-pr` | Opens a PR with a diff-grounded body + dxkit signals + reviewer checklist |
|
|
197
|
+
| `dxkit-feature`, `dxkit-docs`, `dxkit-hooks`, `dxkit-config`, `dxkit-learn`, `dxkit-update`, `dxkit-init` | Focused flows |
|
|
196
198
|
|
|
197
199
|
`AGENTS.md` (the open standard read by Codex, Cursor, Aider, and others) also ships in every install. The skill flows are Claude Code-specific today; the AGENTS.md context is portable.
|
|
198
200
|
|
|
@@ -208,6 +210,15 @@ dxkit builds a deterministic code graph of your repo (its symbols, call edges, a
|
|
|
208
210
|
|
|
209
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."
|
|
210
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
|
+
|
|
211
222
|
### Deep SAST: interprocedural findings from any engine
|
|
212
223
|
|
|
213
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;
|
|
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":";;AA+CA,0CAKC;AA2DD,gCA4EC;AASD,gDAQC;AAmBD,8BAiCC;AAhQD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,4CAAsC;AACtC,qCAAuD;AAEvD;;;;;;;GAOG;AACH,SAAgB,eAAe,CAAC,KAAa;IAC3C,MAAM,CAAC,GAAG,KAAK;SACZ,WAAW,EAAE;SACb,KAAK,CAAC,2EAA2E,CAAC,CAAC;IACtF,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9B,CAAC;AAkDD,MAAM,sBAAsB,GAAG,GAAG,CAAC;AACnC,MAAM,UAAU,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEvC;;;;;GAKG;AACH,SAAgB,UAAU,CACxB,OAAmC,EACnC,YAAiC,EACjC,IAAuB;IAEvB,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,IAAI,sBAAsB,CAAC;IAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,GAAG,EAAU,CAAC;IAUxD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAe,CAAC;IAEvC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,IAAA,oBAAW,EAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC;YAAE,SAAS;QAC3C,MAAM,GAAG,GAAG,IAAA,uBAAc,EAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC;YAAE,SAAS;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,GAAG,SAAS,CAAC,GAAG,UAAU,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,GAAG,QAAQ,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;YACtB,QAAQ,CAAC,KAAK,IAAI,MAAM,CAAC;YACzB,sEAAsE;YACtE,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,MAAM;gBAAE,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC;YACzD,IAAI,SAAS,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC;gBACvC,QAAQ,CAAC,aAAa,GAAG,SAAS,CAAC;gBACnC,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,4CAA4C;YACtE,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE;gBACf,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7B,OAAO,EAAE,CAAC;gBACV,KAAK,EAAE,MAAM;gBACb,aAAa,EAAE,SAAS;aACzB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAgB,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;SAC/C,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAClB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,WAAW,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QACjE,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC;QAC7B,KAAK,EAAE,CAAC,CAAC,KAAK;KACf,CAAC,CAAC;SACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAE9F,wEAAwE;IACxE,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAClE,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QACpB,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;YAC7B,SAAS,IAAI,CAAC,CAAC;YACf,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC;YACf,IAAI,GAAG,IAAI,WAAW,GAAG,GAAG;gBAAE,MAAM;QACtC,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;AACvE,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,kBAAkB,CAAC,GAAW,EAAE,KAAK,GAAG,cAAc;IACpE,MAAM,GAAG,GAAG,IAAA,YAAG,EAAC,0CAA0C,KAAK,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IACrF,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QACvD,IAAI,CAAC;YAAE,MAAM,CAAC,GAAG,CAAC,IAAA,uBAAc,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAcD;;;;GAIG;AACH,SAAgB,SAAS,CACvB,GAAW,EACX,KAA4B,EAC5B,OAAyB,EAAE;IAE3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;IACnC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IACzD,CAAC;IAED,sEAAsE;IACtE,+DAA+D;IAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5E,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7E,MAAM,MAAM,GAAG,IAAA,YAAG,EAChB,uBAAuB,KAAK,oCAAoC,QAAQ,EAAE,EAC1E,GAAG,EACH,KAAK,CACN,CAAC;IACF,MAAM,OAAO,GAAkB,EAAE,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9C,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,SAAS;QAC3B,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAClD,IAAI,IAAI,IAAI,KAAK,IAAI,OAAO;YAAE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,YAAY,GAAG,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,IAAI,cAAc,CAAC,CAAC;IAEjF,OAAO,UAAU,CAAC,OAAO,EAAE,YAAY,EAAE;QACvC,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,GAAG;QACH,GAAG,CAAC,IAAI,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -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;
|
|
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
|
-
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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) {
|