pi-lens 4.2.0 → 4.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/CHANGELOG.md +543 -0
  2. package/README.md +45 -2
  3. package/dist/clients/actionable-warnings.js +44 -16
  4. package/dist/clients/advisory-provenance.js +187 -51
  5. package/dist/clients/cache-manager.js +64 -5
  6. package/dist/clients/cascade-format.js +24 -0
  7. package/dist/clients/child-unref.js +17 -8
  8. package/dist/clients/config-diagnostic-codes.js +2 -0
  9. package/dist/clients/config-locations.js +237 -9
  10. package/dist/clients/config-resolve.js +7 -1
  11. package/dist/clients/degradation-ledger.js +33 -3
  12. package/dist/clients/dependency-checker.js +87 -64
  13. package/dist/clients/diagnostic-dispositions.js +39 -3
  14. package/dist/clients/dispatch/finding-policy.js +118 -1
  15. package/dist/clients/dispatch/indent-detect.js +8 -2
  16. package/dist/clients/dispatch/inline-suppressions.js +23 -4
  17. package/dist/clients/dispatch/rule-ignores.js +14 -7
  18. package/dist/clients/dispatch/runners/actionlint.js +26 -28
  19. package/dist/clients/dispatch/runners/biome-check.js +38 -25
  20. package/dist/clients/dispatch/runners/cpp-check.js +32 -49
  21. package/dist/clients/dispatch/runners/credo.js +16 -14
  22. package/dist/clients/dispatch/runners/cue-vet.js +25 -7
  23. package/dist/clients/dispatch/runners/dart-analyze.js +28 -47
  24. package/dist/clients/dispatch/runners/detekt.js +11 -4
  25. package/dist/clients/dispatch/runners/dotnet-build.js +27 -22
  26. package/dist/clients/dispatch/runners/elixir-check.js +31 -46
  27. package/dist/clients/dispatch/runners/eslint.js +29 -46
  28. package/dist/clients/dispatch/runners/gleam-check.js +91 -11
  29. package/dist/clients/dispatch/runners/go-vet.js +16 -2
  30. package/dist/clients/dispatch/runners/golangci-lint.js +38 -23
  31. package/dist/clients/dispatch/runners/hadolint.js +27 -15
  32. package/dist/clients/dispatch/runners/htmlhint.js +17 -8
  33. package/dist/clients/dispatch/runners/javac.js +31 -21
  34. package/dist/clients/dispatch/runners/ktlint.js +34 -60
  35. package/dist/clients/dispatch/runners/lsp.js +6 -5
  36. package/dist/clients/dispatch/runners/markdownlint.js +12 -5
  37. package/dist/clients/dispatch/runners/mypy.js +2 -1
  38. package/dist/clients/dispatch/runners/oxlint.js +22 -6
  39. package/dist/clients/dispatch/runners/php-lint.js +39 -16
  40. package/dist/clients/dispatch/runners/phpstan.js +1 -1
  41. package/dist/clients/dispatch/runners/rubocop.js +27 -18
  42. package/dist/clients/dispatch/runners/ruff.js +18 -19
  43. package/dist/clients/dispatch/runners/rust-clippy.js +6 -1
  44. package/dist/clients/dispatch/runners/shellcheck.js +6 -2
  45. package/dist/clients/dispatch/runners/spellcheck.js +10 -3
  46. package/dist/clients/dispatch/runners/sqlfluff.js +11 -2
  47. package/dist/clients/dispatch/runners/stylelint.js +10 -2
  48. package/dist/clients/dispatch/runners/swiftlint.js +11 -2
  49. package/dist/clients/dispatch/runners/taplo.js +12 -6
  50. package/dist/clients/dispatch/runners/tflint.js +30 -15
  51. package/dist/clients/dispatch/runners/tree-sitter.js +23 -0
  52. package/dist/clients/dispatch/runners/trivy-config.js +8 -2
  53. package/dist/clients/dispatch/runners/utils/diagnostic-parsers.js +11 -1
  54. package/dist/clients/dispatch/runners/vale.js +15 -3
  55. package/dist/clients/dispatch/runners/yamllint.js +12 -2
  56. package/dist/clients/dispatch/runners/zig-check.js +27 -39
  57. package/dist/clients/dispatch/suppress-writer.js +13 -3
  58. package/dist/clients/effective-config.js +3 -1
  59. package/dist/clients/extension-log.js +48 -1
  60. package/dist/clients/finding-delivery-gate.js +53 -23
  61. package/dist/clients/formatters.js +49 -11
  62. package/dist/clients/git-guard.js +247 -34
  63. package/dist/clients/gradle-ktfmt-style.js +121 -25
  64. package/dist/clients/inline-blocker-dispositions.js +186 -0
  65. package/dist/clients/install-diagnostics.js +19 -6
  66. package/dist/clients/installer/index.js +281 -32
  67. package/dist/clients/jscpd-client.js +8 -0
  68. package/dist/clients/latency-logger.js +8 -0
  69. package/dist/clients/lens-config.js +66 -8
  70. package/dist/clients/lsp/cascade-tier.js +3 -0
  71. package/dist/clients/lsp/client.js +139 -11
  72. package/dist/clients/lsp/config.js +9 -7
  73. package/dist/clients/lsp/content-limits.js +41 -0
  74. package/dist/clients/lsp/index.js +42 -8
  75. package/dist/clients/lsp/launch.js +23 -2
  76. package/dist/clients/lsp/server.js +106 -25
  77. package/dist/clients/lsp/sync-kind.js +14 -0
  78. package/dist/clients/lsp/wait-policy/strategies.js +105 -16
  79. package/dist/clients/mcp/analyze.js +9 -2
  80. package/dist/clients/mcp/ipc.js +232 -44
  81. package/dist/clients/mcp/review.js +53 -7
  82. package/dist/clients/opengrep-client.js +11 -6
  83. package/dist/clients/path-utils.js +51 -9
  84. package/dist/clients/persistent-reverify.js +271 -0
  85. package/dist/clients/pipeline.js +136 -67
  86. package/dist/clients/project-diagnostics/fresh-fetch.js +21 -3
  87. package/dist/clients/project-lens-config.js +11 -3
  88. package/dist/clients/review-graph/builder.js +34 -26
  89. package/dist/clients/review-graph/git-identity.js +16 -10
  90. package/dist/clients/ruff-client.js +31 -4
  91. package/dist/clients/runtime-coordinator.js +38 -4
  92. package/dist/clients/runtime-tool-call.js +16 -5
  93. package/dist/clients/runtime-tool-result.js +27 -12
  94. package/dist/clients/runtime-turn.js +571 -287
  95. package/dist/clients/safe-spawn.js +256 -65
  96. package/dist/clients/skills-resolver.js +38 -2
  97. package/dist/clients/spawn-output-cap.js +84 -1
  98. package/dist/clients/tree-sitter-client.js +119 -58
  99. package/dist/clients/turn-end/lane.js +51 -0
  100. package/dist/clients/turn-end/lanes/govulncheck.js +112 -0
  101. package/dist/clients/turn-end/lanes/secrets.js +204 -0
  102. package/dist/clients/warm-attach.js +59 -0
  103. package/dist/clients/widget-state.js +294 -17
  104. package/dist/clients/workspace-topology.js +57 -3
  105. package/dist/clients/zizmor-config.js +26 -13
  106. package/dist/index.js +6342 -3995
  107. package/dist/mcp/analyze-cli.js +4 -0
  108. package/dist/mcp/server.js +33 -21
  109. package/dist/scripts/lib/web-tree-sitter-dir.mjs +123 -0
  110. package/dist/tools/lens-diagnostic-mark.js +14 -2
  111. package/dist/tools/lens-diagnostics.js +127 -33
  112. package/dist/tools/lsp-diagnostics.js +150 -12
  113. package/docs/adr/0001-stale-advisory-live-arm.md +29 -0
  114. package/docs/adr/0002-workspace-hash-rendezvous.md +30 -0
  115. package/docs/adr/0003-git-guard-latch-writer.md +203 -0
  116. package/docs/adr/0004-disposition-policy-seam.md +38 -0
  117. package/docs/adr/0005-tool-availability-enforcement-seam.md +29 -0
  118. package/docs/adr/0006-derived-state-benchmark-first.md +31 -0
  119. package/docs/adr/0007-end-to-end-witness-per-seam-slice.md +38 -0
  120. package/docs/adr/0008-turn-end-lane-interface.md +165 -0
  121. package/docs/adr/0009-reported-path-attribution.md +114 -0
  122. package/docs/adr/README.md +26 -0
  123. package/docs/agent-tools.md +18 -1
  124. package/docs/ast-grep_rules_catalog.md +4 -3
  125. package/docs/configuration.md +55 -1
  126. package/docs/engineering-principles.md +202 -0
  127. package/docs/environment-variables.md +61 -4
  128. package/docs/features.md +2 -2
  129. package/docs/globalconfig.md +6 -1
  130. package/docs/language-coverage.md +17 -0
  131. package/docs/lsp-capability-matrix.md +98 -31
  132. package/docs/pi-lens-fixer.md +57 -3
  133. package/docs/pi-lens-investigator.md +9 -0
  134. package/docs/pi-lens-reviewer.md +16 -0
  135. package/docs/pi-lens-subagent.md +9 -0
  136. package/docs/public-api-stability.md +1 -0
  137. package/docs/release-qa-baseline.md +2 -0
  138. package/docs/servercapabilities.md +21 -11
  139. package/docs/settings.md +12 -3
  140. package/docs/subagent-compat.md +1 -1
  141. package/package.json +5 -3
  142. package/rules/ast-grep-rules/rule-tests/no-assert-tuple-test.yml +13 -0
  143. package/rules/ast-grep-rules/rule-tests/no-boolean-in-except-test.yml +26 -0
  144. package/rules/ast-grep-rules/rule-tests/no-http-headers-bracket-access-test.yml +10 -0
  145. package/rules/ast-grep-rules/rule-tests/unchecked-numeric-parse-python-test.yml +18 -0
  146. package/rules/ast-grep-rules/rule-tests/unchecked-throwing-call-python-test.yml +4 -3
  147. package/rules/ast-grep-rules/rules/go-no-fmt-println.yml +2 -2
  148. package/rules/ast-grep-rules/rules/no-assert-tuple.yml +23 -13
  149. package/rules/ast-grep-rules/rules/no-boolean-in-except.yml +7 -3
  150. package/rules/ast-grep-rules/rules/no-console-except-error-js.yml +2 -2
  151. package/rules/ast-grep-rules/rules/no-console-except-error.yml +2 -2
  152. package/rules/ast-grep-rules/rules/no-http-headers-bracket-access.yml +12 -7
  153. package/rules/ast-grep-rules/rules/unchecked-numeric-parse-python.yml +44 -0
  154. package/rules/ast-grep-rules/rules/unchecked-throwing-call-python.yml +5 -3
  155. package/rules/tree-sitter-queries/typescript/console-statement.yml +2 -2
  156. package/scripts/install-selftest.mjs +21 -17
  157. package/scripts/lib/web-tree-sitter-dir.mjs +123 -0
@@ -29,8 +29,8 @@ post_filter: not_in_test_block # skip test blocks — no-console-in-tests handl
29
29
  # trains users to ignore the rule (#965). Application/library code outside
30
30
  # these paths still gets flagged.
31
31
  ignore_paths:
32
- - "scripts/**"
33
- - "bin/**"
32
+ - "**/scripts/**"
33
+ - "**/bin/**"
34
34
  - "**/logger.ts"
35
35
  - "**/logger.js"
36
36
  - "**/logger.mjs"
@@ -50,6 +50,7 @@ import * as path from "node:path";
50
50
  import { fileURLToPath } from "node:url";
51
51
  import { HOST_PROVIDED_PACKAGES } from "./lib/host-provided-deps.mjs";
52
52
  import { collectSkillEntryPaths } from "./lib/skills-predicate.mjs";
53
+ import { resolveWebTreeSitterPackageDir } from "./lib/web-tree-sitter-dir.mjs";
53
54
 
54
55
  const here = path.dirname(fileURLToPath(import.meta.url));
55
56
  const pkgRoot = path.resolve(here, "..");
@@ -220,28 +221,31 @@ try {
220
221
  }
221
222
 
222
223
  // tree-sitter grammars — download-grammars.js postinstall writes them into
223
- // node_modules/web-tree-sitter/grammars/. Locate that dir via the resolved
224
- // web-tree-sitter package (matches tree-sitter-client's runtime strategy).
224
+ // node_modules/web-tree-sitter/grammars/. Locate that dir through the SAME
225
+ // shared ladder the extension runtime uses (#3409 round 1, R3418-2): this probe
226
+ // used to resolve the BARE `web-tree-sitter` specifier and walk up, which throws
227
+ // MODULE_NOT_FOUND inside a `bun build --compile` host — so on the very hosts pi
228
+ // ships as, it reported the grammar asset missing while the exported wasm
229
+ // subpath resolved fine. One ladder, one answer, for the client, the pasted
230
+ // install fingerprint and this script.
225
231
  let grammarDetail = "tree-sitter-*.wasm missing (postinstall skipped?)";
226
232
  let hasCoreGrammar = false;
227
- try {
228
- // web-tree-sitter restricts `exports`, so resolve its main entry and walk
229
- // up to the package root (the dir literally named web-tree-sitter), where
230
- // download-grammars.js writes grammars/.
231
- let dir = path.dirname(require.resolve("web-tree-sitter"));
232
- while (
233
- path.basename(dir) !== "web-tree-sitter" &&
234
- dir !== path.dirname(dir)
235
- ) {
236
- dir = path.dirname(dir);
237
- }
238
- const grammarDir = path.join(dir, "grammars");
233
+ const webTreeSitterDir = resolveWebTreeSitterPackageDir({
234
+ resolve: (specifier) => require.resolve(specifier),
235
+ packageRoot: () => pkgRoot,
236
+ cwd: () => process.cwd(),
237
+ });
238
+ if (!webTreeSitterDir) {
239
+ grammarDetail =
240
+ "web-tree-sitter package dir unresolvable (module resolver, package root and cwd)";
241
+ } else {
242
+ const grammarDir = path.join(webTreeSitterDir, "grammars");
239
243
  hasCoreGrammar = fs.existsSync(
240
244
  path.join(grammarDir, "tree-sitter-typescript.wasm"),
241
245
  );
242
- if (hasCoreGrammar) grammarDetail = grammarDir;
243
- } catch (err) {
244
- grammarDetail = `web-tree-sitter unresolved: ${err?.message || err}`;
246
+ grammarDetail = hasCoreGrammar
247
+ ? grammarDir
248
+ : `tree-sitter-*.wasm missing in ${grammarDir} (postinstall skipped?)`;
245
249
  }
246
250
  record("tree-sitter grammars", "asset", hasCoreGrammar, grammarDetail);
247
251
 
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Where web-tree-sitter is installed — ONE ladder, for every caller that needs
3
+ * the answer (#3409).
4
+ *
5
+ * Callers: `clients/tree-sitter-client.ts` (the grammar read path and the
6
+ * lazy-fetch write target), `clients/install-diagnostics.ts` (the pasted
7
+ * environment fingerprint) and `scripts/install-selftest.mjs` (the installed
8
+ * host's own diagnostic). Each used to spell its own rungs, and the two that led
9
+ * with a BARE specifier were unconditionally broken on the host pi ships: inside
10
+ * a `bun build --compile` binary `require.resolve("web-tree-sitter")` throws
11
+ * MODULE_NOT_FOUND while `require.resolve("web-tree-sitter/tree-sitter.wasm")` —
12
+ * an explicit file subpath — still resolves.
13
+ *
14
+ * It lives in `scripts/lib/` rather than `clients/` because the installed
15
+ * selftest is packaged (`files[]`) without `clients/`, and this is the house
16
+ * pattern for logic a packaged .mjs script and the TypeScript runtime share
17
+ * (`scripts/lib/skills-predicate.mjs`, `scripts/lib/process-scan.mjs`). It
18
+ * imports nothing but `node:fs` and `node:path`, so it loads even on the hosts
19
+ * whose broken dependency graph the selftest exists to report.
20
+ */
21
+
22
+ import * as fs from "node:fs";
23
+ import * as path from "node:path";
24
+
25
+ /** The package this module is about. Also the name its manifest must carry. */
26
+ const WEB_TREE_SITTER = "web-tree-sitter";
27
+
28
+ /**
29
+ * The wasm the runtime loads, at the package root — where 0.25.10's `exports`
30
+ * map puts it (`"./tree-sitter.wasm": "./tree-sitter.wasm"`). If a later release
31
+ * moves it (#381's 0.26 migration), the two FALLBACK rungs below stop matching
32
+ * and the resolver rungs, which ask Node for that same subpath, keep working;
33
+ * this constant is then the one line to update.
34
+ */
35
+ const RUNTIME_WASM = "tree-sitter.wasm";
36
+
37
+ /**
38
+ * True when `dir` IS an installed web-tree-sitter package: its own manifest
39
+ * names it, and the wasm the runtime loads is in it.
40
+ *
41
+ * Round 1 review of #3409 (R3418-1): the constructed rungs used to accept any
42
+ * directory that merely EXISTED at `<base>/node_modules/web-tree-sitter`, so an
43
+ * empty or foreign directory of that name became the runtime fetch's write
44
+ * target and a downloaded grammar would land in an unrelated tree. Existence is
45
+ * not identity. The manifest name is the identity; the wasm is what makes the
46
+ * directory the right place to put grammars, since a grammar is only loadable by
47
+ * the web-tree-sitter runtime sitting next to it (the ABI drift #1564 is about).
48
+ */
49
+ export function isWebTreeSitterPackageDir(dir) {
50
+ try {
51
+ if (!fs.existsSync(path.join(dir, RUNTIME_WASM))) return false;
52
+ const manifest = JSON.parse(
53
+ fs.readFileSync(path.join(dir, "package.json"), "utf8"),
54
+ );
55
+ return manifest?.name === WEB_TREE_SITTER;
56
+ } catch {
57
+ return false;
58
+ }
59
+ }
60
+
61
+ /**
62
+ * The package directory owning `resolvedFile`: walk up until a directory passes
63
+ * the identity check, or the filesystem root is reached. The walk exists because
64
+ * an `exports` map may point into a subdirectory, so the file's own parent is
65
+ * not necessarily the package; the identity check is what stops the walk, so a
66
+ * resolver that answers outside any web-tree-sitter package yields nothing
67
+ * rather than an unrelated ancestor.
68
+ */
69
+ function packageDirOf(resolvedFile) {
70
+ let dir = path.dirname(resolvedFile);
71
+ for (;;) {
72
+ if (isWebTreeSitterPackageDir(dir)) return dir;
73
+ const parent = path.dirname(dir);
74
+ if (parent === dir) return undefined;
75
+ dir = parent;
76
+ }
77
+ }
78
+
79
+ /**
80
+ * web-tree-sitter's installed package directory, or undefined.
81
+ *
82
+ * Rung order, most authoritative first:
83
+ * 1. the `tree-sitter.wasm` SUBPATH, which resolves on a compiled host as well
84
+ * as a plain one. This is the rung that makes the non-core grammars
85
+ * fetchable there at all.
86
+ * 2. the BARE specifier, for a future web-tree-sitter whose exports map no
87
+ * longer carries `./tree-sitter.wasm`.
88
+ * 3. pi-lens's own package root, for the temp-dir compile layout (#20) where
89
+ * the resolver's context is a temp directory but the package root still has
90
+ * the right `node_modules`.
91
+ * 4. the working directory, the pre-#3409 last resort.
92
+ *
93
+ * Rungs 1-2 are the resolver's answer and outrank the constructed guesses: the
94
+ * grammars must come from the SAME package whose wasm the runtime loaded. Every
95
+ * rung's candidate passes `isWebTreeSitterPackageDir` before it is returned.
96
+ *
97
+ * `resolve`, `packageRoot` and `cwd` are injected, never defaulted: the caller's
98
+ * resolver context and package root are what differ on a compiled host, so they
99
+ * must not be silently replaced by this module's — and a rung nothing can vary
100
+ * is a rung no test can drive.
101
+ */
102
+ export function resolveWebTreeSitterPackageDir(deps) {
103
+ for (const specifier of [
104
+ `${WEB_TREE_SITTER}/${RUNTIME_WASM}`,
105
+ WEB_TREE_SITTER,
106
+ ]) {
107
+ try {
108
+ const dir = packageDirOf(deps.resolve(specifier));
109
+ if (dir) return dir;
110
+ } catch {
111
+ /* next rung */
112
+ }
113
+ }
114
+ for (const base of [deps.packageRoot, deps.cwd]) {
115
+ try {
116
+ const candidate = path.join(base(), "node_modules", WEB_TREE_SITTER);
117
+ if (isWebTreeSitterPackageDir(candidate)) return candidate;
118
+ } catch {
119
+ /* next rung */
120
+ }
121
+ }
122
+ return undefined;
123
+ }