Skip to content

Releases: gjczone/pi-shazam

v0.30.0

Choose a tag to compare

@gjczone gjczone released this 12 Jul 16:03

v0.30.0

What's Changed

Fixed

  • Truncated flag dropped on no-changes cache hit (#754): The scanProject
    no-changes cache-hit path now sets graph.truncated so the incompleteness
    warning reaches all tools. Every other return path already did this; only the
    fast path was missing it.

  • Silent realpathSync failures in LSP discovery (#755): The
    comment-only catch in lsp/manager.ts now logs via _logWarn so filesystem
    errors (EACCES, ELOOP, ENOTDIR) during LSP server discovery are diagnosable
    instead of swallowed.

  • isError flag discarded by Pi tool wrappers (#756): The factory
    execute return type now supports { text, isError? } from dispatchers,
    and the factory normalizes + propagates isError into the
    AgentToolResult. tools/impact.ts, tools/changes.ts, and
    tools/overview.ts now return the full DispatchResult instead of .text
    only. Path-traversal and validation rejections now correctly surface as
    tool errors.

  • Zombie MCP processes on Windows disconnect (#757): All four shutdown
    triggers (transport.onclose, stdin end/error/close) now call a shared
    shutdownAndExit helper that defers process.exit(0) via setImmediate
    after shutdown() completes, matching the existing SIGTERM/SIGINT
    handler pattern.

  • JSON envelope missing truncated field (#758): buildEnvelope now
    accepts an optional { truncated } option and surfaces it as a top-level
    flag. The factory injects graph.truncated into JSON output so MCP/JSON
    consumers can detect incomplete graphs when MAX_FILES was hit.

  • Format root mismatch — validation vs. execution (#759):
    tools/format.ts now validates options.file against projectRoot (the
    same root used for formatter execution) instead of getEffectiveRoot(),
    eliminating the scenario where a file passes validation against one root
    but is formatted under another.

  • Argument injection via dash-prefixed filenames (#760): All five
    formatter cases (prettier, eslint, biome, ruff, gofmt) now insert --
    before targetFile so filenames starting with - are never interpreted
    as formatter flags.

  • check-destructive.sh fail-open on logging failure (#761): The
    BLOCKED and MEDIUM paths now wrap mkdir -p and echo >> in || true
    guards so a logging failure (read-only fs, permission denied) cannot
    change the exit code away from 2 and cause a destructive command to
    proceed. Both codebuddy and kimi hooks are updated.

  • V3 incremental scan stale edge cleanup (#752): _appendEdge now
    populates targetToSources so the incremental scan path correctly
    removes stale edges when files are deleted.

  • Shell hooks hardened against fail-open (#750): Source resolver,
    alias expansion, and rm regex patterns hardened so unexpected shell
    state cannot cause hooks to silently pass when they should block.

  • Home-directory scan guard (#720, #724): The scanner refuses to
    operate on $HOME / %USERPROFILE% by default (opt-out via
    PI_SHAZAM_ALLOW_HOME=1). HOME_SKIP_DIRS entries are scoped so
    cross-platform patterns cannot skip real source directories.

  • Stderr noise reduction (#632, #727): Suppressed ENOENT warnings on
    negative filesystem probes; silenced isGitRepo warnings on non-git
    directories; aligned validatePathInProjectCore to _logWarn.

  • Degraded-mode visibility (#728-#734, #731-#733): Truncation
    warnings now reach all tools, not just overview. Cache persistence status
    propagates to RepoGraph.cacheStatus. Parser degraded queries are
    surfaced in the overview. LSP memory leak fixed (LRU cap on opened files).

  • Batch P1 code-review fixes (#735-#739): Null guards, defaults, path
    classification, flat tests, stderr noise reduction, stale state cleanup,
    partial hierarchy fixes.

Upgrade

pi install npm:pi-shazam@latest

Or for MCP clients:

{ "mcpServers": { "pi-shazam": { "command": "npx", "args": ["-y", "-p", "pi-shazam@latest", "pi-shazam-mcp"] } } }

Full Changelog: v0.27.1...v0.30.0

v0.27.1

Choose a tag to compare

@gjczone gjczone released this 10 Jul 03:54

pi-shazam v0.27.1

Emergency fix release. v0.27.0 shipped the full 0.27 feature set (V3 ProtoBuf
cache, impact provenance + Mermaid graph, overview module-density ranking, lookup
provenance edges, GitHub Action wrapper, and more) but was pulled because a
packaging defect excluded the runtime protobufjs dependency, breaking the MCP
server and V3 cache on a fresh install. v0.27.1 contains everything in v0.27.0
plus the dependency fix below. If you installed v0.27.0, upgrade to v0.27.1.

What's Changed in v0.27.1

Fixed

  • Runtime protobufjs missing from published package (#722): protobufjs was
    declared in devDependencies but imported at runtime by core/proto-schema.ts,
    so the published 0.27.0 tarball excluded it and the MCP server / V3 cache path
    failed with ERR_MODULE_NOT_FOUND on a fresh install. Moved protobufjs to
    dependencies (kept protobufjs-cli in devDependencies) so it ships in the package.

v0.27.0 Feature Highlights (included in v0.27.1)

Added

  • V3 ProtoBuf cache format (#628, #646): New compact binary cache that
    encodes edge data as columnar ProtoBuf arrays behind a 4-byte SHA\3
    magic header. On a 1000-symbol project the on-disk cache drops from
    ~800KB (V2 JSON) to ~30% smaller in practice; the V2 JSON format stays
    readable for backward compatibility. Schema lives in core/graph.proto
    (source of truth) with a JSON runtime mirror in core/proto-schema.ts
    (protobufjs, no generated static module in dist/). saveGraphCache
    now writes V3 by default; loadGraphCache detects the magic header and
    falls back to V2 for older caches, preserving the fileMtimes map so
    mtime-based invalidation is unchanged.

  • Impact enrichment: provenance breakdown + Mermaid call graph (#631 B):
    shazam_impact JSON now carries a provenanceCounts field per affected
    symbol (resolved vs. heuristic at a glance) plus a compact R:N N:M H:K
    badge on the affected-file markdown line; call-chain edges carry an
    explicit provenance. Every CallChainEntry also gains a self-contained
    Mermaid flowchart TD block (mermaid field) with provenance as edge
    labels and solid/dashed arrows, capped at 30 nodes.

  • Overview module-density ranking (#631 B): shazam_overview surfaces a
    topByDensity list on the JSON envelope and a "Module Density (Top 10 by
    symbols-per-file)" markdown section to flag "god module" candidates.

  • Lookup provenance edges + provenance-weight sort (#631 B, #643):
    shazam_lookup JSON mode now exposes incomingEdges / outgoingEdges
    (up to 20 each, with provenance) and a precomputed provenanceCounts
    summary per entry (#643). Entries are sorted by provenance weight
    (resolved > name_match > heuristic > unresolved, PageRank tiebreak) so the
    most-trustworthy matches come first; markdown output keeps the original
    PageRank ordering.

  • Changes structural (line-count) working-tree view (#631 B):
    shazam_changes adds a structuralChanges field with added/removed/
    modified line counts from git diff --numstat (staged + unstaged, binary
    files skipped, capped at 20 files), plus a compact (+N -M lines across K files) markdown badge.

  • GitHub Action wrapper for shazam_verify (#638, #652): Composite
    action at .github/actions/shazam-verify/ runs shazam_verify on every
    PR and posts a risk-scored review as a PR comment (plus step summary).
    Adds tools/verify-comment.ts (formatVerifyComment), an action.yml
    manifest, orchestrator/entrypoint scripts, and tests/github-action-*.test.ts
    (25 tests). Adds the yaml devDependency.

  • ProtoBuf schema mirror consistency test (tests/cache-proto-schema.test.ts):
    Parses core/graph.proto text and asserts the field set, IDs,
    types, and repeated flags match the JSON mirror in
    core/proto-schema.ts. Catches drift between the two schema
    sources before it can corrupt a cache file.

  • V3.0 / V3.1 legacy deserializers (deserializeGraphV3V0,
    deserializeGraphV3V1, +WithMetadata variants) plus
    encodeGraphPayloadV31 / decodeGraphPayloadV31 for tests.
    Public surface for the in-place converter; kept so the load
    path can decode legacy wire formats.

  • Real-world size sanity check in tests/benchmark-v3.test.ts:
    Documented the V3.1 ratio on a self-scan of pi-shazam (3499
    symbols, 1264 symbol-level edges, 7236 file-level rows): V3.1
    is 96% of V2 on a real project (vs. 53% on the edge-heavy
    synthetic benchmark), because real projects spend most bytes
    on the JSON metadata + non-deduped file-level rows.

Changed

  • Cyclomatic complexity via tree-sitter AST (#642): Replaced the regex
    sweep that counted if|else|for|while|case|catch + &&/||/:? across
    whole source slices (which inflated scores by counting keywords inside
    comments/strings) with a tree-sitter complexity query matching real
    branching AST nodes only, applying the else-if rule (plain else adds 0,
    else if adds 1) on a baseline score of 1. Queries added for
    TS/TSX/JS/Python/Go/Rust; the original regex is kept as a fallback for
    languages without a compiled query, preserving coverage.

  • Tool defaults tightened for LLM agents + per-edge provenance (#629,
    #633, #634, #635, #636; #640)
    : Bundled four related quality PRs. Unified
    Affected-Tests detection (core/test-patterns.ts is now the single source
    of truth; symbol-mode JSON carries affectedTests). Display polish +
    path-traversal UX (classifyFilePath distinguishes traversal vs. missing;
    did-you-mean for lookup/impact/format). Per-edge provenance on Edge
    with LSP-driven promotion (upgradeEdgesToResolved / upgradeEdgesForHotspots,
    zero extra LSP latency). Always-on defaults: ### Hotspots always in
    overview text and JSON.hotspots.{byPageRank,byComplexity}; verify uses a
    single-line-per-diagnostic format with a summary header (drops suggestedFixes
    text + .shazam auto-export); inferImpactMode() picks symbol vs. files
    mode from input shape, removing the strict mutual-exclusion error.

  • Verify flags migrated to .pi-shazam/config.json; lookup mode=state
    removed (#630)
    : New core/config.ts loads .pi-shazam/config.json
    (missing/empty = silent defaults, malformed = warn). shazam_verify
    maxFiles now resolves from config.verify.maxFiles (default 100); dead
    noCascade / noSecrets options removed. shazam_lookup mode=state was
    first deprecated (warn) then fully removed — callers now get a clear error
    pointing at --name / --direction.

  • Default scan now excludes tests/ (#632): scanProject skips the
    tests/ directory by default (override with includeTests).

  • Typed result builders across all tools (#631 A): Introduced pure,
    typed builders — buildVerifyResult, buildFormatResult,
    buildOverviewResult, buildImpactResult + buildCallChainResult,
    buildChangesResult (+ renderChangesMarkdown), typed XxxResult for all
    three lookup modes, and a kind discriminator with executeRenameSymbolJson.
    Tool internals now build a typed model before rendering JSON/markdown,
    reducing envelope drift and enabling direct result assertions in tests.

  • V3.1 cache: string table for symbol ID dedup (#647): The on-disk
    graph cache (core/cache.ts V3 format) now stores each unique
    symbol ID exactly once in a top-level string_table; every edge's
    source / target is referenced by int32 index. On a 1000-symbol
    graph with ~3 edges per node this brings the V3 cache to ~53% of
    the V2 size (down from ~68% in V3.0), close to the plan's 50%
    target. The on-disk magic header bumped from SHA\3 to SHA\4;
    old V3.0 caches fall through to the V2 JSON path on load (which
    fails to parse) and the scanner rebuilds them on the next scan.
    Schema changes are additive and live in core/graph.proto (source
    of truth) + core/proto-schema.ts (JSON runtime mirror).

  • V3.2 cache: kind int enum + silent in-place upgrade (#647 follow-ups
    D + E)
    : Edge kind is encoded as int32 (1 byte varint) instead
    of string (5-7 bytes per row) — on a real-world self-scan this
    shaves another ~30-50 KB on top of V3.1. The on-disk magic header
    bumped from SHA\4 to SHA\5. loadGraphCache now auto-upgrades
    legacy V3.0 (SHA\3, no string table) and V3.1 (SHA\4, kind as
    string) caches to V3.2 in place on first read, so users on v0.27.0
    (PR-G) and the just-shipped V3.1 release of this branch pay no
    re-scan cost
    on upgrade. The V3.1-specific ProtoBuf schema
    (kind: string) lives in core/proto-schema.ts as a separate
    Root so the in-place decoder can interpret the legacy wire
    format; the V3.2 writer always produces the canonical int32 form.

Fixed

  • Batch code-review fixes (code-review findings #687-#701): Resolves
    15 code-review-labelled findings across the tool surface. Highlights:
    • Rust import resolution (#687): Non-prefixed multi-segment use
      paths (use utils::helper::doThing) are now resolved from the crate
      root (Rust 2018+ semantics) instead of being dropped as external crates,
      so shazam_impact / shazam_verify no longer miss local Rust edges.
    • Symlink path-traversal in auto-format (#688, P0): hooks/shazam-guide.ts
      autoFormatFile now validates via validatePathInProject (realpathSync
      symlink-escape check) instead of the string-only isPathInRoot, and
      imports it from tools/_factory.ts (resolving the hook→tools layer
      violation flagged in #697).
    • Silent audit-log discards (#689): Two empty catch blocks in
      index.ts shazam-doctor parsing now log via _logWarn instead of
      swallowing malformed internal.log / shazam-calls.log lines.
    • Silent cache-write failures (#690): saveGraphCache catch blocks in
      core/scanner.ts now emit _logWarn (incremental + full paths) so
      ENOSPC/EACCES/EROFS cache drops are observable, not silent.
    • *...
Read more

v0.26.0

Choose a tag to compare

@gjczone gjczone released this 03 Jul 04:18

v0.26.0

What's Changed

Added

  • Shared MCP/Pi dispatch layer (#618): All 7 tools now share a single dispatch
    implementation in tools/_dispatchers.ts. Pi and MCP handlers call the same
    dispatcher functions, eliminating the dual-maintenance that caused 8 behavioral
    differences in #616. mcp/tools.ts reduced from ~450 lines to ~100 lines.

  • MCP-Pi parity contract tests (#619): 19 contract tests verify that Pi and
    MCP tool handlers produce identical output for the same input. Covers all 7
    tools with key scenarios: known symbols, file paths, error paths, JSON mode,
    path traversal rejection, and mutual exclusion.

  • Static parity check script (#620): scripts/check-mcp-parity.sh runs 10
    grep-based heuristic checks to detect MCP-Pi drift. Wired into scripts/ci.sh
    as a non-blocking warning.

  • AGENTS.md sync rule: Change Map now includes "Modifying an existing tool
    handler" — when Pi dispatch logic changes, the MCP handler must be mirrored.

Changed

  • Pi tools refactored: tools/overview.ts, lookup.ts, impact.ts,
    verify.ts, changes.ts, format.ts, rename_symbol.ts now delegate
    dispatch logic to tools/_dispatchers.ts.

  • Tests updated: Source-code pattern checks in tests/mcp.test.ts now
    verify the dispatcher file instead of the MCP file.

Upgrade

pi install npm:pi-shazam@latest

Or for MCP clients:

{ "mcpServers": { "pi-shazam": { "command": "npx", "args": ["-y", "-p", "pi-shazam@latest", "pi-shazam-mcp"] } } }

Full Changelog: v0.25.0...v0.26.0

v0.25.0

Choose a tag to compare

@gjczone gjczone released this 02 Jul 18:18

v0.25.0

What's Changed

Added

  • Windows LSP server discovery (#582, #585): LSP servers are now discoverable on
    Windows. findInPath bypasses POSIX-only SAFE_PATH_DIRS filtering on win32
    and auto-appends .cmd extension when the bare command is not found (npm global
    installs create .cmd shims). trustedUserCandidates includes Windows paths
    (%APPDATA%/npm, Scoop, Cargo, Mason, VS Code).

  • PATHEXT-aware executable detection (#585): isExecutable on win32 now
    respects the PATHEXT environment variable (.COM;.EXE;.BAT;.CMD;.VBS;.JS
    default) instead of hardcoding only .exe, .cmd, .bat.

  • Platform-appropriate cache directory (#584): Cache now uses
    %LOCALAPPDATA%/pi-shazam/cache on Windows, ~/Library/Caches/pi-shazam on
    macOS, and $XDG_CACHE_HOME/pi-shazam on Linux (renamed from repomap).

  • Windows CI coverage (#583, #592): windows-latest runner added to CI matrix
    (typecheck, tests, build) and publish workflow. All 662 tests pass on Windows.
    package.json os field now includes "win32".

  • MCP documentation for Windows (#586): mcp/README.md now includes Windows
    MCP client configuration examples (Claude Desktop on cmd, PowerShell, Git Bash).

Bug Fixes

  • MCP HOME fallback on Windows (#586): PI_SHAZAM_HOME_ONLY check now falls
    back to USERPROFILE before the hardcoded "/home", fixing the home-directory
    gate on Windows where HOME is not set by default.

  • Cross-platform path normalization in MCP (#586): buildEnvelope now
    normalizes backslash project paths to forward slashes for consistent JSON
    output across platforms.

  • Cross-platform test compatibility (#592): 8 test files fixed for Windows —
    path comparisons, URI construction, file separator handling, short-name paths,
    and log message assertions now work correctly on all platforms.

Upgrade

pi install npm:pi-shazam@latest

Or for MCP clients:

{ "mcpServers": { "pi-shazam": { "command": "npx", "args": ["-y", "-p", "pi-shazam@latest", "pi-shazam-mcp"] } } }

Full Changelog: v0.24.4...v0.25.0

v0.24.4

Choose a tag to compare

@gjczone gjczone released this 02 Jul 16:03

v0.24.4

What's Changed

Bug Fixes

  • fix: Silence ENOENT warnings during LSP server discovery
    isExecutable() now suppresses the expected ENOENT error when probing for
    optional LSP server binaries, matching _logWarn's documented ENOENT early-return
    pattern. Only real errors (permission denied, I/O error) are logged.

  • fix: Clean up stale temp dir before MCP symlink test (#485)
    tests/mcp.test.ts now runs rmSync before mkdirSync to avoid EEXIST on
    leftover symlinks from previous test runs. Worktree copy uses a unique temp dir
    name to avoid collisions when vitest runs files in parallel.

Upgrade

pi install npm:pi-shazam@latest

Or for MCP clients:

{ "mcpServers": { "pi-shazam": { "command": "npx", "args": ["-y", "-p", "pi-shazam@latest", "pi-shazam-mcp"] } } }

Full Changelog: v0.24.3...v0.24.4

v0.24.3

Choose a tag to compare

@gjczone gjczone released this 02 Jul 06:26

v0.24.3

Bug Fixes

  • MCP JSON mode parity: All 7 MCP tools now support { "json": true } for structured JSON output, matching the Pi native extension behavior. Previously, 5 tools (overview, lookup, impact, format, rename_symbol) silently ignored the json parameter.

Upgrade

pi install npm:pi-shazam@latest

Or for MCP clients:

{ "mcpServers": { "pi-shazam": { "command": "npx", "args": ["-y", "-p", "pi-shazam@latest", "pi-shazam-mcp"] } } }

Full Changelog: v0.24.1...v0.24.3

v0.24.2

Choose a tag to compare

@gjczone gjczone released this 02 Jul 06:01

v0.24.2

Bug Fixes

  • MCP JSON mode parity: All 7 MCP tools now support { "json": true } for structured JSON output, matching the Pi native extension behavior. Previously, only shazam_verify and shazam_changes honored the json parameter; the other 5 tools (overview, lookup, impact, format, rename_symbol) silently ignored it and always returned text.

Upgrade

pi install npm:pi-shazam@latest

Or for MCP clients:

{ "mcpServers": { "pi-shazam": { "command": "npx", "args": ["-y", "-p", "pi-shazam@latest", "pi-shazam-mcp"] } } }

Full Changelog: v0.24.1...v0.24.2

v0.24.1

Choose a tag to compare

@gjczone gjczone released this 02 Jul 04:29

v0.24.1

What's Changed

Simplified

  • Duplicate consolidation (#571): Extracted isTestFile() SSOT to core/filter.ts, _cleanEdgesForSymbols() shared edge cleanup in core/scanner.ts, decodeBufferAdaptive() pure buffer-to-string in core/encoding.ts, unified audit logging via core/audit-log.ts in mcp/tools.ts, shared PRETTIER_CONFIG_FILES in core/formatters.ts (added missing .prettierrc.js), detectProjectLanguages() in core/formatters.ts, lsp/manager.ts derives languages from graph.fileSymbols instead of duplicate directory walk, import resolution unified to core/resolve-import.ts.

  • Hot-path optimizations (#573): Single-pass diagnostics counting avoids multiple filter().length iterations. Eliminated intermediate [...Set].filter() arrays in graph snapshot comparison.

  • Circular dependency fix: core/audit-log.ts no longer imports _logWarn from core/output.ts, eliminating a runtime circular dependency. Error logging in audit-log uses console.error directly, matching the module's own design intent.

Upgrade

pi install npm:pi-shazam@latest

Or for MCP clients:

{ "mcpServers": { "pi-shazam": { "command": "npx", "args": ["-y", "-p", "pi-shazam@latest", "pi-shazam-mcp"] } } }

Full Changelog: v0.24.0...v0.24.1

v0.24.0

Choose a tag to compare

@gjczone gjczone released this 01 Jul 21:03

v0.24.0

What's Changed

Bug Fixes

  • fix(#564): Rust resolveImport returns null instead of phantom paths
    Rust crate::, mod X;, and super:: imports now return null when no candidate file exists, matching the behavior of all other languages and preventing phantom paths from entering fileImports.

  • fix(#565): Move rename-state.ts from hooks/ to tools/ to fix layer violation
    tools/impact.ts, tools/rename_symbol.ts, and mcp/tools.ts no longer import from hooks/, fixing the one-way dependency rule violation.

  • fix(#566): Log MCP shutdown errors instead of empty catch blocks
    transport.onclose and stdin.on("end") handlers now log shutdown errors via _logWarn instead of silently swallowing them.

  • fix(#567): Clear LSP init timeout timer to prevent UnhandledPromiseRejection
    The 15-second LSP initialization timeout timer is now cleared on success, preventing UnhandledPromiseRejection that could crash the process under --unhandled-rejections=strict.

  • fix(#568): Redact error messages in withLogging before re-throwing to MCP clients
    Error messages sent to MCP clients are now redacted to prevent leaking absolute paths and stack traces. Original stack trace is preserved on the wrapped error.

  • fix(#569): Move recordCallChain after symbol existence verification
    The rename safety gate no longer marks nonexistent symbols as reviewed, preventing bypass when the impact analysis fails to find the target symbol.

  • fix(#570): Batch P1 reliability and safety fixes
    Cross-platform path containment using path.relative() (Windows compatibility), createTool error logging via _logWarn, validateProjectRoot returns resolved real path for LSP consistency, maxFiles defaults to 100 instead of unsafe type cast, jq fallback in pre-commit-verify.sh, cache deserialization Array.isArray guard for corrupted fileImports, console.error replaced with _logWarn in rename_symbol and index.ts.

Simplified

  • Dead code removal (#572): Removed delta mode residual code (options.delta, deltaLabel) from verify.ts, tools/definitions.ts, mcp/tools.ts, and precommit-verify.ts. Removed unused _lspManager parameter from registerAllTools.

  • Hot-path optimizations (#573): BFS queue shift() replaced with O(1) head-index dequeue in all 4 BFS loops. LRU detail cache uses O(1) Map-based ordering instead of O(n) indexOf+splice. Single-pass diagnostics counting avoids multiple filter().length iterations. Eliminated intermediate [...Set].filter() arrays in graph snapshot comparison.

Documentation

  • docs: Fixed documentation alignment with actual implementation — updated SKILL.md (removed non-existent delta parameter, fixed LSP language count), mcp/README.md (tool count), AGENTS.md (source file count, audit log path), mcp/tools.ts (tool consolidation comment).

Upgrade

pi install npm:pi-shazam@latest

Or for MCP clients:

{ "mcpServers": { "pi-shazam": { "command": "npx", "args": ["-y", "-p", "pi-shazam@latest", "pi-shazam-mcp"] } } }

Full Changelog: v0.23.3...v0.24.0

v0.23.3

Choose a tag to compare

@gjczone gjczone released this 30 Jun 15:10

v0.23.3

What's Changed

Bug Fixes

  • fix(#547): remove dead impact-state surface — Removed setPendingImpact call from production code since it was never actually invoked, eliminating dead code path.
  • fix(#554,#557): capture tsc/pyright/mypy stdout in pre-commit verify, add stale cache banner in lookup — Pre-commit verify now captures subprocess stdout (tsc, pyright, mypy). shazam_lookup now displays a stale cache warning when the graph is outdated.
  • fix(#551,#552,#555): remove global ENOENT suppression, break writeJsonl recursion, conservative CJK token estimate — Removed global ENOENT suppression that masked genuine file-not-found errors. Fixed infinite recursion in writeJsonl failure path. Tightened CJK token estimation for more accurate truncation.
  • fix(#550,#553): log error causes in catch sites and withEnrichTimeout rejections — Added error cause logging to all catch sites and withEnrichTimeout rejection paths for better debugging.
  • fix(#546,#548,#556): serialize LSP shutdown, reset rename state on session_shutdown, clean up didClose on send failure — Serialized LSP server shutdown to prevent race conditions. Reset rename state when session ends. Properly clean up didClose notifications on send failure.
  • fix(#544,#545): redact before truncating audit-log args and set isError on tool error responses — Audit-log argument redaction now happens before truncation to avoid leaking sensitive data in truncated output. Tool error responses now correctly set isError flag.

Upgrade

pi install npm:pi-shazam@latest

Or for MCP clients:

{ "mcpServers": { "pi-shazam": { "command": "npx", "args": ["-y", "-p", "pi-shazam@latest", "pi-shazam-mcp"] } } }

Full Changelog: v0.23.2...v0.23.3