@herbertgao/pi-extensions 2026.10.0 → 2026.10.2

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 (769) hide show
  1. package/README.md +16 -12
  2. package/THIRD_PARTY_NOTICES.md +3 -3
  3. package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-audit.md +2 -2
  4. package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-debt.md +2 -2
  5. package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-gain.md +1 -1
  6. package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-help.md +1 -1
  7. package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-review.md +2 -2
  8. package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail.md +1 -1
  9. package/node_modules/@dietrichgebert/ponytail/.opencode/plugins/index.js +4 -0
  10. package/node_modules/@dietrichgebert/ponytail/.opencode/plugins/ponytail-frontmatter.cjs +43 -3
  11. package/node_modules/@dietrichgebert/ponytail/.opencode/plugins/ponytail.mjs +142 -59
  12. package/node_modules/@dietrichgebert/ponytail/.qoder/rules/ponytail.md +21 -21
  13. package/node_modules/@dietrichgebert/ponytail/.qoder-plugin/plugin.json +1 -1
  14. package/node_modules/@dietrichgebert/ponytail/AGENTS.md +21 -21
  15. package/node_modules/@dietrichgebert/ponytail/README.md +52 -242
  16. package/node_modules/@dietrichgebert/ponytail/hooks/claude-codex-hooks.json +3 -3
  17. package/node_modules/@dietrichgebert/ponytail/hooks/copilot-hooks.json +4 -4
  18. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-activate.js +70 -16
  19. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-config.js +8 -7
  20. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-instructions.js +30 -30
  21. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-map.js +103 -0
  22. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-mode-tracker.js +46 -23
  23. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-runtime.js +39 -7
  24. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-subagent.js +20 -3
  25. package/node_modules/@dietrichgebert/ponytail/hooks/qoder-hooks.json +3 -3
  26. package/node_modules/@dietrichgebert/ponytail/package.json +3 -3
  27. package/node_modules/@dietrichgebert/ponytail/pi-extension/index.js +47 -17
  28. package/node_modules/@dietrichgebert/ponytail/scripts/uninstall.js +21 -7
  29. package/node_modules/@dietrichgebert/ponytail/skills/plugin.json +5 -0
  30. package/node_modules/@dietrichgebert/ponytail/skills/ponytail/SKILL.md +33 -101
  31. package/node_modules/@dietrichgebert/ponytail/skills/ponytail-audit/SKILL.md +89 -27
  32. package/node_modules/@dietrichgebert/ponytail/skills/ponytail-debt/SKILL.md +13 -12
  33. package/node_modules/@dietrichgebert/ponytail/skills/ponytail-gain/SKILL.md +21 -18
  34. package/node_modules/@dietrichgebert/ponytail/skills/ponytail-help/SKILL.md +12 -13
  35. package/node_modules/@dietrichgebert/ponytail/skills/ponytail-review/SKILL.md +96 -52
  36. package/node_modules/@herbertgao/pi-agency/LICENSE +21 -0
  37. package/node_modules/@herbertgao/pi-agency/README.md +40 -0
  38. package/node_modules/@herbertgao/pi-agency/package.json +53 -0
  39. package/node_modules/@herbertgao/pi-agency/src/index.ts +441 -0
  40. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/compact-thinking.ts +12 -12
  41. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/compact-mode.ts +30 -6
  42. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/default-mode.ts +15 -9
  43. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/interaction.ts +27 -9
  44. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/codemode.ts +4 -1
  45. package/node_modules/@herbertgao/pi-cc-extensions/package.json +2 -2
  46. package/node_modules/@narumitw/pi-caffeinate/package.json +4 -4
  47. package/node_modules/@tifan/pi-mermaid-open/package.json +5 -1
  48. package/node_modules/@tifan/pi-mermaid-open/src/index.ts +26 -9
  49. package/node_modules/@tifan/pi-recap/package.json +1 -1
  50. package/node_modules/@tifan/pi-recap/src/index.ts +104 -20
  51. package/node_modules/@tifan/pi-recap/src/models.ts +46 -4
  52. package/node_modules/pi-antigravity/README.md +23 -2
  53. package/node_modules/pi-antigravity/package.json +5 -3
  54. package/node_modules/pi-antigravity/src/diagnostics/diagnostics.ts +3 -2
  55. package/node_modules/pi-antigravity/src/features/generate-image.ts +72 -0
  56. package/node_modules/pi-antigravity/src/features/google-search.ts +71 -0
  57. package/node_modules/pi-antigravity/src/image/image.ts +86 -47
  58. package/node_modules/pi-antigravity/src/image/native.ts +69 -0
  59. package/node_modules/pi-antigravity/src/index.ts +52 -137
  60. package/node_modules/pi-antigravity/src/search/search.ts +130 -31
  61. package/node_modules/pi-antigravity/src/stream/stream.ts +162 -113
  62. package/node_modules/pi-antigravity/src/types/enums.ts +1 -0
  63. package/node_modules/pi-antigravity/src/types/types.ts +1 -1
  64. package/node_modules/pi-antigravity/src/utils/security.ts +47 -1
  65. package/node_modules/pi-antigravity/src/utils/util.ts +38 -6
  66. package/node_modules/pi-lens/CHANGELOG.md +1064 -0
  67. package/node_modules/pi-lens/README.md +115 -25
  68. package/node_modules/pi-lens/config/dependency-cruiser-eager-allowlist.json +6 -2
  69. package/node_modules/pi-lens/dist/chunk-22AVIGXS.js +560 -0
  70. package/node_modules/pi-lens/dist/chunk-27BBHSZC.js +106 -0
  71. package/node_modules/pi-lens/dist/chunk-2BEMIWEW.js +51 -0
  72. package/node_modules/pi-lens/dist/chunk-2EECBNC5.js +89 -0
  73. package/node_modules/pi-lens/dist/chunk-34U7PLGE.js +23 -0
  74. package/node_modules/pi-lens/dist/chunk-3I5QFT3N.js +181 -0
  75. package/node_modules/pi-lens/dist/chunk-3MED75HT.js +37 -0
  76. package/node_modules/pi-lens/dist/chunk-47D2BO4S.js +87 -0
  77. package/node_modules/pi-lens/dist/chunk-4RERDEXR.js +348 -0
  78. package/node_modules/pi-lens/dist/chunk-4W2PLC4J.js +27 -0
  79. package/node_modules/pi-lens/dist/chunk-52H5B5TC.js +202 -0
  80. package/node_modules/pi-lens/dist/chunk-54B42YRX.js +27 -0
  81. package/node_modules/pi-lens/dist/chunk-5RXBNSW2.js +266 -0
  82. package/node_modules/pi-lens/dist/chunk-5THXD6X5.js +201 -0
  83. package/node_modules/pi-lens/dist/chunk-5W3R6LFT.js +24 -0
  84. package/node_modules/pi-lens/dist/chunk-5ZEJHV35.js +341 -0
  85. package/node_modules/pi-lens/dist/chunk-6P62QVEA.js +118 -0
  86. package/node_modules/pi-lens/dist/chunk-6QIUX4EP.js +459 -0
  87. package/node_modules/pi-lens/dist/chunk-6VCD4VKZ.js +78 -0
  88. package/node_modules/pi-lens/dist/chunk-7F72PXY2.js +326 -0
  89. package/node_modules/pi-lens/dist/chunk-7FBF7NPR.js +998 -0
  90. package/node_modules/pi-lens/dist/chunk-7U2IDNXN.js +37 -0
  91. package/node_modules/pi-lens/dist/chunk-ABBOA7UD.js +157 -0
  92. package/node_modules/pi-lens/dist/chunk-AHDW3GPE.js +50 -0
  93. package/node_modules/pi-lens/dist/chunk-AJ3QXTRQ.js +756 -0
  94. package/node_modules/pi-lens/dist/chunk-AJVLWNFN.js +1610 -0
  95. package/node_modules/pi-lens/dist/chunk-AJXODZY6.js +112 -0
  96. package/node_modules/pi-lens/dist/chunk-ARFCXG7S.js +84 -0
  97. package/node_modules/pi-lens/dist/chunk-AS44CFQ4.js +708 -0
  98. package/node_modules/pi-lens/dist/chunk-AWE5TMPO.js +38 -0
  99. package/node_modules/pi-lens/dist/chunk-B3I2UUT4.js +4692 -0
  100. package/node_modules/pi-lens/dist/chunk-BRJKOBZP.js +331 -0
  101. package/node_modules/pi-lens/dist/chunk-BW5KFIQC.js +59 -0
  102. package/node_modules/pi-lens/dist/chunk-C2AUYXQH.js +149 -0
  103. package/node_modules/pi-lens/dist/chunk-CGGAIP7J.js +29 -0
  104. package/node_modules/pi-lens/dist/chunk-D6QS3U6M.js +30 -0
  105. package/node_modules/pi-lens/dist/chunk-DFVMIKMQ.js +349 -0
  106. package/node_modules/pi-lens/dist/chunk-DIULIWKU.js +169 -0
  107. package/node_modules/pi-lens/dist/chunk-DQ2NZ7C4.js +2317 -0
  108. package/node_modules/pi-lens/dist/chunk-E2WFBRHM.js +213 -0
  109. package/node_modules/pi-lens/dist/chunk-E4MAEDPM.js +50 -0
  110. package/node_modules/pi-lens/dist/chunk-EOKRQ3SA.js +30 -0
  111. package/node_modules/pi-lens/dist/chunk-F3AU2TMM.js +2626 -0
  112. package/node_modules/pi-lens/dist/chunk-F3P7VQ7H.js +170 -0
  113. package/node_modules/pi-lens/dist/chunk-FC4RP4I2.js +12 -0
  114. package/node_modules/pi-lens/dist/chunk-FJNKANOS.js +32 -0
  115. package/node_modules/pi-lens/dist/chunk-GUOGVTCQ.js +146 -0
  116. package/node_modules/pi-lens/dist/chunk-GVXA6CCE.js +18 -0
  117. package/node_modules/pi-lens/dist/chunk-HHYAELLJ.js +2334 -0
  118. package/node_modules/pi-lens/dist/chunk-HMFXILPV.js +83 -0
  119. package/node_modules/pi-lens/dist/chunk-HVUZXSWK.js +421 -0
  120. package/node_modules/pi-lens/dist/chunk-HWBZIGMJ.js +62 -0
  121. package/node_modules/pi-lens/dist/chunk-I3R7GKDR.js +17 -0
  122. package/node_modules/pi-lens/dist/chunk-I7SPGOWI.js +55 -0
  123. package/node_modules/pi-lens/dist/chunk-IIXOAGHR.js +38 -0
  124. package/node_modules/pi-lens/dist/chunk-IVP5KAB7.js +2250 -0
  125. package/node_modules/pi-lens/dist/chunk-IXEBJSUE.js +22 -0
  126. package/node_modules/pi-lens/dist/chunk-JOLITGCC.js +27 -0
  127. package/node_modules/pi-lens/dist/chunk-K6VYLB2U.js +145 -0
  128. package/node_modules/pi-lens/dist/chunk-LJDODBBZ.js +78 -0
  129. package/node_modules/pi-lens/dist/chunk-LNAKEO63.js +78 -0
  130. package/node_modules/pi-lens/dist/chunk-LSMJ6KBE.js +4139 -0
  131. package/node_modules/pi-lens/dist/chunk-LW6XKDZQ.js +5565 -0
  132. package/node_modules/pi-lens/dist/chunk-N3YQJI6O.js +899 -0
  133. package/node_modules/pi-lens/dist/chunk-NABLC7W3.js +148 -0
  134. package/node_modules/pi-lens/dist/chunk-NKOUFPQF.js +659 -0
  135. package/node_modules/pi-lens/dist/chunk-NL5GLMFI.js +211 -0
  136. package/node_modules/pi-lens/dist/chunk-NMABWBZN.js +327 -0
  137. package/node_modules/pi-lens/dist/chunk-NTHH2J74.js +27 -0
  138. package/node_modules/pi-lens/dist/chunk-NTUJEGDZ.js +59 -0
  139. package/node_modules/pi-lens/dist/chunk-NXL4FFQQ.js +47 -0
  140. package/node_modules/pi-lens/dist/chunk-NXPS2L6U.js +466 -0
  141. package/node_modules/pi-lens/dist/chunk-O5WILGMI.js +42 -0
  142. package/node_modules/pi-lens/dist/chunk-O6TQT6RI.js +48 -0
  143. package/node_modules/pi-lens/dist/chunk-OAXNDZJ7.js +323 -0
  144. package/node_modules/pi-lens/dist/chunk-ODEEOXPH.js +44 -0
  145. package/node_modules/pi-lens/dist/chunk-OQGFCZJ4.js +4533 -0
  146. package/node_modules/pi-lens/dist/chunk-ORTMY4Q4.js +282 -0
  147. package/node_modules/pi-lens/dist/chunk-OS32RNR2.js +442 -0
  148. package/node_modules/pi-lens/dist/chunk-PAK6IDME.js +189 -0
  149. package/node_modules/pi-lens/dist/chunk-PWFHBTSF.js +406 -0
  150. package/node_modules/pi-lens/dist/chunk-Q5U6FMDI.js +2352 -0
  151. package/node_modules/pi-lens/dist/chunk-QOZXJ4NA.js +3364 -0
  152. package/node_modules/pi-lens/dist/chunk-QYF5S6P6.js +45 -0
  153. package/node_modules/pi-lens/dist/chunk-RIISMHKN.js +36 -0
  154. package/node_modules/pi-lens/dist/chunk-RPD4ZSB7.js +25 -0
  155. package/node_modules/pi-lens/dist/chunk-RPD5K5NC.js +79 -0
  156. package/node_modules/pi-lens/dist/chunk-RUOG5D2C.js +262 -0
  157. package/node_modules/pi-lens/dist/chunk-T4ERT73Y.js +599 -0
  158. package/node_modules/pi-lens/dist/chunk-T6D4Q4AQ.js +54 -0
  159. package/node_modules/pi-lens/dist/chunk-TGPXLY2J.js +391 -0
  160. package/node_modules/pi-lens/dist/chunk-TLGFBM3F.js +12116 -0
  161. package/node_modules/pi-lens/dist/chunk-TO6WL3GM.js +88 -0
  162. package/node_modules/pi-lens/dist/chunk-TT22N74J.js +517 -0
  163. package/node_modules/pi-lens/dist/chunk-TVN5N6GY.js +21216 -0
  164. package/node_modules/pi-lens/dist/chunk-U3VGR4VU.js +308 -0
  165. package/node_modules/pi-lens/dist/chunk-UK3CMEAL.js +1250 -0
  166. package/node_modules/pi-lens/dist/chunk-UOPVJQ4N.js +103 -0
  167. package/node_modules/pi-lens/dist/chunk-UXVNL3D7.js +23 -0
  168. package/node_modules/pi-lens/dist/chunk-UY752QSN.js +45 -0
  169. package/node_modules/pi-lens/dist/chunk-V5PXFSZK.js +188 -0
  170. package/node_modules/pi-lens/dist/chunk-V7R425XG.js +398 -0
  171. package/node_modules/pi-lens/dist/chunk-VCSRSYLF.js +81 -0
  172. package/node_modules/pi-lens/dist/chunk-VD4JQCQC.js +162 -0
  173. package/node_modules/pi-lens/dist/chunk-VDBPVIKD.js +62 -0
  174. package/node_modules/pi-lens/dist/chunk-VHQLPIRJ.js +114 -0
  175. package/node_modules/pi-lens/dist/chunk-VN2AXLEX.js +5414 -0
  176. package/node_modules/pi-lens/dist/chunk-VNMT7C64.js +478 -0
  177. package/node_modules/pi-lens/dist/chunk-WONERJTP.js +309 -0
  178. package/node_modules/pi-lens/dist/chunk-XECLWQZN.js +85 -0
  179. package/node_modules/pi-lens/dist/chunk-XIMYZ3JA.js +27 -0
  180. package/node_modules/pi-lens/dist/chunk-XK4CIILI.js +144 -0
  181. package/node_modules/pi-lens/dist/chunk-Y4T27COV.js +562 -0
  182. package/node_modules/pi-lens/dist/chunk-YGVYKNSN.js +1860 -0
  183. package/node_modules/pi-lens/dist/chunk-YLF3PPT5.js +308 -0
  184. package/node_modules/pi-lens/dist/chunk-YSNFMJKN.js +14 -0
  185. package/node_modules/pi-lens/dist/chunk-Z3CCVDUB.js +76 -0
  186. package/node_modules/pi-lens/dist/chunk-Z54ZSOBZ.js +61 -0
  187. package/node_modules/pi-lens/dist/chunk-ZAWW3AF6.js +97 -0
  188. package/node_modules/pi-lens/dist/chunk-ZMOL6RQC.js +167 -0
  189. package/node_modules/pi-lens/dist/index.js +16456 -8335
  190. package/node_modules/pi-lens/dist/mcp/analyze-cli.js +186 -232
  191. package/node_modules/pi-lens/dist/mcp/cli.js +137 -98
  192. package/node_modules/pi-lens/dist/mcp/server.js +22589 -1573
  193. package/node_modules/pi-lens/dist/mcp/worker.js +97 -38
  194. package/node_modules/pi-lens/dist/probes/installer.js +135 -0
  195. package/node_modules/pi-lens/dist/workers/project-snapshot-persist-worker.js +22 -0
  196. package/node_modules/pi-lens/dist/workers/review-graph-persist-worker.js +15 -0
  197. package/node_modules/pi-lens/docs/agent-guide.md +13 -4
  198. package/node_modules/pi-lens/docs/agent-tools.md +42 -0
  199. package/node_modules/pi-lens/docs/ast-grep_rules_catalog.md +3 -2
  200. package/node_modules/pi-lens/docs/configuration.md +20 -1
  201. package/node_modules/pi-lens/docs/environment-variables.md +52 -2
  202. package/node_modules/pi-lens/docs/features.md +8 -4
  203. package/node_modules/pi-lens/docs/globalconfig.md +1 -0
  204. package/node_modules/pi-lens/docs/io-bridge-v2-migration.md +94 -0
  205. package/node_modules/pi-lens/docs/lsp-capability-matrix.md +36 -4
  206. package/node_modules/pi-lens/docs/lsp-idle-eviction.md +124 -0
  207. package/node_modules/pi-lens/docs/mcp.md +21 -5
  208. package/node_modules/pi-lens/docs/merge-queue-rollout.md +77 -0
  209. package/node_modules/pi-lens/docs/pi-lens-fixer.md +156 -88
  210. package/node_modules/pi-lens/docs/pi-lens-investigator.md +74 -26
  211. package/node_modules/pi-lens/docs/pi-lens-merge-policy.md +694 -0
  212. package/node_modules/pi-lens/docs/pi-lens-monitor.md +73 -7
  213. package/node_modules/pi-lens/docs/pi-lens-retro.md +6 -4
  214. package/node_modules/pi-lens/docs/pi-lens-reviewer.md +188 -48
  215. package/node_modules/pi-lens/docs/pi-lens-subagent.md +246 -45
  216. package/node_modules/pi-lens/docs/pi-lens-warden.md +18 -7
  217. package/node_modules/pi-lens/docs/public-api-stability.md +55 -0
  218. package/node_modules/pi-lens/docs/release-qa-baseline.md +84 -17
  219. package/node_modules/pi-lens/docs/rfcs/3654-unified-io-bridge-v2.md +316 -0
  220. package/node_modules/pi-lens/docs/servercapabilities.md +53 -49
  221. package/node_modules/pi-lens/docs/settings.md +1 -0
  222. package/node_modules/pi-lens/docs/usage.md +5 -1
  223. package/node_modules/pi-lens/grammars/tree-sitter-bash.wasm +0 -0
  224. package/node_modules/pi-lens/grammars/tree-sitter-bash.wasm.json +3 -3
  225. package/node_modules/pi-lens/package.json +18 -6
  226. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/advisory-registry-subset-test.yml +41 -0
  227. package/node_modules/pi-lens/rules/ast-grep-rules/rules/advisory-registry-subset.yml +50 -0
  228. package/node_modules/pi-lens/scripts/analyze-pi-lens-logs.mjs +1275 -62
  229. package/node_modules/pi-lens/scripts/download-grammars.js +5 -0
  230. package/node_modules/pi-lens/scripts/grammars.lock.json +6 -1
  231. package/node_modules/pi-lens/scripts/install-selftest.mjs +33 -34
  232. package/node_modules/pi-lens/scripts/lib/host-provided-deps.mjs +13 -4
  233. package/node_modules/pi-lens/scripts/lib/web-tree-sitter-dir.mjs +18 -0
  234. package/node_modules/pi-typesafe/README.md +1 -1
  235. package/node_modules/pi-typesafe/dist/backends.d.ts +15 -5
  236. package/node_modules/pi-typesafe/dist/backends.js +18 -0
  237. package/node_modules/pi-typesafe/dist/client.d.ts +4 -3
  238. package/node_modules/pi-typesafe/dist/client.js +22 -7
  239. package/node_modules/pi-typesafe/dist/index.d.ts +2 -2
  240. package/node_modules/pi-typesafe/dist/index.js +1 -1
  241. package/node_modules/pi-typesafe/dist/usage.d.ts +14 -4
  242. package/node_modules/pi-typesafe/dist/usage.js +147 -42
  243. package/node_modules/pi-typesafe/package.json +1 -1
  244. package/node_modules/pi-web-access/CHANGELOG.md +48 -0
  245. package/node_modules/pi-web-access/README.md +57 -11
  246. package/node_modules/pi-web-access/brave-rate-limit.ts +8 -2
  247. package/node_modules/pi-web-access/curator-page.ts +5 -1
  248. package/node_modules/pi-web-access/curator-server.ts +2 -0
  249. package/node_modules/pi-web-access/declared-web-links.ts +2 -2
  250. package/node_modules/pi-web-access/degoog.ts +323 -0
  251. package/node_modules/pi-web-access/dist/index.js +3483 -2745
  252. package/node_modules/pi-web-access/dist/mcp-cli.js +27443 -0
  253. package/node_modules/pi-web-access/exa.ts +5 -1
  254. package/node_modules/pi-web-access/extract.ts +41 -3
  255. package/node_modules/pi-web-access/firecrawl.ts +35 -4
  256. package/node_modules/pi-web-access/gemini-search.ts +34 -11
  257. package/node_modules/pi-web-access/gemini-web.ts +14 -9
  258. package/node_modules/pi-web-access/index.ts +153 -1202
  259. package/node_modules/pi-web-access/keenable.ts +221 -0
  260. package/node_modules/pi-web-access/mcp-cli.ts +40 -0
  261. package/node_modules/pi-web-access/mcp-server.ts +81 -0
  262. package/node_modules/pi-web-access/mcp-tool-definitions.ts +117 -0
  263. package/node_modules/pi-web-access/openai-search.ts +34 -1
  264. package/node_modules/pi-web-access/package.json +23 -5
  265. package/node_modules/pi-web-access/perplexity.ts +64 -56
  266. package/node_modules/pi-web-access/tool-arguments.ts +20 -0
  267. package/node_modules/pi-web-access/video-extract.ts +1 -1
  268. package/node_modules/pi-web-access/web-tool-contract.ts +86 -0
  269. package/node_modules/pi-web-access/web-tool-core.ts +1502 -0
  270. package/node_modules/pi-web-access/youtube-extract.ts +2 -5
  271. package/package.json +17 -12
  272. package/node_modules/@dietrichgebert/ponytail/README.es.md +0 -329
  273. package/node_modules/@dietrichgebert/ponytail/README.ko.md +0 -346
  274. package/node_modules/@dietrichgebert/ponytail/assets/benchmark-3model.svg +0 -21
  275. package/node_modules/@dietrichgebert/ponytail/assets/benchmark-agentic.svg +0 -62
  276. package/node_modules/@dietrichgebert/ponytail/assets/logo-dark.png +0 -0
  277. package/node_modules/@dietrichgebert/ponytail/assets/logo-dark.svg +0 -115
  278. package/node_modules/@dietrichgebert/ponytail/assets/logo-greenpt-dark.svg +0 -27
  279. package/node_modules/@dietrichgebert/ponytail/assets/logo-greenpt.svg +0 -27
  280. package/node_modules/@dietrichgebert/ponytail/assets/logo.png +0 -0
  281. package/node_modules/@dietrichgebert/ponytail/assets/retriever-icon.png +0 -0
  282. package/node_modules/@dietrichgebert/ponytail/assets/retriever-logo-dark.svg +0 -4
  283. package/node_modules/@dietrichgebert/ponytail/assets/retriever-logo-light.svg +0 -4
  284. package/node_modules/@dietrichgebert/ponytail/assets/social-preview.png +0 -0
  285. package/node_modules/@dietrichgebert/ponytail/assets/waitlist-banner-es.png +0 -0
  286. package/node_modules/@dietrichgebert/ponytail/assets/waitlist-banner-ko.png +0 -0
  287. package/node_modules/@dietrichgebert/ponytail/assets/waitlist-banner.png +0 -0
  288. package/node_modules/pi-lens/dist/clients/actionable-warnings-logger.js +0 -35
  289. package/node_modules/pi-lens/dist/clients/actionable-warnings.js +0 -1610
  290. package/node_modules/pi-lens/dist/clients/advisory-provenance.js +0 -593
  291. package/node_modules/pi-lens/dist/clients/agent-behavior-client.js +0 -147
  292. package/node_modules/pi-lens/dist/clients/agent-nudge.js +0 -325
  293. package/node_modules/pi-lens/dist/clients/analysed-root.js +0 -1
  294. package/node_modules/pi-lens/dist/clients/ast-grep-client.js +0 -731
  295. package/node_modules/pi-lens/dist/clients/ast-grep-rule-manager.js +0 -146
  296. package/node_modules/pi-lens/dist/clients/ast-grep-tool-logger.js +0 -118
  297. package/node_modules/pi-lens/dist/clients/ast-grep-types.js +0 -10
  298. package/node_modules/pi-lens/dist/clients/ast-grep-yaml-synth.js +0 -154
  299. package/node_modules/pi-lens/dist/clients/atomic-write-staging.js +0 -75
  300. package/node_modules/pi-lens/dist/clients/atomic-write.js +0 -189
  301. package/node_modules/pi-lens/dist/clients/availability-probe-flight.js +0 -12
  302. package/node_modules/pi-lens/dist/clients/bash-file-access.js +0 -1056
  303. package/node_modules/pi-lens/dist/clients/biome-client.js +0 -357
  304. package/node_modules/pi-lens/dist/clients/blocker-freshness.js +0 -837
  305. package/node_modules/pi-lens/dist/clients/blocker-past-eof.js +0 -129
  306. package/node_modules/pi-lens/dist/clients/bootstrap.js +0 -569
  307. package/node_modules/pi-lens/dist/clients/bounded-cache.js +0 -190
  308. package/node_modules/pi-lens/dist/clients/bounded-pid-file-lock.js +0 -202
  309. package/node_modules/pi-lens/dist/clients/bounded-telemetry.js +0 -295
  310. package/node_modules/pi-lens/dist/clients/build-identity.js +0 -95
  311. package/node_modules/pi-lens/dist/clients/bundled-resource-health.js +0 -113
  312. package/node_modules/pi-lens/dist/clients/bus-events-logger.js +0 -105
  313. package/node_modules/pi-lens/dist/clients/bus-publish.js +0 -171
  314. package/node_modules/pi-lens/dist/clients/cache/rule-cache.js +0 -190
  315. package/node_modules/pi-lens/dist/clients/cache-manager.js +0 -524
  316. package/node_modules/pi-lens/dist/clients/cache-observability.js +0 -1313
  317. package/node_modules/pi-lens/dist/clients/call-graph.js +0 -852
  318. package/node_modules/pi-lens/dist/clients/cargo-manifest.js +0 -422
  319. package/node_modules/pi-lens/dist/clients/cascade-budget.js +0 -196
  320. package/node_modules/pi-lens/dist/clients/cascade-format.js +0 -315
  321. package/node_modules/pi-lens/dist/clients/cascade-logger.js +0 -31
  322. package/node_modules/pi-lens/dist/clients/cascade-types.js +0 -9
  323. package/node_modules/pi-lens/dist/clients/child-unref.js +0 -124
  324. package/node_modules/pi-lens/dist/clients/code-quality-warnings.js +0 -286
  325. package/node_modules/pi-lens/dist/clients/codebase-model.js +0 -173
  326. package/node_modules/pi-lens/dist/clients/collateral-test-role.js +0 -40
  327. package/node_modules/pi-lens/dist/clients/complexity-client.js +0 -462
  328. package/node_modules/pi-lens/dist/clients/config-core/deny.js +0 -221
  329. package/node_modules/pi-lens/dist/clients/config-core/index.js +0 -50
  330. package/node_modules/pi-lens/dist/clients/config-core/merge.js +0 -357
  331. package/node_modules/pi-lens/dist/clients/config-core/normalize.js +0 -340
  332. package/node_modules/pi-lens/dist/clients/config-core/process-spec.js +0 -248
  333. package/node_modules/pi-lens/dist/clients/config-core/provenance.js +0 -164
  334. package/node_modules/pi-lens/dist/clients/config-core/records.js +0 -218
  335. package/node_modules/pi-lens/dist/clients/config-core/resolve.js +0 -125
  336. package/node_modules/pi-lens/dist/clients/config-core/safe-object.js +0 -78
  337. package/node_modules/pi-lens/dist/clients/config-core/schema.js +0 -165
  338. package/node_modules/pi-lens/dist/clients/config-diagnostic-codes.js +0 -285
  339. package/node_modules/pi-lens/dist/clients/config-locations.js +0 -388
  340. package/node_modules/pi-lens/dist/clients/config-resolve.js +0 -798
  341. package/node_modules/pi-lens/dist/clients/config-schema.js +0 -251
  342. package/node_modules/pi-lens/dist/clients/config-warn.js +0 -407
  343. package/node_modules/pi-lens/dist/clients/console-guard-install.js +0 -26
  344. package/node_modules/pi-lens/dist/clients/cooperative-budget.js +0 -42
  345. package/node_modules/pi-lens/dist/clients/dead-code-client.js +0 -510
  346. package/node_modules/pi-lens/dist/clients/dead-code-logger.js +0 -30
  347. package/node_modules/pi-lens/dist/clients/deadline-utils.js +0 -280
  348. package/node_modules/pi-lens/dist/clients/debug-handles.js +0 -211
  349. package/node_modules/pi-lens/dist/clients/debug-heap.js +0 -174
  350. package/node_modules/pi-lens/dist/clients/deferred-lsp-work.js +0 -106
  351. package/node_modules/pi-lens/dist/clients/degradation-ledger.js +0 -426
  352. package/node_modules/pi-lens/dist/clients/demoted-finding-render.js +0 -169
  353. package/node_modules/pi-lens/dist/clients/dependency-checker.js +0 -885
  354. package/node_modules/pi-lens/dist/clients/deps/ast-grep-napi.js +0 -22
  355. package/node_modules/pi-lens/dist/clients/deps/js-yaml.js +0 -9
  356. package/node_modules/pi-lens/dist/clients/deps/minimatch.js +0 -4
  357. package/node_modules/pi-lens/dist/clients/deps/pi-tui.js +0 -14
  358. package/node_modules/pi-lens/dist/clients/deps/typebox.js +0 -14
  359. package/node_modules/pi-lens/dist/clients/deps/vscode-jsonrpc.js +0 -1
  360. package/node_modules/pi-lens/dist/clients/deps/web-tree-sitter.js +0 -24
  361. package/node_modules/pi-lens/dist/clients/diagnostic-dispositions.js +0 -630
  362. package/node_modules/pi-lens/dist/clients/diagnostic-line-freshness.js +0 -305
  363. package/node_modules/pi-lens/dist/clients/diagnostic-logger.js +0 -73
  364. package/node_modules/pi-lens/dist/clients/diagnostic-tracker.js +0 -105
  365. package/node_modules/pi-lens/dist/clients/diagnostics-publish.js +0 -230
  366. package/node_modules/pi-lens/dist/clients/dispatch/ast-grep-catalog.js +0 -65
  367. package/node_modules/pi-lens/dist/clients/dispatch/auxiliary-lsp.js +0 -343
  368. package/node_modules/pi-lens/dist/clients/dispatch/collect-later-tier.js +0 -35
  369. package/node_modules/pi-lens/dist/clients/dispatch/diagnostic-taxonomy.js +0 -66
  370. package/node_modules/pi-lens/dist/clients/dispatch/dispatcher.js +0 -1269
  371. package/node_modules/pi-lens/dist/clients/dispatch/fact-provider-types.js +0 -1
  372. package/node_modules/pi-lens/dist/clients/dispatch/fact-rule-runner.js +0 -17
  373. package/node_modules/pi-lens/dist/clients/dispatch/fact-runner.js +0 -30
  374. package/node_modules/pi-lens/dist/clients/dispatch/fact-scheduler.js +0 -68
  375. package/node_modules/pi-lens/dist/clients/dispatch/fact-store.js +0 -377
  376. package/node_modules/pi-lens/dist/clients/dispatch/facts/comment-facts.js +0 -22
  377. package/node_modules/pi-lens/dist/clients/dispatch/facts/file-content.js +0 -19
  378. package/node_modules/pi-lens/dist/clients/dispatch/facts/function-facts.js +0 -348
  379. package/node_modules/pi-lens/dist/clients/dispatch/facts/import-facts.js +0 -204
  380. package/node_modules/pi-lens/dist/clients/dispatch/facts/tree-sitter-facts.js +0 -34
  381. package/node_modules/pi-lens/dist/clients/dispatch/facts/try-catch-facts.js +0 -119
  382. package/node_modules/pi-lens/dist/clients/dispatch/finding-policy.js +0 -339
  383. package/node_modules/pi-lens/dist/clients/dispatch/indent-detect.js +0 -417
  384. package/node_modules/pi-lens/dist/clients/dispatch/inline-suppressions.js +0 -89
  385. package/node_modules/pi-lens/dist/clients/dispatch/integration.js +0 -2377
  386. package/node_modules/pi-lens/dist/clients/dispatch/lazy.js +0 -11
  387. package/node_modules/pi-lens/dist/clients/dispatch/pending-runner-findings.js +0 -87
  388. package/node_modules/pi-lens/dist/clients/dispatch/plan.js +0 -278
  389. package/node_modules/pi-lens/dist/clients/dispatch/priorities.js +0 -20
  390. package/node_modules/pi-lens/dist/clients/dispatch/rule-id-normalize.js +0 -50
  391. package/node_modules/pi-lens/dist/clients/dispatch/rule-ignores.js +0 -69
  392. package/node_modules/pi-lens/dist/clients/dispatch/rule-policy.js +0 -135
  393. package/node_modules/pi-lens/dist/clients/dispatch/rules/async-noise.js +0 -40
  394. package/node_modules/pi-lens/dist/clients/dispatch/rules/async-unnecessary-wrapper.js +0 -27
  395. package/node_modules/pi-lens/dist/clients/dispatch/rules/cors-wildcard.js +0 -54
  396. package/node_modules/pi-lens/dist/clients/dispatch/rules/error-obscuring.js +0 -32
  397. package/node_modules/pi-lens/dist/clients/dispatch/rules/error-swallowing.js +0 -31
  398. package/node_modules/pi-lens/dist/clients/dispatch/rules/framework-call-noise.js +0 -67
  399. package/node_modules/pi-lens/dist/clients/dispatch/rules/high-complexity.js +0 -72
  400. package/node_modules/pi-lens/dist/clients/dispatch/rules/high-fan-out.js +0 -74
  401. package/node_modules/pi-lens/dist/clients/dispatch/rules/high-import-coupling.js +0 -37
  402. package/node_modules/pi-lens/dist/clients/dispatch/rules/missing-error-propagation.js +0 -62
  403. package/node_modules/pi-lens/dist/clients/dispatch/rules/no-commented-credentials.js +0 -52
  404. package/node_modules/pi-lens/dist/clients/dispatch/rules/pass-through-wrappers.js +0 -42
  405. package/node_modules/pi-lens/dist/clients/dispatch/rules/placeholder-comments.js +0 -40
  406. package/node_modules/pi-lens/dist/clients/dispatch/rules/unsafe-boundary.js +0 -126
  407. package/node_modules/pi-lens/dist/clients/dispatch/runner-context.js +0 -52
  408. package/node_modules/pi-lens/dist/clients/dispatch/runners/actionlint.js +0 -111
  409. package/node_modules/pi-lens/dist/clients/dispatch/runners/ast-grep-napi.js +0 -1196
  410. package/node_modules/pi-lens/dist/clients/dispatch/runners/biome-check.js +0 -296
  411. package/node_modules/pi-lens/dist/clients/dispatch/runners/cpp-check.js +0 -219
  412. package/node_modules/pi-lens/dist/clients/dispatch/runners/credo.js +0 -82
  413. package/node_modules/pi-lens/dist/clients/dispatch/runners/cue-vet.js +0 -416
  414. package/node_modules/pi-lens/dist/clients/dispatch/runners/dart-analyze.js +0 -183
  415. package/node_modules/pi-lens/dist/clients/dispatch/runners/detekt.js +0 -176
  416. package/node_modules/pi-lens/dist/clients/dispatch/runners/dotnet-build.js +0 -164
  417. package/node_modules/pi-lens/dist/clients/dispatch/runners/elixir-check.js +0 -195
  418. package/node_modules/pi-lens/dist/clients/dispatch/runners/eslint.js +0 -137
  419. package/node_modules/pi-lens/dist/clients/dispatch/runners/fact-rules.js +0 -29
  420. package/node_modules/pi-lens/dist/clients/dispatch/runners/fish-indent.js +0 -69
  421. package/node_modules/pi-lens/dist/clients/dispatch/runners/gleam-check.js +0 -167
  422. package/node_modules/pi-lens/dist/clients/dispatch/runners/go-vet.js +0 -104
  423. package/node_modules/pi-lens/dist/clients/dispatch/runners/golangci-lint.js +0 -135
  424. package/node_modules/pi-lens/dist/clients/dispatch/runners/hadolint.js +0 -91
  425. package/node_modules/pi-lens/dist/clients/dispatch/runners/helm-lint.js +0 -171
  426. package/node_modules/pi-lens/dist/clients/dispatch/runners/helm-render.js +0 -940
  427. package/node_modules/pi-lens/dist/clients/dispatch/runners/htmlhint.js +0 -117
  428. package/node_modules/pi-lens/dist/clients/dispatch/runners/index.js +0 -108
  429. package/node_modules/pi-lens/dist/clients/dispatch/runners/javac.js +0 -99
  430. package/node_modules/pi-lens/dist/clients/dispatch/runners/ktlint.js +0 -110
  431. package/node_modules/pi-lens/dist/clients/dispatch/runners/lsp.js +0 -379
  432. package/node_modules/pi-lens/dist/clients/dispatch/runners/markdownlint.js +0 -167
  433. package/node_modules/pi-lens/dist/clients/dispatch/runners/mypy.js +0 -102
  434. package/node_modules/pi-lens/dist/clients/dispatch/runners/oxlint.js +0 -414
  435. package/node_modules/pi-lens/dist/clients/dispatch/runners/php-lint.js +0 -85
  436. package/node_modules/pi-lens/dist/clients/dispatch/runners/phpstan.js +0 -120
  437. package/node_modules/pi-lens/dist/clients/dispatch/runners/prisma-validate.js +0 -62
  438. package/node_modules/pi-lens/dist/clients/dispatch/runners/psscriptanalyzer.js +0 -445
  439. package/node_modules/pi-lens/dist/clients/dispatch/runners/pyright.js +0 -169
  440. package/node_modules/pi-lens/dist/clients/dispatch/runners/rubocop.js +0 -99
  441. package/node_modules/pi-lens/dist/clients/dispatch/runners/ruff.js +0 -88
  442. package/node_modules/pi-lens/dist/clients/dispatch/runners/rust-clippy.js +0 -256
  443. package/node_modules/pi-lens/dist/clients/dispatch/runners/shellcheck.js +0 -173
  444. package/node_modules/pi-lens/dist/clients/dispatch/runners/shfmt.js +0 -102
  445. package/node_modules/pi-lens/dist/clients/dispatch/runners/spellcheck.js +0 -128
  446. package/node_modules/pi-lens/dist/clients/dispatch/runners/spotbugs.js +0 -259
  447. package/node_modules/pi-lens/dist/clients/dispatch/runners/sqlfluff.js +0 -183
  448. package/node_modules/pi-lens/dist/clients/dispatch/runners/stylelint.js +0 -166
  449. package/node_modules/pi-lens/dist/clients/dispatch/runners/swiftlint.js +0 -163
  450. package/node_modules/pi-lens/dist/clients/dispatch/runners/taplo.js +0 -174
  451. package/node_modules/pi-lens/dist/clients/dispatch/runners/terragrunt.js +0 -168
  452. package/node_modules/pi-lens/dist/clients/dispatch/runners/tflint.js +0 -125
  453. package/node_modules/pi-lens/dist/clients/dispatch/runners/tree-sitter.js +0 -643
  454. package/node_modules/pi-lens/dist/clients/dispatch/runners/trivy-config.js +0 -253
  455. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/availability-policy.js +0 -496
  456. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/candidate-probe.js +0 -90
  457. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/diagnostic-parsers.js +0 -95
  458. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/lazy-installer.js +0 -274
  459. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/runner-helpers.js +0 -1701
  460. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/spawn-outcome.js +0 -101
  461. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/tool-failure.js +0 -235
  462. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/toolchain-availability.js +0 -169
  463. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils.js +0 -15
  464. package/node_modules/pi-lens/dist/clients/dispatch/runners/vale.js +0 -128
  465. package/node_modules/pi-lens/dist/clients/dispatch/runners/yaml-rule-parser.js +0 -242
  466. package/node_modules/pi-lens/dist/clients/dispatch/runners/yamllint.js +0 -95
  467. package/node_modules/pi-lens/dist/clients/dispatch/runners/zig-check.js +0 -79
  468. package/node_modules/pi-lens/dist/clients/dispatch/suppress-writer.js +0 -79
  469. package/node_modules/pi-lens/dist/clients/dispatch/tool-profile.js +0 -30
  470. package/node_modules/pi-lens/dist/clients/dispatch/types.js +0 -21
  471. package/node_modules/pi-lens/dist/clients/dispatch/utils/format-utils.js +0 -45
  472. package/node_modules/pi-lens/dist/clients/dispatch/utils/lsp-diagnostics.js +0 -35
  473. package/node_modules/pi-lens/dist/clients/disposition-logger.js +0 -32
  474. package/node_modules/pi-lens/dist/clients/disposition-publish.js +0 -124
  475. package/node_modules/pi-lens/dist/clients/durable-store.js +0 -97
  476. package/node_modules/pi-lens/dist/clients/effective-config.js +0 -415
  477. package/node_modules/pi-lens/dist/clients/env-utils.js +0 -83
  478. package/node_modules/pi-lens/dist/clients/error-class.js +0 -23
  479. package/node_modules/pi-lens/dist/clients/eval-timestamp.js +0 -17
  480. package/node_modules/pi-lens/dist/clients/event-loop-hold.js +0 -274
  481. package/node_modules/pi-lens/dist/clients/event-loop-monitor.js +0 -250
  482. package/node_modules/pi-lens/dist/clients/extension-log.js +0 -504
  483. package/node_modules/pi-lens/dist/clients/extension-mode.js +0 -73
  484. package/node_modules/pi-lens/dist/clients/feature-hints.js +0 -103
  485. package/node_modules/pi-lens/dist/clients/file-kinds.js +0 -412
  486. package/node_modules/pi-lens/dist/clients/file-role.js +0 -134
  487. package/node_modules/pi-lens/dist/clients/file-time.js +0 -160
  488. package/node_modules/pi-lens/dist/clients/file-utils.js +0 -1032
  489. package/node_modules/pi-lens/dist/clients/finding-delivery-gate.js +0 -494
  490. package/node_modules/pi-lens/dist/clients/finding-identity.js +0 -88
  491. package/node_modules/pi-lens/dist/clients/fix-worklog.js +0 -103
  492. package/node_modules/pi-lens/dist/clients/format-events-publish.js +0 -343
  493. package/node_modules/pi-lens/dist/clients/format-service.js +0 -222
  494. package/node_modules/pi-lens/dist/clients/formatters-lazy.js +0 -9
  495. package/node_modules/pi-lens/dist/clients/formatters.js +0 -2032
  496. package/node_modules/pi-lens/dist/clients/freshness-cadence.js +0 -17
  497. package/node_modules/pi-lens/dist/clients/freshness.js +0 -38
  498. package/node_modules/pi-lens/dist/clients/generated-artifacts.js +0 -394
  499. package/node_modules/pi-lens/dist/clients/generation-guard.js +0 -215
  500. package/node_modules/pi-lens/dist/clients/git-guard.js +0 -1136
  501. package/node_modules/pi-lens/dist/clients/git-tracked-ignore.js +0 -243
  502. package/node_modules/pi-lens/dist/clients/gitleaks-client.js +0 -509
  503. package/node_modules/pi-lens/dist/clients/go-client.js +0 -104
  504. package/node_modules/pi-lens/dist/clients/govulncheck-client.js +0 -605
  505. package/node_modules/pi-lens/dist/clients/gradle-ktfmt-style.js +0 -348
  506. package/node_modules/pi-lens/dist/clients/grammar-source.js +0 -465
  507. package/node_modules/pi-lens/dist/clients/gzip-stage-write.js +0 -135
  508. package/node_modules/pi-lens/dist/clients/hashline-anchor.js +0 -424
  509. package/node_modules/pi-lens/dist/clients/hook-budgets.js +0 -76
  510. package/node_modules/pi-lens/dist/clients/host-edit-normalize.js +0 -140
  511. package/node_modules/pi-lens/dist/clients/host-ports.js +0 -39
  512. package/node_modules/pi-lens/dist/clients/indent-retarget.js +0 -154
  513. package/node_modules/pi-lens/dist/clients/inline-blocker-dispositions.js +0 -186
  514. package/node_modules/pi-lens/dist/clients/install-diagnostics.js +0 -156
  515. package/node_modules/pi-lens/dist/clients/installer/index.js +0 -5416
  516. package/node_modules/pi-lens/dist/clients/installer/managed-tool-refresh-session.js +0 -58
  517. package/node_modules/pi-lens/dist/clients/installer/managed-tool-refresh.js +0 -783
  518. package/node_modules/pi-lens/dist/clients/instance-reaper-state.js +0 -7
  519. package/node_modules/pi-lens/dist/clients/instance-reaper.js +0 -1137
  520. package/node_modules/pi-lens/dist/clients/instance-registry-lock.js +0 -145
  521. package/node_modules/pi-lens/dist/clients/instance-registry.js +0 -773
  522. package/node_modules/pi-lens/dist/clients/jscpd-client.js +0 -378
  523. package/node_modules/pi-lens/dist/clients/json-cache-read.js +0 -65
  524. package/node_modules/pi-lens/dist/clients/knip-client.js +0 -788
  525. package/node_modules/pi-lens/dist/clients/language-policy.js +0 -252
  526. package/node_modules/pi-lens/dist/clients/language-profile.js +0 -361
  527. package/node_modules/pi-lens/dist/clients/language-registry.js +0 -603
  528. package/node_modules/pi-lens/dist/clients/latency-logger.js +0 -727
  529. package/node_modules/pi-lens/dist/clients/lazy-import.js +0 -21
  530. package/node_modules/pi-lens/dist/clients/ledger-bounds.js +0 -54
  531. package/node_modules/pi-lens/dist/clients/lens-config.js +0 -404
  532. package/node_modules/pi-lens/dist/clients/lens-engine.js +0 -358
  533. package/node_modules/pi-lens/dist/clients/lens-events.js +0 -125
  534. package/node_modules/pi-lens/dist/clients/lens-flag-registry.js +0 -467
  535. package/node_modules/pi-lens/dist/clients/lens-map.js +0 -1156
  536. package/node_modules/pi-lens/dist/clients/live-bus-emitter.js +0 -74
  537. package/node_modules/pi-lens/dist/clients/log-cleanup.js +0 -222
  538. package/node_modules/pi-lens/dist/clients/lsp/aggregation.js +0 -178
  539. package/node_modules/pi-lens/dist/clients/lsp/cascade-tier.js +0 -421
  540. package/node_modules/pi-lens/dist/clients/lsp/client.js +0 -4593
  541. package/node_modules/pi-lens/dist/clients/lsp/config.js +0 -691
  542. package/node_modules/pi-lens/dist/clients/lsp/content-limits.js +0 -41
  543. package/node_modules/pi-lens/dist/clients/lsp/diagnostic-binding.js +0 -225
  544. package/node_modules/pi-lens/dist/clients/lsp/document-drift.js +0 -467
  545. package/node_modules/pi-lens/dist/clients/lsp/edits.js +0 -1219
  546. package/node_modules/pi-lens/dist/clients/lsp/index.js +0 -8305
  547. package/node_modules/pi-lens/dist/clients/lsp/inferred-project.js +0 -216
  548. package/node_modules/pi-lens/dist/clients/lsp/jvm-runtime.js +0 -298
  549. package/node_modules/pi-lens/dist/clients/lsp/language.js +0 -63
  550. package/node_modules/pi-lens/dist/clients/lsp/launch.js +0 -746
  551. package/node_modules/pi-lens/dist/clients/lsp/lombok.js +0 -158
  552. package/node_modules/pi-lens/dist/clients/lsp/path-utils.js +0 -5
  553. package/node_modules/pi-lens/dist/clients/lsp/pending-aux-coverage.js +0 -251
  554. package/node_modules/pi-lens/dist/clients/lsp/position-encoding.js +0 -61
  555. package/node_modules/pi-lens/dist/clients/lsp/ruby-drive-dirs.js +0 -83
  556. package/node_modules/pi-lens/dist/clients/lsp/server.js +0 -3290
  557. package/node_modules/pi-lens/dist/clients/lsp/session-roots.js +0 -192
  558. package/node_modules/pi-lens/dist/clients/lsp/spawn-history.js +0 -17
  559. package/node_modules/pi-lens/dist/clients/lsp/sync-kind.js +0 -56
  560. package/node_modules/pi-lens/dist/clients/lsp/tsserver-sync.js +0 -332
  561. package/node_modules/pi-lens/dist/clients/lsp/wait-policy/capability-snapshot.js +0 -1
  562. package/node_modules/pi-lens/dist/clients/lsp/wait-policy/classification.js +0 -85
  563. package/node_modules/pi-lens/dist/clients/lsp/wait-policy/index.js +0 -10
  564. package/node_modules/pi-lens/dist/clients/lsp/wait-policy/strategies.js +0 -392
  565. package/node_modules/pi-lens/dist/clients/lsp/watch-queue.js +0 -61
  566. package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-cache.js +0 -639
  567. package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-session.js +0 -30
  568. package/node_modules/pi-lens/dist/clients/lsp/workspace-sweep-hold.js +0 -184
  569. package/node_modules/pi-lens/dist/clients/lsp-budget.js +0 -186
  570. package/node_modules/pi-lens/dist/clients/lsp-document-symbols.js +0 -110
  571. package/node_modules/pi-lens/dist/clients/lsp-lazy.js +0 -9
  572. package/node_modules/pi-lens/dist/clients/lsp-mutation.js +0 -396
  573. package/node_modules/pi-lens/dist/clients/lsp-status.js +0 -59
  574. package/node_modules/pi-lens/dist/clients/map-with-concurrency.js +0 -40
  575. package/node_modules/pi-lens/dist/clients/mcp/analyze.js +0 -420
  576. package/node_modules/pi-lens/dist/clients/mcp/host-shim.js +0 -31
  577. package/node_modules/pi-lens/dist/clients/mcp/ipc.js +0 -523
  578. package/node_modules/pi-lens/dist/clients/mcp/review.js +0 -197
  579. package/node_modules/pi-lens/dist/clients/mcp/session.js +0 -412
  580. package/node_modules/pi-lens/dist/clients/memory-sampler.js +0 -208
  581. package/node_modules/pi-lens/dist/clients/message-end-attribution.js +0 -30
  582. package/node_modules/pi-lens/dist/clients/metrics-client.js +0 -107
  583. package/node_modules/pi-lens/dist/clients/metrics-history.js +0 -327
  584. package/node_modules/pi-lens/dist/clients/middle-man-analysis.js +0 -263
  585. package/node_modules/pi-lens/dist/clients/model-provider.js +0 -53
  586. package/node_modules/pi-lens/dist/clients/module-report-lsp.js +0 -189
  587. package/node_modules/pi-lens/dist/clients/module-report.js +0 -2150
  588. package/node_modules/pi-lens/dist/clients/mutating-tool.js +0 -651
  589. package/node_modules/pi-lens/dist/clients/mutation-attribution.js +0 -368
  590. package/node_modules/pi-lens/dist/clients/mutation-bridge.js +0 -240
  591. package/node_modules/pi-lens/dist/clients/ndjson-logger.js +0 -734
  592. package/node_modules/pi-lens/dist/clients/observed-mutation-sources.js +0 -101
  593. package/node_modules/pi-lens/dist/clients/observed-mutation.js +0 -1253
  594. package/node_modules/pi-lens/dist/clients/oldtext-autopatch.js +0 -128
  595. package/node_modules/pi-lens/dist/clients/opaque-mutation-scan.js +0 -496
  596. package/node_modules/pi-lens/dist/clients/opengrep-client.js +0 -333
  597. package/node_modules/pi-lens/dist/clients/opengrep-config.js +0 -76
  598. package/node_modules/pi-lens/dist/clients/package-manager.js +0 -607
  599. package/node_modules/pi-lens/dist/clients/package-root.js +0 -38
  600. package/node_modules/pi-lens/dist/clients/partial-edit-apply.js +0 -439
  601. package/node_modules/pi-lens/dist/clients/path-attribution-telemetry.js +0 -43
  602. package/node_modules/pi-lens/dist/clients/path-keyed-map.js +0 -108
  603. package/node_modules/pi-lens/dist/clients/path-utils.js +0 -1244
  604. package/node_modules/pi-lens/dist/clients/performance-report.js +0 -331
  605. package/node_modules/pi-lens/dist/clients/persist-debounce.js +0 -70
  606. package/node_modules/pi-lens/dist/clients/persistent-reverify.js +0 -271
  607. package/node_modules/pi-lens/dist/clients/php-cs-fixer-config.js +0 -119
  608. package/node_modules/pi-lens/dist/clients/pipeline.js +0 -1480
  609. package/node_modules/pi-lens/dist/clients/post-autofix-notice.js +0 -37
  610. package/node_modules/pi-lens/dist/clients/print-mode.js +0 -21
  611. package/node_modules/pi-lens/dist/clients/probe-home-state.js +0 -228
  612. package/node_modules/pi-lens/dist/clients/process-bridge.js +0 -66
  613. package/node_modules/pi-lens/dist/clients/process-singletons.js +0 -210
  614. package/node_modules/pi-lens/dist/clients/process-snapshot.js +0 -68
  615. package/node_modules/pi-lens/dist/clients/project-changes.js +0 -181
  616. package/node_modules/pi-lens/dist/clients/project-conventions.js +0 -171
  617. package/node_modules/pi-lens/dist/clients/project-diagnostics/cache.js +0 -137
  618. package/node_modules/pi-lens/dist/clients/project-diagnostics/extractors.js +0 -109
  619. package/node_modules/pi-lens/dist/clients/project-diagnostics/fresh-fetch.js +0 -668
  620. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +0 -118
  621. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/dead-code.js +0 -47
  622. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +0 -40
  623. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/govulncheck.js +0 -34
  624. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/jscpd.js +0 -38
  625. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/knip.js +0 -47
  626. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/madge.js +0 -48
  627. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/opengrep.js +0 -40
  628. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +0 -127
  629. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/trivy.js +0 -81
  630. package/node_modules/pi-lens/dist/clients/project-diagnostics/scanner.js +0 -520
  631. package/node_modules/pi-lens/dist/clients/project-diagnostics/types.js +0 -1
  632. package/node_modules/pi-lens/dist/clients/project-lens-config.js +0 -807
  633. package/node_modules/pi-lens/dist/clients/project-report.js +0 -701
  634. package/node_modules/pi-lens/dist/clients/project-scale.js +0 -237
  635. package/node_modules/pi-lens/dist/clients/project-scan-policy.js +0 -11
  636. package/node_modules/pi-lens/dist/clients/project-snapshot-fingerprint.js +0 -48
  637. package/node_modules/pi-lens/dist/clients/project-snapshot-persist-worker.js +0 -20
  638. package/node_modules/pi-lens/dist/clients/project-snapshot.js +0 -1653
  639. package/node_modules/pi-lens/dist/clients/project-trust.js +0 -181
  640. package/node_modules/pi-lens/dist/clients/python-environment.js +0 -217
  641. package/node_modules/pi-lens/dist/clients/python-provenance.js +0 -639
  642. package/node_modules/pi-lens/dist/clients/quiet-window-config.js +0 -47
  643. package/node_modules/pi-lens/dist/clients/quiet-window.js +0 -236
  644. package/node_modules/pi-lens/dist/clients/read-bridge.js +0 -139
  645. package/node_modules/pi-lens/dist/clients/read-expansion.js +0 -266
  646. package/node_modules/pi-lens/dist/clients/read-guard-logger.js +0 -251
  647. package/node_modules/pi-lens/dist/clients/read-guard-tool-lines.js +0 -1306
  648. package/node_modules/pi-lens/dist/clients/read-guard.js +0 -1561
  649. package/node_modules/pi-lens/dist/clients/recent-touches.js +0 -240
  650. package/node_modules/pi-lens/dist/clients/redact/secrets.js +0 -449
  651. package/node_modules/pi-lens/dist/clients/resource-sampler.js +0 -628
  652. package/node_modules/pi-lens/dist/clients/reverse-deps.js +0 -270
  653. package/node_modules/pi-lens/dist/clients/review-graph/builder.js +0 -5126
  654. package/node_modules/pi-lens/dist/clients/review-graph/format.js +0 -33
  655. package/node_modules/pi-lens/dist/clients/review-graph/git-identity.js +0 -163
  656. package/node_modules/pi-lens/dist/clients/review-graph/import-resolvers.js +0 -481
  657. package/node_modules/pi-lens/dist/clients/review-graph/persist-worker.js +0 -10
  658. package/node_modules/pi-lens/dist/clients/review-graph/query.js +0 -244
  659. package/node_modules/pi-lens/dist/clients/review-graph/revision-drift.js +0 -21
  660. package/node_modules/pi-lens/dist/clients/review-graph/service.js +0 -96
  661. package/node_modules/pi-lens/dist/clients/review-graph/shared-extraction-ir.js +0 -82
  662. package/node_modules/pi-lens/dist/clients/review-graph/symbol-id.js +0 -103
  663. package/node_modules/pi-lens/dist/clients/review-graph/tsconfig-paths.js +0 -299
  664. package/node_modules/pi-lens/dist/clients/review-graph/types.js +0 -1
  665. package/node_modules/pi-lens/dist/clients/review-graph/workspace-modules.js +0 -449
  666. package/node_modules/pi-lens/dist/clients/review-graph-logger.js +0 -81
  667. package/node_modules/pi-lens/dist/clients/ruff-client.js +0 -179
  668. package/node_modules/pi-lens/dist/clients/rules-scanner.js +0 -131
  669. package/node_modules/pi-lens/dist/clients/run-duration.js +0 -55
  670. package/node_modules/pi-lens/dist/clients/runtime-agent-end.js +0 -746
  671. package/node_modules/pi-lens/dist/clients/runtime-config.js +0 -77
  672. package/node_modules/pi-lens/dist/clients/runtime-context.js +0 -211
  673. package/node_modules/pi-lens/dist/clients/runtime-coordinator.js +0 -1324
  674. package/node_modules/pi-lens/dist/clients/runtime-session.js +0 -2485
  675. package/node_modules/pi-lens/dist/clients/runtime-tool-call.js +0 -1295
  676. package/node_modules/pi-lens/dist/clients/runtime-tool-result.js +0 -2049
  677. package/node_modules/pi-lens/dist/clients/runtime-turn.js +0 -3767
  678. package/node_modules/pi-lens/dist/clients/rust-client.js +0 -97
  679. package/node_modules/pi-lens/dist/clients/safe-spawn.js +0 -2357
  680. package/node_modules/pi-lens/dist/clients/sanitize.js +0 -286
  681. package/node_modules/pi-lens/dist/clients/scan-utils.js +0 -25
  682. package/node_modules/pi-lens/dist/clients/scratch-tree-policy.js +0 -165
  683. package/node_modules/pi-lens/dist/clients/search-read-registration.js +0 -94
  684. package/node_modules/pi-lens/dist/clients/secret-findings.js +0 -114
  685. package/node_modules/pi-lens/dist/clients/security-scan-client.js +0 -352
  686. package/node_modules/pi-lens/dist/clients/session-event-guard.js +0 -297
  687. package/node_modules/pi-lens/dist/clients/session-lifecycle.js +0 -484
  688. package/node_modules/pi-lens/dist/clients/session-start-observability.js +0 -94
  689. package/node_modules/pi-lens/dist/clients/session-state-store.js +0 -101
  690. package/node_modules/pi-lens/dist/clients/session-summary.js +0 -15
  691. package/node_modules/pi-lens/dist/clients/sessionstart-logger.js +0 -27
  692. package/node_modules/pi-lens/dist/clients/sg-runner.js +0 -876
  693. package/node_modules/pi-lens/dist/clients/sgconfig.js +0 -347
  694. package/node_modules/pi-lens/dist/clients/shared-checkout-guard.js +0 -338
  695. package/node_modules/pi-lens/dist/clients/single-flight.js +0 -158
  696. package/node_modules/pi-lens/dist/clients/situational-tool-telemetry.js +0 -108
  697. package/node_modules/pi-lens/dist/clients/skills-resolver.js +0 -141
  698. package/node_modules/pi-lens/dist/clients/slow-fs.js +0 -138
  699. package/node_modules/pi-lens/dist/clients/smells-rollup.js +0 -231
  700. package/node_modules/pi-lens/dist/clients/source-filter.js +0 -596
  701. package/node_modules/pi-lens/dist/clients/source-walker.js +0 -211
  702. package/node_modules/pi-lens/dist/clients/spawn-output-cap.js +0 -120
  703. package/node_modules/pi-lens/dist/clients/spawn-timeout-cooldown.js +0 -110
  704. package/node_modules/pi-lens/dist/clients/stale-marker.js +0 -17
  705. package/node_modules/pi-lens/dist/clients/startup-scan.js +0 -400
  706. package/node_modules/pi-lens/dist/clients/startup-timing.js +0 -130
  707. package/node_modules/pi-lens/dist/clients/string-utils.js +0 -33
  708. package/node_modules/pi-lens/dist/clients/subagent-mode.js +0 -111
  709. package/node_modules/pi-lens/dist/clients/symbol-containment.js +0 -24
  710. package/node_modules/pi-lens/dist/clients/symbol-types.js +0 -5
  711. package/node_modules/pi-lens/dist/clients/test-runner-client.js +0 -2507
  712. package/node_modules/pi-lens/dist/clients/test-runner-delivery.js +0 -287
  713. package/node_modules/pi-lens/dist/clients/todo-scanner.js +0 -229
  714. package/node_modules/pi-lens/dist/clients/tool-agreement.js +0 -423
  715. package/node_modules/pi-lens/dist/clients/tool-config.js +0 -249
  716. package/node_modules/pi-lens/dist/clients/tool-cwd.js +0 -270
  717. package/node_modules/pi-lens/dist/clients/tool-definition.js +0 -47
  718. package/node_modules/pi-lens/dist/clients/tool-event.js +0 -105
  719. package/node_modules/pi-lens/dist/clients/tool-policy.js +0 -2755
  720. package/node_modules/pi-lens/dist/clients/tool-probe.js +0 -53
  721. package/node_modules/pi-lens/dist/clients/tool-render.js +0 -156
  722. package/node_modules/pi-lens/dist/clients/tool-set-policy.js +0 -118
  723. package/node_modules/pi-lens/dist/clients/tree-sitter-cache.js +0 -364
  724. package/node_modules/pi-lens/dist/clients/tree-sitter-client.js +0 -4195
  725. package/node_modules/pi-lens/dist/clients/tree-sitter-logger.js +0 -100
  726. package/node_modules/pi-lens/dist/clients/tree-sitter-navigator.js +0 -269
  727. package/node_modules/pi-lens/dist/clients/tree-sitter-query-loader.js +0 -569
  728. package/node_modules/pi-lens/dist/clients/tree-sitter-shared.js +0 -158
  729. package/node_modules/pi-lens/dist/clients/tree-sitter-symbol-extractor.js +0 -1265
  730. package/node_modules/pi-lens/dist/clients/trivy-client.js +0 -467
  731. package/node_modules/pi-lens/dist/clients/tui-fit.js +0 -50
  732. package/node_modules/pi-lens/dist/clients/turn-context.js +0 -52
  733. package/node_modules/pi-lens/dist/clients/turn-end/lane.js +0 -51
  734. package/node_modules/pi-lens/dist/clients/turn-end/lanes/govulncheck.js +0 -112
  735. package/node_modules/pi-lens/dist/clients/turn-end/lanes/secrets.js +0 -204
  736. package/node_modules/pi-lens/dist/clients/turn-summary-render.js +0 -72
  737. package/node_modules/pi-lens/dist/clients/turn-summary.js +0 -132
  738. package/node_modules/pi-lens/dist/clients/typos-config.js +0 -29
  739. package/node_modules/pi-lens/dist/clients/user-notify.js +0 -51
  740. package/node_modules/pi-lens/dist/clients/vanished-instance-marker.js +0 -57
  741. package/node_modules/pi-lens/dist/clients/warm-attach.js +0 -305
  742. package/node_modules/pi-lens/dist/clients/widget-state.js +0 -1808
  743. package/node_modules/pi-lens/dist/clients/word-index-logger.js +0 -49
  744. package/node_modules/pi-lens/dist/clients/word-index-store.js +0 -459
  745. package/node_modules/pi-lens/dist/clients/word-index.js +0 -2080
  746. package/node_modules/pi-lens/dist/clients/workspace-topology.js +0 -443
  747. package/node_modules/pi-lens/dist/clients/write-ordering-guard.js +0 -65
  748. package/node_modules/pi-lens/dist/clients/zizmor-config.js +0 -340
  749. package/node_modules/pi-lens/dist/i18n.js +0 -69
  750. package/node_modules/pi-lens/dist/mcp/build-staleness.js +0 -124
  751. package/node_modules/pi-lens/dist/scripts/lib/process-scan.mjs +0 -583
  752. package/node_modules/pi-lens/dist/scripts/lib/skills-predicate.mjs +0 -129
  753. package/node_modules/pi-lens/dist/scripts/lib/web-tree-sitter-dir.mjs +0 -123
  754. package/node_modules/pi-lens/dist/tools/activate-tools.js +0 -87
  755. package/node_modules/pi-lens/dist/tools/ast-grep-outline.js +0 -137
  756. package/node_modules/pi-lens/dist/tools/ast-grep-replace.js +0 -244
  757. package/node_modules/pi-lens/dist/tools/ast-grep-search.js +0 -762
  758. package/node_modules/pi-lens/dist/tools/effective-config.js +0 -90
  759. package/node_modules/pi-lens/dist/tools/lens-diagnostic-mark.js +0 -375
  760. package/node_modules/pi-lens/dist/tools/lens-diagnostics.js +0 -2571
  761. package/node_modules/pi-lens/dist/tools/lsp-diagnostics.js +0 -1745
  762. package/node_modules/pi-lens/dist/tools/lsp-navigation.js +0 -1367
  763. package/node_modules/pi-lens/dist/tools/lsp-structured-output.js +0 -294
  764. package/node_modules/pi-lens/dist/tools/module-report.js +0 -382
  765. package/node_modules/pi-lens/dist/tools/project-report.js +0 -86
  766. package/node_modules/pi-lens/dist/tools/render-compact.js +0 -374
  767. package/node_modules/pi-lens/dist/tools/scan-progress.js +0 -53
  768. package/node_modules/pi-lens/dist/tools/shared.js +0 -29
  769. package/node_modules/pi-lens/dist/tools/symbol-search.js +0 -155
@@ -1,876 +0,0 @@
1
- /**
2
- * SgRunner - encapsulates ast-grep subprocess management
3
- *
4
- * Extracted from AstGrepClient to simplify the main client.
5
- * Handles: spawn, spawnSync, temp dir management, JSON parsing.
6
- */
7
- import { createSubsystemLogger } from "./extension-log.js";
8
- import * as fs from "node:fs";
9
- import * as os from "node:os";
10
- import * as path from "node:path";
11
- import { getSgCommand, resolveManagedToolClient, } from "./dispatch/runners/utils/runner-helpers.js";
12
- import { getProjectIgnoreGlobs } from "./file-utils.js";
13
- import { findGlobalBinary } from "./package-manager.js";
14
- import { safeSpawnAsync } from "./safe-spawn.js";
15
- import { probeToolAsync } from "./tool-probe.js";
16
- import { truncatedByOutputCap } from "./spawn-output-cap.js";
17
- import { createSingleFlight } from "./single-flight.js";
18
- import { classifyProbeFailure, describeInstallAttempt, createAvailabilityLatch, logAvailabilityDecision, startHostStallSampler, } from "./dispatch/runners/utils/availability-policy.js";
19
- /**
20
- * Build the `bash -c` argv that runs `cmd` with `allArgs` as POSITIONAL
21
- * parameters. The script is the constant `"$0" "$@"`, so bash re-emits the
22
- * command and every arg verbatim — no parameter expansion, no word-splitting.
23
- *
24
- * Two properties this guarantees, neither of which string-interpolation could:
25
- * - ast-grep `$METAVAR` patterns reach the binary literally (not shell-expanded).
26
- * - an environment-derived command path (PATH-resolved `ast-grep`/`sg`/`npx`)
27
- * cannot inject shell — it's argv[0], never part of the script string
28
- * (CodeQL js/shell-command-injection-from-environment).
29
- */
30
- export function buildBashRunArgs(cmd, allArgs) {
31
- return ["-c", '"$0" "$@"', cmd, ...allArgs];
32
- }
33
- function sgExcludeArgsForProject(rootDir) {
34
- return getProjectIgnoreGlobs(rootDir).flatMap((glob) => [
35
- "--globs",
36
- `!${glob}`,
37
- ]);
38
- }
39
- const DEFAULT_EXEC_TIMEOUT_MS = 30_000;
40
- /** Budget for a single `--version` candidate probe, ms. */
41
- const PROBE_TIMEOUT_MS = 5_000;
42
- const MAX_SG_OUTPUT_BYTES = 8 * 1024 * 1024;
43
- /**
44
- * Format metavariable captures for display below a match line.
45
- * Single captures: $VAR=x $NAME=foo
46
- * Multi captures: $$$ARGS=a,b,c
47
- * Returns undefined when there are no meaningful captures.
48
- */
49
- function formatMetaVarCaptures(mv) {
50
- if (!mv)
51
- return undefined;
52
- const parts = [];
53
- for (const [name, node] of Object.entries(mv.single)) {
54
- if (node.text)
55
- parts.push(`$${name}=${node.text}`);
56
- }
57
- for (const [name, nodes] of Object.entries(mv.multi)) {
58
- if (nodes.length > 0) {
59
- const joined = nodes.map((n) => n.text).join("");
60
- if (joined)
61
- parts.push(`$$$${name}=${joined}`);
62
- }
63
- }
64
- for (const [name, value] of Object.entries(mv.transformed)) {
65
- if (value)
66
- parts.push(`@${name}=${value}`);
67
- }
68
- if (parts.length === 0)
69
- return undefined;
70
- return ` ${parts.join(" ")}`;
71
- }
72
- /**
73
- * Parse ast-grep `--json` stdout into a match array, or return `null` when the
74
- * text is not a match payload. ast-grep emits either a JSON array or (rarely) a
75
- * single object; both are normalized to an array. A JSON scalar/`null` is
76
- * rejected (returns `null`) so a hypothetical error-report scalar on stdout can
77
- * never be misread as a phantom match.
78
- */
79
- function tryParseSgMatches(stdout) {
80
- try {
81
- const parsed = JSON.parse(stdout);
82
- if (Array.isArray(parsed))
83
- return parsed;
84
- if (parsed !== null && typeof parsed === "object")
85
- return [parsed];
86
- return null;
87
- }
88
- catch {
89
- return null;
90
- }
91
- }
92
- // The truncation veto lives at the head of `exec`/`interpretScanResult` now
93
- // (#2100), so this stays a pure parser rather than re-asking a settled question.
94
- function tryParseNonZeroSgMatches(result) {
95
- if (!result.stdout.trim())
96
- return null;
97
- // Trimmed on purpose: a leading BOM survives JSON.parse's whitespace
98
- // tolerance but String.trim() strips it (matches the pre-refactor guard).
99
- return tryParseSgMatches(result.stdout.trim());
100
- }
101
- export class SgRunner {
102
- log;
103
- sgPath = null;
104
- sgArgsPrefix = [];
105
- /**
106
- * Availability memo, backed by the shared transient-aware latch (#1476).
107
- *
108
- * Before this, one failed sweep over every candidate — timeouts included —
109
- * latched `false` for the life of the process AND ran a full auto-install
110
- * first. A host stall during warm-up therefore both disabled ast-grep until
111
- * restart and paid for an install nobody needed.
112
- */
113
- availabilityLatch = createAvailabilityLatch();
114
- /**
115
- * At-most-one sweep in flight, via the shared primitive (#1753). One
116
- * instance owns one question, so the key is a constant.
117
- */
118
- ensureFlight = createSingleFlight();
119
- /**
120
- * Whether a DIRECT candidate — one that would have been ast-grep itself —
121
- * failed for a transient reason in the current sweep. Only these block the
122
- * install: a slow `npx` says nothing about whether ast-grep is on this
123
- * machine, and letting it block turned "ast-grep is genuinely absent on a
124
- * slow host" into "ast-grep is never installed and npx is re-spawned every
125
- * sweep, forever".
126
- */
127
- sweepSawTransient = false;
128
- sweepTransientCause = "probe-timeout";
129
- /**
130
- * The DIRECT candidates that were unreachable, in ask order (#1568).
131
- *
132
- * The sweep returns at the first candidate that answers, so at the moment of
133
- * a win this is exactly the set of preferred tiers the winner did not beat on
134
- * the merits. Fallbacks are excluded on purpose: `npx` is asked before the
135
- * global-bin and platform-package tiers, and a slow `npx` says nothing about
136
- * a winner that is a real binary.
137
- *
138
- * Basenames, because a candidate can be an absolute global-bin or
139
- * platform-package path and this list is written to latency.log (#1568
140
- * review F3).
141
- */
142
- sweepUnreachable = [];
143
- /** A transient on the npx fallback: not evidence, but not nothing either. */
144
- sweepFallbackTransient = false;
145
- sweepFallbackCause = "probe-timeout";
146
- /** Host stall summed over every probe of the current sweep, ms. */
147
- sweepHostStallMs = 0;
148
- /**
149
- * Candidates — direct or fallback — that this sweep probed and found
150
- * DURABLY missing (real ENOENT/non-installable, not a stall) (#1593). The
151
- * retained-arm fallback below only sees whether SOME candidate stalled; this
152
- * list lets it also check whether the memoized winner itself is one of the
153
- * candidates this very sweep just disproved, rather than re-serving a
154
- * command that ENOENTed a moment ago because an unrelated sibling stalled.
155
- */
156
- sweepDurablyMissing = [];
157
- constructor(verbose = false) {
158
- this.log = verbose ? createSubsystemLogger("sg-runner") : () => { };
159
- }
160
- /**
161
- * Check if ast-grep CLI is available, auto-install if not.
162
- *
163
- * Re-entrancy safe: concurrent first-time callers share one flight, so
164
- * probing/auto-install isn't duplicated across session-start tasks. The
165
- * share and the clear-in-finally belong to `singleFlight` (#1753); this
166
- * method owns only the latch short-circuit above it. The sweep-local
167
- * bookkeeping `doEnsureAvailable` resets on entry is untouched — it is
168
- * per-sweep state, not concurrency state.
169
- */
170
- async ensureAvailable() {
171
- // Fast path: already decided. `read()` returns null when the last verdict
172
- // was transient and its cooldown expired, which re-enters the sweep.
173
- const memo = this.availabilityLatch.read();
174
- if (memo !== null)
175
- return memo;
176
- return this.ensureFlight.run("ast-grep", () => this.doEnsureAvailable());
177
- }
178
- async doEnsureAvailable() {
179
- const startedAt = Date.now();
180
- this.sweepSawTransient = false;
181
- this.sweepTransientCause = "probe-timeout";
182
- this.sweepUnreachable = [];
183
- this.sweepFallbackTransient = false;
184
- this.sweepFallbackCause = "probe-timeout";
185
- this.sweepHostStallMs = 0;
186
- this.sweepDurablyMissing = [];
187
- // Step 1: PATH — canonical binary names + npx fallback.
188
- // Prefer ast-grep over sg on Linux: /usr/bin/sg is util-linux, not ast-grep.
189
- const pathCommand = await this.probeCommandCandidates([
190
- { cmd: "ast-grep", argsPrefix: [] },
191
- { cmd: "sg", argsPrefix: [] },
192
- // `npx --no -- ast-grep` starts a Node process before it can answer, so
193
- // it is the candidate most likely to blow a 5 s budget on a cold or busy
194
- // box. Marked a fallback so its timeout cannot veto the install.
195
- { cmd: "npx", argsPrefix: ["--no", "--", "ast-grep"], fallback: true },
196
- ]);
197
- if (pathCommand) {
198
- this.sgPath = pathCommand.cmd;
199
- this.sgArgsPrefix = pathCommand.argsPrefix;
200
- this.noteAvailable(startedAt, `ast-grep found on PATH: ${pathCommand.cmd}`);
201
- return true;
202
- }
203
- // Step 1b: any package manager's global bin dir (npm/pnpm/yarn/bun).
204
- // Catches a `pnpm add -g @ast-grep/cli` shim whose bin dir is off PATH (so
205
- // Step 1 misses) and which is a global — not a local node_modules platform
206
- // package — so Step 2 misses it too (#375).
207
- for (const name of ["ast-grep", "sg"]) {
208
- const globalBin = await findGlobalBinary(name);
209
- if (globalBin && (await this.probeCommand(globalBin, []))) {
210
- this.sgPath = globalBin;
211
- this.sgArgsPrefix = [];
212
- this.noteAvailable(startedAt, `ast-grep found in global bin: ${globalBin}`);
213
- return true;
214
- }
215
- }
216
- // Step 2: platform-specific npm package binaries.
217
- // Covers setups where @ast-grep/cli-{os}-{arch} is installed but the binary
218
- // directory is not on PATH (common with pnpm, Yarn PnP, or isolated installs).
219
- const platformBinary = await this.probePlatformPackageBinary();
220
- if (platformBinary) {
221
- this.sgPath = platformBinary;
222
- this.sgArgsPrefix = [];
223
- this.noteAvailable(startedAt, `ast-grep found via platform package: ${platformBinary}`);
224
- return true;
225
- }
226
- // Step 3: Homebrew (macOS only).
227
- if (process.platform === "darwin") {
228
- const brewBinary = await this.probeHomebrew();
229
- if (brewBinary) {
230
- this.sgPath = brewBinary;
231
- this.sgArgsPrefix = [];
232
- this.noteAvailable(startedAt, `ast-grep found via Homebrew: ${brewBinary}`);
233
- return true;
234
- }
235
- }
236
- // A timeout on a DIRECT candidate means the machine answered, not the tool
237
- // (#1476). Installing ast-grep because the host event loop stalled is a
238
- // heavyweight reaction to a hiccup, and latching the result disabled the
239
- // tool until restart. Retry the sweep later instead.
240
- //
241
- // The npx fallback is deliberately NOT part of this test. Gating the
242
- // install on it regressed the very host this change targets: a slow box
243
- // with no ast-grep timed out `npx --no -- ast-grep` every sweep, so the
244
- // install below was never reached and the slow npx was re-spawned on each
245
- // escalating retry instead — worse than the latch it replaced.
246
- if (this.sweepSawTransient) {
247
- // Nothing answered, transiently, while we are still holding a command a
248
- // previous provisional sweep proved working. Discarding it here would
249
- // run #1476 backwards — a timeout erasing a positive result — and it
250
- // would send the sweep on to Step 4 to install a tool that is already
251
- // runnable. Keep the winner and re-arm the cooldown (#1568 review F1).
252
- // #1593: a sibling tier stalling this sweep is not license to re-serve
253
- // a winner that THIS SAME sweep just proved durably missing.
254
- if (this.availabilityLatch.isProvisional() &&
255
- this.sgPath &&
256
- !this.sweepDurablyMissing.includes(this.sgPath)) {
257
- this.noteAvailable(startedAt, `ast-grep re-probe stalled; keeping ${this.sgPath}`, { retained: true });
258
- return true;
259
- }
260
- this.log("ast-grep availability probe timed out; will retry (not installing)");
261
- return this.noteUnavailable(startedAt, "transient", this.sweepTransientCause);
262
- }
263
- // Step 4: install via the typed shared seam, then validate the returned
264
- // absolute binary before publishing it.
265
- const installed = await resolveManagedToolClient({
266
- toolId: "ast-grep",
267
- cwd: process.cwd(),
268
- probe: async () => ({ outcome: "missing" }),
269
- acceptInstalled: async (installedPath) => (await this.probeCommand(installedPath, [])) ? installedPath : null,
270
- });
271
- if (installed.outcome === "success") {
272
- this.sgPath = installed.value;
273
- this.sgArgsPrefix = [];
274
- this.noteAvailable(startedAt, `ast-grep auto-installed: ${installed.value}`);
275
- return true;
276
- }
277
- // The install failed AND the npx fallback never got a fair hearing, so
278
- // "ast-grep is not installed" is not a fact yet. Expire the verdict.
279
- if (this.sweepFallbackTransient) {
280
- return this.noteUnavailable(startedAt, "transient", this.sweepFallbackCause);
281
- }
282
- // #1500: ASSERTED, not derived — and justified, because every candidate
283
- // probe answered "not found", so the absence is real. What the install did
284
- // is recorded as evidence rather than folded into the verdict: it is the one
285
- // fact separating "never installable here" from "the download failed", and
286
- // from "no install was attempted at all" (auto-install off, trust denied,
287
- // or an attempt already suppressed this session).
288
- const { getInstallAttempt } = await import("./installer/index.js");
289
- return this.noteUnavailable(startedAt, "missing", "not-found", describeInstallAttempt(getInstallAttempt("ast-grep"), {
290
- installedButRejected: installed.outcome === "non-installable",
291
- }), "caller");
292
- }
293
- /**
294
- * Record a successful sweep, with one decision record.
295
- *
296
- * The win is latched for the session UNLESS a direct candidate ahead of it
297
- * was unreachable (#1568). `sweepSawTransient` is set only by candidates the
298
- * sweep already asked, and the sweep returns at the first one that answers,
299
- * so at this point the flag means "a tier the winner is supposed to lose to
300
- * never got a fair hearing". Latching that pinned the session to
301
- * `npx --no -- ast-grep` — a Node start per invocation — over a healthy
302
- * ast-grep on PATH, until the next restart. Provisional instead: served now,
303
- * re-swept once the stalled tier's cooldown expires.
304
- *
305
- * The install arm cannot reach here provisionally: `doEnsureAvailable`
306
- * returns before Step 4 whenever `sweepSawTransient` is set.
307
- *
308
- * `retained` marks the other provisional case (#1568 review F1): no candidate
309
- * answered at all, and the winner being reported is the one the previous
310
- * sweep found, kept rather than discarded on a timeout.
311
- */
312
- noteAvailable(startedAt, message, opts = {}) {
313
- const provisional = this.sweepSawTransient;
314
- let retryAfterMs = 0;
315
- if (provisional) {
316
- retryAfterMs = this.availabilityLatch.noteProvisionallyAvailable(this.sweepTransientCause);
317
- }
318
- else {
319
- this.availabilityLatch.noteAvailable();
320
- }
321
- this.log(message);
322
- logAvailabilityDecision({
323
- tool: "ast-grep",
324
- verdict: "available",
325
- outcome: "success",
326
- cause: provisional ? this.sweepTransientCause : "ok",
327
- elapsedMs: Date.now() - startedAt,
328
- latched: !provisional,
329
- classifiedBy: "probe",
330
- hostStallMs: this.sweepHostStallMs,
331
- budgetMs: PROBE_TIMEOUT_MS,
332
- ...(provisional && {
333
- provisional: true,
334
- unreachablePreferred: [...this.sweepUnreachable],
335
- ...(opts.retained === true && { retained: true }),
336
- ...(retryAfterMs > 0 && { retryAfterMs }),
337
- }),
338
- });
339
- }
340
- /**
341
- * Record a failed sweep. A `transient` outcome expires after a bounded
342
- * cooldown; anything else is remembered for the session, as before. The
343
- * elapsed/stall numbers describe the WHOLE sweep, because the verdict is
344
- * about the sweep rather than any single candidate — reporting zero here
345
- * would erase the evidence that cracked #1467.
346
- */
347
- noteUnavailable(startedAt, outcome, cause, evidence,
348
- /**
349
- * How this arm reached its verdict. Per arm on purpose (#1500 review): the
350
- * sweep's own transient/missing conclusions ARE derived from candidate
351
- * probes, but the post-install assertion is not, and hardcoding `"probe"`
352
- * here labelled an assertion as a derivation — the exact confusion the
353
- * field was added to remove.
354
- */
355
- classifiedBy = "probe") {
356
- const retryAfterMs = this.availabilityLatch.noteUnavailable(outcome, cause);
357
- logAvailabilityDecision({
358
- tool: "ast-grep",
359
- verdict: "unavailable",
360
- outcome,
361
- cause,
362
- elapsedMs: Date.now() - startedAt,
363
- latched: outcome !== "transient",
364
- hostStallMs: this.sweepHostStallMs,
365
- ...(retryAfterMs > 0 && { retryAfterMs }),
366
- budgetMs: PROBE_TIMEOUT_MS,
367
- classifiedBy,
368
- ...(evidence !== undefined && { evidence }),
369
- });
370
- return false;
371
- }
372
- /**
373
- * Probe platform-specific @ast-grep/cli-{os}-{arch} npm packages.
374
- * These ship the binary at the package root (sg / sg.exe).
375
- */
376
- async probePlatformPackageBinary() {
377
- const { platform, arch } = process;
378
- const exeName = platform === "win32" ? "sg.exe" : "sg";
379
- // Map Node.js platform/arch to @ast-grep/cli package suffix.
380
- const pkgSuffixes = [];
381
- if (platform === "linux" && arch === "x64")
382
- pkgSuffixes.push("linux-x64-gnu");
383
- if (platform === "linux" && arch === "arm64")
384
- pkgSuffixes.push("linux-arm64-gnu");
385
- if (platform === "darwin" && arch === "arm64")
386
- pkgSuffixes.push("darwin-arm64");
387
- if (platform === "darwin" && arch === "x64")
388
- pkgSuffixes.push("darwin-x64");
389
- if (platform === "win32" && arch === "x64")
390
- pkgSuffixes.push("win32-x64-msvc");
391
- if (platform === "win32" && arch === "arm64")
392
- pkgSuffixes.push("win32-arm64-msvc");
393
- // Search roots: local node_modules and any parent node_modules directories.
394
- const searchRoots = [];
395
- let dir = process.cwd();
396
- for (let depth = 0; depth < 5; depth++) {
397
- searchRoots.push(path.join(dir, "node_modules"));
398
- const parent = path.dirname(dir);
399
- if (parent === dir)
400
- break;
401
- dir = parent;
402
- }
403
- for (const suffix of pkgSuffixes) {
404
- const pkgName = `@ast-grep/cli-${suffix}`;
405
- for (const root of searchRoots) {
406
- const candidate = path.join(root, pkgName, exeName);
407
- try {
408
- if (fs.existsSync(candidate) &&
409
- (await this.probeCommand(candidate, []))) {
410
- return candidate;
411
- }
412
- }
413
- catch {
414
- // not found or not executable — try next
415
- }
416
- }
417
- }
418
- return undefined;
419
- }
420
- /**
421
- * Probe Homebrew installation (macOS only).
422
- * Runs `brew --prefix ast-grep` and checks the resulting bin directory.
423
- */
424
- async probeHomebrew() {
425
- try {
426
- const result = await safeSpawnAsync("brew", ["--prefix", "ast-grep"], {
427
- timeout: 3000,
428
- });
429
- if (result.error || result.status !== 0)
430
- return undefined;
431
- const prefix = result.stdout.trim();
432
- if (!prefix)
433
- return undefined;
434
- for (const name of ["ast-grep", "sg"]) {
435
- const candidate = path.join(prefix, "bin", name);
436
- if (fs.existsSync(candidate) &&
437
- (await this.probeCommand(candidate, []))) {
438
- return candidate;
439
- }
440
- }
441
- }
442
- catch {
443
- // brew not installed or timed out
444
- }
445
- return undefined;
446
- }
447
- isAstGrepVersionOutput(output) {
448
- return /\bast[- ]grep\b/i.test(output);
449
- }
450
- /**
451
- * Probe one candidate. A failure is CLASSIFIED, not merely counted: a
452
- * timeout/abort marks the whole sweep transient so the caller retries later
453
- * instead of installing and latching. A command that answers but is not
454
- * ast-grep (Linux `/usr/bin/sg` is util-linux) is a durable no.
455
- */
456
- async probeCommand(cmd, argsPrefix, fallback = false) {
457
- // Host-side budget: measure the loop stall that overlapped the window so
458
- // the classifier can tell "the tool is slow" from "the host was busy".
459
- const sampler = startHostStallSampler();
460
- let result;
461
- let hostStallMs;
462
- try {
463
- result = await probeToolAsync(cmd, [...argsPrefix, "--version"], {
464
- timeout: PROBE_TIMEOUT_MS,
465
- });
466
- }
467
- finally {
468
- hostStallMs = sampler.stop();
469
- this.sweepHostStallMs += hostStallMs;
470
- }
471
- if (!result.error &&
472
- result.status === 0 &&
473
- this.isAstGrepVersionOutput(`${result.stdout}\n${result.stderr}`)) {
474
- return true;
475
- }
476
- const { outcome, cause } = classifyProbeFailure(result, { hostStallMs });
477
- if (outcome === "transient") {
478
- if (fallback) {
479
- this.sweepFallbackTransient = true;
480
- this.sweepFallbackCause = cause;
481
- }
482
- else {
483
- this.sweepSawTransient = true;
484
- this.sweepTransientCause = cause;
485
- const name = path.basename(cmd);
486
- if (!this.sweepUnreachable.includes(name)) {
487
- this.sweepUnreachable.push(name);
488
- }
489
- }
490
- }
491
- else if (!this.sweepDurablyMissing.includes(cmd)) {
492
- this.sweepDurablyMissing.push(cmd);
493
- }
494
- return false;
495
- }
496
- async probeCommandCandidates(candidates) {
497
- for (const candidate of candidates) {
498
- if (await this.probeCommand(candidate.cmd, candidate.argsPrefix, candidate.fallback ?? false)) {
499
- return candidate;
500
- }
501
- }
502
- return undefined;
503
- }
504
- /**
505
- * Get the ast-grep command to use, plus any npx prefix arguments.
506
- */
507
- getSgCommand() {
508
- return {
509
- cmd: this.sgPath || "ast-grep",
510
- argsPrefix: this.sgArgsPrefix,
511
- };
512
- }
513
- failureForSpawnResult(result) {
514
- if (result.failure === "aborted")
515
- return "aborted";
516
- switch (result.spawnFailure?.kind) {
517
- case "tool-not-found":
518
- return "unavailable";
519
- case "timeout":
520
- return "timeout";
521
- case "killed":
522
- return result.failure === "aborted" ? "aborted" : "cli-failure";
523
- case "cwd-unresolvable":
524
- case "permission-denied":
525
- case "spawn-failed":
526
- case undefined:
527
- return result.error ? "cli-failure" : undefined;
528
- }
529
- }
530
- formatPatternError(stderr, args) {
531
- if (stderr.includes("Multiple AST nodes are detected")) {
532
- return (`Invalid AST pattern: The pattern appears to contain multiple AST nodes or is malformed.\n` +
533
- `Common causes:\n` +
534
- ` 1. Missing parentheses: use it($TEST) not it"test"\n` +
535
- ` 2. Raw text without structure: use console.log($MSG) not just "console.log"\n` +
536
- ` 3. Unclosed quotes or brackets\n\n` +
537
- `Original error: ${stderr}`);
538
- }
539
- if (stderr.includes("Cannot parse query")) {
540
- return (`Pattern syntax error: The pattern could not be parsed as valid code.\n` +
541
- `Tips:\n` +
542
- ` - Patterns must be valid ${args.includes("--lang") ? args[args.indexOf("--lang") + 1] : "language"} syntax\n` +
543
- ` - Use metavariables like $NAME, $ARGS for variable parts\n` +
544
- ` - Example: 'function $NAME($$$PARAMS) { $$$BODY }'\n\n` +
545
- `Original error: ${stderr}`);
546
- }
547
- return stderr;
548
- }
549
- async execRaw(args, timeout = DEFAULT_EXEC_TIMEOUT_MS, options = {}) {
550
- const command = this.getSgCommand();
551
- const result = await safeSpawnAsync(command.cmd, [...command.argsPrefix, ...args], {
552
- timeout,
553
- deadlineAt: options.deadlineAt,
554
- signal: options.signal,
555
- maxOutputBytes: MAX_SG_OUTPUT_BYTES,
556
- });
557
- const failure = this.failureForSpawnResult(result);
558
- return {
559
- stdout: result.stdout,
560
- stderr: result.stderr,
561
- status: result.status,
562
- error: result.error?.message,
563
- failure,
564
- ...(result.outputTruncated ? { outputTruncated: true } : {}),
565
- };
566
- }
567
- /**
568
- * Run ast-grep asynchronously, return parsed matches. The Windows Git
569
- * Bash/MSYS path deliberately remains positional-argument based, but the
570
- * child itself now goes through safeSpawnAsync so cancellation, deadlines,
571
- * tree-kill, and output caps are shared with every other CLI runner.
572
- */
573
- async exec(args, options = {}) {
574
- const command = this.getSgCommand();
575
- const allArgs = [...command.argsPrefix, ...args];
576
- const isWindows = process.platform === "win32";
577
- const hasBash = Boolean(process.env.MSYSTEM || process.env.GIT_SHELL);
578
- const useBash = isWindows && hasBash;
579
- const result = await safeSpawnAsync(useBash ? "bash" : command.cmd, useBash ? buildBashRunArgs(command.cmd, allArgs) : allArgs, {
580
- timeout: DEFAULT_EXEC_TIMEOUT_MS,
581
- deadlineAt: options.deadlineAt,
582
- signal: options.signal,
583
- maxOutputBytes: MAX_SG_OUTPUT_BYTES,
584
- });
585
- const empty = () => ({
586
- matches: [],
587
- totalMatches: 0,
588
- truncated: false,
589
- });
590
- // FIRST (#2100): hitting the cap makes safe-spawn SIGTERM ast-grep, so a
591
- // truncated run also classifies as a killed spawn. Read after the two
592
- // gates below, this guard could only ever describe a run that exited
593
- // before the signal reached it. A timed-out or aborted run carries the
594
- // flag too and keeps its own classification below.
595
- if (truncatedByOutputCap(result)) {
596
- return {
597
- ...empty(),
598
- error: "Failed to parse output: output was truncated",
599
- };
600
- }
601
- const spawnFailure = this.failureForSpawnResult(result);
602
- if (spawnFailure) {
603
- return {
604
- ...empty(),
605
- error: spawnFailure === "unavailable"
606
- ? "ast-grep CLI not found. Install: npm i -D @ast-grep/cli"
607
- : result.error?.message || "ast-grep CLI failed to start",
608
- };
609
- }
610
- if (result.status !== 0) {
611
- const stdout = result.stdout.trim();
612
- const stderr = result.stderr.trim();
613
- // ast-grep's linter-style contract: a rule with `severity: error`
614
- // that MATCHES exits 1 with valid JSON matches on stdout (stderr
615
- // carries "Scan succeeded and found error level diagnostics"). An
616
- // exit code that means "scan succeeded with findings" must never be
617
- // classified as a CLI failure — parse the matches. Only fall through
618
- // to failure when the JSON isn't parseable (a real diagnostic).
619
- if (result.status === 1 && stdout) {
620
- const matches = tryParseNonZeroSgMatches(result);
621
- if (matches) {
622
- return {
623
- matches,
624
- totalMatches: matches.length,
625
- truncated: false,
626
- };
627
- }
628
- }
629
- // ast-grep uses status 1 with no output for a genuine no-match in
630
- // some CLI versions. Preserve that historical empty-result behavior;
631
- // any stderr (including an invalid kind/YAML diagnostic) is a failure.
632
- if (result.status === 1 && !stdout && !stderr)
633
- return empty();
634
- return {
635
- ...empty(),
636
- error: this.formatPatternError(stderr || `Command failed with exit code ${result.status}`, args),
637
- };
638
- }
639
- if (!result.stdout.trim())
640
- return empty();
641
- {
642
- const matches = tryParseSgMatches(result.stdout);
643
- if (matches) {
644
- return {
645
- matches,
646
- totalMatches: matches.length,
647
- truncated: false,
648
- };
649
- }
650
- return { ...empty(), error: "Failed to parse output" };
651
- }
652
- }
653
- // --- Shared helpers for temp-dir rule scans ---
654
- prepareTempScan(ruleId, ruleYaml) {
655
- const sessionDir = fs.mkdtempSync(path.join(os.tmpdir(), `pi-lens-temp-${ruleId}-`));
656
- try {
657
- const rulesSubdir = path.join(sessionDir, "rules");
658
- const configFile = path.join(sessionDir, ".sgconfig.yml");
659
- fs.mkdirSync(rulesSubdir, { recursive: true });
660
- fs.writeFileSync(configFile, `ruleDirs:\n - ./rules\n`);
661
- fs.writeFileSync(path.join(rulesSubdir, `${ruleId}.yml`), ruleYaml);
662
- return { sessionDir, configFile };
663
- }
664
- catch (error) {
665
- this.cleanupTempScan(sessionDir);
666
- throw error;
667
- }
668
- }
669
- cleanupTempScan(sessionDir) {
670
- try {
671
- fs.rmSync(sessionDir, { recursive: true, force: true });
672
- }
673
- catch (err) {
674
- this.log(`Cleanup failed: ${err.message}`);
675
- }
676
- }
677
- interpretScanResult(result, args) {
678
- // FIRST (#2100): same reason as `exec` above — the cap kill is our own
679
- // SIGTERM, so `failureForSpawnResult` answers "cli-failure" for it and
680
- // the truncation guard below never speaks.
681
- if (truncatedByOutputCap(result)) {
682
- return {
683
- matches: [],
684
- status: result.status,
685
- error: "Failed to parse ast-grep scan output: output was truncated",
686
- failure: "parse-failure",
687
- };
688
- }
689
- const failure = this.failureForSpawnResult(result);
690
- if (failure) {
691
- return {
692
- matches: [],
693
- status: result.status,
694
- error: result.error?.message || "ast-grep CLI failed to start",
695
- failure,
696
- };
697
- }
698
- if (result.status !== 0) {
699
- const stdout = result.stdout.trim();
700
- const stderr = result.stderr.trim();
701
- // ast-grep's linter-style contract: a rule with `severity: error`
702
- // that MATCHES exits 1 with valid JSON matches on stdout (stderr
703
- // carries "Scan succeeded and found error level diagnostics"). An
704
- // exit code that means "scan succeeded with findings" must never be
705
- // classified as a CLI failure — parse the matches. Only fall through
706
- // to failure when the JSON isn't parseable (a real diagnostic).
707
- if (result.status === 1 && stdout) {
708
- const matches = tryParseNonZeroSgMatches(result);
709
- if (matches) {
710
- return { matches, status: result.status };
711
- }
712
- }
713
- // Preserve ast-grep's status-1/no-output no-match convention. A
714
- // diagnostic on stderr is never treated as a no-match.
715
- if (result.status === 1 && !stdout && !stderr) {
716
- return { matches: [], status: result.status };
717
- }
718
- return {
719
- matches: [],
720
- status: result.status,
721
- error: this.formatPatternError(stderr || `ast-grep scan failed with exit code ${result.status}`, args),
722
- failure: "cli-failure",
723
- };
724
- }
725
- if (!result.stdout.trim())
726
- return { matches: [], status: result.status };
727
- {
728
- const matches = tryParseSgMatches(result.stdout);
729
- if (matches) {
730
- return { matches, status: result.status };
731
- }
732
- return {
733
- matches: [],
734
- status: result.status,
735
- error: "Failed to parse ast-grep scan output: invalid JSON",
736
- failure: "parse-failure",
737
- };
738
- }
739
- }
740
- async tempScanDetailedAsync(dir, ruleId, ruleYaml, timeout = DEFAULT_EXEC_TIMEOUT_MS, options = {}) {
741
- let sessionDir;
742
- try {
743
- ({ sessionDir } = this.prepareTempScan(ruleId, ruleYaml));
744
- const configFile = path.join(sessionDir, ".sgconfig.yml");
745
- const { cmd: sgCmd, args: sgPre } = getSgCommand();
746
- const result = await safeSpawnAsync(sgCmd, [
747
- ...sgPre,
748
- "scan",
749
- "--config",
750
- configFile,
751
- "--json",
752
- ...sgExcludeArgsForProject(dir),
753
- dir,
754
- ], {
755
- timeout,
756
- deadlineAt: options.deadlineAt,
757
- signal: options.signal,
758
- maxOutputBytes: MAX_SG_OUTPUT_BYTES,
759
- });
760
- return this.interpretScanResult(result, ["scan"]);
761
- }
762
- finally {
763
- if (sessionDir)
764
- this.cleanupTempScan(sessionDir);
765
- }
766
- }
767
- /** Backwards-compatible match-only wrapper for existing session scanners. */
768
- async tempScanAsync(dir, ruleId, ruleYaml, timeout = DEFAULT_EXEC_TIMEOUT_MS, options = {}) {
769
- const result = await this.tempScanDetailedAsync(dir, ruleId, ruleYaml, timeout, options);
770
- return result.matches;
771
- }
772
- /**
773
- * Run a rule scan with optional fix application.
774
- * Dry-run: --json (returns matches for preview).
775
- * Apply: --update-all (writes fixes defined in the YAML `fix:` field).
776
- */
777
- async tempScanWithFixAsync(dir, ruleId, ruleYaml, applyFixes, timeout = DEFAULT_EXEC_TIMEOUT_MS, options = {}) {
778
- let sessionDir;
779
- try {
780
- ({ sessionDir } = this.prepareTempScan(ruleId, ruleYaml));
781
- const configFile = path.join(sessionDir, ".sgconfig.yml");
782
- const { cmd: sgCmd, args: sgPre } = getSgCommand();
783
- const scanArgs = [
784
- ...sgPre,
785
- "scan",
786
- "--config",
787
- configFile,
788
- "--json",
789
- ...sgExcludeArgsForProject(dir),
790
- dir,
791
- ];
792
- const spawnOptions = {
793
- timeout,
794
- deadlineAt: options.deadlineAt,
795
- signal: options.signal,
796
- maxOutputBytes: MAX_SG_OUTPUT_BYTES,
797
- };
798
- if (!applyFixes) {
799
- const result = await safeSpawnAsync(sgCmd, scanArgs, spawnOptions);
800
- const scan = this.interpretScanResult(result, ["scan"]);
801
- return scan.failure || scan.error
802
- ? { matches: [], error: scan.error }
803
- : { matches: scan.matches };
804
- }
805
- // Apply: capture matches BEFORE writing — once --update-all applies
806
- // the fix the rule no longer matches, so a post-apply json pass would
807
- // report zero even on a successful apply. Count first, then write.
808
- const jsonResult = await safeSpawnAsync(sgCmd, scanArgs, spawnOptions);
809
- const scan = this.interpretScanResult(jsonResult, ["scan"]);
810
- if (scan.failure || scan.error) {
811
- return { matches: [], error: scan.error };
812
- }
813
- const applyResult = await safeSpawnAsync(sgCmd, [
814
- ...sgPre,
815
- "scan",
816
- "--config",
817
- configFile,
818
- "--update-all",
819
- ...sgExcludeArgsForProject(dir),
820
- dir,
821
- ], spawnOptions);
822
- if (applyResult.error ||
823
- applyResult.failure ||
824
- applyResult.status !== 0) {
825
- return {
826
- matches: [],
827
- error: applyResult.error?.message ||
828
- `ast-grep apply failed with exit code ${applyResult.status}`,
829
- };
830
- }
831
- return { matches: scan.matches };
832
- }
833
- catch (err) {
834
- return { matches: [], error: String(err) };
835
- }
836
- finally {
837
- if (sessionDir)
838
- this.cleanupTempScan(sessionDir);
839
- }
840
- }
841
- /**
842
- * Format matches for display
843
- */
844
- formatMatches(matches, isDryRun = false, maxItems = 50, showModeIndicator = false) {
845
- if (matches.length === 0) {
846
- if (showModeIndicator) {
847
- return isDryRun
848
- ? "[DRY-RUN] No matches found."
849
- : "[NOT APPLIED] No matches found — nothing was changed. Run ast_grep_search to confirm the pattern matches before applying.";
850
- }
851
- return "No matches found";
852
- }
853
- const shown = matches.slice(0, maxItems);
854
- const lines = shown.map((m) => {
855
- const loc = `${m.file}:${m.range.start.line + 1}:${m.range.start.column + 1}`;
856
- const text = m.text.length > 100 ? `${m.text.slice(0, 100)}...` : m.text;
857
- const langSuffix = m.language ? ` [${m.language}]` : "";
858
- const base = isDryRun && m.replacement
859
- ? `${loc}\n - ${text}\n + ${m.replacement}`
860
- : `${loc}: ${text}${langSuffix}`;
861
- const captures = formatMetaVarCaptures(m.metaVariables);
862
- return captures ? `${base}\n${captures}` : base;
863
- });
864
- if (matches.length > maxItems) {
865
- lines.unshift(`Found ${matches.length} matches (showing first ${maxItems}):`);
866
- }
867
- if (showModeIndicator) {
868
- const prefix = isDryRun ? "[DRY-RUN]" : "[APPLIED]";
869
- const suffix = isDryRun
870
- ? "\n\n(Dry run — use apply=true to apply changes)"
871
- : "";
872
- return `${prefix} ${matches.length} replacement(s):\n\n${lines.join("\n")}${suffix}`;
873
- }
874
- return lines.join("\n");
875
- }
876
- }