bd ready— find an unblocked task.bd show <id>— get full context.bd update <id> --claim— claim it.- Implement.
bd close <id> --reason "..."— close on completion.bd dolt push— sync to remote.
See docs/SPEC.md for architecture and docs/decisions/ for locked design choices.
bun install --cwd frontend
cd src-tauri && cargo tauri devRust IPC types are exported to TypeScript via ts-rs. Generated .ts files in frontend/src/types/ipc/ are committed so frontend builds don't depend on running cargo.
When you add or change a Rust IPC type:
- Derive
ts_rs::TSplus#[ts(export, export_to = "../../../../frontend/src/types/ipc/")]on the type. - Run
cargo test --workspace— the auto-generatedexport_bindings_*tests materialize updated.tsfiles. - Run
bun --cwd frontend run build:ipc-barrelto refresh the index. - Stage the generated diff:
git add frontend/src/types/ipc/. - Commit alongside the Rust change.
CI runs:
cargo test --workspace
bun --cwd frontend run build:ipc-barrel
git diff --exit-code -- frontend/src/types/ipc/If the diff is non-empty, CI fails. Re-run the two commands and commit.
- camelCase TypeScript shape: every IPC struct uses
#[serde(rename_all = "camelCase")]. - Discriminant enums use
#[serde(rename_all = "kebab-case")]. serde_json::Valuefields annotate with#[ts(type = "unknown")].chrono::DateTimeanduuid::Uuidmap cleanly via thechrono-implanduuid-implts-rs features (already enabled in workspace deps).
Save the following as .git/hooks/pre-commit and chmod +x:
#!/usr/bin/env bash
set -e
cargo test --workspace
bun --cwd frontend run build:ipc-barrel
git diff --exit-code -- frontend/src/types/ipc/Don't enforce — CI is the gate. The hook just shortens the feedback loop.
- Rust:
cargo fmt+cargo clippy --workspace -- -D warnings. - Vue/TS:
bun --cwd frontend run lint.
Use Conventional Commits. Do not include Co-Authored-By: lines (per project convention).