projscan 3.0.3 → 3.0.5

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 (81) hide show
  1. package/README.md +54 -27
  2. package/dist/cli/commands/dogfood.d.ts +1 -0
  3. package/dist/cli/commands/dogfood.js +62 -0
  4. package/dist/cli/commands/dogfood.js.map +1 -0
  5. package/dist/cli/commands/evidencePack.js +6 -0
  6. package/dist/cli/commands/evidencePack.js.map +1 -1
  7. package/dist/cli/commands/init.js +143 -1
  8. package/dist/cli/commands/init.js.map +1 -1
  9. package/dist/cli/commands/mcp.js +67 -3
  10. package/dist/cli/commands/mcp.js.map +1 -1
  11. package/dist/cli/commands/start.d.ts +1 -0
  12. package/dist/cli/commands/start.js +86 -0
  13. package/dist/cli/commands/start.js.map +1 -0
  14. package/dist/cli/commands/workplan.js +17 -11
  15. package/dist/cli/commands/workplan.js.map +1 -1
  16. package/dist/cli/index.js +4 -0
  17. package/dist/cli/index.js.map +1 -1
  18. package/dist/core/adoption.d.ts +86 -0
  19. package/dist/core/adoption.js +463 -0
  20. package/dist/core/adoption.js.map +1 -1
  21. package/dist/core/ast.d.ts +6 -0
  22. package/dist/core/ast.js +59 -11
  23. package/dist/core/ast.js.map +1 -1
  24. package/dist/core/bugHunt.js +19 -7
  25. package/dist/core/bugHunt.js.map +1 -1
  26. package/dist/core/dataflow.js +98 -9
  27. package/dist/core/dataflow.js.map +1 -1
  28. package/dist/core/dogfood.d.ts +6 -0
  29. package/dist/core/dogfood.js +116 -0
  30. package/dist/core/dogfood.js.map +1 -0
  31. package/dist/core/fixFirst.d.ts +8 -0
  32. package/dist/core/fixFirst.js +109 -0
  33. package/dist/core/fixFirst.js.map +1 -0
  34. package/dist/core/frameworkSources.d.ts +3 -1
  35. package/dist/core/frameworkSources.js +44 -3
  36. package/dist/core/frameworkSources.js.map +1 -1
  37. package/dist/core/indexCache.js +5 -1
  38. package/dist/core/indexCache.js.map +1 -1
  39. package/dist/core/preflight.js +32 -7
  40. package/dist/core/preflight.js.map +1 -1
  41. package/dist/core/qualityScorecard.js +5 -1
  42. package/dist/core/qualityScorecard.js.map +1 -1
  43. package/dist/core/releaseEvidence.d.ts +6 -1
  44. package/dist/core/releaseEvidence.js +478 -10
  45. package/dist/core/releaseEvidence.js.map +1 -1
  46. package/dist/core/start.d.ts +8 -0
  47. package/dist/core/start.js +193 -0
  48. package/dist/core/start.js.map +1 -0
  49. package/dist/core/taint.js +89 -9
  50. package/dist/core/taint.js.map +1 -1
  51. package/dist/core/workplan.d.ts +2 -1
  52. package/dist/core/workplan.js +80 -3
  53. package/dist/core/workplan.js.map +1 -1
  54. package/dist/index.d.ts +7 -5
  55. package/dist/index.js +5 -3
  56. package/dist/index.js.map +1 -1
  57. package/dist/mcp/tools/adoption.js +7 -3
  58. package/dist/mcp/tools/adoption.js.map +1 -1
  59. package/dist/mcp/tools/evidencePack.js +5 -0
  60. package/dist/mcp/tools/evidencePack.js.map +1 -1
  61. package/dist/mcp/tools/start.d.ts +2 -0
  62. package/dist/mcp/tools/start.js +58 -0
  63. package/dist/mcp/tools/start.js.map +1 -0
  64. package/dist/mcp/tools.js +2 -0
  65. package/dist/mcp/tools.js.map +1 -1
  66. package/dist/projscan-sbom.cdx.json +6 -6
  67. package/dist/tool-manifest.json +48 -5
  68. package/dist/types.d.ts +188 -0
  69. package/dist/utils/baseline.js +62 -1
  70. package/dist/utils/baseline.js.map +1 -1
  71. package/dist/utils/formatSupport.d.ts +6 -0
  72. package/dist/utils/formatSupport.js +6 -0
  73. package/dist/utils/formatSupport.js.map +1 -1
  74. package/docs/PLUGIN-GALLERY.md +25 -0
  75. package/docs/examples/plugins/api-route-ownership.mjs +60 -0
  76. package/docs/examples/plugins/api-route-ownership.projscan-plugin.json +8 -0
  77. package/docs/examples/plugins/monorepo-boundary.mjs +37 -0
  78. package/docs/examples/plugins/monorepo-boundary.projscan-plugin.json +8 -0
  79. package/docs/examples/plugins/security-sensitive-files.mjs +18 -0
  80. package/docs/examples/plugins/security-sensitive-files.projscan-plugin.json +8 -0
  81. package/package.json +2 -2
@@ -17,6 +17,7 @@ export function baselineFromIssues(issues, hotspotReport) {
17
17
  grade,
18
18
  issues: issues.map((i) => ({ id: i.id, title: i.title, severity: i.severity })),
19
19
  hotspots,
20
+ issueRuleCounts: countIssuesById(issues),
20
21
  timestamp: new Date().toISOString(),
21
22
  };
22
23
  }
@@ -42,13 +43,15 @@ export function computeDiff(before, currentIssues, currentHotspots) {
42
43
  .filter((i) => !afterTitles.has(i.title))
43
44
  .map((i) => i.title);
44
45
  const hotspotDiff = before.hotspots && after.hotspots ? diffHotspots(before.hotspots, after.hotspots) : undefined;
46
+ const scoreDelta = after.score - before.score;
45
47
  return {
46
48
  before,
47
49
  after,
48
- scoreDelta: after.score - before.score,
50
+ scoreDelta,
49
51
  newIssues,
50
52
  resolvedIssues,
51
53
  hotspotDiff,
54
+ trend: buildTrend(scoreDelta, before, after, hotspotDiff, newIssues, resolvedIssues),
52
55
  };
53
56
  }
54
57
  function diffHotspots(before, after) {
@@ -103,6 +106,64 @@ function diffHotspots(before, after) {
103
106
  resolved.sort((a, b) => (b.beforeScore ?? 0) - (a.beforeScore ?? 0));
104
107
  return { rose, fell, appeared, resolved };
105
108
  }
109
+ function buildTrend(scoreDelta, before, after, hotspotDiff, newIssues, resolvedIssues) {
110
+ const roundedDelta = round1(scoreDelta);
111
+ const riskDelta = round1(-scoreDelta);
112
+ const recurringNoisyRules = recurringRules(before.issueRuleCounts ?? countBaselineIssuesById(before), after.issueRuleCounts ?? countBaselineIssuesById(after));
113
+ const newHotspots = (hotspotDiff?.appeared ?? []).map((entry) => entry.relativePath).slice(0, 5);
114
+ const scoreDirection = roundedDelta > 0 ? 'up' : roundedDelta < 0 ? 'down' : 'flat';
115
+ const riskDirection = riskDelta > 0 ? 'up' : riskDelta < 0 ? 'down' : 'flat';
116
+ const changedSinceBaseline = buildChangedSinceBaseline(newIssues, resolvedIssues, newHotspots, recurringNoisyRules);
117
+ const summary = [
118
+ `score ${scoreDirection}${roundedDelta === 0 ? '' : ` ${roundedDelta > 0 ? '+' : ''}${roundedDelta}`}`,
119
+ `risk ${riskDirection}${riskDelta === 0 ? '' : ` ${riskDelta > 0 ? '+' : ''}${riskDelta}`}`,
120
+ newHotspots.length > 0 ? `${newHotspots.length} new hotspot(s)` : 'no new hotspots',
121
+ recurringNoisyRules.length > 0 ? `${recurringNoisyRules.length} recurring noisy rule(s)` : 'no recurring noisy rules',
122
+ ].join('; ');
123
+ return {
124
+ scoreDirection,
125
+ scoreDelta: roundedDelta,
126
+ riskDirection,
127
+ riskDelta,
128
+ qualityScoreBefore: before.score,
129
+ qualityScoreAfter: after.score,
130
+ newIssueCount: newIssues.length,
131
+ resolvedIssueCount: resolvedIssues.length,
132
+ changedSinceBaseline,
133
+ newHotspots,
134
+ recurringNoisyRules,
135
+ summary,
136
+ };
137
+ }
138
+ function buildChangedSinceBaseline(newIssues, resolvedIssues, newHotspots, recurringNoisyRules) {
139
+ const changes = [];
140
+ changes.push(newIssues.length > 0 ? `${newIssues.length} new issue(s): ${newIssues.slice(0, 3).join('; ')}` : '0 new issues');
141
+ changes.push(resolvedIssues.length > 0 ? `${resolvedIssues.length} resolved issue(s): ${resolvedIssues.slice(0, 3).join('; ')}` : '0 resolved issues');
142
+ changes.push(newHotspots.length > 0 ? `new hotspot(s): ${newHotspots.join(', ')}` : 'no new hotspots');
143
+ if (recurringNoisyRules.length > 0) {
144
+ changes.push(`recurring noisy rule(s): ${recurringNoisyRules.map((rule) => `${rule.id} ${rule.before}->${rule.after}`).join(', ')}`);
145
+ }
146
+ return changes.slice(0, 5);
147
+ }
148
+ function countIssuesById(issues) {
149
+ const counts = {};
150
+ for (const issue of issues)
151
+ counts[issue.id] = (counts[issue.id] ?? 0) + 1;
152
+ return counts;
153
+ }
154
+ function countBaselineIssuesById(baseline) {
155
+ const counts = {};
156
+ for (const issue of baseline.issues)
157
+ counts[issue.id] = (counts[issue.id] ?? 0) + 1;
158
+ return counts;
159
+ }
160
+ function recurringRules(before, after) {
161
+ return Object.keys(before)
162
+ .filter((id) => before[id] > 0 && (after[id] ?? 0) > 0)
163
+ .map((id) => ({ id, before: before[id], after: after[id] ?? 0 }))
164
+ .sort((a, b) => b.after - a.after || b.before - a.before || a.id.localeCompare(b.id))
165
+ .slice(0, 5);
166
+ }
106
167
  function round1(n) {
107
168
  return Math.round(n * 10) / 10;
108
169
  }
@@ -1 +1 @@
1
- {"version":3,"file":"baseline.js","sourceRoot":"","sources":["../../src/utils/baseline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAU7B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,gBAAgB,GAAG,yBAAyB,CAAC;AACnD,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAElC,MAAM,UAAU,kBAAkB,CAAC,MAAe,EAAE,aAA6B;IAC/E,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,QAAQ,GACZ,aAAa,IAAI,aAAa,CAAC,SAAS;QACtC,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,sBAAsB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAClE,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,KAAK,EAAE,CAAC,CAAC,KAAK;SACf,CAAC,CAAC;QACL,CAAC,CAAC,SAAS,CAAC;IAEhB,OAAO;QACL,KAAK;QACL,KAAK;QACL,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC/E,QAAQ;QACR,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAgB,EAChB,MAAe,EACf,aAA6B;IAE7B,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IACvD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IAChF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAiB,EAAE,QAAiB;IACrE,MAAM,YAAY,GAAG,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC,CAAC;IACxF,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACzD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAa,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,MAAgB,EAChB,aAAsB,EACtB,eAA+B;IAE/B,MAAM,KAAK,GAAG,kBAAkB,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;IAEjE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAChE,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAE9D,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM;SAC3B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;SACzC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAEvB,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM;SACjC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;SACxC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAEvB,MAAM,WAAW,GACf,MAAM,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEhG,OAAO;QACL,MAAM;QACN,KAAK;QACL,UAAU,EAAE,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK;QACtC,SAAS;QACT,cAAc;QACd,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,MAAyB,EAAE,KAAwB;IACvE,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEhE,MAAM,IAAI,GAAmB,EAAE,CAAC;IAChC,MAAM,IAAI,GAAmB,EAAE,CAAC;IAChC,MAAM,QAAQ,GAAmB,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAmB,EAAE,CAAC;IAEpC,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,QAAQ,EAAE,CAAC;QAC1C,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,QAAQ,CAAC,IAAI,CAAC;gBACZ,YAAY,EAAE,IAAI;gBAClB,WAAW,EAAE,IAAI;gBACjB,UAAU,EAAE,UAAU,CAAC,SAAS;gBAChC,UAAU,EAAE,UAAU,CAAC,SAAS;aACjC,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;QACnE,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,IAAI,CAAC,IAAI,CAAC;gBACR,YAAY,EAAE,IAAI;gBAClB,WAAW,EAAE,WAAW,CAAC,SAAS;gBAClC,UAAU,EAAE,UAAU,CAAC,SAAS;gBAChC,UAAU,EAAE,KAAK;aAClB,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC,IAAI,CAAC;gBACR,YAAY,EAAE,IAAI;gBAClB,WAAW,EAAE,WAAW,CAAC,SAAS;gBAClC,UAAU,EAAE,UAAU,CAAC,SAAS;gBAChC,UAAU,EAAE,KAAK;aAClB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,SAAS,EAAE,CAAC;QAC5C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,QAAQ,CAAC,IAAI,CAAC;gBACZ,YAAY,EAAE,IAAI;gBAClB,WAAW,EAAE,WAAW,CAAC,SAAS;gBAClC,UAAU,EAAE,IAAI;gBAChB,UAAU,EAAE,MAAM,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC;aAC3C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;IACjD,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;IACjD,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC;IACnE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC,CAAC;IAErE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAC5C,CAAC;AAED,SAAS,MAAM,CAAC,CAAS;IACvB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;AACjC,CAAC"}
1
+ {"version":3,"file":"baseline.js","sourceRoot":"","sources":["../../src/utils/baseline.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,7 @@ export declare const COMMAND_FORMAT_SUPPORT: {
15
15
  readonly diagram: readonly ["console", "json", "markdown"];
16
16
  readonly diff: readonly ["console", "json", "markdown"];
17
17
  readonly doctor: readonly ["console", "json", "markdown", "sarif", "html"];
18
+ readonly dogfood: readonly ["console", "json"];
18
19
  readonly 'evidence-pack': readonly ["console", "json"];
19
20
  readonly explain: readonly ["console", "json", "markdown"];
20
21
  readonly 'explain-issue': readonly ["console", "json", "markdown"];
@@ -27,9 +28,13 @@ export declare const COMMAND_FORMAT_SUPPORT: {
27
28
  readonly hotspots: readonly ["console", "json", "markdown", "html"];
28
29
  readonly impact: readonly ["console", "json", "markdown", "html"];
29
30
  readonly init: readonly ["console"];
31
+ readonly 'init github-action': readonly ["console", "json"];
30
32
  readonly 'init mcp': readonly ["console", "json"];
33
+ readonly 'init policy': readonly ["console", "json"];
34
+ readonly 'init team': readonly ["console", "json"];
31
35
  readonly 'install-hook': readonly ["console"];
32
36
  readonly mcp: readonly ["console"];
37
+ readonly 'mcp doctor': readonly ["console", "json"];
33
38
  readonly memory: readonly ["console", "json"];
34
39
  readonly 'memory stable': readonly ["console", "json"];
35
40
  readonly 'memory runs': readonly ["console", "json"];
@@ -49,6 +54,7 @@ export declare const COMMAND_FORMAT_SUPPORT: {
49
54
  readonly search: readonly ["console", "json", "markdown"];
50
55
  readonly 'semantic-graph': readonly ["console", "json"];
51
56
  readonly session: readonly ["console", "json"];
57
+ readonly start: readonly ["console", "json"];
52
58
  readonly 'session touched': readonly ["console", "json"];
53
59
  readonly 'session events': readonly ["console", "json"];
54
60
  readonly 'session reset': readonly ["console", "json"];
@@ -14,6 +14,7 @@ export const COMMAND_FORMAT_SUPPORT = {
14
14
  diagram: ['console', 'json', 'markdown'],
15
15
  diff: ['console', 'json', 'markdown'],
16
16
  doctor: ['console', 'json', 'markdown', 'sarif', 'html'],
17
+ dogfood: ['console', 'json'],
17
18
  'evidence-pack': ['console', 'json'],
18
19
  explain: ['console', 'json', 'markdown'],
19
20
  'explain-issue': ['console', 'json', 'markdown'],
@@ -26,9 +27,13 @@ export const COMMAND_FORMAT_SUPPORT = {
26
27
  hotspots: ['console', 'json', 'markdown', 'html'],
27
28
  impact: ['console', 'json', 'markdown', 'html'],
28
29
  init: ['console'],
30
+ 'init github-action': ['console', 'json'],
29
31
  'init mcp': ['console', 'json'],
32
+ 'init policy': ['console', 'json'],
33
+ 'init team': ['console', 'json'],
30
34
  'install-hook': ['console'],
31
35
  mcp: ['console'],
36
+ 'mcp doctor': ['console', 'json'],
32
37
  memory: ['console', 'json'],
33
38
  'memory stable': ['console', 'json'],
34
39
  'memory runs': ['console', 'json'],
@@ -48,6 +53,7 @@ export const COMMAND_FORMAT_SUPPORT = {
48
53
  search: ['console', 'json', 'markdown'],
49
54
  'semantic-graph': ['console', 'json'],
50
55
  session: ['console', 'json'],
56
+ start: ['console', 'json'],
51
57
  'session touched': ['console', 'json'],
52
58
  'session events': ['console', 'json'],
53
59
  'session reset': ['console', 'json'],
@@ -1 +1 @@
1
- {"version":3,"file":"formatSupport.js","sourceRoot":"","sources":["../../src/utils/formatSupport.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"formatSupport.js","sourceRoot":"","sources":["../../src/utils/formatSupport.ts"],"names":[],"mappings":"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"}
@@ -40,6 +40,31 @@ Files:
40
40
  - `docs/examples/plugins/graph-context.projscan-plugin.json`
41
41
  - `docs/examples/plugins/graph-context.mjs`
42
42
 
43
+
44
+ ### `api-route-ownership`
45
+
46
+ Flags API route files that are not covered by CODEOWNERS-style routing, so PRs that change externally visible routes get a clear team owner.
47
+
48
+ Files:
49
+ - `docs/examples/plugins/api-route-ownership.projscan-plugin.json`
50
+ - `docs/examples/plugins/api-route-ownership.mjs`
51
+
52
+ ### `security-sensitive-files`
53
+
54
+ Highlights auth, crypto, secrets, payment, middleware, and environment-related paths for explicit security-conscious review.
55
+
56
+ Files:
57
+ - `docs/examples/plugins/security-sensitive-files.projscan-plugin.json`
58
+ - `docs/examples/plugins/security-sensitive-files.mjs`
59
+
60
+ ### `monorepo-boundary`
61
+
62
+ Flags package source files that reach across monorepo boundaries with deep relative imports instead of package entrypoints or declared workspace dependencies.
63
+
64
+ Files:
65
+ - `docs/examples/plugins/monorepo-boundary.projscan-plugin.json`
66
+ - `docs/examples/plugins/monorepo-boundary.mjs`
67
+
43
68
  ## Reporter Plugins
44
69
 
45
70
  ### `team-radar`
@@ -0,0 +1,60 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+
4
+ const API_ROUTE = /(^|\/)(app\/api|pages\/api|src\/api|api)\//;
5
+
6
+ export default {
7
+ check: async (rootPath, files) => {
8
+ const ownership = await loadCodeowners(rootPath);
9
+ const issues = [];
10
+
11
+ for (const file of files) {
12
+ if (!API_ROUTE.test(file.relativePath)) continue;
13
+ if (ownership(file.relativePath)) continue;
14
+ issues.push({
15
+ id: 'api-route-missing-owner',
16
+ title: 'API route needs an explicit owner',
17
+ description: `${file.relativePath} is an API route but no CODEOWNERS rule routes review for it. Add an owner before the route grows or changes contract.`,
18
+ severity: 'warning',
19
+ category: 'ownership',
20
+ fixAvailable: false,
21
+ locations: [{ file: file.relativePath, line: 1 }],
22
+ });
23
+ }
24
+
25
+ return issues;
26
+ },
27
+ };
28
+
29
+ async function loadCodeowners(rootPath) {
30
+ for (const candidate of ['.github/CODEOWNERS', 'CODEOWNERS', 'docs/CODEOWNERS']) {
31
+ try {
32
+ const content = await fs.readFile(path.join(rootPath, candidate), 'utf-8');
33
+ const rules = content
34
+ .split(/\r?\n/)
35
+ .map((line) => line.trim())
36
+ .filter((line) => line && !line.startsWith('#'))
37
+ .map((line) => line.split(/\s+/)[0])
38
+ .filter(Boolean);
39
+ return (relativePath) => rules.some((rule) => matches(rule, relativePath));
40
+ } catch {
41
+ // Try next candidate.
42
+ }
43
+ }
44
+ return () => false;
45
+ }
46
+
47
+ function matches(pattern, relativePath) {
48
+ const normalized = pattern.replace(/^\/+/, '');
49
+ if (normalized === '*') return true;
50
+ if (normalized.endsWith('/')) return relativePath.startsWith(normalized);
51
+ const escaped = normalized
52
+ .split('**')
53
+ .map((part) => part.split('*').map(escapeRegExp).join('[^/]*'))
54
+ .join('.*');
55
+ return new RegExp(`^${escaped}$`).test(relativePath);
56
+ }
57
+
58
+ function escapeRegExp(value) {
59
+ return value.replace(/[.+?^${}()|[\]\\]/g, '\\$&');
60
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "name": "api-route-ownership",
4
+ "kind": "analyzer",
5
+ "module": "./api-route-ownership.mjs",
6
+ "category": "ownership",
7
+ "description": "Flags API routes that are not covered by CODEOWNERS-style routing"
8
+ }
@@ -0,0 +1,37 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+
4
+ const PACKAGE_FILE = /^packages\/([^/]+)\/(src|lib)\/.+\.(m?[jt]sx?|cts|mts)$/;
5
+ const IMPORT_SOURCE = /(?:from\s+['"]([^'"]+)['"]|require\(['"]([^'"]+)['"]\))/g;
6
+
7
+ export default {
8
+ check: async (rootPath, files) => {
9
+ const issues = [];
10
+
11
+ for (const file of files) {
12
+ const match = file.relativePath.match(PACKAGE_FILE);
13
+ if (!match) continue;
14
+ let content = '';
15
+ try {
16
+ content = await fs.readFile(path.join(rootPath, file.relativePath), 'utf-8');
17
+ } catch {
18
+ continue;
19
+ }
20
+ for (const importMatch of content.matchAll(IMPORT_SOURCE)) {
21
+ const specifier = importMatch[1] ?? importMatch[2] ?? '';
22
+ if (!specifier.startsWith('../..')) continue;
23
+ issues.push({
24
+ id: 'monorepo-deep-relative-boundary',
25
+ title: 'Package crosses a monorepo boundary with a deep relative import',
26
+ description: `${file.relativePath} imports ${specifier}. Prefer the package entrypoint or a declared workspace dependency so ownership and impact stay visible.`,
27
+ severity: 'warning',
28
+ category: 'architecture',
29
+ fixAvailable: false,
30
+ locations: [{ file: file.relativePath, line: 1 }],
31
+ });
32
+ }
33
+ }
34
+
35
+ return issues.slice(0, 25);
36
+ },
37
+ };
@@ -0,0 +1,8 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "name": "monorepo-boundary",
4
+ "kind": "analyzer",
5
+ "module": "./monorepo-boundary.mjs",
6
+ "category": "architecture",
7
+ "description": "Flags package code that reaches across monorepo boundaries with deep relative imports"
8
+ }
@@ -0,0 +1,18 @@
1
+ const SECURITY_SENSITIVE = /(^|\/)(auth|crypto|security|secrets?|payments?|billing|middleware)(\/|\.)|\.env(\.|$)|(^|\/)server\.ts$/i;
2
+
3
+ export default {
4
+ check: async (_rootPath, files) => {
5
+ return files
6
+ .filter((file) => SECURITY_SENSITIVE.test(file.relativePath))
7
+ .slice(0, 25)
8
+ .map((file) => ({
9
+ id: 'security-sensitive-review',
10
+ title: 'Security-sensitive file needs explicit review',
11
+ description: `${file.relativePath} matches a security-sensitive path. Route it to the right owner and verify tests or threat-model notes before merge.`,
12
+ severity: 'warning',
13
+ category: 'security',
14
+ fixAvailable: false,
15
+ locations: [{ file: file.relativePath, line: 1 }],
16
+ }));
17
+ },
18
+ };
@@ -0,0 +1,8 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "name": "security-sensitive-files",
4
+ "kind": "analyzer",
5
+ "module": "./security-sensitive-files.mjs",
6
+ "category": "security",
7
+ "description": "Highlights files that should get security-conscious review"
8
+ }
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "projscan",
3
3
  "mcpName": "io.github.abhiyoheswaran1/projscan",
4
- "version": "3.0.3",
5
- "description": "Agent-first code intelligence. MCP server (2025-03-26) with AST parsing for JavaScript, TypeScript, Python, Go, Java, Ruby, Rust, PHP, C#, Kotlin, Swift, and C++; stable v3 semantic graph (projscan_semantic_graph), dataflow risk engine with bridge-helper detection (projscan_dataflow), code graph, file + per-function AST cyclomatic complexity, per-function fan-in + fan-out, coupling + cycle detection, structural PR diff with HTML reporter, coverage report with HTML reporter, intent-grounded one-call PR review (projscan_review with optional `intent` arg, new taint flows, contract changes, and newDataflowRisks) and long-running PR-watch mode with structured per-bucket deltas (projscan_review_watch), agent workplans (projscan_workplan), bug-hunt queues (projscan_bug_hunt), product-line planning (projscan_release_train), evidence packs (projscan_evidence_pack), regression planning (projscan_regression_plan), agent briefs (projscan_agent_brief), quality scorecards (projscan_quality_scorecard), and preflight with supply-chain IOC evidence, rule-driven fix suggestions + mechanical apply layer with rollback (projscan_apply_fix, projscan_fix_suggest, projscan_explain_issue), source-to-sink taint analysis (projscan_taint) with truncation reporting, transitive blast-radius analysis with cross-repo mode (projscan_impact for files and symbols), cross-repo workspace registration + intelligence (projscan_workspace_graph), per-function semantic search chunks (sub-file embeddings), per-rule confidence + severity drift + cost-summary analytics with live streaming (projscan_cost_summary), stable local analyzer + reporter plugin API (projscan_plugin, CLI --reporter, opt-in via PROJSCAN_PLUGINS_PREVIEW=1), monorepo workspace awareness with cross-package import policy + per-package dependencies / outdated / audit, BM25 + optional semantic search, cursor pagination, progress notifications, context-budgeted output, and a stable-surface CI guard. CLI on the side.",
4
+ "version": "3.0.5",
5
+ "description": "Agent-first code intelligence. MCP server (2025-03-26) with AST parsing for JavaScript, TypeScript, Python, Go, Java, Ruby, Rust, PHP, C#, Kotlin, Swift, and C++; stable v3 semantic graph (projscan_semantic_graph), dataflow risk engine with bridge-helper detection (projscan_dataflow), code graph, file + per-function AST cyclomatic complexity, per-function fan-in + fan-out, coupling + cycle detection, structural PR diff with HTML reporter, coverage report with HTML reporter, intent-grounded one-call PR review (projscan_review with optional `intent` arg, new taint flows, contract changes, and newDataflowRisks) and long-running PR-watch mode with structured per-bucket deltas (projscan_review_watch), first-60-seconds workflow orientation (projscan_start), agent workplans (projscan_workplan), bug-hunt queues (projscan_bug_hunt), product-line planning (projscan_release_train), evidence packs (projscan_evidence_pack), regression planning (projscan_regression_plan), agent briefs (projscan_agent_brief), quality scorecards (projscan_quality_scorecard), and preflight with supply-chain IOC evidence, rule-driven fix suggestions + mechanical apply layer with rollback (projscan_apply_fix, projscan_fix_suggest, projscan_explain_issue), source-to-sink taint analysis (projscan_taint) with truncation reporting, transitive blast-radius analysis with cross-repo mode (projscan_impact for files and symbols), cross-repo workspace registration + intelligence (projscan_workspace_graph), per-function semantic search chunks (sub-file embeddings), per-rule confidence + severity drift + cost-summary analytics with live streaming (projscan_cost_summary), stable local analyzer + reporter plugin API (projscan_plugin, CLI --reporter, opt-in via PROJSCAN_PLUGINS_PREVIEW=1), monorepo workspace awareness with cross-package import policy + per-package dependencies / outdated / audit, BM25 + optional semantic search, cursor pagination, progress notifications, context-budgeted output, and a stable-surface CI guard. CLI on the side.",
6
6
  "type": "module",
7
7
  "main": "./dist/index.js",
8
8
  "types": "./dist/index.d.ts",