[EPIC] Spawn dialog rework: presets, recents, generated names #21

Closed
opened 2026-06-20 14:38:57 +01:00 by naps62-yolo · 1 comment
Collaborator

Rework the web spawn form from raw text boxes into a low-friction, tile-first experience. The form is functionally complete but every field is typed from memory; the goal is one click per field, zero typing in the common case, with raw input demoted to a "none of the above" escape hatch.

Decisions (locked)

  • Scope: shared-logic + web. Presets/recents/name-gen live as shared/daemon-backed data the web consumes now and the TUI adopts later; TUI keeps its minimal modal this round.
  • Recents: durable per-host spawn-history log with a recency cap (default 30 days). Survives kills + daemon restarts.
  • Presets: built-in defaults (claude/opencode/zsh/custom) overridable via [spawn].presets in config.
  • Worktree: infer base_repo from the selected dir; user types only the branch (checkout path stays daemon-auto-generated).

Architecture context

Same topology as NAP-329 (spawn dir autocomplete): web SPA → home daemon (or registry in dev) which brokers cross-daemon ops to the owning daemon over the registry control link. Anything reaching the host you spawn on mirrors the create/kill/ListDir plumbing end to end. CreateSessionRequest/WorktreeSpec wire types are unchanged — the client fills inferred base_repo from the gitroot probe.

Children (dependency order)

Backend / shared (unblocks web):

  1. #22 — [spawn].presets config schema + resolution
  2. #23 — maestro-names shared name generator
  3. #24 — durable spawn history + recent-dirs query
  4. #25 — gitroot walk-up probe
  5. #26 — protocol types + relay + daemon HTTP (depends on 3, 4)

Web:
6. #27 — spawn form revamp: tiles + recents picker + worktree-by-branch + generated name (depends on 1, 5; uses 2)
7. #28 — "Spawn similar" action + e2e (depends on 6)

UX shape

Host     [ ▣ this-host ] [ desktop ] [ phone ] [ More ]
Command  [ Claude ] [ opencode ] [ Shell ] [ Custom… ]
Working dir
  ◉ ~/git/maestro      (claude · 2h ago)
  ○ ~/git/dotfiles     (zsh · yesterday)
  ○ Other directory…  → raw input + autocomplete
☐ Git worktree   Branch [____]   repo: ~/git/maestro (inferred)
Name [ neon-drifter ] ↻

Out of scope

TUI rich form (later ticket), attach/kill changes, transport changes, persisting registry state.

Rework the web spawn form from raw text boxes into a low-friction, tile-first experience. The form is functionally complete but every field is typed from memory; the goal is **one click per field, zero typing** in the common case, with raw input demoted to a "none of the above" escape hatch. ## Decisions (locked) - **Scope:** shared-logic + web. Presets/recents/name-gen live as shared/daemon-backed data the web consumes now and the TUI adopts later; TUI keeps its minimal modal this round. - **Recents:** durable per-host spawn-history log with a recency cap (default 30 days). Survives kills + daemon restarts. - **Presets:** built-in defaults (claude/opencode/zsh/custom) overridable via `[spawn].presets` in config. - **Worktree:** infer `base_repo` from the selected dir; user types only the branch (checkout path stays daemon-auto-generated). ## Architecture context Same topology as NAP-329 (spawn dir autocomplete): web SPA → home daemon (or registry in dev) which **brokers** cross-daemon ops to the owning daemon over the registry control link. Anything reaching the host you spawn *on* mirrors the `create`/`kill`/`ListDir` plumbing end to end. `CreateSessionRequest`/`WorktreeSpec` wire types are **unchanged** — the client fills inferred `base_repo` from the gitroot probe. ## Children (dependency order) Backend / shared (unblocks web): 1. #22 — `[spawn].presets` config schema + resolution 2. #23 — `maestro-names` shared name generator 3. #24 — durable spawn history + recent-dirs query 4. #25 — `gitroot` walk-up probe 5. #26 — protocol types + relay + daemon HTTP (depends on 3, 4) Web: 6. #27 — spawn form revamp: tiles + recents picker + worktree-by-branch + generated name (depends on 1, 5; uses 2) 7. #28 — "Spawn similar" action + e2e (depends on 6) ## UX shape ``` Host [ ▣ this-host ] [ desktop ] [ phone ] [ More ] Command [ Claude ] [ opencode ] [ Shell ] [ Custom… ] Working dir ◉ ~/git/maestro (claude · 2h ago) ○ ~/git/dotfiles (zsh · yesterday) ○ Other directory… → raw input + autocomplete ☐ Git worktree Branch [____] repo: ~/git/maestro (inferred) Name [ neon-drifter ] ↻ ``` ## Out of scope TUI rich form (later ticket), attach/kill changes, transport changes, persisting registry state.
Author
Collaborator

All children shipped and merged to main:

  • #22 [spawn].presets config schema + resolution
  • #23 maestro-names generator
  • #24 durable spawn history + recent-dirs query
  • #25 gitroot walk-up probe
  • #26 protocol types + relay + daemon HTTP (recents/gitroot/presets)
  • #27 tile-first web spawn form
  • #28 "Spawn similar" action + spawn-history/gitroot e2e

Closing the epic.

All children shipped and merged to `main`: - #22 `[spawn].presets` config schema + resolution - #23 `maestro-names` generator - #24 durable spawn history + recent-dirs query - #25 `gitroot` walk-up probe - #26 protocol types + relay + daemon HTTP (recents/gitroot/presets) - #27 tile-first web spawn form - #28 "Spawn similar" action + spawn-history/gitroot e2e Closing the epic.
This repo is archived. You cannot comment on issues.
1 Participants
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: naps62/maestro#21