heph-tui + PWA cosmetic polish: humanized recurrence, scrolling/indented/counted project sidebar #10

Merged
eblume merged 2 commits from feature/tui-polish-project-tree into main 2026-06-06 09:29:11 -07:00
Owner

Summary

Bundles the outstanding cosmetic/UI-polish tasks for the agenda surfaces into one PR. All changes are read-side / display-only — no SQLite migration and no op-log change (see the new explanation card for why this is safe in the hub/spoke deployment).

  • Humanized recurrence (§8.1): the TUI detail line and the PWA both showed raw RRULEs (FREQ=WEEKLY;INTERVAL=2); now they render every other week, weekdays, every Fri, yearly on Apr 15, etc. Falls back to the raw rule for anything unmodeled (COUNT/UNTIL/…). New humanize_rrule is the inverse of the existing parse_recurrence, mirrored in datespec.js.
  • Sidebar scroll fix: the views+projects pane now scrolls (ListState + scrollbar) instead of clipping on overflow.
  • Project tree: subprojects (existing parent links) render indented, each project shows its outstanding-task count, and the sidebar tab is widened to fit. Backed by a new read-only project.overview RPC (parent + count), no schema change.
  • Doc: explanation/hub-spoke-data-evolution.md — when op-based sync skips migrations vs. when a coordinated SQLite-column migration is actually required.

Testing

  • cargo test (heph-core, hephd, heph-tui)
  • node --test heph-pwa/test
  • prek run --all-files
  • manual: TUI sidebar with a nested project + a recurring task; PWA recurrence display

🤖 Generated with Claude Code

## Summary Bundles the outstanding cosmetic/UI-polish tasks for the agenda surfaces into one PR. All changes are **read-side / display-only** — no SQLite migration and no op-log change (see the new explanation card for why this is safe in the hub/spoke deployment). - **Humanized recurrence** (§8.1): the TUI detail line and the PWA both showed raw RRULEs (`FREQ=WEEKLY;INTERVAL=2`); now they render `every other week`, `weekdays`, `every Fri`, `yearly on Apr 15`, etc. Falls back to the raw rule for anything unmodeled (COUNT/UNTIL/…). New `humanize_rrule` is the inverse of the existing `parse_recurrence`, mirrored in `datespec.js`. - **Sidebar scroll fix**: the views+projects pane now scrolls (ListState + scrollbar) instead of clipping on overflow. - **Project tree**: subprojects (existing `parent` links) render indented, each project shows its outstanding-task count, and the sidebar tab is widened to fit. Backed by a new read-only `project.overview` RPC (parent + count), no schema change. - **Doc**: `explanation/hub-spoke-data-evolution.md` — when op-based sync skips migrations vs. when a coordinated SQLite-column migration is actually required. ## Testing - [ ] `cargo test` (heph-core, hephd, heph-tui) - [ ] `node --test heph-pwa/test` - [ ] `prek run --all-files` - [ ] manual: TUI sidebar with a nested project + a recurring task; PWA recurrence display 🤖 Generated with [Claude Code](https://claude.com/claude-code)
doc(explanation): hub+spoke data-evolution / migration rules
All checks were successful
Build / validate (pull_request) Successful in 6m18s
00da36c637
Document why heph's op-based sync lets most new features (new link types,
read-side queries, optional payload fields) ship without a coordinated
migration across the hub and spokes, and the narrow case — a new required
SQLite column the apply path writes — that does need a hub-first rollout.

Groundwork for the indented/counted project sidebar, which is pure read-side
(existing parent links + a GROUP BY) and needs no migration.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(heph-tui,heph-pwa): humanized recurrence + indented/counted/scrolling project sidebar
All checks were successful
Build / validate (pull_request) Successful in 6m57s
9a487cbe3b
Bundles the cosmetic/UI-polish backlog for the agenda surfaces. All read-side;
no schema or sync change (see hub-spoke-data-evolution).

- humanize_rrule (hephd::datespec): inverse of parse_recurrence — renders an
  RRULE as 'every other week', 'weekdays', 'yearly on Apr 15', etc.; falls back
  to the raw rule for unmodeled parts (COUNT/UNTIL/ordinal BYDAY). Mirrored in
  the PWA's datespec.js. Shown in the TUI recurs detail line and PWA task/qa
  previews instead of the raw FREQ= string.
- project.overview RPC + Store::project_overview: each project's parent (via the
  existing 'parent' links) and direct outstanding-task count, a read-only query.
- TUI sidebar: subprojects indented by depth, per-project counts, wider pane,
  and ListState + scrollbar so it scrolls instead of clipping on overflow.

Tests: humanize parity (Rust + JS), round-trip through parse_recurrence,
raw-passthrough; project_overview count/parent; sidebar tree ordering + cycle
safety.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
eblume merged commit b2ddb41a46 into main 2026-06-06 09:29:11 -07:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
eblume/hephaestus!10
No description provided.