Files
pad/internal/server/testdata/cloud_contract
xarmian 70c57f8202 feat(auth): a first Cloud signup lands in its new workspace; OAuth comes first (TASK-3595) (#2075)
* feat(auth): a first Cloud signup lands in its new workspace; OAuth comes first (TASK-3595)

A Cloud signup auto-creates and seeds a workspace, then landed on
/console, a list with a Create button.

- autoCreateWorkspace returns the workspace only when it is usable.
  Every failure arm returns nil, including the two that keep a
  workspace with an unknown or wrong-role owner row.
- Register (self-serve) and oauth-login add an additive workspace_path
  ("/<username>/<slug>") when a workspace was just made. The pad-cloud
  sidecar uses it for OAuth signups (its own PR, stacked on the go-live
  line).
- The register page lands there through postSignupTarget, the "Continue
  to Pad" of an unverified signup included. An explicit ?redirect=
  (OAuth authorize, CLI/MCP auth, an invitation, a deep link) or an
  accepted invitation still wins.
- The register page puts the GitHub/Google buttons first, with the "or"
  divider below them (AuthOAuthButtons divider="below").
- The generated username becomes a "Username: ada · Change" line. It
  opens on click (focus follows), or by itself without moving focus
  when the generated name is taken.
- The register page moves from $app/stores to $app/state, so it mounts
  under jsdom.

Claude-Session: https://claude.ai/code/session_01FAVXA5mJ5BNhKmv95jxQkQ

* test(cloud): the oauth-login contract golden carries workspace_path (TASK-3595)

Claude-Session: https://claude.ai/code/session_01FAVXA5mJ5BNhKmv95jxQkQ

* fix(web): a taken generated username keeps its field open while the user types (TASK-3595 codex r1)

Editing the field reset the availability check, and the field's
visibility read it, so the input vanished under the typing. A taken
name now opens the field for good. Also note in postSignupTarget that
an explicit /console counts as no destination, by design.

Claude-Session: https://claude.ai/code/session_01FAVXA5mJ5BNhKmv95jxQkQ
2026-10-11 18:09:29 -04:00
..