# v0.34.0 — Imports for 12 more languages, YAML/Kubernetes, cross-repo conflicts

This release extends `aft_import` from 5 languages to 17, adds YAML and Kubernetes/CRD-aware code intelligence, lets `aft_conflicts` inspect any repository or worktree, adds an `.aftignore` file and ripgrep-style explicit-file `grep`, makes `aft_zoom` call-graph annotations opt-in, and turns two previously-hardcoded limits into configuration.

## `aft_import` now supports 12 more languages

`aft_import` (add / remove / organize) previously covered TypeScript, JavaScript, Python, Rust, and Go. It now also handles **Solidity, Java, C#, PHP, Kotlin, Scala, Swift, Ruby, Lua, Perl, C/C++, and Vue** — 17 languages total.

Each engine understands its language's real import shape rather than treating imports as plain text:

- Require-style languages (Ruby `require`/`require_relative`, Lua `require(...)`) preserve binding and call style.
- Swift supports `@testable` and kind-imports (`import struct Foo.Bar`); Java supports `static` imports; Solidity supports named, namespace (`* as`), and aliased forms.
- Scala 2 wildcard (`_`) and rename (`=>`) syntax is preserved verbatim when organizing, so organize never rewrites valid imports into invalid ones.
- C/C++ `#include` groups system (`<...>`) before local (`"..."`) and accepts modules with or without delimiters.
- Vue Single-File Components rewrite imports inside the `<script>` block, leaving `<template>` and `<style>` untouched.

New optional parameters cover the forms these languages need: `namespace`, `alias`, `modifiers`, and `importKind`.

Adding an import to a file that has a header but no existing imports now inserts after the header — after a Go `package`, a Solidity SPDX/pragma, a PHP `<?php`, or a Java/Kotlin package declaration — instead of at the top of the file. For a PHP file wrapped in a braced `namespace Foo { ... }`, the import is placed inside the namespace body, and a script starting with a `#!` shebang keeps the shebang on the first line.

## YAML and Kubernetes/CRD support

`aft_outline`, `aft_zoom`, `aft_search`, and `ast_grep_*` now understand YAML (`.yaml` / `.yml`), and YAML files are embedded in the semantic index. Kubernetes and CRD manifests — any document carrying `apiVersion` + `kind` — become a single rich symbol named `<namespace>/<Kind>/<name>`, with high-signal spec fields folded into the embedding so intent queries match: container images and ports, CPU/memory limits, volume mounts, replicas, env var names, RBAC verbs/resources, and Argo Workflow entrypoint/templates/schedule. Plain YAML (docker-compose, CI config, Helm `values.yaml`) surfaces its top-level keys as symbols, and multi-document streams are handled per document.

## `aft_conflicts` can inspect any repository or worktree

`aft_conflicts` now takes an optional `path` parameter, so you can point it at the repository or git worktree where a rebase or merge is actually running instead of only the session's project root. Discovery is anchored at that path's git top level (so it works from any subdirectory), and it unions unmerged-index files with a working-tree scan for conflict markers — so a file that was `git add`ed but still carries markers is reported instead of silently missed. The output now names the checked repository root, so a "No merge conflicts found" result is never ambiguous about which repository it actually examined.

## `.aftignore`

AFT now honors an optional `.aftignore` file, layered on top of `.gitignore`. It uses the same syntax, is hierarchical, and works in non-git projects.

Use it to exclude paths from every AFT walk — trigram index, semantic index, call graph, `aft_inspect`, scoped diagnostics, and the ripgrep fallback — that you can't put in `.gitignore`, most commonly git submodules you don't want indexed. Edits under an `.aftignore`d path also stop triggering reindexing, and editing the `.aftignore` file itself refreshes the indexes so newly-ignored files drop out without a restart.

## `grep` searches explicitly-named files even when ignored

Naming a single file in `grep` (for example `path: "captures/log.txt"`) now searches that file even when it is gitignored or `.aftignore`d, matching ripgrep. Previously an explicitly-named ignored file returned `0 matches across 0 files`, which read as "no matches" rather than "never searched". Directory searches still honor `.gitignore` and `.aftignore` as before.

## `aft_zoom` call-graph annotations are now opt-in

`aft_zoom` no longer appends call-graph annotations (calls-out / called-by) by default. The default output is now just the symbol source, keeping zoom focused and token-light. Pass `callgraph: true` to include the annotations. For full cross-file call relationships, use `aft_callgraph`.

## Configurable limits

- **`semantic.max_files`** (default `20000`, raised from a hardcoded `10000`) caps how many files the semantic index embeds. Semantic search now works on monorepos that previously hit the 10k limit. Raise it further when using a remote embedding backend that embeds server-side, or lower it on memory-constrained machines.
- **`bash.foreground_wait_window_ms`** (default `8000`, minimum `5000`) controls how long a foreground `bash` command runs before it is promoted to a background task. The previous window was a fixed 5 seconds.

## Fixes

- **C/C++ includes** added with a delimiter (`#include <string>`) are no longer double-wrapped into invalid `#include <<string>>`.
- **Import failures** that roll back now report the failure instead of returning a success with no change.
- **Backup loading** no longer logs a per-entry warning for every legacy backup directory on startup; stale directories from older path-hash schemes are skipped quietly.
- **`aft_inspect` dead-code analysis** resolves cross-file, barrel re-export, and namespace-import (`import * as ns`) liveness more accurately, reducing false positives.
- **`aft_import`** rejects module paths with `..` traversal segments or absolute paths for C/C++, Solidity, and PHP, and `aft_import remove`/`organize_imports` report `no_op` when nothing changed.
- **ONNX Runtime detection** now finds the library in a `lib/` subdirectory, so manual installs of Microsoft's release archive are detected instead of reported as missing.
- **Formatter and type-checker lookup** now searches system locations that GUI-launched editors miss from `PATH` — `/usr/local/go/bin` (official Go installer), `/usr/bin`, and `/snap/bin` — so tools like `gofmt`, `go`, and `gopls` are found when installed system-wide.
- **`aft doctor --issue`** no longer files automatically. It writes a sanitized report, asks you to review and edit it, and only files after you confirm. Redaction now also strips the project directory path and credential-shaped values (tokens, API keys, `Authorization` headers, URL credentials), and non-interactive terminals never auto-file.
- **ONNX Runtime** archive extraction rejects symlinks that escape the staging directory, including across Windows drive letters.
- **Formatter/checker warnings after `configure`** now only appear when formatting or validation is actually enabled (`format_on_edit` / `validate_on_edit` or an explicit per-language `formatter`/`checker`), instead of firing from a project config file even when those features are off.
- **Configure warnings** are delivered as idle-time notifications and no longer switch the session's model or agent (or stall the first tool turn) when they fire.
- **Windows tool resolution** finds Biome, Ruff, and other formatters/checkers installed via npm that are present on `PATH`, instead of reporting them missing.

## Pi

- AFT's namespaced tools in the Pi plugin (`aft_import`, `aft_refactor`, `aft_safety`, `aft_transform`, `ast_grep_replace`, `aft_delete`, `aft_move`) now prompt for external-directory access when `restrict_to_project_root` is enabled, consistent with Pi's hoisted file tools.

Thanks to @M0Rf30 (#73, YAML/Kubernetes support), @Zireael (#72, configure-warning gating and Windows tool resolution), and @Suknna (#75, unified configure-time tool detection) for their contributions to this release.

Join us on Discord: https://discord.gg/DSa65w8wuf
