Skip to content

feat(launch): tabs from the first frame, a skeleton while the agent comes back (#106) - #107

Merged
Maxaubert merged 3 commits into
mainfrom
feat/106-launch-skeleton
Oct 1, 2026
Merged

Maxaubert merged 3 commits into
mainfrom
feat/106-launch-skeleton

Conversation

@Maxaubert

Copy link
Copy Markdown
Owner

Closes #106. Spec and plan, approved together ("go ahead"): docs/superpowers/specs/2026-09-30-launch-skeleton-design.md. The four mockups sit next to it (2026-09-30-launch-mockups.html); the owner picked C, the skeleton.

Before: opening the app with three Claude tabs showed the start screen ("no tabs"), then the tabs, then text on each tab, then Claude.

After:

  • Tabs from the first frame.
    • tabs:peek is a synchronous read of tabs.json: no stat, no session scan. It draws the saved strip as placeholders (Tab.pending) at once.
    • When tabs:restore answers, lib/restorePlan settles each placeholder in place by its saved index (RestoredTab.from).
    • A placeholder whose folder is gone, or that was closed meanwhile, goes away. Folders handed to the launch come after.
    • The start screen shows only after a restore that answered empty.
  • A skeleton while the agent comes back (core, so Prism's resumed terminals get it too).
    • ResumeSkeleton draws Claude's layout as quiet theme-coloured bars: the logo block, a prompt, a reply, the input box, the footer.
    • resumeReveal, pure and tested, decides when. MEASURED 2026-09-30: under pwsh through the bundled ConPTY, the first title is exactly claude (3.6 s), then ✳ Claude Code (5.4 s), then the alternate screen.
    • A local clear (screen and scrollback) is written just BEFORE the claude title, so nothing the shell said is seen.
    • The skeleton fades out on the agent's next title or the alternate screen, plus 150 ms. It also lifts on a key, an exit, a failed spawn, or at 12 s.
    • A folder path is never taken for the program: the owner's projects live under a folder called Claude.
    • The old text spinner is gone.
  • A ring on every tab still coming back, in the strip. resumingIds in termBus; placeholders count too.

Core 0.20.0, app 0.25.0. Prism gets the skeleton through the automatic bump. Its tab strip can adopt the ring later.

Verified:

  • Unit tests: 994 pass, including resumeReveal and restorePlan (peek, settle, a closed placeholder, the handed-over folders, all gone). Lint and typecheck pass.
  • New e2e launchSkeleton runs three saved claude tabs, a temp HOME with a transcript for each (never the real ~/.claude), and a stand-in claude first on PATH. The stand-in prints a line first, titles itself claude, prints its banner, then settles like the real one.
    • It asserts:
      • the first frame holds three tabs and no start screen;
      • the skeleton and three rings show during load;
      • what came before the agent is never shown uncovered, and is gone afterwards;
      • the agent appears and the skeleton and rings go;
      • a background tab opened later shows its agent at once.
    • On main, 5 of its 7 checks fail. The other 2 were already true there.
    • .e2e-shots/launch-skeleton.png was checked against the mockup.
  • Full e2e suite passes. edges failed on its relaunch step in one full run and once on its own, then passed three times in a row, including a clean full run; it failed the same way once before this change. attention failed once in the first full run and passed on its own.

🤖 Generated with Claude Code

https://claude.ai/code/session_01FHHaWKR4M5QtW7Wecyuk4t

Maxaubert and others added 3 commits September 30, 2026 17:17
…omes back (#106)

The saved strip is drawn at once from tabs.json and settled in place when the
restore answers, so the start screen no longer flashes. A resuming tab wears a
skeleton of the agent's layout (core, so Prism too); the shell's words are
cleared before the agent's first title and the skeleton lifts once it has
drawn. Tabs still coming back show a ring.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FHHaWKR4M5QtW7Wecyuk4t
…#106)

The owner found the first one too small, and wanted only the lines.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FHHaWKR4M5QtW7Wecyuk4t
# Conflicts:
#	package-lock.json
#	package.json
@Maxaubert
Maxaubert merged commit 9dafd96 into main Oct 1, 2026
2 checks passed
@Maxaubert
Maxaubert deleted the feat/106-launch-skeleton branch October 1, 2026 07:29
github-actions Bot pushed a commit that referenced this pull request Oct 1, 2026
…omes back (#106) (#107)

* feat(launch): tabs from the first frame, a skeleton while the agent comes back (#106)

The saved strip is drawn at once from tabs.json and settled in place when the
restore answers, so the start screen no longer flashes. A resuming tab wears a
skeleton of the agent's layout (core, so Prism too); the shell's words are
cleared before the agent's first title and the skeleton lifts once it has
drawn. Tabs still coming back show a ring.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FHHaWKR4M5QtW7Wecyuk4t

* style(launch): the skeleton fills the window with lines, no input box (#106)

The owner found the first one too small, and wanted only the lines.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FHHaWKR4M5QtW7Wecyuk4t

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
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.

Launch with restored agent tabs: tabs from the first frame, a skeleton while Claude comes back

1 participant