Repository navigation
Releases: tchivs/agentsw
Release list
v0.11.0
Added
-
use --small-model <id>fills the slot agents reach for cheap background work — Claude Code's
ANTHROPIC_DEFAULT_HAIKU_MODELandANTHROPIC_SMALL_FAST_MODEL— and--no-small-modelclears
it again. Leaving it unset means "same as the default model", so an expensive default quietly
became the background model too, and the only way to set the slot wasadd, which demands the
endpoint and credential again. The id is validated against the provider's model list and a dry
run previews it without saving, exactly as-mdoes. -
Picking providers works the same way everywhere.
--alland a comma-separated--provider a,b
now mean the same thing onsync,discoverandrefresh;discoveradditionally takes its
ids positionally (discover alpha beta) and falls back to the active provider when given none,
where it used to require exactly one. Every id is resolved before the first request, so a typo
fails before half a run is on disk, and each command keeps its own default for an omitted
selection: the active provider forsyncanddiscover, every provider forrefresh.discoverrefreshes several providers with the same isolationsynchas — an unreachable
endpoint is reported and skipped, the rest still refresh, and the run exits non-zero — and
discover --syncthen writes only the providers that actually refreshed, never a stale list. -
sync --allsyncs every configured provider, and--providernow takes a comma-separated list
(sync -p alpha,beta), so refreshing a machine's providers is one command instead of one per
provider. The menu's Sync providers action is a multi-select with an "all" row; selecting
nothing returns to the menu.Each provider is refreshed and written in turn, with the active provider last, so whatever
"current" pointer an app keeps ends up where the store says it should. An app that names a single
provider rather than a map — Claude Code's env block — is written once rather than once per
provider: it receives the active provider when it supports that protocol, otherwise the single
provider in the run that it does support, so an anthropic-only app is not starved by an openai
active provider. When several candidates compete and the active provider is not among them the
app keeps pointing where it already does, because syncing is not switching. A provider whose
endpoint cannot be reached is reported and skipped; the rest still
sync and the run exits non-zero.--jsonreports aprovidersarray plus the deduplicated union
of the files touched; a single-provider sync keeps the payload it had.
Changed
syncrefreshes the provider's model list (and re-enriches saved metadata) before writing the
agent configs, so one command keeps both sides in step;sync --no-refreshwrites the saved
list without fetching. The menu's separate model-list action and its "also sync?" toggle are
gone — the single Sync a provider action runs the same refresh-then-write path as the CLI.
Fixed
-
A default or small model the endpoint has stopped listing is now named out loud. A refresh keeps
such an id on purpose — one flaky listing must not delete the model a person chose — but keeping
it also kept it out ofremoved, so the only trace was a dim yellow line between the refresh
header and a model table that can run to dozens of rows, and--jsoncarried no trace at all
whilesyncwent on writing that id into every agent config. This is exactly what an endpoint
renaming a model looks like from the client side. It is still written, and now it is reported:
awarning:naming the models and theagentsw use <id> -m <model>that replaces them, printed
afterdiscover's table and aftersync's per-app results, plusrefreshed.missingin the
--jsonpayload. The small model counts too, which it did not before. -
sync --dry-runno longer saves the refreshed model list. The refresh above ran before the
dry-run scope opened, so previewing a sync wrote the freshly fetched list straight into the
provider store — the one thing--dry-runpromises not to do. The fetch still happens, so the
preview matches what a real sync would write, but the list now stays in memory and--json
reports it asrefreshed.saved: false.
Full Changelog: v0.10.2...v0.11.0
v0.10.2
Fixed
use,syncandpruneno longer print a bareok <app>line for an app that was already
in sync. An empty change list was rendered as nothing at all, leaving a row of trailing
whitespace that read as a truncated or failed result; it now saysunchanged, which is what
a repeatedsyncactually did.- Codex states the Responses requirement only when the endpoint has not declared itself
Responses-compatible. The caveat was printed unconditionally, so a provider the user had
already markedresponses— where there is nothing to warn about — warned anyway, and a
fully successful sync looked like it had a problem. - Syncing to a machine whose agent configs do not exist yet no longer prints a
backup: …line
when nothing was backed up. A transaction directory was created for every commit even when
every planned file was new, so on a first run the output announced eight backups that held
nothing but a manifest.
Full Changelog: v0.10.1...v0.10.2
v0.10.1
Fixed
- A models.dev row that omits
canonical_model_idno longer counts as a second creator identity.
models.dev leaves the field unset on the creator's own rows and on some reseller rows too, so a
single silent row made an id every other row agreed on report as ambiguous and kept it — and
every model sharing its basename — without metadata. Those rows now make no claim; a group where
nothing declares an identity is still held to its listing ids, and ids listed under genuinely
different declared identities still stay unresolved. - A sync no longer deletes the limits an agent config already has for a model the store knows
nothing about. Clearing an owned key the entry omits is only meaningful when the entry carries
metadata at all — an id no catalog row matched arrives as a bare{ id }, so the absence said
nothing and the deletion threw away what an earlier lookup filled in (or a person typed) on
every miss. - A failed AI Gateway request is retried once before falling back to the cache. The endpoint is
reached over whatever route the machine has, where a cold handshake measures an order of
magnitude slower than a warm one, so a stall or a reset is far likelier than a bad answer — and
a single stall used to leave the run on stale metadata until the next successful fetch. Only
the request is retried: a status, an oversize body or an unparseable catalog is the endpoint's
answer, and a second request would only repeat it.AGENTSW_DEBUG=1reports why an attempt
failed (the user-facing warning stays generic), andAGENTSW_GATEWAY_TIMEOUT_MSoverrides the
15-second whole-request budget.
Full Changelog: v0.10.0...v0.10.1
v0.10.0
Added
- Global
--jsonprints exactly one credential-free document per run
({"ok":true,"command":…,"version":…,"data":…}, or{"ok":false,…,"error":{"message":…}}with
exit code 1) and disables prompts and progress, so scripted runs never block on input.
--json --dry-runlists the file paths a run would touch without ever emitting the staged
configuration. Without--json,models --provider <id> --metadatakeeps its bare object. - Global
--quietsuppresses progress, hints and warnings while keeping results and errors, and
--no-colordisables color (so doesNO_COLOR;--no-coloroverridesFORCE_COLOR). - Slow operations report progress on a TTY: protocol probing, model-list pagination (page and
running model count), catalog and metadata lookups, Gateway loading, and per-app version
checks. The line animates only when nothing else is borrowing it and disappears before
results print; pipes and CI keep the previous single static line, andAGENTSW_NO_PROGRESS=1
turns it off. discover/add/quick/importretry a failed discovery when interactive instead of losing
the whole run, and a failing menu action reports the error and returns to the menu.- Menu provider pickers and the removal scope select gained a "back to main menu" entry, and
Ctrl-C inside a menu prompt abandons that action instead of quitting the application.
Changed
- Tables size themselves to the terminal: long BASE URL, CONFIG and NAME cells are truncated
with…while IDs and status columns stay intact, and numeric columns are right-aligned.
Piped output is unchanged. - Interactive cancellation is consistent: standalone prompts print
cancelledand exit130;
inside the menu they return to the menu. Errors are red and warnings yellow everywhere, and
the remaining hardcoded English strings follow the interface language. appsandupgradeoutput, install hints and model-discovery messages are localized; every
user-visible "next step" hint now goes to stderr so--quietcan drop it.
Fixed
- A corrupt or unreadable models.dev cache no longer aborts
models,add,discoveror
refresh: it is ignored and refetched, and a 200 response that is not catalog-shaped is
rejected instead of being cached and failing every later run. models --limitvalues that are not positive integers (--limit abc,--limit 0, ...)
fail with a clear error instead of dumping the whole catalog or one row.discoverno longer reports a pinned default or small model that the provider stopped
listing under "removed upstream" while keeping it anyway.- Switching providers no longer inherits the previous provider's
model_reasoning_effortin
Codex, and opencode clears a provider's own small model once that provider stops defining one. - The dsh adapter reads a wire declared on every model, as omp and pi already did, so such
providers import instead of being skipped and keep their Responses wire on sync. - Claude Code and Codex now honor
CLAUDE_CONFIG_DIRandCODEX_HOME; previously they always
wrote~/.claudeand~/.codex, so a relocated install was configured in the wrong place
andstatus/remove/renamedisagreed withuse. - The opencode adapter edits the file that actually exists, chooses between
opencode.json,
opencode.jsoncandconfig.jsonthe way opencode does, and preserves comments —rename
previously migratedconfig.jsononly in the default directory. - A base URL whose path already ends in
/modelsno longer becomes/models/v1/models, and
model-list pagination stops after 100 pages instead of looping forever on an endpoint that
keeps returning fresh cursors. - A provider store containing a wrong-typed provider or model is now rejected at load with the
file and provider id, instead of crashing later with an opaqueTypeError.
Changed
- All config paths come from one resolver (
src/app-paths.ts) and are recomputed per command,
so every adapter,renameandremoveagree on the same files;dshalso honors
%LOCALAPPDATA%on Windows.
Full Changelog: v0.9.2...v0.10.0
v0.9.2
Fixed
-
Reseller model listings no longer lose their metadata. models.dev lists one model under many
providers (29 rows forglm-5.2), each with its own provider-prefixed id, so a bare id taken from
a reseller's/v1/modelslooked like dozens of conflicting models and was refused
entirely — leaving pi/prime-agent configs withoutreasoningorthinkingLevelMap, i.e. no
thinking level to adjust. Matching now groups rows by models.dev'scanonical_model_idand
takes the creator's own row, so context, output limits, reasoning and effort levels resolve;
rows under genuinely different creator identities stay ambiguous, and Gateway agreement is
compared in creator identity too. -
Adding the same endpoint and API key under a different
--idor display name no longer creates a
second provider. Account identity (normalized endpoint + protocol + credential) now outranks an
explicit id inaddandquick-add, matching whatimportalready did; the existing provider is
updated and the run says so. Protocol suffixes still apply to genuinely new accounts. -
Only the creator's own models.dev row supplies limits, prices and reasoning levels for a model that
resellers also list. Gateways key their rows by the canonical model id and were being read as
authoritative, so e.g.deepseek-v4.1-flashpicked up a gateway's price. -
Model tables,
refreshand provider output are localized, and models left without metadata are
split into ids an explicit--gateway-modelsmapping can fix, ids whose creator has no models.dev
row (AI Gateway fills those), and ids no creator lists at all — instead of one flat count.
Full Changelog: v0.9.1...v0.9.2
v0.9.1
Changed
- Example provider names, hosts and test fixtures no longer reference a real account.
Git history, tags and the npm tarball were rewritten so the previous name appears nowhere
in the repository or the published README.
Full Changelog: v0.9.0...v0.9.1
v0.9.0
Added
- Interactive menu app picker for
use,syncanddiscover --sync: multi-select the agents
to write, with an "all detected apps" row, detected agents listed first and undetected ones
marked. The last selection is remembered insyncTargets, so the menu stops rewriting agents
you left out; CLI--appssemantics are unchanged.
Changed
- Report why a config file was rejected instead of hiding it: JSON/YAML/TOML parse failures now
carry the file plus a position (YAML error code and line, JSON error offset, TOML line/column),
and dry-run shows that detail rather than "configuration could not be previewed safely".
Unclassified errors stay redacted wholesale.
Fixed
- Never echo config source in parse errors. JSON, YAML and TOML parser messages quote the
offending line, which can contain a credential; all three are now converted to
content-freeSafeConfigErrormessages.
Full Changelog: v0.8.0...v0.9.0
v0.8.0
Added
- Automatic AI Gateway model metadata supplementation with a separate 24-hour cache,
exact model mappings, field-level provenance/conflicts and reference-only pricing. - Per-provider
--metadata-mode <auto|on|off>settings in add/quick/discover/import/refresh,
a three-way menu selection, andmodels --provider <id> --metadatafor credential-free
audit JSON including the effective mode. Legacy enable/disable flags remain supported.
Changed
- Default to automatic, models.dev-first enrichment without extra onboarding prompts.
Query Gateway only for missing core parameters, refreshing existing supplemental fields,
or verifying tracked identity conflicts; preserve explicit off and all omitted saved settings. - Resolve unique, exact bare-name model IDs conservatively without changing wire IDs;
ambiguous/custom names still require explicit aliases. Sync remains catalog-free. - Preserve manual/legacy model values and extension fields during enrichment;
refresh tracked automatic metadata without overwriting subsequent manual edits. - Preserve selected default/small-model metadata when discovery omits those IDs.
Full Changelog: v0.7.2...v0.8.0
v0.7.2
Fixed
- Stage every adapter's multi-file changes before committing, preserve permissions,
create private unique backups, and reject stale provider-store saves under a
shared short-lived write lock. Dry-run output is redacted and never writes. - Isolate generated credential references for distinct provider IDs; preserve
shared/custom references, YAML aliases and complete multiline dotenv values. - Disambiguate WorkBuddy account removal, allow credentialless local entries,
verify active Codex credentials before global deletion, and apply target-specific
literal/reference semantics during rename and import. - Preserve existing options on repeated automatic onboarding, retain Responses
routing and custom Codex fields, reject mixed effective model protocols, and
maintain WorkBuddy endpoint paths and owned model lists across synchronization. - Fetch complete model-list pagination before updating the store, preserve query
parameters when constructing requests, distinguish non-v1 API identities, and
prefer complete model-ID metadata matches over basename fallbacks. - Keep help/version and agent-local management independent of malformed central
configuration; validate selected targets before changing active-provider state. - Correct SemVer precedence, probe Windows batch shims correctly, propagate failed
installer pipelines, and report unknown/failed version checks rather than success.
Changed
- Minimum Node.js is now 22.13.0, where built-in SQLite no longer needs an
experimental flag. CI includes the exact minimum and installed-package CLI
smoke tests on Linux, macOS and Windows. - Expanded command, account-isolation, transaction, discovery, platform and metadata
regressions; clarified backup scope, non-interactive import and adapter integration docs.
Full Changelog: v0.7.1...v0.7.2
v0.7.1
Changed
- Interactive menu labels describe concrete actions, with contextual help for
each choice in English and Simplified Chinese. Automatic provider setup is
listed first; saved providers, agent configuration, syncing, and model-list
updates are clearly distinguished. - Removal choices and confirmations explain what is deleted and what stays,
including the effect of later syncing after agent-only removal. Rename is
labeled as changing the provider ID, not a custom display name. - Rename and removal confirmations use explicit action labels and default to
cancellation. Added bilingual menu and scope-confirmation regression tests.
Full Changelog: v0.7.0...v0.7.1