Skip to content

Drive it without an agent ​

bacio is built so an AI agent can drive it reliably. But you don't have to use one. The CLI and TUI are first-class for humans, and every workflow below works without ever opening Claude Code.

Filing an issue ​

bash
bacio issue add "Login 500s on Safari with '&' in password"

For longer descriptions, pass --description-file path.md or --description - (stdin). Multi-line descriptions can't be typed inline — bacio is explicit about that to keep the contract clean.

bash
bacio issue add "Auth rewrite design" \
  --description-file /tmp/auth-design.md \
  --feature auth-rewrite \
  --tag P1 --tag design

Reading the board ​

bash
bacio status                              # repo + counts by state
bacio issue list                          # all issues
bacio issue list --state in_progress
bacio issue list --tag bug --state todo
bacio issue show MYPR-3                   # detail for one

For a richer single-issue view (comments + relations + PRs + linked doc bodies):

bash
bacio issue brief MYPR-3

For the kanban view, open the TUI:

bash
bacio tui

Moving state ​

bash
bacio issue state MYPR-3 in_progress
bacio issue state MYPR-3 in_review
bacio issue state MYPR-3 done

State parser accepts in-progress, in progress, or in_progress — all equivalent.

Features ​

bash
bacio feature add "Auth rewrite"             # creates slug auth-rewrite
bacio feature add "Auth rewrite" --slug auth # override the slug

bacio feature list
bacio feature show auth-rewrite

bacio feature edit auth-rewrite --description-file /tmp/rewrite.md

To attach an existing issue to a feature, edit it:

bash
bacio issue edit MYPR-3 --feature auth-rewrite

Relations between issues ​

bash
bacio link MYPR-7 blocks MYPR-5
bacio link MYPR-7 relates-to MYPR-12       # 'relates_to' is also accepted on input
bacio unlink MYPR-7 MYPR-5

There's no blocked-by type to create — relations are one-directional. To say "MYPR-5 is blocked by MYPR-7", create bacio link MYPR-7 blocks MYPR-5; the reverse view shows up automatically wherever bacio renders relations.

Relations show up in bacio issue brief, in the TUI card overlay, and in JSON output of bacio issue show -o json.

Comments ​

bash
bacio comment add MYPR-3 --as Geoff \
  --body "Tried clearing the cookie, didn't help."
bacio comment list MYPR-3

--as <name> is required — bacio has no auth, so you name yourself.

PRs and tags ​

bash
bacio pr attach MYPR-3 https://github.com/you/repo/pull/42
bacio pr list MYPR-3
bacio pr detach MYPR-3 https://github.com/you/repo/pull/42

bacio tag add MYPR-3 P1 backend
bacio tag rm MYPR-3 backend

Documents ​

Markdown notes that live in the DB alongside your issues, linkable to one or many issues and features.

bash
bacio doc add design.md --type architecture --from-path /tmp/design.md
bacio doc list
bacio doc show design.md
bacio doc link design.md auth-rewrite                # link to a feature
bacio doc link design.md MYPR-3                      # link to an issue
bacio doc upsert design.md --from-path /tmp/design.md  # idempotent re-import from disk
bacio doc edit design.md --content-file /tmp/design.md # or update body only on an existing doc

--from-path (on doc add / doc upsert) reads the body, derives the filename, and infers the type from the path. doc edit doesn't accept --from-path — use --content-file for the body or doc upsert for the full idempotent re-import. bacio doc export design.md materialises a doc back to disk.

History ​

bash
bacio history                              # most recent
bacio history --since 1d
bacio history --user-filter Geoff          # filter by actor
bacio history --op issue.create
bacio history --kind issue --since 1w      # filter by entity kind

bacio history has no --target filter — narrow by kind, op, actor, or time range, or pipe -o json through jq to filter on target_label. Note that the actor-filter flag is --user-filter; the persistent --user records who's running the call but doesn't filter the output.

Or open the TUI and switch to tab 4 History.

Across all your repos ​

Two commands accept --all-repos:

bash
bacio issue list --all-repos --state in_progress
bacio history --all-repos --since 1d

Useful when you've got multiple projects bound in the same global DB.

Why use the agent then? ​

You don't have to. But the agent's value is:

  • It composes JSON payloads so you don't think about flag combinations.
  • It uses bacio issue brief for context instead of N separate reads.
  • It catches typos through the strict JSON decode and --dry-run before they're committed.
  • You can ask in English instead of remembering verbs.

The CLI is here when you want it; the agent is here when you want that. See Work with Claude Code for the agent-driven flow.

See also ​

bacio · v0.1 · MIT