You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
3.0 KiB
Markdown
84 lines
3.0 KiB
Markdown
+++
|
|
title = "Multiple file format support (md, toml, jsonb)"
|
|
priority = 5
|
|
status = "done"
|
|
ticket_type = "feature"
|
|
dependencies = []
|
|
+++
|
|
Add `--ftype` flag to `create` and `update` to write tickets in markdown, TOML, or binary JSON (CBOR) in addition to the existing JSON format. Format is detected from file extension on read.
|
|
|
|
## Motivation
|
|
|
|
Markdown format lets agents write long-form ticket bodies with full markdown syntax, and makes tickets human-readable in a file browser. TOML is a natural config format. CBOR offers compact binary storage.
|
|
|
|
## Approach
|
|
|
|
### New crate dependencies (Cargo.toml)
|
|
Evaluate and add:
|
|
- `toml` — TOML serialisation (likely `toml = "0.8"`)
|
|
- `serde_yml` or `serde_yaml` — YAML frontmatter (for `.md` files)
|
|
- `ciborium` — CBOR binary JSON (`.jsonb`)
|
|
|
|
### ticket.rs
|
|
No changes needed — `Ticket` already derives `Serialize`/`Deserialize`.
|
|
|
|
### store.rs
|
|
New enum `FileFormat { Json, Markdown, Toml, Jsonb }`.
|
|
|
|
New function `detect_format(path: &Path) -> FileFormat`:
|
|
- `.json` → `Json`
|
|
- `.md` → `Markdown`
|
|
- `.toml` → `Toml`
|
|
- `.jsonb` → `Jsonb`
|
|
- Unknown → `Json` (fallback)
|
|
|
|
Update `ticket_path(root, id, format)` to use the format-appropriate extension. This is a breaking change to the function signature — update all callers.
|
|
|
|
Update `read_ticket(root, id)`:
|
|
1. Try each known extension in order until a file is found.
|
|
2. Read the file and dispatch to the format-appropriate deserialiser.
|
|
|
|
Serialisation helpers (private):
|
|
- `serialize_json(ticket) -> String`
|
|
- `serialize_toml(ticket) -> String`
|
|
- `serialize_markdown(ticket) -> String` — TOML frontmatter (`+++` delimiters) with body as file content
|
|
- `serialize_jsonb(ticket) -> Vec<u8>`
|
|
|
|
Deserialization helpers (private):
|
|
- `deserialize_markdown(bytes) -> Result<Ticket>` — parse frontmatter + body
|
|
|
|
Update `list_tickets` to scan for `*.json`, `*.md`, `*.toml`, `*.jsonb` files.
|
|
|
|
Update `write_ticket` to accept `format: FileFormat` and write in the appropriate format.
|
|
|
|
### main.rs
|
|
Add `--ftype [json|md|toml|jsonb]` option (default `json`) to `create` and `update`.
|
|
Conversion on `update --ftype`: read old file, write new format, delete old file (if extension changed).
|
|
|
|
## Markdown format (TOML frontmatter)
|
|
```
|
|
+++
|
|
id = "a3f9c2"
|
|
title = "Fix login bug"
|
|
priority = 8
|
|
status = "in_progress"
|
|
ticket_type = "bug"
|
|
dependencies = ["b7d41e"]
|
|
+++
|
|
|
|
Long-form body text goes here. Supports full markdown.
|
|
```
|
|
|
|
## Tests
|
|
- Unit tests: roundtrip each format (JSON already tested).
|
|
- Integration tests: `nbd create --ftype md` creates a `.md` file; `nbd read` finds and parses it.
|
|
- Integration test: `nbd update <id> --ftype toml` converts format and removes old file.
|
|
|
|
## Files touched
|
|
- `Cargo.toml` — new dependencies
|
|
- `src/store.rs` — format detection, multi-format read/write, updated `list_tickets`
|
|
- `src/main.rs` — `--ftype` flags
|
|
- `src/tests.rs` — format roundtrip tests
|
|
- `tests/integration.rs` — format integration tests
|
|
- `README.md` — document `--ftype`
|
|
- `docs/ARCHITECTURE.md` — update storage layout section |