- 02-02-SUMMARY.md: documents render_markdown() pipeline, code block borders, GFM table grid, decisions, deviations - STATE.md: advance to plan 02 done, update decisions log (02-02 entries), resolve REND Widget trait blocker - ROADMAP.md: mark 02-02 complete (2/3 plans done for Phase 2)
3.7 KiB
Project State
Project Reference
See: .planning/PROJECT.md (updated 2026-02-28)
Core value: Users can connect via SSH and seamlessly browse a vault of linked markdown documents with retro BBS aesthetics Current focus: Phase 2 in progress — Plans 01-02 complete (vault core + highlighter + renderer)
Current Position
Phase: 2 of 4 (Vault Core and Rendering) — IN PROGRESS Plan: 2 of 3 in current phase (plans 01-02 done) Status: Phase 2 Plan 02 complete — Plan 03 (app integration + scrolling) next Last activity: 2026-02-28 — Plan 02 complete (renderer.rs with full markdown pipeline)
Progress: [█████░░░░░] 50%
Performance Metrics
Velocity:
- Total plans completed: 5
- Average duration: 2.6 min
- Total execution time: 0.21 hours
By Phase:
| Phase | Plans | Total | Avg/Plan |
|---|---|---|---|
| 01-safety-foundation | 3 | 7 min | 2.3 min |
| 02-vault-core-and-rendering | 2 | 6 min | 3.0 min |
Recent Trend:
- Last 5 plans: 2 min, 3 min, 2 min, 2 min, 4 min
- Trend: Stable
Updated after each plan completion
Accumulated Context
Decisions
Decisions are logged in PROJECT.md Key Decisions table. Recent decisions affecting current work:
- Pre-Phase 1: Verify
edition = "2024"compiles before changing to 2021 — leave it ifcargo buildsucceeds - Pre-Phase 1: Use pulldown-cmark event-based approach for markdown parsing (not comrak)
- Pre-Phase 1: No tokio/async runtime — synchronous event loop only
- Pre-Phase 2: Choose wiki-link parsing strategy before implementation (regex pre-pass vs post-parse interception)
- 01-01: Resolve relative vault_path against config file parent dir (not cwd) — bbs.toml lives next to binary
- 01-01: detect_login_shell() called before parse_cli() — both read argv[0], parse_cli strips the dash
- 01-02: Use ratatui::crossterm re-export path — crossterm is transitive dep, not direct dep in Cargo.toml
- 01-02: SIGINT not registered via signal-hook — crossterm key events handle double-press Ctrl+C in Plan 03
- 01-02: restore_terminal() skips ratatui::restore() — that would call LeaveAlternateScreen (never entered)
- 01-03: show_goodbye() called after restore_terminal() — terminal must be in cooked mode before println! is safe
- 01-03: app_config stored in App struct for Phase 2 access — vault_path accessible inside event loop
- 01-03: Quit prompt cleared on any non-Ctrl+C key — pressing any key dismisses double-press window
- 02-01: LinesWithNewlines iterator added to preserve trailing \n for syntect grammar correctness
- 02-01: mod declarations added to main.rs during Plan 02 (not Plan 03) — compiler needs them to check renderer.rs
- 02-01: syntect default-fancy feature uses pure-Rust fancy-regex (avoids Oniguruma C lib)
- 02-02: Full emit_code_block and emit_table written in Task 1 (not stubs) — avoids throwaway code
- 02-02: Box width for code blocks capped at terminal width — prevents border overflow on long lines
- 02-02: Table n_cols derived from max(alignments.len(), max row length) — handles malformed GFM tables
Pending Todos
None.
Blockers/Concerns
- REND blocker resolved: renderer.rs uses no Widget trait at all —
render_markdown()returnsVec<Line<'static>>which Plan 03 passes toParagraph::new(). No custom Widget needed. - NAV: Path traversal via wiki-links must be addressed in Phase 3 link resolver — canonicalize and prefix-check every resolved path
- LIVE: notify 8.x API must be verified at integration time; watch only current file (not full vault) to avoid inotify exhaustion
Session Continuity
Last session: 2026-02-28 Stopped at: Completed 02-02-PLAN.md — renderer.rs created, cargo check clean Resume file: .planning/phases/02-vault-core-and-rendering/02-03-PLAN.md