feat(storybook): stories for repository browsing and first-run onboarding #442

Merged
gmackie merged 1 commit from feat/storybook-repo-onboarding into main 2026-08-25 07:11:54 +00:00
Owner

Why

Two more uncovered surfaces: the repository browser with its file viewer, and the first-run onboarding wizard.

The wizard is the one nobody sees twice. Reviewing step one by hand means tearing a workspace down — which is exactly why this kind of surface drifts. Its progress is derived from what exists rather than stored, so each story is simply the world at that point and the wizard works out which step is current. Every rung from a bare server to a deployed app is now a story.

29 stories

  • Repo browser — code tab at root and nested, empty repo, pull requests and issues (populated and empty), a non-default branch
  • File viewer — TypeScript, markdown, extensionless, binary, a 400-line file, empty, blame on and unavailable, editing, save rejected
  • Onboarding — all six rungs, load error, no teams, two rejected steps, slow backend

Three fixture details only the rendered result caught

All three are in stubbed server-action returns, which nothing type-checks — the same blind spot as the streamed payloads in #436 and #438:

  1. BlameLine carries text, not summary. The wrong key left the gutter rendering undefined with no complaint.
  2. The binary refusal keys off a real NUL byte in the first 8KB. A binary-looking string of printable characters renders as text and the refusal never fires — the fixture needs actual `` escapes.
  3. Blame shas are sliced to 7 characters, so my 6-character fixture never exercised the slice. Now full-length.

Verified

450/450 stories render clean in a browser. The binary refusal, blame gutter and outline were each checked in the DOM rather than assumed — the first two would have passed a "does it render without erroring" sweep while being wrong.

Typecheck, lint and build all pass.

## Why Two more uncovered surfaces: the repository browser with its file viewer, and the first-run onboarding wizard. **The wizard is the one nobody sees twice.** Reviewing step one by hand means tearing a workspace down — which is exactly why this kind of surface drifts. Its progress is *derived* from what exists rather than stored, so each story is simply the world at that point and the wizard works out which step is current. Every rung from a bare server to a deployed app is now a story. ## 29 stories - **Repo browser** — code tab at root and nested, empty repo, pull requests and issues (populated and empty), a non-default branch - **File viewer** — TypeScript, markdown, extensionless, binary, a 400-line file, empty, blame on and unavailable, editing, save rejected - **Onboarding** — all six rungs, load error, no teams, two rejected steps, slow backend ## Three fixture details only the rendered result caught All three are in **stubbed server-action returns, which nothing type-checks** — the same blind spot as the streamed payloads in #436 and #438: 1. **`BlameLine` carries `text`, not `summary`.** The wrong key left the gutter rendering `undefined` with no complaint. 2. **The binary refusal keys off a real NUL byte** in the first 8KB. A binary-*looking* string of printable characters renders as text and the refusal never fires — the fixture needs actual `` escapes. 3. **Blame shas are sliced to 7 characters**, so my 6-character fixture never exercised the slice. Now full-length. ## Verified **450/450 stories render clean** in a browser. The binary refusal, blame gutter and outline were each checked in the DOM rather than assumed — the first two would have passed a "does it render without erroring" sweep while being wrong. Typecheck, lint and build all pass.
feat(storybook): stories for repository browsing and first-run onboarding
All checks were successful
CI / gitleaks (pull_request) Successful in 6s
CI / storybook (pull_request) Successful in 1m24s
forgegraph/ci CI passed
CI / ci (pull_request) Successful in 9m43s
154709176b
Two more surfaces with no coverage: the repo code/PR/issue browser with its
file viewer, and the getting-started wizard.

The wizard is the one nobody sees twice. Reviewing step one by hand means
tearing a workspace down, which is exactly why it drifts. Its progress is
derived from what exists rather than stored, so each story is just the world at
that point and the wizard works out which step is current — every rung from a
bare server to a deployed app is now a story.

29 stories:

  - repo browser   code tab at root and nested, empty repo, pull requests and
                   issues (populated and empty), a non-default branch
  - file viewer    TypeScript, markdown, extensionless, binary, a 400-line
                   file, empty, blame on and unavailable, editing, save
                   rejected
  - onboarding     all six rungs, load error, no teams, two rejected steps,
                   slow backend

Three fixture details that only the rendered result would have caught, all in
stubbed server-action returns, which nothing type-checks:

  - BlameLine carries `text`, not `summary`; the wrong key left the gutter
    rendering undefined without complaint
  - the binary refusal keys off a real NUL byte in the first 8KB, so the
    fixture needs actual escapes — a binary-looking string of printable
    characters renders as text and the refusal never fires
  - blame shas are sliced to 7 characters, so a 6-character fixture never
    exercised the slice

Verified: 450/450 stories render clean in a browser, and the binary refusal,
blame gutter and outline were each checked in the DOM rather than assumed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Author
Owner

Preview environment is live: https://pr-442-forgegraph.forgegraf.com

Deployed 15470917 with the beta stage's environment. It redeploys on every push and is destroyed when this PR closes.

Preview environment is live: https://pr-442-forgegraph.forgegraf.com Deployed `15470917` with the beta stage's environment. It redeploys on every push and is destroyed when this PR closes.
gmackie deleted branch feat/storybook-repo-onboarding 2026-08-25 07:11:54 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
gmackie/ForgeGraph!442
No description provided.