projscan 3.0.3 → 3.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/README.md +39 -25
  2. package/dist/cli/commands/evidencePack.js +6 -0
  3. package/dist/cli/commands/evidencePack.js.map +1 -1
  4. package/dist/cli/commands/init.js +143 -1
  5. package/dist/cli/commands/init.js.map +1 -1
  6. package/dist/cli/commands/mcp.js +67 -3
  7. package/dist/cli/commands/mcp.js.map +1 -1
  8. package/dist/cli/commands/start.d.ts +1 -0
  9. package/dist/cli/commands/start.js +79 -0
  10. package/dist/cli/commands/start.js.map +1 -0
  11. package/dist/cli/commands/workplan.js +17 -11
  12. package/dist/cli/commands/workplan.js.map +1 -1
  13. package/dist/cli/index.js +2 -0
  14. package/dist/cli/index.js.map +1 -1
  15. package/dist/core/adoption.d.ts +86 -0
  16. package/dist/core/adoption.js +441 -0
  17. package/dist/core/adoption.js.map +1 -1
  18. package/dist/core/bugHunt.js +16 -7
  19. package/dist/core/bugHunt.js.map +1 -1
  20. package/dist/core/preflight.js +24 -4
  21. package/dist/core/preflight.js.map +1 -1
  22. package/dist/core/releaseEvidence.d.ts +5 -1
  23. package/dist/core/releaseEvidence.js +332 -4
  24. package/dist/core/releaseEvidence.js.map +1 -1
  25. package/dist/core/start.d.ts +8 -0
  26. package/dist/core/start.js +156 -0
  27. package/dist/core/start.js.map +1 -0
  28. package/dist/core/workplan.d.ts +2 -1
  29. package/dist/core/workplan.js +77 -3
  30. package/dist/core/workplan.js.map +1 -1
  31. package/dist/index.d.ts +6 -5
  32. package/dist/index.js +4 -3
  33. package/dist/index.js.map +1 -1
  34. package/dist/mcp/tools/adoption.js +7 -3
  35. package/dist/mcp/tools/adoption.js.map +1 -1
  36. package/dist/mcp/tools/evidencePack.js +5 -0
  37. package/dist/mcp/tools/evidencePack.js.map +1 -1
  38. package/dist/mcp/tools/start.d.ts +2 -0
  39. package/dist/mcp/tools/start.js +58 -0
  40. package/dist/mcp/tools/start.js.map +1 -0
  41. package/dist/mcp/tools.js +2 -0
  42. package/dist/mcp/tools.js.map +1 -1
  43. package/dist/projscan-sbom.cdx.json +6 -6
  44. package/dist/tool-manifest.json +48 -5
  45. package/dist/types.d.ts +119 -0
  46. package/dist/utils/baseline.js +41 -1
  47. package/dist/utils/baseline.js.map +1 -1
  48. package/dist/utils/formatSupport.d.ts +5 -0
  49. package/dist/utils/formatSupport.js +5 -0
  50. package/dist/utils/formatSupport.js.map +1 -1
  51. package/docs/PLUGIN-GALLERY.md +25 -0
  52. package/docs/examples/plugins/api-route-ownership.mjs +60 -0
  53. package/docs/examples/plugins/api-route-ownership.projscan-plugin.json +8 -0
  54. package/docs/examples/plugins/monorepo-boundary.mjs +37 -0
  55. package/docs/examples/plugins/monorepo-boundary.projscan-plugin.json +8 -0
  56. package/docs/examples/plugins/security-sensitive-files.mjs +18 -0
  57. package/docs/examples/plugins/security-sensitive-files.projscan-plugin.json +8 -0
  58. package/package.json +2 -2
@@ -1,23 +1,23 @@
1
1
  {
2
2
  "bomFormat": "CycloneDX",
3
3
  "specVersion": "1.5",
4
- "serialNumber": "urn:uuid:d0175b29-5bae-42dd-846b-ff89ac180c1b",
4
+ "serialNumber": "urn:uuid:1a427feb-544e-47ba-bccb-cc49703976de",
5
5
  "version": 1,
6
6
  "metadata": {
7
- "timestamp": "2026-05-27T17:24:30.602Z",
7
+ "timestamp": "2026-05-28T07:46:13.401Z",
8
8
  "tools": [
9
9
  {
10
10
  "vendor": "projscan",
11
11
  "name": "projscan-sbom-generator",
12
- "version": "3.0.3"
12
+ "version": "3.0.4"
13
13
  }
14
14
  ],
15
15
  "component": {
16
16
  "type": "application",
17
- "bom-ref": "pkg:npm/projscan@3.0.3",
17
+ "bom-ref": "pkg:npm/projscan@3.0.4",
18
18
  "name": "projscan",
19
- "version": "3.0.3",
20
- "purl": "pkg:npm/projscan@3.0.3"
19
+ "version": "3.0.4",
20
+ "purl": "pkg:npm/projscan@3.0.4"
21
21
  }
22
22
  },
23
23
  "components": [
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "projscan",
3
- "version": "3.0.3",
3
+ "version": "3.0.4",
4
4
  "mcpProtocolVersion": "2025-03-26",
5
- "generatedAt": "2026-05-27T17:24:35.773Z",
6
- "toolCount": 39,
5
+ "generatedAt": "2026-05-28T07:46:18.473Z",
6
+ "toolCount": 40,
7
7
  "tools": [
8
8
  {
9
9
  "name": "projscan_analyze",
@@ -931,6 +931,10 @@
931
931
  "type": "boolean",
932
932
  "description": "Include website-update prompt text in the response."
933
933
  },
934
+ "pr_comment": {
935
+ "type": "boolean",
936
+ "description": "Include a concise GitHub PR comment markdown artifact in the response."
937
+ },
934
938
  "max_findings": {
935
939
  "type": "number",
936
940
  "description": "Maximum bug-hunt findings to include. Default: 10, max: 25."
@@ -1031,13 +1035,52 @@
1031
1035
  "enum": [
1032
1036
  "mcp_config",
1033
1037
  "recipes",
1034
- "first_run"
1038
+ "first_run",
1039
+ "mcp_doctor"
1035
1040
  ],
1036
1041
  "description": "What to return. mcp_config returns client snippets, recipes returns agent workflow recipes, first_run checks setup diagnostics. Default: recipes."
1037
1042
  },
1038
1043
  "client": {
1039
1044
  "type": "string",
1040
- "description": "For action=mcp_config: all, claude-desktop, claude-code, cursor, codex, continue, windsurf, cline, zed, or gemini. Default: all."
1045
+ "description": "For action=mcp_config or action=mcp_doctor: all, claude-desktop, claude-code, cursor, codex, continue, windsurf, cline, zed, or gemini. Default: all."
1046
+ },
1047
+ "max_tokens": {
1048
+ "type": "number",
1049
+ "description": "Cap the response to roughly this many tokens."
1050
+ }
1051
+ }
1052
+ }
1053
+ },
1054
+ {
1055
+ "name": "projscan_start",
1056
+ "description": "First-60-seconds repo orientation for agents and developers. Composes setup diagnostics, workplan, quality scorecard, adoption gaps, top risks, and next commands into one read-only workflow recommendation.",
1057
+ "inputSchema": {
1058
+ "type": "object",
1059
+ "properties": {
1060
+ "mode": {
1061
+ "type": "string",
1062
+ "enum": [
1063
+ "before_edit",
1064
+ "before_commit",
1065
+ "before_merge",
1066
+ "refactor",
1067
+ "release",
1068
+ "bug_hunt",
1069
+ "hardening"
1070
+ ],
1071
+ "description": "Workflow mode to orient around. Default: before_edit."
1072
+ },
1073
+ "max_tasks": {
1074
+ "type": "number",
1075
+ "description": "Maximum workplan tasks to inspect. Default: 5, max: 12."
1076
+ },
1077
+ "max_risks": {
1078
+ "type": "number",
1079
+ "description": "Maximum top risks to return. Default: 5, max: 12."
1080
+ },
1081
+ "include_handoff": {
1082
+ "type": "boolean",
1083
+ "description": "Include a compact handoff payload for the next agent."
1041
1084
  },
1042
1085
  "max_tokens": {
1043
1086
  "type": "number",
package/dist/types.d.ts CHANGED
@@ -318,12 +318,14 @@ export interface WorkplanTask {
318
318
  why: string;
319
319
  evidence: WorkplanEvidence[];
320
320
  files: string[];
321
+ owner?: string;
321
322
  suggestedTools: string[];
322
323
  verification: WorkplanVerification;
323
324
  handoffText: string;
324
325
  }
325
326
  export interface WorkplanTopRisk extends WorkplanEvidence {
326
327
  priority: WorkplanPriority;
328
+ owner?: string;
327
329
  }
328
330
  export interface WorkplanCoordination {
329
331
  touchedFiles: string[];
@@ -423,6 +425,43 @@ export interface EvidencePackArtifact {
423
425
  evidence: string[];
424
426
  commands: string[];
425
427
  }
428
+ export interface EvidencePackTopRisk {
429
+ priority: WorkplanPriority;
430
+ title: string;
431
+ files: string[];
432
+ owner?: string;
433
+ command: string;
434
+ }
435
+ export interface EvidencePackTeamRoute {
436
+ owner: string;
437
+ files: string[];
438
+ reason: string;
439
+ }
440
+ export interface EvidencePackTrustCalibration {
441
+ verdict: 'clean' | 'manual_review' | 'actual_defect';
442
+ summary: string;
443
+ concreteBlockers: string[];
444
+ manualReviewSignals: string[];
445
+ watchSignals: string[];
446
+ }
447
+ export interface EvidencePackPrSummary {
448
+ verdictLabel: string;
449
+ decision: string;
450
+ trust: EvidencePackTrustCalibration;
451
+ topRisks: EvidencePackTopRisk[];
452
+ teamRoutes: EvidencePackTeamRoute[];
453
+ nextCommands: string[];
454
+ baselineTrend?: BaselineTrend;
455
+ }
456
+ export interface EvidencePackPrCommentValidationCheck {
457
+ id: string;
458
+ status: 'pass' | 'warn' | 'fail';
459
+ summary: string;
460
+ }
461
+ export interface EvidencePackPrCommentValidation {
462
+ status: 'pass' | 'warn' | 'fail';
463
+ checks: EvidencePackPrCommentValidationCheck[];
464
+ }
426
465
  export interface EvidencePackReport {
427
466
  schemaVersion: 1;
428
467
  currentVersion: string | null;
@@ -441,6 +480,9 @@ export interface EvidencePackReport {
441
480
  artifacts: EvidencePackArtifact[];
442
481
  changelogEntries: string[];
443
482
  websitePrompt?: string;
483
+ prComment?: string;
484
+ prCommentValidation?: EvidencePackPrCommentValidation;
485
+ prSummary?: EvidencePackPrSummary;
444
486
  suggestedNextActions: PreflightSuggestedAction[];
445
487
  }
446
488
  export type RegressionPlanLevel = 'smoke' | 'focused' | 'full';
@@ -518,6 +560,69 @@ export interface AgentBriefReport {
518
560
  suggestedNextActions: PreflightSuggestedAction[];
519
561
  truncated?: boolean;
520
562
  }
563
+ export interface WorkplanHandoffPayload {
564
+ summary: string;
565
+ verdict: PreflightVerdict;
566
+ mode: WorkplanMode;
567
+ next: string[];
568
+ verificationCommands: string[];
569
+ coordination: WorkplanCoordination;
570
+ markdown: string;
571
+ }
572
+ export interface StartWorkflowRecommendation {
573
+ id: string;
574
+ name: string;
575
+ why: string;
576
+ commands: string[];
577
+ mcpTools: string[];
578
+ }
579
+ export interface StartRisk {
580
+ id: string;
581
+ priority: WorkplanPriority;
582
+ title: string;
583
+ source: string;
584
+ files: string[];
585
+ command: string;
586
+ }
587
+ export interface StartAdoptionGap {
588
+ id: string;
589
+ status: 'info' | 'warn' | 'fail';
590
+ title: string;
591
+ summary: string;
592
+ command?: string;
593
+ }
594
+ export interface StartReport {
595
+ schemaVersion: 1;
596
+ readOnly: true;
597
+ rootPath: string;
598
+ mode: WorkplanMode;
599
+ summary: string;
600
+ setup: {
601
+ overall: 'pass' | 'warn' | 'fail' | 'info';
602
+ diagnostics: Array<{
603
+ id: string;
604
+ label: string;
605
+ status: 'pass' | 'warn' | 'fail' | 'info';
606
+ summary: string;
607
+ detail?: string;
608
+ command?: string;
609
+ }>;
610
+ };
611
+ recommendedWorkflow: StartWorkflowRecommendation;
612
+ evidence: {
613
+ workplanVerdict: PreflightVerdict;
614
+ workplanSummary: string;
615
+ qualityVerdict: QualityScorecardVerdict;
616
+ qualitySummary: string;
617
+ healthScore: number;
618
+ mcpReady: boolean;
619
+ };
620
+ topRisks: StartRisk[];
621
+ adoptionGaps: StartAdoptionGap[];
622
+ nextActions: PreflightSuggestedAction[];
623
+ handoff?: WorkplanHandoffPayload;
624
+ truncated?: boolean;
625
+ }
521
626
  export interface GraphCorpusFixtureMetrics {
522
627
  name: string;
523
628
  fixture: string;
@@ -637,6 +742,7 @@ export interface Baseline {
637
742
  severity: IssueSeverity;
638
743
  }[];
639
744
  hotspots?: BaselineHotspot[];
745
+ issueRuleCounts?: Record<string, number>;
640
746
  timestamp: string;
641
747
  }
642
748
  export interface HotspotDelta {
@@ -651,6 +757,18 @@ export interface HotspotDiffSummary {
651
757
  appeared: HotspotDelta[];
652
758
  resolved: HotspotDelta[];
653
759
  }
760
+ export interface BaselineRecurringRule {
761
+ id: string;
762
+ before: number;
763
+ after: number;
764
+ }
765
+ export interface BaselineTrend {
766
+ scoreDirection: 'up' | 'down' | 'flat';
767
+ scoreDelta: number;
768
+ newHotspots: string[];
769
+ recurringNoisyRules: BaselineRecurringRule[];
770
+ summary: string;
771
+ }
654
772
  export interface DiffResult {
655
773
  before: Baseline;
656
774
  after: Baseline;
@@ -658,6 +776,7 @@ export interface DiffResult {
658
776
  newIssues: string[];
659
777
  resolvedIssues: string[];
660
778
  hotspotDiff?: HotspotDiffSummary;
779
+ trend: BaselineTrend;
661
780
  }
662
781
  export type ReportFormat = 'console' | 'json' | 'markdown' | 'sarif' | 'html';
663
782
  export type SemverDrift = 'patch' | 'minor' | 'major' | 'same' | 'unknown';
@@ -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),
52
55
  };
53
56
  }
54
57
  function diffHotspots(before, after) {
@@ -103,6 +106,43 @@ 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) {
110
+ const roundedDelta = round1(scoreDelta);
111
+ const recurringNoisyRules = recurringRules(before.issueRuleCounts ?? countBaselineIssuesById(before), after.issueRuleCounts ?? countBaselineIssuesById(after));
112
+ const newHotspots = (hotspotDiff?.appeared ?? []).map((entry) => entry.relativePath).slice(0, 5);
113
+ const scoreDirection = roundedDelta > 0 ? 'up' : roundedDelta < 0 ? 'down' : 'flat';
114
+ const summary = [
115
+ `score ${scoreDirection}${roundedDelta === 0 ? '' : ` ${roundedDelta > 0 ? '+' : ''}${roundedDelta}`}`,
116
+ newHotspots.length > 0 ? `${newHotspots.length} new hotspot(s)` : 'no new hotspots',
117
+ recurringNoisyRules.length > 0 ? `${recurringNoisyRules.length} recurring noisy rule(s)` : 'no recurring noisy rules',
118
+ ].join('; ');
119
+ return {
120
+ scoreDirection,
121
+ scoreDelta: roundedDelta,
122
+ newHotspots,
123
+ recurringNoisyRules,
124
+ summary,
125
+ };
126
+ }
127
+ function countIssuesById(issues) {
128
+ const counts = {};
129
+ for (const issue of issues)
130
+ counts[issue.id] = (counts[issue.id] ?? 0) + 1;
131
+ return counts;
132
+ }
133
+ function countBaselineIssuesById(baseline) {
134
+ const counts = {};
135
+ for (const issue of baseline.issues)
136
+ counts[issue.id] = (counts[issue.id] ?? 0) + 1;
137
+ return counts;
138
+ }
139
+ function recurringRules(before, after) {
140
+ return Object.keys(before)
141
+ .filter((id) => before[id] > 0 && (after[id] ?? 0) > 0)
142
+ .map((id) => ({ id, before: before[id], after: after[id] ?? 0 }))
143
+ .sort((a, b) => b.after - a.after || b.before - a.before || a.id.localeCompare(b.id))
144
+ .slice(0, 5);
145
+ }
106
146
  function round1(n) {
107
147
  return Math.round(n * 10) / 10;
108
148
  }
@@ -1 +1 @@
1
- {"version":3,"file":"baseline.js","sourceRoot":"","sources":["../../src/utils/baseline.ts"],"names":[],"mappings":"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"}
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;AAW7B,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,eAAe,EAAE,eAAe,CAAC,MAAM,CAAC;QACxC,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,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC9C,OAAO;QACL,MAAM;QACN,KAAK;QACL,UAAU;QACV,SAAS;QACT,cAAc;QACd,WAAW;QACX,KAAK,EAAE,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC;KAC1D,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,UAAU,CACjB,UAAkB,EAClB,MAAgB,EAChB,KAAe,EACf,WAAgC;IAEhC,MAAM,YAAY,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IACxC,MAAM,mBAAmB,GAAG,cAAc,CAAC,MAAM,CAAC,eAAe,IAAI,uBAAuB,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,eAAe,IAAI,uBAAuB,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/J,MAAM,WAAW,GAAG,CAAC,WAAW,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjG,MAAM,cAAc,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IACpF,MAAM,OAAO,GAAG;QACd,SAAS,cAAc,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,YAAY,EAAE,EAAE;QACtG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,iBAAiB,CAAC,CAAC,CAAC,iBAAiB;QACnF,mBAAmB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC,MAAM,0BAA0B,CAAC,CAAC,CAAC,0BAA0B;KACtH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,OAAO;QACL,cAAc;QACd,UAAU,EAAE,YAAY;QACxB,WAAW;QACX,mBAAmB;QACnB,OAAO;KACR,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,MAAe;IACtC,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,KAAK,IAAI,MAAM;QAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAC3E,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,uBAAuB,CAAC,QAAkB;IACjD,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM;QAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACpF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,cAAc,CAAC,MAA8B,EAAE,KAA6B;IACnF,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;SACvB,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;SACtD,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SAChE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SACpF,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACjB,CAAC;AAED,SAAS,MAAM,CAAC,CAAS;IACvB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;AACjC,CAAC"}
@@ -27,9 +27,13 @@ export declare const COMMAND_FORMAT_SUPPORT: {
27
27
  readonly hotspots: readonly ["console", "json", "markdown", "html"];
28
28
  readonly impact: readonly ["console", "json", "markdown", "html"];
29
29
  readonly init: readonly ["console"];
30
+ readonly 'init github-action': readonly ["console", "json"];
30
31
  readonly 'init mcp': readonly ["console", "json"];
32
+ readonly 'init policy': readonly ["console", "json"];
33
+ readonly 'init team': readonly ["console", "json"];
31
34
  readonly 'install-hook': readonly ["console"];
32
35
  readonly mcp: readonly ["console"];
36
+ readonly 'mcp doctor': readonly ["console", "json"];
33
37
  readonly memory: readonly ["console", "json"];
34
38
  readonly 'memory stable': readonly ["console", "json"];
35
39
  readonly 'memory runs': readonly ["console", "json"];
@@ -49,6 +53,7 @@ export declare const COMMAND_FORMAT_SUPPORT: {
49
53
  readonly search: readonly ["console", "json", "markdown"];
50
54
  readonly 'semantic-graph': readonly ["console", "json"];
51
55
  readonly session: readonly ["console", "json"];
56
+ readonly start: readonly ["console", "json"];
52
57
  readonly 'session touched': readonly ["console", "json"];
53
58
  readonly 'session events': readonly ["console", "json"];
54
59
  readonly 'session reset': readonly ["console", "json"];
@@ -26,9 +26,13 @@ export const COMMAND_FORMAT_SUPPORT = {
26
26
  hotspots: ['console', 'json', 'markdown', 'html'],
27
27
  impact: ['console', 'json', 'markdown', 'html'],
28
28
  init: ['console'],
29
+ 'init github-action': ['console', 'json'],
29
30
  'init mcp': ['console', 'json'],
31
+ 'init policy': ['console', 'json'],
32
+ 'init team': ['console', 'json'],
30
33
  'install-hook': ['console'],
31
34
  mcp: ['console'],
35
+ 'mcp doctor': ['console', 'json'],
32
36
  memory: ['console', 'json'],
33
37
  'memory stable': ['console', 'json'],
34
38
  'memory runs': ['console', 'json'],
@@ -48,6 +52,7 @@ export const COMMAND_FORMAT_SUPPORT = {
48
52
  search: ['console', 'json', 'markdown'],
49
53
  'semantic-graph': ['console', 'json'],
50
54
  session: ['console', 'json'],
55
+ start: ['console', 'json'],
51
56
  'session touched': ['console', 'json'],
52
57
  'session events': ['console', 'json'],
53
58
  '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.4",
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",