Tvashta

The agent harness for your terminal

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.

Install GitHub
$curl -fsSL https://tvashta.amvelt.com/install.sh | sh
>irm https://tvashta.amvelt.com/install.ps1 | iex
>curl -fsSL https://tvashta.amvelt.com/install.cmd -o install.cmd && install.cmd
$npm install -g @amvelt/tvashta-cli
$pnpm add -g @amvelt/tvashta-cli
$bun install -g @amvelt/tvashta-cli
$yarn global add @amvelt/tvashta-cli
$npm install -g ./amvelt-tvashta-cli-1.3.0.tgz

Installs the tvashta command. Needs Node.js 22.19 or newer. Windows, macOS, and Linux.

tvashta
$ 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.
Why Tvashta

Everything a terminal agent needs. Nothing it does not.

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.

11model providers
0accounts required
3platforms
1command to install

One key to connect

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.

Durable sessions

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.

Everything is a plugin

Shell stacks, filesystem tools, subagents, hooks, MCP clients, and workflows are composed by profile patches, and extended without forking the harness.

Local by default

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.

One command, three platforms

The same tvashta command on Windows, macOS, and Linux. The package bundles its whole dependency closure, so installing fetches nothing else.

Fails loud

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.

Providers

Eleven connectors. One API key each.

Base URLs and default models ship built in. An unknown id fails immediately with the valid list.

Anthropicanthropic
OpenAIopenai
Google Geminigoogle
Z.AIzai
NVIDIAnvidia
OpenRouteropenrouter
OpenCode Zenopencode
DeepSeekdeepseek
Groqgroq
Mistralmistral
xAIxai
Commands

One command does the work

CommandWhat it does
tvashtaOpen 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 providersList 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-configPrint the composed profile tree and exit without booting.
tvashta plugin add <pkg>Install a plugin into the current profile.
tvashta --versionPrint the installed version.

Inside a session

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.

CommandWhat it does
/helpList the session commands.
/modelShow the provider and model answering this session.
/sessionShow the session id and how many turns it holds.
/providersHow to list and connect providers.
/clearClear the screen, keeping the session and its history.
/exitEnd the session. /quit and /q also work.
EscStop the running turn. The session stays open.
PgUp / PgDnScroll the transcript. Ctrl+L jumps back to the newest output.
Up / DownRecall previous messages.
Guide

How it fits together

Profiles

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.

Sessions

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.

Keys and settings

$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.

Plugins

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.

Reference

Go deeper

Install guide

Every route, offline installs, and troubleshooting.

npm package

Versions and metadata for @amvelt/tvashta-cli.

CLI reference

Entry modes, argument grammar, and profiles.

Issues

Bug reports and feature requests.

Start in one command

$npm install -g @amvelt/tvashta-cli

Free to use. Runs locally. Your keys go only to the provider you chose.