Files
dm-pal/docs/roadmap.md
T
itsamejms d41737e1c9
CI / frontend (push) Successful in 30s
CI / rust (push) Successful in 5m33s
docs: roadmap — Phase 1 complete
2026-09-07 10:28:57 +01:00

123 lines
8.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# DM-Pal — Master Roadmap (every known gap)
*Consolidates `docs/repo-review.md` (2026-09-06), the open items in
`plan.md` §15–17, the unchecked P2/P3 items in `ui-ux-improvements.md`, and
new feature proposals into one ordered plan. This is now the working list;
`plan.md` remains design history. Every item is verified as **not shipped**
as of 2026-09-06.*
Source tags: **[R]** repo-review · **[P]** plan.md §17/§15 ·
**[U]** ui-ux-improvements P2/P3 · **[N]** new proposal.
---
## Phase 0 — Fix & harden → tag `v0.1.4` (~1.5 days) — ✅ DONE 2026-09-06
| # | Item | Effort | Notes |
|---|------|--------|-------|
| [x] 0.1 | Scrub PII from `scripts/apple-signing.env.example` | 5 m | [R] real email + Team ID still present |
| [x] 0.2 | Persist `LlmConfig` to prefs store; load on startup | 1 h | [R] **P0** — restart currently wipes Settings. Add a `configVersion` field for future shape changes |
| [x] 0.3 | RAG: UTF-8 boundary fix in `chunk()` + test with accented text | 1 h | [R] multibyte paragraphs silently drop chunks today |
| [x] 0.4 | RAG: `DELETE WHERE source = ?` before re-insert in `add_document` | 15 m | [R] re-adding a file doubles its chunks |
| [x] 0.5 | RAG: embed-model mismatch guard (store model per source; refuse/warn) + "Reindex all" | 2 h | [R] changing embed model currently poisons cosine scores |
| [x] 0.6 | `npm run check` + `.gitea/workflows/ci.yml` (lint, tsc, checks, `cargo test`) | 2 h | [R][P] |
| [x] 0.7 | Doc drift: README line 21 ("macOS, via Ollama"), Node ≥ 23.6 prerequisite, version sync (Cargo vs tauri.conf), banner on stale plan.md §4.4/§10, delete `public/icons.svg` | 1 h | [R] |
| [x] 0.8 | Minimal CSP in `tauri.conf.json` (self + `data:` img; check dev HMR) | 30 m | [R] |
| [x] 0.9 | Replace `is_ollama()` URL sniff with `provider` field in `LlmConfig` (wizard presets set it) | 1.5 h | [R] breaks on custom Ollama ports |
**Done when:** settings survive restart; CI green on push; re-indexed lore
returns sane results; no PII in the repo. — all shipped: config
round-trips through the prefs store, CI workflow pushed (verify first run
on Gitea), Reindex in the Lore panel, PII scrubbed (note: earlier values
remain in git history).
## Phase 1 — Core UX enablers → tag `v0.2.0` (~1 week) — ✅ DONE 2026-09-06
| # | Item | Effort | Notes |
|---|------|--------|-------|
| [x] 1.1 | Real token streaming: Ollama `stream:true` NDJSON + OpenAI SSE via `reqwest::bytes_stream` (dep already present) | 3 h | [R][N] unlocks visible generation everywhere; SessionLogger already renders progressive tokens |
| [x] 1.2 | Model pull in first-run wizard: `POST /api/pull` NDJSON → Channel progress bar (same shape as image-gen poller) | 3 h | [N] wizard currently "hopes it exists" |
| [x] 1.3 | `ragQuery` on Encounter, Quest, Session summary | 30 m | [N] NPC/Item/World already pass it |
| [x] 1.4 | Auto-log session events: bus emits for dice rolls, initiative round/turn changes, encounter start → SessionLogger appends | 3 h | [N] makes the AI summary summarize the actual fight |
| [x] 1.5 | NPC → Initiative push ("⚔ Add to tracker" on NPC card via `AddCombatants` bus event; stats already generated) | 30 m | [N] |
| [x] 1.6 | Calendar "Next day" → session-log entry incl. rolled weather | 1 h | [N] ties calendar into the timeline |
| [x] 1.7 | Dice macros: persisted named rolls (`usePersistentState`), button row + edit sheet | 2 h | [U P3] |
| [x] 1.8 | Initiative condition durations (auto-decrement per round, expire) | 2 h | [U-adjacent] concentration/Hex is table-stakes |
**Done when:** a brand-new user pulls a model in-wizard and watches it
progress; a combat logs itself; the AI summary streams and is grounded.
— all shipped; verify the wizard pull once on a real Ollama instance.
## Phase 2 — Flagship features → tag `v0.3.0` (~2 weeks)
| # | Item | Effort | Notes |
|---|------|--------|-------|
| 2.1 | **Ask the Oracle**: chat over the world bible — question → `rag_search` → `generate` → answer with source chips. New view, no backend change | 1 d | [N] the flagship for the RAG pipeline |
| 2.2 | Quest branching graph (`react-flow`): conditional edges, step status colors | 1 d | [P][U] |
| 2.3 | World hierarchy tree: continent → region → city; drill into a region to generate sub-regions | 1 d | [P][U] |
| 2.4 | NPC roster view: grid of generated NPCs w/ portraits, filter by race/alignment, click to open | 1 d | [U] reads generations.db |
| 2.5 | Item inventory view (rarity-coded grid) | 0.5 d | [U] |
| 2.6 | Quest roster view (status badges) | 0.5 d | [U] |
| 2.7 | Campaign namespacing: `<dataDir>/<campaign>/` + title-bar selector + migration of existing data; generalize the existing data-dir machinery | 1 d | [P] biggest data-model gap |
| 2.8 | Campaign backup/restore: `export_campaign` zip command (Rust `zip` crate) + import w/ confirm | 0.5 d | [N] no backup story today |
| 2.9 | Save portrait / right-click save image | 1 h | [U] |
**Done when:** two campaigns coexist with separate lore/history; the cast
and inventory are browsable surfaces, not just history rows.
## Phase 3 — Media & atmosphere → tag `v0.4.0` (~1.5 weeks)
| # | Item | Effort | Notes |
|---|------|--------|-------|
| 3.1 | Real ambience packs: 2–3 CC0 loops in `public/sounds/` (synthesis stays as fallback) + custom sound import (drag MP3 onto tile) | 1 d | [P][U] |
| 3.2 | Image advanced params: negative prompt, seed, aspect ratio, steps, guidance → sd-server passthrough + cache key includes them | 0.5 d | [U] |
| 3.3 | Image-gen into World Builder (region map art per landmark) | 0.5 d | [P] §16.10 |
| 3.4 | Image-gen into Encounter (battle map tile + loot item art) | 0.5 d | [P] §16.10 |
| 3.5 | Handout renderer: Markdown → styled handout → export PNG/PDF | 1 d | [P][U] last §15 M6 item |
| 3.6 | Dice tumble animation (CSS 2.5D — no three.js) | 0.5 d | [N] |
**Done when:** a full session can run without leaving the app: ambience,
maps, item art, handouts.
## Phase 4 — Distribution → tag `v1.0.0` (~1 week)
| # | Item | Effort | Notes |
|---|------|--------|-------|
| 4.1 | Cross-platform build matrix in Gitea CI (macOS/Windows/Linux) | 0.5 d | [P] |
| 4.2 | Finish code signing + notarization (macOS cert exists in `secrets/`; add Windows) | 1 d | [P] scripts + env already scaffolded |
| 4.3 | Auto-updater: `tauri-plugin-updater` + update manifest hosted beside Gitea releases | 1 d | [P] |
| 4.4 | i18n scaffolding: extract strings to `t()` (EN-only content for v1) | 1 d | [U] structure now, translations later |
| 4.5 | Final polish pass: glassmorphism consistency, `prefers-reduced-motion`, focus rings | 0.5 d | [P] §15 M6 |
| 4.6 | Tag `v1.0.0`, update README screenshots | 30 m | |
**Done when:** a DM who downloads v1.0 gets a signed app that updates itself.
## Phase 5 — Post-1.0 long tail (ordered by value)
| # | Item | Effort | Notes |
|---|------|--------|-------|
| 5.1 | Compendium: local SRD 5e JSON → stat-block popovers in Encounter + Initiative import | 2 d | [U] |
| 5.2 | Player view: LAN read-only web page (initiative, dice, HP) from the DM's screen | 2–3 d | [U][P] |
| 5.3 | Console mode dashboard: embed 2–3 chosen tools as live-session cards | 1 d | [U] |
| 5.4 | Draggable bento (`react-grid-layout`), persisted per campaign | 1 d | [U] |
| 5.5 | Voice-to-text session notes (whisper.cpp sidecar or audio-capable model) | 2 d | [P][U] |
| 5.6 | Session replay: record the bus event stream → timeline replay | 2 d | [U] builds on 1.4's event logging |
| 5.7 | AI auto-tagging of session entries (#combat/#loot/#roleplay) | 0.5 d | [N] |
| 5.8 | Lore embedding visualization (t-SNE scatter) | 1 d | [N] |
| 5.9 | True 3D dice (react-three-fiber) — only if 3.6's CSS tumble proves insufficient | 2 d | [N] |
| 5.10 | Plugin system: dynamically registered commands/content packs | 3 d+ | [P] |
| 5.11 | Prompt library + fine-tuning on campaign data | research | [P] |
---
## Ordering notes
- **0.2 before 1.2** — the wizard can't save what it configures until config persists.
- **1.1 before 2.1** — the Oracle wants streaming; both ride the same Channel plumbing.
- **2.7 before 5.x** — campaign namespacing changes the data layout; rosters,
backup, and replay should key on campaign from day one.
- **1.4 before 5.6** — replay is just a recording of the event stream 1.4 introduces.
- Rust tests + self-checks grow with each phase; CI (0.6) runs them all from day one.
**Totals to v1.0:** ~22 working days of focused effort
(1.5 + 5 + 6.5 + 5 + 4). Long tail adds ~15 days beyond that.