Skip to content

feat(explorer): v0.8.7–v0.8.9 — workspace frame, command palette, live workspace - #60

Merged
tcballard merged 23 commits into
mainfrom
claude/happy-hypatia-otfzro
Jun 11, 2026
Merged

feat(explorer): v0.8.7–v0.8.9 — workspace frame, command palette, live workspace#60
tcballard merged 23 commits into
mainfrom
claude/happy-hypatia-otfzro

Conversation

@tcballard

@tcballard tcballard commented Jun 11, 2026

Copy link
Copy Markdown
Collaborator

Summary

Implements rac/roadmaps/v0.8.x-explorer/v0.8.7-explorer-visual-overhaul.md, rac/roadmaps/v0.8.x-explorer/v0.8.8-explorer-command-palette.md, and rac/roadmaps/v0.8.x-explorer/v0.8.9-explorer-live-workspace.md. The branch carries three unmerged releases: v0.8.7 is the workspace frame, v0.8.8 the command surface and reading flow built on it, and v0.8.9 makes the workspace live — the Explorer follows the filesystem and invalid artifacts explain themselves in place.

Adds:

  • One persistent workspace frame (sidebar, context panel, status line, app bar) replacing the screen-per-view shell; views swap in place and Esc unwinds history (v0.8.7)
  • A summoned command palette on / — empty input lists the registry, a prefix filters and completes commands, other text quick-opens artifacts (v0.8.8)
  • Interactive /settings editing explorer.json in place: theme with live preview, mascot, animations, grouping, and a new editor preference with terminal-editor suspend/resume (v0.8.8)
  • First-class reading: focused, scrollable Content tab with capped width; artifact references in rendered Markdown navigate in-app with history; tab count badges (v0.8.8)
  • Mascot frame-sequence animation engine (placeholder art; future frames are data-only drops) (v0.8.8)
  • Live reload: a 2-second path/mtime scan (no parsing, no new dependency) reloads on change, preserving the sidebar, the open artifact's tab, and its scroll position; the watcher holds during terminal-editor suspension and rescans on resume (v0.8.9)
  • Validation drill-down: health attention items land on the artifact's Inspection tab (badged with its diagnostics count); recommendations land on its Findings tab (v0.8.9)
  • Improvement suggestions from rac improve on the Findings tab — one row per missing section with the schema's guidance question; rendered, never applied (v0.8.9)
  • Command-surface depth: /schema [type], recent artifacts in the palette's empty state, and an f-cycled type filter on artifact results (v0.8.9)
  • The rac-lantern theme as default; tests, fixtures, docs, and changelog for all three releases

Roadmap / ADR Trace

Roadmap:

  • rac/roadmaps/v0.8.x-explorer/v0.8.7-explorer-visual-overhaul.md
  • rac/roadmaps/v0.8.x-explorer/v0.8.8-explorer-command-palette.md
  • rac/roadmaps/v0.8.x-explorer/v0.8.9-explorer-live-workspace.md

Relevant ADRs:

  • rac/decisions/adr-015-explorer-as-consumer.md — every v0.8.9 surface consumes an existing Core service (validate, improve, core.schema, core.fs); the adapter remains the only boundary and no Core or service module changed
  • rac/decisions/adr-023-clean-break-internal-refactors.mdwidgets/commandbar.py deleted, not shimmed
  • rac/decisions/adr-024-rac-not-content-store.md — Explorer writes only explorer.json; improvement suggestions are rendered, never applied
  • rac/decisions/adr-028-explorer-surface.md — every state keeps a text label under any palette

Scope

Included

  • Sidebar: type-tagged artifact tree (grouped or flat), titles over IDs, validity markers, expansion/cursor preserved across reloads, e opens in editor
  • Palette: full registry listing, prefix completion, quick-open with search fallback, and per-repository recent artifacts (limit 8, additive workspace JSON) offered before a character is typed
  • Settings view persisting every change via save_preferences; editor resolution order is preference → $VISUAL$EDITOR; known terminal editors run under App.suspend()
  • Content tab takes focus on open, j/k/PgUp/PgDn scrolling, link resolution via adapter.open_ref with unresolvable-link reporting
  • Live watcher: never runs before the first successful load or after a load error; a change debounces into the existing exclusive load worker; an open artifact that disappears falls back home; manual r also refreshes the visible view in place now
  • Validation drill-down, Improvement findings group, /schema, results type filter — the full v0.8.9 contract

Excluded

  • Artifact creation (/new) — deferred pending an ADR-024 write-boundary review
  • Stats/portfolio view — candidate for v0.8.10
  • Diff views, bulk operations, relationship graph visualization
  • Third-party filesystem watching (watchfiles, inotify) — the stdlib mtime scan is the pinned design point for repositories of this corpus's scale
  • Final mascot artwork — frames arrive separately as data

Product / Architecture Decisions

  • The palette is a MainScreen widget on a CSS layer (display: none when idle), not a pushed screen — the screen stack still carries only the confirm-write modal
  • The persistent command bar is removed outright rather than hidden (ADR-023); / reclaims two content rows
  • The watcher fingerprint reuses find_markdown_files — the loader's own discovery — so watch and load can never disagree about which files count; the baseline is snapshotted before each load, so a save landing mid-load is caught by the next tick and converges
  • Textual 8.x keeps suspend signals private, so the watcher pause is explicit: launch_editor calls duck-typed pause_watching/resume_watching screen hooks around App.suspend() (a MainScreen import there would be circular)
  • Improvement analysis runs on artifact open only, never during repository load; unreadable-mid-edit files degrade to review-only findings rather than erroring
  • The results type filter is presentation state over rows the search already returned — no second query path
  • Preferences.editor defaults to the empty string and Workspace.recent_artifacts is an additive JSON key, so existing config and state files load unchanged

User-Facing Contract

CLI

No CLI command surface changes. Entry point remains:

rac explore [directory]

Human Output (Explorer)

  • / summons the palette (recents above the registry when history exists); Esc dismisses; ? opens help
  • /settings (alias preferences) edits theme, mascot, animations, grouping, editor in place
  • /schema lists artifact types; /schema decision (any registered type) renders required/recommended/optional sections with descriptions and metadata values
  • Saving an artifact in an external editor updates the open Explorer within ~2 seconds, no keystroke
  • Attention items open on Inspection (badged), recommendations on Findings; f cycles the type filter on artifact results (status-line chip added)
  • Status chips use one casing: ✓ Valid, ! Warning, ✗ Error; default theme is rac-lantern

JSON Output

No JSON contract movement. explorer.json gains the additive editor field; explorer-workspace.json gains the additive recent_artifacts map (per repository, newest first, capped at 8). Files written by earlier versions load unchanged.

Exit Codes

Unchanged.

Verification

Ran

pytest --ignore=tests/test_ingest.py   # 820 passed
ruff check .
rac validate rac/                       # PASS — 84 valid, 0 invalid
rac relationships rac/ --validate       # 0 issues (150 checked)
rac review rac/                         # no priority 1–2 findings

tests/test_ingest.py was excluded only in the development container, where a pre-existing cryptography wheel incompatibility breaks docx ingestion imports; the exclusion is unrelated to this diff.

Covered

  • Watcher: fingerprint reacts to edit/add/remove and ignores non-Markdown and dotted dirs; a disk change reloads and updates the summary; the open artifact refreshes in place; a deleted open artifact falls back home; paused and error states stay quiet; resume scans immediately
  • Drill-down: attention → Inspection tab with diagnostics visible; recommendation → Findings tab; Inspection badge counts diagnostics
  • Improvements: sparse requirement yields per-section suggestions with guidance actions; empty before load and for unknown paths
  • Command surface: /schema overview and detail, unknown-type message; palette recents appear and Enter reopens; f cycles all → type → type → all with a live count line; registry contract re-pinned for v0.8.9
  • Plus the v0.8.7/v0.8.8 batteries: palette completion and focus, settings round-trips, reading focus/scroll/links, Esc history, resume, mascot timer

Review Path

  1. src/rac/explorer/screens/main.py — the watcher (tick → scan worker → debounced reload → in-place view refresh) and command routing
  2. src/rac/explorer/adapter.pyfingerprint, improvement_rows, schema_overview/schema_detail, recent_rows
  3. src/rac/explorer/widgets/views.py — drill-down landing tabs, Inspection badge, the filterable ResultsView, watcher pause hooks in launch_editor
  4. src/rac/explorer/widgets/palette.py and workspace.py — recents
  5. tests/test_explorer_app.py (watcher, drill-down, command-surface sections) and tests/test_explorer_adapter.py / test_explorer_workspace.py
  6. docs/cli.md, the four design artifacts, CHANGELOG.md, and the three roadmap contracts

Notes For Reviewer

  • tests/test_explorer_app.py is the single battery absorbing all three releases; the v0.8.9 sections are at the end of the file
  • The watcher's reload path is the existing exclusive repository-load worker, so manual r, watch-triggered reloads, and load-error recovery share one code path
  • A reload racing an in-progress save can render a half-written artifact for one cycle; the next tick re-detects and converges (pinned as an accepted risk in the v0.8.9 contract)
  • Mascot frames are placeholders; final art replaces FRAMES data and nothing else

Implementation Process

Implemented with AI assistance under the roadmap contracts. Final scope, review, and acceptance decisions were made by the maintainer.

tcballard added 22 commits June 10, 2026 22:23
Implements rac/roadmaps/v0.8.x-explorer/v0.8.7-explorer-visual-overhaul.md.

Scopes the Explorer visual overhaul: one persistent workspace frame
(app bar, titled rounded panels, key-chip status line), a type-tagged
navigation sidebar, an always-visible command bar, a tabbed artifact
context that renders the document's Markdown, and the rac-lantern
default theme derived from the mascot palette. Rewrites the
explorer-visual-system design with the canonical frame, depth model,
spacing, accent, focus, theme, and content rules; updates the
command-surface design for the persistent bar.
Implements rac/roadmaps/v0.8.x-explorer/v0.8.7-explorer-visual-overhaul.md.

Collapses the per-view screen stack into one MainScreen: app bar,
type-tagged navigation sidebar (lazy Tree over the loaded model), a
tabbed artifact context (Content renders the document's Markdown,
read-only per ADR-024; Inspection, Links, and Findings absorb the old
context, relationship, and per-artifact finding views), an
always-visible command bar, and a key-chip status line. Views swap
inside the context region via ContentSwitcher with history-backed Esc;
the screen stack survives only for the confirm-write modal.

Ships the rac-lantern theme (lantern amber on near-black, from the
mascot palette) as the curated default — the theme preference still
selects any Textual theme — and moves styling to a packaged TCSS
stylesheet. The adapter gains one additive artifact_markdown accessor
(ADR-015 boundary preserved); adapter routing, state, and the command
registry are otherwise unchanged. The retired screens are deleted
(clean break, ADR-023).
… bar [roadmap:v0.8.7]

Implements rac/roadmaps/v0.8.x-explorer/v0.8.7-explorer-visual-overhaul.md.

Reworks the headless app battery from screen-type assertions to
view-presence on the persistent frame, keeping key sequences as the
behaviour contract. New coverage: frame persistence across navigation,
focus routing (slash from anywhere, Esc restoration, typed q/slash
inside the bar), sidebar type tags, lazy groups, reveal sync and flat
grouping, the tabbed context (Markdown content by default, Links
traversal with history-backed Esc, text-bearing tab labels), results
rendering in the context region, status-line chips per focused panel,
the rac-lantern default theme and its preference override, the
narrow-terminal sidebar, the packaged stylesheet, and tree scale at
1200 artifacts.
…map:v0.8.7]

Implements rac/roadmaps/v0.8.x-explorer/v0.8.7-explorer-visual-overhaul.md.

Updates the explorer section of docs/cli.md for the persistent frame:
sidebar with type tags, the tabbed artifact context with rendered
Markdown, the always-visible command bar, the new Esc/Tab focus model,
and the rac-lantern default theme.
Implements rac/roadmaps/v0.8.x-explorer/v0.8.7-explorer-visual-overhaul.md.
Implements rac/roadmaps/v0.8.x-explorer/v0.8.7-explorer-visual-overhaul.md.

The Content tab now renders the Markdown body only, splitting the
leading YAML frontmatter with Core's parser. Identity metadata already
lives in the panel title, the sidebar type tag, and the Inspection tab,
so repeating it above the document was noise against the content-focus
rule.
…dmap:v0.8.7]

Implements rac/roadmaps/v0.8.x-explorer/v0.8.7-explorer-visual-overhaul.md.

The sole screen-stack surface becomes a true modal: a titled rounded
panel (accent border, 'Write <target>') centred over the dimmed frame,
with a scrollable preview and the same inverse-video key chips the
status line uses (extracted as a shared key_chips helper). The preview
renderer drops its embedded heading and key-hint lines — hints now live
in the chips and status line, never in panel text. Write semantics are
unchanged: y confirms, never overwrites; Esc cancels (ADR-024).
Implements rac/roadmaps/v0.8.x-explorer/v0.8.8-explorer-command-palette.md.

Scopes the follow-up milestone: the persistent command bar gives way to
a summoned palette (input on top, navigable live suggestions below),
settings become interactive with a default-editor preference and
terminal-editor suspend, the mascot gains frame-sequence animation, the
Content tab becomes scrollable with navigable artifact links, and a
refinement pass lands (sidebar titles + validity markers, no Esc
dead-ends, hint/border de-dup, calm states, identity details). Updates
the command-surface, visual-system, editor-integration, and
mascot-animation designs accordingly and marks the deferred editor
follow-up as landing.
Implements rac/roadmaps/v0.8.x-explorer/v0.8.8-explorer-command-palette.md.

The persistent command bar gives way to a summoned palette floating
over the context region: an input on top and a live, navigable menu
below it. Empty input lists the command registry; a command prefix
filters it; any other text shows quick-open artifact matches plus a
'search all results' row. Up/down drive the menu while typing stays in
the input; Enter completes argument-taking commands, runs argless ones,
opens a highlighted match, or routes bare text as before; Esc dismisses
and restores the previous focus. The idle frame carries no input
chrome — the status line's / chip advertises the palette. Routing and
the registry are unchanged; the command bar widget is deleted (clean
break, ADR-023).
…oadmap:v0.8.8]

Implements rac/roadmaps/v0.8.x-explorer/v0.8.8-explorer-command-palette.md.

/settings (with 'preferences' kept as a routing alias) opens an
interactive view that edits Explorer's own configuration in place:
theme cycles the registered Textual themes with live preview, mascot
and animations toggle, artifact grouping flips between type and flat
(the sidebar follows immediately), and a new editor preference takes a
typed command. Editor resolution becomes preference, then $VISUAL,
then $EDITOR; terminal editors (vi, vim, nvim, emacs, nano, helix,
micro) run in the foreground with the application suspended and
resumed, falling back to guidance where the session cannot suspend.
Explorer writes explorer.json only — never artifacts (ADR-024). Lands
the deferred editor follow-up from the v0.8.x series.
Implements rac/roadmaps/v0.8.x-explorer/v0.8.8-explorer-command-palette.md.

Each mascot state becomes a sequence of equal-width frames cycled on a
slow timer by the home view, which now owns the mascot in its own
widget above the summary panel. The searching sequence plays while the
repository loads; welcome keeps discovery, empty repositories keep the
empty state, and everything else hides the mascot. Frames only advance
while the mascot is visible and animations are enabled; with animations
off the first frame holds, and every figure still carries its text
label (ADR-028). Artwork is data: future frames replace the FRAMES
strings and nothing else.
…roadmap:v0.8.8]

Implements rac/roadmaps/v0.8.x-explorer/v0.8.8-explorer-command-palette.md.

Reading becomes first-class: the Content pane takes the keyboard on
open and scrolls with j/k alongside the stock keys, the reading
position resets per artifact, left/right switch tabs from anywhere in
the context view, and the Markdown column is capped near 96 cells for
readability. Artifact references inside the rendered document are
walkable hypertext — activation resolves through the adapter (IDs,
aliases, relative paths, then the file stem) and navigates with the
same Esc-backed history as any open; unresolvable links report instead
of failing. Links and Findings tabs carry count badges.
Implements rac/roadmaps/v0.8.x-explorer/v0.8.8-explorer-command-palette.md.

Sidebar: rows lead with the human title (the opaque ID lives in the
context panel and Inspection tab), invalid artifacts carry the ✗ marker
beside the type tag, group counts align, expansion and cursor survive
reloads, and e opens the highlighted artifact in the editor. Esc never
dead-ends — with no history it returns home — and resume now restores
the last view (health, recommendations) as well as the last artifact.
Chip casing is one style everywhere (✓ Valid / ✗ Error / ! Warning);
panel-text key hints and inner border titles the chips and region
border already carry are gone; the results panel states its count and
zero matches show the mascot's calm empty state; ? opens help. The app
bar trims local-build version suffixes and contracts home paths to ~;
the welcome and loading states compose centred; scrollbars go quiet —
the accent never rides a scrollbar.
…dmap:v0.8.8]

Implements rac/roadmaps/v0.8.x-explorer/v0.8.8-explorer-command-palette.md.

Updates the explorer section of docs/cli.md for the summoned palette
(live suggestions, completion, quick-open), interactive /settings with
the editor preference and terminal-editor suspend, the reading flow
(scrollable Content tab, navigable in-document references, tab
badges), the refreshed sidebar, and the new Esc/? keys. The README
gains a hero screenshot of the Explorer over RAC's own corpus.
Implements rac/roadmaps/v0.8.x-explorer/v0.8.8-explorer-command-palette.md.
Implements rac/roadmaps/v0.8.x-explorer/v0.8.9-explorer-live-workspace.md.

Scopes:
- live repository reload via stdlib mtime watching
- validation drill-down on the Inspection tab
- improvement suggestions on the Findings tab
- schema command, palette recents, filterable results

Defers /new (ADR-024 review) and the stats view to later items.
…0.8.9]

Implements rac/roadmaps/v0.8.x-explorer/v0.8.9-explorer-live-workspace.md
(Initiative 1).

A 2-second interval compares a cheap path/mtime fingerprint (the same
find_markdown_files discovery the loader uses, no parsing) against the
last load's baseline and reloads on change, preserving the open artifact,
its tab and scroll position, and the sidebar. The watcher never runs
before the first successful load or after a load error, pauses while a
terminal editor owns the screen, and rescans the moment it returns. An
open artifact that disappears falls back home. Manual reload now also
refreshes the visible view in place.
…v0.8.9]

Implements rac/roadmaps/v0.8.x-explorer/v0.8.9-explorer-live-workspace.md
(Initiative 2).

A health attention item now opens its artifact on the Inspection tab,
where the validation diagnostics already explain the problem; a
recommendation opens on the artifact's Findings tab. The Inspection tab
carries a diagnostics count badge alongside the Links and Findings
badges, so an invalid artifact announces its reason before the tab is
visited.
…v0.8.9]

Implements rac/roadmaps/v0.8.x-explorer/v0.8.9-explorer-live-workspace.md
(Initiative 3).

Opening an artifact whose type the improve service supports adds an
Improvement group to its Findings tab: one row per missing section, the
schema's first guidance question as the action, and the Findings badge
counting them with the review findings. Analysis runs on artifact open
only — never during the repository load — and the Explorer renders
suggestions without ever applying them (ADR-024).
Implements rac/roadmaps/v0.8.x-explorer/v0.8.9-explorer-live-workspace.md
(Initiative 4).

Adds three palette and results refinements:
- /schema [type] — bare lists every registered artifact type with a
  structure summary; with a type it renders the expected sections from
  the core schema registry (ADR-015), so the 'what does a decision need'
  question never leaves the Explorer.
- Recent artifacts — the workspace records the last eight artifacts
  opened per repository (additive JSON; older state files load
  unchanged), and the palette offers them above the command registry
  before a character is typed; Enter reopens one.
- Filterable results — artifact results gain a type filter cycled with
  f (all → each type present → all), presentation state only over rows
  the search already returned, with a count line and a status-line chip.
…dmap:v0.8.9]

Implements rac/roadmaps/v0.8.x-explorer/v0.8.9-explorer-live-workspace.md
(documentation).

Updates the explorer CLI reference for live reload, the validation
drill-down, improvement suggestions, /schema, palette recents, and the
results type filter; extends the command-surface, health-model,
recommendations, and editor-integrations design artifacts to match.
@tcballard tcballard changed the title feat(explorer): v0.8.7 + v0.8.8 — workspace frame, command palette, settings, reading flow feat(explorer): v0.8.7–v0.8.9 — workspace frame, command palette, live workspace Jun 11, 2026
…:v0.8.9]

Annotates the parameters mypy flagged (schema reference, palette row,
editor launcher widget, lookup state) and corrects the view-history
annotation to the (view, path) tuples it has stored since v0.8.7.
No behaviour change; CI lint gate is the driver.
@tcballard
tcballard merged commit e423caa into main Jun 11, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant