OTerminus is a local, safety-first terminal assistant. It turns natural-language requests into a single proposed shell action, shows a preview, and executes only after explicit confirmation.
Terminal copilots are useful, but unrestricted shell generation is risky. OTerminus exists to provide a practical middle ground:
- capability-first command support (curated workflows, not full shell emulation)
- deterministic rendering for structured command families
- explicit policy + validation gates before execution
- confirmation before every execution path
- local-first observability through JSONL audit logs
OTerminus is designed around an inspect-and-confirm execution contract:
- detect direct commands first
- intercept vague natural-language requests as ambiguous when needed
- route specific natural-language requests by capability
- plan proposals in a structured-first format
- validate and policy-check the command
- show a deterministic preview
- require explicit user confirmation before execution
Direct shell commands are not blocked by natural-language ambiguity heuristics; they still go through validation and policy checks. Ambiguous natural-language requests stop before planning and execution and suggest safer read-only inspections. See the user guide and request lifecycle for details.
If ambiguity handling, validation, or policy checks block a request, OTerminus does not execute.
poetry install
poetry run oterminusOn first run, OTerminus checks Ollama readiness (ollama on PATH, running service, local models),
then prompts you to select a model if one is not already configured.
poetry run oterminus
poetry run oterminus "show disk usage for this folder"
poetry run oterminus --dry-run "copy notes.txt to backup/notes.txt"
poetry run oterminus --explain "find processes matching python"
poetry run oterminus doctorpoetry run oterminus starts the interactive REPL after startup readiness checks.
Examples inside REPL:
find all .py filescapabilities/commands/exampleshelp capabilities/help filesystem_inspection/help lsshow running processesping example.com 4 timesshow HTTP headers for https://example.comlook up DNS for example.comtar -tf archive.tar/unzip -l archive.ziptar -xf archive.tar -C restored/unzip archive.zip -d restoredtar -czf backup.tar.gz src/zip -r docs.zip docsls -lahdry-run search TODO in srcexplain show disk spaceaudit status/audit tail/audit clear
- One-shot requests such as
poetry run oterminus "show disk usage for this folder"plan, validate, preview, and then require confirmation before execution. --dry-runand--explainare mutually exclusive one-shot inspection flags for requests. Both validate and preview without confirmation or execution; explain mode also describes command choice, relevant flags/arguments, risk, and policy interpretation.doctoris diagnostics-only: it prints readiness checks and exits without starting the REPL, executing a request, or invoking the Ollama planner. It cannot be combined with--dry-runor--explain.
OTerminus supports two first-class proposal modes:
- Structured: the preferred normal path for supported capabilities. Proposals use
command_family+ typedarguments, and Python renders the final command/argv deterministically. - Experimental: a constrained fallback for single-command text that cannot yet be represented safely as structured arguments. It is still strictly validated, previewed, and confirmed before execution.
See structured rendering, routing and planning, and the request lifecycle for details.
The network_diagnostics capability supports only fixed-count ping, HTTP HEAD (curl -I), dig,
and nslookup. These commands contact external hosts, show a network metadata warning in preview,
and still require confirmation. OTerminus does not support POST/PUT/DELETE requests, secret headers,
downloads, scanning, SSH, or arbitrary network automation.
The README is the landing page. Full documentation is generated from docs/ and
published to GitHub Pages after merges to main (once Pages is enabled in repository settings).
- Hosted docs (after enablement):
https://pooriat.github.io/oterminus/ - Docs source of truth:
docs/ - Architecture overview:
docs/architecture/overview.md - Request lifecycle (central flow):
docs/architecture/request-lifecycle.md - User guide:
docs/product/user-guide.md - Configuration reference:
docs/reference/config.md - Contributor workflow:
docs/contributing.md - Contributor command-family guide:
docs/adding-command-families.md - Evals docs:
docs/architecture/evals.md
poetry install --with dev,docs
poetry run mkdocs serve
poetry run mkdocs build --strictFor the full local quality checklist, including Ruff format/lint and pytest commands, see the contributor workflow. When behavior changes, update docs in the same pull request.
- Optional local persistent REPL history is available via
OTERMINUS_HISTORY_ENABLED=true; reruns still go through normal validation + confirmation.