projscan 2.1.0 → 2.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +57 -26
- package/dist/analyzers/supplyChainCheck.d.ts +2 -0
- package/dist/analyzers/supplyChainCheck.js +400 -0
- package/dist/analyzers/supplyChainCheck.js.map +1 -0
- package/dist/cli/commands/agentBrief.d.ts +1 -0
- package/dist/cli/commands/agentBrief.js +68 -0
- package/dist/cli/commands/agentBrief.js.map +1 -0
- package/dist/cli/commands/bugHunt.d.ts +1 -0
- package/dist/cli/commands/bugHunt.js +59 -0
- package/dist/cli/commands/bugHunt.js.map +1 -0
- package/dist/cli/commands/evidencePack.d.ts +1 -0
- package/dist/cli/commands/evidencePack.js +70 -0
- package/dist/cli/commands/evidencePack.js.map +1 -0
- package/dist/cli/commands/qualityScorecard.d.ts +1 -0
- package/dist/cli/commands/qualityScorecard.js +61 -0
- package/dist/cli/commands/qualityScorecard.js.map +1 -0
- package/dist/cli/commands/regressionPlan.d.ts +1 -0
- package/dist/cli/commands/regressionPlan.js +77 -0
- package/dist/cli/commands/regressionPlan.js.map +1 -0
- package/dist/cli/commands/releaseTrain.d.ts +1 -0
- package/dist/cli/commands/releaseTrain.js +58 -0
- package/dist/cli/commands/releaseTrain.js.map +1 -0
- package/dist/cli/commands/workplan.d.ts +1 -0
- package/dist/cli/commands/workplan.js +136 -0
- package/dist/cli/commands/workplan.js.map +1 -0
- package/dist/cli/index.js +14 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/agentBrief.d.ts +6 -0
- package/dist/core/agentBrief.js +192 -0
- package/dist/core/agentBrief.js.map +1 -0
- package/dist/core/bugHunt.d.ts +6 -0
- package/dist/core/bugHunt.js +278 -0
- package/dist/core/bugHunt.js.map +1 -0
- package/dist/core/issueEngine.js +2 -0
- package/dist/core/issueEngine.js.map +1 -1
- package/dist/core/preflight.js +38 -4
- package/dist/core/preflight.js.map +1 -1
- package/dist/core/qualityScorecard.d.ts +6 -0
- package/dist/core/qualityScorecard.js +220 -0
- package/dist/core/qualityScorecard.js.map +1 -0
- package/dist/core/regressionPlan.d.ts +7 -0
- package/dist/core/regressionPlan.js +226 -0
- package/dist/core/regressionPlan.js.map +1 -0
- package/dist/core/releaseEvidence.d.ts +7 -0
- package/dist/core/releaseEvidence.js +174 -0
- package/dist/core/releaseEvidence.js.map +1 -0
- package/dist/core/releaseTrain.d.ts +5 -0
- package/dist/core/releaseTrain.js +348 -0
- package/dist/core/releaseTrain.js.map +1 -0
- package/dist/core/review.js +31 -2
- package/dist/core/review.js.map +1 -1
- package/dist/core/workplan.d.ts +12 -0
- package/dist/core/workplan.js +440 -0
- package/dist/core/workplan.js.map +1 -0
- package/dist/index.d.ts +8 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/tools/agentBrief.d.ts +2 -0
- package/dist/mcp/tools/agentBrief.js +39 -0
- package/dist/mcp/tools/agentBrief.js.map +1 -0
- package/dist/mcp/tools/bugHunt.d.ts +2 -0
- package/dist/mcp/tools/bugHunt.js +31 -0
- package/dist/mcp/tools/bugHunt.js.map +1 -0
- package/dist/mcp/tools/evidencePack.d.ts +2 -0
- package/dist/mcp/tools/evidencePack.js +39 -0
- package/dist/mcp/tools/evidencePack.js.map +1 -0
- package/dist/mcp/tools/qualityScorecard.d.ts +2 -0
- package/dist/mcp/tools/qualityScorecard.js +26 -0
- package/dist/mcp/tools/qualityScorecard.js.map +1 -0
- package/dist/mcp/tools/regressionPlan.d.ts +2 -0
- package/dist/mcp/tools/regressionPlan.js +47 -0
- package/dist/mcp/tools/regressionPlan.js.map +1 -0
- package/dist/mcp/tools/releaseTrain.d.ts +2 -0
- package/dist/mcp/tools/releaseTrain.js +27 -0
- package/dist/mcp/tools/releaseTrain.js.map +1 -0
- package/dist/mcp/tools/workplan.d.ts +2 -0
- package/dist/mcp/tools/workplan.js +70 -0
- package/dist/mcp/tools/workplan.js.map +1 -0
- package/dist/mcp/tools.js +14 -0
- package/dist/mcp/tools.js.map +1 -1
- package/dist/projscan-sbom.cdx.json +4589 -0
- package/dist/tool-manifest.json +196 -3
- package/dist/types.d.ts +245 -1
- package/dist/utils/formatSupport.d.ts +8 -0
- package/dist/utils/formatSupport.js +8 -0
- package/dist/utils/formatSupport.js.map +1 -1
- package/package.json +9 -6
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { analyzeHotspots } from './hotspotAnalyzer.js';
|
|
2
|
+
import { collectIssues } from './issueEngine.js';
|
|
3
|
+
import { scanRepository } from './repositoryScanner.js';
|
|
4
|
+
import { buildRiskNow } from './sessionResources.js';
|
|
5
|
+
import { applyConfigToIssues, loadConfig } from '../utils/config.js';
|
|
6
|
+
import { calculateScore } from '../utils/scoreCalculator.js';
|
|
7
|
+
const DEFAULT_MAX_RISKS = 8;
|
|
8
|
+
export async function computeQualityScorecard(rootPath, options = {}) {
|
|
9
|
+
const maxRisks = normalizeMax(options.maxRisks);
|
|
10
|
+
const configResult = await loadConfig(rootPath).catch(() => ({ config: { ignore: [] } }));
|
|
11
|
+
const scan = await scanRepository(rootPath, { ignore: configResult.config.ignore });
|
|
12
|
+
const issues = applyConfigToIssues(await collectIssues(rootPath, scan.files), configResult.config);
|
|
13
|
+
const health = calculateScore(issues);
|
|
14
|
+
const [riskNow, hotspots] = await Promise.all([
|
|
15
|
+
safeRiskNow(rootPath),
|
|
16
|
+
safeHotspots(rootPath, scan.files, issues, maxRisks),
|
|
17
|
+
]);
|
|
18
|
+
const dimensions = buildDimensions(issues, health, hotspots.hotspots, riskNow.conflicts);
|
|
19
|
+
const allRisks = rankRisks([
|
|
20
|
+
...issues.map(issueToRisk),
|
|
21
|
+
...(hotspots.available ? hotspots.hotspots.map(hotspotToRisk) : []),
|
|
22
|
+
...riskNow.conflicts.map(conflictToRisk),
|
|
23
|
+
]);
|
|
24
|
+
const topRisks = allRisks.slice(0, maxRisks);
|
|
25
|
+
const verdict = deriveQualityScorecardVerdict(dimensions, health.score);
|
|
26
|
+
return {
|
|
27
|
+
schemaVersion: 1,
|
|
28
|
+
verdict,
|
|
29
|
+
summary: summarize(verdict, dimensions, health.score),
|
|
30
|
+
health,
|
|
31
|
+
dimensions,
|
|
32
|
+
topRisks: topRisks.length > 0 ? topRisks : [baselineRisk()],
|
|
33
|
+
commands: buildCommands(verdict),
|
|
34
|
+
suggestedNextActions: suggestedActions(topRisks),
|
|
35
|
+
...(allRisks.length > topRisks.length ? { truncated: true } : {}),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
async function safeRiskNow(rootPath) {
|
|
39
|
+
try {
|
|
40
|
+
return await buildRiskNow(rootPath);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return { touchedFiles: [], conflicts: [] };
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
async function safeHotspots(rootPath, files, issues, limit) {
|
|
47
|
+
try {
|
|
48
|
+
const report = await analyzeHotspots(rootPath, files, issues, { limit });
|
|
49
|
+
return { available: report.available, hotspots: report.hotspots };
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return { available: false, hotspots: [] };
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function buildDimensions(issues, health, hotspots, conflicts) {
|
|
56
|
+
const securityIssues = issues.filter((issue) => issue.category === 'security' || issue.category === 'supply-chain');
|
|
57
|
+
const testIssues = issues.filter((issue) => issue.id.includes('test') || issue.category === 'testing');
|
|
58
|
+
const maintainabilityIssues = issues.filter((issue) => !securityIssues.includes(issue) && !testIssues.includes(issue));
|
|
59
|
+
return [
|
|
60
|
+
{
|
|
61
|
+
id: 'health',
|
|
62
|
+
label: 'Project health',
|
|
63
|
+
status: health.errors > 0 ? 'fail' : health.warnings > 0 ? 'watch' : 'pass',
|
|
64
|
+
score: health.score,
|
|
65
|
+
summary: `${health.grade} (${health.score}) with ${health.errors} error(s), ${health.warnings} warning(s), ${health.infos} info item(s)`,
|
|
66
|
+
evidence: [`${issues.length} issue(s)`],
|
|
67
|
+
commands: ['projscan doctor --format json'],
|
|
68
|
+
},
|
|
69
|
+
issueDimension('security', 'Security posture', securityIssues, ['projscan doctor --format json', 'projscan preflight --mode before_edit --format json']),
|
|
70
|
+
issueDimension('tests', 'Test readiness', testIssues, ['projscan doctor --format json', 'npm test']),
|
|
71
|
+
{
|
|
72
|
+
id: 'maintainability',
|
|
73
|
+
label: 'Maintainability',
|
|
74
|
+
status: maintainabilityIssues.some((issue) => issue.severity === 'error') ? 'fail' : hotspots.length > 0 || maintainabilityIssues.length > 0 ? 'watch' : 'pass',
|
|
75
|
+
score: clampScore(100 - maintainabilityIssues.length * 10 - hotspots.filter((hotspot) => hotspot.riskScore >= 70).length * 12),
|
|
76
|
+
summary: `${maintainabilityIssues.length} maintainability issue(s), ${hotspots.length} hotspot(s)`,
|
|
77
|
+
evidence: [
|
|
78
|
+
...maintainabilityIssues.slice(0, 3).map((issue) => issue.title),
|
|
79
|
+
...hotspots.slice(0, 3).map((hotspot) => `${hotspot.relativePath}: risk ${Math.round(hotspot.riskScore)}`),
|
|
80
|
+
],
|
|
81
|
+
commands: ['projscan hotspots --format json', 'projscan quality-scorecard --format json'],
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
id: 'coordination',
|
|
85
|
+
label: 'Coordination',
|
|
86
|
+
status: conflicts.some((conflict) => conflict.severity === 'error') ? 'fail' : conflicts.length > 0 ? 'watch' : 'pass',
|
|
87
|
+
score: clampScore(100 - conflicts.filter((conflict) => conflict.severity === 'error').length * 25 - conflicts.filter((conflict) => conflict.severity === 'warning').length * 10),
|
|
88
|
+
summary: `${conflicts.length} coordination signal(s)`,
|
|
89
|
+
evidence: conflicts.slice(0, 4).map((conflict) => conflict.message),
|
|
90
|
+
commands: ['projscan session touched --format json', 'projscan agent-brief --format json'],
|
|
91
|
+
},
|
|
92
|
+
];
|
|
93
|
+
}
|
|
94
|
+
function issueDimension(id, label, issues, commands) {
|
|
95
|
+
return {
|
|
96
|
+
id,
|
|
97
|
+
label,
|
|
98
|
+
status: issues.some((issue) => issue.severity === 'error') ? 'fail' : issues.length > 0 ? 'watch' : 'pass',
|
|
99
|
+
score: clampScore(100 - issues.filter((issue) => issue.severity === 'error').length * 25 - issues.filter((issue) => issue.severity === 'warning').length * 12 - issues.filter((issue) => issue.severity === 'info').length * 4),
|
|
100
|
+
summary: issues.length === 0 ? 'No open signals' : `${issues.length} signal(s)`,
|
|
101
|
+
evidence: issues.slice(0, 4).map((issue) => issue.title),
|
|
102
|
+
commands,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
function issueToRisk(issue) {
|
|
106
|
+
return {
|
|
107
|
+
id: `qs-issue-${issue.id}`,
|
|
108
|
+
priority: severityPriority(issue.severity),
|
|
109
|
+
title: issue.title,
|
|
110
|
+
files: issueFiles(issue),
|
|
111
|
+
source: 'issue',
|
|
112
|
+
command: 'projscan doctor --format json',
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
function hotspotToRisk(hotspot) {
|
|
116
|
+
return {
|
|
117
|
+
id: `qs-hotspot-${slug(hotspot.relativePath)}`,
|
|
118
|
+
priority: hotspot.riskScore >= 70 ? 'p0' : hotspot.riskScore >= 30 ? 'p1' : 'p2',
|
|
119
|
+
title: `Hotspot ${hotspot.relativePath}`,
|
|
120
|
+
files: [hotspot.relativePath],
|
|
121
|
+
source: 'hotspot',
|
|
122
|
+
command: `projscan file ${hotspot.relativePath} --format json`,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
function conflictToRisk(conflict, index) {
|
|
126
|
+
return {
|
|
127
|
+
id: `qs-conflict-${index + 1}`,
|
|
128
|
+
priority: conflict.severity === 'error' ? 'p0' : 'p1',
|
|
129
|
+
title: conflict.message,
|
|
130
|
+
files: conflict.files,
|
|
131
|
+
source: 'coordination',
|
|
132
|
+
command: 'projscan session touched --format json',
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
function baselineRisk() {
|
|
136
|
+
return {
|
|
137
|
+
id: 'qs-baseline',
|
|
138
|
+
priority: 'p2',
|
|
139
|
+
title: 'Preserve the clean quality baseline',
|
|
140
|
+
files: [],
|
|
141
|
+
source: 'issue',
|
|
142
|
+
command: 'projscan quality-scorecard --format json',
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
function rankRisks(risks) {
|
|
146
|
+
const seen = new Set();
|
|
147
|
+
return risks
|
|
148
|
+
.filter((risk) => {
|
|
149
|
+
if (seen.has(risk.id))
|
|
150
|
+
return false;
|
|
151
|
+
seen.add(risk.id);
|
|
152
|
+
return true;
|
|
153
|
+
})
|
|
154
|
+
.sort((a, b) => priorityRank(a.priority) - priorityRank(b.priority) || sourceRank(a.source) - sourceRank(b.source) || a.id.localeCompare(b.id));
|
|
155
|
+
}
|
|
156
|
+
export function deriveQualityScorecardVerdict(dimensions, healthScore) {
|
|
157
|
+
if (dimensions.some((dimension) => dimension.status === 'fail'))
|
|
158
|
+
return 'blocked';
|
|
159
|
+
if (dimensions.some((dimension) => dimension.status === 'watch' && dimension.score < 70))
|
|
160
|
+
return 'needs_attention';
|
|
161
|
+
if (healthScore >= 95 && dimensions.every((dimension) => dimension.status === 'pass'))
|
|
162
|
+
return 'excellent';
|
|
163
|
+
if (healthScore >= 80)
|
|
164
|
+
return 'healthy';
|
|
165
|
+
return 'needs_attention';
|
|
166
|
+
}
|
|
167
|
+
function buildCommands(verdict) {
|
|
168
|
+
const commands = ['projscan quality-scorecard --format json', 'projscan doctor --format json'];
|
|
169
|
+
if (verdict === 'blocked' || verdict === 'needs_attention')
|
|
170
|
+
commands.push('projscan agent-brief --intent bug_hunt --format json');
|
|
171
|
+
commands.push('npm test');
|
|
172
|
+
return [...new Set(commands)];
|
|
173
|
+
}
|
|
174
|
+
function suggestedActions(risks) {
|
|
175
|
+
return risks.slice(0, 8).map((risk) => ({
|
|
176
|
+
label: risk.title,
|
|
177
|
+
command: risk.command,
|
|
178
|
+
}));
|
|
179
|
+
}
|
|
180
|
+
function summarize(verdict, dimensions, score) {
|
|
181
|
+
const failing = dimensions.filter((dimension) => dimension.status === 'fail').length;
|
|
182
|
+
const watching = dimensions.filter((dimension) => dimension.status === 'watch').length;
|
|
183
|
+
return `${verdict}: quality scorecard ${score}/100 with ${failing} failing and ${watching} watch dimension(s)`;
|
|
184
|
+
}
|
|
185
|
+
function issueFiles(issue) {
|
|
186
|
+
return [...new Set((issue.locations ?? []).map((location) => location.file).filter(Boolean))];
|
|
187
|
+
}
|
|
188
|
+
function severityPriority(severity) {
|
|
189
|
+
if (severity === 'error')
|
|
190
|
+
return 'p0';
|
|
191
|
+
if (severity === 'warning')
|
|
192
|
+
return 'p1';
|
|
193
|
+
return 'p2';
|
|
194
|
+
}
|
|
195
|
+
function priorityRank(priority) {
|
|
196
|
+
if (priority === 'p0')
|
|
197
|
+
return 0;
|
|
198
|
+
if (priority === 'p1')
|
|
199
|
+
return 1;
|
|
200
|
+
return 2;
|
|
201
|
+
}
|
|
202
|
+
function sourceRank(source) {
|
|
203
|
+
if (source === 'issue')
|
|
204
|
+
return 0;
|
|
205
|
+
if (source === 'hotspot')
|
|
206
|
+
return 1;
|
|
207
|
+
return 2;
|
|
208
|
+
}
|
|
209
|
+
function clampScore(score) {
|
|
210
|
+
return Math.max(0, Math.min(100, Math.round(score)));
|
|
211
|
+
}
|
|
212
|
+
function normalizeMax(value) {
|
|
213
|
+
if (typeof value !== 'number' || !Number.isFinite(value))
|
|
214
|
+
return DEFAULT_MAX_RISKS;
|
|
215
|
+
return Math.max(1, Math.min(25, Math.floor(value)));
|
|
216
|
+
}
|
|
217
|
+
function slug(value) {
|
|
218
|
+
return value.replace(/[^a-zA-Z0-9]+/g, '-').replace(/^-+|-+$/g, '').toLowerCase() || 'root';
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=qualityScorecard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qualityScorecard.js","sourceRoot":"","sources":["../../src/core/qualityScorecard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { RegressionPlanLevel, RegressionPlanReport } from '../types.js';
|
|
2
|
+
export interface ComputeRegressionPlanOptions {
|
|
3
|
+
level?: RegressionPlanLevel;
|
|
4
|
+
lines?: string[];
|
|
5
|
+
maxTargets?: number;
|
|
6
|
+
}
|
|
7
|
+
export declare function computeRegressionPlan(rootPath: string, options?: ComputeRegressionPlanOptions): Promise<RegressionPlanReport>;
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { computeBugHunt } from './bugHunt.js';
|
|
2
|
+
import { computePreflight } from './preflight.js';
|
|
3
|
+
import { computeReleaseTrain } from './releaseTrain.js';
|
|
4
|
+
const DEFAULT_MAX_TARGETS = 8;
|
|
5
|
+
export async function computeRegressionPlan(rootPath, options = {}) {
|
|
6
|
+
const level = normalizeLevel(options.level);
|
|
7
|
+
const maxTargets = normalizeMaxTargets(options.maxTargets);
|
|
8
|
+
const [bugHunt, train, preflight] = await Promise.all([
|
|
9
|
+
computeBugHunt(rootPath, { maxFindings: maxTargets }),
|
|
10
|
+
computeReleaseTrain(rootPath, { lines: options.lines }),
|
|
11
|
+
computePreflight(rootPath, { mode: 'before_commit' }),
|
|
12
|
+
]);
|
|
13
|
+
const allTargets = rankTargets([
|
|
14
|
+
...baselineTargets(level),
|
|
15
|
+
...bugHuntTargets(bugHunt),
|
|
16
|
+
...preflightTargets(preflight),
|
|
17
|
+
...releaseLineTargets(train),
|
|
18
|
+
]);
|
|
19
|
+
const targets = allTargets.slice(0, maxTargets);
|
|
20
|
+
const verdict = regressionVerdict(preflight, bugHunt, targets);
|
|
21
|
+
const commands = commandsForLevel(level, targets);
|
|
22
|
+
return {
|
|
23
|
+
schemaVersion: 1,
|
|
24
|
+
level,
|
|
25
|
+
verdict,
|
|
26
|
+
summary: summarize(verdict, level, targets.length),
|
|
27
|
+
releaseLines: train.plan.lines,
|
|
28
|
+
evidence: {
|
|
29
|
+
healthScore: bugHunt.health.score,
|
|
30
|
+
bugHuntVerdict: bugHunt.verdict,
|
|
31
|
+
preflightVerdict: preflight.verdict,
|
|
32
|
+
changedFiles: preflight.evidence.changedFiles?.count ?? 0,
|
|
33
|
+
touchedFiles: preflight.evidence.session?.totalTouchedFiles ?? preflight.evidence.session?.touchedFiles.length ?? 0,
|
|
34
|
+
},
|
|
35
|
+
targets,
|
|
36
|
+
commands,
|
|
37
|
+
suggestedNextActions: suggestedActions(targets),
|
|
38
|
+
...(allTargets.length > targets.length ? { truncated: true } : {}),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function baselineTargets(level) {
|
|
42
|
+
return [
|
|
43
|
+
{
|
|
44
|
+
id: 'rp-baseline-health',
|
|
45
|
+
priority: 'p0',
|
|
46
|
+
source: 'baseline',
|
|
47
|
+
title: 'Verify the health and safety baseline',
|
|
48
|
+
why: 'Every product line needs a repeatable health gate before deeper regression work starts.',
|
|
49
|
+
files: [],
|
|
50
|
+
verification: {
|
|
51
|
+
commands: ['projscan doctor --format json', 'projscan preflight --mode before_commit --format json'],
|
|
52
|
+
expected: 'Doctor has no unresolved error-level issues and preflight does not block the handoff.',
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
...(level === 'full'
|
|
56
|
+
? [{
|
|
57
|
+
id: 'rp-baseline-release',
|
|
58
|
+
priority: 'p1',
|
|
59
|
+
source: 'baseline',
|
|
60
|
+
title: 'Run full package and stability gates',
|
|
61
|
+
why: 'The larger product update should prove build output, stable public surfaces, and readiness checks in one pass.',
|
|
62
|
+
files: ['package.json', 'docs/STABILITY.md', 'scripts/check-stability.mjs'],
|
|
63
|
+
verification: {
|
|
64
|
+
commands: ['npm run build', 'npm run lint', 'npm run check:stability', 'npm run release:check'],
|
|
65
|
+
expected: 'Build, lint, stability guard, and release check all pass from the committed tree.',
|
|
66
|
+
},
|
|
67
|
+
}]
|
|
68
|
+
: []),
|
|
69
|
+
];
|
|
70
|
+
}
|
|
71
|
+
function bugHuntTargets(bugHunt) {
|
|
72
|
+
const first = bugHunt.fixQueue.find((finding) => finding.id !== 'bh-verify-clean');
|
|
73
|
+
if (!first)
|
|
74
|
+
return [];
|
|
75
|
+
return [
|
|
76
|
+
{
|
|
77
|
+
id: 'rp-bug-hunt-top',
|
|
78
|
+
priority: first.priority,
|
|
79
|
+
source: 'bug-hunt',
|
|
80
|
+
title: `Regression-cover bug-hunt target: ${first.title}`,
|
|
81
|
+
why: first.why,
|
|
82
|
+
files: first.files,
|
|
83
|
+
verification: {
|
|
84
|
+
commands: ['projscan bug-hunt --format json', ...first.verification.commands],
|
|
85
|
+
expected: first.verification.expected,
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
];
|
|
89
|
+
}
|
|
90
|
+
function preflightTargets(preflight) {
|
|
91
|
+
return preflight.reasons.slice(0, 3).map((reason, index) => ({
|
|
92
|
+
id: `rp-preflight-${index + 1}`,
|
|
93
|
+
priority: severityPriority(reason.severity),
|
|
94
|
+
source: 'preflight',
|
|
95
|
+
title: `Exercise preflight signal: ${reason.source}`,
|
|
96
|
+
why: reason.message,
|
|
97
|
+
files: reason.file ? [reason.file] : [],
|
|
98
|
+
verification: {
|
|
99
|
+
commands: ['projscan preflight --mode before_commit --format json', commandForTool(reason.tool)],
|
|
100
|
+
expected: 'The preflight signal is either gone or documented as accepted risk.',
|
|
101
|
+
},
|
|
102
|
+
}));
|
|
103
|
+
}
|
|
104
|
+
function releaseLineTargets(train) {
|
|
105
|
+
return train.tasks
|
|
106
|
+
.filter((task) => task.track !== 'plan')
|
|
107
|
+
.slice(0, 4)
|
|
108
|
+
.map((task) => ({
|
|
109
|
+
id: `rp-${task.id}`,
|
|
110
|
+
priority: task.priority,
|
|
111
|
+
source: 'product-line',
|
|
112
|
+
title: `Verify ${task.track}: ${task.title}`,
|
|
113
|
+
why: task.why,
|
|
114
|
+
files: task.files,
|
|
115
|
+
verification: task.verification,
|
|
116
|
+
}));
|
|
117
|
+
}
|
|
118
|
+
function commandsForLevel(level, targets) {
|
|
119
|
+
const smoke = ['projscan doctor --format json', 'projscan preflight --mode before_commit --format json'];
|
|
120
|
+
if (level === 'smoke')
|
|
121
|
+
return dedupeStrings(smoke);
|
|
122
|
+
const focused = [
|
|
123
|
+
...smoke,
|
|
124
|
+
'projscan bug-hunt --format json',
|
|
125
|
+
...targets.flatMap((target) => target.verification.commands),
|
|
126
|
+
'npm test',
|
|
127
|
+
];
|
|
128
|
+
if (level === 'focused')
|
|
129
|
+
return dedupeStrings(focused);
|
|
130
|
+
return dedupeStrings([
|
|
131
|
+
...focused,
|
|
132
|
+
'npm run build',
|
|
133
|
+
'npm run lint',
|
|
134
|
+
'npm run check:stability',
|
|
135
|
+
'npm run release:check',
|
|
136
|
+
]);
|
|
137
|
+
}
|
|
138
|
+
function regressionVerdict(preflight, bugHunt, targets) {
|
|
139
|
+
if (preflight.verdict === 'block' || bugHunt.verdict === 'block')
|
|
140
|
+
return 'blocked';
|
|
141
|
+
if (preflight.verdict === 'caution' || bugHunt.verdict === 'fix' || targets.length > 1)
|
|
142
|
+
return 'needs_tests';
|
|
143
|
+
return 'ready';
|
|
144
|
+
}
|
|
145
|
+
function suggestedActions(targets) {
|
|
146
|
+
return targets.slice(0, 8).map((target) => ({
|
|
147
|
+
label: target.title,
|
|
148
|
+
command: target.verification.commands[0],
|
|
149
|
+
}));
|
|
150
|
+
}
|
|
151
|
+
function rankTargets(targets) {
|
|
152
|
+
const seen = new Set();
|
|
153
|
+
return targets
|
|
154
|
+
.filter((target) => {
|
|
155
|
+
if (seen.has(target.id))
|
|
156
|
+
return false;
|
|
157
|
+
seen.add(target.id);
|
|
158
|
+
return true;
|
|
159
|
+
})
|
|
160
|
+
.sort((a, b) => {
|
|
161
|
+
const source = sourceRank(a.source) - sourceRank(b.source);
|
|
162
|
+
if (source !== 0)
|
|
163
|
+
return source;
|
|
164
|
+
const priority = priorityRank(a.priority) - priorityRank(b.priority);
|
|
165
|
+
if (priority !== 0)
|
|
166
|
+
return priority;
|
|
167
|
+
return a.id.localeCompare(b.id);
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
function summarize(verdict, level, targetCount) {
|
|
171
|
+
if (verdict === 'blocked')
|
|
172
|
+
return `blocked: ${level} regression plan has ${targetCount} target(s) and p0 evidence`;
|
|
173
|
+
if (verdict === 'needs_tests')
|
|
174
|
+
return `needs_tests: run ${level} regression plan across ${targetCount} target(s)`;
|
|
175
|
+
return `ready: ${level} regression baseline has no immediate extra targets`;
|
|
176
|
+
}
|
|
177
|
+
function severityPriority(severity) {
|
|
178
|
+
if (severity === 'error')
|
|
179
|
+
return 'p0';
|
|
180
|
+
if (severity === 'warning')
|
|
181
|
+
return 'p1';
|
|
182
|
+
return 'p2';
|
|
183
|
+
}
|
|
184
|
+
function priorityRank(priority) {
|
|
185
|
+
if (priority === 'p0')
|
|
186
|
+
return 0;
|
|
187
|
+
if (priority === 'p1')
|
|
188
|
+
return 1;
|
|
189
|
+
return 2;
|
|
190
|
+
}
|
|
191
|
+
function sourceRank(source) {
|
|
192
|
+
if (source === 'baseline')
|
|
193
|
+
return 0;
|
|
194
|
+
if (source === 'bug-hunt')
|
|
195
|
+
return 1;
|
|
196
|
+
if (source === 'preflight')
|
|
197
|
+
return 2;
|
|
198
|
+
return 3;
|
|
199
|
+
}
|
|
200
|
+
function commandForTool(tool) {
|
|
201
|
+
if (tool === 'projscan_review')
|
|
202
|
+
return 'projscan review --format json';
|
|
203
|
+
if (tool === 'projscan_taint')
|
|
204
|
+
return 'projscan taint --format json';
|
|
205
|
+
if (tool === 'projscan_hotspots')
|
|
206
|
+
return 'projscan hotspots --format json';
|
|
207
|
+
if (tool === 'projscan_plugin')
|
|
208
|
+
return 'projscan plugin list --format json';
|
|
209
|
+
if (tool === 'projscan_preflight')
|
|
210
|
+
return 'projscan preflight --mode before_commit --format json';
|
|
211
|
+
return 'projscan doctor --format json';
|
|
212
|
+
}
|
|
213
|
+
function normalizeLevel(value) {
|
|
214
|
+
if (value === 'smoke' || value === 'focused' || value === 'full')
|
|
215
|
+
return value;
|
|
216
|
+
return 'focused';
|
|
217
|
+
}
|
|
218
|
+
function normalizeMaxTargets(value) {
|
|
219
|
+
if (typeof value !== 'number' || !Number.isFinite(value))
|
|
220
|
+
return DEFAULT_MAX_TARGETS;
|
|
221
|
+
return Math.max(1, Math.min(25, Math.floor(value)));
|
|
222
|
+
}
|
|
223
|
+
function dedupeStrings(values) {
|
|
224
|
+
return [...new Set(values.filter(Boolean))];
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=regressionPlan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regressionPlan.js","sourceRoot":"","sources":["../../src/core/regressionPlan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { EvidencePackReport } from '../types.js';
|
|
2
|
+
export interface ComputeEvidencePackOptions {
|
|
3
|
+
lines?: string[];
|
|
4
|
+
includeWebsitePrompt?: boolean;
|
|
5
|
+
maxFindings?: number;
|
|
6
|
+
}
|
|
7
|
+
export declare function computeEvidencePack(rootPath: string, options?: ComputeEvidencePackOptions): Promise<EvidencePackReport>;
|