pi-lens 2.2.10 → 3.0.1

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 (304) hide show
  1. package/CHANGELOG.md +198 -0
  2. package/README.md +711 -519
  3. package/clients/__tests__/file-time.test.js +216 -0
  4. package/clients/__tests__/file-time.test.ts +276 -0
  5. package/clients/__tests__/format-service.test.js +245 -0
  6. package/clients/__tests__/format-service.test.ts +339 -0
  7. package/clients/__tests__/formatters.test.js +271 -0
  8. package/clients/__tests__/formatters.test.ts +401 -0
  9. package/clients/amain-types.js +164 -0
  10. package/clients/amain-types.ts +165 -0
  11. package/clients/architect-client.js +56 -12
  12. package/clients/architect-client.ts +81 -16
  13. package/clients/ast-grep-client.js +2 -2
  14. package/clients/ast-grep-client.ts +14 -39
  15. package/clients/ast-grep-parser.ts +1 -1
  16. package/clients/ast-grep-rule-manager.js +8 -0
  17. package/clients/ast-grep-rule-manager.ts +10 -1
  18. package/clients/ast-grep-types.js +9 -0
  19. package/clients/ast-grep-types.ts +106 -0
  20. package/clients/auto-loop.js +10 -0
  21. package/clients/auto-loop.ts +14 -1
  22. package/clients/biome-client.js +81 -19
  23. package/clients/biome-client.ts +103 -22
  24. package/clients/bus/bus.js +191 -0
  25. package/clients/bus/bus.ts +251 -0
  26. package/clients/bus/events.js +214 -0
  27. package/clients/bus/events.ts +279 -0
  28. package/clients/bus/index.js +8 -0
  29. package/clients/bus/index.ts +9 -0
  30. package/clients/bus/integration.js +158 -0
  31. package/clients/bus/integration.ts +214 -0
  32. package/clients/complexity-client.js +20 -11
  33. package/clients/complexity-client.ts +20 -11
  34. package/clients/config-validator.js +465 -0
  35. package/clients/config-validator.ts +558 -0
  36. package/clients/dependency-checker.js +4 -10
  37. package/clients/dependency-checker.ts +4 -10
  38. package/clients/dispatch/__tests__/autofix-integration.test.js +245 -0
  39. package/clients/dispatch/__tests__/autofix-integration.test.ts +300 -0
  40. package/clients/dispatch/__tests__/runner-registration.test.js +236 -0
  41. package/clients/dispatch/__tests__/runner-registration.test.ts +282 -0
  42. package/clients/dispatch/bus-dispatcher.js +177 -0
  43. package/clients/dispatch/bus-dispatcher.ts +251 -0
  44. package/clients/dispatch/dispatcher.edge.test.js +82 -0
  45. package/clients/dispatch/dispatcher.edge.test.ts +100 -0
  46. package/clients/dispatch/dispatcher.format.test.js +46 -0
  47. package/clients/dispatch/dispatcher.format.test.ts +58 -0
  48. package/clients/dispatch/dispatcher.inline.test.js +74 -0
  49. package/clients/dispatch/dispatcher.inline.test.ts +93 -0
  50. package/clients/dispatch/dispatcher.js +19 -53
  51. package/clients/dispatch/dispatcher.ts +20 -67
  52. package/clients/dispatch/plan.js +9 -4
  53. package/clients/dispatch/plan.ts +9 -4
  54. package/clients/dispatch/runners/architect.js +21 -7
  55. package/clients/dispatch/runners/architect.test.js +138 -0
  56. package/clients/dispatch/runners/architect.test.ts +162 -0
  57. package/clients/dispatch/runners/architect.ts +22 -7
  58. package/clients/dispatch/runners/ast-grep-napi.js +462 -0
  59. package/clients/dispatch/runners/ast-grep-napi.test.js +111 -0
  60. package/clients/dispatch/runners/ast-grep-napi.test.ts +133 -0
  61. package/clients/dispatch/runners/ast-grep-napi.ts +506 -0
  62. package/clients/dispatch/runners/ast-grep.js +62 -19
  63. package/clients/dispatch/runners/ast-grep.ts +70 -18
  64. package/clients/dispatch/runners/biome.js +29 -53
  65. package/clients/dispatch/runners/biome.ts +29 -63
  66. package/clients/dispatch/runners/config-validation.js +67 -0
  67. package/clients/dispatch/runners/config-validation.ts +82 -0
  68. package/clients/dispatch/runners/go-vet.js +4 -28
  69. package/clients/dispatch/runners/go-vet.ts +4 -32
  70. package/clients/dispatch/runners/index.js +30 -10
  71. package/clients/dispatch/runners/index.ts +30 -10
  72. package/clients/dispatch/runners/oxlint.js +141 -0
  73. package/clients/dispatch/runners/oxlint.test.js +230 -0
  74. package/clients/dispatch/runners/oxlint.test.ts +303 -0
  75. package/clients/dispatch/runners/oxlint.ts +175 -0
  76. package/clients/dispatch/runners/pyright.js +40 -70
  77. package/clients/dispatch/runners/pyright.test.js +16 -2
  78. package/clients/dispatch/runners/pyright.test.ts +14 -2
  79. package/clients/dispatch/runners/pyright.ts +48 -91
  80. package/clients/dispatch/runners/python-slop.js +97 -0
  81. package/clients/dispatch/runners/python-slop.test.js +203 -0
  82. package/clients/dispatch/runners/python-slop.test.ts +298 -0
  83. package/clients/dispatch/runners/python-slop.ts +124 -0
  84. package/clients/dispatch/runners/ruff.js +18 -71
  85. package/clients/dispatch/runners/ruff.ts +19 -79
  86. package/clients/dispatch/runners/rust-clippy.js +28 -32
  87. package/clients/dispatch/runners/rust-clippy.ts +29 -31
  88. package/clients/dispatch/runners/scan_codebase.test.js +89 -0
  89. package/clients/dispatch/runners/scan_codebase.test.ts +105 -0
  90. package/clients/dispatch/runners/shellcheck.js +147 -0
  91. package/clients/dispatch/runners/shellcheck.test.js +98 -0
  92. package/clients/dispatch/runners/shellcheck.test.ts +129 -0
  93. package/clients/dispatch/runners/shellcheck.ts +188 -0
  94. package/clients/dispatch/runners/similarity.js +230 -0
  95. package/clients/dispatch/runners/similarity.ts +339 -0
  96. package/clients/dispatch/runners/spellcheck.js +106 -0
  97. package/clients/dispatch/runners/spellcheck.test.js +158 -0
  98. package/clients/dispatch/runners/spellcheck.test.ts +214 -0
  99. package/clients/dispatch/runners/spellcheck.ts +136 -0
  100. package/clients/dispatch/runners/tree-sitter.js +107 -0
  101. package/clients/dispatch/runners/tree-sitter.ts +135 -0
  102. package/clients/dispatch/runners/ts-lsp.js +104 -33
  103. package/clients/dispatch/runners/ts-lsp.ts +120 -38
  104. package/clients/dispatch/runners/ts-slop.js +113 -0
  105. package/clients/dispatch/runners/ts-slop.test.js +180 -0
  106. package/clients/dispatch/runners/ts-slop.test.ts +230 -0
  107. package/clients/dispatch/runners/ts-slop.ts +142 -0
  108. package/clients/dispatch/runners/utils/diagnostic-parsers.js +134 -0
  109. package/clients/dispatch/runners/utils/diagnostic-parsers.ts +186 -0
  110. package/clients/dispatch/runners/utils/runner-helpers.js +115 -0
  111. package/clients/dispatch/runners/utils/runner-helpers.ts +167 -0
  112. package/clients/dispatch/runners/utils.js +2 -4
  113. package/clients/dispatch/runners/utils.ts +2 -4
  114. package/clients/dispatch/types.ts +1 -1
  115. package/clients/dispatch/utils/format-utils.js +49 -0
  116. package/clients/dispatch/utils/format-utils.ts +60 -0
  117. package/clients/dogfood.test.js +201 -0
  118. package/clients/dogfood.test.ts +269 -0
  119. package/clients/file-time.js +152 -0
  120. package/clients/file-time.ts +208 -0
  121. package/clients/file-utils.js +40 -0
  122. package/clients/file-utils.ts +44 -0
  123. package/clients/fix-scanners.js +10 -20
  124. package/clients/fix-scanners.ts +10 -22
  125. package/clients/format-service.js +172 -0
  126. package/clients/format-service.ts +254 -0
  127. package/clients/formatters.js +435 -0
  128. package/clients/formatters.ts +508 -0
  129. package/clients/go-client.js +5 -14
  130. package/clients/go-client.ts +5 -13
  131. package/clients/installer/index.js +356 -0
  132. package/clients/installer/index.ts +426 -0
  133. package/clients/jscpd-client.js +11 -9
  134. package/clients/jscpd-client.ts +12 -8
  135. package/clients/knip-client.js +3 -7
  136. package/clients/knip-client.ts +3 -6
  137. package/clients/lsp/__tests__/client.test.js +325 -0
  138. package/clients/lsp/__tests__/client.test.ts +434 -0
  139. package/clients/lsp/__tests__/config.test.js +166 -0
  140. package/clients/lsp/__tests__/config.test.ts +209 -0
  141. package/clients/lsp/__tests__/error-recovery.test.js +213 -0
  142. package/clients/lsp/__tests__/error-recovery.test.ts +279 -0
  143. package/clients/lsp/__tests__/integration.test.js +127 -0
  144. package/clients/lsp/__tests__/integration.test.ts +160 -0
  145. package/clients/lsp/__tests__/launch.test.js +260 -0
  146. package/clients/lsp/__tests__/launch.test.ts +329 -0
  147. package/clients/lsp/__tests__/server.test.js +259 -0
  148. package/clients/lsp/__tests__/server.test.ts +332 -0
  149. package/clients/lsp/__tests__/service.test.js +417 -0
  150. package/clients/lsp/__tests__/service.test.ts +499 -0
  151. package/clients/lsp/client.js +235 -0
  152. package/clients/lsp/client.ts +328 -0
  153. package/clients/lsp/config.js +115 -0
  154. package/clients/lsp/config.ts +149 -0
  155. package/clients/lsp/index.js +222 -0
  156. package/clients/lsp/index.ts +280 -0
  157. package/clients/lsp/installer/index.js +391 -0
  158. package/clients/lsp/interactive-install.js +210 -0
  159. package/clients/lsp/interactive-install.ts +251 -0
  160. package/clients/lsp/language.js +170 -0
  161. package/clients/lsp/language.ts +216 -0
  162. package/clients/lsp/launch.js +174 -0
  163. package/clients/lsp/launch.ts +240 -0
  164. package/clients/lsp/lsp/launch.js +116 -0
  165. package/clients/lsp/lsp/server.js +532 -0
  166. package/clients/lsp/lsp-index.js +10 -0
  167. package/clients/lsp/lsp-index.ts +11 -0
  168. package/clients/lsp/path-utils.js +48 -0
  169. package/clients/lsp/path-utils.ts +52 -0
  170. package/clients/lsp/server.js +615 -0
  171. package/clients/lsp/server.ts +800 -0
  172. package/clients/lsp/test-py-spawn/requirements.txt +1 -0
  173. package/clients/lsp/test-py-spawn/test.py +3 -0
  174. package/clients/lsp/test-py-svc/requirements.txt +1 -0
  175. package/clients/lsp/test-py-svc/test.py +3 -0
  176. package/clients/lsp/test-python-project/requirements.txt +1 -0
  177. package/clients/lsp/test-python-project/test.py +5 -0
  178. package/clients/metrics-history.js +2 -2
  179. package/clients/metrics-history.ts +2 -2
  180. package/clients/production-readiness.js +522 -0
  181. package/clients/production-readiness.ts +556 -0
  182. package/clients/project-index.js +255 -0
  183. package/clients/project-index.ts +383 -0
  184. package/clients/project-metadata.js +531 -0
  185. package/clients/project-metadata.ts +624 -0
  186. package/clients/ruff-client.js +56 -16
  187. package/clients/ruff-client.ts +72 -15
  188. package/clients/runner-tracker.js +152 -0
  189. package/clients/runner-tracker.ts +213 -0
  190. package/clients/rust-client.js +4 -11
  191. package/clients/rust-client.ts +5 -11
  192. package/clients/safe-spawn.js +96 -0
  193. package/clients/safe-spawn.ts +128 -0
  194. package/clients/scan-architectural-debt.js +3 -6
  195. package/clients/scan-architectural-debt.ts +3 -6
  196. package/clients/scan-utils.js +5 -20
  197. package/clients/scan-utils.ts +5 -29
  198. package/clients/secrets-scanner.js +3 -17
  199. package/clients/secrets-scanner.ts +4 -20
  200. package/clients/services/__tests__/effect-integration.test.js +86 -0
  201. package/clients/services/__tests__/effect-integration.test.ts +111 -0
  202. package/clients/services/effect-integration.js +194 -0
  203. package/clients/services/effect-integration.ts +268 -0
  204. package/clients/services/index.js +7 -0
  205. package/clients/services/index.ts +8 -0
  206. package/clients/services/runner-service.js +105 -0
  207. package/clients/services/runner-service.ts +179 -0
  208. package/clients/sg-runner.js +87 -13
  209. package/clients/sg-runner.ts +97 -13
  210. package/clients/state-matrix.js +160 -0
  211. package/clients/state-matrix.ts +202 -0
  212. package/clients/subprocess-client.js +10 -9
  213. package/clients/subprocess-client.ts +10 -8
  214. package/clients/test-runner-client.js +3 -7
  215. package/clients/test-runner-client.ts +3 -6
  216. package/clients/tool-availability.js +4 -10
  217. package/clients/tool-availability.ts +4 -9
  218. package/clients/tree-sitter-client.js +564 -0
  219. package/clients/tree-sitter-client.ts +797 -0
  220. package/clients/tree-sitter-query-loader.js +355 -0
  221. package/clients/tree-sitter-query-loader.ts +425 -0
  222. package/clients/type-coverage-client.js +3 -7
  223. package/clients/type-coverage-client.ts +3 -6
  224. package/clients/typescript-client.codefix.test.js +157 -0
  225. package/clients/typescript-client.codefix.test.ts +186 -0
  226. package/clients/typescript-client.js +43 -0
  227. package/clients/typescript-client.ts +98 -0
  228. package/commands/booboo.js +799 -219
  229. package/commands/booboo.ts +1004 -225
  230. package/commands/clients/ast-grep-client.js +250 -0
  231. package/commands/clients/ast-grep-parser.js +86 -0
  232. package/commands/clients/ast-grep-rule-manager.js +91 -0
  233. package/commands/clients/ast-grep-types.js +9 -0
  234. package/commands/clients/biome-client.js +380 -0
  235. package/commands/clients/complexity-client.js +667 -0
  236. package/commands/clients/file-kinds.js +177 -0
  237. package/commands/clients/file-utils.js +40 -0
  238. package/commands/clients/jscpd-client.js +169 -0
  239. package/commands/clients/knip-client.js +211 -0
  240. package/commands/clients/ruff-client.js +297 -0
  241. package/commands/clients/safe-spawn.js +88 -0
  242. package/commands/clients/scan-utils.js +83 -0
  243. package/commands/clients/sg-runner.js +190 -0
  244. package/commands/clients/types.js +11 -0
  245. package/commands/clients/typescript-client.js +505 -0
  246. package/commands/fix-from-booboo.js +398 -0
  247. package/commands/fix-from-booboo.ts +485 -0
  248. package/commands/fix-simplified.js +618 -0
  249. package/commands/fix-simplified.ts +768 -0
  250. package/commands/rate.js +6 -25
  251. package/commands/rate.ts +6 -30
  252. package/default-architect.yaml +59 -15
  253. package/index.ts +342 -429
  254. package/package.json +16 -3
  255. package/rules/ast-grep-rules/rules/empty-catch.yml +38 -13
  256. package/rules/ast-grep-rules/rules/no-array-constructor.yml +1 -0
  257. package/rules/ast-grep-rules/rules/no-debugger.yml +2 -0
  258. package/rules/python-slop-rules/.sgconfig.yml +4 -0
  259. package/rules/python-slop-rules/rules/slop-rules.yml +647 -0
  260. package/rules/tree-sitter-queries/python/bare-except.yml +54 -0
  261. package/rules/tree-sitter-queries/python/eval-exec.yml +50 -0
  262. package/rules/tree-sitter-queries/python/is-vs-equals.yml +60 -0
  263. package/rules/tree-sitter-queries/python/mutable-default-arg.yml +57 -0
  264. package/rules/tree-sitter-queries/python/unreachable-except.yml +60 -0
  265. package/rules/tree-sitter-queries/python/wildcard-import.yml +46 -0
  266. package/rules/tree-sitter-queries/tsx/dangerously-set-inner-html.yml +63 -0
  267. package/rules/tree-sitter-queries/typescript/await-in-loop.yml +56 -0
  268. package/rules/tree-sitter-queries/typescript/console-statement.yml +47 -0
  269. package/rules/tree-sitter-queries/typescript/debugger.yml +47 -0
  270. package/rules/tree-sitter-queries/typescript/deep-nesting.yml +117 -0
  271. package/rules/tree-sitter-queries/typescript/deep-promise-chain.yml +73 -0
  272. package/rules/tree-sitter-queries/typescript/empty-catch.yml +64 -0
  273. package/rules/tree-sitter-queries/typescript/eval.yml +48 -0
  274. package/rules/tree-sitter-queries/typescript/hardcoded-secrets.yml +78 -0
  275. package/rules/tree-sitter-queries/typescript/long-parameter-list.yml +62 -0
  276. package/rules/tree-sitter-queries/typescript/mixed-async-styles.yml +49 -0
  277. package/rules/tree-sitter-queries/typescript/nested-ternary.yml +45 -0
  278. package/rules/ts-slop-rules/.sgconfig.yml +4 -0
  279. package/rules/ts-slop-rules/rules/in-correct-optional-input-type.yml +10 -0
  280. package/rules/ts-slop-rules/rules/jwt-no-verify.yml +13 -0
  281. package/rules/ts-slop-rules/rules/no-architecture-violation.yml +10 -0
  282. package/rules/ts-slop-rules/rules/no-case-declarations.yml +10 -0
  283. package/rules/ts-slop-rules/rules/no-dangerously-set-inner-html.yml +10 -0
  284. package/rules/ts-slop-rules/rules/no-debugger.yml +10 -0
  285. package/rules/ts-slop-rules/rules/no-dupe-args.yml +10 -0
  286. package/rules/ts-slop-rules/rules/no-dupe-class-members.yml +10 -0
  287. package/rules/ts-slop-rules/rules/no-dupe-keys.yml +10 -0
  288. package/rules/ts-slop-rules/rules/no-eval.yml +13 -0
  289. package/rules/ts-slop-rules/rules/no-hardcoded-secrets.yml +12 -0
  290. package/rules/ts-slop-rules/rules/no-implied-eval.yml +12 -0
  291. package/rules/ts-slop-rules/rules/no-inner-html.yml +13 -0
  292. package/rules/ts-slop-rules/rules/no-javascript-url.yml +10 -0
  293. package/rules/ts-slop-rules/rules/no-mutable-default.yml +10 -0
  294. package/rules/ts-slop-rules/rules/no-nested-links.yml +12 -0
  295. package/rules/ts-slop-rules/rules/no-new-symbol.yml +10 -0
  296. package/rules/ts-slop-rules/rules/no-new-wrappers.yml +13 -0
  297. package/rules/ts-slop-rules/rules/no-open-redirect.yml +16 -0
  298. package/rules/ts-slop-rules/rules/slop-rules.yml +455 -0
  299. package/rules/ts-slop-rules/rules/weak-rsa-key.yml +12 -0
  300. package/skills/ast-grep/SKILL.md +182 -0
  301. package/clients/dispatch/runners/secrets.js +0 -109
  302. package/commands/fix.js +0 -244
  303. package/commands/fix.ts +0 -373
  304. package/rules/ast-grep-rules/rules/no-lonely-if.yml +0 -13
package/CHANGELOG.md CHANGED
@@ -2,6 +2,204 @@
2
2
 
3
3
  All notable changes to pi-lens will be documented in this file.
4
4
 
5
+ ## [2.7.0] - 2026-03-31
6
+
7
+ ### Added - New Lint Runners
8
+
9
+ Three new lint runners with full test coverage:
10
+
11
+ - **Spellcheck runner** (`clients/dispatch/runners/spellcheck.ts`): Markdown spellchecking
12
+ - Uses `typos-cli` (Rust-based, fast, low false positives)
13
+ - Checks `.md` and `.mdx` files
14
+ - Priority 30, runs after code quality checks
15
+ - Zero-config by default
16
+ - Install: `cargo install typos-cli`
17
+
18
+ - **Oxlint runner** (`clients/dispatch/runners/oxlint.ts`): Fast JS/TS linting
19
+ - Uses `oxlint` from Oxc project (Rust-based, ~100x faster than ESLint)
20
+ - Zero-config by default
21
+ - JSON output with fix suggestions
22
+ - Priority 12 (between biome=10 and slop=25)
23
+ - Fallback mode after biome
24
+ - Install: `npm install -D oxlint` or `cargo install oxlint`
25
+ - Flag: `--no-oxlint` to disable
26
+
27
+ - **Shellcheck runner** (`clients/dispatch/runners/shellcheck.ts`): Shell script linting
28
+ - Industry-standard linter for bash/sh/zsh/fish
29
+ - Detects syntax errors, undefined variables, quoting issues
30
+ - Priority 20 (same as type-safety)
31
+ - JSON output parsing
32
+ - Install: `apt install shellcheck`, `brew install shellcheck`, or `cargo install shellcheck`
33
+ - Flag: `--no-shellcheck` to disable
34
+
35
+ ### Changed
36
+ - Updated README.md with new runners in dispatcher diagram and available runners table
37
+ - Added installation instructions for new tools in Dependent Tools section
38
+ - Added new flags to Flag Reference
39
+
40
+ ---
41
+
42
+ ## [2.6.0] - 2026-03-30
43
+
44
+ ### Added - Phase 1: Event Bus Architecture
45
+ - **Event Bus System** (`clients/bus/`): Decoupled pub/sub for diagnostic events
46
+ - `bus.ts` — Core publish/subscribe with `once()`, `waitFor()`, middleware support
47
+ - `events.ts` — 12 typed event definitions (DiagnosticFound, RunnerStarted, LspDiagnostic, etc.)
48
+ - `integration.ts` — Integration hooks for pi-lens index.ts with aggregator state
49
+ - **Bus-integrated dispatcher** (`clients/dispatch/bus-dispatcher.ts`): Concurrent runner execution with event publishing
50
+ - **New flags**: `--lens-bus`, `--lens-bus-debug` for event system control
51
+
52
+ ### Added - Phase 2: Effect-TS Service Layer
53
+ - **Effect-TS infrastructure** (`clients/services/`): Composable async operations
54
+ - `runner-service.ts` — Concurrent runner execution with timeout handling
55
+ - `effect-integration.ts` — Bus-integrated Effect dispatch
56
+ - **Structured concurrency**: `Effect.all()` with `{ concurrency: "unbounded" }`
57
+ - **Graceful error recovery**: Individual runner failures don't stop other runners
58
+ - **New flag**: `--lens-effect` for concurrent execution
59
+
60
+ ### Added - Phase 3: Multi-LSP Client (31 Language Servers)
61
+ - **LSP Core** (`clients/lsp/`): Full Language Server Protocol support
62
+ - `client.ts` — JSON-RPC client with debounced diagnostics (150ms)
63
+ - `server.ts` — 31 LSP server definitions with root detection
64
+ - `language.ts` — File extension to LSP language ID mappings
65
+ - `launch.ts` — LSP process spawning utilities
66
+ - `index.ts` — Service layer with Effect integration
67
+ - `config.ts` — Custom LSP configuration support (`.pi-lens/lsp.json`)
68
+ - **Built-in servers** (31 total):
69
+ - Core: TypeScript, Python, Go, Rust, Ruby, PHP, C#, F#, Java, Kotlin
70
+ - Native: C/C++, Zig, Swift, Dart, Haskell, OCaml, Lua
71
+ - Functional: Elixir, Gleam, Clojure
72
+ - DevOps: Terraform, Nix, Docker, Bash
73
+ - Config: YAML, JSON, Prisma
74
+ - Web (NEW): Vue, Svelte, ESLint, CSS/SCSS/Sass/Less
75
+ - **Smart root detection**: `createRootDetector()` walks up tree looking for lockfiles/config
76
+ - **Multi-server support**: Multiple LSP servers can handle same file type
77
+ - **Debounced diagnostics**: 150ms debounce for cascading diagnostics (syntax → semantic)
78
+ - **New flag**: `--lens-lsp` to enable LSP system
79
+ - **Deprecated**: Old `ts-lsp` runner falls back to built-in TypeScriptClient when `--lens-lsp` not set
80
+
81
+ ### Added - Phase 4: Auto-Installation System
82
+ - **Auto-installer** (`clients/installer/`): Automatic tool installation
83
+ - `index.ts` — Core installation logic for npm/pip packages
84
+ - `isToolInstalled()` — Check global PATH or local `.pi-lens/tools/`
85
+ - `installTool()` — Auto-install via npm or pip
86
+ - `ensureTool()` — Check first, install if missing
87
+ - **Auto-installation for**: typescript-language-server, pyright, ruff, biome, ast-grep
88
+ - **Local tools directory**: `.pi-lens/tools/node_modules/.bin/`
89
+ - **PATH integration**: Local tools automatically added to PATH
90
+ - **LSP integration**: TypeScript and Python servers now use `ensureTool()` before spawning
91
+
92
+ ### Changed - Commands
93
+ - **Disabled**: `/lens-booboo-fix` — Now shows warning "currently disabled. Use /lens-booboo"
94
+ - **Disabled**: `/lens-booboo-delta` — Now shows warning "currently disabled. Use /lens-booboo"
95
+ - **Disabled**: `/lens-booboo-refactor` — Now shows warning "currently disabled. Use /lens-booboo"
96
+ - **Active**: `/lens-booboo` — Full codebase review (only booboo command now)
97
+
98
+ ### Changed - Architecture
99
+ - **Three-phase system**: Bus → Effect → LSP can be enabled independently
100
+ - **Dispatcher priority**: `lens-effect` > `lens-bus` > default (sequential)
101
+ - **LSP deprecation**: Old built-in TypeScriptClient deprecated, LSP client preferred
102
+
103
+ ### Documentation
104
+ - **LSP configuration guide**: `docs/LSP_CONFIG.md` — How to add custom LSP servers
105
+ - **README updated**: Added LSP section, three-phase architecture, 31 language matrix
106
+ - **CHANGELOG restructured**: Now organized by Phase 1/2/3/4
107
+
108
+ ### Technical Details
109
+ - **New dependencies**: `effect` (Phase 2), `vscode-jsonrpc` (Phase 3)
110
+ - **Lines added**: ~6,000 across 4 phases
111
+ - **Test status**: 617 passing (3 flaky unrelated tests)
112
+ - **Backward compatibility**: All new features opt-in via flags
113
+
114
+ ## [2.5.0] - 2026-03-30
115
+
116
+ ### Added
117
+ - **Python tree-sitter support**: 6 structural patterns for Python code analysis
118
+ - `bare-except` — Detects `except:` that catches SystemExit/KeyboardInterrupt
119
+ - `mutable-default-arg` — Detects mutable defaults like `def f(x=[])`
120
+ - `wildcard-import` — Detects `from module import *`
121
+ - `eval-exec` — Detects `eval()` and `exec()` security risks
122
+ - `is-vs-equals` — Detects `is "literal"` that should use `==`
123
+ - `unreachable-except` — Detects unreachable exception handlers
124
+ - **Multi-language tree-sitter architecture**: Query files in `rules/tree-sitter-queries/{language}/`
125
+ - TypeScript/TSX: 10 patterns
126
+ - Python: 6 patterns
127
+ - **Tree-sitter query loader**: YAML-based query definitions with multi-line array support
128
+ - **Query file extraction**: Moved TypeScript patterns from embedded code to `rules/tree-sitter-queries/typescript/*.yml`
129
+
130
+ ### Changed
131
+ - **README updated**: Added Python patterns to structural analysis section
132
+ - **Architect client**: Fixed TypeScript errors (`configPath` property declaration)
133
+
134
+ ### Technical Details
135
+ - Downloaded `tree-sitter-python.wasm` (458KB) for Python AST parsing
136
+ - Post-filters for semantic validation (e.g., distinguishing bare except from specific handlers)
137
+ - ~50ms analysis time per file for Python
138
+
139
+ ## [2.4.0] - 2026-03-30
140
+
141
+ ### Added
142
+ - **`safeSpawn` utility**: Cross-platform spawn wrapper that eliminates `DEP0190` deprecation warnings on Windows. Uses command string construction instead of shell+args array.
143
+ - **Runner tracking for `/lens-booboo`**: Each runner now reports execution time and findings count. Summary shows `[1/10] runner name...` progress and final table with `| Runner | Status | Findings | Time |`.
144
+ - **Shared runner utilities**: Extracted `runner-helpers.ts` with:
145
+ - `createAvailabilityChecker()` - cached tool availability checks
146
+ - `createConfigFinder()` - rule directory resolution
147
+ - `createVenvFinder()` - venv-aware command lookup
148
+ - Shared `isSgAvailable()` for ast-grep
149
+ - **Shared diagnostic parsers**: Extracted `diagnostic-parsers.ts` with:
150
+ - `createLineParser()` - factory for line-based tool output
151
+ - `parseRuffOutput`, `parseGoVetOutput`, `createBiomeParser()` - pre-built parsers
152
+ - `createSimpleParser()` - simplified factory for standard formats
153
+ - **Architect test coverage**: 5 new tests for the architect runner (config loading, size limits, pattern detection, test file exclusion).
154
+ - **Type extraction**: Created `clients/ast-grep-types.ts` to break circular dependencies between `ast-grep-client`, `ast-grep-parser`, and `ast-grep-rule-manager`.
155
+
156
+ ### Changed
157
+ - **26 files refactored to use `safeSpawn`**: Eliminated `shell: process.platform === "win32"` deprecation pattern across all clients and runners.
158
+ - **Updated runners to use shared utilities**:
159
+ - `ruff.ts`, `pyright.ts` → use `createAvailabilityChecker()`
160
+ - `python-slop.ts`, `ts-slop.ts` → use `createConfigFinder()` and shared `isSgAvailable()`
161
+ - `ruff.ts`, `go-vet.ts`, `biome.ts` → use shared diagnostic parsers
162
+ - **Architect runner improvements**:
163
+ - Added `skipTestFiles: true` to reduce noise from test files
164
+ - Updated `default-architect.yaml` with per-file-type limits (500 services, 1000 clients, 5000 tests)
165
+ - Removed `no process.env` rule (too strict for CLI tools)
166
+ - Relaxed `console.log` rule to only apply to `src/` and `lib/` directories
167
+ - **Test cleanup safety**: Fixed all test files to use `fs.existsSync()` before `fs.unlinkSync()` to prevent ENOENT errors.
168
+
169
+ ### Fixed
170
+ - **Circular dependencies**: Eliminated 2 cycles (`ast-grep-client` ↔ `ast-grep-parser`, `ast-grep-client` ↔ `ast-grep-rule-manager`) by extracting shared types.
171
+ - **Test flakiness**: All 70 test files now pass consistently (666 tests total).
172
+
173
+ ### Code Quality
174
+ - **Lines saved**: ~350 lines of duplicated code removed across utilities and parsers.
175
+ - **Architect violations**: Reduced from 404 to ~50-80 (after test file exclusion + relaxed rules).
176
+
177
+ ## [2.3.0] - 2026-03-30
178
+
179
+ ### Added
180
+ - **NAPI-based runner (`ast-grep-napi`)**: 100x faster TypeScript/JavaScript analysis (~9ms vs ~1200ms). Uses `@ast-grep/napi` for native-speed structural pattern matching. Priority 15, applies to TS/JS files only.
181
+ - **Python slop detection (`python-slop`)**: New CLI runner with ~40 AI slop patterns from slop-code-bench research. Detects chained comparisons, manual min/max, redundant if/else, list comprehension opportunities, etc.
182
+ - **TypeScript slop detection (`ts-slop-rules`)**: ~30 patterns for TS/JS slop detection including `for-index-length`, `empty-array-check`, `redundant-filter-map`, `double-negation`, `unnecessary-array-from`.
183
+ - **`fix-simplified.ts` command**: New streamlined `/lens-booboo-fix` implementation with file-level exclusions (test files, excluded dirs) and anti-slop guidance. Uses `pi.sendUserMessage()` for actionable AI prompts.
184
+ - **Comprehensive test coverage**: 25+ tests added across all runners (NAPI, Python slop, TS slop, YAML loading).
185
+ - **Codebase self-scan**: `scan_codebase.test.ts` for testing the NAPI runner against the pi-lens codebase itself.
186
+
187
+ ### Changed
188
+ - **Architecture documentation**: Updated README with complete architecture overview, runner system diagram, and language support matrix.
189
+ - **Disabled problematic slop rules**: `ts-for-index-length` and `ts-unnecessary-array-isarray` disabled due to false positives on legitimate index-based operations.
190
+ - **Runner registration**: Updated `clients/dispatch/runners/index.ts` with new runner priorities (ts-lsp/pyright at 5, ast-grep-napi at 15, python-slop at 25).
191
+ - **TS slop runner disabled**: CLI runner `ts-slop.ts` disabled in favor of NAPI-based detection (faster, same rules).
192
+
193
+ ### Deprecated
194
+ - **`/lens-rate` command**: Now shows deprecation warning. Needs re-structuring. Users should use `/lens-booboo` instead.
195
+ - **`/lens-metrics` command**: Now shows deprecation warning. Temporarily disabled, will be restructured. Users should use `/lens-booboo` instead.
196
+
197
+ ### Removed
198
+ - **Old implementations removed**: 259 lines of deprecated command code removed from `index.ts`.
199
+
200
+ ### Repository Cleanup
201
+ - **Local-only files removed from GitHub**: `.pisessionsummaries/` and `refactor.md` removed from repo (still in local `.gitignore`).
202
+
5
203
  ## [2.1.1] - 2026-03-29
6
204
 
7
205
  ### Added