@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detailed.js","sourceRoot":"","sources":["../../../src/analyzers/quality/detailed.ts"],"names":[],"mappings":";;
|
|
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;
|
|
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"}
|
|
@@ -7,7 +7,8 @@ const actions_1 = require("./actions");
|
|
|
7
7
|
const scoring_1 = require("../../scoring");
|
|
8
8
|
const tools_unavailable_prose_1 = require("../tools/tools-unavailable-prose");
|
|
9
9
|
const finding_context_1 = require("../../explore/finding-context");
|
|
10
|
-
|
|
10
|
+
const attribute_1 = require("../../attribution/attribute");
|
|
11
|
+
function buildSecurityDetailed(report, graphContext, attribution) {
|
|
11
12
|
const input = (0, actions_1.countsFromReport)(report);
|
|
12
13
|
const scoreFromInput = (i) => (0, scoring_1.evaluateSpec)(scoring_1.SECURITY_SCORING_SPEC, i);
|
|
13
14
|
const actions = (0, remediation_1.rank)((0, actions_1.buildSecurityActions)(report), input, scoreFromInput);
|
|
@@ -19,6 +20,7 @@ function buildSecurityDetailed(report, graphContext) {
|
|
|
19
20
|
securityScore: scoreFromInput(input).score,
|
|
20
21
|
actions,
|
|
21
22
|
...(graphContext ? { graphContext } : {}),
|
|
23
|
+
...(attribution ? { attribution } : {}),
|
|
22
24
|
};
|
|
23
25
|
}
|
|
24
26
|
const SEV_ORDER = { critical: 0, high: 1, medium: 2, low: 3 };
|
|
@@ -105,22 +107,36 @@ function formatSecurityDetailedMarkdown(detailed, elapsed) {
|
|
|
105
107
|
if (sorted.length === 0) {
|
|
106
108
|
L.push('No code findings.');
|
|
107
109
|
}
|
|
108
|
-
else if (detailed.graphContext) {
|
|
109
|
-
const gc = detailed.graphContext;
|
|
110
|
-
L.push((0, finding_context_1.graphContextProvenanceLine)(gc));
|
|
111
|
-
L.push('');
|
|
112
|
-
L.push('| Severity | Rule | File:Line | Tool | CWE | Graph context |');
|
|
113
|
-
L.push('|----------|------|-----------|------|-----|----------------|');
|
|
114
|
-
for (const f of sorted) {
|
|
115
|
-
const ctx = gc.contexts[(0, finding_context_1.locationKey)(f.file, f.line)];
|
|
116
|
-
L.push(`| ${f.severity.toUpperCase()} | \`${f.rule}\` | \`${f.file}${f.line ? ':' + f.line : ''}\` | ${f.tool} | ${f.cwe || '—'} | ${(0, finding_context_1.formatGraphContextCell)(ctx)} |`);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
110
|
else {
|
|
120
|
-
|
|
121
|
-
|
|
111
|
+
const gc = detailed.graphContext;
|
|
112
|
+
const attr = detailed.attribution;
|
|
113
|
+
if (gc)
|
|
114
|
+
L.push((0, finding_context_1.graphContextProvenanceLine)(gc));
|
|
115
|
+
if (attr)
|
|
116
|
+
L.push((0, attribute_1.attributionProvenanceLine)());
|
|
117
|
+
if (gc || attr)
|
|
118
|
+
L.push('');
|
|
119
|
+
// Column-driven so graph context + attribution compose cleanly.
|
|
120
|
+
const headers = ['Severity', 'Rule', 'File:Line', 'Tool', 'CWE'];
|
|
121
|
+
if (gc)
|
|
122
|
+
headers.push('Graph context');
|
|
123
|
+
if (attr)
|
|
124
|
+
headers.push('Who to ask');
|
|
125
|
+
L.push(`| ${headers.join(' | ')} |`);
|
|
126
|
+
L.push(`|${headers.map(() => '---').join('|')}|`);
|
|
122
127
|
for (const f of sorted) {
|
|
123
|
-
|
|
128
|
+
const cells = [
|
|
129
|
+
f.severity.toUpperCase(),
|
|
130
|
+
`\`${f.rule}\``,
|
|
131
|
+
`\`${f.file}${f.line ? ':' + f.line : ''}\``,
|
|
132
|
+
f.tool,
|
|
133
|
+
f.cwe || '—',
|
|
134
|
+
];
|
|
135
|
+
if (gc)
|
|
136
|
+
cells.push((0, finding_context_1.formatGraphContextCell)(gc.contexts[(0, finding_context_1.locationKey)(f.file, f.line)]));
|
|
137
|
+
if (attr)
|
|
138
|
+
cells.push((0, attribute_1.formatAttributionCell)(attr.attributions[(0, finding_context_1.locationKey)(f.file, f.line)]));
|
|
139
|
+
L.push(`| ${cells.join(' | ')} |`);
|
|
124
140
|
}
|
|
125
141
|
}
|
|
126
142
|
L.push('');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detailed.js","sourceRoot":"","sources":["../../../src/analyzers/security/detailed.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"detailed.js","sourceRoot":"","sources":["../../../src/analyzers/security/detailed.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,23 @@
|
|
|
1
1
|
import { RemediationAction } from '../remediation';
|
|
2
|
-
import { TestGapsReport } from './types';
|
|
2
|
+
import { TestGapsReport, SourceFile } from './types';
|
|
3
3
|
import { TestGapsCounts } from './scoring';
|
|
4
|
+
import { type DetailedGraphContext } from '../../explore/finding-context';
|
|
5
|
+
/**
|
|
6
|
+
* Re-rank the test-gap worklist by code-graph blast radius so the
|
|
7
|
+
* most-depended-on untested files surface first WITHIN their risk tier.
|
|
8
|
+
* Pure function — it receives the pre-built graph context (CLAUDE.md
|
|
9
|
+
* Rule 12: analyzers never load the graph themselves) and never touches
|
|
10
|
+
* the Tests score (which comes from summary counts, not gap order).
|
|
11
|
+
*
|
|
12
|
+
* Blast radius is stamped only when the file is in the graph AND the
|
|
13
|
+
* language's call graph is reliable — an untrustworthy `0` from a
|
|
14
|
+
* language graphify can't resolve (e.g. C#) is treated as UNKNOWN, not
|
|
15
|
+
* a leaf. Within a tier: known higher-blast first, then by LOC. Files
|
|
16
|
+
* the graph couldn't resolve keep their LOC rank after the
|
|
17
|
+
* graph-confirmed high-impact ones — they're re-ordered, never dropped
|
|
18
|
+
* and never labelled "safe."
|
|
19
|
+
*/
|
|
20
|
+
export declare function weightGapsByBlastRadius(gaps: ReadonlyArray<SourceFile>, graphContext: DetailedGraphContext): SourceFile[];
|
|
4
21
|
export declare function countsFromReport(report: TestGapsReport): TestGapsCounts;
|
|
5
22
|
export declare function buildTestGapsActions(report: TestGapsReport): RemediationAction<TestGapsCounts>[];
|
|
6
23
|
//# sourceMappingURL=actions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../../src/analyzers/tests/actions.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../../src/analyzers/tests/actions.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,UAAU,EAAY,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAe,KAAK,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAIvF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,aAAa,CAAC,UAAU,CAAC,EAC/B,YAAY,EAAE,oBAAoB,GACjC,UAAU,EAAE,CAcd;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CAUvE;AAwCD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,iBAAiB,CAAC,cAAc,CAAC,EAAE,CAoChG"}
|
|
@@ -1,7 +1,43 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.weightGapsByBlastRadius = weightGapsByBlastRadius;
|
|
3
4
|
exports.countsFromReport = countsFromReport;
|
|
4
5
|
exports.buildTestGapsActions = buildTestGapsActions;
|
|
6
|
+
const finding_context_1 = require("../../explore/finding-context");
|
|
7
|
+
const TIER_RANK = { critical: 0, high: 1, medium: 2, low: 3 };
|
|
8
|
+
/**
|
|
9
|
+
* Re-rank the test-gap worklist by code-graph blast radius so the
|
|
10
|
+
* most-depended-on untested files surface first WITHIN their risk tier.
|
|
11
|
+
* Pure function — it receives the pre-built graph context (CLAUDE.md
|
|
12
|
+
* Rule 12: analyzers never load the graph themselves) and never touches
|
|
13
|
+
* the Tests score (which comes from summary counts, not gap order).
|
|
14
|
+
*
|
|
15
|
+
* Blast radius is stamped only when the file is in the graph AND the
|
|
16
|
+
* language's call graph is reliable — an untrustworthy `0` from a
|
|
17
|
+
* language graphify can't resolve (e.g. C#) is treated as UNKNOWN, not
|
|
18
|
+
* a leaf. Within a tier: known higher-blast first, then by LOC. Files
|
|
19
|
+
* the graph couldn't resolve keep their LOC rank after the
|
|
20
|
+
* graph-confirmed high-impact ones — they're re-ordered, never dropped
|
|
21
|
+
* and never labelled "safe."
|
|
22
|
+
*/
|
|
23
|
+
function weightGapsByBlastRadius(gaps, graphContext) {
|
|
24
|
+
const stamped = gaps.map((g) => {
|
|
25
|
+
const ctx = graphContext.contexts[(0, finding_context_1.locationKey)(g.path)];
|
|
26
|
+
const reliable = ctx?.found && ctx.callGraphReliability !== 'unreliable';
|
|
27
|
+
if (!reliable)
|
|
28
|
+
return { ...g };
|
|
29
|
+
return { ...g, blastRadius: ctx.blastRadius.callerFiles };
|
|
30
|
+
});
|
|
31
|
+
return stamped.sort((a, b) => {
|
|
32
|
+
if (TIER_RANK[a.risk] !== TIER_RANK[b.risk])
|
|
33
|
+
return TIER_RANK[a.risk] - TIER_RANK[b.risk];
|
|
34
|
+
const ba = a.blastRadius ?? -1;
|
|
35
|
+
const bb = b.blastRadius ?? -1;
|
|
36
|
+
if (ba !== bb)
|
|
37
|
+
return bb - ba;
|
|
38
|
+
return b.lines - a.lines;
|
|
39
|
+
});
|
|
40
|
+
}
|
|
5
41
|
function countsFromReport(report) {
|
|
6
42
|
const s = report.summary;
|
|
7
43
|
return {
|
|
@@ -36,7 +72,7 @@ function testTierAction(report, tier, topK) {
|
|
|
36
72
|
return {
|
|
37
73
|
id: `tests.add-${tier}-${tierFiles.length}`,
|
|
38
74
|
title: `Add tests for top ${tierFiles.length} ${tier.toUpperCase()}-risk untested file${tierFiles.length === 1 ? '' : 's'}`,
|
|
39
|
-
rationale: `These ${tier} files carry the largest untested risk. Start with the largest by LOC.`,
|
|
75
|
+
rationale: `These ${tier} files carry the largest untested risk. Start with the most-depended-on (highest blast radius), then the largest by LOC.`,
|
|
40
76
|
evidence: tierFiles.map(fileToEvidence),
|
|
41
77
|
patch: (c) => ({
|
|
42
78
|
...c,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../../src/analyzers/tests/actions.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../../src/analyzers/tests/actions.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ import { TestGapsReport } from './types';
|
|
|
5
5
|
import { RankedAction } from '../remediation';
|
|
6
6
|
import { TestGapsCounts } from './scoring';
|
|
7
7
|
import { type DetailedGraphContext } from '../../explore/finding-context';
|
|
8
|
+
import { type DetailedAttribution } from '../../attribution/attribute';
|
|
8
9
|
export interface TestGapsDetailedReport extends TestGapsReport {
|
|
9
10
|
schemaVersion: string;
|
|
10
11
|
coverageScore: number;
|
|
@@ -15,7 +16,10 @@ export interface TestGapsDetailedReport extends TestGapsReport {
|
|
|
15
16
|
* Present only when `--graph-context` ran AND a graph loaded.
|
|
16
17
|
*/
|
|
17
18
|
graphContext?: DetailedGraphContext;
|
|
19
|
+
/** Per-gap "who to ask" (file owner), keyed by file path. Present only
|
|
20
|
+
* when the run passed `--attribute`. */
|
|
21
|
+
attribution?: DetailedAttribution;
|
|
18
22
|
}
|
|
19
|
-
export declare function buildTestGapsDetailed(report: TestGapsReport, graphContext?: DetailedGraphContext): TestGapsDetailedReport;
|
|
23
|
+
export declare function buildTestGapsDetailed(report: TestGapsReport, graphContext?: DetailedGraphContext, attribution?: DetailedAttribution): TestGapsDetailedReport;
|
|
20
24
|
export declare function formatTestGapsDetailedMarkdown(detailed: TestGapsDetailedReport, elapsed: string): string;
|
|
21
25
|
//# sourceMappingURL=detailed.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detailed.d.ts","sourceRoot":"","sources":["../../../src/analyzers/tests/detailed.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,cAAc,EAAwB,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAQ,MAAM,gBAAgB,CAAC;AAEpD,OAAO,EAAE,cAAc,EAAuB,MAAM,WAAW,CAAC;AAEhE,OAAO,EAIL,KAAK,oBAAoB,EAC1B,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"detailed.d.ts","sourceRoot":"","sources":["../../../src/analyzers/tests/detailed.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,cAAc,EAAwB,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAQ,MAAM,gBAAgB,CAAC;AAEpD,OAAO,EAAE,cAAc,EAAuB,MAAM,WAAW,CAAC;AAEhE,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,cAAc,CAAC,CAAC,CAAC;IAC7C;;;;OAIG;IACH,YAAY,CAAC,EAAE,oBAAoB,CAAC;IACpC;6CACyC;IACzC,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,CAkBxB;AAID,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,sBAAsB,EAChC,OAAO,EAAE,MAAM,GACd,MAAM,CAiIR"}
|
|
@@ -7,15 +7,24 @@ const actions_1 = require("./actions");
|
|
|
7
7
|
const scoring_1 = require("./scoring");
|
|
8
8
|
const tools_unavailable_prose_1 = require("../tools/tools-unavailable-prose");
|
|
9
9
|
const finding_context_1 = require("../../explore/finding-context");
|
|
10
|
-
|
|
10
|
+
const attribute_1 = require("../../attribution/attribute");
|
|
11
|
+
function buildTestGapsDetailed(report, graphContext, attribution) {
|
|
11
12
|
const counts = (0, actions_1.countsFromReport)(report);
|
|
12
|
-
|
|
13
|
+
// When a graph is present, re-rank the gap worklist by blast radius so
|
|
14
|
+
// the most-depended-on untested files surface first (within tier). This
|
|
15
|
+
// re-orders only — `counts` (and therefore the score) come from the
|
|
16
|
+
// summary, untouched by gap order.
|
|
17
|
+
const weighted = graphContext
|
|
18
|
+
? { ...report, gaps: (0, actions_1.weightGapsByBlastRadius)(report.gaps, graphContext) }
|
|
19
|
+
: report;
|
|
20
|
+
const actions = (0, remediation_1.rank)((0, actions_1.buildTestGapsActions)(weighted), counts, scoring_1.scoreTestGapsCounts);
|
|
13
21
|
return {
|
|
14
|
-
...
|
|
22
|
+
...weighted,
|
|
15
23
|
schemaVersion: '11',
|
|
16
24
|
coverageScore: (0, scoring_1.scoreTestGapsCounts)(counts).score,
|
|
17
25
|
actions,
|
|
18
26
|
...(graphContext ? { graphContext } : {}),
|
|
27
|
+
...(attribution ? { attribution } : {}),
|
|
19
28
|
};
|
|
20
29
|
}
|
|
21
30
|
const TIER_ORDER = { critical: 0, high: 1, medium: 2, low: 3 };
|
|
@@ -87,11 +96,19 @@ function formatTestGapsDetailedMarkdown(detailed, elapsed) {
|
|
|
87
96
|
L.push('## All Gaps by Risk Tier');
|
|
88
97
|
L.push('');
|
|
89
98
|
const gc = detailed.graphContext;
|
|
90
|
-
|
|
99
|
+
const attr = detailed.attribution;
|
|
100
|
+
if (gc)
|
|
91
101
|
L.push((0, finding_context_1.graphContextProvenanceLine)(gc));
|
|
102
|
+
if (attr)
|
|
103
|
+
L.push((0, attribute_1.attributionProvenanceLine)());
|
|
104
|
+
if (gc || attr)
|
|
92
105
|
L.push('');
|
|
93
|
-
|
|
94
|
-
|
|
106
|
+
// Within a tier, prefer higher blast radius (most-depended-on first)
|
|
107
|
+
// when the graph stamped it, falling back to LOC. Mirrors the worklist
|
|
108
|
+
// ranking so the table and the actions agree on ordering.
|
|
109
|
+
const sorted = [...detailed.gaps].sort((a, b) => TIER_ORDER[a.risk] - TIER_ORDER[b.risk] ||
|
|
110
|
+
(b.blastRadius ?? -1) - (a.blastRadius ?? -1) ||
|
|
111
|
+
b.lines - a.lines);
|
|
95
112
|
const grouped = {
|
|
96
113
|
critical: [],
|
|
97
114
|
high: [],
|
|
@@ -106,24 +123,26 @@ function formatTestGapsDetailedMarkdown(detailed, elapsed) {
|
|
|
106
123
|
continue;
|
|
107
124
|
L.push(`### ${tier.toUpperCase()} (${items.length})`);
|
|
108
125
|
L.push('');
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
126
|
+
const headers = ['File', 'Type', 'Lines'];
|
|
127
|
+
if (gc)
|
|
128
|
+
headers.push('Graph context');
|
|
129
|
+
if (attr)
|
|
130
|
+
headers.push('Who to ask');
|
|
131
|
+
L.push(`| ${headers.join(' | ')} |`);
|
|
132
|
+
L.push(`|${headers.map((h) => (h === 'Lines' ? '-----:' : '---')).join('|')}|`);
|
|
133
|
+
for (const g of items.slice(0, 50)) {
|
|
134
|
+
const cells = [`\`${g.path}\``, g.type, String(g.lines)];
|
|
135
|
+
if (gc)
|
|
136
|
+
cells.push((0, finding_context_1.formatGraphContextCell)(gc.contexts[(0, finding_context_1.locationKey)(g.path)]));
|
|
137
|
+
if (attr)
|
|
138
|
+
cells.push((0, attribute_1.formatAttributionCell)(attr.attributions[(0, finding_context_1.locationKey)(g.path)]));
|
|
139
|
+
L.push(`| ${cells.join(' | ')} |`);
|
|
118
140
|
}
|
|
119
|
-
|
|
120
|
-
L.push(
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
}
|
|
125
|
-
if (items.length > 50)
|
|
126
|
-
L.push(`| … and ${items.length - 50} more | | |`);
|
|
141
|
+
if (items.length > 50) {
|
|
142
|
+
L.push(`| … and ${items.length - 50} more |${headers
|
|
143
|
+
.slice(1)
|
|
144
|
+
.map(() => ' |')
|
|
145
|
+
.join('')}`);
|
|
127
146
|
}
|
|
128
147
|
L.push('');
|
|
129
148
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detailed.js","sourceRoot":"","sources":["../../../src/analyzers/tests/detailed.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"detailed.js","sourceRoot":"","sources":["../../../src/analyzers/tests/detailed.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,6 +24,16 @@ export interface SourceFile {
|
|
|
24
24
|
type: string;
|
|
25
25
|
risk: RiskTier;
|
|
26
26
|
hasMatchingTest: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Caller-file count from the code graph — how many files depend on
|
|
29
|
+
* this one (its blast radius). Stamped only when a graph is present
|
|
30
|
+
* AND the language's call graph is reliable (so an untrustworthy `0`
|
|
31
|
+
* from a language graphify can't resolve, e.g. C#, never masquerades
|
|
32
|
+
* as a leaf). Absent ⇒ unknown, NOT zero. Used to weight the test-gap
|
|
33
|
+
* worklist so the most-depended-on untested files surface first;
|
|
34
|
+
* never affects the Tests score (that comes from summary counts).
|
|
35
|
+
*/
|
|
36
|
+
blastRadius?: number;
|
|
27
37
|
}
|
|
28
38
|
/**
|
|
29
39
|
* Where the `effectiveCoverage` number came from.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/analyzers/tests/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAE9D,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,GAAG,eAAe,GAAG,OAAO,GAAG,aAAa,CAAC;IAC7D,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd;;;;;;;;;;OAUG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,CAAC;IACf,eAAe,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/analyzers/tests/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAE9D,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,GAAG,eAAe,GAAG,OAAO,GAAG,aAAa,CAAC;IAC7D,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd;;;;;;;;;;OAUG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,CAAC;IACf,eAAe,EAAE,OAAO,CAAC;IACzB;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,cAAc,IAAI,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAElF,MAAM,MAAM,cAAc,GACtB,sBAAsB,GACtB,gBAAgB,GAChB,cAAc,CAAC;AAEnB;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,MAAM,gBAAgB,GAAG,eAAe,GAAG,cAAc,GAAG,gBAAgB,CAAC;AAEnF,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE;QACP,SAAS,EAAE,MAAM,CAAC;QAClB,eAAe,EAAE,MAAM,CAAC;QACxB,iBAAiB,EAAE,MAAM,CAAC;QAC1B;;;;WAIG;QACH,iBAAiB,EAAE,MAAM,CAAC;QAC1B,iDAAiD;QACjD,cAAc,EAAE,cAAc,CAAC;QAC/B;;;;WAIG;QACH,gBAAgB,EAAE,gBAAgB,CAAC;QACnC,gEAAgE;QAChE,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,EAAE,MAAM,CAAC;QACzB,YAAY,EAAE,MAAM,CAAC;QACrB,cAAc,EAAE,MAAM,CAAC;QACvB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/** Attribution for one finding location. */
|
|
2
|
+
export interface FindingAttribution {
|
|
3
|
+
/** Display name — the author who last touched the line (line-level
|
|
4
|
+
* findings) or the file's current owner (file-level findings). */
|
|
5
|
+
readonly author: string;
|
|
6
|
+
/** GitHub @handle when resolvable offline. */
|
|
7
|
+
readonly handle?: string;
|
|
8
|
+
/** Short commit sha that last touched the line. Absent for file-level
|
|
9
|
+
* (owner-based) attribution, which has no single introducing commit. */
|
|
10
|
+
readonly commit?: string;
|
|
11
|
+
/** Whether that person is still active repo-wide. */
|
|
12
|
+
readonly active: boolean;
|
|
13
|
+
/** Line-level: when the blamed author is inactive, the current active
|
|
14
|
+
* owner of the file to ask instead. Absent for file-level attribution
|
|
15
|
+
* (the author IS the current owner). */
|
|
16
|
+
readonly currentOwner?: {
|
|
17
|
+
name: string;
|
|
18
|
+
handle?: string;
|
|
19
|
+
};
|
|
20
|
+
/** True when this is file-level (owner-based) rather than blame-based. */
|
|
21
|
+
readonly fileLevel?: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface DetailedAttribution {
|
|
24
|
+
/** Keyed by `locationKey(file, line)`; only resolved locations present. */
|
|
25
|
+
readonly attributions: Record<string, FindingAttribution>;
|
|
26
|
+
}
|
|
27
|
+
export interface BuildAttributionOptions {
|
|
28
|
+
/** Budget cap on unique locations blamed (each is a git call). */
|
|
29
|
+
readonly maxFindings?: number;
|
|
30
|
+
/** Active-window for "still around to ask." Default 6 months. */
|
|
31
|
+
readonly activeSince?: string;
|
|
32
|
+
readonly now?: Date;
|
|
33
|
+
}
|
|
34
|
+
interface BlameLine {
|
|
35
|
+
readonly author: string;
|
|
36
|
+
readonly email: string;
|
|
37
|
+
readonly commit: string;
|
|
38
|
+
}
|
|
39
|
+
/** Parse `git blame --porcelain -L n,n` output for the author + commit of a
|
|
40
|
+
* single line. Pure — exported for tests. Returns `null` when the porcelain
|
|
41
|
+
* has no author (empty / error). */
|
|
42
|
+
export declare function parseBlamePorcelain(out: string): BlameLine | null;
|
|
43
|
+
/**
|
|
44
|
+
* Build per-finding attribution for a list of locations. Fail-open: returns
|
|
45
|
+
* `undefined` when git produces nothing usable. Only locations with a `line`
|
|
46
|
+
* are blamed (a file-level finding has no single line to attribute).
|
|
47
|
+
*/
|
|
48
|
+
export declare function buildAttributionMap(cwd: string, locations: ReadonlyArray<{
|
|
49
|
+
file: string;
|
|
50
|
+
line?: number;
|
|
51
|
+
}>, opts?: BuildAttributionOptions): DetailedAttribution | undefined;
|
|
52
|
+
/** Compact cell rendering — name/@handle, never email. `—` when unresolved. */
|
|
53
|
+
export declare function formatAttributionCell(attr: FindingAttribution | undefined): string;
|
|
54
|
+
/** Provenance + honesty line printed above an attributed section. */
|
|
55
|
+
export declare function attributionProvenanceLine(): string;
|
|
56
|
+
export {};
|
|
57
|
+
//# sourceMappingURL=attribute.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attribute.d.ts","sourceRoot":"","sources":["../../src/attribution/attribute.ts"],"names":[],"mappings":"AA6BA,4CAA4C;AAC5C,MAAM,WAAW,kBAAkB;IACjC;uEACmE;IACnE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,8CAA8C;IAC9C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB;6EACyE;IACzE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,qDAAqD;IACrD,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB;;6CAEyC;IACzC,QAAQ,CAAC,YAAY,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1D,0EAA0E;IAC1E,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,mBAAmB;IAClC,2EAA2E;IAC3E,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;CAC3D;AAED,MAAM,WAAW,uBAAuB;IACtC,kEAAkE;IAClE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,iEAAiE;IACjE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC;CACrB;AAED,UAAU,SAAS;IACjB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;qCAEqC;AACrC,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAYjE;AAcD;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,aAAa,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EACzD,IAAI,GAAE,uBAA4B,GACjC,mBAAmB,GAAG,SAAS,CA0DjC;AAaD,+EAA+E;AAC/E,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,kBAAkB,GAAG,SAAS,GAAG,MAAM,CAYlF;AAED,qEAAqE;AACrE,wBAAgB,yBAAyB,IAAI,MAAM,CAOlD"}
|