You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Elijah Voigt fa60cb844d feat(nbd): add nbd next subcommand [fc6df4]
Adds `nbd next` which selects the single highest-priority ready ticket.
Supports `--filter` narrowing, `--json` output as `{"next": ...}` or
`{"next": null}` when nothing is ready. Makes `ticket_to_json_value`
pub(crate) for reuse. Adds 7 integration tests.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3 months ago
..
.claude docs(nbd): update CLAUDE.md with init and ready subcommands 3 months ago
.nbd/tickets Closing tickets, adding jq 3 months ago
docs docs(nbd): add README, PLANNING, ARCHITECTURE, and complete Phase 6 3 months ago
src feat(nbd): add nbd next subcommand [fc6df4] 3 months ago
tests feat(nbd): add nbd next subcommand [fc6df4] 3 months ago
CLAUDE.md feat(nbd): add nbd next subcommand [fc6df4] 3 months ago
Cargo.lock feat(nbd): scaffold crate with module stubs and dependencies 3 months ago
Cargo.toml feat(nbd): scaffold crate with module stubs and dependencies 3 months ago
PLAN.md docs(nbd): add README, PLANNING, ARCHITECTURE, and complete Phase 6 3 months ago
README.md feat(nbd): add nbd next subcommand [fc6df4] 3 months ago

README.md

nbd

A CLI tool for managing work tickets, primarily targeted at agent workflows.

Tickets are stored as JSON files in .nbd/tickets/ inside the nearest ancestor directory that contains a .nbd/ folder, discovered by traversing upward from the current working directory — just like git finds .git/.

How it works

Each ticket is a JSON file named {id}.json, where id is a unique 6-character lowercase hex string (e.g. a3f9c2). Tickets carry:

Field Type Default
id 6-char hex string auto-generated
title string (required)
body string ""
priority integer 010 5
status todo | in_progress | done todo
ticket_type project | feature | task | bug task
dependencies list of ticket IDs []

All commands accept --json for machine-readable output.

Usage

Initialise

Create the ticket store in your project root:

nbd init

Analogous to git init — safe to run multiple times.

Create a ticket

nbd create --title "Fix login bug" --priority 8 --type bug
nbd create --title "Add rate limiting" --body "Protect public endpoints" --deps a3f9c2

Read a ticket

nbd read a3f9c2
nbd read a3f9c2 --json

List all tickets

By default, done tickets are excluded.

nbd list                          # todo + in_progress only (done excluded)
nbd list --filter status=*        # all tickets including done
nbd list --filter status=done     # only completed tickets
nbd list --filter type=bug        # non-done bug tickets
nbd list --json

Update a ticket

Only the flags you supply are changed; all other fields retain their current values.

nbd update a3f9c2 --status in_progress
nbd update a3f9c2 --priority 9 --type bug

Find the next ticket to work on

Returns the single highest-priority ticket that is ready to work on — not done and with all dependencies completed:

nbd next
nbd next --json
nbd next --filter type=bug     # highest-priority ready bug
nbd next --filter priority=9   # highest-priority ready ticket at priority 9

Exits 0 even when no ready ticket exists ({"next": null} in JSON mode).

Find all actionable tickets

List all tickets that are ready to work on — not done and with all dependencies completed:

nbd ready
nbd ready --json

Migrate ticket files

Re-serialise all ticket files through the current schema. Use this after upgrading nbd to remove stale fields, add new fields with defaults, and normalise formatting.

nbd migrate
nbd migrate --dry-run   # preview changes without writing
nbd migrate --json      # machine-readable summary

Running

# From the nbd/ directory
cargo run -- init
cargo run -- create --title "Test ticket" --priority 7 --type bug
cargo run -- list
cargo run -- ready
cargo run -- read <id>
cargo run -- update <id> --status in_progress
cargo run -- list --json

Testing

cargo test

Unit tests live in src/tests.rs. Integration tests (full command flows against a temporary directory) live in tests/integration.rs.

Development

Run these commands in order before committing:

cargo fmt
cargo check
cargo clippy
cargo test

License

Dual-licensed under Apache License, Version 2.0 and MIT License, consistent with the rest of the vibed mono-repo.


This software was written with Claude Code using the claude-sonnet-4-6 model.