projscan 2.2.0 → 2.9.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 +59 -21
- 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/init.js +46 -1
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/preflight.js +16 -0
- package/dist/cli/commands/preflight.js.map +1 -1
- 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/recipes.d.ts +2 -0
- package/dist/cli/commands/recipes.js +94 -0
- package/dist/cli/commands/recipes.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 +17 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/adoption.d.ts +57 -0
- package/dist/core/adoption.js +392 -0
- package/dist/core/adoption.js.map +1 -0
- 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/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/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 +10 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/tools/adoption.d.ts +2 -0
- package/dist/mcp/tools/adoption.js +35 -0
- package/dist/mcp/tools/adoption.js.map +1 -0
- 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 +16 -0
- package/dist/mcp/tools.js.map +1 -1
- package/dist/projscan-sbom.cdx.json +6 -6
- package/dist/reporters/consoleReporter.js +4 -0
- package/dist/reporters/consoleReporter.js.map +1 -1
- package/dist/tool-manifest.json +222 -3
- package/dist/types.d.ts +240 -0
- package/dist/utils/formatSupport.d.ts +11 -0
- package/dist/utils/formatSupport.js +11 -0
- package/dist/utils/formatSupport.js.map +1 -1
- package/docs/PLUGIN-AUTHORING.md +4 -0
- package/docs/PLUGIN-GALLERY.md +61 -0
- package/docs/examples/plugins/release-readiness.mjs +26 -0
- package/docs/examples/plugins/release-readiness.projscan-plugin.json +8 -0
- package/docs/examples/plugins/security-radar.mjs +50 -0
- package/docs/examples/plugins/security-radar.projscan-plugin.json +8 -0
- package/package.json +5 -4
|
@@ -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>;
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { computeBugHunt } from './bugHunt.js';
|
|
2
|
+
import { computePreflight } from './preflight.js';
|
|
3
|
+
import { computeReleaseTrain } from './releaseTrain.js';
|
|
4
|
+
import { computeWorkplan } from './workplan.js';
|
|
5
|
+
export async function computeEvidencePack(rootPath, options = {}) {
|
|
6
|
+
const [train, bugHunt, workplan, preflight] = await Promise.all([
|
|
7
|
+
computeReleaseTrain(rootPath, { lines: options.lines }),
|
|
8
|
+
computeBugHunt(rootPath, { maxFindings: options.maxFindings }),
|
|
9
|
+
computeWorkplan(rootPath, { mode: 'release', maxTasks: 6 }),
|
|
10
|
+
computePreflight(rootPath, { mode: 'before_merge' }),
|
|
11
|
+
]);
|
|
12
|
+
const artifacts = buildArtifacts(train, bugHunt, workplan, preflight);
|
|
13
|
+
const verdict = packVerdict(artifacts);
|
|
14
|
+
const blockingReasons = blockingEvidence(preflight, bugHunt, workplan);
|
|
15
|
+
const changelogEntries = buildChangelogEntries();
|
|
16
|
+
const suggestedNextActions = dedupeActions([
|
|
17
|
+
...train.suggestedNextActions,
|
|
18
|
+
...workplan.suggestedNextActions,
|
|
19
|
+
...preflight.suggestedNextActions,
|
|
20
|
+
...bugHunt.fixQueue.slice(0, 4).map((finding) => ({
|
|
21
|
+
label: finding.title,
|
|
22
|
+
command: finding.verification.commands[0],
|
|
23
|
+
})),
|
|
24
|
+
]);
|
|
25
|
+
return {
|
|
26
|
+
schemaVersion: 1,
|
|
27
|
+
currentVersion: train.currentVersion,
|
|
28
|
+
readOnly: true,
|
|
29
|
+
verdict,
|
|
30
|
+
summary: summarize(verdict, train, blockingReasons),
|
|
31
|
+
train: {
|
|
32
|
+
lines: train.plan.lines,
|
|
33
|
+
readiness: train.readiness,
|
|
34
|
+
},
|
|
35
|
+
approval: {
|
|
36
|
+
required: true,
|
|
37
|
+
recommendation: approvalRecommendation(verdict),
|
|
38
|
+
blockingReasons,
|
|
39
|
+
},
|
|
40
|
+
artifacts,
|
|
41
|
+
changelogEntries,
|
|
42
|
+
...(options.includeWebsitePrompt ? { websitePrompt: buildWebsitePrompt(train, changelogEntries) } : {}),
|
|
43
|
+
suggestedNextActions,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function buildArtifacts(train, bugHunt, workplan, preflight) {
|
|
47
|
+
return [
|
|
48
|
+
{
|
|
49
|
+
id: 'ep-release-train',
|
|
50
|
+
title: 'Product plan readiness',
|
|
51
|
+
status: statusFromPreflight(train.readiness.verdict),
|
|
52
|
+
summary: train.readiness.summary,
|
|
53
|
+
evidence: [
|
|
54
|
+
`${train.plan.lines.length} product line(s): ${train.plan.lines.join(', ')}`,
|
|
55
|
+
`${train.readiness.blockers} blocker(s), ${train.readiness.cautions} caution(s)`,
|
|
56
|
+
'read-only evidence: yes',
|
|
57
|
+
],
|
|
58
|
+
commands: ['projscan release-train --format json'],
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
id: 'ep-bug-hunt',
|
|
62
|
+
title: 'Bug-hunt queue',
|
|
63
|
+
status: bugHunt.verdict === 'block' ? 'blocked' : bugHunt.verdict === 'fix' ? 'caution' : 'ready',
|
|
64
|
+
summary: bugHunt.summary,
|
|
65
|
+
evidence: [
|
|
66
|
+
`health score ${bugHunt.health.score}`,
|
|
67
|
+
`${bugHunt.fixQueue.length} fix target(s) in queue`,
|
|
68
|
+
`preflight evidence during bug hunt: ${bugHunt.evidence.preflightVerdict}`,
|
|
69
|
+
],
|
|
70
|
+
commands: ['projscan bug-hunt --format json'],
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
id: 'ep-workplan',
|
|
74
|
+
title: 'Agent workplan',
|
|
75
|
+
status: statusFromPreflight(workplan.verdict),
|
|
76
|
+
summary: workplan.summary,
|
|
77
|
+
evidence: [
|
|
78
|
+
`${workplan.tasks.length} task(s)`,
|
|
79
|
+
`${workplan.topRisks.length} top risk(s)`,
|
|
80
|
+
workplan.coordination.recommendedNextAgent,
|
|
81
|
+
],
|
|
82
|
+
commands: ['projscan workplan --mode release --format json', 'projscan handoff --mode release'],
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
id: 'ep-preflight',
|
|
86
|
+
title: 'Preflight gate',
|
|
87
|
+
status: statusFromPreflight(preflight.verdict),
|
|
88
|
+
summary: preflight.summary,
|
|
89
|
+
evidence: preflight.requiredChecks.map((check) => `${check.name}: ${check.status}`),
|
|
90
|
+
commands: ['projscan preflight --mode before_merge --format json'],
|
|
91
|
+
},
|
|
92
|
+
];
|
|
93
|
+
}
|
|
94
|
+
function blockingEvidence(preflight, bugHunt, workplan) {
|
|
95
|
+
return dedupeStrings([
|
|
96
|
+
...preflight.reasons
|
|
97
|
+
.filter((reason) => reason.severity === 'error')
|
|
98
|
+
.map((reason) => reason.message),
|
|
99
|
+
...(bugHunt.verdict === 'block'
|
|
100
|
+
? bugHunt.fixQueue
|
|
101
|
+
.filter((finding) => finding.priority === 'p0')
|
|
102
|
+
.map((finding) => finding.title)
|
|
103
|
+
: []),
|
|
104
|
+
...(workplan.verdict === 'block'
|
|
105
|
+
? workplan.topRisks
|
|
106
|
+
.filter((risk) => risk.priority === 'p0')
|
|
107
|
+
.map((risk) => risk.message)
|
|
108
|
+
: []),
|
|
109
|
+
]).slice(0, 10);
|
|
110
|
+
}
|
|
111
|
+
function buildChangelogEntries() {
|
|
112
|
+
return [
|
|
113
|
+
'`projscan_evidence_pack` / `projscan evidence-pack` produce one approval-ready packet with planning, preflight, workplan, bug-hunt, changelog, and website-update evidence.',
|
|
114
|
+
'`projscan_regression_plan` / `projscan regression-plan` build a smoke/focused/full verification matrix from bug-hunt, preflight, and product risk.',
|
|
115
|
+
'`projscan_agent_brief` / `projscan agent-brief` create compact next-agent context packets with focus items, guardrails, and repo context.',
|
|
116
|
+
'`projscan_quality_scorecard` / `projscan quality-scorecard` summarize health, security, tests, maintainability, and coordination with top risks and commands.',
|
|
117
|
+
];
|
|
118
|
+
}
|
|
119
|
+
function buildWebsitePrompt(train, changelogEntries) {
|
|
120
|
+
return [
|
|
121
|
+
'Update the projscan website for the next release using the current repository evidence.',
|
|
122
|
+
`Product lines covered: ${train.plan.lines.join(', ')}.`,
|
|
123
|
+
'Highlight the new agent-facing surfaces: projscan_workplan, projscan_bug_hunt, projscan_release_train, projscan_evidence_pack, projscan_regression_plan, projscan_agent_brief, and projscan_quality_scorecard.',
|
|
124
|
+
'Use these product bullets:',
|
|
125
|
+
...changelogEntries.map((entry) => `- ${entry}`),
|
|
126
|
+
'Keep claims grounded in the completed product evidence.',
|
|
127
|
+
].join('\n');
|
|
128
|
+
}
|
|
129
|
+
function packVerdict(artifacts) {
|
|
130
|
+
if (artifacts.some((artifact) => artifact.status === 'blocked'))
|
|
131
|
+
return 'blocked';
|
|
132
|
+
if (artifacts.some((artifact) => artifact.status === 'caution'))
|
|
133
|
+
return 'caution';
|
|
134
|
+
return 'ready';
|
|
135
|
+
}
|
|
136
|
+
function summarize(verdict, train, blockingReasons) {
|
|
137
|
+
if (verdict === 'blocked') {
|
|
138
|
+
return `blocked: ${blockingReasons[0] ?? 'product evidence still contains blocking signals'}`;
|
|
139
|
+
}
|
|
140
|
+
if (verdict === 'caution') {
|
|
141
|
+
return `caution: ${train.plan.lines.join(', ')} evidence is assembled but still needs explicit review`;
|
|
142
|
+
}
|
|
143
|
+
return `ready: ${train.plan.lines.join(', ')} evidence is assembled for approval`;
|
|
144
|
+
}
|
|
145
|
+
function approvalRecommendation(verdict) {
|
|
146
|
+
if (verdict === 'blocked')
|
|
147
|
+
return 'Do not approve launch until p0 evidence is cleared or accepted.';
|
|
148
|
+
if (verdict === 'caution')
|
|
149
|
+
return 'Review cautions, then approve only after the regression plan passes.';
|
|
150
|
+
return 'Approval can proceed after the recorded regression commands pass.';
|
|
151
|
+
}
|
|
152
|
+
function statusFromPreflight(verdict) {
|
|
153
|
+
if (verdict === 'block')
|
|
154
|
+
return 'blocked';
|
|
155
|
+
if (verdict === 'caution')
|
|
156
|
+
return 'caution';
|
|
157
|
+
return 'ready';
|
|
158
|
+
}
|
|
159
|
+
function dedupeActions(actions) {
|
|
160
|
+
const seen = new Set();
|
|
161
|
+
const result = [];
|
|
162
|
+
for (const action of actions) {
|
|
163
|
+
const key = `${action.label}:${action.command ?? ''}:${action.tool ?? ''}`;
|
|
164
|
+
if (seen.has(key))
|
|
165
|
+
continue;
|
|
166
|
+
seen.add(key);
|
|
167
|
+
result.push(action);
|
|
168
|
+
}
|
|
169
|
+
return result.slice(0, 12);
|
|
170
|
+
}
|
|
171
|
+
function dedupeStrings(values) {
|
|
172
|
+
return [...new Set(values.filter(Boolean))];
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=releaseEvidence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"releaseEvidence.js","sourceRoot":"","sources":["../../src/core/releaseEvidence.ts"],"names":[],"mappings":"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"}
|