AFT v0.28.0 graduates bash hoisting to a stable top-level feature, fixes two GitHub-reported regressions, and ships a native Windows ARM64 binary.

## Bash hoisting is now default-on

The bash hoist (rewrite + compression + background execution) graduates from experimental to a stable, default-on capability on the `recommended` and `all` tool surfaces. Configure with the new top-level `bash` block:

```jsonc
{
  // Disable AFT bash hoist entirely — falls back to the host's native bash
  "bash": false,

  // Or selectively turn features off
  "bash": {
    "rewrite": true,      // default true: rewrite cat/sed/find/etc. to AFT tools
    "compress": true,     // default true: compress git, cargo, eslint, etc. output
    "background": true    // default true: foreground >5s auto-promotes to background
  }
}
```

Old `experimental.bash.*` config migrates automatically on first launch:

- `experimental.bash.rewrite: true` → top-level `bash: { rewrite: true, compress: false, background: false }` (exact pre-graduation semantics preserved — missing keys defaulted to false in the legacy schema, so the migration materializes all three keys explicitly)
- Tuning-only blocks like `experimental.bash: { long_running_reminder_interval_ms: 5000 }` migrate without enabling feature flags
- The migrated `aft.jsonc` is rewritten on disk with the new shape, comments preserved

To opt out entirely: set `bash: false` at the top level. The migration also runs in-memory for read-only filesystems.

## Vue, Astro, and Svelte language servers now auto-install (GitHub #48)

The npm auto-install table already shipped `@vue/language-server`, `@astrojs/language-server`, and `svelte-language-server` in v0.17.0, but they never installed in real projects because their server specs had no `rootMarkers` — auto-install fell back to a bounded extension walk (depth 4, 200 directories) that often missed `.vue` / `.astro` / `.svelte` files in monorepos or `src/` subtree layouts. Users opening a Vue file got "configured ... but not installed" warnings.

Detection now reads `package.json` directly:

- Vue auto-installs when `package.json` lists `vue` or `nuxt` as a dep, or when `vue.config.*` / `nuxt.config.*` is present
- Astro auto-installs when `astro` is a dep or `astro.config.*` is present
- Svelte auto-installs when `svelte` or `@sveltejs/kit` is a dep or `svelte.config.*` is present

Vite-based Vue projects (no `vue.config.*` file) and Nuxt 3 projects (no `nuxt.config` under the walk budget) now auto-install correctly.

## Honest formatter/checker resolution (GitHub #47)

When AFT was launched from a GUI (Spotlight, Dock, Alfred), its inherited PATH did not include `/opt/homebrew/bin` or `~/.cargo/bin` even when tools like `go`, `rustfmt`, or `biome` were installed there. The previous warning text claimed the tool was "not installed," sending users on a fix-the-install goose chase.

Two changes:

1. `format`/`checker` resolution now falls through to well-known install locations when PATH lookup fails: `/opt/homebrew/bin`, `/usr/local/bin`, `$HOME/.cargo/bin`, `$HOME/go/bin`, `$HOME/.local/bin`. AFT uses the resolved absolute path so the spawned tool works regardless of inherited PATH.
2. Warnings now read "configured ... but was not found on PATH or in common install locations" — and `go` install hints point at the Homebrew bin directory.

Windows is unaffected (these are POSIX paths).

## Native Windows ARM64 binary

Windows ARM64 hosts previously ran the win32-x64 binary under emulation. v0.28.0 ships a real `aarch64-pc-windows-msvc` build as `@cortexkit/aft-win32-arm64`, and `@cortexkit/aft-bridge` resolves it natively on ARM64 hosts. Existing Windows x64 users see no change.

## Other improvements

- **`aft doctor` flags a missing AFT binary as a problem** (#46). Previously the missing-binary case printed `AFT binary: unknown` and still claimed "Everything looks good"; doctor now reports it as actionable, and `aft doctor --fix` downloads the correct version through `@cortexkit/aft-bridge`.
- **TUI sidebar and `/aft-status` no longer flash placeholder index rows before the first tool call.** With lazy bridge spawn, the Search Index, Semantic Index, and Compression sections are hidden until the bridge starts, replaced by a single line: "AFT bridge is now spawned lazily, information here will be populated after first tool call."
- **Structured trace logs around bash-completion wake delivery.** `/tmp/aft-plugin.log` now records seven `bash_completion_*` events (`wake_scheduled`, `wake_fire`, `wake_prompt_async_start`/`ok`/`error`, `ack_ok`, `in_turn_append`) with a per-delivery UUID and a sha256 of the reminder body. The full reminder is never logged. These tracking points exist solely to diagnose the rare case where a background-bash reminder triggers more than one model run for the same parent message; behavior is unchanged.

## Upgrade notes

- Bash hoist is now active by default on the `recommended` surface. If you don't want it, set `"bash": false` in `aft.jsonc`.
- Old `experimental.bash.*` config keys migrate automatically on first launch; the rewritten `aft.jsonc` preserves your existing semantics.
- The new Vue/Astro/Svelte auto-install only triggers when `lsp.auto_install: true` (the default).
