projscan 4.9.3 → 4.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) hide show
  1. package/README.md +49 -8
  2. package/dist/analyzers/securityCheck.js +33 -15
  3. package/dist/analyzers/securityCheck.js.map +1 -1
  4. package/dist/analyzers/supplyChainCheck.js +9 -2
  5. package/dist/analyzers/supplyChainCheck.js.map +1 -1
  6. package/dist/cli/commands/assess.d.ts +3 -0
  7. package/dist/cli/commands/assess.js +143 -0
  8. package/dist/cli/commands/assess.js.map +1 -0
  9. package/dist/cli/commands/bugHunt.js +3 -1
  10. package/dist/cli/commands/bugHunt.js.map +1 -1
  11. package/dist/cli/commands/ci.js +29 -13
  12. package/dist/cli/commands/ci.js.map +1 -1
  13. package/dist/cli/commands/dogfood.js +2 -0
  14. package/dist/cli/commands/dogfood.js.map +1 -1
  15. package/dist/cli/commands/feedback.js +21 -2
  16. package/dist/cli/commands/feedback.js.map +1 -1
  17. package/dist/cli/commands/init.js +3 -0
  18. package/dist/cli/commands/init.js.map +1 -1
  19. package/dist/cli/commands/route.js +3 -2
  20. package/dist/cli/commands/route.js.map +1 -1
  21. package/dist/cli/commands/simulate.d.ts +3 -0
  22. package/dist/cli/commands/simulate.js +125 -0
  23. package/dist/cli/commands/simulate.js.map +1 -0
  24. package/dist/cli/registerCommands.js +4 -0
  25. package/dist/cli/registerCommands.js.map +1 -1
  26. package/dist/core/adoption.js +50 -21
  27. package/dist/core/adoption.js.map +1 -1
  28. package/dist/core/agentBrief.js +2 -1
  29. package/dist/core/agentBrief.js.map +1 -1
  30. package/dist/core/assess.d.ts +9 -0
  31. package/dist/core/assess.js +119 -0
  32. package/dist/core/assess.js.map +1 -0
  33. package/dist/core/bugHunt.js +51 -22
  34. package/dist/core/bugHunt.js.map +1 -1
  35. package/dist/core/bugHuntHotspotFindings.js +2 -1
  36. package/dist/core/bugHuntHotspotFindings.js.map +1 -1
  37. package/dist/core/ciGate.d.ts +10 -0
  38. package/dist/core/ciGate.js +21 -0
  39. package/dist/core/ciGate.js.map +1 -0
  40. package/dist/core/dogfood.d.ts +1 -0
  41. package/dist/core/dogfood.js +42 -20
  42. package/dist/core/dogfood.js.map +1 -1
  43. package/dist/core/dogfoodDiscovery.d.ts +8 -0
  44. package/dist/core/dogfoodDiscovery.js +119 -0
  45. package/dist/core/dogfoodDiscovery.js.map +1 -0
  46. package/dist/core/feedback.js +73 -5
  47. package/dist/core/feedback.js.map +1 -1
  48. package/dist/core/fileInspectionReport.js +37 -0
  49. package/dist/core/fileInspectionReport.js.map +1 -1
  50. package/dist/core/intentRouterArchitectureKeywordWeights.d.ts +1 -0
  51. package/dist/core/intentRouterArchitectureKeywordWeights.js +69 -0
  52. package/dist/core/intentRouterArchitectureKeywordWeights.js.map +1 -0
  53. package/dist/core/intentRouterCatalog.js +85 -31
  54. package/dist/core/intentRouterCatalog.js.map +1 -1
  55. package/dist/core/intentRouterDependencyKeywordWeights.d.ts +1 -0
  56. package/dist/core/intentRouterDependencyKeywordWeights.js +100 -0
  57. package/dist/core/intentRouterDependencyKeywordWeights.js.map +1 -0
  58. package/dist/core/intentRouterFileImpactKeywordWeights.d.ts +1 -0
  59. package/dist/core/intentRouterFileImpactKeywordWeights.js +92 -0
  60. package/dist/core/intentRouterFileImpactKeywordWeights.js.map +1 -0
  61. package/dist/core/intentRouterKeywordEarlyGuards.js +8 -3
  62. package/dist/core/intentRouterKeywordEarlyGuards.js.map +1 -1
  63. package/dist/core/intentRouterKeywordSearchGuards.js +28 -24
  64. package/dist/core/intentRouterKeywordSearchGuards.js.map +1 -1
  65. package/dist/core/intentRouterKeywordToolGuards.js +43 -0
  66. package/dist/core/intentRouterKeywordToolGuards.js.map +1 -1
  67. package/dist/core/intentRouterKeywordWeights.js +40 -1222
  68. package/dist/core/intentRouterKeywordWeights.js.map +1 -1
  69. package/dist/core/intentRouterOperationalKeywordWeights.d.ts +1 -0
  70. package/dist/core/intentRouterOperationalKeywordWeights.js +203 -0
  71. package/dist/core/intentRouterOperationalKeywordWeights.js.map +1 -0
  72. package/dist/core/intentRouterPlanningSignals.js +4 -1
  73. package/dist/core/intentRouterPlanningSignals.js.map +1 -1
  74. package/dist/core/intentRouterPrDiffKeywords.d.ts +4 -0
  75. package/dist/core/intentRouterPrDiffKeywords.js +64 -0
  76. package/dist/core/intentRouterPrDiffKeywords.js.map +1 -0
  77. package/dist/core/intentRouterPrDiffSignals.js +6 -0
  78. package/dist/core/intentRouterPrDiffSignals.js.map +1 -1
  79. package/dist/core/intentRouterProductImprovementSignals.d.ts +1 -0
  80. package/dist/core/intentRouterProductImprovementSignals.js +48 -0
  81. package/dist/core/intentRouterProductImprovementSignals.js.map +1 -0
  82. package/dist/core/intentRouterRegressionKeywordMatches.js +3 -0
  83. package/dist/core/intentRouterRegressionKeywordMatches.js.map +1 -1
  84. package/dist/core/intentRouterRegressionKeywordWeights.d.ts +1 -0
  85. package/dist/core/intentRouterRegressionKeywordWeights.js +118 -0
  86. package/dist/core/intentRouterRegressionKeywordWeights.js.map +1 -0
  87. package/dist/core/intentRouterReleaseSignals.d.ts +1 -0
  88. package/dist/core/intentRouterReleaseSignals.js +47 -0
  89. package/dist/core/intentRouterReleaseSignals.js.map +1 -1
  90. package/dist/core/intentRouterReviewSignals.d.ts +1 -0
  91. package/dist/core/intentRouterReviewSignals.js +23 -1
  92. package/dist/core/intentRouterReviewSignals.js.map +1 -1
  93. package/dist/core/intentRouterSearchKeywordWeights.d.ts +1 -0
  94. package/dist/core/intentRouterSearchKeywordWeights.js +407 -0
  95. package/dist/core/intentRouterSearchKeywordWeights.js.map +1 -0
  96. package/dist/core/intentRouterSecurityKeywordWeights.d.ts +1 -0
  97. package/dist/core/intentRouterSecurityKeywordWeights.js +50 -0
  98. package/dist/core/intentRouterSecurityKeywordWeights.js.map +1 -0
  99. package/dist/core/intentRouterTrustFeedbackKeywordWeights.d.ts +1 -0
  100. package/dist/core/intentRouterTrustFeedbackKeywordWeights.js +222 -0
  101. package/dist/core/intentRouterTrustFeedbackKeywordWeights.js.map +1 -0
  102. package/dist/core/intentRouterUnderstandSignals.js +1 -0
  103. package/dist/core/intentRouterUnderstandSignals.js.map +1 -1
  104. package/dist/core/intentRouterWorkSignals.js +3 -0
  105. package/dist/core/intentRouterWorkSignals.js.map +1 -1
  106. package/dist/core/intentRouterWorkflowKeywordWeights.d.ts +1 -0
  107. package/dist/core/intentRouterWorkflowKeywordWeights.js +124 -0
  108. package/dist/core/intentRouterWorkflowKeywordWeights.js.map +1 -0
  109. package/dist/core/issueEngine.js +46 -2
  110. package/dist/core/issueEngine.js.map +1 -1
  111. package/dist/core/memory.d.ts +2 -0
  112. package/dist/core/memory.js +33 -1
  113. package/dist/core/memory.js.map +1 -1
  114. package/dist/core/preflightChangedFiles.d.ts +3 -0
  115. package/dist/core/preflightChangedFiles.js +13 -0
  116. package/dist/core/preflightChangedFiles.js.map +1 -1
  117. package/dist/core/preflightEvidence.d.ts +3 -0
  118. package/dist/core/preflightEvidence.js +3 -0
  119. package/dist/core/preflightEvidence.js.map +1 -1
  120. package/dist/core/privacy.d.ts +2 -0
  121. package/dist/core/privacy.js +10 -0
  122. package/dist/core/privacy.js.map +1 -1
  123. package/dist/core/proofCards.d.ts +10 -0
  124. package/dist/core/proofCards.js +222 -0
  125. package/dist/core/proofCards.js.map +1 -0
  126. package/dist/core/qualityScorecard.js +25 -13
  127. package/dist/core/qualityScorecard.js.map +1 -1
  128. package/dist/core/riskDelta.d.ts +19 -0
  129. package/dist/core/riskDelta.js +77 -0
  130. package/dist/core/riskDelta.js.map +1 -0
  131. package/dist/core/simulate.d.ts +6 -0
  132. package/dist/core/simulate.js +298 -0
  133. package/dist/core/simulate.js.map +1 -0
  134. package/dist/core/startEvidence.js +26 -1
  135. package/dist/core/startEvidence.js.map +1 -1
  136. package/dist/core/startFixedRouteCriteria.js +5 -0
  137. package/dist/core/startFixedRouteCriteria.js.map +1 -1
  138. package/dist/core/startInputs.d.ts +3 -0
  139. package/dist/core/startMissionPolicy.d.ts +1 -1
  140. package/dist/core/startMissionPolicy.js +18 -7
  141. package/dist/core/startMissionPolicy.js.map +1 -1
  142. package/dist/core/startMode.js +17 -4
  143. package/dist/core/startMode.js.map +1 -1
  144. package/dist/core/startReportBuilder.js +1 -1
  145. package/dist/core/startReportBuilder.js.map +1 -1
  146. package/dist/core/startReviewGate.js +26 -4
  147. package/dist/core/startReviewGate.js.map +1 -1
  148. package/dist/core/startRouteActions.js +6 -0
  149. package/dist/core/startRouteActions.js.map +1 -1
  150. package/dist/core/understand.js +60 -13
  151. package/dist/core/understand.js.map +1 -1
  152. package/dist/core/workplan.js +99 -17
  153. package/dist/core/workplan.js.map +1 -1
  154. package/dist/mcp/toolCatalog.js +4 -0
  155. package/dist/mcp/toolCatalog.js.map +1 -1
  156. package/dist/mcp/tools/assess.d.ts +2 -0
  157. package/dist/mcp/tools/assess.js +42 -0
  158. package/dist/mcp/tools/assess.js.map +1 -0
  159. package/dist/mcp/tools/simulate.d.ts +2 -0
  160. package/dist/mcp/tools/simulate.js +32 -0
  161. package/dist/mcp/tools/simulate.js.map +1 -0
  162. package/dist/projscan-sbom.cdx.json +6 -6
  163. package/dist/publicCore.d.ts +2 -0
  164. package/dist/publicCore.js +2 -0
  165. package/dist/publicCore.js.map +1 -1
  166. package/dist/reporters/ciIssueDetails.d.ts +10 -0
  167. package/dist/reporters/ciIssueDetails.js +37 -0
  168. package/dist/reporters/ciIssueDetails.js.map +1 -0
  169. package/dist/reporters/consoleCiReporter.d.ts +2 -1
  170. package/dist/reporters/consoleCiReporter.js +26 -9
  171. package/dist/reporters/consoleCiReporter.js.map +1 -1
  172. package/dist/reporters/consoleFileReporter.js +10 -0
  173. package/dist/reporters/consoleFileReporter.js.map +1 -1
  174. package/dist/reporters/consoleHealthReporter.js +3 -1
  175. package/dist/reporters/consoleHealthReporter.js.map +1 -1
  176. package/dist/reporters/jsonReporter.d.ts +2 -1
  177. package/dist/reporters/jsonReporter.js +17 -10
  178. package/dist/reporters/jsonReporter.js.map +1 -1
  179. package/dist/reporters/markdownFileReporter.js +11 -0
  180. package/dist/reporters/markdownFileReporter.js.map +1 -1
  181. package/dist/reporters/markdownHealthReporter.d.ts +2 -1
  182. package/dist/reporters/markdownHealthReporter.js +5 -5
  183. package/dist/reporters/markdownHealthReporter.js.map +1 -1
  184. package/dist/reporters/scoreBreakdownReporter.d.ts +2 -0
  185. package/dist/reporters/scoreBreakdownReporter.js +24 -0
  186. package/dist/reporters/scoreBreakdownReporter.js.map +1 -0
  187. package/dist/tool-manifest.json +52 -3
  188. package/dist/types/analysis.d.ts +21 -1
  189. package/dist/types/assess.d.ts +91 -0
  190. package/dist/types/assess.js +2 -0
  191. package/dist/types/assess.js.map +1 -0
  192. package/dist/types/bugHunt.d.ts +3 -0
  193. package/dist/types/config.d.ts +9 -0
  194. package/dist/types/dogfood.d.ts +15 -1
  195. package/dist/types/inspection.d.ts +3 -0
  196. package/dist/types/preflight.d.ts +3 -0
  197. package/dist/types/simulate.d.ts +41 -0
  198. package/dist/types/simulate.js +2 -0
  199. package/dist/types/simulate.js.map +1 -0
  200. package/dist/types/startMissionControl.d.ts +3 -0
  201. package/dist/types/startMissionReview.d.ts +2 -0
  202. package/dist/types/workplan.d.ts +1 -0
  203. package/dist/types.d.ts +2 -0
  204. package/dist/utils/ciFailOn.d.ts +5 -0
  205. package/dist/utils/ciFailOn.js +12 -0
  206. package/dist/utils/ciFailOn.js.map +1 -0
  207. package/dist/utils/config.js +3 -1
  208. package/dist/utils/config.js.map +1 -1
  209. package/dist/utils/configBasics.d.ts +2 -0
  210. package/dist/utils/configBasics.js +21 -0
  211. package/dist/utils/configBasics.js.map +1 -1
  212. package/dist/utils/configIssueRules.js +64 -0
  213. package/dist/utils/configIssueRules.js.map +1 -1
  214. package/dist/utils/formatSupport.d.ts +2 -0
  215. package/dist/utils/formatSupport.js +2 -0
  216. package/dist/utils/formatSupport.js.map +1 -1
  217. package/dist/utils/scoreCalculator.js +77 -16
  218. package/dist/utils/scoreCalculator.js.map +1 -1
  219. package/docs/GUIDE.md +55 -7
  220. package/package.json +1 -1
package/docs/GUIDE.md CHANGED
@@ -126,11 +126,25 @@ and a before-edit gate instead of a free-form plan.
126
126
  projscan bug-hunt --format json
127
127
  projscan preflight --mode before_commit --format json
128
128
  projscan evidence-pack --pr-comment
129
+ projscan assess --goal "make this repo safer to ship this week"
130
+ projscan assess --mode fix-first --format markdown
131
+ projscan simulate --plan "split bugHunt.ts into ranking, evidence, and output modules"
129
132
  ```
130
133
 
131
134
  Success criteria: concrete fix targets, manual review gates, and proof commands
132
135
  are separated before a reviewer sees the work.
133
136
 
137
+ `projscan assess` turns those same signals into Proof Cards with evidence,
138
+ impact, a safe change shape, verification commands, feedback or suppression
139
+ guidance, and a risk delta. Add `--baseline previous-assess.json` to compare
140
+ the current risk delta against a prior run. It does not release, tag, publish,
141
+ or deploy.
142
+
143
+ `projscan simulate --plan "<change plan>"` is the next step when the safest
144
+ fix shape is a refactor, extraction, or module split. It predicts likely files,
145
+ affected tests, contract surfaces, rollout steps, proof commands, and projected
146
+ risk delta from local evidence. It is read-only and does not execute the plan.
147
+
134
148
  ### Before release-candidate review
135
149
 
136
150
  ```bash
@@ -234,6 +248,8 @@ When the agent first opens a repo, or before starting a refactor, the question i
234
248
  - **`projscan_bug_hunt` / `projscan bug-hunt`** — bug-hunt action queue. Combines doctor issues, preflight, hotspots, and session coordination into ranked actions with verification commands; release-scale-only findings print as manual review/sign-off work while preserving JSON verdict compatibility, and pure hotspot churn stays as watchlist/top-suspect evidence when health and gates are clean.
235
249
  - **`projscan_agent_brief` / `projscan agent-brief`** — compact next-agent context packet with focus items, repo context, coordination hints, guardrails, and suggested next actions.
236
250
  - **`projscan_quality_scorecard` / `projscan quality-scorecard`** — dimensioned quality view across health, security, tests, maintainability, coordination, top risks, and verification commands.
251
+ - **`projscan_assess` / `projscan assess`** — proof-first assessment. Composes quality-scorecard, bug-hunt, and preflight into Proof Cards with local evidence, impact, a safe fix shape, verification commands, feedback or suppression guidance, and risk delta. Use `projscan assess --goal "make this repo safer to ship this week"` for a broad weekly pass, `projscan assess --mode fix-first --format markdown` when you want one or two next actions instead of a long list, or `--baseline previous-assess.json` to compare against a prior assessment. The command is read-only and does not release, tag, publish, or deploy.
252
+ - **`projscan_simulate` / `projscan simulate`** — risk delta simulator. Evaluates a proposed change plan before editing and returns likely touched files, affected tests, contract surfaces, rollout steps, proof commands, confidence, and projected before/after risk. Use `projscan simulate --plan "split bugHunt.ts into ranking, evidence, and output modules"` before doing a refactor. The command is read-only and does not execute the plan.
237
253
  - **`projscan_understand` / `projscan understand`** — cited repo-comprehension surface. Returns repo maps, runtime flow maps, contract maps, change-readiness guidance, verification tiers, unknowns, read-first files, and exact next commands.
238
254
  - **`projscan_adoption` / `projscan init team` / `projscan init mcp` / `projscan mcp doctor` / `projscan init policy` / `projscan init github-action` / `projscan recipes` / `projscan first-run` / `projscan telemetry` / `projscan dogfood`** — adoption layer. Returns MCP client config snippets, setup verification, policy starters, PR workflow scaffolding with validated PR comments and block-only enforcement, baseline memory, ownership routing, first-PR onboarding steps, repeatable team-bootstrap and PR-automation recipes, multi-repo dogfood evidence, measured reviewer feedback, default-off telemetry controls, adoption trial reports, and setup diagnostics.
239
255
  - **`projscan_release_train` / `projscan release-train`** — product-line readiness planner. Plans upcoming product lines with version, scope, readiness, and next-action evidence.
@@ -551,13 +567,14 @@ Natural follow-up to `projscan hotspots` - once hotspots tells you _which_ file
551
567
  projscan ci
552
568
  ```
553
569
 
554
- A CI-pipeline-friendly health gate. Runs the full health check and exits with code 1 if the score falls below a threshold. No spinners or banners - clean output for CI logs.
570
+ A CI-pipeline-friendly health gate. Runs the full health check and exits with code 1 if the score falls below a threshold and at least one finding meets the `failOn` severity floor. No spinners or banners - clean output for CI logs.
555
571
 
556
572
  **Options:**
557
573
 
558
574
  | Flag | Description | Default |
559
575
  | ------------------ | ------------------------------------------------ | ----------------------------------------------------------- |
560
576
  | `--min-score <n>` | Minimum passing score (0–100) | `minScore` from `.projscanrc`, else 70 |
577
+ | `--fail-on <severity>` | Lowest severity that can fail a below-threshold gate: `info`, `warning`, or `error` | `failOn` from `.projscanrc`, else `warning` |
561
578
  | `--changed-only` | Gate only on issues in files changed vs base ref | off |
562
579
  | `--base-ref <ref>` | Git base ref for `--changed-only` | auto (origin/main → origin/master → main → master → HEAD~1) |
563
580
 
@@ -566,7 +583,7 @@ A CI-pipeline-friendly health gate. Runs the full health check and exits with co
566
583
  ```bash
567
584
  $ projscan ci --min-score 80
568
585
 
569
- projscan: B (82/100) - 0 errors, 2 warnings, 1 info - PASS (threshold: 80)
586
+ projscan: B (82/100) - 0 errors, 2 warnings, 1 info - PASS (threshold: 80, failOn: warning)
570
587
  ```
571
588
 
572
589
  <img src="npx%20projscan%20ci%20--min-score%2070.gif" alt="npx projscan ci" width="700">
@@ -574,7 +591,8 @@ projscan: B (82/100) - 0 errors, 2 warnings, 1 info - PASS (threshold: 80)
574
591
  **Exit codes:**
575
592
 
576
593
  - `0` - Score meets or exceeds the threshold
577
- - `1` - Score is below the threshold
594
+ - `0` - Score is below the threshold but no finding meets the `failOn` floor
595
+ - `1` - Score is below the threshold and at least one finding meets the `failOn` floor
578
596
 
579
597
  **JSON output** (useful for scripts):
580
598
 
@@ -582,6 +600,10 @@ projscan: B (82/100) - 0 errors, 2 warnings, 1 info - PASS (threshold: 80)
582
600
  projscan ci --min-score 70 --format json
583
601
  ```
584
602
 
603
+ Every `ci.issues[]` item keeps the original issue fields and adds
604
+ annotation-friendly fields: `ruleId`, `message`, primary `location`, all
605
+ `locations`, and `remediation` when a fix hint is available.
606
+
585
607
  **SARIF output** (for GitHub Code Scanning or any SARIF consumer):
586
608
 
587
609
  ```bash
@@ -887,6 +909,9 @@ Use it before broader rollout. The report includes feedback questions for the fi
887
909
  ## Health Score
888
910
 
889
911
  Every `projscan doctor` and `projscan badge` run calculates a health score from 0 to 100 based on detected issues.
912
+ `doctor --format json` and `ci --format json` include `scoreBreakdown` so scripts
913
+ and reviewers can see the base score, per-severity weights, category penalties,
914
+ total penalty, final score, and grade.
890
915
 
891
916
  **Scoring:**
892
917
 
@@ -909,7 +934,8 @@ Every `projscan doctor` and `projscan badge` run calculates a health score from
909
934
  The score appears in all output formats:
910
935
 
911
936
  - **Console**: Shown at the top of the doctor report
912
- - **JSON**: Included as `health.score` and `health.grade` fields
937
+ - **JSON**: Included as `health.score`, `health.grade`, and `health.scoreBreakdown`
938
+ fields. CI uses the same structure under `ci.scoreBreakdown`.
913
939
  - **Markdown**: Shown as a heading with an auto-generated shields.io badge
914
940
  - **HTML**: Shown in the health summary card
915
941
  - **SARIF**: Not surfaced directly - SARIF is per-issue, not per-project. The score still drives `ci`'s exit code.
@@ -1005,6 +1031,7 @@ ProjScan loads a project-wide config from one of:
1005
1031
  ```json
1006
1032
  {
1007
1033
  "minScore": 80,
1034
+ "failOn": "warning",
1008
1035
  "baseRef": "origin/main",
1009
1036
  "ignore": ["**/fixtures/**", "**/generated/**"],
1010
1037
  "scan": {
@@ -1013,6 +1040,9 @@ ProjScan loads a project-wide config from one of:
1013
1040
  "offline": false
1014
1041
  },
1015
1042
  "disableRules": ["missing-editorconfig", "large-*"],
1043
+ "suppress": {
1044
+ "hardcoded-secret": ["src/firebase.ts"]
1045
+ },
1016
1046
  "severityOverrides": {
1017
1047
  "missing-prettier": "info"
1018
1048
  },
@@ -1034,12 +1064,14 @@ ProjScan loads a project-wide config from one of:
1034
1064
  | Field | Type | Effect |
1035
1065
  | --------------------- | ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1036
1066
  | `minScore` | number (0–100) | Default threshold for `projscan ci`. Clamped to 0–100. |
1067
+ | `failOn` | `'info' \| 'warning' \| 'error'` | Lowest severity that can fail a below-threshold `projscan ci` gate. Default `warning`; set `info` for legacy strictness or `error` for error-only blocking. |
1037
1068
  | `baseRef` | string | Default base ref for `--changed-only`. |
1038
1069
  | `ignore` | string[] | Extra glob patterns added to the built-in ignore list (`node_modules`, `.git`, `dist`, `build`, `coverage`, `.next`, `.nuxt`, `.cache`, `.turbo`, `.output`). |
1039
1070
  | `scan.includeIgnored` | boolean | Explicitly include files hidden by Git ignore rules. Default `false`. |
1040
1071
  | `scan.scanEnvValues` | boolean | Explicitly read `.env*` contents during secret-pattern checks. Default `false`; `.env` files are path-only. |
1041
1072
  | `scan.offline` | boolean | Block projscan network-capable features: telemetry sending, `audit`, registry checks, and optional semantic model loading. Default `false`. |
1042
1073
  | `disableRules` | string[] | Silence rules by id. Exact match (`missing-prettier`) or wildcard prefix (`large-*`). |
1074
+ | `suppress` | `Record<string, string[]>` | Silence a rule only for matching paths/globs, for example `{ "hardcoded-secret": ["src/firebase.ts"] }`. Other rules still run on that file. |
1043
1075
  | `severityOverrides` | `Record<string, 'info' \| 'warning' \| 'error'>` | Remap a rule's severity. Useful for downgrading project-specific false positives without disabling them. |
1044
1076
  | `reportPolicies` | `Record<string, { reportScope?: string[]; redactPaths?: boolean }>` | Named evidence export presets selected with `--report-policy <name>` on `analyze`, `doctor`, and `ci`. |
1045
1077
  | `hotspots.limit` | number (1–100) | Default limit for `projscan hotspots`. |
@@ -1047,6 +1079,12 @@ ProjScan loads a project-wide config from one of:
1047
1079
 
1048
1080
  Invalid JSON in a discovered config file is a hard error - projscan exits rather than silently ignoring it.
1049
1081
 
1082
+ Use inline suppressions for a single confirmed false positive:
1083
+
1084
+ ```ts
1085
+ const firebaseKey = "AIza..." // projscan-ignore-line hardcoded-secret -- Firebase web keys are public identifiers
1086
+ ```
1087
+
1050
1088
  ### Embedded config in `package.json`
1051
1089
 
1052
1090
  If you prefer to keep everything in `package.json`:
@@ -1361,6 +1399,8 @@ _Structural / agent-native:_
1361
1399
  - `projscan_bug_hunt` — prioritized bug-hunt action queue with per-action verification.
1362
1400
  - `projscan_agent_brief` — compact next-agent context packet with focus items, guardrails, repo context, and suggested next actions.
1363
1401
  - `projscan_quality_scorecard` — dimensioned quality view with top risks and verification commands.
1402
+ - `projscan_assess` — proof-first assessment with Proof Cards, risk delta, and fix-first guidance.
1403
+ - `projscan_simulate` — risk delta simulator for proposed change plans before editing.
1364
1404
  - `projscan_adoption` — adoption helper for MCP client snippets, MCP setup doctor, agent workflow recipes, and first-run diagnostics.
1365
1405
  - `projscan_release_train` — product-line readiness plan with scope and next-action evidence.
1366
1406
  - `projscan_evidence_pack` — approval packet with planning, bug-hunt, workplan, preflight, changelog, and website prompt evidence.
@@ -1564,8 +1604,10 @@ If you'd rather skip Code Scanning, `projscan init github-action` writes a pull-
1564
1604
  The `ci` command is purpose-built for pipelines:
1565
1605
 
1566
1606
  ```bash
1567
- projscan ci # Fail if score < 70 (default)
1607
+ projscan ci # Fail if score < 70 and warning/error findings exist
1568
1608
  projscan ci --min-score 80 # Custom threshold
1609
+ projscan ci --fail-on info # Legacy strictness: info can fail the gate
1610
+ projscan ci --fail-on error # Only errors can fail a below-threshold gate
1569
1611
  projscan ci --changed-only # Gate only on PR diff
1570
1612
  projscan ci --format json # JSON output for scripts
1571
1613
  projscan ci --format sarif > projscan.sarif # SARIF for any consumer
@@ -1577,9 +1619,15 @@ projscan ci --format sarif > projscan.sarif # SARIF for any consumer
1577
1619
  result=$(projscan ci --min-score 0 --format json)
1578
1620
  pass=$(echo "$result" | jq '.ci.pass')
1579
1621
  score=$(echo "$result" | jq '.ci.score')
1580
- echo "Score: $score, Pass: $pass"
1622
+ fail_on=$(echo "$result" | jq -r '.ci.failOn')
1623
+ echo "Score: $score, Pass: $pass, FailOn: $fail_on"
1581
1624
  ```
1582
1625
 
1626
+ For PR annotation tooling, read `.ci.issues[]`. Each issue includes `ruleId`,
1627
+ `severity`, `message`, primary `location`, all `locations`, and `remediation`
1628
+ when available. Gate metadata lives at `.ci.failOn`, `.ci.scorePass`, and
1629
+ `.ci.severityFloorMet`.
1630
+
1583
1631
  ### Tracking health over time in CI
1584
1632
 
1585
1633
  Combine `ci` with `diff` to track regressions:
@@ -1675,7 +1723,7 @@ src/
1675
1723
  ├── mcp/
1676
1724
  │ ├── server.ts # MCP server factory and JSON-RPC request orchestration
1677
1725
  │ ├── serverStdio.ts # stdio transport loop for the CLI entry point
1678
- │ ├── tools.ts # 41 MCP tools (barrel; per-tool files under tools/)
1726
+ │ ├── tools.ts # MCP tools barrel; per-tool files live under tools/
1679
1727
  │ ├── tokenBudget.ts # Record-aware response truncator
1680
1728
  │ ├── pagination.ts # Cursor-based pagination (opaque base64 + checksum)
1681
1729
  │ ├── progress.ts # notifications/progress plumbing
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "projscan",
3
3
  "mcpName": "io.github.abhiyoheswaran1/projscan",
4
- "version": "4.9.3",
4
+ "version": "4.11.0",
5
5
  "description": "Local code intelligence for agent-assisted engineering. Focused daily workflows for repo orientation before edits, proof before handoff or commit, and release-candidate review, with AST-backed evidence through an MCP server and CLI. Runs locally by default.",
6
6
  "type": "module",
7
7
  "main": "./dist/index.js",