@ -14,24 +14,36 @@ Add an optional SQLite cache in `.nbd/cache.db` to accelerate `nbd list` and `nb
## Approach
### 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
New async function `open_cache(root: &Path) -> Result<sqlx::SqlitePool>`:
- Opens (or creates) `.nbd/cache.db`.
New async function `open_cache(root: &Path) -> Result<turso::Connection>`:
- 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)`.
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.
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.
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.