@ -14,24 +14,36 @@ Add an optional SQLite cache in `.nbd/cache.db` to accelerate `nbd list` and `nb
## Approach
## Approach
### Crate dependency
### Crate dependency
Add `sqlx` with the `sqlite` and `runtime-async-std` features to `Cargo.toml`.
Add `turso` to `Cargo.toml` (file-based SQLite, no `sync` feature needed):
```toml
turso = "0.4.3"
```
> **Note:** Turso requires tokio. The existing `async-std` runtime in `nbd` must be replaced with `tokio` (or a compatibility shim used). Recommendation: switch `#[async_std::main]` to `#[tokio::main]` and update `Cargo.toml` accordingly.
### store.rs additions
### store.rs additions
New async function `open_cache(root: &Path) -> Result<sqlx::SqlitePool>`:
New async function `open_cache(root: &Path) -> Result<turso::Connection>`:
- Opens (or creates) `.nbd/cache.db`.
- Opens (or creates) `.nbd/cache.db` via `turso::Builder::new_local(path).build().await?`.
- Runs a migration: `CREATE TABLE IF NOT EXISTS tickets (id TEXT PRIMARY KEY, json TEXT NOT NULL, mtime INTEGER NOT NULL)`.
- Runs a migration: `CREATE TABLE IF NOT EXISTS tickets (id TEXT PRIMARY KEY, json TEXT NOT NULL, mtime INTEGER NOT NULL)`.
New function `list_tickets_cached(root: &Path) -> Result<Vec<Ticket>>`:
New function `list_tickets_cached(root: &Path) -> Result<Vec<Ticket>>`:
1. Open cache.
1. Open cache via `open_cache`.
2. Read directory listing to get file names and mtimes.
2. Read directory listing to get file names and mtimes.
3. For each file: if the DB has a row with matching mtime, use cached JSON; otherwise read file, parse, insert/update row.
3. For each file: query the DB (`connection.query(...).await?`) for a row with matching mtime; if found, use cached JSON; otherwise read file, parse, and upsert with `connection.execute(...).await?`.
4. Delete DB rows for IDs no longer on disk.
4. Delete DB rows for IDs no longer on disk.
5. Return deserialized tickets sorted by priority desc.
5. Return deserialized tickets sorted by priority desc.
Keep existing `list_tickets` as the non-cached fallback. Consider making `cmd_list` and `cmd_ready` use `list_tickets_cached` when available.
Keep existing `list_tickets` as the non-cached fallback. `cmd_list` and `cmd_ready` use `list_tickets_cached`, falling back to `list_tickets` on error.
### Turso API reference
- Open local file DB: `turso::Builder::new_local("path/to/file.db").build().await?`
The goal of this is tickets which are created but should not be worked on yet.
Tickets with this status do not show up by default in `nbd list`, `nbd ready`, and `nbd next`.
The default state for tickets is still `todo`.
---
`nbd archive` should set a status of `archived` not `closed`.
Preserve the `closed` state for tickets which will not be completed.
---
`nbd graph` should mark `cycle` items instead as `*` to indicate they are in the same tree twice.
---
Printing a ticket (like `nbd read` or `nbd create's output`) should print the ticket in Markdown format (unless --json is specified, that behavior does not change).
This should essentially render the contents as `--ftype md` does with frontmatter and body.