pi-lens 4.4.0 → 4.4.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/CHANGELOG.md +158 -0
- package/README.md +1 -0
- package/config/dependency-cruiser-eager-allowlist.json +3 -1
- package/dist/{chunk-IXEBJSUE.js → chunk-23WOO7TX.js} +11 -10
- package/dist/{chunk-E2WFBRHM.js → chunk-2B73ZPOK.js} +3 -3
- package/dist/{chunk-DQ2NZ7C4.js → chunk-2BBLFX75.js} +139 -11
- package/dist/{chunk-ZMOL6RQC.js → chunk-2CD5RS6M.js} +2 -2
- package/dist/{chunk-VD4JQCQC.js → chunk-2ZGIZPDG.js} +38 -37
- package/dist/{chunk-DIULIWKU.js → chunk-34WSVGEM.js} +29 -3
- package/dist/chunk-3JNKMP3B.js +17 -0
- package/dist/{chunk-HVUZXSWK.js → chunk-3UUPUE3O.js} +45 -41
- package/dist/{chunk-5RXBNSW2.js → chunk-3VPVG5SU.js} +16 -8
- package/dist/chunk-3WA4HP4I.js +55 -0
- package/dist/chunk-466Z26MG.js +30 -0
- package/dist/{chunk-34U7PLGE.js → chunk-4UNXBNE2.js} +12 -11
- package/dist/{chunk-E4MAEDPM.js → chunk-4W4VLAPJ.js} +12 -11
- package/dist/{chunk-GUOGVTCQ.js → chunk-52FUZI6K.js} +4 -2
- package/dist/chunk-5JM2524W.js +84 -0
- package/dist/{chunk-VHQLPIRJ.js → chunk-5NGR67U5.js} +2 -2
- package/dist/{chunk-DFVMIKMQ.js → chunk-66SXUJCA.js} +45 -9
- package/dist/{chunk-OQGFCZJ4.js → chunk-66VMUL7Q.js} +16 -16
- package/dist/{chunk-HWBZIGMJ.js → chunk-67WMNWEE.js} +9 -8
- package/dist/{chunk-6QIUX4EP.js → chunk-6C7JWPCP.js} +7 -7
- package/dist/{chunk-47D2BO4S.js → chunk-6GFRNVYR.js} +11 -10
- package/dist/{chunk-ZAWW3AF6.js → chunk-6SDEP3AJ.js} +9 -8
- package/dist/{chunk-TGPXLY2J.js → chunk-724UL2TJ.js} +38 -2
- package/dist/{chunk-YLF3PPT5.js → chunk-76MWC2K6.js} +3 -3
- package/dist/{chunk-F3P7VQ7H.js → chunk-7DYBLXYA.js} +3 -3
- package/dist/{chunk-AJ3QXTRQ.js → chunk-7ULNCDCO.js} +37 -35
- package/dist/{chunk-UK3CMEAL.js → chunk-AOHZU2BM.js} +1 -1
- package/dist/{chunk-F3AU2TMM.js → chunk-ARJ6PLFH.js} +44 -28
- package/dist/{chunk-U3VGR4VU.js → chunk-AW7R2GWG.js} +65 -8
- package/dist/{chunk-FJNKANOS.js → chunk-BKE7E7TC.js} +10 -9
- package/dist/{chunk-4W2PLC4J.js → chunk-BRGDSBJE.js} +13 -12
- package/dist/{chunk-VN2AXLEX.js → chunk-C34ZXZ7O.js} +102 -16
- package/dist/{chunk-T4ERT73Y.js → chunk-CF24OIYI.js} +21 -20
- package/dist/{chunk-NMABWBZN.js → chunk-CHOW74WE.js} +1 -1
- package/dist/{chunk-ARFCXG7S.js → chunk-CO2G5PHH.js} +2 -2
- package/dist/{chunk-AS44CFQ4.js → chunk-EETY4LF7.js} +24 -10
- package/dist/{chunk-I3R7GKDR.js → chunk-EJIUXPBX.js} +1 -1
- package/dist/{chunk-B3I2UUT4.js → chunk-ESBQHFMJ.js} +653 -251
- package/dist/{chunk-O5WILGMI.js → chunk-FLKWCIZH.js} +8 -5
- package/dist/{chunk-LNAKEO63.js → chunk-GAEGEPOC.js} +4 -4
- package/dist/{chunk-V7R425XG.js → chunk-GBPP5P7X.js} +4 -4
- package/dist/{chunk-XK4CIILI.js → chunk-GHB6AYCP.js} +27 -26
- package/dist/{chunk-7FBF7NPR.js → chunk-GOYRYZ2R.js} +29 -26
- package/dist/{chunk-JOLITGCC.js → chunk-GXW6K4YJ.js} +1 -1
- package/dist/{chunk-NXPS2L6U.js → chunk-GZYBXISR.js} +9 -9
- package/dist/{chunk-OAXNDZJ7.js → chunk-IBGIOBEE.js} +8 -4
- package/dist/{chunk-IIXOAGHR.js → chunk-IBRALRBR.js} +19 -15
- package/dist/{chunk-7F72PXY2.js → chunk-IXXDFY73.js} +3 -3
- package/dist/chunk-IZSHAIJ7.js +26 -0
- package/dist/{chunk-N3YQJI6O.js → chunk-JAU72XNY.js} +20 -15
- package/dist/chunk-JMYYOTQG.js +77 -0
- package/dist/{chunk-NL5GLMFI.js → chunk-JSQFTSC6.js} +12 -11
- package/dist/{chunk-IVP5KAB7.js → chunk-JWA5I3SR.js} +35 -21
- package/dist/{chunk-Y4T27COV.js → chunk-KBG47GHP.js} +4 -4
- package/dist/{chunk-PWFHBTSF.js → chunk-L3BLXZG7.js} +2 -2
- package/dist/chunk-LOP6GRPH.js +31 -0
- package/dist/chunk-MQLUAEOC.js +162 -0
- package/dist/{chunk-RPD5K5NC.js → chunk-MRXKYPCS.js} +2 -2
- package/dist/{chunk-Q5U6FMDI.js → chunk-N2H3ZPZY.js} +59 -7
- package/dist/{chunk-27BBHSZC.js → chunk-N3X6Q4YT.js} +3 -3
- package/dist/{chunk-UY752QSN.js → chunk-NW7BOILN.js} +19 -17
- package/dist/{chunk-TLGFBM3F.js → chunk-ODBNXWT4.js} +302 -113
- package/dist/{chunk-TT22N74J.js → chunk-OG5UUPN7.js} +13 -13
- package/dist/{chunk-C2AUYXQH.js → chunk-OXXKQCSV.js} +6 -6
- package/dist/{chunk-PAK6IDME.js → chunk-P7266HLM.js} +2 -2
- package/dist/{chunk-52H5B5TC.js → chunk-PFNSLWU5.js} +31 -30
- package/dist/{chunk-5ZEJHV35.js → chunk-PHDMFAKM.js} +12 -2
- package/dist/{chunk-3I5QFT3N.js → chunk-PNQDPDRC.js} +6 -3
- package/dist/{chunk-TVN5N6GY.js → chunk-PV6LR5P5.js} +6057 -1311
- package/dist/{chunk-AHDW3GPE.js → chunk-Q6ZWTCLY.js} +24 -22
- package/dist/{chunk-RUOG5D2C.js → chunk-Q7DUK4LX.js} +5 -5
- package/dist/{chunk-YSNFMJKN.js → chunk-QGQ5CCCG.js} +2 -2
- package/dist/{chunk-LW6XKDZQ.js → chunk-QHJ6DQ2R.js} +287 -38
- package/dist/{chunk-GVXA6CCE.js → chunk-QILIYSJF.js} +1 -1
- package/dist/{chunk-22AVIGXS.js → chunk-QOBUHWHX.js} +12 -7
- package/dist/{chunk-5THXD6X5.js → chunk-QQNQ7SJW.js} +2 -75
- package/dist/{chunk-4RERDEXR.js → chunk-QZVW3AAK.js} +50 -41
- package/dist/{chunk-AWE5TMPO.js → chunk-R3PCY3YS.js} +14 -13
- package/dist/{chunk-HHYAELLJ.js → chunk-RPLINGVB.js} +7 -7
- package/dist/{chunk-EOKRQ3SA.js → chunk-RWWYJ623.js} +10 -1
- package/dist/{chunk-YGVYKNSN.js → chunk-SAEFPSB6.js} +59 -12
- package/dist/{chunk-K6VYLB2U.js → chunk-TYM6OUIT.js} +13 -12
- package/dist/{chunk-AJXODZY6.js → chunk-UXGETRP4.js} +13 -12
- package/dist/{chunk-I7SPGOWI.js → chunk-UZ3TUTRV.js} +1 -1
- package/dist/{chunk-TO6WL3GM.js → chunk-VCHXCQFG.js} +12 -2
- package/dist/{chunk-BRJKOBZP.js → chunk-VITUCP5A.js} +17 -6
- package/dist/{chunk-WONERJTP.js → chunk-VRZP76YM.js} +1 -1
- package/dist/{chunk-OS32RNR2.js → chunk-VSSBEUFT.js} +16 -15
- package/dist/{chunk-VDBPVIKD.js → chunk-VWCXW2E7.js} +1 -1
- package/dist/{chunk-NKOUFPQF.js → chunk-WOA4LN2R.js} +2 -2
- package/dist/{chunk-RIISMHKN.js → chunk-WOKKRCJ5.js} +15 -13
- package/dist/{chunk-XECLWQZN.js → chunk-WU567RSC.js} +13 -10
- package/dist/{chunk-V5PXFSZK.js → chunk-XCJN5IJU.js} +4 -4
- package/dist/{chunk-ORTMY4Q4.js → chunk-XKIZ2HNN.js} +22 -14
- package/dist/{chunk-6VCD4VKZ.js → chunk-XMSXXAHW.js} +2 -2
- package/dist/chunk-XPZPXCBV.js +28 -0
- package/dist/{chunk-O6TQT6RI.js → chunk-XTMJ7XDT.js} +1 -1
- package/dist/{chunk-VNMT7C64.js → chunk-XVF2VVXP.js} +5 -3
- package/dist/chunk-Z527N6YQ.js +28 -0
- package/dist/{chunk-NTUJEGDZ.js → chunk-ZANLILYD.js} +22 -2
- package/dist/{chunk-6P62QVEA.js → chunk-ZGDGW2V3.js} +2 -2
- package/dist/{chunk-ODEEOXPH.js → chunk-ZHFZWTZV.js} +12 -11
- package/dist/{chunk-AJVLWNFN.js → chunk-ZXYDQ3TZ.js} +5 -5
- package/dist/index.js +102097 -97778
- package/dist/mcp/analyze-cli.js +18 -8
- package/dist/mcp/cli.js +48 -37
- package/dist/mcp/server.js +695 -426
- package/dist/mcp/worker.js +66 -55
- package/dist/probes/installer.js +20 -19
- package/docs/ast-grep_rules_catalog.md +2 -2
- package/docs/astplayground.md +1 -1
- package/docs/configuration.md +38 -2
- package/docs/custom-rules.md +25 -2
- package/docs/dependencies.md +3 -0
- package/docs/environment-variables.md +34 -6
- package/docs/features.md +39 -3
- package/docs/globalconfig.md +3 -1
- package/docs/language-coverage.md +2 -1
- package/docs/lsp-capability-matrix.md +29 -6
- package/docs/lsp-idle-eviction.md +38 -47
- package/docs/pi-lens-fixer.md +13 -5
- package/docs/pi-lens-merge-policy.md +48 -1
- package/docs/pi-lens-monitor.md +3 -1
- package/docs/pi-lens-retro.md +2 -1
- package/docs/pi-lens-reviewer.md +19 -3
- package/docs/pi-lens-subagent.md +2 -0
- package/docs/real-harness.md +17 -0
- package/docs/schema/pi-lens-config-v1.json +565 -0
- package/docs/servercapabilities.md +18 -4
- package/docs/settings.md +2 -1
- package/docs/word-index.md +6 -0
- package/package.json +1 -1
- package/rules/ast-grep-rules/rule-tests/no-identity-operator-on-literals-test.yml +12 -2
- package/rules/ast-grep-rules/rule-tests/throw-new-error-js-test.yml +2 -0
- package/rules/ast-grep-rules/rule-tests/throw-new-error-test.yml +2 -0
- package/rules/ast-grep-rules/rules/no-identity-operator-on-literals.yml +20 -12
- package/rules/ast-grep-rules/rules/throw-new-error-js.yml +2 -2
- package/rules/ast-grep-rules/rules/throw-new-error.yml +2 -2
- package/dist/chunk-54B42YRX.js +0 -27
- package/dist/chunk-CGGAIP7J.js +0 -29
- package/dist/chunk-D6QS3U6M.js +0 -30
- package/dist/chunk-HMFXILPV.js +0 -83
- package/dist/chunk-LSMJ6KBE.js +0 -4139
- package/dist/chunk-NTHH2J74.js +0 -27
- package/dist/chunk-RPD4ZSB7.js +0 -25
- package/dist/chunk-T6D4Q4AQ.js +0 -54
- package/dist/chunk-VCSRSYLF.js +0 -81
package/CHANGELOG.md
CHANGED
|
@@ -16,6 +16,164 @@ All notable changes to pi-lens will be documented in this file.
|
|
|
16
16
|
|
|
17
17
|
### Security
|
|
18
18
|
|
|
19
|
+
## [4.4.2] - 2026-10-10
|
|
20
|
+
|
|
21
|
+
### Added
|
|
22
|
+
|
|
23
|
+
- **pi-lens now fails closed on unknown project trust** — Under pi, when pi cannot confirm the project is trusted, pi-lens refuses to run project code and emits one notice per session. It withholds project-local tool binaries while keeping global and managed fallbacks available (#4268). It refuses built-in language servers that execute project code before discovery or installation (#4269). Project-sourced LSP commands, environment, initialization options, and local binaries require trust as well (#2372). The TypeScript server skips the project's own `tsserver.js` and native TypeScript 7 `tsc`, falling back to pi-lens-managed TypeScript instead (#4296). MCP and other non-pi hosts do not consult pi trust; their calling client owns workspace trust, so project tools stay available there (#4300).
|
|
24
|
+
|
|
25
|
+
- **Built-in Lean 4 language support (refs #4119)** — `.lean` files are recognized and sent to the Lean language server using the `lean` LSP language id. In Lake projects, pi-lens launches `lake serve` from the detected project root, so Lake and elan honor the project's toolchain and environment. pi-lens does not install or manage Lean; install Lean and Lake separately and ensure `lake` is on `PATH`.
|
|
26
|
+
|
|
27
|
+
- **Path-scoped rule policy** — Add `rules.<id>.ignorePaths` to skip a rule on matching project-relative paths and reclaim scan work (#4226).
|
|
28
|
+
|
|
29
|
+
- **Analyse marked out-of-root edits as adopted projects.** An edit in a separate project gets LSP diagnostics from global servers, while project-local tools, linters and session bookkeeping stay isolated (refs #4242).
|
|
30
|
+
|
|
31
|
+
- **`/lens-health` now reports the effective pi-lens tool surface**, including disabled tools and the host-managed bundled-skill boundary.
|
|
32
|
+
|
|
33
|
+
### Changed
|
|
34
|
+
|
|
35
|
+
- **Stale test-runner verdicts state their edit gap and re-queue a run.** When an async verdict is delivered for a file the agent has edited since the run started, the message names the file and how many edits behind it is and queues a re-run for the current version instead of presenting the old verdict as current.
|
|
36
|
+
|
|
37
|
+
### Fixed
|
|
38
|
+
|
|
39
|
+
- **The session-start orientation names only the tools pi-lens registered** (refs #2967). A tool disabled with `tools.<name>.enabled: false` is no longer advertised, and the `pi_lens_activate_tools` example is drawn from the enabled situational set. The orientation's pre-existing-error demand is configurable with `contextInjection.requirePreExistingFixes` (default unchanged).
|
|
40
|
+
|
|
41
|
+
- **Expired session hand-offs now preserve activated tools** instead of dropping them when a successor is interrupted before startup (closes #4236). Test-only successor pending-window overrides are restricted to Vitest child processes.
|
|
42
|
+
|
|
43
|
+
- **Duplicate pi session starts are ignored safely.** pi-lens now drops repeated `session_start` events at entry while preserving distinct reload, new, resume, and fork starts, and drains NDJSON logs before graceful shutdown (refs #2891).
|
|
44
|
+
|
|
45
|
+
- **TypeScript no longer reports clean from its empty pre-index publish.**
|
|
46
|
+
|
|
47
|
+
- **Require a BuildKit rule from the official Docker smoke server** (closes #3939) — The nightly smoke now uses the upstream rule-bearing fixture and discloses runners without `docker buildx` instead of accepting an empty diagnostic baseline. Credit: qiyangfan.
|
|
48
|
+
|
|
49
|
+
- **Bridge reads survive a `/reload` on the TypeScript-source extension load.** A third-party read recorded after `/reload` (`pi -e index.ts`) now licenses the next edit instead of being falsely blocked with "Edit without read", without allowing a concurrent or stale activation to retarget the bridge (refs #4169, #4258).
|
|
50
|
+
|
|
51
|
+
- **Ast-grep fallbacks use the official CLI package from an isolated cwd (#4193)** — Structural rule replacements, path searches, and CLI probes name `@ast-grep/cli` when direct binary resolution fails and run from a pi-lens-owned tools directory, so a project's `.npmrc` never reaches `npx`; relative `paths` resolve against the project before dispatch.
|
|
52
|
+
|
|
53
|
+
- **Windows LSP auto-install now repairs missing shell commands.** Exit-code-1 startup failures are classified as missing tools only when the command or shim target is absent.
|
|
54
|
+
|
|
55
|
+
- **Unicode-normalized edits now keep their raw target span** (closes #4265) — Full-width punctuation, smart quotes, dashes, and special spaces no longer produce a false “edit target not found” block.
|
|
56
|
+
|
|
57
|
+
- **Subagent turn-end isolation** — a concurrent subagent no longer consumes the primary session's pending project analysis worklist or deferred findings. (refs #3613)
|
|
58
|
+
|
|
59
|
+
### Internal
|
|
60
|
+
|
|
61
|
+
<details>
|
|
62
|
+
<summary>8 internal changes: tests, CI, tooling, and refactors</summary>
|
|
63
|
+
|
|
64
|
+
- Pin the test home used by the skills package-filter coverage so host-installed skills cannot affect its results.
|
|
65
|
+
|
|
66
|
+
- Require every PR `## Class sweep` to name the defect shape, quote the search that defines its population, and give a verdict, or say `none: <reason>` (#4273).
|
|
67
|
+
|
|
68
|
+
- The nightly tool-smoke LSP capability census builds the in-place compiled twins immediately before it runs, so vitest no longer aborts on the stale-build guard (refs #4302).
|
|
69
|
+
|
|
70
|
+
- Pre-push and lane-check now rebuild a missing or stale bundled `dist/` dependency before governance suites (#4239).
|
|
71
|
+
|
|
72
|
+
- Restore the nightly LSP smoke harness's trusted-project host boundary so project-local server fixtures exercise their intended launch paths.
|
|
73
|
+
|
|
74
|
+
- Added the grouped experimental `LspCapabilities` facade over `LSPService` and migrated production LSP callers behind it without changing behavior.
|
|
75
|
+
|
|
76
|
+
- Centralize analysis-root classification and thread adopted-root no-op gates through root-keyed tool-result writers (refs #4242).
|
|
77
|
+
|
|
78
|
+
- Pinned workflow download redirects to HTTPS and made late formatter resync ownership explicit for the Sonar quality gate.
|
|
79
|
+
|
|
80
|
+
</details>
|
|
81
|
+
|
|
82
|
+
## [4.4.1] - 2026-10-09
|
|
83
|
+
|
|
84
|
+
### Added
|
|
85
|
+
|
|
86
|
+
- **Public LSP config schema and compatibility normalization** (closes #2416): canonical argv-shaped server entries and legacy string-command files now share a validated, provenance-aware model without changing runtime launch behavior.
|
|
87
|
+
|
|
88
|
+
- **Shared custom rules are now loaded from a user-level directory.** Thanks to @Antrakos; project rules take precedence over user rules, which take precedence over bundled rules.
|
|
89
|
+
|
|
90
|
+
- **The official Docker Language Server is now verified in nightly LSP smoke tests.** Its pinned v0.20.1 binary is measured through the real pi-lens client, with the preferred legacy server retained as the fallback. Thanks @qiyangfan for reporting #3939.
|
|
91
|
+
|
|
92
|
+
- **Deferred formatting now announces settled completion with ownership identity** (refs #673; thanks @marioSoftmedic), including an empty path list when no bytes changed; late formatter writes delay completion until resync.
|
|
93
|
+
|
|
94
|
+
### Changed
|
|
95
|
+
|
|
96
|
+
- Idle eviction is now enabled for `docker`, `json`, and `python-jedi` after consecutive safe measurements (refs #3989).
|
|
97
|
+
|
|
98
|
+
### Fixed
|
|
99
|
+
|
|
100
|
+
- **Report fixer restore loss.** Agent edits that a whole-package fixer erased are now reported when their calls overlap the restore, or when a later edit landed on the fixer's bytes; newer bytes are retained when the restore can prove they are newer. One case stays unreported and is named as a residual: a fixer write that lands between an edit's tool call and the host applying that edit (#3830).
|
|
101
|
+
|
|
102
|
+
- **Batched scans keep their compiled query across a heal.** A rule healed during an in-flight compile no longer stays missing from later batched scans, scans sharing that compile no longer report zero findings when a heal races its publication, and a compile that is refused publication frees its native query instead of leaking it. (#3834)
|
|
103
|
+
|
|
104
|
+
- **A grammar that traps on two distinct files is retired, not retried until the heap aborts.** The runner reports the language unavailable instead of clean and other languages keep the remaining trap budget; a file that traps once and then parses cleanly does not count (refs #4010, #3996).
|
|
105
|
+
|
|
106
|
+
- **The word index no longer holds its serialized copy while idle.** It is released when the agent run settles (once per run), kept while a run edits so per-edit saves stay incremental, and released after 10 minutes without a save for a stalled run (`PI_LENS_WORD_INDEX_MEMO_BACKSTOP_MS`).
|
|
107
|
+
|
|
108
|
+
- **Startup warm caches now cover up to 2,500 measured source files safely.** Larger projects still see the once-per-session reason and the bound to raise.
|
|
109
|
+
|
|
110
|
+
- **The read guard keeps authorship through pi-lens-owned rewrites.** A file the agent wrote stays editable without a re-read when `ast_grep_replace`, `lens_diagnostic_mark`, or an LSP operation rewrites the file that call named and no foreign writer intervened. A file the tool wrote without naming it (a rename's importers, a folder-wide or project-wide apply), a server-initiated `workspace/applyEdit`, or a foreign byte change ends authorship instead, so the next edit asks for one read, and third-party bridge records remain fail-closed (#4131). Authorship survives `/tree`, `/fork` and resume when the branch still shows the write (#3603). Process-bridge writes, observed tool writes and partial bridge reads no longer mark the whole file as freshly read (#3865).
|
|
111
|
+
|
|
112
|
+
- **`throw Error(x)` style findings are now warnings, not blockers.** The `throw-new-error` rules still encourage explicit construction while recognizing that `Error(x)` is spec-equivalent to `new Error(x)`.
|
|
113
|
+
|
|
114
|
+
- **Shared secondary worktree roots now remain visible until every session holding them leaves.** Each session's registry record lists only the roots it registered, so a session ending after a primary reload or a cap eviction can no longer drop a root another live session still serves (#3849).
|
|
115
|
+
|
|
116
|
+
- **Lint fallback no longer hides missing type coverage.** Type-bearing files keep the existing incomplete-coverage notice when their primary analysis was skipped, unavailable, or failed; type-capable fallbacks such as mypy can still complete coverage.
|
|
117
|
+
|
|
118
|
+
- **Keep source-build tools aligned with the lockfile (#4066).** Both esbuild bundles and the TypeScript fallback use the exact locked versions while retaining isolated npm exec resolution and exact lifecycle-script approval.
|
|
119
|
+
|
|
120
|
+
- **Scanners now avoid linked worktree duplicates.** Gitleaks, trivy and opengrep discover linked checkouts nested under the project root instead of relying only on known directory names; paths that a scanner cannot represent safely are reported as bounded scan degradations (fixes #4132).
|
|
121
|
+
|
|
122
|
+
- Prevented pi-lens's read-only registry-tool operations from being mistaken for learned edits after another operation mutates a file.
|
|
123
|
+
|
|
124
|
+
- **Ast-grep rule validation no longer stalls on blank-heavy YAML (#4148)** — A rule with tens of thousands of blank lines no longer blocks the host while its language is detected.
|
|
125
|
+
|
|
126
|
+
- **Pytest and go.mod parsing no longer stall on blank-heavy input (#4148)** — Reading a pytest failure traceback and the `module` line of a `go.mod` now takes linear time, so a run with tens of thousands of blank lines or one very long `_` rule no longer blocks the host for seconds (13 s and 4 s at 100K lines before).
|
|
127
|
+
|
|
128
|
+
- **Refresh TypeScript clients across package roots (closes #4156)** — Changed files are announced to live sibling-root language-server clients, preventing stale importer diagnostics. Credit: Don-Yin.
|
|
129
|
+
|
|
130
|
+
- **A project's data directory stays stable for the whole process** (#4199): it is settled when the process first resolves the root, so an ephemeral checkout no longer moves its data when a `.pi-lens` directory appears mid-process, and a `.pi-lens` created by hand in a real project takes effect at the next process start.
|
|
131
|
+
|
|
132
|
+
- **Read-guard authorship now stays within bytes each writer actually changed.**
|
|
133
|
+
|
|
134
|
+
- **Outside-root edits now explain skipped analysis** (#4218) — pi-lens tells you to start pi in the file's directory or add it to the workspace.
|
|
135
|
+
|
|
136
|
+
- **Answered LSP findings are preserved when another server times out** — typos diagnostics now remain visible when Marksman is inconclusive for the same edit. (closes [#4219](https://github.com/apmantza/pi-lens/issues/4219))
|
|
137
|
+
|
|
138
|
+
- **Identity checks against `True`/`False` are no longer flagged** — the rule now preserves correct Python singleton checks while continuing to catch non-singleton literal comparisons. Thanks @rastarr for the report. (closes [#4225](https://github.com/apmantza/pi-lens/issues/4225))
|
|
139
|
+
|
|
140
|
+
- **Release summaries keep wrapped changelog entries intact** — release notes now join an entry's wrapped lines before shortening it, so plain entries no longer end mid-sentence and bold gist text keeps continuation-line issue references.
|
|
141
|
+
|
|
142
|
+
- **Read evidence now survives relative paths, nested codemode calls and conversation moves**: relative-path reads, nested reads and pi-lens rewrites (including the structural `ast_grep_replace` apply) keep their read-guard and mutation bookkeeping across `/clone`, `/fork`, `/tree` and `/reload`; a read that errored (even if another extension rewrites its result to success), or that another extension blocked, no longer licenses an edit later in the same run, and a read never blocks a whole-package fixer's restore of an agent edit.
|
|
143
|
+
|
|
144
|
+
### Internal
|
|
145
|
+
|
|
146
|
+
<details>
|
|
147
|
+
<summary>13 internal changes: tests, CI, tooling, and refactors</summary>
|
|
148
|
+
|
|
149
|
+
- The TLA+ hook-anchor scan escapes every regex metacharacter in a handler name, not only `$`.
|
|
150
|
+
|
|
151
|
+
- Changelog fragment validation now constrains new user-facing leads.
|
|
152
|
+
|
|
153
|
+
- **Idle-eviction measurements cover temporary checkouts (refs #3989)** — The nightly probe now arms the short idle window used by ephemeral LSP roots as well as the generic window, so eligible servers are measured instead of reported as not evicted.
|
|
154
|
+
|
|
155
|
+
- **release-qa reads the pi version from `pi --version` only (closes #4176)** — The codemode row no longer takes an x.y.z from the pi binary's install path, so a version-shaped directory cannot make it run or skip on the wrong pi.
|
|
156
|
+
|
|
157
|
+
- Keep config-declared LSP roles reserved and inert in the loader; the catalog remains the owner of auxiliary selection.
|
|
158
|
+
|
|
159
|
+
- Make the workflow Git-push detector regex linear for quoted options.
|
|
160
|
+
|
|
161
|
+
- One LSP server-role vocabulary and a declared trait table (refs #1488, refs #1756): `LSPServerInfo.role` is now non-optional, 44 inlined `role === "auxiliary"` / `role !== "auxiliary"` predicates fold onto `isAuxiliary()`, `PromiseDescriptor.role` retires its duplicate `"primary"` spelling, the auxiliary wait policy moves to `clients/lsp/auxiliary-lifecycle.ts`, and the `notifyInflightLimit` / `replyOrdering` traits are declared on the server definition. No behaviour change.
|
|
162
|
+
|
|
163
|
+
- **Merge-policy mistake table: 2026-10-07 and 2026-10-08 retrospective** — new internal rows on delivery wording, shared records, worker handoffs, CI and advisory classification, release producers, probe witnesses, test doubles, and round routing.
|
|
164
|
+
|
|
165
|
+
- Failed handler-verdict tests when `handleToolCall` threw and production swallowed it: `runHandlerExpectingNoThrow` (`tests/support/handler-verdict.ts`) wraps every direct call and the pi mock's `tool_call` hooks, and a governance sweep rejects an unchecked call (#3518, recurrence #4182).
|
|
166
|
+
|
|
167
|
+
- **TLA+ session models cover marker expiry, the per-evaluation LSP generation, the widget token and the late coordinator stores (refs #3803)**: #3668's successor-pending marker expires (`MarkerExpire`, no clock), #3755's per-evaluation generation is caught by an owner-live invariant the generation clause could not see, the widget's `>=` tie and fork carry are pinned in both directions (`SessionLifecycleF1`), the receipt, `fixedThisTurn`, analysed-state latch and runner writers are fenced by their captured scope (#3824), and `session-straddle` retires the generation at shutdown (#3611), each with a violating pre-fix or mutant config and a passing merged one.
|
|
168
|
+
|
|
169
|
+
- **TLA+ session-lifecycle models the S3 writers and the subagent turn_end (refs #3803)**: the deferral queue's two-hop credit (#3705), the turn-state, turn-summary and git-guard late writers with the debounce re-entry (#3759), the mutation bridge's producer with and without a lineage (#3763), the park map of cut advisories (#4112), and a turn_end composer on a shared coordinator, each with a violating pre-fix or mutant config and a passing merged one; the coverage map names the bridge producers and the turn summary.
|
|
170
|
+
|
|
171
|
+
- Map the unmapped lifecycle files in `formal/coverage-map.json` and gate `index.ts` per lifecycle hook handler instead of per file (refs #3803).
|
|
172
|
+
|
|
173
|
+
- Vitest no longer collects test files from a stray worktree inside `.probe-home/` on a path-filtered run.
|
|
174
|
+
|
|
175
|
+
</details>
|
|
176
|
+
|
|
19
177
|
## [4.4.0] - 2026-10-08
|
|
20
178
|
|
|
21
179
|
### Added
|
package/README.md
CHANGED
|
@@ -482,6 +482,7 @@ Thanks goes to these wonderful people:
|
|
|
482
482
|
<tr>
|
|
483
483
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/pandas9"><img src="https://avatars.githubusercontent.com/u/81386636?v=4" width="100px;" alt=""/><br /><sub><b>pandas9</b></sub></a><br /><a href="#bug-pandas9" title="Bug reports">🐛</a></td>
|
|
484
484
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/renzooliveira"><img src="https://avatars.githubusercontent.com/u/10881850?v=4" width="100px;" alt=""/><br /><sub><b>Renzo Oliveira</b></sub></a><br /><a href="#ideas-renzooliveira" title="Ideas & Planning">🤔</a></td>
|
|
485
|
+
<td align="center" valign="top" width="14.28%"><a href="https://github.com/rastarr"><img src="https://avatars.githubusercontent.com/u/2160922?v=4" width="100px;" alt=""/><br /><sub><b>Martin</b></sub></a><br /><a href="#bug-rastarr" title="Bug reports">🐛</a> <a href="#ideas-rastarr" title="Ideas & Planning">🤔</a></td>
|
|
485
486
|
</tr>
|
|
486
487
|
</tbody>
|
|
487
488
|
</table>
|
|
@@ -44,14 +44,15 @@
|
|
|
44
44
|
"./clients/lsp-budget.js",
|
|
45
45
|
"./clients/lsp-lazy.js",
|
|
46
46
|
"./clients/lsp-status.js",
|
|
47
|
+
"./clients/lsp/capabilities.js",
|
|
47
48
|
"./clients/lsp/cascade-tier.js",
|
|
48
49
|
"./clients/lsp/config.js",
|
|
49
|
-
"./clients/lsp/index.js",
|
|
50
50
|
"./clients/lsp/session-roots.js",
|
|
51
51
|
"./clients/memory-sampler.js",
|
|
52
52
|
"./clients/message-end-attribution.js",
|
|
53
53
|
"./clients/mutating-tool.js",
|
|
54
54
|
"./clients/mutation-bridge.js",
|
|
55
|
+
"./clients/ndjson-logger.js",
|
|
55
56
|
// #2430: the agent_settled sweep and its post-drain re-baseline. Eager
|
|
56
57
|
// because they run inside the settle handler, on the same path as the
|
|
57
58
|
// deferred drain they bracket.
|
|
@@ -59,6 +60,7 @@
|
|
|
59
60
|
"./clients/observed-mutation.js",
|
|
60
61
|
"./clients/path-attribution-telemetry.js",
|
|
61
62
|
"./clients/path-utils.js",
|
|
63
|
+
"./clients/process-bridge.js",
|
|
62
64
|
"./clients/project-lens-config.js",
|
|
63
65
|
"./clients/project-trust.js",
|
|
64
66
|
"./clients/quiet-window.js",
|
|
@@ -2,19 +2,20 @@ import { createRequire as __pilensCreateRequire } from "node:module"; const requ
|
|
|
2
2
|
import {
|
|
3
3
|
AgentBehaviorClient,
|
|
4
4
|
agentBehaviorClient
|
|
5
|
-
} from "./chunk-
|
|
6
|
-
import "./chunk-
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
5
|
+
} from "./chunk-ZGDGW2V3.js";
|
|
6
|
+
import "./chunk-IBGIOBEE.js";
|
|
7
|
+
import "./chunk-C34ZXZ7O.js";
|
|
8
|
+
import "./chunk-2BBLFX75.js";
|
|
9
|
+
import "./chunk-XVF2VVXP.js";
|
|
10
10
|
import "./chunk-2EECBNC5.js";
|
|
11
|
-
import "./chunk-
|
|
12
|
-
import "./chunk-
|
|
13
|
-
import "./chunk-
|
|
14
|
-
import "./chunk-
|
|
11
|
+
import "./chunk-JAU72XNY.js";
|
|
12
|
+
import "./chunk-XTMJ7XDT.js";
|
|
13
|
+
import "./chunk-JMYYOTQG.js";
|
|
14
|
+
import "./chunk-QQNQ7SJW.js";
|
|
15
|
+
import "./chunk-AOHZU2BM.js";
|
|
15
16
|
import "./chunk-LJDODBBZ.js";
|
|
16
17
|
import "./chunk-ABBOA7UD.js";
|
|
17
|
-
import "./chunk-
|
|
18
|
+
import "./chunk-N2H3ZPZY.js";
|
|
18
19
|
import "./chunk-NXL4FFQQ.js";
|
|
19
20
|
export {
|
|
20
21
|
AgentBehaviorClient,
|
|
@@ -3,13 +3,13 @@ import {
|
|
|
3
3
|
findModuleForPath,
|
|
4
4
|
getDownstreamModules,
|
|
5
5
|
getModuleSourceFiles
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-GBPP5P7X.js";
|
|
7
7
|
import {
|
|
8
8
|
detectFileRole
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-2BBLFX75.js";
|
|
10
10
|
import {
|
|
11
11
|
normalizeMapKey
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-N2H3ZPZY.js";
|
|
13
13
|
|
|
14
14
|
// dist/clients/review-graph/query.js
|
|
15
15
|
function dedupe(items) {
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
findPiLensConfigMarkerInDir,
|
|
15
15
|
getPiLensGlobalConfigPath,
|
|
16
16
|
isResolvedGlobalConfigPath
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-XVF2VVXP.js";
|
|
18
18
|
import {
|
|
19
19
|
DEGRADATION_ENTRIES_PER_KIND,
|
|
20
20
|
GLOBAL_NON_FLAG_CONFIG_SECTIONS,
|
|
@@ -31,21 +31,21 @@ import {
|
|
|
31
31
|
readFlagConfigValue,
|
|
32
32
|
readToolConfig,
|
|
33
33
|
recordDegradationOnce
|
|
34
|
-
} from "./chunk-
|
|
34
|
+
} from "./chunk-JAU72XNY.js";
|
|
35
35
|
import {
|
|
36
36
|
logExtension
|
|
37
|
-
} from "./chunk-
|
|
37
|
+
} from "./chunk-XTMJ7XDT.js";
|
|
38
38
|
import {
|
|
39
39
|
CONFIG_SCHEMA_ANCHOR_KEY,
|
|
40
40
|
CONFIG_SCHEMA_ID,
|
|
41
41
|
DEPRECATED_CONFIG_SURFACES,
|
|
42
42
|
STABILITY_TIER_KEY,
|
|
43
43
|
withConfigDiagnosticCode
|
|
44
|
-
} from "./chunk-
|
|
44
|
+
} from "./chunk-JMYYOTQG.js";
|
|
45
45
|
import {
|
|
46
46
|
redactSecrets,
|
|
47
47
|
toPositiveFinite
|
|
48
|
-
} from "./chunk-
|
|
48
|
+
} from "./chunk-AOHZU2BM.js";
|
|
49
49
|
import {
|
|
50
50
|
BoundedLruCache
|
|
51
51
|
} from "./chunk-ABBOA7UD.js";
|
|
@@ -54,7 +54,7 @@ import {
|
|
|
54
54
|
isAtOrAboveHomeDir,
|
|
55
55
|
isWindowsPath,
|
|
56
56
|
walkUpDirs
|
|
57
|
-
} from "./chunk-
|
|
57
|
+
} from "./chunk-N2H3ZPZY.js";
|
|
58
58
|
|
|
59
59
|
// dist/clients/generated-artifacts.js
|
|
60
60
|
import * as fs from "node:fs";
|
|
@@ -486,6 +486,9 @@ var TIER_CLASS = {
|
|
|
486
486
|
function tierPrecedence(tier) {
|
|
487
487
|
return SOURCE_TIERS.indexOf(tier);
|
|
488
488
|
}
|
|
489
|
+
function isRepoTier(tier) {
|
|
490
|
+
return TIER_CLASS[tier] === "repo";
|
|
491
|
+
}
|
|
489
492
|
function isOperatorTier(tier) {
|
|
490
493
|
return TIER_CLASS[tier] === "operator";
|
|
491
494
|
}
|
|
@@ -845,6 +848,9 @@ function propertySchema(node, name) {
|
|
|
845
848
|
return child;
|
|
846
849
|
}
|
|
847
850
|
}
|
|
851
|
+
const additional = node.additionalProperties;
|
|
852
|
+
if (isSchemaNode(additional))
|
|
853
|
+
return additional;
|
|
848
854
|
return void 0;
|
|
849
855
|
}
|
|
850
856
|
function additionalPropertyPolicy(node) {
|
|
@@ -1282,6 +1288,15 @@ function walkScalar(value, schema, context, declared) {
|
|
|
1282
1288
|
});
|
|
1283
1289
|
return DROPPED;
|
|
1284
1290
|
}
|
|
1291
|
+
const minLength = schema?.minLength;
|
|
1292
|
+
if (declared === "string" && typeof minLength === "number" && typeof value === "string" && value.length < minLength) {
|
|
1293
|
+
record2(context, {
|
|
1294
|
+
code: "PILENS_CFG_0005",
|
|
1295
|
+
key: pointerOf(context.path),
|
|
1296
|
+
reason: `string must contain at least ${minLength} character${minLength === 1 ? "" : "s"}; ignored`
|
|
1297
|
+
});
|
|
1298
|
+
return DROPPED;
|
|
1299
|
+
}
|
|
1285
1300
|
return checkEnum(value, schema, context) ? value : DROPPED;
|
|
1286
1301
|
}
|
|
1287
1302
|
function checkEnum(value, schema, context) {
|
|
@@ -1375,6 +1390,67 @@ function lspServerEntryNode() {
|
|
|
1375
1390
|
items: { type: "string", [STABILITY_TIER_KEY]: "experimental" },
|
|
1376
1391
|
[MERGE_STRATEGY_KEY]: "replace",
|
|
1377
1392
|
[STABILITY_TIER_KEY]: "experimental"
|
|
1393
|
+
},
|
|
1394
|
+
name: { type: "string", [STABILITY_TIER_KEY]: "experimental" },
|
|
1395
|
+
enabled: { type: "boolean", [STABILITY_TIER_KEY]: "experimental" },
|
|
1396
|
+
role: {
|
|
1397
|
+
type: "string",
|
|
1398
|
+
enum: ["language", "auxiliary"],
|
|
1399
|
+
[STABILITY_TIER_KEY]: "experimental"
|
|
1400
|
+
},
|
|
1401
|
+
// `command` accepts string here solely for the compatibility window;
|
|
1402
|
+
// ResolvedLspConfig makes argv the only canonical output.
|
|
1403
|
+
command: { [STABILITY_TIER_KEY]: "experimental" },
|
|
1404
|
+
args: {
|
|
1405
|
+
type: "array",
|
|
1406
|
+
items: { type: "string", [STABILITY_TIER_KEY]: "experimental" },
|
|
1407
|
+
[STABILITY_TIER_KEY]: "experimental"
|
|
1408
|
+
},
|
|
1409
|
+
extensions: {
|
|
1410
|
+
type: "array",
|
|
1411
|
+
items: { type: "string", [STABILITY_TIER_KEY]: "experimental" },
|
|
1412
|
+
[STABILITY_TIER_KEY]: "experimental"
|
|
1413
|
+
},
|
|
1414
|
+
rootMarkers: {
|
|
1415
|
+
type: "array",
|
|
1416
|
+
items: { type: "string", [STABILITY_TIER_KEY]: "experimental" },
|
|
1417
|
+
[STABILITY_TIER_KEY]: "experimental"
|
|
1418
|
+
},
|
|
1419
|
+
env: {
|
|
1420
|
+
type: "object",
|
|
1421
|
+
additionalProperties: {
|
|
1422
|
+
type: "string",
|
|
1423
|
+
[STABILITY_TIER_KEY]: "experimental"
|
|
1424
|
+
},
|
|
1425
|
+
[STABILITY_TIER_KEY]: "experimental"
|
|
1426
|
+
},
|
|
1427
|
+
initializationOptions: {
|
|
1428
|
+
type: "object",
|
|
1429
|
+
additionalProperties: true,
|
|
1430
|
+
[STABILITY_TIER_KEY]: "experimental"
|
|
1431
|
+
}
|
|
1432
|
+
}
|
|
1433
|
+
};
|
|
1434
|
+
}
|
|
1435
|
+
function lspServerOverrideNode() {
|
|
1436
|
+
return {
|
|
1437
|
+
type: "object",
|
|
1438
|
+
additionalProperties: true,
|
|
1439
|
+
[STABILITY_TIER_KEY]: "experimental",
|
|
1440
|
+
properties: {
|
|
1441
|
+
command: { [STABILITY_TIER_KEY]: "experimental" },
|
|
1442
|
+
env: {
|
|
1443
|
+
type: "object",
|
|
1444
|
+
additionalProperties: {
|
|
1445
|
+
type: "string",
|
|
1446
|
+
[STABILITY_TIER_KEY]: "experimental"
|
|
1447
|
+
},
|
|
1448
|
+
[STABILITY_TIER_KEY]: "experimental"
|
|
1449
|
+
},
|
|
1450
|
+
initializationOptions: {
|
|
1451
|
+
type: "object",
|
|
1452
|
+
additionalProperties: true,
|
|
1453
|
+
[STABILITY_TIER_KEY]: "experimental"
|
|
1378
1454
|
}
|
|
1379
1455
|
}
|
|
1380
1456
|
};
|
|
@@ -1399,7 +1475,7 @@ function lspNamespace() {
|
|
|
1399
1475
|
// #3968: server entries are TYPED — each carries the covers
|
|
1400
1476
|
// claim node — while staying open on every other field.
|
|
1401
1477
|
{ additionalProperties: lspServerEntryNode() }
|
|
1402
|
-
) : { additionalProperties: true } : {},
|
|
1478
|
+
) : key === "serverOverrides" ? { additionalProperties: lspServerOverrideNode() } : { additionalProperties: true } : {},
|
|
1403
1479
|
...denyAnnotation(key)
|
|
1404
1480
|
};
|
|
1405
1481
|
}
|
|
@@ -1410,6 +1486,31 @@ function lspNamespace() {
|
|
|
1410
1486
|
properties
|
|
1411
1487
|
};
|
|
1412
1488
|
}
|
|
1489
|
+
function rulePolicyEntryNode() {
|
|
1490
|
+
return {
|
|
1491
|
+
type: "object",
|
|
1492
|
+
additionalProperties: true,
|
|
1493
|
+
properties: {
|
|
1494
|
+
threshold: { type: "number", [STABILITY_TIER_KEY]: "experimental" },
|
|
1495
|
+
// These two legacy fields remain opaque so the project compatibility
|
|
1496
|
+
// parser can preserve its established field-specific diagnostics.
|
|
1497
|
+
disable: opaque("experimental"),
|
|
1498
|
+
select: opaque("experimental"),
|
|
1499
|
+
ignorePaths: {
|
|
1500
|
+
type: "array",
|
|
1501
|
+
items: {
|
|
1502
|
+
type: "string",
|
|
1503
|
+
minLength: 1,
|
|
1504
|
+
[STABILITY_TIER_KEY]: "experimental"
|
|
1505
|
+
},
|
|
1506
|
+
[MERGE_STRATEGY_KEY]: "append",
|
|
1507
|
+
[DENY_KEY]: "array-union",
|
|
1508
|
+
[STABILITY_TIER_KEY]: "experimental"
|
|
1509
|
+
}
|
|
1510
|
+
},
|
|
1511
|
+
[STABILITY_TIER_KEY]: "experimental"
|
|
1512
|
+
};
|
|
1513
|
+
}
|
|
1413
1514
|
function buildConfigSchema() {
|
|
1414
1515
|
const properties = {};
|
|
1415
1516
|
for (const key of [
|
|
@@ -1435,6 +1536,11 @@ function buildConfigSchema() {
|
|
|
1435
1536
|
])),
|
|
1436
1537
|
[STABILITY_TIER_KEY]: "stable"
|
|
1437
1538
|
};
|
|
1539
|
+
properties.rules = {
|
|
1540
|
+
type: "object",
|
|
1541
|
+
additionalProperties: rulePolicyEntryNode(),
|
|
1542
|
+
[STABILITY_TIER_KEY]: "experimental"
|
|
1543
|
+
};
|
|
1438
1544
|
for (const key of PROJECT_FOREIGN_CONFIG_NAMESPACES) {
|
|
1439
1545
|
properties[key] ??= opaque("experimental");
|
|
1440
1546
|
}
|
|
@@ -2097,6 +2203,18 @@ function parseRulePolicyList(note, ruleId, key, value) {
|
|
|
2097
2203
|
}
|
|
2098
2204
|
return { list, invalid: false };
|
|
2099
2205
|
}
|
|
2206
|
+
function parseRulePathList(note, ruleId, value) {
|
|
2207
|
+
if (!Array.isArray(value)) {
|
|
2208
|
+
note(`rules.${ruleId}.ignorePaths must be an array of strings`);
|
|
2209
|
+
return void 0;
|
|
2210
|
+
}
|
|
2211
|
+
const paths = value.filter((entry) => typeof entry === "string" && entry.trim().length > 0).map((entry) => entry.trim());
|
|
2212
|
+
if (value.length > 0 && paths.length === 0) {
|
|
2213
|
+
note(`rules.${ruleId}.ignorePaths must contain a non-empty string`);
|
|
2214
|
+
return void 0;
|
|
2215
|
+
}
|
|
2216
|
+
return paths;
|
|
2217
|
+
}
|
|
2100
2218
|
var NO_RECORDS = [];
|
|
2101
2219
|
function parseConfigFile(configPath) {
|
|
2102
2220
|
const { note, records: ignoredRecords } = ignoredRecordCollector(configPath, "project");
|
|
@@ -2131,7 +2249,11 @@ function parseConfigFile(configPath) {
|
|
|
2131
2249
|
value: outcome.value
|
|
2132
2250
|
});
|
|
2133
2251
|
const raw = resolved.value;
|
|
2134
|
-
const
|
|
2252
|
+
const rawProject = outcome.value;
|
|
2253
|
+
const obj = {
|
|
2254
|
+
...resolved.value,
|
|
2255
|
+
...rawProject.rules !== void 0 ? { rules: rawProject.rules } : {}
|
|
2256
|
+
};
|
|
2135
2257
|
const ignore = Array.isArray(obj.ignore) ? obj.ignore.filter((p) => typeof p === "string") : [];
|
|
2136
2258
|
const mutations = {};
|
|
2137
2259
|
for (const spec of PROJECT_SCOPED_LENS_FLAGS) {
|
|
@@ -2163,9 +2285,14 @@ function parseConfigFile(configPath) {
|
|
|
2163
2285
|
if (!parsed.invalid && parsed.list.length > 0)
|
|
2164
2286
|
entry.select = parsed.list;
|
|
2165
2287
|
}
|
|
2166
|
-
if (
|
|
2288
|
+
if ("ignorePaths" in r) {
|
|
2289
|
+
const paths = parseRulePathList(note, ruleId, r.ignorePaths);
|
|
2290
|
+
if (paths && paths.length > 0)
|
|
2291
|
+
entry.ignorePaths = paths;
|
|
2292
|
+
}
|
|
2293
|
+
if (entry.threshold !== void 0 || entry.disable || entry.select || entry.ignorePaths) {
|
|
2167
2294
|
rules[ruleId] = entry;
|
|
2168
|
-
} else if (!("threshold" in r) && !("disable" in r) && !("select" in r)) {
|
|
2295
|
+
} else if (!("threshold" in r) && !("disable" in r) && !("select" in r) && !("ignorePaths" in r)) {
|
|
2169
2296
|
note(`rules.${ruleId} has no recognized setting (threshold, disable, select); ignored`);
|
|
2170
2297
|
}
|
|
2171
2298
|
}
|
|
@@ -2284,7 +2411,7 @@ function parseConfigFile(configPath) {
|
|
|
2284
2411
|
raw,
|
|
2285
2412
|
configPath
|
|
2286
2413
|
},
|
|
2287
|
-
records: resolved.records,
|
|
2414
|
+
records: resolved.records.filter((record4) => !record4.key.startsWith("/rules/")),
|
|
2288
2415
|
ignored: ignoredRecords()
|
|
2289
2416
|
};
|
|
2290
2417
|
}
|
|
@@ -2297,6 +2424,7 @@ export {
|
|
|
2297
2424
|
detectFileRole,
|
|
2298
2425
|
notifyUserDegradation,
|
|
2299
2426
|
warnIgnoredConfigOnce,
|
|
2427
|
+
isRepoTier,
|
|
2300
2428
|
provenanceView,
|
|
2301
2429
|
provenanceFor,
|
|
2302
2430
|
compareKeys,
|
|
@@ -2,11 +2,11 @@ import { createRequire as __pilensCreateRequire } from "node:module"; const requ
|
|
|
2
2
|
import {
|
|
3
3
|
classifyRunOutcome,
|
|
4
4
|
firstOutputLine
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-UZ3TUTRV.js";
|
|
6
6
|
import {
|
|
7
7
|
incrementDegradationCount,
|
|
8
8
|
truncateForLedger
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-JAU72XNY.js";
|
|
10
10
|
|
|
11
11
|
// dist/clients/dispatch/types.js
|
|
12
12
|
var RUNNER_SKIP_REASONS = [
|
|
@@ -54,55 +54,56 @@ import {
|
|
|
54
54
|
reviewGraphCachePath,
|
|
55
55
|
terminateReviewGraphPersistWorkerForTests,
|
|
56
56
|
waitForReviewGraphPersistsForTests
|
|
57
|
-
} from "./chunk-
|
|
57
|
+
} from "./chunk-PV6LR5P5.js";
|
|
58
58
|
import "./chunk-3MED75HT.js";
|
|
59
|
-
import "./chunk-
|
|
60
|
-
import "./chunk-
|
|
61
|
-
import "./chunk-
|
|
62
|
-
import "./chunk-OAXNDZJ7.js";
|
|
59
|
+
import "./chunk-CO2G5PHH.js";
|
|
60
|
+
import "./chunk-IBGIOBEE.js";
|
|
61
|
+
import "./chunk-PNQDPDRC.js";
|
|
63
62
|
import "./chunk-XIMYZ3JA.js";
|
|
64
|
-
import "./chunk-
|
|
65
|
-
import "./chunk-
|
|
66
|
-
import "./chunk-
|
|
63
|
+
import "./chunk-ESBQHFMJ.js";
|
|
64
|
+
import "./chunk-34WSVGEM.js";
|
|
65
|
+
import "./chunk-VWCXW2E7.js";
|
|
66
|
+
import "./chunk-ZXYDQ3TZ.js";
|
|
67
67
|
import "./chunk-5W3R6LFT.js";
|
|
68
|
-
import "./chunk-
|
|
68
|
+
import "./chunk-QHJ6DQ2R.js";
|
|
69
69
|
import "./chunk-Z54ZSOBZ.js";
|
|
70
|
-
import "./chunk-
|
|
70
|
+
import "./chunk-724UL2TJ.js";
|
|
71
71
|
import "./chunk-QOZXJ4NA.js";
|
|
72
|
-
import "./chunk-
|
|
73
|
-
import "./chunk-
|
|
74
|
-
import "./chunk-
|
|
75
|
-
import "./chunk-
|
|
76
|
-
import "./chunk-
|
|
77
|
-
import "./chunk-
|
|
72
|
+
import "./chunk-GBPP5P7X.js";
|
|
73
|
+
import "./chunk-P7266HLM.js";
|
|
74
|
+
import "./chunk-MQLUAEOC.js";
|
|
75
|
+
import "./chunk-52FUZI6K.js";
|
|
76
|
+
import "./chunk-SAEFPSB6.js";
|
|
77
|
+
import "./chunk-GAEGEPOC.js";
|
|
78
78
|
import "./chunk-Z3CCVDUB.js";
|
|
79
|
-
import "./chunk-
|
|
79
|
+
import "./chunk-L3BLXZG7.js";
|
|
80
80
|
import "./chunk-2BEMIWEW.js";
|
|
81
|
-
import "./chunk-
|
|
82
|
-
import "./chunk-
|
|
83
|
-
import "./chunk-
|
|
84
|
-
import "./chunk-
|
|
85
|
-
import "./chunk-
|
|
86
|
-
import "./chunk-
|
|
87
|
-
import "./chunk-
|
|
88
|
-
import "./chunk-
|
|
89
|
-
import "./chunk-
|
|
90
|
-
import "./chunk-
|
|
91
|
-
import "./chunk-VN2AXLEX.js";
|
|
81
|
+
import "./chunk-66VMUL7Q.js";
|
|
82
|
+
import "./chunk-Q7DUK4LX.js";
|
|
83
|
+
import "./chunk-AW7R2GWG.js";
|
|
84
|
+
import "./chunk-RWWYJ623.js";
|
|
85
|
+
import "./chunk-VRZP76YM.js";
|
|
86
|
+
import "./chunk-QOBUHWHX.js";
|
|
87
|
+
import "./chunk-QILIYSJF.js";
|
|
88
|
+
import "./chunk-6C7JWPCP.js";
|
|
89
|
+
import "./chunk-5NGR67U5.js";
|
|
90
|
+
import "./chunk-C34ZXZ7O.js";
|
|
92
91
|
import "./chunk-BW5KFIQC.js";
|
|
93
92
|
import "./chunk-QYF5S6P6.js";
|
|
94
|
-
import "./chunk-
|
|
95
|
-
import "./chunk-
|
|
96
|
-
import "./chunk-
|
|
93
|
+
import "./chunk-PHDMFAKM.js";
|
|
94
|
+
import "./chunk-2BBLFX75.js";
|
|
95
|
+
import "./chunk-XVF2VVXP.js";
|
|
96
|
+
import "./chunk-ZANLILYD.js";
|
|
97
97
|
import "./chunk-2EECBNC5.js";
|
|
98
|
-
import "./chunk-
|
|
99
|
-
import "./chunk-
|
|
100
|
-
import "./chunk-
|
|
101
|
-
import "./chunk-
|
|
98
|
+
import "./chunk-JAU72XNY.js";
|
|
99
|
+
import "./chunk-XTMJ7XDT.js";
|
|
100
|
+
import "./chunk-JMYYOTQG.js";
|
|
101
|
+
import "./chunk-QQNQ7SJW.js";
|
|
102
|
+
import "./chunk-AOHZU2BM.js";
|
|
102
103
|
import "./chunk-LJDODBBZ.js";
|
|
103
|
-
import "./chunk-
|
|
104
|
+
import "./chunk-CHOW74WE.js";
|
|
104
105
|
import "./chunk-ABBOA7UD.js";
|
|
105
|
-
import "./chunk-
|
|
106
|
+
import "./chunk-N2H3ZPZY.js";
|
|
106
107
|
import "./chunk-NXL4FFQQ.js";
|
|
107
108
|
export {
|
|
108
109
|
GRAPH_PERSIST_MAX_ELEMENTS_DEFAULT,
|