Repository navigation
v0.63.4
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_thresholdis retired. User config updates automatically;npx @cortexkit/aft doctor --fixremoves 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_dirputs caches on another volume; unavailable volumes disable caches without falling back to the primary disk (docs). - User
bash.changed_filesreportslistordiffchanges, including background completions; defaultoff(docs). bash.memory_limit_miboptionally caps local commands' aggregate memory, including background and terminal commands (docs).- Trusted projects can set local
bash.envvalues; user values win. Trust a project withaft doctor filters trust(docs). globsearches ignored subtrees when the pattern names their leading folders; broader patterns still skip them.- Hide OpenCode 2's health footer with
"aft": { "footer": false }intui-preferences.jsonc(docs). bash_watchcan follow a log line by line withdeliver: "each_line", reporting byte offsets and drops at caps (#751, thanks @iceteaSA).
Changed
grepcounts lockfile, generated/minified, log and JSON matches without printing them; returnedpathorincludevalues show them.aft_searchlabels 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_watchnotices 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_searchcalls use less CPU and finish sooner, with unchanged results. - Repeated scoped
aft_inspectdead-code checks use far less CPU, with unchanged results; dead-code checks and ignore-rule reloads on large checkouts also use less CPU. runonjobs 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_minuteseven 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_searchno 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,globandoutlinekeep 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_inspectstops 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 Nsurvives 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 profileshows 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_scopekeep 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_outlinearray 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_unknowninstead 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).