docs: repo review + master roadmap
This commit is contained in:
+119
@@ -0,0 +1,119 @@
|
||||
# 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)
|
||||
|
||||
| # | Item | Effort | Notes |
|
||||
|---|------|--------|-------|
|
||||
| 0.1 | Scrub PII from `scripts/apple-signing.env.example` | 5 m | [R] real email + Team ID still present |
|
||||
| 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 |
|
||||
| 0.3 | RAG: UTF-8 boundary fix in `chunk()` + test with accented text | 1 h | [R] multibyte paragraphs silently drop chunks today |
|
||||
| 0.4 | RAG: `DELETE WHERE source = ?` before re-insert in `add_document` | 15 m | [R] re-adding a file doubles its chunks |
|
||||
| 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 |
|
||||
| 0.6 | `npm run check` + `.gitea/workflows/ci.yml` (lint, tsc, checks, `cargo test`) | 2 h | [R][P] |
|
||||
| 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] |
|
||||
| 0.8 | Minimal CSP in `tauri.conf.json` (self + `data:` img; check dev HMR) | 30 m | [R] |
|
||||
| 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.
|
||||
|
||||
## Phase 1 — Core UX enablers → tag `v0.2.0` (~1 week)
|
||||
|
||||
| # | Item | Effort | Notes |
|
||||
|---|------|--------|-------|
|
||||
| 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 |
|
||||
| 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" |
|
||||
| 1.3 | `ragQuery` on Encounter, Quest, Session summary | 30 m | [N] NPC/Item/World already pass it |
|
||||
| 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 |
|
||||
| 1.5 | NPC → Initiative push ("⚔ Add to tracker" on NPC card via `AddCombatants` bus event; stats already generated) | 30 m | [N] |
|
||||
| 1.6 | Calendar "Next day" → session-log entry incl. rolled weather | 1 h | [N] ties calendar into the timeline |
|
||||
| 1.7 | Dice macros: persisted named rolls (`usePersistentState`), button row + edit sheet | 2 h | [U P3] |
|
||||
| 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.
|
||||
|
||||
## 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.
|
||||
Reference in New Issue
Block a user