| name | jb-beans |
| description | Use when the repo has .beans or the user mentions beans, beans-prime, flat-file issues, task tracking, or issue status changes. |
| metadata | {"clawdbot":{"emoji":"🫘","requires":{"bins":["beans"]},"install":[{"id":"brew","kind":"brew","package":"hmans/beans/beans","label":"Install beans (brew)"},{"id":"go","kind":"go","package":"github.com/hmans/beans@latest","bins":["beans"],"label":"Install beans (Go)","command":"go install github.com/hmans/beans@latest"}]}} |
beans - Flat-File Issue Tracker
Use beans to track work as markdown files alongside a project.
First step for agents
Before starting work in a beans-enabled project, run:
beans prime
Read and follow its output. It may define project-specific workflow rules, issue types, statuses, and expectations for how agents should create/update beans.
Why beans?
- Flat files — issues live as markdown in
.beans/
- Git-friendly — changes can be reviewed and committed like code
- Agent-friendly — supports
--json, structured relationships, and context priming
- Portable — no server or database required
Installation
brew install hmans/beans/beans
go install github.com/hmans/beans@latest
Do not install beans via bun i -g beans, bunx beans, or npx beans.
The npm package named beans is an unrelated legacy Node package and can fail
with errors like Cannot find module 'coffee-script'.
If beans fails unexpectedly, check whether a stale npm/Bun binary is shadowing
the real CLI:
which -a beans
beans version
Use an absolute path to a working Homebrew/Go binary when needed, for example
/opt/homebrew/bin/beans or ~/.homebrew/bin/beans, then fix PATH outside the
task if desired.
Setup
beans init
beans check
beans version
Global flags
All commands support these global flags:
--config <path>
--beans-path <path>
Many subcommands also support --json. For agent workflows, prefer --json whenever the specific command offers it.
Core workflow
beans prime
beans list --json --ready
beans list --json -S "login"
beans create --json "Add login screen" -t feature -s todo -d "Build the initial login UI"
beans update --json <id> -s in-progress
beans update --json <id> --body-append "## Notes\n\nStarted implementation"
beans update --json <id> -s completed --body-append "## Summary of Changes\n\nImplemented the feature and validated behavior."
Issue model
Types
Current CLI-supported types:
milestone
epic
bug
feature
task
Statuses
Current CLI-supported statuses:
in-progress
todo
draft
completed
scrapped
Priorities
Current CLI-supported priorities:
critical
high
normal
low
deferred
Core commands
Prime the agent context
beans prime
Outputs instructions for AI coding agents, often including:
- required workflow rules
- project-specific types/statuses
- command usage preferences
- when to create, complete, or archive beans
Always check this first in beans-enabled repos.
Create beans
beans create "Implement user login" -t feature
beans create --json "Fix auth race" -t bug -s in-progress -p high -d "Repro under parallel refresh"
beans create --json "Refactor API client" -t task --tag tech-debt --tag networking
beans create --json "Add billing UI" -t feature --parent <epic-id>
beans create --json "Ship migration" -t task --blocked-by <other-id>
beans create --json "Unblock deploy" -t task --blocking <other-id>
printf 'Implementation notes' | beans create "Document rollout" -t task -d -
beans create "Import fixtures" -t task --body-file notes.md
Useful flags:
-t, --type
-s, --status
-p, --priority
-d, --body
--body-file
--tag
--parent
--blocking
--blocked-by
--prefix
--json
List beans
beans list
beans list --json
beans list --json --ready
beans list --json -s todo -t bug
beans list --json --tag urgent
beans list --json -p high
beans list --json -S "login"
beans list --json -S 'title:login'
beans list --json -S 'body:authentication'
beans list --json -S '"user login"'
beans list --json -S 'login~'
beans list --json --parent <id>
beans list --json --has-parent
beans list --json --no-parent
beans list --json --has-blocking
beans list --json --no-blocking
beans list --json --is-blocked
beans list --json --full
beans list --quiet
beans list --sort updated
Notes:
--ready excludes blocked, in-progress, completed, scrapped, and draft beans.
--quiet outputs only IDs, one per line.
- Search uses Bleve query syntax.
Show bean details
beans show <id>
beans show <id> <id2>
beans show --json <id>
beans show --body-only <id>
beans show --raw <id>
beans show --etag-only <id>
Use --etag-only when doing optimistic locking with updates.
Update beans
beans update --json <id> -s in-progress
beans update --json <id> --title "New title"
beans update --json <id> -t feature -p high
beans update --json <id> --tag urgent --tag auth
beans update --json <id> --remove-tag urgent
beans update --json <id> --parent <epic-id>
beans update --json <id> --remove-parent
beans update --json <id> --blocked-by <other-id>
beans update --json <id> --remove-blocked-by <other-id>
beans update --json <id> --blocking <other-id>
beans update --json <id> --remove-blocking <other-id>
beans update --json <id> -d "Updated body"
beans update --json <id> --body-file notes.md
beans update --json <id> --body-append "## Notes\n\nExtra context"
printf '## Summary\n\nDone.' | beans update --json <id> --body-append -
beans update --json <id> \
--body-replace-old "- [ ] Add tests" \
--body-replace-new "- [x] Add tests"
beans update --json <id> \
-s completed \
--body-append "## Summary of Changes\n\nImplemented and verified."
Concurrency-safe updates
ETAG=$(beans show <id> --etag-only)
beans update --json <id> --if-match "$ETAG" -s in-progress
Use --if-match to avoid overwriting concurrent edits.
Delete beans
beans delete <id>
beans delete <id> <id2>
beans delete --json <id>
beans delete -f <id>
If other beans reference the target, beans warns and removes those references after confirmation. -f skips prompts and warnings.
Archive completed work
beans archive
beans archive --json
Moves all completed and scrapped beans into .beans/archive/.
Archive only when appropriate for the project workflow or when the user asks. Archived beans are preserved for project memory and remain visible in queries.
Validate configuration and integrity
beans check
beans check --json
beans check --fix
Checks for:
- config errors
- broken links
- self-links
- circular dependencies
--fix can repair broken links and self-links automatically.
Generate roadmaps
beans roadmap
beans roadmap --json
beans roadmap --include-done
beans roadmap --status todo
beans roadmap --no-status completed
beans roadmap --link-prefix https://example.com/beans/
beans roadmap --no-links
Use this for milestone/epic rollups and markdown planning views.
Query with GraphQL
beans graphql '{ beans { id title status } }'
beans graphql --json '{ bean(id: "abc") { title body } }'
beans graphql -v '{"id":"abc"}' 'query GetBean($id: ID!) { bean(id: $id) { title } }'
beans graphql --schema
Examples:
beans graphql --json '{ beans(filter: { excludeStatus: ["completed", "scrapped"], isBlocked: false }) { id title status type } }'
beans graphql --json '{ beans(filter: { type: ["bug"], priority: ["critical", "high"] }) { id title } }'
beans graphql --json '{ bean(id: "abc") { title parent { title } children { id title status } blockedBy { id title } } }'
TUI
The current CLI does not expose a built-in beans tui command.
Use the separate beans-tui tool if you want a terminal UI.
Relationships
Beans support structured relationships:
- Parent: hierarchy like milestone → epic → feature → task
- Blocking: this bean blocks another bean
- Blocked-by: this bean is blocked by another bean
Examples:
beans update --json child-1 --parent epic-1
beans update --json task-2 --blocked-by task-1
beans update --json infra-1 --blocking release-1
Recommended agent usage patterns
Always prefer JSON when parsing
beans list --json --ready
beans show --json <id>
beans create --json "Title" -t task
beans update --json <id> -s in-progress
Keep bean bodies current
Use body content for:
- checklists
- implementation notes
- reproduction steps
- summaries of changes
- reasons for scrapping work
Make narrow body replacements
When updating checklists or notes, use exact replacement instead of rewriting the whole body when possible:
beans update <id> \
--body-replace-old "- [ ] Ship release" \
--body-replace-new "- [x] Ship release"
Prefer relationships over ad-hoc text
Use --parent, --blocking, and --blocked-by instead of only mentioning dependencies in freeform notes.
Integration notes
OpenCode
The beans prime output can be injected into agent context via an OpenCode plugin.
Codex / Pi / Claude Code
At minimum, add a rule to project instructions like:
Before starting work in this repo, run `beans prime` and follow its output.
Tips
- Run
beans prime first in beans-enabled projects
- Use
--json for agent-readable output
- Use
beans version, not beans --version; if it errors with Cannot find module 'coffee-script', a stale npm/Bun package is shadowing the real CLI
- Use
beans graphql for advanced filtering and relationship traversal
- Use separate
beans-tui tooling if you need a terminal UI
- Use
beans check after large edits or relationship changes
Links