pi-lens 4.3.0 → 4.4.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 (650) hide show
  1. package/CHANGELOG.md +1064 -0
  2. package/README.md +115 -25
  3. package/config/dependency-cruiser-eager-allowlist.json +6 -2
  4. package/dist/chunk-22AVIGXS.js +560 -0
  5. package/dist/chunk-27BBHSZC.js +106 -0
  6. package/dist/chunk-2BEMIWEW.js +51 -0
  7. package/dist/chunk-2EECBNC5.js +89 -0
  8. package/dist/chunk-34U7PLGE.js +23 -0
  9. package/dist/chunk-3I5QFT3N.js +181 -0
  10. package/dist/chunk-3MED75HT.js +37 -0
  11. package/dist/chunk-47D2BO4S.js +87 -0
  12. package/dist/chunk-4RERDEXR.js +348 -0
  13. package/dist/chunk-4W2PLC4J.js +27 -0
  14. package/dist/chunk-52H5B5TC.js +202 -0
  15. package/dist/chunk-54B42YRX.js +27 -0
  16. package/dist/chunk-5RXBNSW2.js +266 -0
  17. package/dist/chunk-5THXD6X5.js +201 -0
  18. package/dist/chunk-5W3R6LFT.js +24 -0
  19. package/dist/chunk-5ZEJHV35.js +341 -0
  20. package/dist/chunk-6P62QVEA.js +118 -0
  21. package/dist/chunk-6QIUX4EP.js +459 -0
  22. package/dist/chunk-6VCD4VKZ.js +78 -0
  23. package/dist/chunk-7F72PXY2.js +326 -0
  24. package/dist/chunk-7FBF7NPR.js +998 -0
  25. package/dist/chunk-7U2IDNXN.js +37 -0
  26. package/dist/chunk-ABBOA7UD.js +157 -0
  27. package/dist/chunk-AHDW3GPE.js +50 -0
  28. package/dist/chunk-AJ3QXTRQ.js +756 -0
  29. package/dist/chunk-AJVLWNFN.js +1610 -0
  30. package/dist/chunk-AJXODZY6.js +112 -0
  31. package/dist/chunk-ARFCXG7S.js +84 -0
  32. package/dist/chunk-AS44CFQ4.js +708 -0
  33. package/dist/chunk-AWE5TMPO.js +38 -0
  34. package/dist/chunk-B3I2UUT4.js +4692 -0
  35. package/dist/chunk-BRJKOBZP.js +331 -0
  36. package/dist/chunk-BW5KFIQC.js +59 -0
  37. package/dist/chunk-C2AUYXQH.js +149 -0
  38. package/dist/chunk-CGGAIP7J.js +29 -0
  39. package/dist/chunk-D6QS3U6M.js +30 -0
  40. package/dist/chunk-DFVMIKMQ.js +349 -0
  41. package/dist/chunk-DIULIWKU.js +169 -0
  42. package/dist/chunk-DQ2NZ7C4.js +2317 -0
  43. package/dist/chunk-E2WFBRHM.js +213 -0
  44. package/dist/chunk-E4MAEDPM.js +50 -0
  45. package/dist/chunk-EOKRQ3SA.js +30 -0
  46. package/dist/chunk-F3AU2TMM.js +2626 -0
  47. package/dist/chunk-F3P7VQ7H.js +170 -0
  48. package/dist/chunk-FC4RP4I2.js +12 -0
  49. package/dist/chunk-FJNKANOS.js +32 -0
  50. package/dist/chunk-GUOGVTCQ.js +146 -0
  51. package/dist/chunk-GVXA6CCE.js +18 -0
  52. package/dist/chunk-HHYAELLJ.js +2334 -0
  53. package/dist/chunk-HMFXILPV.js +83 -0
  54. package/dist/chunk-HVUZXSWK.js +421 -0
  55. package/dist/chunk-HWBZIGMJ.js +62 -0
  56. package/dist/chunk-I3R7GKDR.js +17 -0
  57. package/dist/chunk-I7SPGOWI.js +55 -0
  58. package/dist/chunk-IIXOAGHR.js +38 -0
  59. package/dist/chunk-IVP5KAB7.js +2250 -0
  60. package/dist/chunk-IXEBJSUE.js +22 -0
  61. package/dist/chunk-JOLITGCC.js +27 -0
  62. package/dist/chunk-K6VYLB2U.js +145 -0
  63. package/dist/chunk-LJDODBBZ.js +78 -0
  64. package/dist/chunk-LNAKEO63.js +78 -0
  65. package/dist/chunk-LSMJ6KBE.js +4139 -0
  66. package/dist/chunk-LW6XKDZQ.js +5565 -0
  67. package/dist/chunk-N3YQJI6O.js +899 -0
  68. package/dist/chunk-NABLC7W3.js +148 -0
  69. package/dist/chunk-NKOUFPQF.js +659 -0
  70. package/dist/chunk-NL5GLMFI.js +211 -0
  71. package/dist/chunk-NMABWBZN.js +327 -0
  72. package/dist/chunk-NTHH2J74.js +27 -0
  73. package/dist/chunk-NTUJEGDZ.js +59 -0
  74. package/dist/chunk-NXL4FFQQ.js +47 -0
  75. package/dist/chunk-NXPS2L6U.js +466 -0
  76. package/dist/chunk-O5WILGMI.js +42 -0
  77. package/dist/chunk-O6TQT6RI.js +48 -0
  78. package/dist/chunk-OAXNDZJ7.js +323 -0
  79. package/dist/chunk-ODEEOXPH.js +44 -0
  80. package/dist/chunk-OQGFCZJ4.js +4533 -0
  81. package/dist/chunk-ORTMY4Q4.js +282 -0
  82. package/dist/chunk-OS32RNR2.js +442 -0
  83. package/dist/chunk-PAK6IDME.js +189 -0
  84. package/dist/chunk-PWFHBTSF.js +406 -0
  85. package/dist/chunk-Q5U6FMDI.js +2352 -0
  86. package/dist/chunk-QOZXJ4NA.js +3364 -0
  87. package/dist/chunk-QYF5S6P6.js +45 -0
  88. package/dist/chunk-RIISMHKN.js +36 -0
  89. package/dist/chunk-RPD4ZSB7.js +25 -0
  90. package/dist/chunk-RPD5K5NC.js +79 -0
  91. package/dist/chunk-RUOG5D2C.js +262 -0
  92. package/dist/chunk-T4ERT73Y.js +599 -0
  93. package/dist/chunk-T6D4Q4AQ.js +54 -0
  94. package/dist/chunk-TGPXLY2J.js +391 -0
  95. package/dist/chunk-TLGFBM3F.js +12116 -0
  96. package/dist/chunk-TO6WL3GM.js +88 -0
  97. package/dist/chunk-TT22N74J.js +517 -0
  98. package/dist/chunk-TVN5N6GY.js +21216 -0
  99. package/dist/chunk-U3VGR4VU.js +308 -0
  100. package/dist/chunk-UK3CMEAL.js +1250 -0
  101. package/dist/chunk-UOPVJQ4N.js +103 -0
  102. package/dist/chunk-UXVNL3D7.js +23 -0
  103. package/dist/chunk-UY752QSN.js +45 -0
  104. package/dist/chunk-V5PXFSZK.js +188 -0
  105. package/dist/chunk-V7R425XG.js +398 -0
  106. package/dist/chunk-VCSRSYLF.js +81 -0
  107. package/dist/chunk-VD4JQCQC.js +162 -0
  108. package/dist/chunk-VDBPVIKD.js +62 -0
  109. package/dist/chunk-VHQLPIRJ.js +114 -0
  110. package/dist/chunk-VN2AXLEX.js +5414 -0
  111. package/dist/chunk-VNMT7C64.js +478 -0
  112. package/dist/chunk-WONERJTP.js +309 -0
  113. package/dist/chunk-XECLWQZN.js +85 -0
  114. package/dist/chunk-XIMYZ3JA.js +27 -0
  115. package/dist/chunk-XK4CIILI.js +144 -0
  116. package/dist/chunk-Y4T27COV.js +562 -0
  117. package/dist/chunk-YGVYKNSN.js +1860 -0
  118. package/dist/chunk-YLF3PPT5.js +308 -0
  119. package/dist/chunk-YSNFMJKN.js +14 -0
  120. package/dist/chunk-Z3CCVDUB.js +76 -0
  121. package/dist/chunk-Z54ZSOBZ.js +61 -0
  122. package/dist/chunk-ZAWW3AF6.js +97 -0
  123. package/dist/chunk-ZMOL6RQC.js +167 -0
  124. package/dist/index.js +16456 -8335
  125. package/dist/mcp/analyze-cli.js +186 -232
  126. package/dist/mcp/cli.js +137 -98
  127. package/dist/mcp/server.js +22589 -1573
  128. package/dist/mcp/worker.js +97 -38
  129. package/dist/probes/installer.js +135 -0
  130. package/dist/workers/project-snapshot-persist-worker.js +22 -0
  131. package/dist/workers/review-graph-persist-worker.js +15 -0
  132. package/docs/agent-guide.md +13 -4
  133. package/docs/agent-tools.md +42 -0
  134. package/docs/ast-grep_rules_catalog.md +3 -2
  135. package/docs/configuration.md +20 -1
  136. package/docs/environment-variables.md +52 -2
  137. package/docs/features.md +8 -4
  138. package/docs/globalconfig.md +1 -0
  139. package/docs/io-bridge-v2-migration.md +94 -0
  140. package/docs/lsp-capability-matrix.md +36 -4
  141. package/docs/lsp-idle-eviction.md +124 -0
  142. package/docs/mcp.md +21 -5
  143. package/docs/merge-queue-rollout.md +77 -0
  144. package/docs/pi-lens-fixer.md +156 -88
  145. package/docs/pi-lens-investigator.md +74 -26
  146. package/docs/pi-lens-merge-policy.md +694 -0
  147. package/docs/pi-lens-monitor.md +73 -7
  148. package/docs/pi-lens-retro.md +6 -4
  149. package/docs/pi-lens-reviewer.md +188 -48
  150. package/docs/pi-lens-subagent.md +246 -45
  151. package/docs/pi-lens-warden.md +18 -7
  152. package/docs/public-api-stability.md +55 -0
  153. package/docs/release-qa-baseline.md +84 -17
  154. package/docs/rfcs/3654-unified-io-bridge-v2.md +316 -0
  155. package/docs/servercapabilities.md +53 -49
  156. package/docs/settings.md +1 -0
  157. package/docs/usage.md +5 -1
  158. package/grammars/tree-sitter-bash.wasm +0 -0
  159. package/grammars/tree-sitter-bash.wasm.json +3 -3
  160. package/package.json +19 -7
  161. package/rules/ast-grep-rules/rule-tests/advisory-registry-subset-test.yml +41 -0
  162. package/rules/ast-grep-rules/rules/advisory-registry-subset.yml +50 -0
  163. package/scripts/analyze-pi-lens-logs.mjs +1275 -62
  164. package/scripts/download-grammars.js +5 -0
  165. package/scripts/grammars.lock.json +6 -1
  166. package/scripts/install-selftest.mjs +33 -34
  167. package/scripts/lib/host-provided-deps.mjs +13 -4
  168. package/scripts/lib/web-tree-sitter-dir.mjs +18 -0
  169. package/dist/clients/actionable-warnings-logger.js +0 -35
  170. package/dist/clients/actionable-warnings.js +0 -1610
  171. package/dist/clients/advisory-provenance.js +0 -593
  172. package/dist/clients/agent-behavior-client.js +0 -147
  173. package/dist/clients/agent-nudge.js +0 -325
  174. package/dist/clients/analysed-root.js +0 -1
  175. package/dist/clients/ast-grep-client.js +0 -731
  176. package/dist/clients/ast-grep-rule-manager.js +0 -146
  177. package/dist/clients/ast-grep-tool-logger.js +0 -118
  178. package/dist/clients/ast-grep-types.js +0 -10
  179. package/dist/clients/ast-grep-yaml-synth.js +0 -154
  180. package/dist/clients/atomic-write-staging.js +0 -75
  181. package/dist/clients/atomic-write.js +0 -189
  182. package/dist/clients/availability-probe-flight.js +0 -12
  183. package/dist/clients/bash-file-access.js +0 -1056
  184. package/dist/clients/biome-client.js +0 -357
  185. package/dist/clients/blocker-freshness.js +0 -837
  186. package/dist/clients/blocker-past-eof.js +0 -129
  187. package/dist/clients/bootstrap.js +0 -569
  188. package/dist/clients/bounded-cache.js +0 -190
  189. package/dist/clients/bounded-pid-file-lock.js +0 -202
  190. package/dist/clients/bounded-telemetry.js +0 -295
  191. package/dist/clients/build-identity.js +0 -95
  192. package/dist/clients/bundled-resource-health.js +0 -113
  193. package/dist/clients/bus-events-logger.js +0 -105
  194. package/dist/clients/bus-publish.js +0 -171
  195. package/dist/clients/cache/rule-cache.js +0 -190
  196. package/dist/clients/cache-manager.js +0 -524
  197. package/dist/clients/cache-observability.js +0 -1313
  198. package/dist/clients/call-graph.js +0 -852
  199. package/dist/clients/cargo-manifest.js +0 -422
  200. package/dist/clients/cascade-budget.js +0 -196
  201. package/dist/clients/cascade-format.js +0 -315
  202. package/dist/clients/cascade-logger.js +0 -31
  203. package/dist/clients/cascade-types.js +0 -9
  204. package/dist/clients/child-unref.js +0 -124
  205. package/dist/clients/code-quality-warnings.js +0 -286
  206. package/dist/clients/codebase-model.js +0 -173
  207. package/dist/clients/collateral-test-role.js +0 -40
  208. package/dist/clients/complexity-client.js +0 -462
  209. package/dist/clients/config-core/deny.js +0 -221
  210. package/dist/clients/config-core/index.js +0 -50
  211. package/dist/clients/config-core/merge.js +0 -357
  212. package/dist/clients/config-core/normalize.js +0 -340
  213. package/dist/clients/config-core/process-spec.js +0 -248
  214. package/dist/clients/config-core/provenance.js +0 -164
  215. package/dist/clients/config-core/records.js +0 -218
  216. package/dist/clients/config-core/resolve.js +0 -125
  217. package/dist/clients/config-core/safe-object.js +0 -78
  218. package/dist/clients/config-core/schema.js +0 -165
  219. package/dist/clients/config-diagnostic-codes.js +0 -285
  220. package/dist/clients/config-locations.js +0 -388
  221. package/dist/clients/config-resolve.js +0 -798
  222. package/dist/clients/config-schema.js +0 -251
  223. package/dist/clients/config-warn.js +0 -407
  224. package/dist/clients/console-guard-install.js +0 -26
  225. package/dist/clients/cooperative-budget.js +0 -42
  226. package/dist/clients/dead-code-client.js +0 -510
  227. package/dist/clients/dead-code-logger.js +0 -30
  228. package/dist/clients/deadline-utils.js +0 -280
  229. package/dist/clients/debug-handles.js +0 -211
  230. package/dist/clients/debug-heap.js +0 -174
  231. package/dist/clients/deferred-lsp-work.js +0 -106
  232. package/dist/clients/degradation-ledger.js +0 -426
  233. package/dist/clients/demoted-finding-render.js +0 -169
  234. package/dist/clients/dependency-checker.js +0 -885
  235. package/dist/clients/deps/ast-grep-napi.js +0 -22
  236. package/dist/clients/deps/js-yaml.js +0 -9
  237. package/dist/clients/deps/minimatch.js +0 -4
  238. package/dist/clients/deps/pi-tui.js +0 -14
  239. package/dist/clients/deps/typebox.js +0 -14
  240. package/dist/clients/deps/vscode-jsonrpc.js +0 -1
  241. package/dist/clients/deps/web-tree-sitter.js +0 -24
  242. package/dist/clients/diagnostic-dispositions.js +0 -630
  243. package/dist/clients/diagnostic-line-freshness.js +0 -305
  244. package/dist/clients/diagnostic-logger.js +0 -73
  245. package/dist/clients/diagnostic-tracker.js +0 -105
  246. package/dist/clients/diagnostics-publish.js +0 -230
  247. package/dist/clients/dispatch/ast-grep-catalog.js +0 -65
  248. package/dist/clients/dispatch/auxiliary-lsp.js +0 -343
  249. package/dist/clients/dispatch/collect-later-tier.js +0 -35
  250. package/dist/clients/dispatch/diagnostic-taxonomy.js +0 -66
  251. package/dist/clients/dispatch/dispatcher.js +0 -1269
  252. package/dist/clients/dispatch/fact-provider-types.js +0 -1
  253. package/dist/clients/dispatch/fact-rule-runner.js +0 -17
  254. package/dist/clients/dispatch/fact-runner.js +0 -30
  255. package/dist/clients/dispatch/fact-scheduler.js +0 -68
  256. package/dist/clients/dispatch/fact-store.js +0 -377
  257. package/dist/clients/dispatch/facts/comment-facts.js +0 -22
  258. package/dist/clients/dispatch/facts/file-content.js +0 -19
  259. package/dist/clients/dispatch/facts/function-facts.js +0 -348
  260. package/dist/clients/dispatch/facts/import-facts.js +0 -204
  261. package/dist/clients/dispatch/facts/tree-sitter-facts.js +0 -34
  262. package/dist/clients/dispatch/facts/try-catch-facts.js +0 -119
  263. package/dist/clients/dispatch/finding-policy.js +0 -339
  264. package/dist/clients/dispatch/indent-detect.js +0 -417
  265. package/dist/clients/dispatch/inline-suppressions.js +0 -89
  266. package/dist/clients/dispatch/integration.js +0 -2377
  267. package/dist/clients/dispatch/lazy.js +0 -11
  268. package/dist/clients/dispatch/pending-runner-findings.js +0 -87
  269. package/dist/clients/dispatch/plan.js +0 -278
  270. package/dist/clients/dispatch/priorities.js +0 -20
  271. package/dist/clients/dispatch/rule-id-normalize.js +0 -50
  272. package/dist/clients/dispatch/rule-ignores.js +0 -69
  273. package/dist/clients/dispatch/rule-policy.js +0 -135
  274. package/dist/clients/dispatch/rules/async-noise.js +0 -40
  275. package/dist/clients/dispatch/rules/async-unnecessary-wrapper.js +0 -27
  276. package/dist/clients/dispatch/rules/cors-wildcard.js +0 -54
  277. package/dist/clients/dispatch/rules/error-obscuring.js +0 -32
  278. package/dist/clients/dispatch/rules/error-swallowing.js +0 -31
  279. package/dist/clients/dispatch/rules/framework-call-noise.js +0 -67
  280. package/dist/clients/dispatch/rules/high-complexity.js +0 -72
  281. package/dist/clients/dispatch/rules/high-fan-out.js +0 -74
  282. package/dist/clients/dispatch/rules/high-import-coupling.js +0 -37
  283. package/dist/clients/dispatch/rules/missing-error-propagation.js +0 -62
  284. package/dist/clients/dispatch/rules/no-commented-credentials.js +0 -52
  285. package/dist/clients/dispatch/rules/pass-through-wrappers.js +0 -42
  286. package/dist/clients/dispatch/rules/placeholder-comments.js +0 -40
  287. package/dist/clients/dispatch/rules/unsafe-boundary.js +0 -126
  288. package/dist/clients/dispatch/runner-context.js +0 -52
  289. package/dist/clients/dispatch/runners/actionlint.js +0 -111
  290. package/dist/clients/dispatch/runners/ast-grep-napi.js +0 -1196
  291. package/dist/clients/dispatch/runners/biome-check.js +0 -296
  292. package/dist/clients/dispatch/runners/cpp-check.js +0 -219
  293. package/dist/clients/dispatch/runners/credo.js +0 -82
  294. package/dist/clients/dispatch/runners/cue-vet.js +0 -416
  295. package/dist/clients/dispatch/runners/dart-analyze.js +0 -183
  296. package/dist/clients/dispatch/runners/detekt.js +0 -176
  297. package/dist/clients/dispatch/runners/dotnet-build.js +0 -164
  298. package/dist/clients/dispatch/runners/elixir-check.js +0 -195
  299. package/dist/clients/dispatch/runners/eslint.js +0 -137
  300. package/dist/clients/dispatch/runners/fact-rules.js +0 -29
  301. package/dist/clients/dispatch/runners/fish-indent.js +0 -69
  302. package/dist/clients/dispatch/runners/gleam-check.js +0 -167
  303. package/dist/clients/dispatch/runners/go-vet.js +0 -104
  304. package/dist/clients/dispatch/runners/golangci-lint.js +0 -135
  305. package/dist/clients/dispatch/runners/hadolint.js +0 -91
  306. package/dist/clients/dispatch/runners/helm-lint.js +0 -171
  307. package/dist/clients/dispatch/runners/helm-render.js +0 -940
  308. package/dist/clients/dispatch/runners/htmlhint.js +0 -117
  309. package/dist/clients/dispatch/runners/index.js +0 -108
  310. package/dist/clients/dispatch/runners/javac.js +0 -99
  311. package/dist/clients/dispatch/runners/ktlint.js +0 -110
  312. package/dist/clients/dispatch/runners/lsp.js +0 -379
  313. package/dist/clients/dispatch/runners/markdownlint.js +0 -167
  314. package/dist/clients/dispatch/runners/mypy.js +0 -102
  315. package/dist/clients/dispatch/runners/oxlint.js +0 -414
  316. package/dist/clients/dispatch/runners/php-lint.js +0 -85
  317. package/dist/clients/dispatch/runners/phpstan.js +0 -120
  318. package/dist/clients/dispatch/runners/prisma-validate.js +0 -62
  319. package/dist/clients/dispatch/runners/psscriptanalyzer.js +0 -445
  320. package/dist/clients/dispatch/runners/pyright.js +0 -169
  321. package/dist/clients/dispatch/runners/rubocop.js +0 -99
  322. package/dist/clients/dispatch/runners/ruff.js +0 -88
  323. package/dist/clients/dispatch/runners/rust-clippy.js +0 -256
  324. package/dist/clients/dispatch/runners/shellcheck.js +0 -173
  325. package/dist/clients/dispatch/runners/shfmt.js +0 -102
  326. package/dist/clients/dispatch/runners/spellcheck.js +0 -128
  327. package/dist/clients/dispatch/runners/spotbugs.js +0 -259
  328. package/dist/clients/dispatch/runners/sqlfluff.js +0 -183
  329. package/dist/clients/dispatch/runners/stylelint.js +0 -166
  330. package/dist/clients/dispatch/runners/swiftlint.js +0 -163
  331. package/dist/clients/dispatch/runners/taplo.js +0 -174
  332. package/dist/clients/dispatch/runners/terragrunt.js +0 -168
  333. package/dist/clients/dispatch/runners/tflint.js +0 -125
  334. package/dist/clients/dispatch/runners/tree-sitter.js +0 -643
  335. package/dist/clients/dispatch/runners/trivy-config.js +0 -253
  336. package/dist/clients/dispatch/runners/utils/availability-policy.js +0 -496
  337. package/dist/clients/dispatch/runners/utils/candidate-probe.js +0 -90
  338. package/dist/clients/dispatch/runners/utils/diagnostic-parsers.js +0 -95
  339. package/dist/clients/dispatch/runners/utils/lazy-installer.js +0 -274
  340. package/dist/clients/dispatch/runners/utils/runner-helpers.js +0 -1701
  341. package/dist/clients/dispatch/runners/utils/spawn-outcome.js +0 -101
  342. package/dist/clients/dispatch/runners/utils/tool-failure.js +0 -235
  343. package/dist/clients/dispatch/runners/utils/toolchain-availability.js +0 -169
  344. package/dist/clients/dispatch/runners/utils.js +0 -15
  345. package/dist/clients/dispatch/runners/vale.js +0 -128
  346. package/dist/clients/dispatch/runners/yaml-rule-parser.js +0 -242
  347. package/dist/clients/dispatch/runners/yamllint.js +0 -95
  348. package/dist/clients/dispatch/runners/zig-check.js +0 -79
  349. package/dist/clients/dispatch/suppress-writer.js +0 -79
  350. package/dist/clients/dispatch/tool-profile.js +0 -30
  351. package/dist/clients/dispatch/types.js +0 -21
  352. package/dist/clients/dispatch/utils/format-utils.js +0 -45
  353. package/dist/clients/dispatch/utils/lsp-diagnostics.js +0 -35
  354. package/dist/clients/disposition-logger.js +0 -32
  355. package/dist/clients/disposition-publish.js +0 -124
  356. package/dist/clients/durable-store.js +0 -97
  357. package/dist/clients/effective-config.js +0 -415
  358. package/dist/clients/env-utils.js +0 -83
  359. package/dist/clients/error-class.js +0 -23
  360. package/dist/clients/eval-timestamp.js +0 -17
  361. package/dist/clients/event-loop-hold.js +0 -274
  362. package/dist/clients/event-loop-monitor.js +0 -250
  363. package/dist/clients/extension-log.js +0 -504
  364. package/dist/clients/extension-mode.js +0 -73
  365. package/dist/clients/feature-hints.js +0 -103
  366. package/dist/clients/file-kinds.js +0 -412
  367. package/dist/clients/file-role.js +0 -134
  368. package/dist/clients/file-time.js +0 -160
  369. package/dist/clients/file-utils.js +0 -1032
  370. package/dist/clients/finding-delivery-gate.js +0 -494
  371. package/dist/clients/finding-identity.js +0 -88
  372. package/dist/clients/fix-worklog.js +0 -103
  373. package/dist/clients/format-events-publish.js +0 -343
  374. package/dist/clients/format-service.js +0 -222
  375. package/dist/clients/formatters-lazy.js +0 -9
  376. package/dist/clients/formatters.js +0 -2032
  377. package/dist/clients/freshness-cadence.js +0 -17
  378. package/dist/clients/freshness.js +0 -38
  379. package/dist/clients/generated-artifacts.js +0 -394
  380. package/dist/clients/generation-guard.js +0 -215
  381. package/dist/clients/git-guard.js +0 -1136
  382. package/dist/clients/git-tracked-ignore.js +0 -243
  383. package/dist/clients/gitleaks-client.js +0 -509
  384. package/dist/clients/go-client.js +0 -104
  385. package/dist/clients/govulncheck-client.js +0 -605
  386. package/dist/clients/gradle-ktfmt-style.js +0 -348
  387. package/dist/clients/grammar-source.js +0 -465
  388. package/dist/clients/gzip-stage-write.js +0 -135
  389. package/dist/clients/hashline-anchor.js +0 -424
  390. package/dist/clients/hook-budgets.js +0 -76
  391. package/dist/clients/host-edit-normalize.js +0 -140
  392. package/dist/clients/host-ports.js +0 -39
  393. package/dist/clients/indent-retarget.js +0 -154
  394. package/dist/clients/inline-blocker-dispositions.js +0 -186
  395. package/dist/clients/install-diagnostics.js +0 -156
  396. package/dist/clients/installer/index.js +0 -5416
  397. package/dist/clients/installer/managed-tool-refresh-session.js +0 -58
  398. package/dist/clients/installer/managed-tool-refresh.js +0 -783
  399. package/dist/clients/instance-reaper-state.js +0 -7
  400. package/dist/clients/instance-reaper.js +0 -1137
  401. package/dist/clients/instance-registry-lock.js +0 -145
  402. package/dist/clients/instance-registry.js +0 -773
  403. package/dist/clients/jscpd-client.js +0 -378
  404. package/dist/clients/json-cache-read.js +0 -65
  405. package/dist/clients/knip-client.js +0 -788
  406. package/dist/clients/language-policy.js +0 -252
  407. package/dist/clients/language-profile.js +0 -361
  408. package/dist/clients/language-registry.js +0 -603
  409. package/dist/clients/latency-logger.js +0 -727
  410. package/dist/clients/lazy-import.js +0 -21
  411. package/dist/clients/ledger-bounds.js +0 -54
  412. package/dist/clients/lens-config.js +0 -404
  413. package/dist/clients/lens-engine.js +0 -358
  414. package/dist/clients/lens-events.js +0 -125
  415. package/dist/clients/lens-flag-registry.js +0 -467
  416. package/dist/clients/lens-map.js +0 -1156
  417. package/dist/clients/live-bus-emitter.js +0 -74
  418. package/dist/clients/log-cleanup.js +0 -222
  419. package/dist/clients/lsp/aggregation.js +0 -178
  420. package/dist/clients/lsp/cascade-tier.js +0 -421
  421. package/dist/clients/lsp/client.js +0 -4593
  422. package/dist/clients/lsp/config.js +0 -691
  423. package/dist/clients/lsp/content-limits.js +0 -41
  424. package/dist/clients/lsp/diagnostic-binding.js +0 -225
  425. package/dist/clients/lsp/document-drift.js +0 -467
  426. package/dist/clients/lsp/edits.js +0 -1219
  427. package/dist/clients/lsp/index.js +0 -8305
  428. package/dist/clients/lsp/inferred-project.js +0 -216
  429. package/dist/clients/lsp/jvm-runtime.js +0 -298
  430. package/dist/clients/lsp/language.js +0 -63
  431. package/dist/clients/lsp/launch.js +0 -746
  432. package/dist/clients/lsp/lombok.js +0 -158
  433. package/dist/clients/lsp/path-utils.js +0 -5
  434. package/dist/clients/lsp/pending-aux-coverage.js +0 -251
  435. package/dist/clients/lsp/position-encoding.js +0 -61
  436. package/dist/clients/lsp/ruby-drive-dirs.js +0 -83
  437. package/dist/clients/lsp/server.js +0 -3290
  438. package/dist/clients/lsp/session-roots.js +0 -192
  439. package/dist/clients/lsp/spawn-history.js +0 -17
  440. package/dist/clients/lsp/sync-kind.js +0 -56
  441. package/dist/clients/lsp/tsserver-sync.js +0 -332
  442. package/dist/clients/lsp/wait-policy/capability-snapshot.js +0 -1
  443. package/dist/clients/lsp/wait-policy/classification.js +0 -85
  444. package/dist/clients/lsp/wait-policy/index.js +0 -10
  445. package/dist/clients/lsp/wait-policy/strategies.js +0 -392
  446. package/dist/clients/lsp/watch-queue.js +0 -61
  447. package/dist/clients/lsp/workspace-diagnostics-cache.js +0 -639
  448. package/dist/clients/lsp/workspace-diagnostics-session.js +0 -30
  449. package/dist/clients/lsp/workspace-sweep-hold.js +0 -184
  450. package/dist/clients/lsp-budget.js +0 -186
  451. package/dist/clients/lsp-document-symbols.js +0 -110
  452. package/dist/clients/lsp-lazy.js +0 -9
  453. package/dist/clients/lsp-mutation.js +0 -396
  454. package/dist/clients/lsp-status.js +0 -59
  455. package/dist/clients/map-with-concurrency.js +0 -40
  456. package/dist/clients/mcp/analyze.js +0 -420
  457. package/dist/clients/mcp/host-shim.js +0 -31
  458. package/dist/clients/mcp/ipc.js +0 -523
  459. package/dist/clients/mcp/review.js +0 -197
  460. package/dist/clients/mcp/session.js +0 -412
  461. package/dist/clients/memory-sampler.js +0 -208
  462. package/dist/clients/message-end-attribution.js +0 -30
  463. package/dist/clients/metrics-client.js +0 -107
  464. package/dist/clients/metrics-history.js +0 -327
  465. package/dist/clients/middle-man-analysis.js +0 -263
  466. package/dist/clients/model-provider.js +0 -53
  467. package/dist/clients/module-report-lsp.js +0 -189
  468. package/dist/clients/module-report.js +0 -2150
  469. package/dist/clients/mutating-tool.js +0 -651
  470. package/dist/clients/mutation-attribution.js +0 -368
  471. package/dist/clients/mutation-bridge.js +0 -240
  472. package/dist/clients/ndjson-logger.js +0 -734
  473. package/dist/clients/observed-mutation-sources.js +0 -101
  474. package/dist/clients/observed-mutation.js +0 -1253
  475. package/dist/clients/oldtext-autopatch.js +0 -128
  476. package/dist/clients/opaque-mutation-scan.js +0 -496
  477. package/dist/clients/opengrep-client.js +0 -333
  478. package/dist/clients/opengrep-config.js +0 -76
  479. package/dist/clients/package-manager.js +0 -607
  480. package/dist/clients/package-root.js +0 -38
  481. package/dist/clients/partial-edit-apply.js +0 -439
  482. package/dist/clients/path-attribution-telemetry.js +0 -43
  483. package/dist/clients/path-keyed-map.js +0 -108
  484. package/dist/clients/path-utils.js +0 -1244
  485. package/dist/clients/performance-report.js +0 -331
  486. package/dist/clients/persist-debounce.js +0 -70
  487. package/dist/clients/persistent-reverify.js +0 -271
  488. package/dist/clients/php-cs-fixer-config.js +0 -119
  489. package/dist/clients/pipeline.js +0 -1480
  490. package/dist/clients/post-autofix-notice.js +0 -37
  491. package/dist/clients/print-mode.js +0 -21
  492. package/dist/clients/probe-home-state.js +0 -228
  493. package/dist/clients/process-bridge.js +0 -66
  494. package/dist/clients/process-singletons.js +0 -210
  495. package/dist/clients/process-snapshot.js +0 -68
  496. package/dist/clients/project-changes.js +0 -181
  497. package/dist/clients/project-conventions.js +0 -171
  498. package/dist/clients/project-diagnostics/cache.js +0 -137
  499. package/dist/clients/project-diagnostics/extractors.js +0 -109
  500. package/dist/clients/project-diagnostics/fresh-fetch.js +0 -668
  501. package/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +0 -118
  502. package/dist/clients/project-diagnostics/runner-adapters/dead-code.js +0 -47
  503. package/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +0 -40
  504. package/dist/clients/project-diagnostics/runner-adapters/govulncheck.js +0 -34
  505. package/dist/clients/project-diagnostics/runner-adapters/jscpd.js +0 -38
  506. package/dist/clients/project-diagnostics/runner-adapters/knip.js +0 -47
  507. package/dist/clients/project-diagnostics/runner-adapters/madge.js +0 -48
  508. package/dist/clients/project-diagnostics/runner-adapters/opengrep.js +0 -40
  509. package/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +0 -127
  510. package/dist/clients/project-diagnostics/runner-adapters/trivy.js +0 -81
  511. package/dist/clients/project-diagnostics/scanner.js +0 -520
  512. package/dist/clients/project-diagnostics/types.js +0 -1
  513. package/dist/clients/project-lens-config.js +0 -807
  514. package/dist/clients/project-report.js +0 -701
  515. package/dist/clients/project-scale.js +0 -237
  516. package/dist/clients/project-scan-policy.js +0 -11
  517. package/dist/clients/project-snapshot-fingerprint.js +0 -48
  518. package/dist/clients/project-snapshot-persist-worker.js +0 -20
  519. package/dist/clients/project-snapshot.js +0 -1653
  520. package/dist/clients/project-trust.js +0 -181
  521. package/dist/clients/python-environment.js +0 -217
  522. package/dist/clients/python-provenance.js +0 -639
  523. package/dist/clients/quiet-window-config.js +0 -47
  524. package/dist/clients/quiet-window.js +0 -236
  525. package/dist/clients/read-bridge.js +0 -139
  526. package/dist/clients/read-expansion.js +0 -266
  527. package/dist/clients/read-guard-logger.js +0 -251
  528. package/dist/clients/read-guard-tool-lines.js +0 -1306
  529. package/dist/clients/read-guard.js +0 -1561
  530. package/dist/clients/recent-touches.js +0 -240
  531. package/dist/clients/redact/secrets.js +0 -449
  532. package/dist/clients/resource-sampler.js +0 -628
  533. package/dist/clients/reverse-deps.js +0 -270
  534. package/dist/clients/review-graph/builder.js +0 -5126
  535. package/dist/clients/review-graph/format.js +0 -33
  536. package/dist/clients/review-graph/git-identity.js +0 -163
  537. package/dist/clients/review-graph/import-resolvers.js +0 -481
  538. package/dist/clients/review-graph/persist-worker.js +0 -10
  539. package/dist/clients/review-graph/query.js +0 -244
  540. package/dist/clients/review-graph/revision-drift.js +0 -21
  541. package/dist/clients/review-graph/service.js +0 -96
  542. package/dist/clients/review-graph/shared-extraction-ir.js +0 -82
  543. package/dist/clients/review-graph/symbol-id.js +0 -103
  544. package/dist/clients/review-graph/tsconfig-paths.js +0 -299
  545. package/dist/clients/review-graph/types.js +0 -1
  546. package/dist/clients/review-graph/workspace-modules.js +0 -449
  547. package/dist/clients/review-graph-logger.js +0 -81
  548. package/dist/clients/ruff-client.js +0 -179
  549. package/dist/clients/rules-scanner.js +0 -131
  550. package/dist/clients/run-duration.js +0 -55
  551. package/dist/clients/runtime-agent-end.js +0 -746
  552. package/dist/clients/runtime-config.js +0 -77
  553. package/dist/clients/runtime-context.js +0 -211
  554. package/dist/clients/runtime-coordinator.js +0 -1324
  555. package/dist/clients/runtime-session.js +0 -2485
  556. package/dist/clients/runtime-tool-call.js +0 -1295
  557. package/dist/clients/runtime-tool-result.js +0 -2049
  558. package/dist/clients/runtime-turn.js +0 -3767
  559. package/dist/clients/rust-client.js +0 -97
  560. package/dist/clients/safe-spawn.js +0 -2357
  561. package/dist/clients/sanitize.js +0 -286
  562. package/dist/clients/scan-utils.js +0 -25
  563. package/dist/clients/scratch-tree-policy.js +0 -165
  564. package/dist/clients/search-read-registration.js +0 -94
  565. package/dist/clients/secret-findings.js +0 -114
  566. package/dist/clients/security-scan-client.js +0 -352
  567. package/dist/clients/session-event-guard.js +0 -297
  568. package/dist/clients/session-lifecycle.js +0 -484
  569. package/dist/clients/session-start-observability.js +0 -94
  570. package/dist/clients/session-state-store.js +0 -101
  571. package/dist/clients/session-summary.js +0 -15
  572. package/dist/clients/sessionstart-logger.js +0 -27
  573. package/dist/clients/sg-runner.js +0 -876
  574. package/dist/clients/sgconfig.js +0 -347
  575. package/dist/clients/shared-checkout-guard.js +0 -338
  576. package/dist/clients/single-flight.js +0 -158
  577. package/dist/clients/situational-tool-telemetry.js +0 -108
  578. package/dist/clients/skills-resolver.js +0 -141
  579. package/dist/clients/slow-fs.js +0 -138
  580. package/dist/clients/smells-rollup.js +0 -231
  581. package/dist/clients/source-filter.js +0 -596
  582. package/dist/clients/source-walker.js +0 -211
  583. package/dist/clients/spawn-output-cap.js +0 -120
  584. package/dist/clients/spawn-timeout-cooldown.js +0 -110
  585. package/dist/clients/stale-marker.js +0 -17
  586. package/dist/clients/startup-scan.js +0 -400
  587. package/dist/clients/startup-timing.js +0 -130
  588. package/dist/clients/string-utils.js +0 -33
  589. package/dist/clients/subagent-mode.js +0 -111
  590. package/dist/clients/symbol-containment.js +0 -24
  591. package/dist/clients/symbol-types.js +0 -5
  592. package/dist/clients/test-runner-client.js +0 -2507
  593. package/dist/clients/test-runner-delivery.js +0 -287
  594. package/dist/clients/todo-scanner.js +0 -229
  595. package/dist/clients/tool-agreement.js +0 -423
  596. package/dist/clients/tool-config.js +0 -249
  597. package/dist/clients/tool-cwd.js +0 -270
  598. package/dist/clients/tool-definition.js +0 -47
  599. package/dist/clients/tool-event.js +0 -105
  600. package/dist/clients/tool-policy.js +0 -2755
  601. package/dist/clients/tool-probe.js +0 -53
  602. package/dist/clients/tool-render.js +0 -156
  603. package/dist/clients/tool-set-policy.js +0 -118
  604. package/dist/clients/tree-sitter-cache.js +0 -364
  605. package/dist/clients/tree-sitter-client.js +0 -4195
  606. package/dist/clients/tree-sitter-logger.js +0 -100
  607. package/dist/clients/tree-sitter-navigator.js +0 -269
  608. package/dist/clients/tree-sitter-query-loader.js +0 -569
  609. package/dist/clients/tree-sitter-shared.js +0 -158
  610. package/dist/clients/tree-sitter-symbol-extractor.js +0 -1265
  611. package/dist/clients/trivy-client.js +0 -467
  612. package/dist/clients/tui-fit.js +0 -50
  613. package/dist/clients/turn-context.js +0 -52
  614. package/dist/clients/turn-end/lane.js +0 -51
  615. package/dist/clients/turn-end/lanes/govulncheck.js +0 -112
  616. package/dist/clients/turn-end/lanes/secrets.js +0 -204
  617. package/dist/clients/turn-summary-render.js +0 -72
  618. package/dist/clients/turn-summary.js +0 -132
  619. package/dist/clients/typos-config.js +0 -29
  620. package/dist/clients/user-notify.js +0 -51
  621. package/dist/clients/vanished-instance-marker.js +0 -57
  622. package/dist/clients/warm-attach.js +0 -305
  623. package/dist/clients/widget-state.js +0 -1808
  624. package/dist/clients/word-index-logger.js +0 -49
  625. package/dist/clients/word-index-store.js +0 -459
  626. package/dist/clients/word-index.js +0 -2080
  627. package/dist/clients/workspace-topology.js +0 -443
  628. package/dist/clients/write-ordering-guard.js +0 -65
  629. package/dist/clients/zizmor-config.js +0 -340
  630. package/dist/i18n.js +0 -69
  631. package/dist/mcp/build-staleness.js +0 -124
  632. package/dist/scripts/lib/process-scan.mjs +0 -583
  633. package/dist/scripts/lib/skills-predicate.mjs +0 -129
  634. package/dist/scripts/lib/web-tree-sitter-dir.mjs +0 -123
  635. package/dist/tools/activate-tools.js +0 -87
  636. package/dist/tools/ast-grep-outline.js +0 -137
  637. package/dist/tools/ast-grep-replace.js +0 -244
  638. package/dist/tools/ast-grep-search.js +0 -762
  639. package/dist/tools/effective-config.js +0 -90
  640. package/dist/tools/lens-diagnostic-mark.js +0 -375
  641. package/dist/tools/lens-diagnostics.js +0 -2571
  642. package/dist/tools/lsp-diagnostics.js +0 -1745
  643. package/dist/tools/lsp-navigation.js +0 -1367
  644. package/dist/tools/lsp-structured-output.js +0 -294
  645. package/dist/tools/module-report.js +0 -382
  646. package/dist/tools/project-report.js +0 -86
  647. package/dist/tools/render-compact.js +0 -374
  648. package/dist/tools/scan-progress.js +0 -53
  649. package/dist/tools/shared.js +0 -29
  650. package/dist/tools/symbol-search.js +0 -155
@@ -0,0 +1,756 @@
1
+ import { createRequire as __pilensCreateRequire } from "node:module"; const require = __pilensCreateRequire(import.meta.url);
2
+ import {
3
+ HardFailureStamps
4
+ } from "./chunk-7U2IDNXN.js";
5
+ import {
6
+ formatToolFailure
7
+ } from "./chunk-ZMOL6RQC.js";
8
+ import {
9
+ spawnFailedWithNoOutput
10
+ } from "./chunk-I7SPGOWI.js";
11
+ import {
12
+ createAvailabilityChecker,
13
+ findManagedNodeToolBinary,
14
+ getManagedToolEnvironment,
15
+ resolveAvailableOrInstall
16
+ } from "./chunk-7FBF7NPR.js";
17
+ import "./chunk-HHYAELLJ.js";
18
+ import {
19
+ canonicalDirectory,
20
+ listNestedLinkedWorktreeRoots
21
+ } from "./chunk-3I5QFT3N.js";
22
+ import "./chunk-B3I2UUT4.js";
23
+ import "./chunk-DIULIWKU.js";
24
+ import "./chunk-VDBPVIKD.js";
25
+ import "./chunk-TGPXLY2J.js";
26
+ import "./chunk-QOZXJ4NA.js";
27
+ import "./chunk-PAK6IDME.js";
28
+ import "./chunk-GUOGVTCQ.js";
29
+ import "./chunk-AJVLWNFN.js";
30
+ import "./chunk-YGVYKNSN.js";
31
+ import "./chunk-LNAKEO63.js";
32
+ import "./chunk-Z3CCVDUB.js";
33
+ import "./chunk-2BEMIWEW.js";
34
+ import {
35
+ logSessionStart
36
+ } from "./chunk-OQGFCZJ4.js";
37
+ import "./chunk-RUOG5D2C.js";
38
+ import {
39
+ findLocalBinUpwards
40
+ } from "./chunk-U3VGR4VU.js";
41
+ import "./chunk-NTUJEGDZ.js";
42
+ import "./chunk-EOKRQ3SA.js";
43
+ import {
44
+ createAvailabilityLatch,
45
+ describeUnavailability
46
+ } from "./chunk-WONERJTP.js";
47
+ import "./chunk-22AVIGXS.js";
48
+ import "./chunk-GVXA6CCE.js";
49
+ import "./chunk-6QIUX4EP.js";
50
+ import "./chunk-VHQLPIRJ.js";
51
+ import {
52
+ getProjectDataDir,
53
+ safeSpawnAsync
54
+ } from "./chunk-VN2AXLEX.js";
55
+ import "./chunk-BW5KFIQC.js";
56
+ import "./chunk-QYF5S6P6.js";
57
+ import "./chunk-5ZEJHV35.js";
58
+ import "./chunk-DQ2NZ7C4.js";
59
+ import "./chunk-VNMT7C64.js";
60
+ import "./chunk-2EECBNC5.js";
61
+ import {
62
+ incrementDegradationCount
63
+ } from "./chunk-N3YQJI6O.js";
64
+ import {
65
+ createSubsystemLogger
66
+ } from "./chunk-O6TQT6RI.js";
67
+ import "./chunk-5THXD6X5.js";
68
+ import "./chunk-UK3CMEAL.js";
69
+ import "./chunk-LJDODBBZ.js";
70
+ import "./chunk-ABBOA7UD.js";
71
+ import {
72
+ findNearestMarkerRoot,
73
+ normalizeEphemeralMapKey,
74
+ normalizeFilePath
75
+ } from "./chunk-Q5U6FMDI.js";
76
+ import "./chunk-NXL4FFQQ.js";
77
+
78
+ // dist/clients/knip-client.js
79
+ import * as fs from "node:fs";
80
+ import * as path from "node:path";
81
+ var EMPTY_RESULT = {
82
+ success: false,
83
+ issues: [],
84
+ unusedExports: [],
85
+ unusedFiles: [],
86
+ unusedDeps: [],
87
+ unlistedDeps: []
88
+ };
89
+ var ANALYSIS_TIMEOUT_MS = 3e4;
90
+ function readOverridePinnedPackageNames(targetDir) {
91
+ const names = /* @__PURE__ */ new Set();
92
+ let pkg;
93
+ try {
94
+ pkg = JSON.parse(fs.readFileSync(path.join(targetDir, "package.json"), "utf-8"));
95
+ } catch {
96
+ return names;
97
+ }
98
+ const collectKeys = (value) => {
99
+ if (!value || typeof value !== "object" || Array.isArray(value))
100
+ return;
101
+ for (const [key, nested] of Object.entries(value)) {
102
+ names.add(key);
103
+ collectKeys(nested);
104
+ }
105
+ };
106
+ collectKeys(pkg.overrides);
107
+ collectKeys(pkg.resolutions);
108
+ collectKeys(pkg.pnpm?.overrides);
109
+ return names;
110
+ }
111
+ var KNIP_CONFIG_FILENAMES = [
112
+ "knip.json",
113
+ "knip.jsonc",
114
+ "knip.ts",
115
+ "knip.js",
116
+ "knip.config.ts",
117
+ "knip.config.js",
118
+ ".knip.json",
119
+ ".knip.jsonc",
120
+ ".knip.ts",
121
+ ".knip.js"
122
+ ];
123
+ function resolveProjectKnipConfig(targetDir) {
124
+ for (const name of KNIP_CONFIG_FILENAMES) {
125
+ if (fs.existsSync(path.join(targetDir, name)))
126
+ return name;
127
+ }
128
+ try {
129
+ const pkg = JSON.parse(fs.readFileSync(path.join(targetDir, "package.json"), "utf-8"));
130
+ if (pkg && typeof pkg === "object" && pkg.knip !== void 0) {
131
+ return "package.json#knip";
132
+ }
133
+ } catch {
134
+ }
135
+ return null;
136
+ }
137
+ function resolveProjectKnipBinary(targetDir) {
138
+ return findLocalBinUpwards("knip", targetDir) ?? null;
139
+ }
140
+ function classifyKnipBinary(binary, targetDir) {
141
+ if (binary === null)
142
+ return "managed-or-path";
143
+ const relative2 = path.relative(path.resolve(targetDir), path.resolve(binary));
144
+ return relative2 === "" || relative2.startsWith("..") || path.isAbsolute(relative2) ? "global" : "project";
145
+ }
146
+ function readKnipShimVersion(binary) {
147
+ if (!path.isAbsolute(binary))
148
+ return null;
149
+ const binDir = path.dirname(binary);
150
+ if (path.basename(binDir) !== ".bin")
151
+ return null;
152
+ try {
153
+ const pkg = JSON.parse(fs.readFileSync(path.join(path.dirname(binDir), "knip", "package.json"), "utf-8"));
154
+ const version = pkg.version;
155
+ return typeof version === "string" ? version : null;
156
+ } catch {
157
+ return null;
158
+ }
159
+ }
160
+ var NO_NESTED_WORKTREES = {
161
+ count: 0,
162
+ contains: () => false
163
+ };
164
+ function nestedWorktreeScope(targetDir) {
165
+ const prefixes = [];
166
+ for (const root of listNestedLinkedWorktreeRoots(targetDir)) {
167
+ prefixes.push(`${normalizeEphemeralMapKey(normalizeFilePath(root))}/`);
168
+ }
169
+ if (prefixes.length === 0)
170
+ return NO_NESTED_WORKTREES;
171
+ const base = normalizeFilePath(canonicalDirectory(targetDir));
172
+ return {
173
+ count: prefixes.length,
174
+ contains: (file) => {
175
+ if (!file)
176
+ return false;
177
+ const key = normalizeEphemeralMapKey(`${base}/${file}`);
178
+ return prefixes.some((prefix) => key.startsWith(prefix));
179
+ }
180
+ };
181
+ }
182
+ var MAX_RECORDED_TOOLCHAINS = 32;
183
+ var KnipClient = class {
184
+ knipAvailability = createAvailabilityChecker("knip", ".cmd", ["--version"], {
185
+ environment: (cwd) => getManagedToolEnvironment("knip", cwd),
186
+ unclassifiedFailureOutcome: "missing",
187
+ fastPath: () => findManagedNodeToolBinary("knip")
188
+ });
189
+ /**
190
+ * Client-side memo. Only a DURABLE verdict is latched — a transient probe
191
+ * failure expires, so an installed knip becomes available again without a
192
+ * host restart (#1467).
193
+ */
194
+ availabilityLatch = createAvailabilityLatch();
195
+ knipCommand = "knip";
196
+ ensureInFlight = null;
197
+ log;
198
+ /**
199
+ * De-dupe concurrent `analyze()` calls against the same project root.
200
+ *
201
+ * Without this guard, two back-to-back turn_end events (or a turn_end
202
+ * firing while the session_start scan is still in flight) can each spawn
203
+ * a fresh `knip` process over the same tree. Two concurrent knip
204
+ * runs are CPU-bound and cause the exact pathology we're fixing: load
205
+ * averages >5, TUI freezes, and zombie processes reparented to init
206
+ * after pi exits mid-scan.
207
+ *
208
+ * Key: canonicalised project root (not the caller's cwd). Value is the
209
+ * in-flight promise; completing clears the slot.
210
+ */
211
+ inFlight = /* @__PURE__ */ new Map();
212
+ /**
213
+ * Per project root, the last run that died to a timeout or kill (#3872).
214
+ * Set where the scan SETTLES, so a scan turn_end abandoned at its budget and
215
+ * that later timed out still leaves the failure the next turn must see:
216
+ * the turn's own cache row only exists for a scan that settled inside it.
217
+ */
218
+ hardFailures = new HardFailureStamps();
219
+ /**
220
+ * Per project root, how long its last two successful scans took (#3872).
221
+ * turn_end reads the shorter of the two to stop awaiting a scan that cannot
222
+ * fit the hook budget: the scan still runs (it re-measures, and warms knip's
223
+ * own cache), the hook just no longer waits for it. Two samples, because a
224
+ * session's first scan of a root is cold and its second is not (3.3 s then
225
+ * 1.3 s on pi-lens itself): one cold sample must not cost the next turn its
226
+ * advisory. A scan that failed, was killed or never completed is no sample.
227
+ * Cleared with the other per-session state.
228
+ */
229
+ scanDurations = /* @__PURE__ */ new Map();
230
+ /** Last successful result per project and runtime content generation. */
231
+ completedByProject = /* @__PURE__ */ new Map();
232
+ /**
233
+ * (project root, binary, config) triples already recorded, so the toolchain
234
+ * row is written once per distinct resolution instead of once per run.
235
+ */
236
+ recordedToolchains = /* @__PURE__ */ new Set();
237
+ constructor(verbose = false) {
238
+ this.log = verbose ? createSubsystemLogger("knip") : () => {
239
+ };
240
+ }
241
+ /** Re-arm content-keyed reuse at the session boundary. */
242
+ resetSessionState() {
243
+ this.completedByProject.clear();
244
+ this.hardFailures.clear();
245
+ this.scanDurations.clear();
246
+ }
247
+ /**
248
+ * Find the nearest directory with a project/knip config marker.
249
+ *
250
+ * Returns `null` when no marker is found up to the filesystem root.
251
+ * Callers MUST treat a null return as "no project here, skip knip" —
252
+ * previously this fell back to `startDir`, which on a bare cwd like
253
+ * `/home/v` caused knip to recurse through every project and balloon
254
+ * memory/CPU.
255
+ *
256
+ * Delegates to the shared path-utils helper (refs #625) — never treats a
257
+ * package/knip config at or above $HOME as the project (escapes the
258
+ * workspace, #296/#250), and never walks past a `.git`/`.hg`/`.svn`
259
+ * boundary to pick up an unrelated parent's package.json (Unity/non-JS
260
+ * repos often have no package.json at their own root).
261
+ */
262
+ resolveProjectRoot(startDir, homeDirOverride) {
263
+ return findNearestMarkerRoot(startDir, [
264
+ "package.json",
265
+ "knip.json",
266
+ "knip.ts",
267
+ "knip.config.js",
268
+ "knip.config.ts"
269
+ ], { boundaries: [".git", ".hg", ".svn"], homeDir: homeDirOverride });
270
+ }
271
+ /**
272
+ * Check if knip CLI is available, auto-install if not.
273
+ *
274
+ * The memo returns `null` when the last verdict was transient and its
275
+ * cooldown has expired, which re-enters the probe. That is the difference
276
+ * between "knip is missing" (a fact worth caching) and "the probe timed out"
277
+ * (a moment worth retrying).
278
+ */
279
+ async ensureAvailable() {
280
+ const memo = this.availabilityLatch.read();
281
+ if (memo !== null)
282
+ return memo;
283
+ if (this.ensureInFlight)
284
+ return this.ensureInFlight;
285
+ this.ensureInFlight = this.doEnsureAvailable();
286
+ try {
287
+ return await this.ensureInFlight;
288
+ } finally {
289
+ this.ensureInFlight = null;
290
+ }
291
+ }
292
+ async doEnsureAvailable() {
293
+ const cwd = process.cwd();
294
+ const resolved = await resolveAvailableOrInstall(this.knipAvailability, "knip", cwd);
295
+ if (resolved !== null) {
296
+ this.knipCommand = resolved;
297
+ this.availabilityLatch.noteAvailable();
298
+ return true;
299
+ }
300
+ const verdict = this.knipAvailability.getVerdict(cwd);
301
+ this.availabilityLatch.noteUnavailable(verdict.outcome ?? "missing", verdict.cause ?? "not-found");
302
+ return false;
303
+ }
304
+ /**
305
+ * The single place a knip-unavailable result is worded. A transient probe
306
+ * failure must never be reported as "install knip" — knip is on disk.
307
+ */
308
+ unavailableResult() {
309
+ const verdict = this.knipAvailability.getVerdict(process.cwd());
310
+ const transient = verdict.outcome === "transient";
311
+ const retryAfterMs = verdict.retryAtMs ? Math.max(0, verdict.retryAtMs - Date.now()) : void 0;
312
+ return {
313
+ ...EMPTY_RESULT,
314
+ failureKind: transient ? "unavailable-transient" : "unavailable-missing",
315
+ summary: describeUnavailability({
316
+ tool: "Knip",
317
+ installHint: "npm install -D knip",
318
+ outcome: verdict.outcome,
319
+ cause: verdict.cause,
320
+ elapsedMs: verdict.elapsedMs,
321
+ retryAfterMs
322
+ })
323
+ };
324
+ }
325
+ /**
326
+ * The summary of this root's last timeout or kill, while it is recent
327
+ * enough (30 minutes) to keep turn_end from launching another heavyweight
328
+ * knip (#1467, #3872); `null` when there is none. The root is resolved the
329
+ * way `analyze` resolves it, so a subdirectory and its project root agree.
330
+ */
331
+ recentHardFailure(cwd) {
332
+ const key = this.resolveProjectRoot(cwd);
333
+ if (!key)
334
+ return null;
335
+ return this.hardFailures.recent(key);
336
+ }
337
+ /**
338
+ * The shorter of this root's last two successful scans, or `undefined` while
339
+ * fewer than two settled this session (#3872). The root is resolved the way
340
+ * `analyze` resolves it.
341
+ */
342
+ scanFloorMs(cwd) {
343
+ const samples = this.scanDurations.get(this.resolveProjectRoot(cwd) ?? cwd);
344
+ return samples?.length === 2 ? Math.min(...samples) : void 0;
345
+ }
346
+ /** Linked worktrees nested under this root, which knip walks as project files (#3872). */
347
+ nestedWorktrees(cwd) {
348
+ return nestedWorktreeScope(this.resolveProjectRoot(cwd) ?? cwd).count;
349
+ }
350
+ /**
351
+ * Run knip analysis on the project.
352
+ *
353
+ * Async (uses `safeSpawnAsync`) so it never blocks the event loop —
354
+ * knip scans on large monorepos can take tens of seconds, and the
355
+ * previous `spawnSync` implementation froze the TUI for the entire
356
+ * duration.
357
+ *
358
+ * Re-entrancy safe: concurrent calls resolving to the same project
359
+ * root share a single knip process via `inFlight`.
360
+ *
361
+ * Successful memo hits validate package.json and the resolved Knip config
362
+ * with bounded metadata checks. The two statSync calls replace a 10-23
363
+ * second project scan. Source-only external edits remain undetected until
364
+ * pi observes a write or the session resets.
365
+ */
366
+ async analyze(cwd, _ignore, options = {}) {
367
+ const targetDir = this.resolveProjectRoot(cwd || process.cwd());
368
+ if (!targetDir) {
369
+ this.log(`No project root found from ${cwd || process.cwd()}; skipping knip`);
370
+ return {
371
+ ...EMPTY_RESULT,
372
+ success: true,
373
+ summary: "No project root found; knip skipped"
374
+ };
375
+ }
376
+ const key = path.resolve(targetDir);
377
+ const completed = this.completedByProject.get(key);
378
+ if (options.projectSeq !== void 0 && completed?.projectSeq === options.projectSeq && this.matchesMemoSignal(targetDir, completed.signal)) {
379
+ this.log(`Analysis cache hit for ${key} at projectSeq ${options.projectSeq}`);
380
+ return { ...completed.result, execution: "cache", analyzed: false };
381
+ }
382
+ if (resolveProjectKnipBinary(targetDir) === null && !await this.ensureAvailable()) {
383
+ return this.unavailableResult();
384
+ }
385
+ const existing = this.inFlight.get(key);
386
+ if (existing) {
387
+ this.log(`Analysis already in flight for ${key}; sharing result`);
388
+ return existing;
389
+ }
390
+ const startedAt = Date.now();
391
+ const promise = this.runAnalyze(key).then((result) => {
392
+ this.hardFailures.settle(key, result);
393
+ if (result.success) {
394
+ this.scanDurations.set(key, [
395
+ ...(this.scanDurations.get(key) ?? []).slice(-1),
396
+ Date.now() - startedAt
397
+ ]);
398
+ }
399
+ const executed = { ...result, execution: "executed" };
400
+ if (result.success && options.projectSeq !== void 0) {
401
+ this.completedByProject.set(key, {
402
+ projectSeq: options.projectSeq,
403
+ result: executed,
404
+ signal: this.readMemoSignal(key)
405
+ });
406
+ }
407
+ return executed;
408
+ });
409
+ const wrapped = promise.finally(() => {
410
+ if (this.inFlight.get(key) === wrapped)
411
+ this.inFlight.delete(key);
412
+ });
413
+ this.inFlight.set(key, wrapped);
414
+ return wrapped;
415
+ }
416
+ readMemoFileSignal(filePath) {
417
+ try {
418
+ const stat = fs.statSync(filePath);
419
+ return { path: filePath, mtimeMs: stat.mtimeMs, size: stat.size };
420
+ } catch {
421
+ return null;
422
+ }
423
+ }
424
+ readMemoSignal(targetDir) {
425
+ const config = resolveProjectKnipConfig(targetDir);
426
+ return {
427
+ packageJson: this.readMemoFileSignal(path.join(targetDir, "package.json")),
428
+ config: config && config !== "package.json#knip" ? this.readMemoFileSignal(path.join(targetDir, config)) : null
429
+ };
430
+ }
431
+ matchesMemoSignal(targetDir, signal) {
432
+ const current = {
433
+ packageJson: this.readMemoFileSignal(path.join(targetDir, "package.json")),
434
+ config: signal.config ? this.readMemoFileSignal(signal.config.path) : null
435
+ };
436
+ return JSON.stringify(current.packageJson) === JSON.stringify(signal.packageJson) && JSON.stringify(current.config) === JSON.stringify(signal.config);
437
+ }
438
+ async runAnalyze(targetDir) {
439
+ const scannedAt = (/* @__PURE__ */ new Date()).toISOString();
440
+ const cacheLocation = path.join(getProjectDataDir(targetDir), "cache", "knip");
441
+ try {
442
+ fs.mkdirSync(cacheLocation, { recursive: true });
443
+ } catch (err) {
444
+ this.log(`Failed to pre-create knip cache dir ${cacheLocation}: ${err}`);
445
+ }
446
+ this.pruneStaleGlobCache(cacheLocation);
447
+ const args = [
448
+ "--reporter=json",
449
+ "--include",
450
+ // enumMembers surfaces unused enum members — finer-grained than
451
+ // file-level exports. (knip 6.x has NO `classMembers` issue type; passing
452
+ // it makes knip exit 2 with zero output, silently disabling the scan —
453
+ // verified against knip 6.20. Valid member-level type here is enumMembers.)
454
+ "files,exports,types,dependencies,unlisted,enumMembers",
455
+ "--cache",
456
+ "--cache-location",
457
+ cacheLocation
458
+ ];
459
+ const projectBinary = resolveProjectKnipBinary(targetDir);
460
+ const command = projectBinary ?? this.knipCommand;
461
+ this.recordToolchain(targetDir, command, classifyKnipBinary(projectBinary, targetDir));
462
+ const result = await safeSpawnAsync(command, args, {
463
+ timeout: ANALYSIS_TIMEOUT_MS,
464
+ cwd: targetDir,
465
+ env: await getManagedToolEnvironment("knip", targetDir)
466
+ });
467
+ if (result.error) {
468
+ this.log(`Analysis error: ${result.error.message}`);
469
+ return {
470
+ ...EMPTY_RESULT,
471
+ summary: `Error: ${result.error.message}`
472
+ };
473
+ }
474
+ const output = result.stdout || "";
475
+ this.log(`Knip output length: ${output.length}, exit status: ${result.status}`);
476
+ if (output.length < 500) {
477
+ this.log(`Knip output sample: ${output}`);
478
+ }
479
+ if (!output.trim()) {
480
+ if (spawnFailedWithNoOutput(result, output)) {
481
+ const reason = formatToolFailure({
482
+ tool: "knip",
483
+ status: result.status,
484
+ signal: result.signal,
485
+ stderr: result.stderr,
486
+ fields: {
487
+ command,
488
+ source: classifyKnipBinary(projectBinary, targetDir)
489
+ }
490
+ });
491
+ this.log(reason);
492
+ incrementDegradationCount({
493
+ kind: "runner-empty-result",
494
+ subject: "knip",
495
+ reason
496
+ });
497
+ return {
498
+ ...EMPTY_RESULT,
499
+ summary: `Knip exited ${result.status} with no output; run skipped`
500
+ };
501
+ }
502
+ return {
503
+ ...EMPTY_RESULT,
504
+ success: true,
505
+ summary: "No issues found"
506
+ };
507
+ }
508
+ return {
509
+ ...this.dropOverridePinnedDeps(this.parseOutput(output, nestedWorktreeScope(targetDir)), targetDir),
510
+ scannedAt
511
+ };
512
+ }
513
+ /**
514
+ * Record WHICH knip a run used and WHICH config it ran under (#1721).
515
+ *
516
+ * The dogfood failure this fixes was invisible from the outside: the lens
517
+ * reported 62 unused type exports and the project's own `npx knip` reported
518
+ * none, with nothing in any log to say the two ran different binaries. This
519
+ * row is that missing evidence — it names the shim, its version, the config
520
+ * knip will discover, and whether the shim came from the project or from
521
+ * pi-lens.
522
+ *
523
+ * Bounded twice over: one row per distinct (project root, binary, config)
524
+ * triple, and at most `MAX_RECORDED_TOOLCHAINS` distinct triples per client.
525
+ * Steady-state cost is therefore one line per project per session, not one
526
+ * per turn_end.
527
+ */
528
+ recordToolchain(targetDir, command, source) {
529
+ const config = resolveProjectKnipConfig(targetDir);
530
+ const key = `${targetDir} ${command} ${config ?? ""}`;
531
+ if (this.recordedToolchains.has(key))
532
+ return;
533
+ if (this.recordedToolchains.size >= MAX_RECORDED_TOOLCHAINS)
534
+ return;
535
+ this.recordedToolchains.add(key);
536
+ const version = readKnipShimVersion(command);
537
+ logSessionStart(`knip toolchain ${targetDir}: binary=${command}${version ? ` version=${version}` : ""} source=${source} config=${config ?? "none (knip defaults)"}`);
538
+ }
539
+ /**
540
+ * Delete knip's glob cache (`glob-<version>.cache`) before every run (#1630).
541
+ *
542
+ * knip revalidates a cached glob against the mtimes of the directories that
543
+ * contributed a matched path. Directories that matched nothing are never
544
+ * recorded, so files later added to them stay invisible and knip keeps
545
+ * reporting an export as unused after a new consumer imports it. Removing
546
+ * this one file forces a fresh file walk while the module and plugin caches —
547
+ * which carry nearly all of the cache's speed — survive.
548
+ *
549
+ * Failures are logged and ignored: a glob cache we could not delete degrades
550
+ * to the pre-#1630 behavior, which is stale but not fatal.
551
+ */
552
+ pruneStaleGlobCache(cacheLocation) {
553
+ let entries;
554
+ try {
555
+ entries = fs.readdirSync(cacheLocation);
556
+ } catch (err) {
557
+ this.log(`Failed to read knip cache dir ${cacheLocation}: ${err}`);
558
+ return;
559
+ }
560
+ for (const entry of entries) {
561
+ if (!entry.startsWith("glob-") || !entry.endsWith(".cache"))
562
+ continue;
563
+ try {
564
+ fs.rmSync(path.join(cacheLocation, entry), { force: true });
565
+ this.log(`Pruned knip glob cache ${entry}`);
566
+ } catch (err) {
567
+ this.log(`Failed to prune knip glob cache ${entry}: ${err}`);
568
+ }
569
+ }
570
+ }
571
+ /**
572
+ * Drop `dependency`/`devDependency` issues for a package that's also
573
+ * referenced as an npm `overrides` (or Yarn `resolutions` / pnpm
574
+ * `pnpm.overrides`) key in this project's `package.json` (#968).
575
+ *
576
+ * A direct devDependency whose only job is pinning a vulnerable
577
+ * transitive/peer resolution has no source import — that's WORKING AS
578
+ * INTENDED, not dead code, and knip has no concept of "this dependency
579
+ * exists only to satisfy an overrides entry" (it only sees imports).
580
+ * `overrides`/`resolutions` are the project's own explicit, unambiguous
581
+ * signal that the package is deliberately present — the same class of
582
+ * signal `hardcoded-url`'s `SCREAMING_SNAKE_CASE` constant-name carve-out
583
+ * and `ts-ssrf`'s constant-identifier carve-out lean on elsewhere in this
584
+ * codebase — so this narrows the finding rather than suppressing
585
+ * `dependency`/`devDependency` issues wholesale: a devDependency that
586
+ * ISN'T also an overrides/resolutions key is still reported.
587
+ */
588
+ dropOverridePinnedDeps(result, targetDir) {
589
+ if (result.unusedDeps.length === 0)
590
+ return result;
591
+ const pinned = readOverridePinnedPackageNames(targetDir);
592
+ if (pinned.size === 0)
593
+ return result;
594
+ const isPinnedDepIssue = (issue) => (issue.type === "dependency" || issue.type === "devDependency") && (pinned.has(issue.name) || !!issue.package && pinned.has(issue.package));
595
+ const issues = result.issues.filter((issue) => !isPinnedDepIssue(issue));
596
+ const unusedDeps = result.unusedDeps.filter((issue) => !isPinnedDepIssue(issue));
597
+ return unusedDeps.length === result.unusedDeps.length ? result : { ...result, issues, unusedDeps };
598
+ }
599
+ /**
600
+ * Find unused exports in a specific file
601
+ */
602
+ async findUnusedExports(filePath) {
603
+ const result = await this.analyze(path.dirname(filePath));
604
+ const basename2 = path.basename(filePath);
605
+ return result.unusedExports.filter((e) => e.file?.includes(basename2)).map((e) => e.name);
606
+ }
607
+ /**
608
+ * Format results for LLM consumption. Delegates to the pure
609
+ * `formatKnipResult` so callers (e.g. turn-end) can format without a live
610
+ * client instance.
611
+ */
612
+ formatResult(result, maxItems = 20) {
613
+ return formatKnipResult(result, maxItems);
614
+ }
615
+ // --- Internal ---
616
+ parseOutput(output, nested = NO_NESTED_WORKTREES) {
617
+ try {
618
+ const data = JSON.parse(output);
619
+ const issues = [];
620
+ const unusedExports = [];
621
+ const unusedFiles = [];
622
+ const unusedDeps = [];
623
+ const unlistedDeps = [];
624
+ const droppedFiles = /* @__PURE__ */ new Set();
625
+ const addIssue = (issue) => {
626
+ if (nested.contains(issue.file)) {
627
+ droppedFiles.add(issue.file ?? "");
628
+ return;
629
+ }
630
+ issues.push(issue);
631
+ if (issue.type === "export" || issue.type === "enumMember") {
632
+ unusedExports.push(issue);
633
+ }
634
+ if (issue.type === "file")
635
+ unusedFiles.push(issue);
636
+ if (issue.type === "dependency" || issue.type === "devDependency") {
637
+ unusedDeps.push(issue);
638
+ }
639
+ if (issue.type === "unlisted" || issue.type === "bin") {
640
+ unlistedDeps.push(issue);
641
+ }
642
+ };
643
+ const fileEntries = Array.isArray(data?.issues) ? data.issues : [];
644
+ for (const entry of fileEntries) {
645
+ const file = entry.file ?? "";
646
+ const push = (arr, type, _target) => {
647
+ for (const item of arr) {
648
+ addIssue({
649
+ type,
650
+ name: item.name ?? item.symbol ?? String(item),
651
+ file,
652
+ line: item.line,
653
+ package: item.package
654
+ });
655
+ }
656
+ };
657
+ push(entry.exports ?? [], "export", unusedExports);
658
+ push(entry.types ?? [], "export", unusedExports);
659
+ push(entry.enumMembers ?? [], "enumMember", unusedExports);
660
+ push(entry.files ?? [], "file", unusedFiles);
661
+ push(entry.dependencies ?? [], "dependency", unusedDeps);
662
+ push(entry.devDependencies ?? [], "devDependency", unusedDeps);
663
+ push(entry.unlisted ?? [], "unlisted", unlistedDeps);
664
+ push(entry.binaries ?? [], "bin", unlistedDeps);
665
+ }
666
+ if (issues.length === 0 && Array.isArray(data)) {
667
+ for (const item of data) {
668
+ if (!item || typeof item !== "object")
669
+ continue;
670
+ const rawType = String(item.type ?? item.issueType ?? item.kind ?? "file").toLowerCase();
671
+ const type = rawType === "export" || rawType === "exports" ? "export" : rawType === "dependency" ? "dependency" : rawType === "devdependency" ? "devDependency" : rawType === "unlisted" ? "unlisted" : rawType === "bin" || rawType === "binaries" ? "bin" : "file";
672
+ addIssue({
673
+ type,
674
+ name: String(item.name ?? item.symbol ?? item.package ?? item.message ?? "unknown"),
675
+ file: item.file ?? item.path ?? item.location?.file,
676
+ line: item.line ?? item.location?.line,
677
+ package: item.package
678
+ });
679
+ }
680
+ }
681
+ return {
682
+ success: true,
683
+ // #2154: the one knip site that parsed a scan of this root.
684
+ analyzed: true,
685
+ issues,
686
+ unusedExports,
687
+ unusedFiles,
688
+ unusedDeps,
689
+ unlistedDeps,
690
+ summary: `Found ${issues.length} issues`,
691
+ ...nested.count > 0 && {
692
+ nestedWorktrees: nested.count,
693
+ nestedFilesDropped: droppedFiles.size
694
+ }
695
+ };
696
+ } catch (err) {
697
+ void err;
698
+ this.log("Failed to parse knip JSON output");
699
+ return {
700
+ ...EMPTY_RESULT,
701
+ summary: "Failed to parse output"
702
+ };
703
+ }
704
+ }
705
+ };
706
+ function formatKnipResult(result, maxItems = 20) {
707
+ if (!result.success)
708
+ return `[Knip] ${result.summary}`;
709
+ if (result.issues.length === 0)
710
+ return "";
711
+ let output = `[Knip] ${result.issues.length} issue(s)`;
712
+ if (result.unusedExports.length)
713
+ output += ` \u2014 ${result.unusedExports.length} unused export(s)`;
714
+ if (result.unusedFiles.length)
715
+ output += ` \u2014 ${result.unusedFiles.length} unused file(s)`;
716
+ if (result.unusedDeps.length)
717
+ output += ` \u2014 ${result.unusedDeps.length} unused dep(s)`;
718
+ if (result.unlistedDeps.length)
719
+ output += ` \u2014 ${result.unlistedDeps.length} unlisted dep(s)`;
720
+ output += ":\n";
721
+ if (result.unusedExports.length > 0) {
722
+ output += "\n Unused exports:\n";
723
+ for (const issue of result.unusedExports.slice(0, maxItems)) {
724
+ const loc = issue.file ? ` (${path.basename(issue.file)})` : "";
725
+ output += ` - ${issue.name}${loc}
726
+ `;
727
+ }
728
+ if (result.unusedExports.length > maxItems) {
729
+ output += ` ... and ${result.unusedExports.length - maxItems} more
730
+ `;
731
+ }
732
+ }
733
+ if (result.unusedFiles.length > 0) {
734
+ output += "\n Unused files:\n";
735
+ for (const issue of result.unusedFiles.slice(0, 10)) {
736
+ output += ` - ${issue.name}
737
+ `;
738
+ }
739
+ }
740
+ if (result.unusedDeps.length > 0) {
741
+ output += "\n Unused dependencies:\n";
742
+ for (const issue of result.unusedDeps) {
743
+ output += ` - ${issue.package || issue.name}
744
+ `;
745
+ }
746
+ }
747
+ return output;
748
+ }
749
+ export {
750
+ KnipClient,
751
+ classifyKnipBinary,
752
+ formatKnipResult,
753
+ readOverridePinnedPackageNames,
754
+ resolveProjectKnipBinary,
755
+ resolveProjectKnipConfig
756
+ };