visvoai-cli
A terminal coding agent that takes permissions seriously. (VisvoAI™)
Most coding agents hold real power over your machine, gated by nothing stronger than a system prompt. This one is different: a full-screen TUI agent (built on Textual) that reads, edits, and runs code in your repo — with a permission model enforced by the OS, not by politeness; delegatable subagents with live logs; teachable skills; MCP tool servers (Model Context Protocol); and per-turn time-travel across both your files and the conversation.
It runs on the published visvoai-core
loop and visvoai-ai model layer,
unmodified — building your own agent product? This is the reference for how
far those two go.
pip install visvoai-cli
export GEMINI_API_KEY=... # or ANTHROPIC_API_KEY / OPENAI_API_KEY / any compatible
visvoai
All provider integrations ship in the box — the model picker exposes a live
catalog (Gemini, Claude, GPT, Together, Groq, OpenRouter, …); you only supply
a key for the provider you use. visvoai "fix the failing test" runs a
single-shot turn without the TUI.
Why this one
The operating system enforces the rules, not the prompt. Every shell
command is sorted into read or write. Reads (ls, rg, git log, …)
run instantly — inside an OS sandbox that cannot write to your disk (macOS
sandbox-exec, Linux bwrap). So a write pretending to be a read simply
fails; it cannot touch your files. Writes always ask you first. And if the
sorting is ever wrong, the sandbox still holds — a mistake costs a prompt,
never your data.
Nothing from a downloaded repo turns itself on. A repo can define agents, skills, and MCP servers — but each one stays off until you approve it once. If the file changes later, you are asked again (each file is fingerprinted). What you define in your home directory is trusted as yours. Cloning a repo can never silently give it power.
Undo that includes your files. Every turn saves a snapshot of your
working files. /rewind takes both the files and the conversation back to
any earlier point; /fork opens a past snapshot in a fresh directory so you
can try two ideas side by side.
Agents & subagents
Delegate self-contained work; run dispatches in parallel; watch them live.
<!-- .visvoai/agents/reviewer.md -->
---
description: Reviews a diff for bugs and risky changes
tools: read-only
---
You are a meticulous code reviewer. Examine the diff, read surrounding
context, and report concrete findings with file:line references.
- Built-ins ship ready:
explore(read-only, parallel-friendly recon) andgeneral(full toolset — its mutations still ask you). - Each dispatch is an isolated conversation: own prompt, own tools, fresh history; only its final answer returns to the caller.
- Live everywhere: a side panel shows running agents' tool steps as they
execute;
/runsgives full logs with per-run stop; every dispatch persists a JSONL trace with tokens · cost · duration. - Tool tiers are fixed at build time — an agent can't talk itself into more capability, and a read-only agent needs zero approval prompts to work.
Skills
Teach a workflow once; the agent loads it when a request matches — index first, full instructions on demand, referenced files only when the steps call for them (progressive disclosure).
<!-- ~/.visvoai/skills/release-notes/SKILL.md -->
---
description: Draft release notes from the git log
args:
version: The version being released
---
1. Run `git log $version..HEAD --oneline`.
2. Group changes by type; see checklist.md for the house format.
Already have skill libraries? Point at them:
# ~/.visvoai/config.toml
[skills]
extra_dirs = ["~/.claude/skills", "~/dotfiles/skills"]
A skill grants knowledge, never capability — the agent follows the steps with its own gated tools.
MCP
visvoai mcp add chrome -- npx -y chrome-devtools-mcp@latest
visvoai mcp add linear --url https://mcp.linear.app/mcp \
--header 'Authorization=Bearer ${LINEAR_API_KEY}'
Sessions are persistent, so stateful servers (a browser, a DB connection)
keep their state across calls. Secrets stay ${VAR} references — never in
config files.
Plugin tools
# ~/.visvoai/tools/mytools.py
from visvoai.cli.toolkit import make_cli_tool
def jira_search(query: str, limit: int = 10) -> str:
"""Search our Jira and return matching issue keys."""
...
TOOLS = [make_cli_tool(jira_search, gate="approve")]
Schema from your type hints, description from the docstring, output capped, exceptions returned as data, approval-gated by declaration. Global-only by design — a repo can never inject Python into your session.
API keys
Any of these, per provider — highest wins, nothing is ever committed:
- Environment —
export GEMINI_API_KEY=…(orANTHROPIC_API_KEY,OPENAI_API_KEY,GROQ_API_KEY, … — the{PROVIDER}_API_KEYconvention, including anything a local.envprovides). - Per-project —
/loginin the TUI, or edit<project>/.visvoai/secrets.toml([api_keys]); written0600and auto-added to the project's.gitignore. - Global default —
~/.visvoai/config.toml([api_keys]), used everywhere unless a project overrides it.
You need exactly one key to start; add more providers any time and the
/model picker lights them up. One exception: web search and web fetch are
Gemini-grounded, so those two tools need a GEMINI_API_KEY even when you
chat through another provider.
Living in it
/model |
live model catalog — pricing, thinking levels, per-conversation |
/agents /skills /mcp |
rosters + one-time trust approval |
/runs |
live subagent logs; stop one without killing the turn |
/rewind /branch /fork |
time-travel: files + conversation together |
/ps |
background processes the agent started (and the kill switch) |
/compact |
summarize older turns to reclaim context |
Shift+Tab |
approval mode: normal · auto-edit · accept-all |
@file |
attach a file; Esc stops the turn; full mouse support |
Costs and context are always visible: per-turn tokens/cost in the footer, a context gauge that warns before you hit the wall.
Gallery
Stills are generated, not staged by hand — docs/make_stills.py renders real
widgets and converts to PNG in one command, so they can't drift from the UI.
From source
uv tool install --editable path/to/visvoai-cli
Examples
Copy-paste configuration in examples/ — a reviewer agent, a
simple and a complex skill, plugin tools in all three shapes, and a
config.toml with MCP + external skill libraries.
License
MIT
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file visvoai_cli-0.15.0.tar.gz.
File metadata
- Download URL: visvoai_cli-0.15.0.tar.gz
- Upload date:
- Size: 353.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
77629c6975bd081e05485b861cfb729ba49fb80bccf112f4dbee20fcf47ec177
|
|
| MD5 |
36dbc3e29e916f4df22f10af79780518
|
|
| BLAKE2b-256 |
f1ef6f44e624b34adb4f8fe0d2943e42b591c12930058bc20be9480519d419b6
|
Provenance
The following attestation bundles were made for visvoai_cli-0.15.0.tar.gz:
Publisher:
publish.yml on VisvoAI/visvoai
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
visvoai_cli-0.15.0.tar.gz -
Subject digest:
77629c6975bd081e05485b861cfb729ba49fb80bccf112f4dbee20fcf47ec177 - Sigstore transparency entry: 2490116836
- Sigstore integration time:
-
Permalink:
VisvoAI/visvoai@be12ab42d66c4406a64e7f1060a2a6afdeabd642 -
Branch / Tag:
refs/tags/visvoai-cli-v0.15.0 - Owner: https://github.com/VisvoAI
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@be12ab42d66c4406a64e7f1060a2a6afdeabd642 -
Trigger Event:
release
-
Statement type:
File details
Details for the file visvoai_cli-0.15.0-py3-none-any.whl.
File metadata
- Download URL: visvoai_cli-0.15.0-py3-none-any.whl
- Upload date:
- Size: 310.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c2f60eb9fa4915d2ae54468ca74f41613beeca015155f59889b0380fe2422ec1
|
|
| MD5 |
cb30ae91cf32e56e2a1c6b1882e95a47
|
|
| BLAKE2b-256 |
314c3e34de4149c0154b4587c254c529c397696218ed5a74546c1a90db0e5084
|
Provenance
The following attestation bundles were made for visvoai_cli-0.15.0-py3-none-any.whl:
Publisher:
publish.yml on VisvoAI/visvoai
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
visvoai_cli-0.15.0-py3-none-any.whl -
Subject digest:
c2f60eb9fa4915d2ae54468ca74f41613beeca015155f59889b0380fe2422ec1 - Sigstore transparency entry: 2490116851
- Sigstore integration time:
-
Permalink:
VisvoAI/visvoai@be12ab42d66c4406a64e7f1060a2a6afdeabd642 -
Branch / Tag:
refs/tags/visvoai-cli-v0.15.0 - Owner: https://github.com/VisvoAI
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@be12ab42d66c4406a64e7f1060a2a6afdeabd642 -
Trigger Event:
release
-
Statement type: