Portable agents in a single yaml.
.vinos/routines.yaml in the repo root. vinos-routine load . installs the set under ~/.vinos/routines/<project>/. Scoped per repo.
vinos-routine load . · git-nativeDrop a .vinos/routines.yaml in any repo. Your team runs
the same PR reviewer, the same commit-message writer, the same
standup summarizer — locally, versioned in git, auditable in PR.
Portable, sandboxed, cost-capped. All three enforced by the runtime,
not by convention. Read them yourself in libexec/vinos-routine.
.vinos/routines.yaml in the repo root. vinos-routine load . installs the set under ~/.vinos/routines/<project>/. Scoped per repo.
vinos-routine load . · git-nativeroute = "auto": local Ollama first, escalate to Claude only when the task exceeds what a local can handle. Ledger logs every choice.
vinos-router explain <task> · SQLite ledgerEvery tool call goes through bwrap with an explicit filesystem + network allowlist declared in the routine. Nothing implicit.
tools.allow = [ ... ] · bwrap-enforcedThis is the file that lives at .vinos/routines.yaml in
your repo. Committed. Reviewed. Loaded on every engineer's machine
with one command.
apiVersion: vinos.computer/v1
kind: RoutineSet
metadata:
project: startup-inc
owner: engineering@startup.example
defaults:
agent:
route: auto # 80% local · 20% escalate
model: llama3.1:8b
escalate_to: claude-sonnet-4-6
memory: session
budget:
max_tokens_per_run: 8000
max_dollars_per_day: 0.50
on_exceed: skip
routines:
- name: pr-review
description: Triage new PRs across the org · flag what needs a human.
schedule:
oncalendar: "*-*-* 09,13,17:00:00"
timezone: America/New_York
jitter: 3m
agent:
tools:
- "shell:gh pr list --state=open --json number,title,repository"
- "read:{{git_root}}/CODEOWNERS"
- name: commit-message
description: Suggest a Conventional-Commits subject line from staged diff.
schedule: on_demand # `vinos-routine run commit-message`
agent:
route: ollama # local only · never leaves the box
tools:
- "shell:git diff --cached"Full spec: /spec/ · loader source: libexec/vinos-routine
vinos-routine export --systemd.
The whole distribution uninstalls with
pacman -Rns vinos-*. MIT-licensed. Your
.vinos/routines.yaml keeps working if you leave.shell:<command> or
read:<path>. Both go through
bwrap with a scoped filesystem view. Custom
long-running tools can be wrapped as
shell:vinos-tool my-tool — anything on PATH works..vinos/routines.yaml is scoped by its
directory — the loader keys routines by repo path, so you can
have per-service routine sets under
services/foo/.vinos/ that only apply when
{{git_root}} resolves inside that subtree.ghcr.io/vinpatel/vinos-cloud Docker image runs the
same routine set as a GitHub Action or GitLab CI job. Today you
can wire a routine to a webhook via
vinos-routine run <name> --json and pipe the
result into any CI's step outputs.Flash a USB. Boot. Drop .vinos/routines.yaml in your repo. Push.
pacman -Rns vinos-*. No lock-in. MIT-licensed.