@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.
- package/README.md +16 -12
- package/THIRD_PARTY_NOTICES.md +3 -3
- package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-audit.md +2 -2
- package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-debt.md +2 -2
- package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-gain.md +1 -1
- package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-help.md +1 -1
- package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-review.md +2 -2
- package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail.md +1 -1
- package/node_modules/@dietrichgebert/ponytail/.opencode/plugins/index.js +4 -0
- package/node_modules/@dietrichgebert/ponytail/.opencode/plugins/ponytail-frontmatter.cjs +43 -3
- package/node_modules/@dietrichgebert/ponytail/.opencode/plugins/ponytail.mjs +142 -59
- package/node_modules/@dietrichgebert/ponytail/.qoder/rules/ponytail.md +21 -21
- package/node_modules/@dietrichgebert/ponytail/.qoder-plugin/plugin.json +1 -1
- package/node_modules/@dietrichgebert/ponytail/AGENTS.md +21 -21
- package/node_modules/@dietrichgebert/ponytail/README.md +52 -242
- package/node_modules/@dietrichgebert/ponytail/hooks/claude-codex-hooks.json +3 -3
- package/node_modules/@dietrichgebert/ponytail/hooks/copilot-hooks.json +4 -4
- package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-activate.js +70 -16
- package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-config.js +8 -7
- package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-instructions.js +30 -30
- package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-map.js +103 -0
- package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-mode-tracker.js +46 -23
- package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-runtime.js +39 -7
- package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-subagent.js +20 -3
- package/node_modules/@dietrichgebert/ponytail/hooks/qoder-hooks.json +3 -3
- package/node_modules/@dietrichgebert/ponytail/package.json +3 -3
- package/node_modules/@dietrichgebert/ponytail/pi-extension/index.js +47 -17
- package/node_modules/@dietrichgebert/ponytail/scripts/uninstall.js +21 -7
- package/node_modules/@dietrichgebert/ponytail/skills/plugin.json +5 -0
- package/node_modules/@dietrichgebert/ponytail/skills/ponytail/SKILL.md +33 -101
- package/node_modules/@dietrichgebert/ponytail/skills/ponytail-audit/SKILL.md +89 -27
- package/node_modules/@dietrichgebert/ponytail/skills/ponytail-debt/SKILL.md +13 -12
- package/node_modules/@dietrichgebert/ponytail/skills/ponytail-gain/SKILL.md +21 -18
- package/node_modules/@dietrichgebert/ponytail/skills/ponytail-help/SKILL.md +12 -13
- package/node_modules/@dietrichgebert/ponytail/skills/ponytail-review/SKILL.md +96 -52
- package/node_modules/@herbertgao/pi-agency/LICENSE +21 -0
- package/node_modules/@herbertgao/pi-agency/README.md +40 -0
- package/node_modules/@herbertgao/pi-agency/package.json +53 -0
- package/node_modules/@herbertgao/pi-agency/src/index.ts +441 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/compact-thinking.ts +12 -12
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/compact-mode.ts +30 -6
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/default-mode.ts +15 -9
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/interaction.ts +27 -9
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/codemode.ts +4 -1
- package/node_modules/@herbertgao/pi-cc-extensions/package.json +2 -2
- package/node_modules/@narumitw/pi-caffeinate/package.json +4 -4
- package/node_modules/@tifan/pi-mermaid-open/package.json +5 -1
- package/node_modules/@tifan/pi-mermaid-open/src/index.ts +26 -9
- package/node_modules/@tifan/pi-recap/package.json +1 -1
- package/node_modules/@tifan/pi-recap/src/index.ts +104 -20
- package/node_modules/@tifan/pi-recap/src/models.ts +46 -4
- package/node_modules/pi-antigravity/README.md +23 -2
- package/node_modules/pi-antigravity/package.json +5 -3
- package/node_modules/pi-antigravity/src/diagnostics/diagnostics.ts +3 -2
- package/node_modules/pi-antigravity/src/features/generate-image.ts +72 -0
- package/node_modules/pi-antigravity/src/features/google-search.ts +71 -0
- package/node_modules/pi-antigravity/src/image/image.ts +86 -47
- package/node_modules/pi-antigravity/src/image/native.ts +69 -0
- package/node_modules/pi-antigravity/src/index.ts +52 -137
- package/node_modules/pi-antigravity/src/search/search.ts +130 -31
- package/node_modules/pi-antigravity/src/stream/stream.ts +162 -113
- package/node_modules/pi-antigravity/src/types/enums.ts +1 -0
- package/node_modules/pi-antigravity/src/types/types.ts +1 -1
- package/node_modules/pi-antigravity/src/utils/security.ts +47 -1
- package/node_modules/pi-antigravity/src/utils/util.ts +38 -6
- package/node_modules/pi-lens/CHANGELOG.md +1064 -0
- package/node_modules/pi-lens/README.md +115 -25
- package/node_modules/pi-lens/config/dependency-cruiser-eager-allowlist.json +6 -2
- package/node_modules/pi-lens/dist/chunk-22AVIGXS.js +560 -0
- package/node_modules/pi-lens/dist/chunk-27BBHSZC.js +106 -0
- package/node_modules/pi-lens/dist/chunk-2BEMIWEW.js +51 -0
- package/node_modules/pi-lens/dist/chunk-2EECBNC5.js +89 -0
- package/node_modules/pi-lens/dist/chunk-34U7PLGE.js +23 -0
- package/node_modules/pi-lens/dist/chunk-3I5QFT3N.js +181 -0
- package/node_modules/pi-lens/dist/chunk-3MED75HT.js +37 -0
- package/node_modules/pi-lens/dist/chunk-47D2BO4S.js +87 -0
- package/node_modules/pi-lens/dist/chunk-4RERDEXR.js +348 -0
- package/node_modules/pi-lens/dist/chunk-4W2PLC4J.js +27 -0
- package/node_modules/pi-lens/dist/chunk-52H5B5TC.js +202 -0
- package/node_modules/pi-lens/dist/chunk-54B42YRX.js +27 -0
- package/node_modules/pi-lens/dist/chunk-5RXBNSW2.js +266 -0
- package/node_modules/pi-lens/dist/chunk-5THXD6X5.js +201 -0
- package/node_modules/pi-lens/dist/chunk-5W3R6LFT.js +24 -0
- package/node_modules/pi-lens/dist/chunk-5ZEJHV35.js +341 -0
- package/node_modules/pi-lens/dist/chunk-6P62QVEA.js +118 -0
- package/node_modules/pi-lens/dist/chunk-6QIUX4EP.js +459 -0
- package/node_modules/pi-lens/dist/chunk-6VCD4VKZ.js +78 -0
- package/node_modules/pi-lens/dist/chunk-7F72PXY2.js +326 -0
- package/node_modules/pi-lens/dist/chunk-7FBF7NPR.js +998 -0
- package/node_modules/pi-lens/dist/chunk-7U2IDNXN.js +37 -0
- package/node_modules/pi-lens/dist/chunk-ABBOA7UD.js +157 -0
- package/node_modules/pi-lens/dist/chunk-AHDW3GPE.js +50 -0
- package/node_modules/pi-lens/dist/chunk-AJ3QXTRQ.js +756 -0
- package/node_modules/pi-lens/dist/chunk-AJVLWNFN.js +1610 -0
- package/node_modules/pi-lens/dist/chunk-AJXODZY6.js +112 -0
- package/node_modules/pi-lens/dist/chunk-ARFCXG7S.js +84 -0
- package/node_modules/pi-lens/dist/chunk-AS44CFQ4.js +708 -0
- package/node_modules/pi-lens/dist/chunk-AWE5TMPO.js +38 -0
- package/node_modules/pi-lens/dist/chunk-B3I2UUT4.js +4692 -0
- package/node_modules/pi-lens/dist/chunk-BRJKOBZP.js +331 -0
- package/node_modules/pi-lens/dist/chunk-BW5KFIQC.js +59 -0
- package/node_modules/pi-lens/dist/chunk-C2AUYXQH.js +149 -0
- package/node_modules/pi-lens/dist/chunk-CGGAIP7J.js +29 -0
- package/node_modules/pi-lens/dist/chunk-D6QS3U6M.js +30 -0
- package/node_modules/pi-lens/dist/chunk-DFVMIKMQ.js +349 -0
- package/node_modules/pi-lens/dist/chunk-DIULIWKU.js +169 -0
- package/node_modules/pi-lens/dist/chunk-DQ2NZ7C4.js +2317 -0
- package/node_modules/pi-lens/dist/chunk-E2WFBRHM.js +213 -0
- package/node_modules/pi-lens/dist/chunk-E4MAEDPM.js +50 -0
- package/node_modules/pi-lens/dist/chunk-EOKRQ3SA.js +30 -0
- package/node_modules/pi-lens/dist/chunk-F3AU2TMM.js +2626 -0
- package/node_modules/pi-lens/dist/chunk-F3P7VQ7H.js +170 -0
- package/node_modules/pi-lens/dist/chunk-FC4RP4I2.js +12 -0
- package/node_modules/pi-lens/dist/chunk-FJNKANOS.js +32 -0
- package/node_modules/pi-lens/dist/chunk-GUOGVTCQ.js +146 -0
- package/node_modules/pi-lens/dist/chunk-GVXA6CCE.js +18 -0
- package/node_modules/pi-lens/dist/chunk-HHYAELLJ.js +2334 -0
- package/node_modules/pi-lens/dist/chunk-HMFXILPV.js +83 -0
- package/node_modules/pi-lens/dist/chunk-HVUZXSWK.js +421 -0
- package/node_modules/pi-lens/dist/chunk-HWBZIGMJ.js +62 -0
- package/node_modules/pi-lens/dist/chunk-I3R7GKDR.js +17 -0
- package/node_modules/pi-lens/dist/chunk-I7SPGOWI.js +55 -0
- package/node_modules/pi-lens/dist/chunk-IIXOAGHR.js +38 -0
- package/node_modules/pi-lens/dist/chunk-IVP5KAB7.js +2250 -0
- package/node_modules/pi-lens/dist/chunk-IXEBJSUE.js +22 -0
- package/node_modules/pi-lens/dist/chunk-JOLITGCC.js +27 -0
- package/node_modules/pi-lens/dist/chunk-K6VYLB2U.js +145 -0
- package/node_modules/pi-lens/dist/chunk-LJDODBBZ.js +78 -0
- package/node_modules/pi-lens/dist/chunk-LNAKEO63.js +78 -0
- package/node_modules/pi-lens/dist/chunk-LSMJ6KBE.js +4139 -0
- package/node_modules/pi-lens/dist/chunk-LW6XKDZQ.js +5565 -0
- package/node_modules/pi-lens/dist/chunk-N3YQJI6O.js +899 -0
- package/node_modules/pi-lens/dist/chunk-NABLC7W3.js +148 -0
- package/node_modules/pi-lens/dist/chunk-NKOUFPQF.js +659 -0
- package/node_modules/pi-lens/dist/chunk-NL5GLMFI.js +211 -0
- package/node_modules/pi-lens/dist/chunk-NMABWBZN.js +327 -0
- package/node_modules/pi-lens/dist/chunk-NTHH2J74.js +27 -0
- package/node_modules/pi-lens/dist/chunk-NTUJEGDZ.js +59 -0
- package/node_modules/pi-lens/dist/chunk-NXL4FFQQ.js +47 -0
- package/node_modules/pi-lens/dist/chunk-NXPS2L6U.js +466 -0
- package/node_modules/pi-lens/dist/chunk-O5WILGMI.js +42 -0
- package/node_modules/pi-lens/dist/chunk-O6TQT6RI.js +48 -0
- package/node_modules/pi-lens/dist/chunk-OAXNDZJ7.js +323 -0
- package/node_modules/pi-lens/dist/chunk-ODEEOXPH.js +44 -0
- package/node_modules/pi-lens/dist/chunk-OQGFCZJ4.js +4533 -0
- package/node_modules/pi-lens/dist/chunk-ORTMY4Q4.js +282 -0
- package/node_modules/pi-lens/dist/chunk-OS32RNR2.js +442 -0
- package/node_modules/pi-lens/dist/chunk-PAK6IDME.js +189 -0
- package/node_modules/pi-lens/dist/chunk-PWFHBTSF.js +406 -0
- package/node_modules/pi-lens/dist/chunk-Q5U6FMDI.js +2352 -0
- package/node_modules/pi-lens/dist/chunk-QOZXJ4NA.js +3364 -0
- package/node_modules/pi-lens/dist/chunk-QYF5S6P6.js +45 -0
- package/node_modules/pi-lens/dist/chunk-RIISMHKN.js +36 -0
- package/node_modules/pi-lens/dist/chunk-RPD4ZSB7.js +25 -0
- package/node_modules/pi-lens/dist/chunk-RPD5K5NC.js +79 -0
- package/node_modules/pi-lens/dist/chunk-RUOG5D2C.js +262 -0
- package/node_modules/pi-lens/dist/chunk-T4ERT73Y.js +599 -0
- package/node_modules/pi-lens/dist/chunk-T6D4Q4AQ.js +54 -0
- package/node_modules/pi-lens/dist/chunk-TGPXLY2J.js +391 -0
- package/node_modules/pi-lens/dist/chunk-TLGFBM3F.js +12116 -0
- package/node_modules/pi-lens/dist/chunk-TO6WL3GM.js +88 -0
- package/node_modules/pi-lens/dist/chunk-TT22N74J.js +517 -0
- package/node_modules/pi-lens/dist/chunk-TVN5N6GY.js +21216 -0
- package/node_modules/pi-lens/dist/chunk-U3VGR4VU.js +308 -0
- package/node_modules/pi-lens/dist/chunk-UK3CMEAL.js +1250 -0
- package/node_modules/pi-lens/dist/chunk-UOPVJQ4N.js +103 -0
- package/node_modules/pi-lens/dist/chunk-UXVNL3D7.js +23 -0
- package/node_modules/pi-lens/dist/chunk-UY752QSN.js +45 -0
- package/node_modules/pi-lens/dist/chunk-V5PXFSZK.js +188 -0
- package/node_modules/pi-lens/dist/chunk-V7R425XG.js +398 -0
- package/node_modules/pi-lens/dist/chunk-VCSRSYLF.js +81 -0
- package/node_modules/pi-lens/dist/chunk-VD4JQCQC.js +162 -0
- package/node_modules/pi-lens/dist/chunk-VDBPVIKD.js +62 -0
- package/node_modules/pi-lens/dist/chunk-VHQLPIRJ.js +114 -0
- package/node_modules/pi-lens/dist/chunk-VN2AXLEX.js +5414 -0
- package/node_modules/pi-lens/dist/chunk-VNMT7C64.js +478 -0
- package/node_modules/pi-lens/dist/chunk-WONERJTP.js +309 -0
- package/node_modules/pi-lens/dist/chunk-XECLWQZN.js +85 -0
- package/node_modules/pi-lens/dist/chunk-XIMYZ3JA.js +27 -0
- package/node_modules/pi-lens/dist/chunk-XK4CIILI.js +144 -0
- package/node_modules/pi-lens/dist/chunk-Y4T27COV.js +562 -0
- package/node_modules/pi-lens/dist/chunk-YGVYKNSN.js +1860 -0
- package/node_modules/pi-lens/dist/chunk-YLF3PPT5.js +308 -0
- package/node_modules/pi-lens/dist/chunk-YSNFMJKN.js +14 -0
- package/node_modules/pi-lens/dist/chunk-Z3CCVDUB.js +76 -0
- package/node_modules/pi-lens/dist/chunk-Z54ZSOBZ.js +61 -0
- package/node_modules/pi-lens/dist/chunk-ZAWW3AF6.js +97 -0
- package/node_modules/pi-lens/dist/chunk-ZMOL6RQC.js +167 -0
- package/node_modules/pi-lens/dist/index.js +16456 -8335
- package/node_modules/pi-lens/dist/mcp/analyze-cli.js +186 -232
- package/node_modules/pi-lens/dist/mcp/cli.js +137 -98
- package/node_modules/pi-lens/dist/mcp/server.js +22589 -1573
- package/node_modules/pi-lens/dist/mcp/worker.js +97 -38
- package/node_modules/pi-lens/dist/probes/installer.js +135 -0
- package/node_modules/pi-lens/dist/workers/project-snapshot-persist-worker.js +22 -0
- package/node_modules/pi-lens/dist/workers/review-graph-persist-worker.js +15 -0
- package/node_modules/pi-lens/docs/agent-guide.md +13 -4
- package/node_modules/pi-lens/docs/agent-tools.md +42 -0
- package/node_modules/pi-lens/docs/ast-grep_rules_catalog.md +3 -2
- package/node_modules/pi-lens/docs/configuration.md +20 -1
- package/node_modules/pi-lens/docs/environment-variables.md +52 -2
- package/node_modules/pi-lens/docs/features.md +8 -4
- package/node_modules/pi-lens/docs/globalconfig.md +1 -0
- package/node_modules/pi-lens/docs/io-bridge-v2-migration.md +94 -0
- package/node_modules/pi-lens/docs/lsp-capability-matrix.md +36 -4
- package/node_modules/pi-lens/docs/lsp-idle-eviction.md +124 -0
- package/node_modules/pi-lens/docs/mcp.md +21 -5
- package/node_modules/pi-lens/docs/merge-queue-rollout.md +77 -0
- package/node_modules/pi-lens/docs/pi-lens-fixer.md +156 -88
- package/node_modules/pi-lens/docs/pi-lens-investigator.md +74 -26
- package/node_modules/pi-lens/docs/pi-lens-merge-policy.md +694 -0
- package/node_modules/pi-lens/docs/pi-lens-monitor.md +73 -7
- package/node_modules/pi-lens/docs/pi-lens-retro.md +6 -4
- package/node_modules/pi-lens/docs/pi-lens-reviewer.md +188 -48
- package/node_modules/pi-lens/docs/pi-lens-subagent.md +246 -45
- package/node_modules/pi-lens/docs/pi-lens-warden.md +18 -7
- package/node_modules/pi-lens/docs/public-api-stability.md +55 -0
- package/node_modules/pi-lens/docs/release-qa-baseline.md +84 -17
- package/node_modules/pi-lens/docs/rfcs/3654-unified-io-bridge-v2.md +316 -0
- package/node_modules/pi-lens/docs/servercapabilities.md +53 -49
- package/node_modules/pi-lens/docs/settings.md +1 -0
- package/node_modules/pi-lens/docs/usage.md +5 -1
- package/node_modules/pi-lens/grammars/tree-sitter-bash.wasm +0 -0
- package/node_modules/pi-lens/grammars/tree-sitter-bash.wasm.json +3 -3
- package/node_modules/pi-lens/package.json +18 -6
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/advisory-registry-subset-test.yml +41 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/advisory-registry-subset.yml +50 -0
- package/node_modules/pi-lens/scripts/analyze-pi-lens-logs.mjs +1275 -62
- package/node_modules/pi-lens/scripts/download-grammars.js +5 -0
- package/node_modules/pi-lens/scripts/grammars.lock.json +6 -1
- package/node_modules/pi-lens/scripts/install-selftest.mjs +33 -34
- package/node_modules/pi-lens/scripts/lib/host-provided-deps.mjs +13 -4
- package/node_modules/pi-lens/scripts/lib/web-tree-sitter-dir.mjs +18 -0
- package/node_modules/pi-typesafe/README.md +1 -1
- package/node_modules/pi-typesafe/dist/backends.d.ts +15 -5
- package/node_modules/pi-typesafe/dist/backends.js +18 -0
- package/node_modules/pi-typesafe/dist/client.d.ts +4 -3
- package/node_modules/pi-typesafe/dist/client.js +22 -7
- package/node_modules/pi-typesafe/dist/index.d.ts +2 -2
- package/node_modules/pi-typesafe/dist/index.js +1 -1
- package/node_modules/pi-typesafe/dist/usage.d.ts +14 -4
- package/node_modules/pi-typesafe/dist/usage.js +147 -42
- package/node_modules/pi-typesafe/package.json +1 -1
- package/node_modules/pi-web-access/CHANGELOG.md +48 -0
- package/node_modules/pi-web-access/README.md +57 -11
- package/node_modules/pi-web-access/brave-rate-limit.ts +8 -2
- package/node_modules/pi-web-access/curator-page.ts +5 -1
- package/node_modules/pi-web-access/curator-server.ts +2 -0
- package/node_modules/pi-web-access/declared-web-links.ts +2 -2
- package/node_modules/pi-web-access/degoog.ts +323 -0
- package/node_modules/pi-web-access/dist/index.js +3483 -2745
- package/node_modules/pi-web-access/dist/mcp-cli.js +27443 -0
- package/node_modules/pi-web-access/exa.ts +5 -1
- package/node_modules/pi-web-access/extract.ts +41 -3
- package/node_modules/pi-web-access/firecrawl.ts +35 -4
- package/node_modules/pi-web-access/gemini-search.ts +34 -11
- package/node_modules/pi-web-access/gemini-web.ts +14 -9
- package/node_modules/pi-web-access/index.ts +153 -1202
- package/node_modules/pi-web-access/keenable.ts +221 -0
- package/node_modules/pi-web-access/mcp-cli.ts +40 -0
- package/node_modules/pi-web-access/mcp-server.ts +81 -0
- package/node_modules/pi-web-access/mcp-tool-definitions.ts +117 -0
- package/node_modules/pi-web-access/openai-search.ts +34 -1
- package/node_modules/pi-web-access/package.json +23 -5
- package/node_modules/pi-web-access/perplexity.ts +64 -56
- package/node_modules/pi-web-access/tool-arguments.ts +20 -0
- package/node_modules/pi-web-access/video-extract.ts +1 -1
- package/node_modules/pi-web-access/web-tool-contract.ts +86 -0
- package/node_modules/pi-web-access/web-tool-core.ts +1502 -0
- package/node_modules/pi-web-access/youtube-extract.ts +2 -5
- package/package.json +17 -12
- package/node_modules/@dietrichgebert/ponytail/README.es.md +0 -329
- package/node_modules/@dietrichgebert/ponytail/README.ko.md +0 -346
- package/node_modules/@dietrichgebert/ponytail/assets/benchmark-3model.svg +0 -21
- package/node_modules/@dietrichgebert/ponytail/assets/benchmark-agentic.svg +0 -62
- package/node_modules/@dietrichgebert/ponytail/assets/logo-dark.png +0 -0
- package/node_modules/@dietrichgebert/ponytail/assets/logo-dark.svg +0 -115
- package/node_modules/@dietrichgebert/ponytail/assets/logo-greenpt-dark.svg +0 -27
- package/node_modules/@dietrichgebert/ponytail/assets/logo-greenpt.svg +0 -27
- package/node_modules/@dietrichgebert/ponytail/assets/logo.png +0 -0
- package/node_modules/@dietrichgebert/ponytail/assets/retriever-icon.png +0 -0
- package/node_modules/@dietrichgebert/ponytail/assets/retriever-logo-dark.svg +0 -4
- package/node_modules/@dietrichgebert/ponytail/assets/retriever-logo-light.svg +0 -4
- package/node_modules/@dietrichgebert/ponytail/assets/social-preview.png +0 -0
- package/node_modules/@dietrichgebert/ponytail/assets/waitlist-banner-es.png +0 -0
- package/node_modules/@dietrichgebert/ponytail/assets/waitlist-banner-ko.png +0 -0
- package/node_modules/@dietrichgebert/ponytail/assets/waitlist-banner.png +0 -0
- package/node_modules/pi-lens/dist/clients/actionable-warnings-logger.js +0 -35
- package/node_modules/pi-lens/dist/clients/actionable-warnings.js +0 -1610
- package/node_modules/pi-lens/dist/clients/advisory-provenance.js +0 -593
- package/node_modules/pi-lens/dist/clients/agent-behavior-client.js +0 -147
- package/node_modules/pi-lens/dist/clients/agent-nudge.js +0 -325
- package/node_modules/pi-lens/dist/clients/analysed-root.js +0 -1
- package/node_modules/pi-lens/dist/clients/ast-grep-client.js +0 -731
- package/node_modules/pi-lens/dist/clients/ast-grep-rule-manager.js +0 -146
- package/node_modules/pi-lens/dist/clients/ast-grep-tool-logger.js +0 -118
- package/node_modules/pi-lens/dist/clients/ast-grep-types.js +0 -10
- package/node_modules/pi-lens/dist/clients/ast-grep-yaml-synth.js +0 -154
- package/node_modules/pi-lens/dist/clients/atomic-write-staging.js +0 -75
- package/node_modules/pi-lens/dist/clients/atomic-write.js +0 -189
- package/node_modules/pi-lens/dist/clients/availability-probe-flight.js +0 -12
- package/node_modules/pi-lens/dist/clients/bash-file-access.js +0 -1056
- package/node_modules/pi-lens/dist/clients/biome-client.js +0 -357
- package/node_modules/pi-lens/dist/clients/blocker-freshness.js +0 -837
- package/node_modules/pi-lens/dist/clients/blocker-past-eof.js +0 -129
- package/node_modules/pi-lens/dist/clients/bootstrap.js +0 -569
- package/node_modules/pi-lens/dist/clients/bounded-cache.js +0 -190
- package/node_modules/pi-lens/dist/clients/bounded-pid-file-lock.js +0 -202
- package/node_modules/pi-lens/dist/clients/bounded-telemetry.js +0 -295
- package/node_modules/pi-lens/dist/clients/build-identity.js +0 -95
- package/node_modules/pi-lens/dist/clients/bundled-resource-health.js +0 -113
- package/node_modules/pi-lens/dist/clients/bus-events-logger.js +0 -105
- package/node_modules/pi-lens/dist/clients/bus-publish.js +0 -171
- package/node_modules/pi-lens/dist/clients/cache/rule-cache.js +0 -190
- package/node_modules/pi-lens/dist/clients/cache-manager.js +0 -524
- package/node_modules/pi-lens/dist/clients/cache-observability.js +0 -1313
- package/node_modules/pi-lens/dist/clients/call-graph.js +0 -852
- package/node_modules/pi-lens/dist/clients/cargo-manifest.js +0 -422
- package/node_modules/pi-lens/dist/clients/cascade-budget.js +0 -196
- package/node_modules/pi-lens/dist/clients/cascade-format.js +0 -315
- package/node_modules/pi-lens/dist/clients/cascade-logger.js +0 -31
- package/node_modules/pi-lens/dist/clients/cascade-types.js +0 -9
- package/node_modules/pi-lens/dist/clients/child-unref.js +0 -124
- package/node_modules/pi-lens/dist/clients/code-quality-warnings.js +0 -286
- package/node_modules/pi-lens/dist/clients/codebase-model.js +0 -173
- package/node_modules/pi-lens/dist/clients/collateral-test-role.js +0 -40
- package/node_modules/pi-lens/dist/clients/complexity-client.js +0 -462
- package/node_modules/pi-lens/dist/clients/config-core/deny.js +0 -221
- package/node_modules/pi-lens/dist/clients/config-core/index.js +0 -50
- package/node_modules/pi-lens/dist/clients/config-core/merge.js +0 -357
- package/node_modules/pi-lens/dist/clients/config-core/normalize.js +0 -340
- package/node_modules/pi-lens/dist/clients/config-core/process-spec.js +0 -248
- package/node_modules/pi-lens/dist/clients/config-core/provenance.js +0 -164
- package/node_modules/pi-lens/dist/clients/config-core/records.js +0 -218
- package/node_modules/pi-lens/dist/clients/config-core/resolve.js +0 -125
- package/node_modules/pi-lens/dist/clients/config-core/safe-object.js +0 -78
- package/node_modules/pi-lens/dist/clients/config-core/schema.js +0 -165
- package/node_modules/pi-lens/dist/clients/config-diagnostic-codes.js +0 -285
- package/node_modules/pi-lens/dist/clients/config-locations.js +0 -388
- package/node_modules/pi-lens/dist/clients/config-resolve.js +0 -798
- package/node_modules/pi-lens/dist/clients/config-schema.js +0 -251
- package/node_modules/pi-lens/dist/clients/config-warn.js +0 -407
- package/node_modules/pi-lens/dist/clients/console-guard-install.js +0 -26
- package/node_modules/pi-lens/dist/clients/cooperative-budget.js +0 -42
- package/node_modules/pi-lens/dist/clients/dead-code-client.js +0 -510
- package/node_modules/pi-lens/dist/clients/dead-code-logger.js +0 -30
- package/node_modules/pi-lens/dist/clients/deadline-utils.js +0 -280
- package/node_modules/pi-lens/dist/clients/debug-handles.js +0 -211
- package/node_modules/pi-lens/dist/clients/debug-heap.js +0 -174
- package/node_modules/pi-lens/dist/clients/deferred-lsp-work.js +0 -106
- package/node_modules/pi-lens/dist/clients/degradation-ledger.js +0 -426
- package/node_modules/pi-lens/dist/clients/demoted-finding-render.js +0 -169
- package/node_modules/pi-lens/dist/clients/dependency-checker.js +0 -885
- package/node_modules/pi-lens/dist/clients/deps/ast-grep-napi.js +0 -22
- package/node_modules/pi-lens/dist/clients/deps/js-yaml.js +0 -9
- package/node_modules/pi-lens/dist/clients/deps/minimatch.js +0 -4
- package/node_modules/pi-lens/dist/clients/deps/pi-tui.js +0 -14
- package/node_modules/pi-lens/dist/clients/deps/typebox.js +0 -14
- package/node_modules/pi-lens/dist/clients/deps/vscode-jsonrpc.js +0 -1
- package/node_modules/pi-lens/dist/clients/deps/web-tree-sitter.js +0 -24
- package/node_modules/pi-lens/dist/clients/diagnostic-dispositions.js +0 -630
- package/node_modules/pi-lens/dist/clients/diagnostic-line-freshness.js +0 -305
- package/node_modules/pi-lens/dist/clients/diagnostic-logger.js +0 -73
- package/node_modules/pi-lens/dist/clients/diagnostic-tracker.js +0 -105
- package/node_modules/pi-lens/dist/clients/diagnostics-publish.js +0 -230
- package/node_modules/pi-lens/dist/clients/dispatch/ast-grep-catalog.js +0 -65
- package/node_modules/pi-lens/dist/clients/dispatch/auxiliary-lsp.js +0 -343
- package/node_modules/pi-lens/dist/clients/dispatch/collect-later-tier.js +0 -35
- package/node_modules/pi-lens/dist/clients/dispatch/diagnostic-taxonomy.js +0 -66
- package/node_modules/pi-lens/dist/clients/dispatch/dispatcher.js +0 -1269
- package/node_modules/pi-lens/dist/clients/dispatch/fact-provider-types.js +0 -1
- package/node_modules/pi-lens/dist/clients/dispatch/fact-rule-runner.js +0 -17
- package/node_modules/pi-lens/dist/clients/dispatch/fact-runner.js +0 -30
- package/node_modules/pi-lens/dist/clients/dispatch/fact-scheduler.js +0 -68
- package/node_modules/pi-lens/dist/clients/dispatch/fact-store.js +0 -377
- package/node_modules/pi-lens/dist/clients/dispatch/facts/comment-facts.js +0 -22
- package/node_modules/pi-lens/dist/clients/dispatch/facts/file-content.js +0 -19
- package/node_modules/pi-lens/dist/clients/dispatch/facts/function-facts.js +0 -348
- package/node_modules/pi-lens/dist/clients/dispatch/facts/import-facts.js +0 -204
- package/node_modules/pi-lens/dist/clients/dispatch/facts/tree-sitter-facts.js +0 -34
- package/node_modules/pi-lens/dist/clients/dispatch/facts/try-catch-facts.js +0 -119
- package/node_modules/pi-lens/dist/clients/dispatch/finding-policy.js +0 -339
- package/node_modules/pi-lens/dist/clients/dispatch/indent-detect.js +0 -417
- package/node_modules/pi-lens/dist/clients/dispatch/inline-suppressions.js +0 -89
- package/node_modules/pi-lens/dist/clients/dispatch/integration.js +0 -2377
- package/node_modules/pi-lens/dist/clients/dispatch/lazy.js +0 -11
- package/node_modules/pi-lens/dist/clients/dispatch/pending-runner-findings.js +0 -87
- package/node_modules/pi-lens/dist/clients/dispatch/plan.js +0 -278
- package/node_modules/pi-lens/dist/clients/dispatch/priorities.js +0 -20
- package/node_modules/pi-lens/dist/clients/dispatch/rule-id-normalize.js +0 -50
- package/node_modules/pi-lens/dist/clients/dispatch/rule-ignores.js +0 -69
- package/node_modules/pi-lens/dist/clients/dispatch/rule-policy.js +0 -135
- package/node_modules/pi-lens/dist/clients/dispatch/rules/async-noise.js +0 -40
- package/node_modules/pi-lens/dist/clients/dispatch/rules/async-unnecessary-wrapper.js +0 -27
- package/node_modules/pi-lens/dist/clients/dispatch/rules/cors-wildcard.js +0 -54
- package/node_modules/pi-lens/dist/clients/dispatch/rules/error-obscuring.js +0 -32
- package/node_modules/pi-lens/dist/clients/dispatch/rules/error-swallowing.js +0 -31
- package/node_modules/pi-lens/dist/clients/dispatch/rules/framework-call-noise.js +0 -67
- package/node_modules/pi-lens/dist/clients/dispatch/rules/high-complexity.js +0 -72
- package/node_modules/pi-lens/dist/clients/dispatch/rules/high-fan-out.js +0 -74
- package/node_modules/pi-lens/dist/clients/dispatch/rules/high-import-coupling.js +0 -37
- package/node_modules/pi-lens/dist/clients/dispatch/rules/missing-error-propagation.js +0 -62
- package/node_modules/pi-lens/dist/clients/dispatch/rules/no-commented-credentials.js +0 -52
- package/node_modules/pi-lens/dist/clients/dispatch/rules/pass-through-wrappers.js +0 -42
- package/node_modules/pi-lens/dist/clients/dispatch/rules/placeholder-comments.js +0 -40
- package/node_modules/pi-lens/dist/clients/dispatch/rules/unsafe-boundary.js +0 -126
- package/node_modules/pi-lens/dist/clients/dispatch/runner-context.js +0 -52
- package/node_modules/pi-lens/dist/clients/dispatch/runners/actionlint.js +0 -111
- package/node_modules/pi-lens/dist/clients/dispatch/runners/ast-grep-napi.js +0 -1196
- package/node_modules/pi-lens/dist/clients/dispatch/runners/biome-check.js +0 -296
- package/node_modules/pi-lens/dist/clients/dispatch/runners/cpp-check.js +0 -219
- package/node_modules/pi-lens/dist/clients/dispatch/runners/credo.js +0 -82
- package/node_modules/pi-lens/dist/clients/dispatch/runners/cue-vet.js +0 -416
- package/node_modules/pi-lens/dist/clients/dispatch/runners/dart-analyze.js +0 -183
- package/node_modules/pi-lens/dist/clients/dispatch/runners/detekt.js +0 -176
- package/node_modules/pi-lens/dist/clients/dispatch/runners/dotnet-build.js +0 -164
- package/node_modules/pi-lens/dist/clients/dispatch/runners/elixir-check.js +0 -195
- package/node_modules/pi-lens/dist/clients/dispatch/runners/eslint.js +0 -137
- package/node_modules/pi-lens/dist/clients/dispatch/runners/fact-rules.js +0 -29
- package/node_modules/pi-lens/dist/clients/dispatch/runners/fish-indent.js +0 -69
- package/node_modules/pi-lens/dist/clients/dispatch/runners/gleam-check.js +0 -167
- package/node_modules/pi-lens/dist/clients/dispatch/runners/go-vet.js +0 -104
- package/node_modules/pi-lens/dist/clients/dispatch/runners/golangci-lint.js +0 -135
- package/node_modules/pi-lens/dist/clients/dispatch/runners/hadolint.js +0 -91
- package/node_modules/pi-lens/dist/clients/dispatch/runners/helm-lint.js +0 -171
- package/node_modules/pi-lens/dist/clients/dispatch/runners/helm-render.js +0 -940
- package/node_modules/pi-lens/dist/clients/dispatch/runners/htmlhint.js +0 -117
- package/node_modules/pi-lens/dist/clients/dispatch/runners/index.js +0 -108
- package/node_modules/pi-lens/dist/clients/dispatch/runners/javac.js +0 -99
- package/node_modules/pi-lens/dist/clients/dispatch/runners/ktlint.js +0 -110
- package/node_modules/pi-lens/dist/clients/dispatch/runners/lsp.js +0 -379
- package/node_modules/pi-lens/dist/clients/dispatch/runners/markdownlint.js +0 -167
- package/node_modules/pi-lens/dist/clients/dispatch/runners/mypy.js +0 -102
- package/node_modules/pi-lens/dist/clients/dispatch/runners/oxlint.js +0 -414
- package/node_modules/pi-lens/dist/clients/dispatch/runners/php-lint.js +0 -85
- package/node_modules/pi-lens/dist/clients/dispatch/runners/phpstan.js +0 -120
- package/node_modules/pi-lens/dist/clients/dispatch/runners/prisma-validate.js +0 -62
- package/node_modules/pi-lens/dist/clients/dispatch/runners/psscriptanalyzer.js +0 -445
- package/node_modules/pi-lens/dist/clients/dispatch/runners/pyright.js +0 -169
- package/node_modules/pi-lens/dist/clients/dispatch/runners/rubocop.js +0 -99
- package/node_modules/pi-lens/dist/clients/dispatch/runners/ruff.js +0 -88
- package/node_modules/pi-lens/dist/clients/dispatch/runners/rust-clippy.js +0 -256
- package/node_modules/pi-lens/dist/clients/dispatch/runners/shellcheck.js +0 -173
- package/node_modules/pi-lens/dist/clients/dispatch/runners/shfmt.js +0 -102
- package/node_modules/pi-lens/dist/clients/dispatch/runners/spellcheck.js +0 -128
- package/node_modules/pi-lens/dist/clients/dispatch/runners/spotbugs.js +0 -259
- package/node_modules/pi-lens/dist/clients/dispatch/runners/sqlfluff.js +0 -183
- package/node_modules/pi-lens/dist/clients/dispatch/runners/stylelint.js +0 -166
- package/node_modules/pi-lens/dist/clients/dispatch/runners/swiftlint.js +0 -163
- package/node_modules/pi-lens/dist/clients/dispatch/runners/taplo.js +0 -174
- package/node_modules/pi-lens/dist/clients/dispatch/runners/terragrunt.js +0 -168
- package/node_modules/pi-lens/dist/clients/dispatch/runners/tflint.js +0 -125
- package/node_modules/pi-lens/dist/clients/dispatch/runners/tree-sitter.js +0 -643
- package/node_modules/pi-lens/dist/clients/dispatch/runners/trivy-config.js +0 -253
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/availability-policy.js +0 -496
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/candidate-probe.js +0 -90
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/diagnostic-parsers.js +0 -95
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/lazy-installer.js +0 -274
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/runner-helpers.js +0 -1701
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/spawn-outcome.js +0 -101
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/tool-failure.js +0 -235
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/toolchain-availability.js +0 -169
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils.js +0 -15
- package/node_modules/pi-lens/dist/clients/dispatch/runners/vale.js +0 -128
- package/node_modules/pi-lens/dist/clients/dispatch/runners/yaml-rule-parser.js +0 -242
- package/node_modules/pi-lens/dist/clients/dispatch/runners/yamllint.js +0 -95
- package/node_modules/pi-lens/dist/clients/dispatch/runners/zig-check.js +0 -79
- package/node_modules/pi-lens/dist/clients/dispatch/suppress-writer.js +0 -79
- package/node_modules/pi-lens/dist/clients/dispatch/tool-profile.js +0 -30
- package/node_modules/pi-lens/dist/clients/dispatch/types.js +0 -21
- package/node_modules/pi-lens/dist/clients/dispatch/utils/format-utils.js +0 -45
- package/node_modules/pi-lens/dist/clients/dispatch/utils/lsp-diagnostics.js +0 -35
- package/node_modules/pi-lens/dist/clients/disposition-logger.js +0 -32
- package/node_modules/pi-lens/dist/clients/disposition-publish.js +0 -124
- package/node_modules/pi-lens/dist/clients/durable-store.js +0 -97
- package/node_modules/pi-lens/dist/clients/effective-config.js +0 -415
- package/node_modules/pi-lens/dist/clients/env-utils.js +0 -83
- package/node_modules/pi-lens/dist/clients/error-class.js +0 -23
- package/node_modules/pi-lens/dist/clients/eval-timestamp.js +0 -17
- package/node_modules/pi-lens/dist/clients/event-loop-hold.js +0 -274
- package/node_modules/pi-lens/dist/clients/event-loop-monitor.js +0 -250
- package/node_modules/pi-lens/dist/clients/extension-log.js +0 -504
- package/node_modules/pi-lens/dist/clients/extension-mode.js +0 -73
- package/node_modules/pi-lens/dist/clients/feature-hints.js +0 -103
- package/node_modules/pi-lens/dist/clients/file-kinds.js +0 -412
- package/node_modules/pi-lens/dist/clients/file-role.js +0 -134
- package/node_modules/pi-lens/dist/clients/file-time.js +0 -160
- package/node_modules/pi-lens/dist/clients/file-utils.js +0 -1032
- package/node_modules/pi-lens/dist/clients/finding-delivery-gate.js +0 -494
- package/node_modules/pi-lens/dist/clients/finding-identity.js +0 -88
- package/node_modules/pi-lens/dist/clients/fix-worklog.js +0 -103
- package/node_modules/pi-lens/dist/clients/format-events-publish.js +0 -343
- package/node_modules/pi-lens/dist/clients/format-service.js +0 -222
- package/node_modules/pi-lens/dist/clients/formatters-lazy.js +0 -9
- package/node_modules/pi-lens/dist/clients/formatters.js +0 -2032
- package/node_modules/pi-lens/dist/clients/freshness-cadence.js +0 -17
- package/node_modules/pi-lens/dist/clients/freshness.js +0 -38
- package/node_modules/pi-lens/dist/clients/generated-artifacts.js +0 -394
- package/node_modules/pi-lens/dist/clients/generation-guard.js +0 -215
- package/node_modules/pi-lens/dist/clients/git-guard.js +0 -1136
- package/node_modules/pi-lens/dist/clients/git-tracked-ignore.js +0 -243
- package/node_modules/pi-lens/dist/clients/gitleaks-client.js +0 -509
- package/node_modules/pi-lens/dist/clients/go-client.js +0 -104
- package/node_modules/pi-lens/dist/clients/govulncheck-client.js +0 -605
- package/node_modules/pi-lens/dist/clients/gradle-ktfmt-style.js +0 -348
- package/node_modules/pi-lens/dist/clients/grammar-source.js +0 -465
- package/node_modules/pi-lens/dist/clients/gzip-stage-write.js +0 -135
- package/node_modules/pi-lens/dist/clients/hashline-anchor.js +0 -424
- package/node_modules/pi-lens/dist/clients/hook-budgets.js +0 -76
- package/node_modules/pi-lens/dist/clients/host-edit-normalize.js +0 -140
- package/node_modules/pi-lens/dist/clients/host-ports.js +0 -39
- package/node_modules/pi-lens/dist/clients/indent-retarget.js +0 -154
- package/node_modules/pi-lens/dist/clients/inline-blocker-dispositions.js +0 -186
- package/node_modules/pi-lens/dist/clients/install-diagnostics.js +0 -156
- package/node_modules/pi-lens/dist/clients/installer/index.js +0 -5416
- package/node_modules/pi-lens/dist/clients/installer/managed-tool-refresh-session.js +0 -58
- package/node_modules/pi-lens/dist/clients/installer/managed-tool-refresh.js +0 -783
- package/node_modules/pi-lens/dist/clients/instance-reaper-state.js +0 -7
- package/node_modules/pi-lens/dist/clients/instance-reaper.js +0 -1137
- package/node_modules/pi-lens/dist/clients/instance-registry-lock.js +0 -145
- package/node_modules/pi-lens/dist/clients/instance-registry.js +0 -773
- package/node_modules/pi-lens/dist/clients/jscpd-client.js +0 -378
- package/node_modules/pi-lens/dist/clients/json-cache-read.js +0 -65
- package/node_modules/pi-lens/dist/clients/knip-client.js +0 -788
- package/node_modules/pi-lens/dist/clients/language-policy.js +0 -252
- package/node_modules/pi-lens/dist/clients/language-profile.js +0 -361
- package/node_modules/pi-lens/dist/clients/language-registry.js +0 -603
- package/node_modules/pi-lens/dist/clients/latency-logger.js +0 -727
- package/node_modules/pi-lens/dist/clients/lazy-import.js +0 -21
- package/node_modules/pi-lens/dist/clients/ledger-bounds.js +0 -54
- package/node_modules/pi-lens/dist/clients/lens-config.js +0 -404
- package/node_modules/pi-lens/dist/clients/lens-engine.js +0 -358
- package/node_modules/pi-lens/dist/clients/lens-events.js +0 -125
- package/node_modules/pi-lens/dist/clients/lens-flag-registry.js +0 -467
- package/node_modules/pi-lens/dist/clients/lens-map.js +0 -1156
- package/node_modules/pi-lens/dist/clients/live-bus-emitter.js +0 -74
- package/node_modules/pi-lens/dist/clients/log-cleanup.js +0 -222
- package/node_modules/pi-lens/dist/clients/lsp/aggregation.js +0 -178
- package/node_modules/pi-lens/dist/clients/lsp/cascade-tier.js +0 -421
- package/node_modules/pi-lens/dist/clients/lsp/client.js +0 -4593
- package/node_modules/pi-lens/dist/clients/lsp/config.js +0 -691
- package/node_modules/pi-lens/dist/clients/lsp/content-limits.js +0 -41
- package/node_modules/pi-lens/dist/clients/lsp/diagnostic-binding.js +0 -225
- package/node_modules/pi-lens/dist/clients/lsp/document-drift.js +0 -467
- package/node_modules/pi-lens/dist/clients/lsp/edits.js +0 -1219
- package/node_modules/pi-lens/dist/clients/lsp/index.js +0 -8305
- package/node_modules/pi-lens/dist/clients/lsp/inferred-project.js +0 -216
- package/node_modules/pi-lens/dist/clients/lsp/jvm-runtime.js +0 -298
- package/node_modules/pi-lens/dist/clients/lsp/language.js +0 -63
- package/node_modules/pi-lens/dist/clients/lsp/launch.js +0 -746
- package/node_modules/pi-lens/dist/clients/lsp/lombok.js +0 -158
- package/node_modules/pi-lens/dist/clients/lsp/path-utils.js +0 -5
- package/node_modules/pi-lens/dist/clients/lsp/pending-aux-coverage.js +0 -251
- package/node_modules/pi-lens/dist/clients/lsp/position-encoding.js +0 -61
- package/node_modules/pi-lens/dist/clients/lsp/ruby-drive-dirs.js +0 -83
- package/node_modules/pi-lens/dist/clients/lsp/server.js +0 -3290
- package/node_modules/pi-lens/dist/clients/lsp/session-roots.js +0 -192
- package/node_modules/pi-lens/dist/clients/lsp/spawn-history.js +0 -17
- package/node_modules/pi-lens/dist/clients/lsp/sync-kind.js +0 -56
- package/node_modules/pi-lens/dist/clients/lsp/tsserver-sync.js +0 -332
- package/node_modules/pi-lens/dist/clients/lsp/wait-policy/capability-snapshot.js +0 -1
- package/node_modules/pi-lens/dist/clients/lsp/wait-policy/classification.js +0 -85
- package/node_modules/pi-lens/dist/clients/lsp/wait-policy/index.js +0 -10
- package/node_modules/pi-lens/dist/clients/lsp/wait-policy/strategies.js +0 -392
- package/node_modules/pi-lens/dist/clients/lsp/watch-queue.js +0 -61
- package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-cache.js +0 -639
- package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-session.js +0 -30
- package/node_modules/pi-lens/dist/clients/lsp/workspace-sweep-hold.js +0 -184
- package/node_modules/pi-lens/dist/clients/lsp-budget.js +0 -186
- package/node_modules/pi-lens/dist/clients/lsp-document-symbols.js +0 -110
- package/node_modules/pi-lens/dist/clients/lsp-lazy.js +0 -9
- package/node_modules/pi-lens/dist/clients/lsp-mutation.js +0 -396
- package/node_modules/pi-lens/dist/clients/lsp-status.js +0 -59
- package/node_modules/pi-lens/dist/clients/map-with-concurrency.js +0 -40
- package/node_modules/pi-lens/dist/clients/mcp/analyze.js +0 -420
- package/node_modules/pi-lens/dist/clients/mcp/host-shim.js +0 -31
- package/node_modules/pi-lens/dist/clients/mcp/ipc.js +0 -523
- package/node_modules/pi-lens/dist/clients/mcp/review.js +0 -197
- package/node_modules/pi-lens/dist/clients/mcp/session.js +0 -412
- package/node_modules/pi-lens/dist/clients/memory-sampler.js +0 -208
- package/node_modules/pi-lens/dist/clients/message-end-attribution.js +0 -30
- package/node_modules/pi-lens/dist/clients/metrics-client.js +0 -107
- package/node_modules/pi-lens/dist/clients/metrics-history.js +0 -327
- package/node_modules/pi-lens/dist/clients/middle-man-analysis.js +0 -263
- package/node_modules/pi-lens/dist/clients/model-provider.js +0 -53
- package/node_modules/pi-lens/dist/clients/module-report-lsp.js +0 -189
- package/node_modules/pi-lens/dist/clients/module-report.js +0 -2150
- package/node_modules/pi-lens/dist/clients/mutating-tool.js +0 -651
- package/node_modules/pi-lens/dist/clients/mutation-attribution.js +0 -368
- package/node_modules/pi-lens/dist/clients/mutation-bridge.js +0 -240
- package/node_modules/pi-lens/dist/clients/ndjson-logger.js +0 -734
- package/node_modules/pi-lens/dist/clients/observed-mutation-sources.js +0 -101
- package/node_modules/pi-lens/dist/clients/observed-mutation.js +0 -1253
- package/node_modules/pi-lens/dist/clients/oldtext-autopatch.js +0 -128
- package/node_modules/pi-lens/dist/clients/opaque-mutation-scan.js +0 -496
- package/node_modules/pi-lens/dist/clients/opengrep-client.js +0 -333
- package/node_modules/pi-lens/dist/clients/opengrep-config.js +0 -76
- package/node_modules/pi-lens/dist/clients/package-manager.js +0 -607
- package/node_modules/pi-lens/dist/clients/package-root.js +0 -38
- package/node_modules/pi-lens/dist/clients/partial-edit-apply.js +0 -439
- package/node_modules/pi-lens/dist/clients/path-attribution-telemetry.js +0 -43
- package/node_modules/pi-lens/dist/clients/path-keyed-map.js +0 -108
- package/node_modules/pi-lens/dist/clients/path-utils.js +0 -1244
- package/node_modules/pi-lens/dist/clients/performance-report.js +0 -331
- package/node_modules/pi-lens/dist/clients/persist-debounce.js +0 -70
- package/node_modules/pi-lens/dist/clients/persistent-reverify.js +0 -271
- package/node_modules/pi-lens/dist/clients/php-cs-fixer-config.js +0 -119
- package/node_modules/pi-lens/dist/clients/pipeline.js +0 -1480
- package/node_modules/pi-lens/dist/clients/post-autofix-notice.js +0 -37
- package/node_modules/pi-lens/dist/clients/print-mode.js +0 -21
- package/node_modules/pi-lens/dist/clients/probe-home-state.js +0 -228
- package/node_modules/pi-lens/dist/clients/process-bridge.js +0 -66
- package/node_modules/pi-lens/dist/clients/process-singletons.js +0 -210
- package/node_modules/pi-lens/dist/clients/process-snapshot.js +0 -68
- package/node_modules/pi-lens/dist/clients/project-changes.js +0 -181
- package/node_modules/pi-lens/dist/clients/project-conventions.js +0 -171
- package/node_modules/pi-lens/dist/clients/project-diagnostics/cache.js +0 -137
- package/node_modules/pi-lens/dist/clients/project-diagnostics/extractors.js +0 -109
- package/node_modules/pi-lens/dist/clients/project-diagnostics/fresh-fetch.js +0 -668
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +0 -118
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/dead-code.js +0 -47
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +0 -40
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/govulncheck.js +0 -34
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/jscpd.js +0 -38
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/knip.js +0 -47
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/madge.js +0 -48
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/opengrep.js +0 -40
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +0 -127
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/trivy.js +0 -81
- package/node_modules/pi-lens/dist/clients/project-diagnostics/scanner.js +0 -520
- package/node_modules/pi-lens/dist/clients/project-diagnostics/types.js +0 -1
- package/node_modules/pi-lens/dist/clients/project-lens-config.js +0 -807
- package/node_modules/pi-lens/dist/clients/project-report.js +0 -701
- package/node_modules/pi-lens/dist/clients/project-scale.js +0 -237
- package/node_modules/pi-lens/dist/clients/project-scan-policy.js +0 -11
- package/node_modules/pi-lens/dist/clients/project-snapshot-fingerprint.js +0 -48
- package/node_modules/pi-lens/dist/clients/project-snapshot-persist-worker.js +0 -20
- package/node_modules/pi-lens/dist/clients/project-snapshot.js +0 -1653
- package/node_modules/pi-lens/dist/clients/project-trust.js +0 -181
- package/node_modules/pi-lens/dist/clients/python-environment.js +0 -217
- package/node_modules/pi-lens/dist/clients/python-provenance.js +0 -639
- package/node_modules/pi-lens/dist/clients/quiet-window-config.js +0 -47
- package/node_modules/pi-lens/dist/clients/quiet-window.js +0 -236
- package/node_modules/pi-lens/dist/clients/read-bridge.js +0 -139
- package/node_modules/pi-lens/dist/clients/read-expansion.js +0 -266
- package/node_modules/pi-lens/dist/clients/read-guard-logger.js +0 -251
- package/node_modules/pi-lens/dist/clients/read-guard-tool-lines.js +0 -1306
- package/node_modules/pi-lens/dist/clients/read-guard.js +0 -1561
- package/node_modules/pi-lens/dist/clients/recent-touches.js +0 -240
- package/node_modules/pi-lens/dist/clients/redact/secrets.js +0 -449
- package/node_modules/pi-lens/dist/clients/resource-sampler.js +0 -628
- package/node_modules/pi-lens/dist/clients/reverse-deps.js +0 -270
- package/node_modules/pi-lens/dist/clients/review-graph/builder.js +0 -5126
- package/node_modules/pi-lens/dist/clients/review-graph/format.js +0 -33
- package/node_modules/pi-lens/dist/clients/review-graph/git-identity.js +0 -163
- package/node_modules/pi-lens/dist/clients/review-graph/import-resolvers.js +0 -481
- package/node_modules/pi-lens/dist/clients/review-graph/persist-worker.js +0 -10
- package/node_modules/pi-lens/dist/clients/review-graph/query.js +0 -244
- package/node_modules/pi-lens/dist/clients/review-graph/revision-drift.js +0 -21
- package/node_modules/pi-lens/dist/clients/review-graph/service.js +0 -96
- package/node_modules/pi-lens/dist/clients/review-graph/shared-extraction-ir.js +0 -82
- package/node_modules/pi-lens/dist/clients/review-graph/symbol-id.js +0 -103
- package/node_modules/pi-lens/dist/clients/review-graph/tsconfig-paths.js +0 -299
- package/node_modules/pi-lens/dist/clients/review-graph/types.js +0 -1
- package/node_modules/pi-lens/dist/clients/review-graph/workspace-modules.js +0 -449
- package/node_modules/pi-lens/dist/clients/review-graph-logger.js +0 -81
- package/node_modules/pi-lens/dist/clients/ruff-client.js +0 -179
- package/node_modules/pi-lens/dist/clients/rules-scanner.js +0 -131
- package/node_modules/pi-lens/dist/clients/run-duration.js +0 -55
- package/node_modules/pi-lens/dist/clients/runtime-agent-end.js +0 -746
- package/node_modules/pi-lens/dist/clients/runtime-config.js +0 -77
- package/node_modules/pi-lens/dist/clients/runtime-context.js +0 -211
- package/node_modules/pi-lens/dist/clients/runtime-coordinator.js +0 -1324
- package/node_modules/pi-lens/dist/clients/runtime-session.js +0 -2485
- package/node_modules/pi-lens/dist/clients/runtime-tool-call.js +0 -1295
- package/node_modules/pi-lens/dist/clients/runtime-tool-result.js +0 -2049
- package/node_modules/pi-lens/dist/clients/runtime-turn.js +0 -3767
- package/node_modules/pi-lens/dist/clients/rust-client.js +0 -97
- package/node_modules/pi-lens/dist/clients/safe-spawn.js +0 -2357
- package/node_modules/pi-lens/dist/clients/sanitize.js +0 -286
- package/node_modules/pi-lens/dist/clients/scan-utils.js +0 -25
- package/node_modules/pi-lens/dist/clients/scratch-tree-policy.js +0 -165
- package/node_modules/pi-lens/dist/clients/search-read-registration.js +0 -94
- package/node_modules/pi-lens/dist/clients/secret-findings.js +0 -114
- package/node_modules/pi-lens/dist/clients/security-scan-client.js +0 -352
- package/node_modules/pi-lens/dist/clients/session-event-guard.js +0 -297
- package/node_modules/pi-lens/dist/clients/session-lifecycle.js +0 -484
- package/node_modules/pi-lens/dist/clients/session-start-observability.js +0 -94
- package/node_modules/pi-lens/dist/clients/session-state-store.js +0 -101
- package/node_modules/pi-lens/dist/clients/session-summary.js +0 -15
- package/node_modules/pi-lens/dist/clients/sessionstart-logger.js +0 -27
- package/node_modules/pi-lens/dist/clients/sg-runner.js +0 -876
- package/node_modules/pi-lens/dist/clients/sgconfig.js +0 -347
- package/node_modules/pi-lens/dist/clients/shared-checkout-guard.js +0 -338
- package/node_modules/pi-lens/dist/clients/single-flight.js +0 -158
- package/node_modules/pi-lens/dist/clients/situational-tool-telemetry.js +0 -108
- package/node_modules/pi-lens/dist/clients/skills-resolver.js +0 -141
- package/node_modules/pi-lens/dist/clients/slow-fs.js +0 -138
- package/node_modules/pi-lens/dist/clients/smells-rollup.js +0 -231
- package/node_modules/pi-lens/dist/clients/source-filter.js +0 -596
- package/node_modules/pi-lens/dist/clients/source-walker.js +0 -211
- package/node_modules/pi-lens/dist/clients/spawn-output-cap.js +0 -120
- package/node_modules/pi-lens/dist/clients/spawn-timeout-cooldown.js +0 -110
- package/node_modules/pi-lens/dist/clients/stale-marker.js +0 -17
- package/node_modules/pi-lens/dist/clients/startup-scan.js +0 -400
- package/node_modules/pi-lens/dist/clients/startup-timing.js +0 -130
- package/node_modules/pi-lens/dist/clients/string-utils.js +0 -33
- package/node_modules/pi-lens/dist/clients/subagent-mode.js +0 -111
- package/node_modules/pi-lens/dist/clients/symbol-containment.js +0 -24
- package/node_modules/pi-lens/dist/clients/symbol-types.js +0 -5
- package/node_modules/pi-lens/dist/clients/test-runner-client.js +0 -2507
- package/node_modules/pi-lens/dist/clients/test-runner-delivery.js +0 -287
- package/node_modules/pi-lens/dist/clients/todo-scanner.js +0 -229
- package/node_modules/pi-lens/dist/clients/tool-agreement.js +0 -423
- package/node_modules/pi-lens/dist/clients/tool-config.js +0 -249
- package/node_modules/pi-lens/dist/clients/tool-cwd.js +0 -270
- package/node_modules/pi-lens/dist/clients/tool-definition.js +0 -47
- package/node_modules/pi-lens/dist/clients/tool-event.js +0 -105
- package/node_modules/pi-lens/dist/clients/tool-policy.js +0 -2755
- package/node_modules/pi-lens/dist/clients/tool-probe.js +0 -53
- package/node_modules/pi-lens/dist/clients/tool-render.js +0 -156
- package/node_modules/pi-lens/dist/clients/tool-set-policy.js +0 -118
- package/node_modules/pi-lens/dist/clients/tree-sitter-cache.js +0 -364
- package/node_modules/pi-lens/dist/clients/tree-sitter-client.js +0 -4195
- package/node_modules/pi-lens/dist/clients/tree-sitter-logger.js +0 -100
- package/node_modules/pi-lens/dist/clients/tree-sitter-navigator.js +0 -269
- package/node_modules/pi-lens/dist/clients/tree-sitter-query-loader.js +0 -569
- package/node_modules/pi-lens/dist/clients/tree-sitter-shared.js +0 -158
- package/node_modules/pi-lens/dist/clients/tree-sitter-symbol-extractor.js +0 -1265
- package/node_modules/pi-lens/dist/clients/trivy-client.js +0 -467
- package/node_modules/pi-lens/dist/clients/tui-fit.js +0 -50
- package/node_modules/pi-lens/dist/clients/turn-context.js +0 -52
- package/node_modules/pi-lens/dist/clients/turn-end/lane.js +0 -51
- package/node_modules/pi-lens/dist/clients/turn-end/lanes/govulncheck.js +0 -112
- package/node_modules/pi-lens/dist/clients/turn-end/lanes/secrets.js +0 -204
- package/node_modules/pi-lens/dist/clients/turn-summary-render.js +0 -72
- package/node_modules/pi-lens/dist/clients/turn-summary.js +0 -132
- package/node_modules/pi-lens/dist/clients/typos-config.js +0 -29
- package/node_modules/pi-lens/dist/clients/user-notify.js +0 -51
- package/node_modules/pi-lens/dist/clients/vanished-instance-marker.js +0 -57
- package/node_modules/pi-lens/dist/clients/warm-attach.js +0 -305
- package/node_modules/pi-lens/dist/clients/widget-state.js +0 -1808
- package/node_modules/pi-lens/dist/clients/word-index-logger.js +0 -49
- package/node_modules/pi-lens/dist/clients/word-index-store.js +0 -459
- package/node_modules/pi-lens/dist/clients/word-index.js +0 -2080
- package/node_modules/pi-lens/dist/clients/workspace-topology.js +0 -443
- package/node_modules/pi-lens/dist/clients/write-ordering-guard.js +0 -65
- package/node_modules/pi-lens/dist/clients/zizmor-config.js +0 -340
- package/node_modules/pi-lens/dist/i18n.js +0 -69
- package/node_modules/pi-lens/dist/mcp/build-staleness.js +0 -124
- package/node_modules/pi-lens/dist/scripts/lib/process-scan.mjs +0 -583
- package/node_modules/pi-lens/dist/scripts/lib/skills-predicate.mjs +0 -129
- package/node_modules/pi-lens/dist/scripts/lib/web-tree-sitter-dir.mjs +0 -123
- package/node_modules/pi-lens/dist/tools/activate-tools.js +0 -87
- package/node_modules/pi-lens/dist/tools/ast-grep-outline.js +0 -137
- package/node_modules/pi-lens/dist/tools/ast-grep-replace.js +0 -244
- package/node_modules/pi-lens/dist/tools/ast-grep-search.js +0 -762
- package/node_modules/pi-lens/dist/tools/effective-config.js +0 -90
- package/node_modules/pi-lens/dist/tools/lens-diagnostic-mark.js +0 -375
- package/node_modules/pi-lens/dist/tools/lens-diagnostics.js +0 -2571
- package/node_modules/pi-lens/dist/tools/lsp-diagnostics.js +0 -1745
- package/node_modules/pi-lens/dist/tools/lsp-navigation.js +0 -1367
- package/node_modules/pi-lens/dist/tools/lsp-structured-output.js +0 -294
- package/node_modules/pi-lens/dist/tools/module-report.js +0 -382
- package/node_modules/pi-lens/dist/tools/project-report.js +0 -86
- package/node_modules/pi-lens/dist/tools/render-compact.js +0 -374
- package/node_modules/pi-lens/dist/tools/scan-progress.js +0 -53
- package/node_modules/pi-lens/dist/tools/shared.js +0 -29
- package/node_modules/pi-lens/dist/tools/symbol-search.js +0 -155
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* RuboCop runner for dispatch system
|
|
3
|
-
*
|
|
4
|
-
* Runs rubocop in lint-only mode (no auto-correct) on Ruby files.
|
|
5
|
-
* Auto-correct is handled by the formatter pipeline — this runner
|
|
6
|
-
* only reports remaining offenses after formatting.
|
|
7
|
-
*
|
|
8
|
-
* Supports bundle exec (preferred in Bundler projects).
|
|
9
|
-
*/
|
|
10
|
-
import * as path from "node:path";
|
|
11
|
-
import { pathsEqual } from "../../path-utils.js";
|
|
12
|
-
import { safeSpawnAsync } from "../../safe-spawn.js";
|
|
13
|
-
import { resolveRunnerCwd } from "../../tool-cwd.js";
|
|
14
|
-
import { getAutofixCapability, getLinterPolicyForCwd, getRubocopCommand, } from "../../tool-policy.js";
|
|
15
|
-
import { PRIORITY } from "../priorities.js";
|
|
16
|
-
import { resolveCommandArgsWithInstallFallback } from "./utils/runner-helpers.js";
|
|
17
|
-
import { finishParsedRun, parseToolRun } from "./utils/tool-failure.js";
|
|
18
|
-
const SEVERITY_MAP = {
|
|
19
|
-
fatal: "error",
|
|
20
|
-
error: "error",
|
|
21
|
-
warning: "warning",
|
|
22
|
-
convention: "warning",
|
|
23
|
-
refactor: "info",
|
|
24
|
-
};
|
|
25
|
-
function parseRubocopJson(raw, filePath, cwd) {
|
|
26
|
-
try {
|
|
27
|
-
const output = JSON.parse(raw);
|
|
28
|
-
const autofix = getAutofixCapability("rubocop");
|
|
29
|
-
const diagnostics = [];
|
|
30
|
-
const absTarget = path.resolve(cwd, filePath);
|
|
31
|
-
for (const file of output.files) {
|
|
32
|
-
// #3295: `.rubocop.yml` `Include:`/`inherit_from` can widen the run past
|
|
33
|
-
// the argv, and each result carries its own `path`.
|
|
34
|
-
if (file.path && !pathsEqual(path.resolve(cwd, file.path), absTarget))
|
|
35
|
-
continue;
|
|
36
|
-
for (const offense of file.offenses) {
|
|
37
|
-
const severity = SEVERITY_MAP[offense.severity] ?? "warning";
|
|
38
|
-
diagnostics.push({
|
|
39
|
-
id: `rubocop:${offense.cop_name}:${offense.location.line}`,
|
|
40
|
-
message: `${offense.cop_name}: ${offense.message}`,
|
|
41
|
-
filePath,
|
|
42
|
-
line: offense.location.line,
|
|
43
|
-
column: offense.location.column,
|
|
44
|
-
severity,
|
|
45
|
-
semantic: severity === "error" ? "blocking" : "warning",
|
|
46
|
-
tool: "rubocop",
|
|
47
|
-
rule: offense.cop_name,
|
|
48
|
-
fixable: offense.correctable,
|
|
49
|
-
autoFixAvailable: offense.correctable && (autofix?.safePipelineAutofix ?? false),
|
|
50
|
-
fixKind: offense.correctable && autofix?.fixKind !== "none"
|
|
51
|
-
? autofix?.fixKind
|
|
52
|
-
: undefined,
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
return diagnostics;
|
|
57
|
-
}
|
|
58
|
-
catch {
|
|
59
|
-
return [];
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
const rubocopRunner = {
|
|
63
|
-
id: "rubocop",
|
|
64
|
-
appliesTo: ["ruby"],
|
|
65
|
-
priority: PRIORITY.FORMAT_AND_LINT_PRIMARY,
|
|
66
|
-
async run(ctx) {
|
|
67
|
-
const cwd = resolveRunnerCwd(ctx, "rubocop");
|
|
68
|
-
const policy = getLinterPolicyForCwd(ctx.filePath, cwd);
|
|
69
|
-
if (policy && !policy.preferredRunners.includes("rubocop")) {
|
|
70
|
-
return { status: "skipped", diagnostics: [], semantic: "none" };
|
|
71
|
-
}
|
|
72
|
-
const resolved = await resolveCommandArgsWithInstallFallback(getRubocopCommand(cwd), "rubocop", cwd, ["--version"], 10000);
|
|
73
|
-
if (!resolved) {
|
|
74
|
-
return { status: "skipped", diagnostics: [], semantic: "none" };
|
|
75
|
-
}
|
|
76
|
-
const { cmd, args } = resolved;
|
|
77
|
-
// Lint only — no auto-correct (formatter handles that)
|
|
78
|
-
const result = await safeSpawnAsync(cmd, [...args, "--format", "json", "--no-color", ctx.filePath], { timeout: 30000, cwd });
|
|
79
|
-
// EXIT TABLE (RuboCop 1.66 docs https://docs.rubocop.org/rubocop/usage/basic_usage.html): 0 = clean, 1 = offenses/findings, 2 = fatal/error or rejected
|
|
80
|
-
// invocation. A nonzero exit with valid JSON remains findings; a nonzero
|
|
81
|
-
// exit with empty or unparsable JSON is never clean (#1816).
|
|
82
|
-
const run = parseToolRun("rubocop", {
|
|
83
|
-
result,
|
|
84
|
-
// Classify both streams so stderr-only failures reach the parse-error
|
|
85
|
-
// path, while parseOutput keeps RuboCop's native JSON parser on stdout.
|
|
86
|
-
output: `${result.stdout}${result.stderr}`,
|
|
87
|
-
exitCodes: { ran: [1, 2] },
|
|
88
|
-
}, (output) => parseRubocopJson(output, ctx.filePath, cwd), { parseOutput: result.stdout });
|
|
89
|
-
if (run.skipped)
|
|
90
|
-
return run.skipped;
|
|
91
|
-
return finishParsedRun({
|
|
92
|
-
tool: "rubocop",
|
|
93
|
-
ctx,
|
|
94
|
-
result,
|
|
95
|
-
diagnostics: run.diagnostics,
|
|
96
|
-
});
|
|
97
|
-
},
|
|
98
|
-
};
|
|
99
|
-
export default rubocopRunner;
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Ruff runner for dispatch system
|
|
3
|
-
*
|
|
4
|
-
* Dispatch mode is diagnostics-only.
|
|
5
|
-
* Autofix is handled earlier by the post-write pipeline to avoid
|
|
6
|
-
* mutating files mid-dispatch after LSP sync has already happened.
|
|
7
|
-
* Supports venv-local installations.
|
|
8
|
-
*/
|
|
9
|
-
import { safeSpawnAsync } from "../../safe-spawn.js";
|
|
10
|
-
import { stripAnsi } from "../../sanitize.js";
|
|
11
|
-
import { getAutofixCapability, getLinterPolicyForCwd, ruffConfigArgs, } from "../../tool-policy.js";
|
|
12
|
-
import { PRIORITY } from "../priorities.js";
|
|
13
|
-
import { finishParsedRun, parseToolRun } from "./utils/tool-failure.js";
|
|
14
|
-
import { parseRuffOutput } from "./utils/diagnostic-parsers.js";
|
|
15
|
-
import { createAvailabilityChecker, resolveAvailableOrInstall, resolveRunnerCwd, } from "./utils/runner-helpers.js";
|
|
16
|
-
const ruff = createAvailabilityChecker("ruff", ".exe");
|
|
17
|
-
function parseRuffJson(raw, filePath) {
|
|
18
|
-
try {
|
|
19
|
-
const parsed = JSON.parse(raw);
|
|
20
|
-
if (!Array.isArray(parsed))
|
|
21
|
-
return [];
|
|
22
|
-
const autofix = getAutofixCapability("ruff");
|
|
23
|
-
return parsed.map((item, index) => {
|
|
24
|
-
const severity = item.severity === "error" ? "error" : "warning";
|
|
25
|
-
const code = item.code || "ruff";
|
|
26
|
-
const toolFixable = Boolean(item.fix);
|
|
27
|
-
return {
|
|
28
|
-
id: `ruff-${code}-${item.location?.row ?? index + 1}`,
|
|
29
|
-
message: item.message || code,
|
|
30
|
-
filePath: item.filename || filePath,
|
|
31
|
-
line: item.location?.row ?? 1,
|
|
32
|
-
column: item.location?.column ?? 1,
|
|
33
|
-
severity,
|
|
34
|
-
semantic: severity === "error" ? "blocking" : "warning",
|
|
35
|
-
tool: "ruff",
|
|
36
|
-
rule: code,
|
|
37
|
-
fixable: toolFixable,
|
|
38
|
-
autoFixAvailable: toolFixable && (autofix?.safePipelineAutofix ?? false),
|
|
39
|
-
fixKind: toolFixable && autofix?.fixKind !== "none"
|
|
40
|
-
? autofix?.fixKind
|
|
41
|
-
: undefined,
|
|
42
|
-
};
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
catch {
|
|
46
|
-
return [];
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
const ruffRunner = {
|
|
50
|
-
id: "ruff-lint",
|
|
51
|
-
appliesTo: ["python"],
|
|
52
|
-
priority: PRIORITY.FORMAT_AND_LINT_PRIMARY,
|
|
53
|
-
async run(ctx) {
|
|
54
|
-
const cwd = resolveRunnerCwd(ctx, "ruff");
|
|
55
|
-
const policy = getLinterPolicyForCwd(ctx.filePath, cwd);
|
|
56
|
-
if (policy && !policy.preferredRunners.includes("ruff-lint")) {
|
|
57
|
-
return { status: "skipped", diagnostics: [], semantic: "none" };
|
|
58
|
-
}
|
|
59
|
-
const cmd = await resolveAvailableOrInstall(ruff, "ruff", cwd);
|
|
60
|
-
if (!cmd) {
|
|
61
|
-
return { status: "skipped", diagnostics: [], semantic: "none" };
|
|
62
|
-
}
|
|
63
|
-
// Shared config-args seam (#1247): the autofix path consumes the same
|
|
64
|
-
// builder, so the package-owned fallback config can never drift.
|
|
65
|
-
const configArgs = ruffConfigArgs(cwd);
|
|
66
|
-
// Step 1: Capture diagnostics (before fixing) — teaching signal for the agent
|
|
67
|
-
const checkResult = await safeSpawnAsync(cmd, ["check", "--output-format", "json", ...configArgs, ctx.filePath], { cwd, timeout: 30000 });
|
|
68
|
-
const raw = stripAnsi(checkResult.stdout + checkResult.stderr);
|
|
69
|
-
// EXIT TABLE (Ruff 0.6 docs https://docs.astral.sh/ruff/linter/): 0 = clean, 1 = findings, 2 = findings/error or
|
|
70
|
-
// tool error. A nonzero exit with valid findings stays findings; empty or
|
|
71
|
-
// unparsable output must never become clean (#1816).
|
|
72
|
-
const run = parseToolRun("ruff", { result: checkResult, output: raw, exitCodes: { ran: [1, 2] } }, (output) => {
|
|
73
|
-
const diagnostics = parseRuffJson(output, ctx.filePath);
|
|
74
|
-
return diagnostics.length > 0
|
|
75
|
-
? diagnostics
|
|
76
|
-
: parseRuffOutput(output, ctx.filePath, cwd);
|
|
77
|
-
});
|
|
78
|
-
if (run.skipped)
|
|
79
|
-
return run.skipped;
|
|
80
|
-
return finishParsedRun({
|
|
81
|
-
tool: "ruff",
|
|
82
|
-
ctx,
|
|
83
|
-
result: checkResult,
|
|
84
|
-
diagnostics: run.diagnostics,
|
|
85
|
-
});
|
|
86
|
-
},
|
|
87
|
-
};
|
|
88
|
-
export default ruffRunner;
|
|
@@ -1,256 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Rust clippy runner for dispatch system
|
|
3
|
-
*
|
|
4
|
-
* Runs `cargo clippy` for Rust files to catch common mistakes.
|
|
5
|
-
*/
|
|
6
|
-
import { isAbsolute, resolve } from "node:path";
|
|
7
|
-
import { pathsEqual } from "../../path-utils.js";
|
|
8
|
-
import { rustClient } from "../../rust-client.js";
|
|
9
|
-
import { safeSpawnAsync } from "../../safe-spawn.js";
|
|
10
|
-
import { stripAnsi } from "../../sanitize.js";
|
|
11
|
-
import { getLazyInstallAttempt, tryLazyInstall, } from "./utils/lazy-installer.js";
|
|
12
|
-
import { describeInstallAttempt, logAvailabilityDecision, } from "./utils/availability-policy.js";
|
|
13
|
-
import { PRIORITY } from "../priorities.js";
|
|
14
|
-
import { resolveRunnerCwdWithReason } from "../../tool-cwd.js";
|
|
15
|
-
import { createCwdCachedProbe } from "./utils/runner-helpers.js";
|
|
16
|
-
// Cached per-cwd `cargo clippy --version` probe (#120). Before this, the
|
|
17
|
-
// probe fired on every Rust file save in a project where clippy was already
|
|
18
|
-
// installed.
|
|
19
|
-
//
|
|
20
|
-
// `tryLazyInstall("rust-clippy", cwd)` mutates installed state, so on a
|
|
21
|
-
// false initial result the runner needs a way to bust the cache and re-probe
|
|
22
|
-
// after install. We can't `delete` a Promise mid-flight, so the safe path
|
|
23
|
-
// is: if the cached probe resolves false AND the install just succeeded,
|
|
24
|
-
// fall back to a one-shot fresh probe rather than reusing the cached false.
|
|
25
|
-
//
|
|
26
|
-
// The verdict is governed by the shared availability policy (#1494): a probe
|
|
27
|
-
// timeout expires on a cooldown, so only a genuinely absent clippy latches.
|
|
28
|
-
const CLIPPY_PROBE_BUDGET_MS = 8000;
|
|
29
|
-
let clippyProbeRevision = 0;
|
|
30
|
-
const makeClippyProbe = (cargoExe, flightKeyComponent = cargoExe) => createCwdCachedProbe((cwd) => safeSpawnAsync(cargoExe, ["clippy", "--version"], {
|
|
31
|
-
timeout: CLIPPY_PROBE_BUDGET_MS,
|
|
32
|
-
cwd,
|
|
33
|
-
}), {
|
|
34
|
-
tool: "clippy",
|
|
35
|
-
budgetMs: CLIPPY_PROBE_BUDGET_MS,
|
|
36
|
-
flightKeyComponent,
|
|
37
|
-
});
|
|
38
|
-
const clippyAvailabilityByCargo = new Map();
|
|
39
|
-
function getClippyProbe(cargoExe) {
|
|
40
|
-
return (clippyAvailabilityByCargo.get(cargoExe) ?? refreshClippyProbe(cargoExe));
|
|
41
|
-
}
|
|
42
|
-
/** Replace the cached probe so a post-install state is observed. */
|
|
43
|
-
function refreshClippyProbe(cargoExe) {
|
|
44
|
-
const created = makeClippyProbe(cargoExe, `${cargoExe}#refresh-${++clippyProbeRevision}`);
|
|
45
|
-
clippyAvailabilityByCargo.set(cargoExe, created);
|
|
46
|
-
return created;
|
|
47
|
-
}
|
|
48
|
-
const rustClippyRunner = {
|
|
49
|
-
id: "rust-clippy",
|
|
50
|
-
appliesTo: ["rust"],
|
|
51
|
-
priority: PRIORITY.SPECIALIZED_ANALYSIS,
|
|
52
|
-
timeoutMs: 90_000,
|
|
53
|
-
async run(ctx) {
|
|
54
|
-
// Resolve cargo path using platform-aware lookup (handles ~/.cargo/bin on Windows)
|
|
55
|
-
const cargoExe = await rustClient.findCargoPathAsync();
|
|
56
|
-
if (!cargoExe) {
|
|
57
|
-
return { status: "skipped", diagnostics: [], semantic: "none" };
|
|
58
|
-
}
|
|
59
|
-
const clippyProbe = getClippyProbe(cargoExe);
|
|
60
|
-
if (!(await clippyProbe(ctx.cwd))) {
|
|
61
|
-
// A timed-out probe is not evidence that clippy is missing, so it must
|
|
62
|
-
// not drive an install. Skip this turn and let the policy re-probe once
|
|
63
|
-
// its cooldown expires (#1494).
|
|
64
|
-
if (clippyProbe.getVerdict(ctx.cwd).outcome === "transient") {
|
|
65
|
-
return { status: "skipped", diagnostics: [], semantic: "none" };
|
|
66
|
-
}
|
|
67
|
-
await tryLazyInstall("rust-clippy", ctx.cwd);
|
|
68
|
-
// Bust the cwd-keyed cache so the post-install state is observed. Held in
|
|
69
|
-
// a local: `refreshClippyProbe` REPLACES the cached probe, so calling it
|
|
70
|
-
// again to read the verdict would spend a second probe.
|
|
71
|
-
const refreshedProbe = refreshClippyProbe(cargoExe);
|
|
72
|
-
if (!(await refreshedProbe(ctx.cwd))) {
|
|
73
|
-
// #1537: clippy is still absent, and the interesting question is WHY —
|
|
74
|
-
// "we tried `rustup component add` and the network failed" is a
|
|
75
|
-
// different fact from "this machine has no rustup", and until now the
|
|
76
|
-
// lazy installers recorded neither. Put the attempt beside the verdict
|
|
77
|
-
// it produced (#1500), so a reader does not have to infer the install
|
|
78
|
-
// from a runner that silently skipped.
|
|
79
|
-
const verdict = refreshedProbe.getVerdict(ctx.cwd);
|
|
80
|
-
logAvailabilityDecision({
|
|
81
|
-
tool: "rust-clippy",
|
|
82
|
-
verdict: "unavailable",
|
|
83
|
-
outcome: verdict.outcome ?? "missing",
|
|
84
|
-
cause: verdict.cause ?? "not-found",
|
|
85
|
-
classifiedBy: "caller",
|
|
86
|
-
evidence: describeInstallAttempt(getLazyInstallAttempt("rust-clippy", ctx.cwd)),
|
|
87
|
-
elapsedMs: 0,
|
|
88
|
-
latched: false,
|
|
89
|
-
});
|
|
90
|
-
return { status: "skipped", diagnostics: [], semantic: "none" };
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
// The package root (where Cargo.toml is), through the shared cwd seam
|
|
94
|
-
// (#2894): the shared language marker vocabulary includes `Cargo.toml`, so
|
|
95
|
-
// this IS the walk this runner used to do with `findNearestContaining` — plus
|
|
96
|
-
// the seam's dispatch-root and `$HOME` ceilings, which the hand-rolled
|
|
97
|
-
// walk had neither of. The gate then asks about exactly the directory
|
|
98
|
-
// cargo will run in, rather than about a separately-derived one.
|
|
99
|
-
const cargoResolution = resolveRunnerCwdWithReason(ctx, "rust-clippy");
|
|
100
|
-
const cargoDir = cargoResolution.cwd;
|
|
101
|
-
if (cargoResolution.marker !== "Cargo.toml") {
|
|
102
|
-
return { status: "skipped", diagnostics: [], semantic: "none" };
|
|
103
|
-
}
|
|
104
|
-
// Run cargo clippy on the package
|
|
105
|
-
const result = await safeSpawnAsync(cargoExe, ["clippy", "--message-format=json", "-q"], {
|
|
106
|
-
timeout: 60000,
|
|
107
|
-
cwd: cargoDir,
|
|
108
|
-
});
|
|
109
|
-
const raw = stripAnsi(result.stdout + result.stderr);
|
|
110
|
-
if (result.status === 0 && !raw.trim()) {
|
|
111
|
-
return { status: "succeeded", diagnostics: [], semantic: "none" };
|
|
112
|
-
}
|
|
113
|
-
// Parse JSON output. span.file is relative to the package root, so pass
|
|
114
|
-
// the cargo dir to resolve diagnostics to absolute paths for filtering.
|
|
115
|
-
const allDiagnostics = parseClippyOutput(raw, ctx.filePath, cargoDir);
|
|
116
|
-
if (allDiagnostics.length === 0) {
|
|
117
|
-
// Non-parseable output
|
|
118
|
-
return {
|
|
119
|
-
status: "failed",
|
|
120
|
-
diagnostics: [],
|
|
121
|
-
semantic: "warning",
|
|
122
|
-
rawOutput: raw.substring(0, 500),
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
// Lint-style policy (#265 B1): `cargo clippy` compiles the whole crate, so
|
|
126
|
-
// a crate-mate's pre-existing diagnostic must NOT fail the edited file's
|
|
127
|
-
// turn. Filter to the edited file like golangci-lint — if the edited file
|
|
128
|
-
// is clean, this turn succeeds even when siblings carry warnings/errors.
|
|
129
|
-
// #3278: one seam for reported-path attribution — see javac.ts. This
|
|
130
|
-
// member already had the right BASE (`parseClippyOutput` resolves
|
|
131
|
-
// `span.file` against `cargoDir`); what it lacked was the on-disk
|
|
132
|
-
// identity predicate.
|
|
133
|
-
const absEdited = resolve(ctx.filePath);
|
|
134
|
-
const diagnostics = allDiagnostics.filter((d) => pathsEqual(resolve(cargoDir, d.filePath), absEdited));
|
|
135
|
-
const hasErrors = diagnostics.some((d) => d.semantic === "blocking");
|
|
136
|
-
return {
|
|
137
|
-
status: hasErrors ? "failed" : "succeeded",
|
|
138
|
-
diagnostics,
|
|
139
|
-
semantic: hasErrors
|
|
140
|
-
? "blocking"
|
|
141
|
-
: diagnostics.length > 0
|
|
142
|
-
? "warning"
|
|
143
|
-
: "none",
|
|
144
|
-
};
|
|
145
|
-
},
|
|
146
|
-
};
|
|
147
|
-
/**
|
|
148
|
-
* #1802 fix round: the original review claimed rustc/clippy's top-level
|
|
149
|
-
* `compiler-message.level` is genuinely two-valued (error/warning). A live
|
|
150
|
-
* `cargo clippy --message-format=json` repro falsified that: rustc_errors's
|
|
151
|
-
* `Level` serializes SIX values, and top-level messages with a real primary
|
|
152
|
-
* span are NOT limited to error/warning —
|
|
153
|
-
*
|
|
154
|
-
* - `"error"` — a hard compiler/lint error.
|
|
155
|
-
* - `"warning"` — the common clippy-lint case.
|
|
156
|
-
* - `"note"` — DOES appear as a top-level message with a non-empty primary
|
|
157
|
-
* span (repro: an erroneous-constant note pointing at the offending
|
|
158
|
-
* expression), not only as a `message.children[].level` annotation.
|
|
159
|
-
* - `"help"` — a top-level suggestion-carrying message.
|
|
160
|
-
* - `"failure-note"` — observed with an empty `spans` array, so it is
|
|
161
|
-
* already filtered out by the `if (!span) continue` guard below; no
|
|
162
|
-
* diagnostic is ever built from it. Verified, not assumed.
|
|
163
|
-
* - `"error: internal compiler error"` — an ICE. The old `level === "error"`
|
|
164
|
-
* exact-match ternary silently mapped this to `"warning"`, because the
|
|
165
|
-
* string doesn't equal `"error"` — an ICE must never be under-reported,
|
|
166
|
-
* so it is normalized to `"error"` here explicitly.
|
|
167
|
-
*
|
|
168
|
-
* `note`/`help` don't have a `"blocking"`-worthy tier of their own in the
|
|
169
|
-
* four-valued `Diagnostic.severity`, so they land on the two quiet tiers:
|
|
170
|
-
* `note` → `hint`, `help` → `info`. Blocking stays derived from the
|
|
171
|
-
* *normalized* severity (not the raw string), which is what makes the ICE
|
|
172
|
-
* case blocking too instead of silently passing.
|
|
173
|
-
*/
|
|
174
|
-
export function normalizeClippyLevel(raw) {
|
|
175
|
-
if (raw === "error")
|
|
176
|
-
return "error";
|
|
177
|
-
if (typeof raw === "string" &&
|
|
178
|
-
raw.startsWith("error: internal compiler error")) {
|
|
179
|
-
return "error";
|
|
180
|
-
}
|
|
181
|
-
if (raw === "note")
|
|
182
|
-
return "hint";
|
|
183
|
-
if (raw === "help")
|
|
184
|
-
return "info";
|
|
185
|
-
// "warning", "failure-note" (unreachable here, see above), and anything
|
|
186
|
-
// unrecognized fall back to "warning" — the tier every clippy diagnostic
|
|
187
|
-
// reported at before this fix.
|
|
188
|
-
return "warning";
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
* Find a machine-applicable suggested replacement across the message's spans.
|
|
192
|
-
* Clippy emits one diagnostic per warning but can attach the auto-fix to a
|
|
193
|
-
* span other than the primary one (e.g. a fix that rewrites a use-site AND
|
|
194
|
-
* removes the now-unused import). We treat the diagnostic as fixable if any
|
|
195
|
-
* span carries a MachineApplicable suggestion — that's the applicability
|
|
196
|
-
* level clippy promises is safe for `cargo clippy --fix` to apply without
|
|
197
|
-
* human review.
|
|
198
|
-
*/
|
|
199
|
-
function findMachineApplicableSpan(spans) {
|
|
200
|
-
return spans.find((s) => typeof s.suggested_replacement === "string" &&
|
|
201
|
-
s.suggestion_applicability === "MachineApplicable");
|
|
202
|
-
}
|
|
203
|
-
export function parseClippyOutput(raw, fallbackPath, cargoDir) {
|
|
204
|
-
const diagnostics = [];
|
|
205
|
-
const lines = raw.split("\n").filter((l) => l.trim());
|
|
206
|
-
for (const line of lines) {
|
|
207
|
-
try {
|
|
208
|
-
const msg = JSON.parse(line);
|
|
209
|
-
if (msg.reason !== "compiler-message")
|
|
210
|
-
continue;
|
|
211
|
-
const message = msg.message;
|
|
212
|
-
if (!message)
|
|
213
|
-
continue;
|
|
214
|
-
// Only include messages for this file or project-wide
|
|
215
|
-
const spans = message.spans ?? [];
|
|
216
|
-
const span = spans[0];
|
|
217
|
-
if (!span)
|
|
218
|
-
continue;
|
|
219
|
-
const fixableSpan = findMachineApplicableSpan(spans);
|
|
220
|
-
// span.file is relative to the package root; resolve to absolute when
|
|
221
|
-
// the cargo dir is known so callers can filter by edited file (#265 B1).
|
|
222
|
-
const rawFile = span.file || span.file_name;
|
|
223
|
-
const filePath = rawFile
|
|
224
|
-
? cargoDir && !isAbsolute(rawFile)
|
|
225
|
-
? resolve(cargoDir, rawFile)
|
|
226
|
-
: rawFile
|
|
227
|
-
: fallbackPath;
|
|
228
|
-
// #1802: preserve clippy's real six-level vocabulary instead of
|
|
229
|
-
// collapsing it. See `normalizeClippyLevel` above for the verified
|
|
230
|
-
// mapping and the repro that falsified the original "two-valued"
|
|
231
|
-
// claim. Blocking is derived from the NORMALIZED severity so an ICE
|
|
232
|
-
// (`"error: internal compiler error"`) is blocking too, not just an
|
|
233
|
-
// exact-match `"error"` string.
|
|
234
|
-
const normalizedSeverity = normalizeClippyLevel(message.level);
|
|
235
|
-
diagnostics.push({
|
|
236
|
-
id: `clippy-${message.code?.code || "unknown"}`,
|
|
237
|
-
message: message.message || "Clippy warning",
|
|
238
|
-
filePath,
|
|
239
|
-
line: span.line_start || 0,
|
|
240
|
-
column: span.column_start || 0,
|
|
241
|
-
severity: normalizedSeverity,
|
|
242
|
-
semantic: normalizedSeverity === "error" ? "blocking" : "warning",
|
|
243
|
-
tool: "rust-clippy",
|
|
244
|
-
rule: message.code?.code,
|
|
245
|
-
defectClass: "correctness",
|
|
246
|
-
fixable: fixableSpan !== undefined,
|
|
247
|
-
fixSuggestion: fixableSpan?.suggested_replacement,
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
catch {
|
|
251
|
-
// Not a JSON line, skip
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
return diagnostics;
|
|
255
|
-
}
|
|
256
|
-
export default rustClippyRunner;
|
|
@@ -1,173 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shellcheck runner for dispatch system
|
|
3
|
-
*
|
|
4
|
-
* Industry-standard linter for shell scripts (bash, sh, zsh).
|
|
5
|
-
* Detects syntax errors, undefined variables, quoting issues, and best practices.
|
|
6
|
-
*
|
|
7
|
-
* Why shellcheck?
|
|
8
|
-
* - Industry standard (used in CI/CD everywhere)
|
|
9
|
-
* - Comprehensive checks (syntax, variables, quotes, best practices)
|
|
10
|
-
* - JSON output for easy parsing
|
|
11
|
-
* - Available on all platforms (apt, brew, cargo, etc.)
|
|
12
|
-
*
|
|
13
|
-
* Alternative considered: bash-language-server
|
|
14
|
-
* - LSP approach like OpenCode uses
|
|
15
|
-
* - Richer features but heavier
|
|
16
|
-
* - shellcheck is simpler and faster for basic linting
|
|
17
|
-
*
|
|
18
|
-
* Install: apt install shellcheck, brew install shellcheck, or cargo install shellcheck
|
|
19
|
-
*
|
|
20
|
-
* Config: .shellcheckrc (optional, zero-config works)
|
|
21
|
-
*/
|
|
22
|
-
import * as fs from "node:fs";
|
|
23
|
-
import * as path from "node:path";
|
|
24
|
-
import { pathsEqual } from "../../path-utils.js";
|
|
25
|
-
import { safeSpawnAsync } from "../../safe-spawn.js";
|
|
26
|
-
import { resolveRunnerCwd } from "../../tool-cwd.js";
|
|
27
|
-
import { PRIORITY } from "../priorities.js";
|
|
28
|
-
import { createAvailabilityChecker, lspPrimaryCoversFile, resolveAvailableOrInstall, } from "./utils/runner-helpers.js";
|
|
29
|
-
import { finishParsedRun } from "./utils/tool-failure.js";
|
|
30
|
-
const shellcheck = createAvailabilityChecker("shellcheck", ".exe");
|
|
31
|
-
function findShellcheckConfig(cwd) {
|
|
32
|
-
const local = path.join(cwd, ".shellcheckrc");
|
|
33
|
-
if (fs.existsSync(local))
|
|
34
|
-
return local;
|
|
35
|
-
let current = path.resolve(cwd);
|
|
36
|
-
while (true) {
|
|
37
|
-
const candidate = path.join(current, ".shellcheckrc");
|
|
38
|
-
if (fs.existsSync(candidate))
|
|
39
|
-
return candidate;
|
|
40
|
-
const parent = path.dirname(current);
|
|
41
|
-
if (parent === current)
|
|
42
|
-
break;
|
|
43
|
-
current = parent;
|
|
44
|
-
}
|
|
45
|
-
return undefined;
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Parse shellcheck JSON output
|
|
49
|
-
*
|
|
50
|
-
* Format: Array of check objects
|
|
51
|
-
* [{
|
|
52
|
-
* "file": "script.sh",
|
|
53
|
-
* "line": 10,
|
|
54
|
-
* "endLine": 10,
|
|
55
|
-
* "column": 5,
|
|
56
|
-
* "endColumn": 10,
|
|
57
|
-
* "level": "warning",
|
|
58
|
-
* "code": 2154,
|
|
59
|
-
* "message": "var is referenced but not assigned.",
|
|
60
|
-
* "fix": null
|
|
61
|
-
* }]
|
|
62
|
-
*
|
|
63
|
-
* Levels: "error", "warning", "info", "style"
|
|
64
|
-
*/
|
|
65
|
-
function parseShellcheckOutput(raw, filePath, cwd) {
|
|
66
|
-
const diagnostics = [];
|
|
67
|
-
const absTarget = path.resolve(cwd, filePath);
|
|
68
|
-
if (!raw.trim()) {
|
|
69
|
-
return diagnostics;
|
|
70
|
-
}
|
|
71
|
-
try {
|
|
72
|
-
const parsed = JSON.parse(raw);
|
|
73
|
-
if (!Array.isArray(parsed)) {
|
|
74
|
-
return diagnostics;
|
|
75
|
-
}
|
|
76
|
-
for (const item of parsed) {
|
|
77
|
-
if (!item.message || !item.line)
|
|
78
|
-
continue;
|
|
79
|
-
if (!item.file || !pathsEqual(path.resolve(cwd, item.file), absTarget))
|
|
80
|
-
continue;
|
|
81
|
-
// Map shellcheck levels to our severity
|
|
82
|
-
const severityMap = {
|
|
83
|
-
error: "error",
|
|
84
|
-
warning: "warning",
|
|
85
|
-
info: "info",
|
|
86
|
-
style: "info",
|
|
87
|
-
};
|
|
88
|
-
const severity = severityMap[item.level || "warning"] || "warning";
|
|
89
|
-
const ruleCode = item.code ? `SC${item.code}` : "unknown";
|
|
90
|
-
diagnostics.push({
|
|
91
|
-
id: `shellcheck-${item.line}-${ruleCode}`,
|
|
92
|
-
message: `[${ruleCode}] ${item.message}`,
|
|
93
|
-
filePath,
|
|
94
|
-
line: item.line,
|
|
95
|
-
column: item.column || 1,
|
|
96
|
-
severity,
|
|
97
|
-
semantic: severity === "error" ? "blocking" : "warning",
|
|
98
|
-
tool: "shellcheck",
|
|
99
|
-
rule: ruleCode,
|
|
100
|
-
fixable: !!item.fix,
|
|
101
|
-
autoFixAvailable: false,
|
|
102
|
-
fixKind: item.fix ? "suggestion" : undefined,
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
catch {
|
|
107
|
-
// JSON parse failed, return empty
|
|
108
|
-
return diagnostics;
|
|
109
|
-
}
|
|
110
|
-
return diagnostics;
|
|
111
|
-
}
|
|
112
|
-
const shellcheckRunner = {
|
|
113
|
-
id: "shellcheck",
|
|
114
|
-
appliesTo: ["shell"],
|
|
115
|
-
priority: PRIORITY.GENERAL_ANALYSIS,
|
|
116
|
-
skipTestFiles: false, // Shell scripts in test directories should still be checked
|
|
117
|
-
async run(ctx) {
|
|
118
|
-
const cwd = resolveRunnerCwd(ctx, "shellcheck");
|
|
119
|
-
// #233: bash-language-server runs shellcheck internally. When the `bash` LSP
|
|
120
|
-
// covers this file AND shellcheck is on PATH (so the LSP actually emits its
|
|
121
|
-
// findings), the warm server already produces these diagnostics — skip the
|
|
122
|
-
// redundant CLI scan. Stays active when the LSP or shellcheck is absent so
|
|
123
|
-
// shell coverage never regresses.
|
|
124
|
-
if (lspPrimaryCoversFile(ctx, "bash") &&
|
|
125
|
-
(await ctx.hasTool("bash-language-server")) &&
|
|
126
|
-
(await ctx.hasTool("shellcheck"))) {
|
|
127
|
-
return { status: "skipped", diagnostics: [], semantic: "none" };
|
|
128
|
-
}
|
|
129
|
-
let cmd = null;
|
|
130
|
-
if (await shellcheck.isAvailableAsync(cwd)) {
|
|
131
|
-
cmd = shellcheck.getCommand(cwd);
|
|
132
|
-
}
|
|
133
|
-
else {
|
|
134
|
-
const managed = await resolveAvailableOrInstall(shellcheck, "shellcheck", cwd);
|
|
135
|
-
if (managed)
|
|
136
|
-
cmd = managed;
|
|
137
|
-
}
|
|
138
|
-
if (!cmd)
|
|
139
|
-
return { status: "skipped", diagnostics: [], semantic: "none" };
|
|
140
|
-
// Determine shell dialect from file extension (all map to bash for shellcheck)
|
|
141
|
-
const shellDialect = "bash";
|
|
142
|
-
// Build args
|
|
143
|
-
// --format json: JSON output
|
|
144
|
-
// --shell: Specify shell dialect (bash, sh, zsh, ksh, busybox)
|
|
145
|
-
// --severity: Minimum severity (we'll filter ourselves)
|
|
146
|
-
const args = ["--format", "json", "--shell", shellDialect];
|
|
147
|
-
// Check for config file
|
|
148
|
-
const configPath = findShellcheckConfig(ctx.cwd);
|
|
149
|
-
if (!configPath) {
|
|
150
|
-
// No config file: surface `info`-level findings (e.g. SC2086
|
|
151
|
-
// double-quote-to-prevent-globbing — a high-value, commonly-relevant
|
|
152
|
-
// check that was previously dropped, #213) while still excluding pure
|
|
153
|
-
// `style` rules to limit noise. Projects opt into style via .shellcheckrc.
|
|
154
|
-
args.push("--severity", "info");
|
|
155
|
-
}
|
|
156
|
-
args.push(ctx.filePath);
|
|
157
|
-
const result = await safeSpawnAsync(cmd, args, { cwd, timeout: 15000 });
|
|
158
|
-
// shellcheck exits with code 1 if issues found, 0 if clean
|
|
159
|
-
if (result.status === 0 && !result.stdout?.trim()) {
|
|
160
|
-
return { status: "succeeded", diagnostics: [], semantic: "none" };
|
|
161
|
-
}
|
|
162
|
-
// Parse diagnostics
|
|
163
|
-
const raw = result.stdout + result.stderr;
|
|
164
|
-
const diagnostics = parseShellcheckOutput(raw, ctx.filePath, cwd);
|
|
165
|
-
return finishParsedRun({
|
|
166
|
-
tool: "shellcheck",
|
|
167
|
-
ctx,
|
|
168
|
-
result,
|
|
169
|
-
diagnostics,
|
|
170
|
-
});
|
|
171
|
-
},
|
|
172
|
-
};
|
|
173
|
-
export default shellcheckRunner;
|