Releases: Apra-Labs/apra-fleet
v0.2.1
Highlights
Antigravity (agy) is now a supported LLM provider alongside claude and gemini. You can run a fleet member -- doer, reviewer, or PM -- on agy and dispatch across providers freely.
apra-fleet install --llm agyWhat's new
Antigravity (agy) provider (#277)
- Provider adapter with auth handled like claude's (sign in once on each machine via browser OAuth, or set an API key env var for headless use), and a new
AGY.mdinstruction file (parallel toCLAUDE.md/GEMINI.md) - Tier-to-model mapping per workspace:
cheap-> Gemini 3.5 Flash (Medium),standard-> Gemini 3.1 Pro (Low),premium-> Claude Opus 4.6 (Thinking). Written into<workspace>/.gemini/antigravity-cli/settings.jsonon every dispatch (Unix and Windows code paths) - Workspace
.ignoreoverlay scaffolding for local agy members (writes.ignoremarkers forapra-fleetMCP +pm/fleetskills -- see Known limitations below) - Helper scripts (transcript reader, settings merge) bundled as standalone
.jsassets via the existing SEA pipeline. Eliminates a Windows shell-quoting class of bug from inlinenode -e '<literal>'invocations - New e2e suites
s8.1/s8.2/s8.3covering agy PM on Windows / Linux / macOS - Agy supports parallel dispatch, same as claude (only gemini has the documented sequential-dispatch limitation)
Documentation overhaul (#271)
- README rewritten from a 644-line reference manual into a ~250-line value-first front door: hero, embedded demo video, copy-paste install in the first screen, concrete example mirroring the demo, mermaid how-it-works diagram
- New
docs/install.md(install /--skill/--llm/ uninstall / self-update) - New
docs/troubleshooting.md - New
docs/writing-skills.md docs/provider-matrix.mdrefreshed (stale Opus 4.6 references corrected to 4.7)- Compare-to-alternatives table, production fleet config, cross-provider collaboration callout
Docs accuracy + llms.txt as source of truth (#272)
scripts/gen-llms-full.mjsnow scrapesllms.txtfor the doc list instead of carrying a hardcoded list. Idempotent generator + newtests/gen-llms-full.test.ts- New user-facing
docs/provider-guide.md(concise provider strengths + role recommendations);docs/provider-matrix.mdstays the dev reference - New
docs/beads.md(how Fleet uses Beads) - Removed two factually-wrong Gemini claims (silent output truncation; "OAuth copy is Claude-only")
- README repositioned: Fleet as a general multi-agent coordination platform; the PM skill framed as one reference workflow
Bug fixes
apra-fleet updateself-update bug fixed (#271)- Workspace
defaultModelpreservation -- previously, everyapra-fleet installclobbered the user's customdefaultModel. Now preserved on reinstall (regression fix for all providers, surfaced during agy review) sessionIdshell injection defense in the Windows agy prompt wrapperhooks.jsonfile mode -- agy install now writes hooks.json with0o600(matches OAuth credential file mode)requiredPermsdeduplication -- duplicateactivate_skill(*)andtracker_*entries removed from install payloadSKILL.mdcontext-file mapping for agy fixed (was pointing toGEMINI.md, nowAGY.md)- Windows shell-quoting robustness for agy transcript reader and per-dispatch settings merge -- both moved out of inline
node -eliterals into bundled.jsfiles
Known limitations (tracked, not blockers)
- agy workspace
.ignoreoverlay is created but not yet honored by agy at runtime -- local agy doer/reviewer members can still callapra-fleetMCP tools. Tracked. - Other tracked follow-ups: install-test coverage for agy, model-identity logging gap in agy transcripts, registry-driven env-unset list, pm-skill plan-review step.
Quality
- Unit tests: 1298 passing (up from 1282 in v0.2.0)
- e2e regression matrix green across all four suites on this release:
s1.1(Windows claude),s1.2(Linux claude),s1.3(macOS claude),s8.1(Windows agy PM + agy doer + agy reviewer) - CI Build & Test green on all three runners (ubuntu / macos / windows)
Install / upgrade
# fresh install (claude by default)
apra-fleet install
# fresh install with a specific provider
apra-fleet install --llm agy
apra-fleet install --llm gemini
# upgrade an existing install
apra-fleet updateDownload links for the standalone installer (no Node.js required) are in the Assets section below.
v0.2.0
Highlights
End-to-end test harness -- A new phased E2E test facility exercises the full product -- member registration, dispatch, doer/reviewer sprints, real PRs -- across Claude and Gemini and across Windows/Linux/macOS. The CI workflow runs a setup phase and a sprint phase with separate turn budgets, fails loud on errors (no more masked failures), and gates on terminal checkpoints so an incomplete run cannot report success. (#260, #263, #269)
Smart stall detector -- Members that hang are now detected by monitoring session-log activity, with log correlation to pinpoint where a member stalled. (#241, #252, #263)
Reliable provider dispatch -- Fixed a session-id collision where a local Claude member could resume the orchestrator's session instead of its own (cross-wiring context and token usage). Fleet now mints a session id up front and passes it explicitly for both Claude and Gemini. (#269)
Unified credential handling -- Credential collection is consolidated into a single secret subcommand; auth now writes local CLI auth (--oauth / --api-key). The out-of-band headless fallback prompts the correct command per mode. (#257, #269)
Other changes
- PM skill: merge gates added, duplication reduced, templates cleaned up (#255)
credential_store_setfixed on Windows (#260)- Security: dependency vulnerabilities patched; directory-watcher fix (#252)
- Test suite rationalized -- dead tests removed, coverage added (#262)
- Repo hygiene: ASCII-only pre-commit hook; line-ending normalization (#269)
Upgrade notes
- Version scheme moves to 3-part semver (
0.2.0) from the prior 4-part0.1.9.x. apra-fleet auth <name>no longer collects out-of-band credentials -- useapra-fleet secret --set <name>(egress confirmation:apra-fleet secret --confirm <name>).
Full changelog: v0.1.9.0...v0.2.0
What's Changed
- feat: smart stall detector with session log activity monitoring (#241) by @kumaakh in #246
- fix(deps,stall): security vulns + stall-detector log correlation + dir-watch fix by @kumaakh in #252
- feat: redesign auth → secret subcommand (#216) by @kumaakh in #239
- fix(pm-skill): add merge gates, reduce duplication, clean up emojis and templates by @kumaakh in #255
- revert: remove auth-secret redesign from main (806eb78) by @kumaakh in #256
- refactor(auth): unify credential collection into collectSecret() by @kumaakh in #257
- feat(e2e+oob): LLM-driven e2e suite, credential_store_set Windows fix by @kumaakh in #260
- test: rationalize test suite — delete dead tests, add coverage, fix misleading fixtures by @kumaakh in #262
- feat(e2e): end-to-end test facility + stall-detector improvements by @kumaakh in #263
- E2E test harness rewrite + provider-dispatch and auth hardening by @kumaakh in #269
- chore(release): bump version to 0.2.0 by @kumaakh in #270
Full Changelog: v0.1.9.0...v0.2.0
v0.1.9.0
What's new
New features
apra-fleet uninstall— surgically removes MCP registration, permissions, hooks, statusLine, and skill directories. Supports--dry-run,--force,--yes,--llm <provider>, and--skill fleet|pm|all. Settings files are edited per-key — unrelated user config is preserved.- Beads task DB — PM now uses
bd(Beads CLI) for persistent task tracking across sessions. Installed alongside fleet. Runbd readyto see in-flight work.
Fixes
- Reject unknown CLI arguments with a clear error and help hint (#244)
- Exclude apra-fleet from Gemini child process MCP via allowlist (#243)
Docs
- README: uninstall command, self-update command, Beads mention
docs/features/uninstall.md— design notes for the uninstall commanddocs/features/update.md— design notes for the self-update commanddeploy.mdrollback section corrected (no .bak file is created; rollback via re-running old installer)GEMINI.md,AGENTS.md,CLAUDE.md— project context files aligned across all three providers
Upgrade
apra-fleet updateWhat's Changed
- fix(gemini): exclude apra-fleet from child process MCP via allowlist by @kumaakh in #243
- fix(cli): reject unknown arguments with error and help text by @kumaakh in #244
- feat(beads): install bd CLI + PM/fleet Beads integration by @yashrajsapra in #235
- feat(#245): uninstall command by @kumaakh in #250
- chore: post-245 cleanup + README uninstall docs by @kumaakh in #251
New Contributors
- @yashrajsapra made their first contribution in #235
Full Changelog: v0.1.8.2...v0.1.9.0
v0.1.8.2
What's Changed
Full Changelog: v0.1.8.1...v0.1.8.2
v0.1.8.1
What's Changed
- fix: CLI help, version parse, logging improvements, fleet_status log path by @kumaakh in #214
- fix: resolve Windows drive-letter paths in SFTP transport (issue #220) by @joiskash in #221
- fix(gemini): MCP exclusion + BOM-free config write on Windows (#219) by @kumaakh in #228
- improve: strengthen plan-prompt and tpl-plan with elaboration, verification and tier rules by @kumaakh in #222
- fix: harden execute_prompt busy-state — unconditional clear on all exit paths (#210) by @kumaakh in #230
- feat: apra-fleet update command — self-update with install option replay (#212) by @kumaakh in #229
Full Changelog: v0.1.8.0...v0.1.8.1
v0.1.8 — Pino Logging, Claude 2.1.113+ Compatibility & Session Lifecycle
What's new in v0.1.8
Claude 2.1.113+ compatibility fix
Claude Code 2.1.113 switched from a bundled JavaScript binary to a native executable, which changed --output-format json output from a single JSON object to JSONL (newline-delimited JSON events). Without this fix, execute_prompt returned raw JSONL as the result text.
- Three-tier
parseResponse— handles (1) classic single JSON object (pre-2.1.113), (2) JSON array of events, and (3) JSONL newline-delimited stream (2.1.113+). All formats are transparently detected and parsed. - Direct shell execution on Windows —
wrapWindowsPromptreverted fromProcessStartInfo+CreateNoWindowto direct shell execution. The nativeclaude.exebinary does not inherit stdout throughProcessStartInfo; direct shell execution captures stdout correctly through the PowerShell pipe. windows-wrapper.ts—defaultWindowsPidWrapper(ProcessStartInfo approach) extracted into its own module for use by the Copilot provider.
Pino JSONL structured logging (#202)
Fleet server now emits structured logs in JSONL format using pino.
- Each log line is a JSON object:
{"ts":"...","level":"info","tag":"execute_prompt","msg":"..."} - Log files:
~/.apra-fleet/data/logs/fleet-<pid>.log - Log messages for
execute_promptnow include the LLM model name:[claude-haiku-4-5] timeout=60s ... - MCP cancellation signals thread through
execute_promptandexecute_commandvia AbortSignal, with proper child process cleanup
Session lifecycle & credential trust model (#183)
- Full session lifecycle management — sessions track state across turns, resume correctly, and clean up on server shutdown
- Trust model for credential operations — members with explicit auth grants can perform credential operations without repeated prompts
stop_promptfixed — correctly terminates in-flight prompts and releases session locks- Structured log tags:
startup,execute_prompt,pid_kill,stop_prompt,execute_command
Model tier updates (#171)
- Gemini provider updated to Gemini 3.x model generation (
gemini-3-flash,gemini-3-pro-preview, etc.) deleteFilesand other path operations now useescapeDoubleQuoted/escapeWindowsArgconsistently
Fleet-MCP suppression for members (#173, #178)
- Claude and Gemini members no longer see
apra-fleetin their own MCP server list — prevents recursive self-invocation - Release update notifications — members are notified when a newer fleet version is available
Stability & bug fixes
send_filescollision detection (#175) — detects and skips files that would collide on case-insensitive filesystems- Stale task cleanup (#175) — background tasks that exceed their TTL are automatically reaped
- SSH username with spaces (#177) — SSH connections now correctly handle usernames containing spaces
- Improved SSH error messages (#177) — connection failures include the remote address and auth method in the error
- Windows path rejection in
send/receive_files(#174) — backslash paths are rejected early with a clear error credential_storeTTL cleanup (#176) — expired entries pruned on startup;remove_memberfully decommissions all associated credential state- ESM
__dirnameshim (#174) — remaining__dirnameusages replaced withfileURLToPath(import.meta.url)for ESM compatibility
Documentation
- MseeP security badge added (#205)
llms-full.txtregenerated
What's Changed
- fix: Gemini 3.x model tiers, deleteFiles space escaping, test assertions by @kumaakh in #171
- fix(#151): suppress fleet-mcp for Claude and Gemini members by @kumaakh in #173
- fix: ESM __dirname shim + Windows path rejection in send/receive_files by @kumaakh in #174
- fix: SSH username with spaces + improved SSH error messages by @kumaakh in #177
- fix: send_files collision detection + stale task cleanup by @kumaakh in #175
- fix: credential helper TTL cleanup + full remove_member decommission by @kumaakh in #176
- feat(#161): release update notification in fleet_status by @kumaakh in #178
- chore: bump version to 0.1.8 by @kumaakh in #181
- chore: remove orphaned merge.ts from dashboard/src/api by @kumaakh in #187
- feat: Sprint 1+2 — session lifecycle, auth UX, credential & trust model (#147, #160, #148, #106, #157, #158, #163, #54) by @kumaakh in #183
- docs: add badges.md with security and build badges by @kumaakh in #205
- Update MseeP badge link and text by @kumaakh in #206
- feat: #201 pino JSONL logging framework by @kumaakh in #202
- fix: JSONL parseResponse + direct shell stdout fix for Claude 2.1.113+ by @kumaakh in #207
Full Changelog: v0.1.7.0...v0.1.8.0
v0.1.7 — Credential Store & Secure OOB Input
What's new in v0.1.7
Credential store & {{secure.NAME}} token resolution
Secrets can now be stored out-of-band and referenced by name — they never appear in prompts, logs, or chat history.
credential_store_set— prompts for a secret value in a separate terminal window (OOB), stores it encrypted at~/.apra-fleet/data/credentials.enccredential_store_list— lists stored credential names (values never shown)credential_store_delete— removes a credential from both session and persistent tiers{{secure.NAME}}token resolution — use credential handles inexecute_command,register_member,update_member,provision_vcs_auth,provision_auth, andsetup_git_app; the server resolves and redacts values before the LLM sees any outputexecute_promptguard — prompts containing{{secure.NAME}}tokens are rejected with an error; secrets must never reach LLM contextsetup_git_app—{{secure.NAME}}tokens now resolve as PEM content for private key fields- OOB fallback for
provision_vcs_authandprovision_auth— when no token is provided, triggers secure out-of-band collection automatically
OOB secure input improvements
- Replaced raw-mode terminal input with
@inquirer/passwordmasked input for secure value entry - OOB prompt header changed from
"Member: X"to"Enter secure value for: X"— accurate for both member auth and credential store use - Generic secure-input message on the OOB collection window (no longer labels as "API key")
Bug fixes
- OOB retry hang (#164) — after a cancel or fallback,
hasPendingAuth()was returningtrueand blocking re-entry; fixed by cleaning uppendingRequestsandpasswordWaitersin all exit paths - Credential name shown as member name (#165) —
credential_store_setwas passing the credential name asmemberNameto the OOB prompt; now shows"Enter secure value for: MY_CRED"instead of"Member: MY_CRED" - ESM
__dirnameincompatibility (#33) —__dirnameused in ESM context replaced withfileURLToPath(import.meta.url)across affected modules cloud_activity_commandblocked empty string (#5) — removed.min(1)Zod validation that prevented clearing the custom activity command- Headless OOB hint (#106) — when the OOB terminal can't open (headless / CI environment), the error message now includes a hint to use
credential_store_setpre-flight
CI & deliverable fixes
update-llms-fullworkflow now checks out by commit SHA rather than branch name — survives branch deletion after PR mergeCLAUDE.mdandAGENTS.mdare now restored fromorigin/mainby the cleanup command rather than deleted — preserves them as project deliverablespaths-ignoreadded forllms-full.txton main push — prevents auto-commit loops- Refuse-to-commit guard added:
update-llms-fullwill not auto-commit directly tomain
Documentation
- Comprehensive credential store documentation added to README, fleet skill, and PM skill
- PM skill documents
{{secure.NAME}}usage rules, OOB workflow, and mid-sprint credential rotation llms-full.txtregenerated
v0.1.6 — Install UX, Bug Fixes & Doc Consolidation
What's new in v0.1.6
First-run onboarding experience (#101)
New users now get a guided introduction the first time the MCP server responds to a tool call:
- ASCII welcome banner with a getting-started guide on first use
- Contextual nudges at three key journey points: after registering the first member, after dispatching the first prompt, and when a multi-member fleet is running
- Welcome-back message on server restart when an active fleet is already registered
wrapTool()central wrapper replaces 21 inline wrappers — consistent entry/exit handling across all tools- Onboarding state stored at
~/.apra-fleet/data/onboarding.json(atomic writes, upgrade-safe) - Existing users on upgrade get a one-time upgrade nudge rather than the full first-run flow
- 57 new tests (658 total)
README rewrite — leads with doer-reviewer workflow (#133)
The README was substantially rewritten to lead with what makes apra-fleet useful:
- Repositioned tagline: opens with the doer↔reviewer loop rather than generic "fleet manager" copy
- Single-machine quickstart: step-by-step from install to first delegated task on one machine
- One-liner install prominently featured for all platforms (macOS/Linux/Windows)
- Provider recommendations table: which LLM to pick for which role
- FAQ section — 8 collapsible Q&As drawn from community discussions (#127): cost, model choice, single-machine vs. multi-machine, Windows support, and more
docs/FAQ.mdadded for AI agent consumption, withllm-context/keywords/see-alsofrontmatter- LLM context hints (
<!-- llm-context -->comments) added to 8 doc files so agents navigating the repo get better orientation - README tool table synced with CLAUDE.md
Install UX, bug fixes & doc consolidation (#143)
Closes #115, #108, #39, #96, #139, #142, #140, #136, #134
Install UX
apra-fleet install --help/-hnow prints usage and exits — no files written (#142)- Bare
apra-fleet installdefaults to--skill all(installs bothfleetandpmskills) (#139) --skill fleet,--skill pm,--skill none,--no-skillflags for fine-grained control (#139)- Running-server guard: install exits with a hint to use
--forcewhen the MCP server is active (#96) --forcekills the running server and proceeds with reinstall (#96)- Unknown flags (
--typo, etc.) are rejected with a clear error message (#96)
Bug fixes
- Unknown
llmProvidervalues now throwTypeErrorinstead of silently using Claude behaviour (#115) - Codex
config.tomlnow writesdefaultModel = "gpt-4o"(properly quoted) instead of a bare unquoted value (#115) - Claude session resume uses
-cflag instead of--resume <session-id>(#108) - Statusline cleared (file emptied, state reset to
{}) when the last fleet member is removed (#39)
Doc consolidation
docs/user-guide.mdabsorbed intoreadme.md— 20 sections merged with<details>collapsibles (#140, #136)CLAUDE.mdandAGENTS.mdrewritten as thin wrappers (≤ 30 lines each) pointing toreadme.md(#140)llms.txtupdated to referencereadme.md(wasdocs/user-guide.md) (#134)scripts/gen-llms-full.mjsupdated to source fromreadme.md(#134)- All stale
user-guidereferences removed from.md,.ts,.js,.json,.ymlfiles (#136)
Full changelog: v0.1.5...v0.1.6
What's Changed
- docs: rewrite README to lead with doer-reviewer loops and add FAQ by @kumaakh in #133
- feat: first-run onboarding experience and user engagement nudges by @mraduldubey in #101
- feat: Install UX, bug fixes, docs & doc consolidation by @kumaakh in #143
Full Changelog: v0.1.5...v0.1.6
v0.1.5
v0.1.4
What's changed
send_files: renameddestination_path→dest_subdir— unambiguously describes subdirectory scope; paths outsidework_folderare rejectedreceive_files: renamedlocal_destination→local_dest_dir— clearly identifies a local directory, not a filename- Schema descriptions updated to clarify defaults, boundary enforcement, and required/optional status
- Skill doc fixes: onboarding step count (7→8), skill-matrix step reference (7→6), AzDevOps token URL,
installAgent→update_llm_cli - PM skill: fleet call sequencing rule clarified (sequence → single background Agent), reviewer model tier wording updated
- Test:
receive-files.test.tsupdated to match renamed parameters
What's Changed
- fix: use single .fleet-task.md filename + cleanup wildcard removal (closes #67) by @kumaakh in #94
- fix: rename send_files/receive_files params and fix skill doc inconsistencies by @kumaakh in #97
Full Changelog: v0.1.3...v0.1.4