Added
- Subagent identity in the instance registry
- Same-workspace warm LSP attach (opt-in soak)
- Resource-aware cross-process LSP budget policy
- Review-graph JavaScript/TypeScript import resolution now follows tsconfig project references
getWorkspaceTopology— shared, memoized workspace-topology marker index- Root/language-root resolution migrated onto the workspace-topology index — second wave
- Empirical monorepo test harness — Track B of the #775 root-resolution audit
- New
project_reportregistered tool (+ MCP mirrorpilens_project_report)
Fixed
- Markdownlint no longer passes the invalid
--disable MD013CLI option safeSpawnAsync(and the deprecated syncsafeSpawn) no longer build a cmd.exe command line from caller-tainted input on Windows- Multi-server
clientScope: "all"diagnostic touches now get the same silent-clean confirm #799 gave the single-server hot path - Windows subprocess arguments no longer pass through Node's
shell:trueconcatenation - CI drift alerts no longer interpolate third-party output into shell code
- Windows temp-dir teardown no longer fails tests with EPERM/ENOTEMPTY
lens_diagnostic_markno longer trusts a stale caller-suppliedlineverbatim — it verifies/reanchors against current diagnostics before writing anything- Silent-clean workspace-indexing LSP warm-ups no longer pay the generic 20-second cold floor
- Cold
lens_diagnosticsfull sweeps no longer burn 2x20s on marksman for a clean markdown project, and no longer re-pay a failed warm-up on every retry sweep - mutation-control config follow-ups (#792): global
autofix.enablednow honored (docs promised it, code ignored it), the MCP … - deferred auto-format queue: records are now owned by the queuing session/turn (#791)
- compat-smoke behavioral harness: scratch-dir cleanup crash (ENOTEMPTY race) no longer discards assertion results and falsely … (#785)
- A review graph no longer keeps serving a stale pre-cap snapshot once a repo grows past the review-graph file cap, and
project_reportnow says so honestly - Package-local
.pi-lens.jsonignorepatterns are now honored — layered the same way nested.gitignores are - Two Track B (#775) follow-ups from the empirical monorepo test harness
- Three monorepo quick-wins from the #775 root-resolution audit
collectSourceFiles/collectSourceFilesAsync(clients/source-filter.ts) now bound the walk by directory entries VISITED, not just source files FOUND- The startup source-file count walk now stops after a bounded number of directory entries instead of traversing the entire project tree
writeStateinclients/diagnostic-dispositions.tsnow writes the disposition store via tmp+rename instead of a plainfs.writeFileSynclens_diagnostic_markdispositions now apply to the cachedlens_diagnosticsdelta/all modes immediately, without waiting for the file to be re-dispatched- Remaining cwd-rooted scan roots now carry the same
isAtOrAboveHomeDirceiling, and the source-file walk is capped structurally - A sweep warm-up that times out now retries once and, if still cold, skips that server's files for the rest of the sweep instead of letting a wedged server drag the whole run
- A single backpressured LSP server no longer times out the didOpen/didChange notify write for an entire
clientScope:"all"file touch, zeroing every co-touched healthy server's diagnostics lens_diagnostics mode=fullno longer launches heavyweight analyzers from$HOMEor abovesymbol_search's cold word-index build no longer walks an unbounded tree from$HOMEhasOxlintConfignow detects.oxlintrc.jsonc,oxlint.config.ts, andoxlint.config.mts
Changed
- Incumbent LSP wait policy now has one process-neutral module boundary
- Review-graph file budget now tapers instead of scaling flatly or cliff-dropping above 1,000 files
- Review-graph JS/TS imports now honor
compilerOptions.baseUrlandpathsaliases, including relativeextendschains - Nested mutation controls now layer per edited file
symbol_search/pilens_symbol_searchgainedpaths/langfilters, per-hitsuggestedNextdiscovery hints, and warm-review-graph annotations- New
lazyEnvNumber(envName, fallback)factory inclients/env-utils.ts - Introduced a shared
writeFileAtomic/writeFileAtomicAsynchelper (clients/atomic-write.ts) and migrated four of the five hand-rolled${target}.tmp-${pid}+renameSync/renamewriters onto it - Consolidated the repo's recursive tree walkers onto a shared bounded-walk engine in
clients/source-walker.ts - Unified the five independently-hardcoded project-size budgets behind one configurable
maxProjectFilesscale knob
🙏 Thanks
Thanks to the external contributors in this release: