projscan 3.0.4 → 3.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/README.md +45 -25
  2. package/dist/cli/commands/dogfood.d.ts +1 -0
  3. package/dist/cli/commands/dogfood.js +78 -0
  4. package/dist/cli/commands/dogfood.js.map +1 -0
  5. package/dist/cli/commands/start.js +7 -0
  6. package/dist/cli/commands/start.js.map +1 -1
  7. package/dist/cli/index.js +2 -0
  8. package/dist/cli/index.js.map +1 -1
  9. package/dist/core/adoption.js +24 -2
  10. package/dist/core/adoption.js.map +1 -1
  11. package/dist/core/ast.d.ts +6 -0
  12. package/dist/core/ast.js +59 -11
  13. package/dist/core/ast.js.map +1 -1
  14. package/dist/core/bugHunt.js +3 -0
  15. package/dist/core/bugHunt.js.map +1 -1
  16. package/dist/core/dataflow.js +98 -9
  17. package/dist/core/dataflow.js.map +1 -1
  18. package/dist/core/dogfood.d.ts +7 -0
  19. package/dist/core/dogfood.js +345 -0
  20. package/dist/core/dogfood.js.map +1 -0
  21. package/dist/core/fixFirst.d.ts +8 -0
  22. package/dist/core/fixFirst.js +109 -0
  23. package/dist/core/fixFirst.js.map +1 -0
  24. package/dist/core/frameworkSources.d.ts +3 -1
  25. package/dist/core/frameworkSources.js +44 -3
  26. package/dist/core/frameworkSources.js.map +1 -1
  27. package/dist/core/indexCache.js +5 -1
  28. package/dist/core/indexCache.js.map +1 -1
  29. package/dist/core/preflight.js +12 -7
  30. package/dist/core/preflight.js.map +1 -1
  31. package/dist/core/qualityScorecard.js +5 -1
  32. package/dist/core/qualityScorecard.js.map +1 -1
  33. package/dist/core/releaseEvidence.d.ts +1 -0
  34. package/dist/core/releaseEvidence.js +152 -8
  35. package/dist/core/releaseEvidence.js.map +1 -1
  36. package/dist/core/start.js +47 -3
  37. package/dist/core/start.js.map +1 -1
  38. package/dist/core/taint.js +89 -9
  39. package/dist/core/taint.js.map +1 -1
  40. package/dist/core/workplan.js +3 -0
  41. package/dist/core/workplan.js.map +1 -1
  42. package/dist/index.d.ts +2 -1
  43. package/dist/index.js +1 -0
  44. package/dist/index.js.map +1 -1
  45. package/dist/projscan-sbom.cdx.json +6 -6
  46. package/dist/tool-manifest.json +2 -2
  47. package/dist/types.d.ts +152 -0
  48. package/dist/utils/baseline.js +23 -2
  49. package/dist/utils/baseline.js.map +1 -1
  50. package/dist/utils/formatSupport.d.ts +1 -0
  51. package/dist/utils/formatSupport.js +1 -0
  52. package/dist/utils/formatSupport.js.map +1 -1
  53. package/package.json +4 -2
  54. package/public/.well-known/security.txt +6 -0
  55. package/public/brand/baseframe-labs/mark-dark-on-dark.png +0 -0
  56. package/public/brand/baseframe-labs/mark-dark.png +0 -0
  57. package/public/brand/baseframe-labs/mark-dark.svg +1 -0
  58. package/public/brand/baseframe-labs/mark-light-on-white.png +0 -0
  59. package/public/brand/baseframe-labs/mark-light.png +0 -0
  60. package/public/brand/baseframe-labs/mark-light.svg +1 -0
  61. package/public/brand/baseframe-labs/wordmark-dark-on-dark.png +0 -0
  62. package/public/brand/baseframe-labs/wordmark-dark.png +0 -0
  63. package/public/brand/baseframe-labs/wordmark-dark.svg +1 -0
  64. package/public/brand/baseframe-labs/wordmark-light-on-white.png +0 -0
  65. package/public/brand/baseframe-labs/wordmark-light.png +0 -0
  66. package/public/brand/baseframe-labs/wordmark-light.svg +1 -0
@@ -0,0 +1,345 @@
1
+ import path from 'node:path';
2
+ import { computeEvidencePack } from './releaseEvidence.js';
3
+ import { computeStartReport } from './start.js';
4
+ const DEFAULT_TARGET_REPO_COUNT = 3;
5
+ const FEEDBACK_QUESTIONS = [
6
+ 'Did the PR comment save 10-20 minutes?',
7
+ 'What was missing or noisy?',
8
+ 'Which owner or command should have been clearer?',
9
+ 'Minutes saved: 0, 5, 10, 20+?',
10
+ 'Did projscan prevent a risky edit or missed review step?',
11
+ ];
12
+ const FEEDBACK_CAPTURE_COMMAND = 'projscan dogfood --repo <repo-a> --repo <repo-b> --repo <repo-c> --feedback .projscan-feedback.json --format json';
13
+ const MIN_USEFUL_REVIEWER_RESPONSES = 3;
14
+ export async function computeDogfoodReport(rootPath, options = {}) {
15
+ const targetRepoCount = normalizeTargetRepoCount(options.targetRepoCount);
16
+ const repos = normalizeRepos(rootPath, options.repos);
17
+ const feedback = normalizeFeedback(options.feedback);
18
+ const results = await Promise.all(repos.map((repoPath) => evaluateRepo(repoPath, feedback)));
19
+ const totals = summarizeTotals(results);
20
+ const marketValidation = buildMarketValidation(results, targetRepoCount);
21
+ return {
22
+ schemaVersion: 1,
23
+ readOnly: true,
24
+ rootPath,
25
+ targetRepoCount,
26
+ summary: summarizeDogfood(results.length, targetRepoCount, totals, marketValidation),
27
+ repos: results,
28
+ totals,
29
+ marketValidation,
30
+ suggestedNextActions: buildDogfoodActions(results.length, targetRepoCount, marketValidation),
31
+ };
32
+ }
33
+ async function evaluateRepo(repoPath, feedback) {
34
+ const [start, evidence] = await Promise.all([
35
+ computeStartReport(repoPath, { mode: 'before_merge', maxTasks: 4, maxRisks: 5 }),
36
+ computeEvidencePack(repoPath, { includePrComment: true, maxFindings: 3 }),
37
+ ]);
38
+ const name = path.basename(repoPath) || repoPath;
39
+ const prComment = evidence.prComment ?? '';
40
+ const prCommentReady = evidence.prCommentValidation?.status === 'pass' && prComment.includes('### Developer Feedback');
41
+ const repeatUseReady = start.adoptionLoop?.cadence === 'every_pr' && (start.adoptionLoop.nextCommands.length ?? 0) >= 3;
42
+ const mcpReady = start.evidence.mcpReady;
43
+ const validation = summarizeRepoFeedback(feedbackForRepo(feedback, repoPath, name));
44
+ const gaps = buildGaps({
45
+ prCommentReady,
46
+ repeatUseReady,
47
+ mcpReady,
48
+ healthScore: start.evidence.healthScore,
49
+ validation,
50
+ });
51
+ return {
52
+ path: repoPath,
53
+ name,
54
+ status: statusFromGaps(gaps, start.evidence.healthScore),
55
+ healthScore: start.evidence.healthScore,
56
+ mcpReady,
57
+ prCommentReady,
58
+ repeatUseReady,
59
+ verdict: evidence.verdict,
60
+ gaps,
61
+ feedbackQuestions: [...FEEDBACK_QUESTIONS],
62
+ validation,
63
+ nextCommands: [
64
+ 'projscan init team --team platform',
65
+ 'projscan evidence-pack --pr-comment',
66
+ 'projscan preflight --mode before_merge --format json',
67
+ FEEDBACK_CAPTURE_COMMAND,
68
+ ],
69
+ };
70
+ }
71
+ function normalizeTargetRepoCount(value) {
72
+ if (typeof value !== 'number' || !Number.isFinite(value))
73
+ return DEFAULT_TARGET_REPO_COUNT;
74
+ return Math.max(1, Math.floor(value));
75
+ }
76
+ function normalizeRepos(rootPath, repos) {
77
+ const values = repos && repos.length > 0 ? repos : [rootPath];
78
+ return [...new Set(values.map((value) => path.resolve(rootPath, value)))];
79
+ }
80
+ function normalizeFeedback(input) {
81
+ return Array.isArray(input?.responses) ? input.responses : [];
82
+ }
83
+ function feedbackForRepo(feedback, repoPath, repoName) {
84
+ const normalizedPath = normalizeMatchValue(repoPath);
85
+ const normalizedName = normalizeMatchValue(repoName);
86
+ return feedback.filter((response) => {
87
+ const repo = normalizeMatchValue(response.repo ?? '');
88
+ if (!repo)
89
+ return false;
90
+ return matchesRepoKey(repo, normalizedName, normalizedPath);
91
+ });
92
+ }
93
+ function matchesRepoKey(repo, repoName, repoPath) {
94
+ if (repo === repoName || repo === repoPath || repoPath.endsWith('/' + repo))
95
+ return true;
96
+ if (repoName.startsWith(repo + '-') || repoName.endsWith('-' + repo))
97
+ return true;
98
+ if (repoName.includes('-' + repo + '-'))
99
+ return true;
100
+ if (repoPath.includes('/' + repo + '-') || repoPath.includes('/' + repo + '/'))
101
+ return true;
102
+ return repoPath.includes('-' + repo + '-');
103
+ }
104
+ function summarizeRepoFeedback(feedback) {
105
+ return {
106
+ feedbackResponses: feedback.length,
107
+ usefulResponses: feedback.filter((response) => response.useful === true).length,
108
+ minutesSaved: sumNumbers(feedback.map((response) => response.minutesSaved)),
109
+ preventedBadEdits: feedback.filter((response) => response.preventedBadEdit === true).length,
110
+ ownerRoutingClear: feedback.filter((response) => response.ownerRoutingClear === true).length,
111
+ nextCommandClear: feedback.filter((response) => response.nextCommandClear === true).length,
112
+ falsePositiveRules: cleanSignals(feedback.flatMap((response) => response.falsePositiveRules ?? [])),
113
+ missingSignals: cleanSignals(feedback.flatMap((response) => response.missingSignals ?? [])),
114
+ noisyFindings: cleanSignals(feedback.flatMap((response) => response.noisyFindings ?? [])),
115
+ };
116
+ }
117
+ function buildGaps(input) {
118
+ const gaps = [];
119
+ if (input.healthScore < 80)
120
+ gaps.push('health score below adoption threshold');
121
+ if (!input.mcpReady)
122
+ gaps.push('MCP setup not ready');
123
+ if (!input.prCommentReady)
124
+ gaps.push('PR comment is missing required usefulness sections');
125
+ if (!input.repeatUseReady)
126
+ gaps.push('repeat-use adoption loop is missing');
127
+ if (input.validation.falsePositiveRules.length > 0) {
128
+ gaps.push('reviewer reported false-positive rule(s): ' + input.validation.falsePositiveRules.join(', '));
129
+ }
130
+ if (input.validation.missingSignals.length > 0) {
131
+ gaps.push('reviewer reported missing signal(s): ' + input.validation.missingSignals.join('; '));
132
+ }
133
+ return gaps;
134
+ }
135
+ function statusFromGaps(gaps, healthScore) {
136
+ if (healthScore < 70 || gaps.some((gap) => gap.includes('PR comment')))
137
+ return 'fail';
138
+ if (gaps.length > 0)
139
+ return 'warn';
140
+ return 'pass';
141
+ }
142
+ function summarizeTotals(repos) {
143
+ return {
144
+ reposEvaluated: repos.length,
145
+ passingRepos: repos.filter((repo) => repo.status === 'pass').length,
146
+ warningRepos: repos.filter((repo) => repo.status === 'warn').length,
147
+ failingRepos: repos.filter((repo) => repo.status === 'fail').length,
148
+ prCommentReady: repos.filter((repo) => repo.prCommentReady).length,
149
+ repeatUseReady: repos.filter((repo) => repo.repeatUseReady).length,
150
+ mcpReady: repos.filter((repo) => repo.mcpReady).length,
151
+ usefulFeedback: repos.reduce((sum, repo) => sum + repo.validation.usefulResponses, 0),
152
+ minutesSaved: repos.reduce((sum, repo) => sum + repo.validation.minutesSaved, 0),
153
+ preventedBadEdits: repos.reduce((sum, repo) => sum + repo.validation.preventedBadEdits, 0),
154
+ falsePositiveReports: repos.reduce((sum, repo) => sum + repo.validation.falsePositiveRules.length, 0),
155
+ };
156
+ }
157
+ function buildMarketValidation(repos, targetRepoCount) {
158
+ const responseCount = repos.reduce((sum, repo) => sum + repo.validation.feedbackResponses, 0);
159
+ const usefulResponses = repos.reduce((sum, repo) => sum + repo.validation.usefulResponses, 0);
160
+ const totalMinutesSaved = repos.reduce((sum, repo) => sum + repo.validation.minutesSaved, 0);
161
+ const preventedBadEdits = repos.reduce((sum, repo) => sum + repo.validation.preventedBadEdits, 0);
162
+ const ownerRoutingClear = repos.reduce((sum, repo) => sum + repo.validation.ownerRoutingClear, 0);
163
+ const nextCommandClear = repos.reduce((sum, repo) => sum + repo.validation.nextCommandClear, 0);
164
+ const falsePositive = {
165
+ totalReports: repos.reduce((sum, repo) => sum + repo.validation.falsePositiveRules.length, 0),
166
+ noisyRules: countSignals(repos.flatMap((repo) => repo.validation.falsePositiveRules), 'rule'),
167
+ missingSignals: countSignals(repos.flatMap((repo) => repo.validation.missingSignals), 'signal'),
168
+ noisyFindings: countSignals(repos.flatMap((repo) => repo.validation.noisyFindings), 'finding'),
169
+ };
170
+ const repoCoverage = {
171
+ target: targetRepoCount,
172
+ evaluated: repos.length,
173
+ targetMet: repos.length >= targetRepoCount,
174
+ };
175
+ const firstPr = {
176
+ readyRepos: repos.filter((repo) => repo.prCommentReady).length,
177
+ repeatUseReadyRepos: repos.filter((repo) => repo.repeatUseReady).length,
178
+ requiredFeedbackQuestions: [...FEEDBACK_QUESTIONS],
179
+ };
180
+ const feedback = {
181
+ responses: responseCount,
182
+ usefulResponses,
183
+ usefulnessRate: responseCount > 0 ? round(usefulResponses / responseCount) : 0,
184
+ preventedBadEdits,
185
+ ownerRoutingClear,
186
+ nextCommandClear,
187
+ minutesSaved: {
188
+ total: totalMinutesSaved,
189
+ average: responseCount > 0 ? round(totalMinutesSaved / responseCount) : 0,
190
+ max: Math.max(0, ...repos.map((repo) => repo.validation.minutesSaved)),
191
+ },
192
+ };
193
+ const status = marketStatus(repoCoverage.targetMet, responseCount, usefulResponses, falsePositive.totalReports);
194
+ const summary = summarizeMarketValidation(status, repoCoverage.evaluated, targetRepoCount, feedback, falsePositive.totalReports);
195
+ return {
196
+ status,
197
+ summary,
198
+ repoCoverage,
199
+ feedback,
200
+ falsePositive,
201
+ firstPr,
202
+ websiteProof: buildWebsiteProof(repos, feedback, falsePositive.totalReports, status),
203
+ };
204
+ }
205
+ function marketStatus(targetMet, responses, usefulResponses, falsePositiveReports) {
206
+ if (!targetMet)
207
+ return 'needs_more_repos';
208
+ if (responses === 0)
209
+ return 'needs_feedback';
210
+ if (usefulResponses < MIN_USEFUL_REVIEWER_RESPONSES)
211
+ return 'needs_tuning';
212
+ if (falsePositiveReports > usefulResponses)
213
+ return 'needs_tuning';
214
+ return 'proven';
215
+ }
216
+ function summarizeMarketValidation(status, evaluated, target, feedback, falsePositiveReports) {
217
+ const base = evaluated + '/' + target + ' repo target; ' + feedback.responses + ' reviewer response(s); ' + feedback.minutesSaved.total + ' minutes saved; ' + feedback.preventedBadEdits + ' risky edit(s) prevented; ' + falsePositiveReports + ' false-positive report(s)';
218
+ if (status === 'proven')
219
+ return 'market validation proven: ' + base;
220
+ if (status === 'needs_more_repos')
221
+ return 'market validation needs more repos: ' + base;
222
+ if (status === 'needs_feedback')
223
+ return 'market validation needs reviewer feedback: ' + base;
224
+ return 'market validation needs tuning: ' + base;
225
+ }
226
+ function buildWebsiteProof(repos, feedback, falsePositiveReports, status) {
227
+ const repoCount = repos.length;
228
+ const headline = buildWebsiteProofHeadline(status, repoCount);
229
+ const metrics = [
230
+ repoCount + ' real repo(s) evaluated',
231
+ feedback.responses + ' reviewer response(s)',
232
+ feedback.minutesSaved.total + ' minutes saved',
233
+ feedback.preventedBadEdits + ' risky edits prevented',
234
+ falsePositiveReports + ' false-positive report(s) tracked',
235
+ ];
236
+ const claimBullet = status === 'proven'
237
+ ? 'Website claims can cite measured minutes saved and risky edits prevented instead of generic scanner claims.'
238
+ : 'Website claims should stay provisional until repo coverage, useful feedback, and false-positive tuning are ready.';
239
+ const bullets = [
240
+ 'Generated PR comments were validated before posting.',
241
+ 'Reviewer feedback is captured as structured dogfood evidence.',
242
+ 'False positives, missing signals, owner clarity, and next-command clarity are visible in one report.',
243
+ claimBullet,
244
+ ];
245
+ const markdown = [
246
+ '## Market Validation Proof',
247
+ '',
248
+ '**Status:** ' + status,
249
+ '**Headline:** ' + headline,
250
+ '',
251
+ '### Metrics',
252
+ ...metrics.map((metric) => '- ' + metric),
253
+ '',
254
+ '### What To Show On The Website',
255
+ ...bullets.map((bullet) => '- ' + bullet),
256
+ ].join('\\n');
257
+ return { headline, metrics, bullets, markdown };
258
+ }
259
+ function buildWebsiteProofHeadline(status, repoCount) {
260
+ if (status === 'proven')
261
+ return 'projscan proved useful across ' + repoCount + ' real repo(s)';
262
+ if (status === 'needs_more_repos')
263
+ return 'projscan needs more real-repo validation before public proof';
264
+ if (status === 'needs_feedback')
265
+ return 'projscan needs reviewer feedback before usefulness proof';
266
+ return 'projscan needs tuning before usefulness proof';
267
+ }
268
+ function summarizeDogfood(reposEvaluated, targetRepoCount, totals, marketValidation) {
269
+ const target = reposEvaluated >= targetRepoCount ? 'target met' : 'needs more repos';
270
+ return 'dogfood: ' + reposEvaluated + ' repo(s) evaluated (' + target + '); ' + totals.prCommentReady + '/' + reposEvaluated + ' PR comments ready; ' + totals.repeatUseReady + '/' + reposEvaluated + ' repeat-use loops ready; validation=' + marketValidation.status;
271
+ }
272
+ function buildDogfoodActions(reposEvaluated, targetRepoCount, marketValidation) {
273
+ const actions = [
274
+ {
275
+ label: 'Run dogfood against a real team repo',
276
+ command: 'projscan dogfood --repo <path-to-repo> --format json',
277
+ },
278
+ {
279
+ label: 'Capture first PR feedback as structured evidence',
280
+ command: FEEDBACK_CAPTURE_COMMAND,
281
+ },
282
+ {
283
+ label: 'Capture first PR feedback',
284
+ command: 'projscan evidence-pack --pr-comment',
285
+ },
286
+ ];
287
+ if (reposEvaluated < targetRepoCount) {
288
+ actions.unshift({
289
+ label: 'Add ' + (targetRepoCount - reposEvaluated) + ' more repo(s) before calling adoption proven',
290
+ command: 'projscan dogfood --repo <repo-a> --repo <repo-b> --repo <repo-c> --format json',
291
+ });
292
+ }
293
+ if (marketValidation.status === 'needs_feedback') {
294
+ actions.unshift({
295
+ label: 'Ask real reviewers for first-PR usefulness feedback',
296
+ command: FEEDBACK_CAPTURE_COMMAND,
297
+ });
298
+ }
299
+ if (marketValidation.status === 'needs_tuning') {
300
+ actions.unshift({
301
+ label: 'Tune noisy rules before expanding rollout',
302
+ command: 'projscan memory stable --format json',
303
+ });
304
+ }
305
+ return dedupeActions(actions);
306
+ }
307
+ function dedupeActions(actions) {
308
+ const seen = new Set();
309
+ const result = [];
310
+ for (const action of actions) {
311
+ const key = action.command ?? action.label;
312
+ if (seen.has(key))
313
+ continue;
314
+ seen.add(key);
315
+ result.push(action);
316
+ }
317
+ return result;
318
+ }
319
+ function countSignals(values, key) {
320
+ const counts = new Map();
321
+ for (const value of cleanSignals(values))
322
+ counts.set(value, (counts.get(value) ?? 0) + 1);
323
+ return [...counts.entries()]
324
+ .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))
325
+ .map(([value, count]) => ({ [key]: value, count }));
326
+ }
327
+ function cleanSignals(values) {
328
+ return values
329
+ .map((value) => value.trim())
330
+ .filter((value) => value.length > 0 && value.toLowerCase() !== 'none');
331
+ }
332
+ function sumNumbers(values) {
333
+ return values.reduce((sum, value) => {
334
+ if (typeof value !== 'number' || !Number.isFinite(value) || value < 0)
335
+ return sum;
336
+ return sum + value;
337
+ }, 0);
338
+ }
339
+ function normalizeMatchValue(value) {
340
+ return value.replace(/\\/g, '/').replace(/\/$/, '').trim().toLowerCase();
341
+ }
342
+ function round(value) {
343
+ return Math.round(value * 100) / 100;
344
+ }
345
+ //# sourceMappingURL=dogfood.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dogfood.js","sourceRoot":"","sources":["../../src/core/dogfood.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { BugHuntFinding, EvidencePackTopRisk, FixFirstRecommendation, QualityScorecardRisk, StartRisk, WorkplanTask, WorkplanTopRisk } from '../types.js';
2
+ export declare function fixFirstFromBugHuntFinding(finding: BugHuntFinding | undefined): FixFirstRecommendation | undefined;
3
+ export declare function fixFirstFromWorkplanTask(task: WorkplanTask | undefined): FixFirstRecommendation | undefined;
4
+ export declare function fixFirstFromWorkplanRisk(risk: WorkplanTopRisk | undefined): FixFirstRecommendation | undefined;
5
+ export declare function fixFirstFromQualityRisk(risk: QualityScorecardRisk | undefined): FixFirstRecommendation | undefined;
6
+ export declare function fixFirstFromStartRisk(risk: StartRisk | undefined): FixFirstRecommendation | undefined;
7
+ export declare function fixFirstFromEvidenceRisk(risk: EvidencePackTopRisk | undefined): FixFirstRecommendation | undefined;
8
+ export declare function fixFirstFromChangedFiles(files: string[], owner?: string): FixFirstRecommendation | undefined;
@@ -0,0 +1,109 @@
1
+ export function fixFirstFromBugHuntFinding(finding) {
2
+ if (!finding)
3
+ return undefined;
4
+ return {
5
+ id: finding.id,
6
+ title: finding.title,
7
+ source: finding.source,
8
+ priority: finding.priority,
9
+ whyFirst: whyFirst(finding.priority, finding.source, finding.why),
10
+ files: finding.files,
11
+ commands: finding.verification.commands,
12
+ expected: finding.verification.expected,
13
+ };
14
+ }
15
+ export function fixFirstFromWorkplanTask(task) {
16
+ if (!task)
17
+ return undefined;
18
+ return {
19
+ id: task.id,
20
+ title: task.title,
21
+ source: task.evidence[0]?.source ?? 'workplan',
22
+ priority: task.priority,
23
+ whyFirst: whyFirst(task.priority, task.evidence[0]?.source ?? 'workplan', task.why),
24
+ files: task.files,
25
+ ...(task.owner ? { owner: task.owner } : {}),
26
+ commands: task.verification.commands,
27
+ expected: task.verification.expected,
28
+ };
29
+ }
30
+ export function fixFirstFromWorkplanRisk(risk) {
31
+ if (!risk)
32
+ return undefined;
33
+ return {
34
+ id: `risk-${slug(risk.source)}-${slug(risk.file ?? risk.message)}`,
35
+ title: risk.message,
36
+ source: risk.source,
37
+ priority: risk.priority,
38
+ whyFirst: whyFirst(risk.priority, risk.source, risk.message),
39
+ files: risk.file ? [risk.file] : [],
40
+ ...(risk.owner ? { owner: risk.owner } : {}),
41
+ commands: [risk.tool === 'projscan_review' ? 'projscan review --format json' : 'projscan preflight --format json'],
42
+ };
43
+ }
44
+ export function fixFirstFromQualityRisk(risk) {
45
+ if (!risk)
46
+ return undefined;
47
+ return {
48
+ id: risk.id,
49
+ title: risk.title,
50
+ source: risk.source,
51
+ priority: risk.priority,
52
+ whyFirst: whyFirst(risk.priority, risk.source, risk.title),
53
+ files: risk.files,
54
+ commands: [risk.command],
55
+ };
56
+ }
57
+ export function fixFirstFromStartRisk(risk) {
58
+ if (!risk)
59
+ return undefined;
60
+ return {
61
+ id: risk.id,
62
+ title: risk.title,
63
+ source: risk.source,
64
+ priority: risk.priority,
65
+ whyFirst: whyFirst(risk.priority, risk.source, risk.title),
66
+ files: risk.files,
67
+ commands: [risk.command],
68
+ };
69
+ }
70
+ export function fixFirstFromEvidenceRisk(risk) {
71
+ if (!risk)
72
+ return undefined;
73
+ return {
74
+ id: `pr-risk-${slug(risk.title)}`,
75
+ title: risk.title,
76
+ source: 'pr-risk',
77
+ priority: risk.priority,
78
+ whyFirst: whyFirst(risk.priority, 'PR evidence', risk.title),
79
+ files: risk.files,
80
+ ...(risk.owner ? { owner: risk.owner } : {}),
81
+ commands: [risk.command],
82
+ };
83
+ }
84
+ export function fixFirstFromChangedFiles(files, owner) {
85
+ if (files.length === 0)
86
+ return undefined;
87
+ return {
88
+ id: 'pr-owned-change-review',
89
+ title: owner ? `Review changed files owned by ${owner}` : 'Review changed files before approval',
90
+ source: 'changed-files',
91
+ priority: 'p2',
92
+ whyFirst: 'First because the PR changed explicitly owned files, so reviewer routing should happen before approval.',
93
+ files: files.slice(0, 5),
94
+ ...(owner ? { owner } : {}),
95
+ commands: ['projscan review --format json', 'projscan preflight --mode before_merge --format json'],
96
+ expected: 'The owning reviewer confirms the change or records the accepted risk.',
97
+ };
98
+ }
99
+ function whyFirst(priority, source, detail) {
100
+ if (priority === 'p0')
101
+ return `First because this is the highest-priority blocking signal from ${source}: ${detail}`;
102
+ if (priority === 'p1')
103
+ return `First because this is the highest-priority review signal from ${source}: ${detail}`;
104
+ return `First because it is the next useful verification step from ${source}: ${detail}`;
105
+ }
106
+ function slug(value) {
107
+ return value.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '').slice(0, 60) || 'item';
108
+ }
109
+ //# sourceMappingURL=fixFirst.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixFirst.js","sourceRoot":"","sources":["../../src/core/fixFirst.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,4 @@
1
1
  export declare const FRAMEWORK_REQUEST_SOURCES: string[];
2
- export declare function frameworkRequestSourceForFunction(file: string, functionName: string, memberCallSites: string[], parameters: string[], enabledSources: Set<string>): string | null;
2
+ export declare function frameworkRequestSourceForFunction(file: string, functionName: string, memberCallSites: string[], parameters: string[], enabledSources: Set<string>, references?: string[], contextualCallSite?: string, imports?: Array<{
3
+ source: string;
4
+ }>): string | null;
@@ -4,9 +4,27 @@ const NEXT_ROUTE_SOURCE_BY_CALLEE = new Map([
4
4
  ['text', 'request.text'],
5
5
  ['arrayBuffer', 'request.arrayBuffer'],
6
6
  ]);
7
+ const EXPRESS_REQUEST_SOURCE_BY_REFERENCE = new Map([
8
+ ['body', 'express.req.body'],
9
+ ['query', 'express.req.query'],
10
+ ['params', 'express.req.params'],
11
+ ['headers', 'express.req.headers'],
12
+ ['cookies', 'express.req.cookies'],
13
+ ]);
7
14
  const NEXT_ROUTE_HANDLERS = new Set(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS']);
8
- export const FRAMEWORK_REQUEST_SOURCES = [...NEXT_ROUTE_SOURCE_BY_CALLEE.values()];
9
- export function frameworkRequestSourceForFunction(file, functionName, memberCallSites, parameters, enabledSources) {
15
+ const EXPRESS_REQUEST_PARAM_NAMES = new Set(['req', 'request']);
16
+ const EXPRESS_HANDLER_METHODS = new Set(['all', 'delete', 'get', 'head', 'options', 'patch', 'post', 'put', 'use']);
17
+ export const FRAMEWORK_REQUEST_SOURCES = [
18
+ ...NEXT_ROUTE_SOURCE_BY_CALLEE.values(),
19
+ ...EXPRESS_REQUEST_SOURCE_BY_REFERENCE.values(),
20
+ ];
21
+ export function frameworkRequestSourceForFunction(file, functionName, memberCallSites, parameters, enabledSources, references = [], contextualCallSite, imports = []) {
22
+ const nextSource = nextRouteRequestSource(file, functionName, memberCallSites, parameters, enabledSources);
23
+ if (nextSource)
24
+ return nextSource;
25
+ return expressRequestSource(parameters, references, enabledSources, contextualCallSite, imports);
26
+ }
27
+ function nextRouteRequestSource(file, functionName, memberCallSites, parameters, enabledSources) {
10
28
  if (!isNextRouteHandler(file, functionName))
11
29
  return null;
12
30
  if (parameters.length === 0 || memberCallSites.length === 0)
@@ -14,12 +32,35 @@ export function frameworkRequestSourceForFunction(file, functionName, memberCall
14
32
  const members = new Set(memberCallSites);
15
33
  for (const parameter of parameters) {
16
34
  for (const [callee, source] of NEXT_ROUTE_SOURCE_BY_CALLEE) {
17
- if (enabledSources.has(source) && members.has(`${parameter}.${callee}`))
35
+ if (enabledSources.has(source) && members.has(parameter + '.' + callee))
18
36
  return source;
19
37
  }
20
38
  }
21
39
  return null;
22
40
  }
41
+ function expressRequestSource(parameters, references, enabledSources, contextualCallSite, imports) {
42
+ if (!isExpressFile(imports))
43
+ return null;
44
+ if (!isExpressHandlerCall(contextualCallSite))
45
+ return null;
46
+ if (!parameters.some((parameter) => EXPRESS_REQUEST_PARAM_NAMES.has(parameter)))
47
+ return null;
48
+ const refs = new Set(references);
49
+ for (const [reference, source] of EXPRESS_REQUEST_SOURCE_BY_REFERENCE) {
50
+ if (enabledSources.has(source) && refs.has(reference))
51
+ return source;
52
+ }
53
+ return null;
54
+ }
55
+ function isExpressFile(imports) {
56
+ return imports.some((imp) => imp.source === 'express');
57
+ }
58
+ function isExpressHandlerCall(contextualCallSite) {
59
+ if (!contextualCallSite)
60
+ return false;
61
+ const method = bareName(contextualCallSite);
62
+ return EXPRESS_HANDLER_METHODS.has(method);
63
+ }
23
64
  function isNextRouteHandler(file, functionName) {
24
65
  if (!NEXT_ROUTE_HANDLERS.has(bareName(functionName)))
25
66
  return false;
@@ -1 +1 @@
1
- {"version":3,"file":"frameworkSources.js","sourceRoot":"","sources":["../../src/core/frameworkSources.ts"],"names":[],"mappings":"AAAA,MAAM,2BAA2B,GAAG,IAAI,GAAG,CAAiB;IAC1D,CAAC,MAAM,EAAE,cAAc,CAAC;IACxB,CAAC,UAAU,EAAE,kBAAkB,CAAC;IAChC,CAAC,MAAM,EAAE,cAAc,CAAC;IACxB,CAAC,aAAa,EAAE,qBAAqB,CAAC;CACvC,CAAC,CAAC;AAEH,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;AAElG,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,GAAG,2BAA2B,CAAC,MAAM,EAAE,CAAC,CAAC;AAEnF,MAAM,UAAU,iCAAiC,CAC/C,IAAY,EACZ,YAAoB,EACpB,eAAyB,EACzB,UAAoB,EACpB,cAA2B;IAE3B,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IACzD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEzE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,CAAC;IACzC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,2BAA2B,EAAE,CAAC;YAC3D,IAAI,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,IAAI,MAAM,EAAE,CAAC;gBAAE,OAAO,MAAM,CAAC;QACzF,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY,EAAE,YAAoB;IAC5D,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACnE,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC5C,OAAO,iEAAiE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AAC5F,CAAC;AAED,SAAS,QAAQ,CAAC,SAAiB;IACjC,MAAM,GAAG,GAAG,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACvC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AACxD,CAAC"}
1
+ {"version":3,"file":"frameworkSources.js","sourceRoot":"","sources":["../../src/core/frameworkSources.ts"],"names":[],"mappings":"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"}
@@ -13,7 +13,11 @@ const CACHE_FILE = 'graph.json';
13
13
  // v6: added receiver-sensitive `memberCallSites` and `parameters` for
14
14
  // framework request-source precision. v5 caches are rebuilt so route
15
15
  // handlers do not fall back to ambiguous bare member names.
16
- const CACHE_VERSION = 6;
16
+ // v7: added optional `contextualCallSite` so Express callback handlers can
17
+ // be distinguished from ordinary req-shaped helpers.
18
+ // v8: added `directCallSites` and `memberAliases` so bare imported DB
19
+ // helpers stay visible without treating cache.query() as a raw SQL sink.
20
+ const CACHE_VERSION = 8;
17
21
  /**
18
22
  * Load a previously cached code graph, if present and valid. Returns undefined
19
23
  * when there's no cache or the cache is incompatible - caller should rebuild.
@@ -1 +1 @@
1
- {"version":3,"file":"indexCache.js","sourceRoot":"","sources":["../../src/core/indexCache.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"indexCache.js","sourceRoot":"","sources":["../../src/core/indexCache.ts"],"names":[],"mappings":"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"}