Status: implemented. T1–T3 (the std-only
loope::hubcore: registry, project/ session/search, the cell model) are built, unit-tested, and shipped (deps = 1). T4–T8 (thesrc-tauri/desktop app: scaffold, live run bridge, session/project management, config editor + presets, convergence card) are built as an independent, separately packaged crate. The desktop crate needs the Tauri toolchain to compile and is not built in the core's CI.
Implementation plan for [[2026-06-29-loope-desktop-hub-spec]]. The work is sequenced so the
std-only core lands and is tested before any GUI exists, then the desktop app is built
on top of it. Each task is a coherent, independently verifiable unit. The loope crate
stays deps = 1 throughout; the desktop app is a separate workspace member with its own
dependencies, introduced only in T3.
Convention reminder: after any change to commands/flags/options/run-dir layout, update
docs/guide/usage.md and the README in the same change.
Restructure into a Cargo workspace and stand up the shared brain.
- Establish the workspace without moving files: add a
[workspace]table to the existing rootCargo.toml, so theloopecrate at the repo root is the workspace root (a root-package workspace; the desktop app joins later asapps/desktop, depending onloopeby path). Verify the CLI/TUI build, test, andcargo install --path .exactly as before;depsforloopestays 1. - Add the
loope::hubmodule group with:registry.rs—AgentDescriptor,Capabilitiesbitset,AgentRegistrywith cacheddetect()(availability + version), generalizing today'sdoctorprobing.store.rs— the~/.loope/metadata store (atomic JSON read/write; create on first use), holding projects, session names, presets, app state.
- Unit tests: registry detection + cache TTL (with an injected prober), store round-trip.
- Verify:
loopecrate builds/tests/clippy green in both feature configs; deps = 1.
project.rs—Project(source path + aggregated sessions); discovery merging~/.loope/projects.jsonwith.loope/runsfound under known roots; add/remove/hide.session.rs—SessionoverNNNN-slugruns: list grouped by project, friendly naming, resume affordance (locate the run dir + its config for a follow-up).search.rs— full-text scan of persisted run artifacts (result,transcript,events.jsonl) returning ranked matches with a preview + jump target.- Unit tests over fixture
.loope/runstrees: discovery, grouping, naming, search ranking. - Verify: core green; no new deps.
The single source of truth for all surfaces.
- Extend the normalized vocabulary from flat
LoopEventinto theCellmodel (ExecCommandwith running/done/failed state + exit code,Diffwith hunks,Markdown,Reasoning,ActionLine,Notice). Keep back-compat: today'sLoopEvents map onto cells; persistence (events.jsonl) round-trips the new kinds. - Extend the adapter parsers to populate the richer kinds (exec output, diff hunks, reasoning) the CLIs already emit; existing parser tests stay green.
- Golden tests: adapter JSONL fixtures → expected cell sequences.
- Keep the ratatui TUI compiling against the extended model (it may ignore new kinds for now); its snapshot tests stay green.
- Verify: core + TUI green; round-trip + golden tests pass; deps unchanged.
First introduction of the GUI stack, isolated under apps/desktop/.
- Scaffold the desktop application (native backend
src-backend/depending onloopeas a path dep; component-based front-endsrc-ui/). Its own lockfile/deps; not part of the rootcargo builddefault. - Implement the Liquid Glass design system from [[2026-06-29-loope-liquid-glass-design-spec]]
as reusable tokens/components (glass tiers, specular/sheen/elevation, accent/agent/state
colors, vibrancy text, motion) — light/dark themes, reduced-motion + no-
backdrop-filterfallbacks; the app shell (glass title bar, theme switch, nav). - A first backend IPC command: list agents from
AgentRegistry→ render theAgentSwitcherwith ✓/✗/version + install hints. Proves the backend → core → UI path end to end. - Verify: the app launches and shows real detected agents; the
loopecrate is untouched (deps = 1).
The heart: present the plan and the content live.
- Backend event forwarder: a
StepObserverimpl that serializes engine events/cells and emits them to the webview (the GUI analogue ofTuiObserver); aruncommand that spawns the executor on a worker thread and streams. - Front-end: the streaming store (reduces deltas into the active cell, commits on complete);
HistoryView+ per-cell components (ExecCell,DiffCell,MarkdownCell,ReasoningCell,ActionCell,NoticeCell) with compact/expanded forms. PipelinePanelvisualizes the plan: chosen agents,implement → review → verifyper iteration, convergence;RunControlsstart/stop (reusing the engine's cooperative cancel).- Tests: the forwarder against synthetic
StepOutcomes; the store reducer + each cell component against fixture cell streams. - Verify: a real loop runs from the GUI and renders live as pipeline + typed cells.
ProjectList+SessionList(grouped by project, friendly names, resume) over the T2 core; the browser route: project → session → its pipeline + cells + diff.- Full-text search box wired to
search.rs, with result previews and jump-to. - Verify: browse + search work over real
.loope/runs.
config.rs(core):LoopOptionspresets — save/switch/backup/restore in~/.loope/presets.json.ConfigForm+PresetManager(front-end): every loop option as a field; the agent switcher feeds implementer/reviewer roles; backup before edits, one-click restore.- The form produces the same
LoopConfigthe engine consumes. - Verify: edit options + presets, run with them, restore a backup.
- The
caught & fixedhighlight (already in core) becomes theConvergenceCardhero on a successful run; empty/error/loading states across views. - Full verification:
loopecrate green (build/test/clippy, both feature configs, deps = 1); desktop app builds and runs through a full loop; component + core test suites pass. - Docs: a "Loope Desktop" section in
docs/guide/usage.md(what it is, how to build/run, data locations), README updates (feature blurb + this SDD pair under "SDD artifacts"), anddocs/README.mdindex entry.
- T1–T3 are pure core and ship value to the CLI/TUI too (registry, projects, search, richer cells) — they can land and be reviewed before any GUI decision is locked.
- T4 is the only task that introduces the GUI dependency tree, and it is quarantined to
apps/desktop/. If the desktop direction ever changes, T1–T3 remain useful. - Each task keeps the
loopecrate atdeps = 1and the existing CLI/TUI suites green.
- Spec: [[2026-06-29-loope-desktop-hub-spec]]
- [[2026-06-29-loope-tui-spec]] · [[2026-06-28-loope-live-visibility-spec]] · [[2026-06-29-loope-convergence-highlight-spec]]