Skip to content

v1.38.0

Choose a tag to compare

@github-actions github-actions released this 04 Nov 19:21
· 333 commits to main since this release
0516c67

Accumulated release since 1.37.1: the /ashlr-selftest command, self-tuning compression, the companion handshake and doctor probes, lazy MCP tool loading, and reliability fixes for brief-eval, hook timing and macOS child-process waits.

Added

  • /ashlr-selftest (scripts/selftest.ts, also ashlr-plugin selftest): runs every command's entry point against a throwaway fixture repo with --json and reports pass/fail per command. Builds a temp git repo + isolated $HOME, probes every /ashlr-* command's backing script, every ashlr-plugin subcommand, and the real MCP stdio path (tools/list + ashlr__read/ashlr__savings calls). Pro-gated commands count their designed refusal as a pass; agent-only commands are listed as skipped; any commands/*.md file without a declared probe is reported as uncovered and fails the run. --json prints an ashlr.selftest v1 report; --only, --keep-tmp and --timeout-ms are supported.
  • scripts/brief-eval.ts --json prints the eval report as JSON on stdout.
  • Self-tuning compression, on by default (ASHLR_TUNING=off to disable): ashlr tracks per repo when a compressed ashlr__read or ashlr__grep result is followed by a native re-read of the same target, and adjusts ashlr__grep detail per extension within bounds (level -2 to +2, 20-sample minimum, one step per 20 results). Level 0 output is unchanged. /ashlr savings adds, per repo and UTC week, tokens saved, estimated re-read cost, net tokens saved (est.) and miss rate; per-repo savings are recorded in ~/.ashlr/repo-savings/ next to the unchanged global stats. State is local counts only under ~/.ashlr/{miss-stats,tuning,repo-savings}/, capped and owner-only. See docs/self-tuning.md.
  • ashlr doctor --json (scripts/doctor.ts --json) carries the shared ashlr.doctor v1 wrapper (kind, schema_version, tool, status, native_status, checks): failures are fail, else warnings are warn; checks flatten the section lines. Additive: every existing field and the exit code are unchanged. The vendored handshake contract and checker are re-vendored from ashlr-stack with the doctor section.
  • Handshake conformance test (__tests__/handshake-conformance.test.ts): validates ashlr-plugin --ashlr-handshake --json and every health combination against the Ashlr handshake v1 contract vendored from ashlr-stack (__tests__/contract/, pinned by sha256). The plugin advertises no gated capability, so no doctor argv is run.
  • ashlr doctor companions: a degraded lexicon or ashlr-md that lists the doctor-fix handshake capability gets the hint run lexicon doctor --fix or run mdopener-mcp doctor --fix, the same capability-only rule locus already had. Probes still run with no secrets in the environment.
  • ashlr doctor companions: a degraded locus that lists the doctor-fix handshake capability gets the hint run locus doctor --fix (same rule as stack doctor --ecosystem). Lines show the reported health, a timeout or unreadable handshake reads as unknown instead of outdated, and --json adds health and next_steps to each companion.
  • ashlr doctor has a companions section: phantom, phantom-secrets, locus, lexicon, ashlr-md and ashlr-stack are probed with --ashlr-handshake --json (2s timeout, no secrets in the env) and shown with version, readiness and a one-line fix hint when missing, outdated or degraded. Informational only; never a warning or failure. scripts/doctor.ts --json prints the report as JSON with a companions array.
  • ashlr-plugin --ashlr-handshake prints the Ashlr companion handshake v1 (name, version, protocols, capabilities, local health, files the plugin may edit) as one JSON line. Answered by the node launcher before the bun check, so it works without bun. Contract: docs/ashlr-handshake.md.
  • Deterministic lane-side merge-conflict resolution: .gitattributes gives CHANGELOG.md git's merge=union driver, and bun scripts/resolve-mr-conflicts.ts resolves stopped conflicts with no model call — CHANGELOG.md, CLAUDE.md and README.md keep the onto-branch version with the PR's hunks re-applied via union merge, while bun.lock, package-lock.json and Cargo.lock are regenerated by the package manager (frozen/locked mode first) rather than hand-merged. __tests__/resolve-mr-conflicts.test.ts rebases a fixture conflict end to end.

Changed

  • Per-repo savings use locked, atomic writes, with bounded retries even for malformed lock paths. The self-tuning report shows n/a net tokens when re-reads have no recorded savings.
  • The savings dashboard abbreviates the stats path in its empty state, keeping long home directories within its 80-column layout. First-run Bun installation is detected using the updated PATH under Bun as well as Node.
  • Hook timing batches count each row's bytes once before joining, avoiding repeated scans of growing batches that delay the hook safety timeout.
  • The MCP router answers initialize and tools/list from servers/_tool-catalog.json, generated by bun run gen:tool-catalog. Each tool module is loaded on the first tools/call for that tool. Tool names, descriptions, input schemas, and call results are unchanged.

Removed

  • scripts/prune-old-memories.ts and scripts/context-db-migrate.ts: no command, hook, skill, doc or workflow invoked them. If you ran either by hand: the context database already migrates itself when a server opens it (openContextDb), and stale auto-memory files can be reviewed and deleted directly under your Claude projects memory/ directory.

Fixed

  • scripts/brief-eval.ts no longer crashes on unrelated flags: --level/--out lookups previously read args[0] whenever the flag was absent, so brief-eval.ts --json threw TypeError (and --out could write a file literally named after the first argument). An invalid --level now exits 2 with a clear message.
  • CI documentation drift: the README CI badge queried the removed push trigger (never rendered a status), and docs/architecture.md, docs/platform-support.md, docs/launch-post.md, docs/producthunt.md and docs/press-kit/founder-bio.md still described the pre-restructure model — platform legs on every push, a weekly schedule and ci:full-os labels. All now describe the current model: PRs and merge-queue entries run only the seconds-fast fast gate; the full Linux/macOS/Windows suite and benchmark run on the daily schedule and workflow_dispatch. __tests__/ci-docs.test.ts pins the badge event parameter to a real workflow trigger and the documented cadence to the cron expression.
  • runWithTimeout (servers/_run-with-timeout.ts) no longer loses a finished child on macOS under bun, where the runtime can drop exit and close forever while the child sits as a zombie (oven-sh/bun#34069); the happy-path echo test flaked this way on loaded CI runners. On POSIX the command now runs under a thin /bin/sh wrapper that reports its real exit status on a stderr trailer, so runs settle quickly with the true code even when process events never arrive. Missing and non-executable commands still return exitCode: -1, resolved the way execvp would before spawning. warmUpSpawn warms with the same spawn shape (detached, piped stdio) and retries inside its budget until an event is observed.