A plugin-based coding agent with durable sessions and eleven built-in model providers. No account, no sign-in. Bring one API key from a provider you already pay for.
Installs the tvashta command. Needs Node.js 22.19 or newer. Windows, macOS, and Linux.
$ tvashta connect openai Connected openai. Key stored in ~/.tvashta/settings.yaml (0600). $ tvashta tvashta interactive session. Type a message, /exit to quit. > why is the login test failing? auth.spec.ts:42 mocks a 60 minute TTL, but the clock advances 61 minutes before the assertion. I can patch the fixture or freeze the clock. Which do you want? > freeze the clock and fix it Wrapped the TTL assertion in a fixed Date.now(). 3 tests, 3 passing.
Every capability is a plugin composed onto a small core. The CLI boots ordered patch layers, runs entirely on your machine, and never asks you to create an account.
Run tvashta connect openai, pick from the catalog, paste a key. It is written to your settings file with 0600 permissions and used on the next request.
Every turn persists to a session log. A failed request keeps the session open, so you can retry, rephrase, or step away and resume without losing context.
Shell stacks, filesystem tools, subagents, hooks, MCP clients, and workflows are composed by profile patches, and extended without forking the harness.
Keys live in your home settings file and travel only to the provider you chose. Project .env files layer beneath it, and settings win over environment.
The same tvashta command on Windows, macOS, and Linux. The package bundles its whole dependency closure, so installing fetches nothing else.
An unknown provider, a missing key, or a bad profile errors at the earliest point it can be detected, and prints the valid options instead of failing later.
Base URLs and default models ship built in. An unknown id fails immediately with the valid list.
| Command | What it does |
|---|---|
| tvashta | Open an interactive session in the default profile. Type a message, read the answer, repeat. /exit quits. |
| tvashta "<task>" | Answer one task in a fresh durable session, print the result, then exit. |
| tvashta providers | List the providers and whether each one is connected. |
| tvashta connect <provider> | Store a provider API key. Add --key to pass it inline, --model to choose the model. |
| tvashta models [provider] | List the models a provider serves, marking the one answering now. |
| tvashta --profile <name> | Boot a named profile. Everything after your flags belongs to the booted app. |
| tvashta --dump-config | Print the composed profile tree and exit without booting. |
| tvashta plugin add <pkg> | Install a plugin into the current profile. |
| tvashta --version | Print the installed version. |
On a terminal the session runs as a full-screen surface: assistant text streams as it arrives, and every tool call is named as it starts and marked when it finishes. A line starting with / is handled by the session itself and never becomes a model request, so a typo costs nothing.
| Command | What it does |
|---|---|
| /help | List the session commands. |
| /model | Show the provider and model answering this session. |
| /session | Show the session id and how many turns it holds. |
| /providers | How to list and connect providers. |
| /clear | Clear the screen, keeping the session and its history. |
| /exit | End the session. /quit and /q also work. |
| Esc | Stop the running turn. The session stays open. |
| PgUp / PgDn | Scroll the transcript. Ctrl+L jumps back to the newest output. |
| Up / Down | Recall previous messages. |
Ordered stacks of plugin-bundle patch layers under $TVASHTA_HOME/profiles/<name>, plus your own cordis.patch.yml. The default headless profile initializes itself on first use. Inspect any composition with tvashta --dump-config.
Runs persist a session log per home directory, not per terminal. Interactive sessions keep history across turns. One-shot runs exit nonzero unless the turn completed.
$TVASHTA_HOME/settings.yaml holds provider keys, written by connect with 0600 permissions. $TVASHTA_HOME/.env and a project .env layer environment variables beneath it. $TVASHTA_HOME defaults to ~/.tvashta.
Bundles mount capabilities: bash and pwsh stacks, filesystem tools, code runtime, subagents, LSP, and MCP. Install one into a profile with tvashta plugin add, then compose it in your patch layer.
Free to use. Runs locally. Your keys go only to the provider you chose.