- Add yew 0.22 with csr feature for Rust/Wasm SPA frontend
- Add yew-router 0.19 for client-side routing
- Add gloo 0.11 for Web API utilities (timers, fetch, events)
- Add wasm-bindgen 0.2 matching Nix wasm-bindgen-cli 0.2.108
- Add wasm-bindgen-futures 0.4 for async fetch support
- Add web-sys 0.3 for raw DOM/browser API bindings
All UI deps scoped to wasm32 cfg target to avoid host build pollution
Closes ticket 93515e
- Add uuid = { version = "1", features = ["v4", "serde"] } to [dependencies]
- Add getrandom = { version = "0.4", features = ["wasm_js"] } under wasm32 cfg
- Implement generate_id() in src/lib.rs with rustdoc and doctest
- Add unit tests for length, hyphen count, and uniqueness
Closes ticket 7a0d9f
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replaces the three separate sub-crates (api/, ui/, tests/) with a single
Cargo crate at the quotesdb/ root. Shared code lives in src/lib.rs; the
api and ui are multi-binary targets; integration tests use the standard
Cargo tests/ layout. Trunk files moved to project root with data-bin="ui".
Closes ticket b38032.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
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>
- Add working-directory rule to root and all project docs
- Generalize root from "HTTP web services" to "independent projects"
- Add @../CLAUDE.md inheritance to nbd, edu, quotesdb project docs
- Remove sections duplicated from root in project-level docs
- Wrap all sections in semantic XML tags for clearer agent parsing
- Rename Tech Stack → Common Patterns (framed as defaults, not requirements)
- Rename Running Services Locally → Running Projects Locally
Evaluated all quotesdb tickets and assigned each to the correct sub-project
dependency (api/f3dc74, ui/c3503b, qa/ce1e4f, infra/25c413). Also wired
inter-ticket dependencies to enforce correct implementation order within each
domain and cross-domain (e.g. QA test suites depend on the API handlers they
exercise). Validated with `nbd graph --json` — 78 nodes, 200 edges, no cycles.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
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>
- 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>
Adds 84 tickets across 4 sub-domains with a full dependency graph:
- quotesdb/api (f3dc74): 15 work tickets + 6 TRIAGE tickets
Covers Cargo.toml, Workers entry point, DB migrations, all 7 endpoints,
auth code gen, tag handling, error envelope, unit tests, and docs.
- quotesdb/ui (c3503b): 15 work tickets + 5 TRIAGE tickets
Covers Yew/Wasm setup, Trunk config, app shell, API client, 5 pages,
shared components (QuoteCard, auth modal, pagination, tag filter), and docs.
- quotesdb/qa (ce1e4f): 12 work tickets + 4 TRIAGE tickets
Covers test harness, one test suite per endpoint, router ordering,
tag operations, and README.
- quotesdb/infra (25c413): 10 work tickets + 6 TRIAGE tickets
Covers OpenTofu setup, D1 database, Worker script + route, Pages project,
custom domain (quotes.elijah.run), migration workflow, secrets, and README.
Dependency graph:
- Root ticket (ec118c) blocked on all 4 sub-project tickets
- Sub-project tickets blocked on their leaf work tickets
- Work tickets have intra-domain sequential deps (e.g. Cargo.toml → DB → handlers)
- QA test harness has a cross-domain dep on the completed api sub-project
- All 21 TRIAGE tickets are immediately unblocked as the highest-priority starting work
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
18-section interactive course teaching compiler construction in Rust
using nom. Covers MiniLisp parsing, AST design, semantic analysis,
and C code generation. All sections stubbed; one nbd task ticket per
section plus a project ticket (67e284) tracking completion.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replaces the stub in Section 2 with full prose covering:
- State space definition (finite vs countably infinite)
- Transitions as directed, probability-labelled edges
- ASCII state-transition diagram for the weather model
- Absorbing, transient, and recurrent state classification
Full Exercise 3 — Bigram Text Generator section replacing the stub:
- Setup instructions (cargo new, cargo add rand)
- Starter code skeleton with BigramModel struct
- Step 1: tokenize corpus with split_whitespace + to_lowercase
- Step 2: build transition table via windows(2) with count tracking
- Step 3: integer weighted sampling helper (sample_weighted)
- Step 4: generate implementation with dead-end handling
- Step 5: run the generator with the Alice corpus and seeded RNG
- Step 6: guidance for trying a larger Project Gutenberg corpus
- Full reference solution in a collapsible details block
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace stub with full prose covering the stationary equation,
long-run frequency interpretation, irreducibility and aperiodicity,
a worked 2×2 analytical solution for the weather chain, and a power
iteration pseudocode + Rust sketch.
Replaces the stub with full lesson content:
- Defines the transition matrix P[i][j] and stochastic matrix constraints
- Derives multi-step probabilities via π_k = π₀ · P^k
- Works through the 2-state weather chain by hand (1- and 2-step calculations)
- Bridges to §9 stationary distributions
- Words as states paragraph
- Bigrams and transition tables explanation
- Worked bigram example with two-sentence corpus and transition table
- Why generated text sounds locally plausible but globally incoherent
- Order-n chains and the coherence/novelty tradeoff
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
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>
The [cycle] label was misleading — a node marked this way is not
necessarily in a true cycle, it is simply a shared dependency appearing
in multiple branches of the tree. The `*` marker is more neutral and
concise.
Changes: render_node in display.rs, test in tests.rs, README.md.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Ensures every command in the embedded snippet uses --json for structured
output, consistent with the guideline at the bottom of the snippet.
Also adds --json to nbd ready and nbd next, and --ftype md to the create
workflow step.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
build.rs captures the short git SHA at compile time via
`git rev-parse --short HEAD` and emits it as GIT_SHORT_SHA. Falls back
to "unknown" when git is unavailable (e.g. Nix sandboxed builds).
main.rs adds a VERSION const (`env!("CARGO_PKG_VERSION") + "+" + SHA`)
and passes it to clap's `version =` attribute, enabling both -V and
--version flags.
Example output: `nbd 0.1.0+8f4d25b`
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace the key-value table format with TOML frontmatter + body when
printing tickets to stdout (nbd read, nbd create, nbd archive, nbd next
— all non-JSON paths). The --json output is unchanged.
New format:
+++
id = "a3f9c2"
title = "Fix login bug"
priority = 8
status = "in_progress"
ticket_type = "bug"
dependencies = ["b7d41e"]
+++
Body text here.
Changes:
- display.rs: add DisplayFrontmatter struct, rewrite format_ticket using
toml::to_string with id prepended as first frontmatter key
- tests.rs: update format_ticket_joins_dependencies and
format_ticket_empty_dependencies for the new format
- integration.rs: update TestEnv::create to use --json for reliable
ID extraction instead of parsing the key-value text format
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
`nbd archive` now sets status to `archived` (completed, soft-deleted)
instead of `closed`. The `closed` status is reserved for tickets that
will not be completed (cancelled, superseded, won't-fix).
Both statuses count as resolved for dependency purposes and are excluded
from `nbd list`, `nbd ready`, and `nbd next` by default.
Changes:
- Add `Status::Archived` variant (serialises as "archived")
- `cmd_archive`: sets `Status::Archived` instead of `Status::Closed`
- `parse_status`: add "archived" arm
- `cmd_list`, `cmd_ready`, `cmd_next`: exclude/resolve `Archived`
- `display`, `graph`, `filter`: add `Archived` arm to `status_str`
- Tests: rename/update archive tests, add archived/closed test variants
- Docs: update README.md and CLAUDE.md status tables and descriptions
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>