27 Commits (c9191e7e16d6beb602725169bf39f05ad219f623)

Author SHA1 Message Date
Elijah Voigt aa4e9fdbfe tickets: triage TODO files → nbd tickets
Root TODO.md:
- 82df74: Add justfiles for all projects (lint/check/build/release)
- 09cda0: Add contact footer to all service front-ends

nbd/TODO.md:
- 39b2cf: Add --xml output format to nbd

edu/TODO.md:
- 59c122: Deploy edu mdbook to Cloudflare Pages (vibebooks.elijah.run)
- 8618e4: Write chapter on co-op worker-owned business structure
- 8f14c6: Write Machine Learning chapter (self-play game AI)
- 389d8d: Write chapter on creating and training a simple LLM
- 0fbe1a: Write chapter on shader programming

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3 months ago
Elijah Voigt 7c9d058ce6 feat(nbd): scope nbd next/ready by dependency subtree (#818598)
Add an optional positional `<id>` argument to `nbd next` and `nbd ready`
that restricts results to the dependency subtree of the given ticket.
The scoping ticket itself is excluded from results.

- CLI: add `id: Option<String>` to `Commands::Next` and `Commands::Ready`
- Logic: build a `TicketGraph`, call `subtree()`, restrict candidate pool
- Tests: 4 new integration tests covering scoped next/ready and --filter

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3 months ago
Elijah Voigt 3c0665314a tickets(nbd): triage TODO.md → 818598 scope next/ready by subtree
- 818598: Scope nbd next and nbd ready by dependency subtree

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3 months ago
Elijah Voigt 6d40671f28 fix(nbd): fix graph orientation to show goals at root, prerequisites as leaves
Roots are now tickets with no dependents (nobody depends on them —
top-level goals), and the ASCII tree traverses dependency edges so
prerequisites appear indented beneath the goal that needs them.

JSON edges are now {from: dependent, to: dependency} rather than
{from: blocker, to: blocked}.

All graph-related unit and integration tests updated to match the
new semantics.

Closes #668150

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3 months ago
Elijah Voigt 380cfee6ca tickets(nbd): triage graph inversion bug into two tickets
- 668150: Fix graph orientation: show goals at root, prerequisites as leaves
- 06ca62: Fix nbd graph <id>: show ancestry path through ticket, not just subtree

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3 months ago
Elijah Voigt 3ce8b16581 chore(nbd): triage TODO into 9 tickets
- d9713b: open/start/complete/close convenience sub-commands
- 53fdbe: list <status> positional arg shortcuts
- 1c686c: next <type> positional arg shortcuts
- 4aceeb: nbd init adds cache.db to .nbd/.gitignore
- 1c5783: VERSION file + nbd version subcommand + /work skill bump
- 3ba7f9: .nbd/config.toml per-project defaults
- e222cd: triage status (new default, excluded from ready/next/list)
- 67209c: [backlog] investigate project-based ticket filtering
- 0f577a: [backlog] investigate user-configurable type/status strings

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3 months ago
Elijah Voigt 5ddf9a56e1 feat(nbd): add Turso/libsql cache for list performance [833807]
Migrate async runtime from async-std to tokio (required by libsql),
then add a mtime-based libsql cache at .nbd/cache.db that accelerates
nbd list, nbd ready, and nbd next by avoiding redundant file reads.

- Cargo.toml: replace async-std with tokio + libsql = "0.6"
- src/store.rs: async_std → tokio fs API; add open_cache() and
  list_tickets_cached() with fallback to list_tickets on error
- src/main.rs: tokio::main, tokio::fs::remove_file; wire cmd_list,
  cmd_ready, cmd_next to list_tickets_cached
- src/tests.rs: async_std::test → tokio::test, async_std::fs → tokio::fs

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3 months ago
Elijah Voigt 9d63d76198 chore(nbd): triage --version flag ticket [c24ee8]
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3 months ago
Elijah Voigt 347580e5df claude skill tweaks, bugs triaged, projects updated 3 months ago
Elijah Voigt 7e311d6b47 feat(nbd): add backlog status to tickets [c12091]
Adds a new `backlog` Status variant for tickets that are created but
intentionally deferred. Backlog tickets are excluded from `nbd list`,
`nbd ready`, and `nbd next` by default, but unlike `done` and `closed`
they do not count as resolved for dependency purposes — a ticket whose
dependency is `backlog` remains blocked.

Visible via `--all` or `--filter status=backlog`.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3 months ago
Elijah Voigt 0ba22db39e Some tasks 3 months ago
Elijah Voigt ffbb0157e3 feat(nbd): add Nix flake for building and running nbd [6e4239]
Add flake.nix so nbd can be consumed as a reproducible Nix package.
Exposes packages.default, apps.default (nix run), and a devShell with
stable Rust toolchain and the nbd binary. Uses cargoLock for
dependency hashing without a pre-computed cargoHash.

Also adds an Installation section to README.md covering nix run and
nix build usage.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3 months ago
Elijah Voigt 7aa547633f feat(nbd): show diff output on nbd update without --json [5f1495]
When `nbd update` is run without `--json`, print a git-diff-style
+/- summary of changed fields instead of the full ticket.

- Add `format_diff` and `print_diff` to display.rs
- Capture `old` ticket snapshot in `cmd_update` before mutations
- Use `print_diff` for the non-JSON branch of `cmd_update`
- Add unit tests (4) and integration tests (3) covering diff output,
  JSON fallback, and the no-changes case

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3 months ago
Elijah Voigt 84a75f4531 test(nbd): add integration tests for nbd graph command [9c1f2c]
8 integration tests covering: empty store, independent tickets (no
indentation), chain rendering (└──), single-ticket subtree (excludes
unrelated), --json output (nodes/edges arrays), --json subtree scoping,
--filter narrowing, and 3-char prefix resolution.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3 months ago
Elijah Voigt b0359c4392 feat(nbd): add 'nbd graph' CLI subcommand [9ad11f]
Wires up the graph command in main.rs with cmd_graph(). Supports
full dependency forest (nbd graph), subtree by ID/prefix (nbd graph
<id>), --filter narrowing, and --json machine-readable output. Fixes
tree-rendering indentation bug (child_base vs prefix separation).
Updates README.md and CLAUDE.md with graph command documentation.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3 months ago
Elijah Voigt d5697d5c4e feat(nbd): add ASCII graph rendering to display.rs [e14172]
Adds format_graph, print_graph, format_subtree, and print_subtree.
Renders dependency forest with box-drawing characters (├──, └──, │).
Cycle-safe via visited HashSet; repeated nodes labelled [cycle].
8 unit tests covering single tickets, chains, branching, subtrees,
cycles, unknown IDs, and the empty graph.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3 months ago
Elijah Voigt d0dd720316 feat(nbd): add graph computation module (src/graph.rs) [9c9ebe]
Implements TicketGraph<'a> with build(), roots(), subtree(),
to_json_value(), and to_subtree_json_value(). Tracks both forward
(dependencies) and reverse (dependents) edges. Cycle-safe DFS via
visited set. No new crate dependencies. 14 unit tests covering empty
graph, chains, branching, cycles, dangling refs, and JSON output.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3 months ago
Elijah Voigt 9a58e78ca8 Migrate all tickets to `.md` format 3 months ago
Elijah Voigt 0bd7bd8c0f feat(nbd): add multi-format ticket storage (md, toml, jsonb) [460caf]
Tickets can now be stored in four formats, selected with --ftype:
  json  (.json) — pretty-printed JSON, default, unchanged
  md    (.md)   — Markdown body with TOML frontmatter
  toml  (.toml) — full TOML
  jsonb (.jsonb) — CBOR binary via ciborium

Changes:
- store.rs: FileFormat enum, detect_format(), find_ticket_path(),
  per-format serialize/deserialize helpers; read_ticket/list_tickets/
  resolve_id/migrate_tickets all scan all known extensions
- main.rs: --ftype on create (default "json") and update (optional,
  converts format and removes old file); archive/update preserve
  existing format when --ftype is absent
- tests.rs: update write_ticket/ticket_path call sites; add TOML,
  Markdown, and CBOR roundtrip unit tests
- integration.rs: 8 new format tests covering create, list, update
  conversion, format preservation, body roundtrip, unknown-ftype error

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3 months ago
Elijah Voigt c95ebc9057 migate nbd tickets, triage example for skill maybe later 3 months ago
Elijah Voigt ba0efeb622 feat(nbd): add claude-md command [fc444f]
Adds `nbd claude-md` subcommand that prints a ready-to-paste CLAUDE.md
snippet for adopting nbd in any project. The snippet is embedded at
compile time via `include_str!` from `src/claude_md_snippet.md`, so it
stays in sync with the installed binary automatically.

- `nbd claude-md` prints raw markdown (suitable for `>> CLAUDE.md`)
- `nbd claude-md --json` outputs `{"snippet": "..."}` for programmatic use
- Works without a `.nbd/` store present (no find_nbd_root call)
- 4 new integration tests covering all specified behaviours

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3 months ago
Elijah Voigt deecdba592 feat(nbd): add archive command and Closed status [1939a7]
Add Status::Closed variant serialised as "closed", providing a
soft-delete for tickets that should be hidden from normal listings.

- nbd archive <id>: sets status to closed (sugar for update --status closed)
- nbd list: excludes closed tickets by default (same as done)
- nbd list --all: bypasses default status exclusion, shows everything
- nbd list --filter status=closed: shows only closed tickets
- Closed tickets count as resolved for dependency purposes (unblock dependents)
- nbd ready / nbd next: closed tickets excluded from actionable set

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3 months ago
Elijah Voigt 8e2fdb5796 Closing tickets, adding jq 3 months ago
Elijah Voigt 8a970a559b docs(nbd): update CLAUDE.md with init and ready subcommands
- Add nbd init and nbd ready to the CLI Interface reference
- Replace mkdir workaround with `cargo run -- init` in Task Tracking
- Restore the --json guideline to its original wording
- Add `nbd ready` as the preferred "what to work on next" command

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3 months ago
Elijah Voigt 3c17918a47 feat(nbd): implement nbd init and nbd ready commands [4d2359, e1968f]
- `nbd init` creates `.nbd/tickets/` in cwd (idempotent, no find_nbd_root)
- `nbd ready` lists actionable tickets: not done with all deps completed
- Both commands support `--json` for machine-readable output
- 6 new integration tests covering init and ready behaviour

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3 months ago
Elijah Voigt df71fc9e09 feat(nbd): implement nbd migrate command [0f51af]
Adds `nbd migrate` to bring ticket files on disk into conformance with
the current serde schema. Re-serialises every *.json file through the
current Ticket model — removing stale fields (e.g. old \"id\" key),
adding new fields with their defaults, and normalising formatting.

- store: MigrateReport struct and migrate_tickets() function
- display: format/print_migrate_report and _json variants
- main: Migrate command with --dry-run flag and cmd_migrate handler
- 6 unit tests (rewrites old format, already-current, dry-run, invalid JSON, empty store, no tickets dir)
- 4 integration tests (rewrite, dry-run, parse error tolerance, --json output)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3 months ago
Elijah Voigt f1715d18eb feat(nbd): remove id from ticket JSON body; inject from filename [d1634a]
The ticket id is now stored only in the filename stem (.nbd/tickets/{id}.json).
`id` is annotated with `#[serde(skip)]` so it is never written to disk,
eliminating the consistency hazard of id-in-body vs. filename disagreement.

- ticket.rs: add `#[serde(skip)]` to `Ticket::id`
- store.rs: `read_ticket` and `list_tickets` inject id from filename stem
- display.rs: `ticket_to_json_value` re-inserts id for CLI `--json` output
- tests.rs: new unit tests for omission, injection, and old-format compat
- integration.rs: assert written files lack "id"; assert read --json has id

Backwards-compatible: old files with "id" in JSON body still parse correctly
(serde ignores the unknown field), so existing stores work without migration.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3 months ago