# Changelog

## [0.9.41] - 2026-09-20

### Added
- Anthropic prompt-cache warming. After a turn ends, Elyra waits four minutes and replays the exact request prefix (system prompt, tools, history, thinking settings) with a one-character user message and `max_tokens: 1`, refreshing the five-minute cache TTL for one cache-read price instead of paying a full rewrite when you return. Up to two pings per idle period, only for `anthropic-messages` models with an API key (not subscription OAuth), only when the last request was at least 20k tokens, and cancelled the moment you prompt, switch models, or abort. Pings never enter the conversation or session file; `/session` reports their count and cost separately. Configure or disable with the `cacheWarming` setting
- Mid-conversation system messages. `/system <text>` inserts an instruction into the history at the current point; it is persisted, replayed on resume, summarized by compaction, and applies to every following turn. Extensions get the same via `elyra.sendSystemMessage(text, { display?, deliverAs?, triggerTurn? })`. No provider offers a portable mid-stream system role, so the message reaches the model as a user message wrapped in `<system-reminder>` tags, and the default system prompt tells the model to treat that wrapper as harness instructions. Appending at the end of history keeps the prompt cache intact, unlike rewriting the system prompt per turn
- `/bug <description>`: builds a bug report with Elyra version, runtime, OS, active model and thinking level, session message counts, recent tool calls, loaded extensions and their load errors, and the last error if the previous turn failed. Shows a preview, then opens a prefilled GitHub issue in the browser or copies the report to the clipboard (also saved to a temp file). API keys, tokens, JWTs, and the home directory are redacted; nothing is sent until you submit on GitHub

### Changed

- Toggling tools mid-session no longer invalidates the prompt cache. Deactivated tools stay in the request and the system prompt (the tools block is the root of Anthropic's cache hierarchy and part of OpenAI's hashed prefix); the agent blocks calls to them with a clear error result instead. Activating a tool that was never sent still adds it, costing one cache miss as before. Startup restrictions (`--tools`, `--no-tools`) are unchanged. New `stableToolSet` setting (default `true`); set to `false` for the old send-only-active-tools behaviour
- Faster `--resume` and `--continue` startup. Session listing now keeps an `index.json` sidecar per sessions directory and only re-parses files whose mtime or size changed; corrupt or missing indexes are rebuilt. `SessionInfo.allMessagesText` is loaded lazily on first access (i.e. when searching in the session picker) instead of concatenating every session's text at startup. `--continue` validates candidate files newest-first and stops at the first valid one, and the chosen file is parsed once instead of twice. `SessionManager.buildSessionContext()` caches its result until entries or the leaf change.

## [0.9.40] - 2026-09-18

### Added
- `@elyracode/jev-tools` can now call TypeSafe directly (`https://api.typesafe.ai/v1/systemone`, model `jev-latest`) with `TYPESAFE_API_KEY`, in addition to the OpenRouter route. Direct is preferred when its key is present; `JEV_BACKEND=typesafe|openrouter` forces one. `/jev` shows the active backend and both key states

## [0.9.39] - 2026-09-18

### Added
- Jev decision tools extension (`@elyracode/jev-tools`): a `decide` tool that sends a `state` plus typed questions (`noul` yes/no, `choice`, `score`) to TypeSafe Jev through OpenRouter's decisions endpoint and returns calibrated probabilities instead of prose. Reuses the stored OpenRouter key; `/jev` shows configuration. Jev is a classifier, not a chat model, so it is exposed as a tool rather than a selectable model. Includes an opt-in bash gate (`--jev-gate`, `JEV_BASH_GATE=1`, or `/jev gate on`) that asks Jev whether each shell command is destructive and requests confirmation above a threshold (`JEV_BASH_GATE_THRESHOLD`, default 0.7); blocks in non-interactive mode, fails open on API errors

## [0.9.38] - 2026-09-16

### Added
- Smart routing now picks the thinking level per turn, not just the model: a fast-tier turn (directory listing, quick question) runs at `minimal`, balanced at up to `medium`, powerful at the session level. The session setting is a ceiling that routing only ever lowers - never raises - and it is untouched in the footer and `/thinking`. `/route` shows the per-turn level

- Stale tool-output pruning: before each provider request, tool results older than 6 assistant turns and larger than 2000 characters are replaced with a one-line placeholder (`[read src/foo.ts, 412 lines – pruned from context; re-read if needed]`). Request-time only - session history and compaction are unaffected, errors and image results are never pruned, and untouched messages keep reference identity for cache stability. Tune or disable with the `contextPruning` setting
- Stack-aware verification commands: the stack detector now derives the project's own checks (typecheck, lint, test, build) from `package.json` scripts and lockfile, `composer.json` (pest/phpunit, pint, phpstan/larastan, composer scripts), `Cargo.toml`, `pyproject.toml`, and `go.mod`, and lists them in the system prompt so "verify your work" names the exact commands to run

- Edit-failure escalation: `edit` errors now say where to look - duplicates list the line numbers of each occurrence, not-found errors name the closest line matching the first line of `oldText` (or say the file may have changed). After two consecutive failures on the same file, the tool result gains an explicit instruction to stop retrying blind, re-read the region, and rebuild `oldText` from fresh content
- Stack-relevant skills: skills whose name, description, `compatibility`, or `metadata.tags` mention a detected framework (with aliases, e.g. Flux UI ↔ `flux`) are listed first in the system prompt with a lead-in naming them and a `<relevant-to>` marker, so the model reads the right skill for a Laravel + Livewire project without guessing

### Changed
- System prompt gained a "How to work" section with working-method rules: read before editing, explore deliberately, prefer small targeted edits, ask when intent is ambiguous, verify with the project's own checks and never report unobserved success, stop when done without gold-plating, and change approach after repeated identical failures. Rules that depend on a tool are only emitted when that tool is available

## [0.9.37] - 2026-09-11

### Added
- Ledger-driven tier suggestions: `/routing-stats` and `elyra doctor routing` now end with concrete recommendations per smart-routing tier based on your local outcome ledger - switch a pinned model when a measured alternative is meaningfully better (higher success rate, or equal success at under 60% of the cost per turn), pin a tier that has none, or keep the current pin with the numbers that justify it. Nothing leaves your machine
- Per-commit cost receipt: git commits made by the agent get an `Elyra-Cost: $0.42 (glm-5.3, 4 turns, 1 model switch)` trailer showing spend since the previous commit, so teams see AI cost per change in `git log`. Skips `--amend`/`--fixup`/`--squash`. Disable with `gitCostTrailer: false`

### Changed
- Decision-aware compaction: when the project has a decision log, the summarizer is told which decisions are already recorded and references them by id instead of restating the rationale - smaller summaries, no lost reasoning (the full text lives on disk) - and does not re-extract them. Manual `/compact` now also persists extracted decisions

## [0.9.36] - 2026-09-05

### Added
- Project decision log: architecture decisions are persisted as one ADR-lite Markdown file per decision under `.elyra/memory/decisions/` (frontmatter with id/date/status/supersedes; Context / Decision / Alternatives / Consequences), committed to git and shared with the team. Decisions are never deleted - a newer decision supersedes an older one
- `decision_record` tool: the agent records a decision when the user settles an architecture or design choice with lasting impact (with the alternatives rejected). Guarded by the `decisionLog` setting: `confirm` (default) shows an approval dialog, `auto` records silently, `off` disables
- Compaction now extracts unrecorded architecture decisions from the history being discarded (a machine-parseable block appended to the existing summarization call - no extra request). In `auto` mode they are written to the log; in `confirm` mode the candidates are surfaced in the status line
- A budget-capped digest of active decisions is injected into the system prompt so future sessions respect them; full text stays on disk for `read`
- `/decisions [id|mode]` command: list the log, show one decision (id or unique prefix), or switch mode (`off`/`confirm`/`auto`); argument autocomplete offers modes and ids

## [0.9.35] - 2026-09-03

### Added
- `/thinking [level]` command: set the thinking level for the current model. Without an argument it opens a selector listing only the levels the model supports (current one marked); with an argument it sets the level directly and rejects levels the model does not offer. Argument autocomplete offers the valid levels

## [0.9.34] - 2026-09-01

### Changed
- Model registry refreshed: added Claude Fable 5.1 (Anthropic direct, Bedrock regional/global variants, and gateways — $10/$50, 1M context, adaptive thinking with a new max level), GLM-5.3 on HuggingFace, Qwen 3.8 Flash Next, Mercury 2.5 preview, Granite 4.2, and a wave of OpenAI `:batch` variants on the gateways. The Anthropic default stays `claude-sonnet-5` — Fable 5.1 and Opus 5 are premium picks for the deep tier.

## [0.9.33] - 2026-08-29

### Added
- Mid-turn auto-compaction: when large tool results (big file reads, long test logs) push the context past the compaction threshold in the middle of a run, compaction now runs between the tool results and the next provider request instead of waiting for the request to fail with a context overflow and retrying
- Terminal capability overrides: new `terminal.hyperlinks`, `terminal.images`, and `terminal.trueColor` settings (`"auto"` default) force capabilities on or off when auto-detection is too conservative (unrecognized terminals) or wrong

## [0.9.32] - 2026-08-25

### Changed
- Vercel AI Gateway default bumped from `zai/glm-5.2` to `zai/glm-5.3` (5.3 landed on the gateway)
- Cloudflare AI Gateway default changed from `workers-ai/@cf/moonshotai/kimi-k2.6` to `claude-sonnet-5`: the gateway catalog dropped its Workers AI mirror and is BYOK-only now
- Cerebras default changed from `zai-glm-4.7` to `gpt-oss-120b` (GLM 4.7 removed upstream)

## [0.9.31] - 2026-08-16

### Changed
- zai default model bumped from `glm-5.2` to `glm-5.3` (1M context; Vercel AI Gateway default stays on `zai/glm-5.2` until 5.3 lands there)

## [0.9.30] - 2026-08-12

### Changed
- xAI default model bumped from `grok-4.5` to `grok-4.6` (same $2/$6 pricing, 500K context)
- The Anthropic extra-usage warning (subscription OAuth) is now shown once per install instead of once per session; the shown state is persisted as `warnings.anthropicExtraUsageShown`

## [0.9.29] - 2026-08-12

### Fixed
- Anthropic requests failing with `400 invalid_request_error` when signed in with a subscription (OAuth): "A maximum of 4 blocks with cache_control may be provided. Found 5." The Claude Code identity block and the system prompt each carried a cache marker, which with the last-tool and first/last user message markers made five. Prefix caching means the marker on the system prompt already covers the block before it, so the identity block now carries one only when it is the sole system block

## [0.9.28] - 2026-08-12

### Changed
- OAuth callback pages (`/login` success and error) show the Elyra constellation logo instead of the old placeholder mark

## [0.9.27] - 2026-08-08

### Added
- `/ext` can now mark installed extensions for removal: space toggles `[x]` (install) on packages you don't have and `[-]` (remove) on ones you do, and enter applies both sets in one pass with per-package progress
- `elyra doctor resources`: lists running Elyra instances with uptime, accumulated CPU time, and memory (including child language servers and headless browsers), and flags instances that look forgotten (high memory + running for over a day) with a ready-to-paste kill hint. Built in response to battery/memory reports — idle Elyra uses no CPU, but forgotten instances hold their memory

## [0.9.26] - 2026-08-07

### Added
- Package browser: added `@elyracode/browser-tools` (Playwright browser automation)
- Goal economy mode: with the `goalBatchModels` setting enabled, smart routing swaps the routed model for its half-price `:batch` sibling (same provider) while a budgeted `/goal` runs — unattended loops tolerate batch latency, interactive turns are never swapped, and user-pinned tier models are never overridden. Batch variants are also excluded from normal tier selection so they cannot hijack interactive routing on price

### Changed
- `/ext` now shows which extensions are already installed: a green ✓ marker per installed package, an installed count in the title, and a legend. The installed check matches package sources exactly, so `laravel` no longer counts `laravel-starters` as installed (also fixes the Grove startup hint's matching)

## [0.9.25] - 2026-08-03

### Added
- Package browser: added `@elyracode/felagi` (Félagi project portal integration)

## [0.9.24] - 2026-07-24

### Changed
- Model registry refreshed: adds `claude-opus-5` (adaptive thinking, 1M context, May 2026 knowledge cutoff, $5/$25) — Anthropic's new recommended starting point for agentic coding. The Anthropic default stays `claude-sonnet-5` ($3/$15, intro-priced $2/$10 through August 2026)

### Fixed
- Image paste (Ctrl+V) failing silently: when the optional `@elyracode/clipboard` native module is missing (npm skips optional dependencies that fail to install, e.g. when an update races registry propagation), pressing the paste-image shortcut now shows an actionable warning with the reinstall command instead of doing nothing

## [0.9.23] - 2026-07-23

### Fixed
- `/ext` installs no longer look like a hang: installing now shows a live spinner with per-package progress ("Installing @elyracode/x (2/8)...") instead of blocking the UI silently, installs run with a 2-minute timeout per package, and Escape cancels the remaining queue (already-installed packages are kept and reported)
- Oversized images from extension tools (e.g. a full-page `screenshot_url` capture taller than 8000px) no longer fail the whole turn with a provider 400. Extension tool results now pass through a hard-limit safety net that downscales images exceeding provider dimension limits, with a coordinate-mapping note appended

## [0.9.22] - 2026-07-23

### Changed
- Default models bumped: `azure-openai-responses` to `gpt-5.6`, `github-copilot` to `gpt-5.5`, `zai` to `glm-5.2`, `vercel-ai-gateway` to `zai/glm-5.2`
- Model registry refreshed: adds `claude-fable-5` (Anthropic API: adaptive thinking with a new `max` level, 1M context) and `sakana/fugu-ultra` (via OpenRouter and Vercel AI Gateway), plus Gemini 3.6 Flash, Poolside Laguna S 2.1, Tencent HY3, and Meituan LongCat 2.0

## [0.9.21] - 2026-07-19

### Added
- Package browser: added `@elyracode/grove` (Grove local dev environment integration)
- Grove site detection: when the project is served by Grove (registered in Grove's config or under a parked path), Elyra suggests installing `@elyracode/grove` at startup (skipped when already installed) and in `/init` output

## [0.9.20] - 2026-07-19

### Added
- Measured routing: Elyra now records per-model outcome measurements (turn success, edit failures, retries, failovers, latency, cost) to a local ledger (`~/.elyra/agent/routing-ledger.jsonl`) and uses them to demote demonstrably unreliable models in cross-provider failover ranking. Only model ids, counters, and timings are stored — never prompts or code — and nothing leaves disk. Inspect with `elyra doctor routing` or `/routing-stats`; opt out with the `routingLedger` setting

## [0.9.19] - 2026-07-18

### Changed
- Redesigned the `/ext` (`/packages`) extension browser: a clean, scrollable list with aligned name/description columns, multi-select via space (install one or several at once), and a persistent reminder to run `/reload` after installing. Adds `@elyracode/stack-elyra-framework` to the list.

## [0.9.18] - 2026-07-18

### Added
- Detect Elyra Framework (Rust + Svelte 5 desktop framework) projects via `elyra.toml` or an `elyra` dependency in `Cargo.toml`, suggesting `@elyracode/stack-elyra-framework`

### Fixed
- Package browser: added missing `@elyracode/lsp-php` and `@elyracode/stack-silt` entries

## [0.9.17] - 2026-07-18

### Changed
- Default model bumped to `kimi-k3` (Kimi K3: reasoning, text + image, 1M context) for the `moonshotai`, `moonshotai-cn`, `opencode-go`, and `openrouter` providers, replacing `kimi-k2.6`

## [0.9.16] - 2026-07-15

### Added
- Cross-vendor code review: `/review --cross` reviews your changes with a model from a *different vendor* than the one you're using, for a genuinely independent second opinion (a same-family reviewer shares the author's blind spots). Falls back to the current model when no other provider is configured. Only possible because Elyra is provider-agnostic.
- Cross-provider failover: when a turn fails because a provider is unavailable (overloaded, rate-limited, an auth problem, or a model that vanished such as an export-control suspension), Elyra automatically retries the turn on an equivalent model from another provider you hold keys for, instead of just surfacing the error. Modality-aware (an image conversation only fails over to vision-capable models) and capped at 2 attempts. Toggle with the `providerFailover` setting (default on). Only possible because Elyra is provider-agnostic.

## [0.9.15] - 2026-07-12

### Added
- `elyra doctor preflight`: offline check that every configured default model still resolves against the model registry (catches defaults pointing at removed model ids), plus freshness nudges when a newer model is available for a provider
- Visual QA (`@elyracode/design-tools`): new `design_diff` tool compares before/after screenshots so the agent can describe the visual delta and flag regressions; `screenshot_url` now supports element screenshots (`selector`), full-page capture, and reports browser console errors/warnings alongside the image

### Changed
- Default xAI model is now `grok-4.5` (reasoning, text + image), replacing `grok-4.20-0309-reasoning`
- A broken optional extension no longer blocks startup: it is skipped with an actionable warning (e.g. a reinstall hint when a dependency is missing) instead of failing to launch

## [0.9.14] - 2026-07-09

### Changed
- Default OpenAI model is now `gpt-5.6` (1M+ context, reasoning), replacing `gpt-5.4`

## [0.9.13] - 2026-07-08

### Changed
- Upgraded to TypeScript 7.0 (the native compiler) across the workspace, bumping the `typescript` devDependency from `^6.0.3` to `^7.0.2`

## [0.9.12] - 2026-06-30

### Changed
- Default Anthropic model is now `claude-sonnet-5` (Claude Sonnet 5: 1M context, adaptive thinking, $2/$10 per million), replacing `claude-opus-4-8`
- Default Amazon Bedrock model is now `us.anthropic.claude-sonnet-5`, replacing `us.anthropic.claude-opus-4-6-v1`
- Smart routing now pins the `powerful` tier to `claude-sonnet-5` by default (user `smartRoutingModels` settings still override; the pin falls back to the heuristic when Anthropic is unavailable)

## [0.9.11] - 2026-06-26

### Changed
- Internal: removed all `any` types from the embeddable `@elyracode/web-ui` package (143 eliminated), adding precise discriminated-union types for the sandbox messaging protocol — no behavior change
- Model registry data refresh

## [0.9.10] - 2026-06-19

### Added
- Stack detection now recognizes the SILT stack (Svelte 5 + Inertia + Laravel + Tailwind) and suggests `@elyracode/stack-silt`

## [0.9.9] - 2026-06-11

### Added
- Budget-aware smart routing: when a budgeted `/goal` is active, the router caps tiers as the budget depletes (balanced above 75% spent, fast above 90%) so the loop spends expensive turns early and rations later
- `/route`: show what smart routing would do for the next turn — classified tier with reason, the model each tier would pick (pins marked), budget capping status, and image-modality constraints
- `/cost` now shows a burn rate (`$X.XX/hour at the current pace`) once a session has more than a minute of activity
- `elyra doctor models`: live-verify configured providers against the model registry from the CLI (credentials from auth.json or env), with `--provider`, `--model`, and `--max` filters; exits non-zero on failures or mismatches for CI use
- `smartRoutingModels` setting: pin an explicit model per smart-routing tier (`{"fast": "anthropic/claude-haiku-4-5", ...}`) — the heuristic decides the tier, you decide the model; pins still respect the image-modality filter
- Smart routing decisions are now visible in the chat as a dim status line ("smart routing: fast — read-only tools → Haiku") instead of switching models silently

### Fixed
- Smart routing no longer escalates permanently to the powerful tier after a few turns: conversation length is now measured in user turns instead of raw messages (tool results inflated the count immediately)
- Smart routing now filters candidates by input modality, so conversations containing images can never be routed to a text-only model
- Smart routing model selection within a tier now prefers same-provider, reasoning-capable, paid models by cost instead of blindly picking the largest context window (which could select a slow 1M-context flagship as the "fast" model)
- Smart routing hysteresis now tracks the classified tier on every turn, including turns where the model did not change

## [0.9.8] - 2026-06-10

### Added
- `/goal <cmd> --budget <usd>`: cost-capped autonomy — the goal loop stops and reports once the spending cap is reached, keeping the work done so far
- `/replay <model>`: replay the last turn on a new branch with a different model; the original branch is kept for comparison via `/tree`, and the replay cost is reported
- `/learn [topic]`: extract a reusable skill from the current session — writes a draft `SKILL.md` to the user skills directory for review and `/reload`

### Changed
- `elyra update` now checks the npm registry first and reports "Elyra is up to date (version)" instead of reinstalling and claiming success when already on the latest version; use `--force` to reinstall anyway

## [0.9.7] - 2026-06-10

### Added
- Thinking-type detection is metadata-driven rather than pattern-matched on model ids, so a model declares how it reasons instead of being guessed at by name

## [0.9.6] - 2026-06-09

### Added
- Claude Fable 5 support

## [0.9.5] - 2026-06-07

### Added
- MiniMax M3 on the direct `minimax` and `minimax-cn` providers (512k context, 128k max output, reasoning, text + image)

### Changed
- Upgraded the Anthropic SDK from `0.97.1` to `0.102.0`

## [0.9.4] - 2026-06-06

### Changed
- Replaced the third-party native clipboard dependency with an in-repo fork, `@elyracode/clipboard`, so the project controls its development and maintenance. The runtime behavior (optional native module with graceful fallback) is unchanged.

## [0.9.3] - 2026-06-06

### Added
- Self-writing extensions: the agent can give itself a tool it doesn't have via the new `extension_write` tool, which scaffolds a TypeScript extension when a needed capability is missing. Approval-by-default with an "Auto-save extensions" setting in `/settings`.
- `/review`: get an independent, second-opinion code review of your changes from the model with a clean reviewer prompt and no conversation context. Flags: `--session` (the agent's changes this session), or a path.
- `/bisect`: binary-search the session's checkpoints to find which agent turn introduced a problem, like `git bisect` but over the agent's own turns. `/bisect <command>` runs automatically (exit 0 = good); without a command it asks you to mark each step. The working tree is always restored afterward.

## [0.9.2] - 2026-06-06

### Added
- `/update` now updates installed extensions too, not just Elyra itself. It checks for both an Elyra version update and out-of-date extensions, updates everything, and restarts once.

### Fixed
- A user's prompt is now flushed to disk when the agent starts a turn, so it survives a crash during a long initial LLM call (previously entries were deferred until the first assistant message arrived)

## [0.9.1] - 2026-06-01

### Added
- Scrollable in-TUI diff viewer: `/diff` now opens a full-height, syntax-highlighted viewer (scroll with arrows/PgUp/PgDn, g/G for top/bottom) instead of dumping a markdown block into the chat
- `/diff --editor` (`-e`) and a "Diff in editor" setting: open the diff in `$VISUAL`/`$EDITOR`. Press `e` inside the viewer to open the same diff in your editor.
- `/diff --session`: show only what the agent changed this session (diffed against the session's first checkpoint)
- `/diff --cached`: show staged changes
- `/diff <path>`: filter the diff to a file or directory
- Plain `/diff` now also lists untracked files

### Fixed
- Replaced an inline import in the diff command with a top-level import; raised the diff buffer limit to 32MB

## [0.9.0] - 2026-05-31

### Added
- Self-writing skills: the agent can now save a hard-won solution as a reusable skill via the new `skill_write` tool, so future sessions never re-solve the same problem. Skills are saved to user (`~/.elyra/agent/skills`) or project (`.elyra/skills`) scope.
- "Auto-save skills" setting in `/settings` (default off). When off, the agent shows a Save/Discard prompt before saving each skill. When on, it saves autonomously.

## [0.8.2] - 2026-05-28

### Changed
- Default Anthropic model updated from Claude Opus 4.7 to Claude Opus 4.8

## [0.8.0] - 2026-05-27

### Fixed
- Synchronous busy-wait spin locks in auth-storage and settings-manager replaced with `Atomics.wait` — no longer burns CPU at 100% during lock contention
- Edit tool `tsc` check converted from blocking `spawnSync` (up to 15s) to async `execFile` — streaming, UI, and concurrent tools no longer freeze during type checking
- `exec.ts` now preserves error messages from failed process spawns instead of discarding them
- Checkpoint persistence uses atomic write (temp file + rename) to prevent corruption on crash
- Memory generation errors are now logged instead of silently swallowed
- Agent retry `continue()` errors are now logged instead of silently swallowed
- Unbounded `errors` arrays in auth-storage and settings-manager capped at 100 entries

## [0.7.15] - 2026-05-25

### Added
- `@elyracode/btw` extension: parallel side conversations with `/btw`, `/btw:inject`, `/btw:summarize`, `/btw:clear`, and `/btw:thread` commands

## [0.7.14] - 2026-05-25

### Fixed
- `@elyracode/laravel` extension crashed on startup with `getCwd is not defined` — fixed variable reference in session_start handler

## [0.7.13] - 2026-05-25

### Changed
- Startup animation replaced with constellation design matching the favicon.svg — orange gradient with highlighted nodes
- `@elyracode/laravel` skill updated with `db-tools` integration guidance for combined model-vs-schema analysis
- `@elyracode/laravel` tools now register only in Laravel projects (no tool clutter in non-Laravel workspaces)

## [0.7.12] - 2026-05-24

### Added
- `@elyracode/laravel` extension: deep Laravel project understanding with `laravel_models`, `laravel_routes`, and `laravel_analyze` tools

## [0.7.11] - 2026-05-24

### Added
- `/goal <command>` command: set a completion condition and the agent keeps working until the command exits with code 0. Type `/goal` again to clear.
- `/update` command: update Elyra to the latest version and restart without leaving the session
- In-app update notification shows `/update` instead of requiring manual terminal commands

## [0.7.10] - 2026-05-24

### Changed
- `edit` tool now runs TypeScript diagnostics after each successful edit and reports new errors to the agent immediately
- `read` tool returns a structural outline (function/class/interface signatures with line numbers) for files over 150 lines instead of truncated content
- `read` tool annotates each line with a short content hash (`#xxxx | `) for precise edit targeting
- `edit` tool transparently strips hash annotations from `oldText`/`newText` so copy-paste from annotated reads works directly

## [0.7.9] - 2026-05-23

### Added
- `@elyracode/workflows` extension: code-orchestrated workflow pipelines defined in `.elyra/workflows/`. Supports `prompt`, `run`, `if`, and `parallel` step types with template interpolation between steps. Code handles control flow, the LLM handles judgment — no token tax from LLM-based orchestration.
- `/workflow` command to list and execute workflows
- `elyra-workflows` skill teaching the agent about workflow patterns

## [0.7.8] - 2026-05-23

### Added
- `@elyracode/seo` extension: SEO and LLM optimization with `seo_audit`, `seo_generate_llms_txt`, `seo_generate_schema`, and `seo_generate_meta` tools

## [0.7.7] - 2026-05-23

### Added
- `@elyracode/lsp-typescript` extension: TypeScript LSP integration with `lsp_definitions`, `lsp_references`, `lsp_diagnostics`, and `lsp_hover` tools for semantic code navigation

### Changed
- Pinned file contents are now placed before the date in context injection for improved prompt cache hit rates

## [0.7.6] - 2026-05-23

### Added
- `/rewind` command: roll back both conversation history and filesystem state to a previous point. Git checkpoints are automatically created before each agent turn and persisted alongside the session file.
- `app.session.rewind` keybinding: trigger `/rewind` via configurable keyboard shortcut
- `rewind` action in `ExtensionCommandContextActions`: extensions can programmatically trigger rewind operations

## [0.7.4] - 2026-05-22

### Added
- Version update notification on startup: checks npm registry and shows `elyra update` command when a newer version is available
- `@elyracode/design-lookup` extension added to `/ext` package browser

## [0.7.3] - 2026-05-22

### Added
- `/skills install <name>` command: install skills from the community registry at github.com/kwhorne/elyra-skills. Supports multiple skills in one command.

## [0.7.2] - 2026-05-21

### Added
- `@elyracode/design-lookup` extension: extract design systems from any website (colors, typography, spacing, components, layout) via `/lookup-design <url>`

## [0.7.1] - 2026-05-21

### Added
- Full Anthropic Agent Skills spec compatibility: `allowed-tools`, `compatibility`, `license`, `metadata` frontmatter fields
- Auto-discovery of `scripts/` and `references/` directories in skill folders, exposed to the agent via system prompt
- `/skills` command: list all loaded skills with details, script/reference counts, and source info

## [0.7.0] - 2026-05-21

### Changed
- Major dependency upgrades: `diff` 9.0, `marked` 18.0, `vitest` 4.1, `typescript` 6.0
- TypeScript target bumped from ES2022 to ES2024
- Updated `@typescript/native-preview` (tsgo) to latest

## [0.6.4] - 2026-05-20

### Changed
- Upgraded `@anthropic-ai/sdk` to 0.97.1 and `openai` to 6.38.0

## [0.6.3] - 2026-05-19

### Added
- `/snippet` command: reusable instruction snippets from `.elyra/snippets/` with selector and autocomplete
- `/init` now creates `.elyra/snippets/` directory

## [0.6.2] - 2026-05-17

### Added
- `/init` command: interactive project setup. Creates `.elyra/AGENTS.md` with stack detection, `.elyra/blueprints/`, and suggests extensions based on detected frameworks.

## [0.6.1] - 2026-05-17

### Added
- `/memory` command: view, clear, or locate project memory. Shows the knowledge Elyra has built across sessions.
- First-run welcome message with example prompts for new projects (shown when no `.elyra/` directory exists)
- `/help` command: example prompts, useful commands, and link to elyracode.com
- Onboarding text now references elyracode.com for docs and guides

## [0.6.0] - 2026-05-17

### Added
- `/footer` command: toggle between full and minimal footer. Minimal shows only cwd, git branch, and model name.
- Norwegian Midnight built-in theme (Nord palette with deeper backgrounds)
- `@elyracode/swarm` extension: multi-agent pipeline orchestration with build, review, and refactor pipelines
- `@elyracode/docker` extension: container-aware development with exec routing, log tailing, compose operations, and environment sync

### Changed
- Compaction summarization prompts now preserve Architecture & Patterns, Error History, exact file paths, error messages, and stack traces
- Tool result serialization limit increased from 2000 to 4000 characters for richer compaction context
- Smart router expanded from 8 to 35 complex keywords covering debugging, architecture, and performance terms
- Smart router adds hysteresis to prevent tier oscillation between turns
- Smart router gates read-only de-escalation on conversation length (< 10 messages only)
- Smart router escalates to powerful tier on large tool outputs (> 5000 chars)
- Current date moved from system prompt to context injection for better LLM cache hit rates
- Upgraded @anthropic-ai/sdk to 0.96.0, openai to 6.38.0, @biomejs/biome to 2.4.15

### Fixed
- Added `@elyracode/swarm` to `/ext` package browser list
- Updated xAI test model references after grok-3 removal from API

## [0.5.10] - 2026-05-15

### Fixed
- Added `@elyracode/swarm` to the `/ext` package browser list

### Added
- `@elyracode/docker` package: Docker-aware development with container exec, log tailing, compose operations, and environment sync

## [0.5.9] - 2026-05-15

### Added
- Built-in theme: Norwegian Midnight (Nord palette with deeper backgrounds)
- `@elyracode/swarm` package: multi-agent pipeline orchestration with `/swarm build`, `/swarm review`, and `/swarm refactor` commands. Pipelines chain focused agent stages (plan → code → test → review → fix) with visual progress tracking. Read-only stages cannot edit files; only implementation stages can write.

## [0.5.8] - 2026-05-15

### Added
- `/cost` command: displays session token usage, estimated cost, and context window utilization
- `/diff` command: shows uncommitted git changes with syntax-highlighted diff output
- `/pin <path>` and `/unpin <path>` commands: pin files to context so they survive compaction. Pinned file contents are injected into every LLM call.
- `/pins` command: list currently pinned files
- `/blueprint [name]` command: apply session blueprints from `.elyra/blueprints/` or `~/.elyra/agent/blueprints/`. Supports YAML frontmatter with `pin` directives.

## [0.5.7] - 2026-05-15

### Added
- `/theme` slash command: opens a theme selector with live preview, or switch directly with `/theme <name>`. Includes autocomplete for theme names.

## [0.5.6] - 2026-05-15

### Added
- Built-in themes: Palenight, Catppuccin Mocha, and One Dark Pro (available via `/theme`)

## [0.5.5] - 2026-05-14

### Changed
- `estimateTokens` now caches results per message in a WeakMap, avoiding redundant token recomputation for immutable messages across compaction checks
- `ExtensionRunner.emitContext` skips `structuredClone` entirely when no extension has registered a context handler
- Agent session uses `agent.appendMessage()` instead of mutating `agent.state.messages` directly

## [0.5.4] - 2026-05-14

### Added
- Anna.js extension (`@elyracode/anna`): generate, preview, and build Markdown presentations with terminal animations, live code playgrounds, Mermaid diagrams, and component layouts

## [0.5.3] - 2026-05-14

### Added
- Laravel Herd integration (`@elyracode/herd`): environment detection, service status, error logs, .env sync checks, PHP version management

## [0.5.2] - 2026-05-14

### Added
- Git intelligence (`@elyracode/git-intel`): session briefings, commit message generation, PR descriptions
- Test generator (`@elyracode/test-gen`): intelligent test generation for Pest (Laravel) and Vitest (TypeScript)
- Performance analyzer (`@elyracode/perf-tools`): N+1 query detection, slow queries, missing indexes, eager loading
- Localization tools (`@elyracode/i18n-tools`): find hardcoded strings, compare translations across locales

## [0.5.1] - 2026-05-13

### Added
- `/packages` and `/ext` commands: interactive TUI browser for all @elyracode extensions with descriptions, install directly without leaving Elyra
- SQLite support in `@elyracode/db-tools` with auto-detection from .env

## [0.5.0] - 2026-05-13

### Added
- SQLite support in `@elyracode/db-tools`: query_sqlite tool with auto-detection from .env (DB_CONNECTION=sqlite) and Laravel defaults
- SQLite schema discovery via get_database_schema

### Fixed
- All package install/remove/update operations now suppress npm noise (warnings, funding, package counts)
- Clean CLI output for install: shows only "Installing...", "Installed", and activation instructions

## [0.4.9] - 2026-05-13

### Added
- Subagent orchestrated workflows: `/build-feature` (scout -> planner -> oracle -> worker -> reviewer -> fix), `/ui-review` (adversarial UI testing with screenshots and accessibility checks), `/deep-review` (parallel correctness + tests + security review with synthesis)
- Git integration: `/git-review` (review diff with go/no-go verdict), `/setup-git-hook` (install pre-push hook that blocks pushes with issues)

## [0.4.8] - 2026-05-13

### Added
- Design tools extension (`@elyracode/design-tools`): live browser preview with Tailwind CDN, screenshot capture for visual QA, Tailwind design system consistency checker
- Subagents extension (`@elyracode/subagents`): delegate to focused child agents (scout, reviewer, planner, worker, oracle, researcher, delegate) with single and parallel execution

## [0.4.7] - 2026-05-12

### Added
- Design tools extension (`@elyracode/design-tools`): live browser preview with Tailwind CDN, screenshot capture for visual QA, and Tailwind design system consistency checker

## [0.4.6] - 2026-05-11

### Added
- HTTP tools extension (`@elyracode/http-tools`): API testing, live documentation fetching, and OpenAPI/Swagger spec parsing

## [0.4.5] - 2026-05-11

### Added
- `@elyracode/doctor`: Auto-heal mode (`/doctor --heal`) that instructs the agent to fix each issue step by step

## [0.4.4] - 2026-05-11

### Added
- Project health analysis (`@elyracode/doctor`): security audit, outdated deps, code debt scanner, large file detection, .env validation, git status, project essentials check

## [0.4.3] - 2026-05-11

### Added
- RILT stack extension (`@elyracode/stack-rilt`): React 19, Inertia.js 2, Laravel, Tailwind CSS 4, shadcn/ui
- Stack detector now recognizes RILT projects

### Fixed
- `elyra update` now shows clean output (version info, progress) instead of raw npm noise

## [0.4.2] - 2026-05-11

### Added
- RILT stack extension (`@elyracode/stack-rilt`): React 19, Inertia.js 2, Laravel, Tailwind CSS 4, shadcn/ui
- Stack detector now recognizes RILT projects (React + Inertia + Laravel + Tailwind)

## [0.4.1] - 2026-05-11

### Added
- Filament v5 extension (`@elyracode/stack-filament`): admin panels, resources, tables, forms, actions, widgets, multi-tenancy, testing
- Stack detector now detects Filament and Laravel AI SDK in composer.json

## [0.4.0] - 2026-05-11

### Added
- Flux UI extension (`@elyracode/flux-ui`): live component index from GitHub, Blade-to-Flux converter, page generator with Livewire 4
- Laravel AI SDK extension (`@elyracode/stack-laravel-ai`): complete reference for agents, sub-agents, tools, structured output, embeddings, vector stores, streaming, and testing

## [0.3.7] - 2026-05-11

### Added
- Flux UI extension (`@elyracode/flux-ui`): live component index from GitHub, Blade-to-Flux converter, and page generator

## [0.3.6] - 2026-05-11

### Added
- `@elyracode/laravel-starters`: GitHub file cache (~/.elyra/cache/github/) with 24h TTL for instant repeat fetches
- `@elyracode/laravel-starters`: `apply_starter_files` tool to write kit files directly to disk with path filtering and excludes

### Fixed
- CI: resolved platform-specific native module issues (tsgo, lightningcss, parcel/watcher, tailwind oxide)
- CI: fixed failing self-update tests after version-check removal

## [0.3.5] - 2026-05-10

### Added
- PrimeVue 4 extension (`@elyracode/stack-primevue`): 80+ UI component reference for Vue 3 with Laravel/Inertia patterns

## [0.3.4] - 2026-05-10

### Added
- Laravel starters package (`@elyracode/laravel-starters`): fetch and customize official Laravel 13.x starter kits from GitHub
- `fetch_laravel_starter` tool: agent auto-fetches React, Vue, Svelte, or Livewire starter kits as reference
- `fetch_github_repo` tool: fetch any public GitHub repo as context
- `/laravel:starter` command: interactive TUI selector for starter kits

### Fixed
- Laravel starters updated to current Laravel 13.x kits (React/shadcn, Vue/shadcn-vue, Svelte/shadcn-svelte, Livewire/Flux UI)

## [0.3.3] - 2026-05-10

### Added
- Animated startup logo with sky-to-teal gradient, revealed line by line on first launch

## [0.3.2] - 2026-05-10

### Fixed
- `@elyracode/db-tools`: Auto-loads `.env` file from project root with Laravel/Docker key mapping (DB_HOST, DB_DATABASE, CLICKHOUSE_HOST, etc.)
- `@elyracode/db-tools`: Explicit `ELYRA_*` env vars always take precedence over `.env` values

## [0.3.1] - 2026-05-10

### Added
- Database tools package (`@elyracode/db-tools`): query MySQL and ClickHouse with schema awareness
- Read-only by default with `ELYRA_DB_ALLOW_WRITES` escape hatch

### Fixed
- ClickHouse config uses granular env vars (HOST, PORT, HTTPS, timeouts) instead of a single URL

## [0.3.0] - 2026-05-10

### Added
- Stack detection: automatically detects TALL and VILT stacks from composer.json/package.json
- Stack info injected into system prompt so the agent always knows the project's technology stack
- Auto-suggestion in interactive mode to install matching stack profile packages
- Also detects: React, Svelte, TypeScript, Vite, Sanctum, Reverb

## [0.2.0] - 2026-05-10

### Added
- Smart model routing: automatically selects optimal model tier per turn based on task complexity
- Codebase memory: persistent project knowledge across sessions via LLM-generated summaries

### Changed
- npm scope changed from `@elyra` to `@elyracode`
