feat(web): first-run onboarding — intro overlay + 60-second worktree game + workspace echoes - #123
Draft
danyaberezun wants to merge 22 commits into
Draft
feat(web): first-run onboarding — intro overlay + 60-second worktree game + workspace echoes#123danyaberezun wants to merge 22 commits into
danyaberezun wants to merge 22 commits into
Conversation
…ng-overlay-setup (d467f72) Final-state transfer per the onboarding technical handoff (§12 squash-copy): - New: panels/Onboarding.tsx, store/onboardingStorage.ts, e2e/onboarding.spec.ts, e2e/fixtures/onboarding-seen.json (verbatim from d467f72) - Patched: dialog.tsx (overlayClassName prop), appStore.ts (onboarding open-mode slice), index.css (--animate-fill keyframe), Shell.tsx (mount), ProjectTree.tsx (help-button re-open trigger), playwright.config.ts (seed the seen flag via storageState) - SPEC.md onboarding prose carried over (panels, shell, store, components/ui)
…us steals can't dismiss it The xterm terminal focuses itself when its async init lands (lazy chunk + visible-effect focus()); if that landed after a workspace-remove confirm opened, Radix's non-modal popover dismissed on focus-outside — a self-closing confirm for users and a pre-existing e2e race (workspace-lifecycle removal failed 3/5 at clean HEAD, near-deterministic once onboarding shifted bundle timing). Esc + pointer outside-click still cancel, per the documented contract.
…ch rule, tree-view beat, lifecycle mini-movie, fate-based reveal colors
…file-seeded isolation doctrine
…ps/web/src/onboarding)
… localStorage migration + e2e config seeding
…nboarding overlay
…-spec rule) FoldersBoard/reveals/WorktreeGame hardcoded the folder headers, fate tags, reveal prose, and prompt scaffold instead of sourcing them from content.ts, violating the onboarding module SPEC's "all game copy lives in content.ts" rule. Move them into new BOARD_COPY / REVEAL_COPY / PROMPT_FRAME constants; components now only compose JSX around them. Rendered text verified byte-for-byte unchanged via a before/after Playwright text dump.
…eat 3 and the worktrees card
…roject-root counts
…s on project switch
… deep-links the game Add WorktreeBanner, mounted in Shell above the editor for the active workspace: a one-time "you are in a separate folder" cue gated on AppConfig.onboarding.workspaceBannerDismissedAt, dismissible or deep-linking into the onboarding game's review mode. Fix the center column's flex layout in Shell.tsx (min-h-0 flex-1 wrapper around the editor ErrorBoundary) so the banner's height no longer overflows and gets clipped by the resizable panel's overflow:hidden. Also serialize onboarding config writes in state.ts (two-writer compose race): markIntroSeen and markBannerDismissed both read-modify- write the shallowly-merged onboarding config, so two near-simultaneous writes could drop one another's flag. Chain writes through a module-level promise and fold each settings.update response in via applyConfig immediately, instead of waiting on the settings.changed broadcast. Extend e2e/onboarding.spec.ts with a "first-worktree banner" spec covering show-until-dismissed and host-persisted dismissal, and document WorktreeBanner in panels/SPEC.md.
…revision, V1 scope line
…ation clear, tap targets, SPEC truth-up
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Users unfamiliar with git worktrees hit three surprises in ThinkRail: uncommitted/untracked files don't carry into a new workspace, the environment (
node_modules,.env) must be rebuilt, and the workspace lives in a different folder. This PR ships the education third of the product answer (#105's Default workspace removes the forced strangeness; #93's hooks automate the environment): a first-run intro overlay hosting a 60-second worktree prediction game, plus two just-in-time echoes at the moments confusion actually strikes.prefers-reduced-motionrenders everything statically.git.projectStatuswire method) and an.envhooks nudge. Fail-soft: no spinner, never gates Create.How
AppConfig.onboarding(two ISO timestamps:introSeenAt,workspaceBannerDismissedAt),git.projectStatus { projectId } → GitStatus, protocol 15.projectStatus(project root vsHEAD+ untracked; sharescollectChangeswithgitStatus); settings reads became per-request (cache removed) to match the file-seeded e2e isolation doctrine.apps/web/src/onboarding/(SPEC-first) absorbing Onboarding technical handoff #113's overlay: the "Isolated git worktrees" feature card's media placeholder becomes the live game entry. Seen-state is host-synced inAppConfig(a per-device flag would re-block every new browser — incl. the V2 phone) with a one-time localStorage→config migration for Onboarding technical handoff #113-era devices; onboarding config writes are serialized client-side (shallow server merge × two writers). Cross-client auto-dismiss included.storageStateto canonicalconfig.jsonseeding inglobal-setup/resetState; onboarding specs cover virgin first-run, persistence, migration, full 5/5 game playthrough, skip semantics, both echoes, banner dismiss persistence.Verification
check:deps·lint·typecheck(10/10) ·test(568) ·e2e63/63 (no-agent suite).apps/web/src/onboarding/SPEC.md(status: active — truth-checked against shipped code in the final pass).Notes for review
af38c19, then re-homes its overlay into the module and supersedes its localStorage flag with a migration). If Onboarding technical handoff #113 merges to main first, this diff shrinks accordingly; Onboarding technical handoff #113 can also be closed in favor of this PR — either works..envnudge link the hooks dialog); the banner gains thekind === \"default\"skip when feat: built-in Default workspace + an explicit choice between the two working modes #105'sWorkspace.kindlands..superpowers/brainstorm/(untracked).