Skip to content

v0.63.4

Choose a tag to compare

@github-actions github-actions released this 30 Oct 15:43
· 1207 commits to main since this release
a64e06b

v0.63.4

AFT 0.63.4 replaces 0.63.0 through 0.63.3, which were not published because their release builds failed. It adds shell memory limits, changed-file reports and a separate cache location. Diagnostics, call graphs, command recovery and permissions are fixed, with lower resource use.

Upgrading

  • Outdated call graphs and symbol caches rebuild on use; call-graph caches take about three quarters less disk space.
  • Malformed security settings reject config instead of resetting defaults; invalid nonsecurity sections are named and skipped (docs).
  • bridge.hang_threshold is retired. User config updates automatically; npx @cortexkit/aft doctor --fix removes it from project config (docs).
  • Pi print/JSON/RPC sessions allow outside-project access without prompting. Interactive prompts remain on; only user config can disable pi.external_access_ask (docs).

New

  • User storage.cache_dir puts caches on another volume; unavailable volumes disable caches without falling back to the primary disk (docs).
  • User bash.changed_files reports list or diff changes, including background completions; default off (docs).
  • bash.memory_limit_mib optionally caps local commands' aggregate memory, including background and terminal commands (docs).
  • Trusted projects can set local bash.env values; user values win. Trust a project with aft doctor filters trust (docs).
  • glob searches ignored subtrees when the pattern names their leading folders; broader patterns still skip them.
  • Hide OpenCode 2's health footer with "aft": { "footer": false } in tui-preferences.jsonc (docs).
  • bash_watch can follow a log line by line with deliver: "each_line", reporting byte offsets and drops at caps (#751, thanks @iceteaSA).

Changed

  • grep counts lockfile, generated/minified, log and JSON matches without printing them; returned path or include values show them.
  • aft_search labels non-exact results as similar, discloses filesystem fallback and capped walks, and gives exact regex totals.
  • Compressed shell output keeps unrecognized check results, small Cargo outputs and middle-of-output failures.
  • Folder approvals cover read tools or writes; granted access survives busy periods, and permission replies explain outstanding grants instead of looping.
  • Indexing and undo use less memory; semantic queries no longer queue behind local indexing, and idle projects release resources.
  • Storage cleanup reads fewer files per pass, stops at its time limit and backs off after an unfinished pass, using less CPU when many projects and commands are kept.
  • Call-graph updates, language-server detection and background maintenance use less CPU and disk (#746, thanks @moynzzz).
  • Empty caller and impact results return faster on large projects, still warning about unresolved calls.
  • bash_watch notices name how many matches a stalled connection dropped and point at the task output; a gap notice never uses up a one-shot watch.
  • Parallel aft_search calls use less CPU and finish sooner, with unchanged results.
  • Repeated scoped aft_inspect dead-code checks use far less CPU, with unchanged results; dead-code checks and ignore-rule reloads on large checkouts also use less CPU.
  • runon jobs show whether they are waiting for a free build host or connecting, instead of only "capturing inputs", before they start.
  • Shell commands start faster when a Git hooks or excludes setting points through a symlink.
  • Idle language servers stop after lsp.idle_minutes even while other packages in the project are busy, instead of only when the whole project goes idle (#1170, thanks @iceteaSA).

Fixed

  • OpenCode 2.2.1 accepts AFT's tools again (#1141, thanks @KomeijiReimu).
  • OpenCode 2 subagent tool calls no longer hang after an aborted tool receives a background completion (#1110, thanks @iceteaSA).
  • aft_search no longer returns stale exact matches after files change: edited or new files containing the text appear, and files that no longer contain it drop out.
  • Outside-access prompts ask again after a reconnect during approval, instead of stopping the tool.
  • When a folder walk runs out of time, grep, glob and outline keep the paths already found and say the result is partial, instead of looking like nothing was found (#493).
  • Standalone timeouts leave other sessions running; read-only calls interrupted by a hung-process restart retry once (#646, thanks @null-axiom).
  • OpenCode 2 fixes subagent lookup, progress, diagnostics, worktree overrides and long commands (#646, thanks @null-axiom).
  • Call graphs mark callbacks, link constructors, disclose stale sources or potentially missing calls, and respect inline-test exclusions (#937, #973, thanks @null-axiom, @iceteaSA).
  • Call graphs recover after restarts and locks, rebuild outdated non-Git caches and tolerate malformed Rust exports (#746, #771, thanks @moynzzz, @null-axiom).
  • Rust dead-code checks count module-path calls, Self:: helpers and function values as uses.
  • aft_inspect stops reporting live Rust functions dead, unverified diagnostics clean or stale errors authoritative after edits.
  • Language servers start once per workspace, receive startup edits, ignore old-instance messages, retry busy watcher updates and resolve project symbol hints.
  • Search and inspect stop duplicating nested linked-worktree results (#746, thanks @moynzzz).
  • Gitless projects stay searchable; indexes survive adding Git, damaged caches recover, and continuous edits no longer stall indexing.
  • Cache locks recover after unreadable/replaced lock files; macOS projects retry busy cache directories instead of losing indexes.
  • Search stops matching functions against neighboring functions' text, bounds long-line snippets and classifies test-support files consistently.
  • Unreadable indexes produce gaps instead of silent misses; semantic search fixes exported-symbol ranking and oversized summaries.
  • Python edits preserve indentation, multiline strings and line endings; invalid indentation rolls back (#824, thanks @null-axiom).
  • Line-range/multi-edit batches accept existing filenames with glob characters, such as app/[id]/page.tsx; actual glob edits require one find/replace.
  • Extraction preserves bindings, literals and line endings and refuses unsafe control flow; symbol moves keep TypeScript/JavaScript directives.
  • Import edits preserve comments, directives and Python ordering; AST rewrite previews reject invalid rewrites and preserve $$$ captures (#827, #828, thanks @null-axiom).
  • Large matches finish promptly; Go grouped types, HTML headings and Pascal AST patterns parse correctly; timed-out outlines return partial results.
  • On Unix, Bash can validate scripts AFT's parser rejects; Windows reports unknown syntax-check results. Confirmed errors name their line.
  • Watches preserve split characters across output pages and disclose timed-out scans; Unix commands retain signal exit codes.
  • Background completions and watch matches survive startup and restarts; OpenCode/Pi retry undelivered notifications without duplicates.
  • Unknown tasks point to bash; storage failures stop masquerading as task-limit or missing-task errors (#691, thanks @kido5217).
  • Outline/zoom respect URL/GitHub deadlines; calls keep replying during restarts, shutdowns and slow saves, without mislabeling daemon calls as never started.
  • Oversized or duplicate standalone requests are refused without displacing pending work; busy queues return retry errors.
  • Undo waits for migration; cleanup reclaims deleted checkouts, empty/read-only task folders and old cache trash (thanks @null-axiom).
  • Windows: config saves work during reads; config and call-graph watches stop without freezing unrelated file operations.
  • Windows: same-size replacements invalidate stale caches, and finished command results retain their full lifetime.
  • Windows: daemon shell commands stop crashing AFT; exit N survives restart; memory-limit stops finish with code 137.
  • Kills disclose surviving processes; macOS stops waiting on processes already exiting (#830, thanks @iceteaSA) (docs).
  • OpenCode preserves invalid preferences and prevents competing updates; status stops regressing under load. CLI keeps pinned versions, comments and exit codes.
  • Pi stops stalled language-server installs; Linux ARM64 skips unsupported clangd downloads.
  • aft profile shows busy-thread stacks and raw frames without symbols; logs identify the correct session (#1008, thanks @iceteaSA).
  • Managed Git hooks no longer hang on leftover helper processes.
  • Commands with bash.linux_scope keep shell variables intact and run on systemd 254 and newer (#1134, thanks @iceteaSA).
  • Plugin logs use the right levels and are quieter; GitHub-comment edit errors show short excerpts (#759, thanks @null-axiom).
  • Foreground commands stream live output again in OpenCode 1, OpenCode 2 and Pi (#1052, thanks @chrisolszewski).
  • Returning to an idle project restores task records, compression events and undo backups without a restart (#1084, thanks @iceteaSA).
  • After a restart, watch and completion previews are withheld only for commands that may hold secrets, and name the output file.
  • Changed-file diffs that run out of time say so instead of claiming no clean Git version.
  • aft_outline array targets fetch URL entries instead of treating them as local paths; an unfetchable URL is reported with its reason.
  • A cancelled write no longer leaves its backup in undo history; a failed cleanup is reported.
  • With views off, search on an unloaded semantic index reports it as building instead of ready.
  • SQLite missing-table and missing-column errors include the schema hint for ~ and variable database paths.
  • Language servers notice files AFT creates, moves or deletes, so importing a newly written module no longer shows a stale missing-module error (#1165, thanks @iceteaSA).

Security

  • OpenCode outline/zoom enforce read rules; broad approvals stay file-only, and delete/undo refuse files swapped after approval (thanks @iceteaSA).
  • File tools and undo refuse AFT storage and links to live databases, even within authorized projects.
  • Authorization failures prevent command execution; uncertain result recording reports outcome_unknown instead of success.
  • Language-server downloads never forward GitHub tokens outside api.github.com; installers reject unsafe versions and skip npm install scripts.
  • Formatters/checkers use the session's sandbox and grants; logs mask inline command secrets.
  • macOS workers can use kill -0; real signals reach only their command's processes on macOS/supported Linux kernels (older kernels report unenforced) (docs).