Skip to content

Onboarding: starter prompts, first-agent nudge, parallelism quest - #10

Merged
frenchie4111 merged 2 commits into
mainfrom
add-intro-tutorial
Apr 11, 2026
Merged

frenchie4111 merged 2 commits into
mainfrom
add-intro-tutorial

Conversation

@frenchie4111

Copy link
Copy Markdown
Collaborator

Summary

Three onboarding nudges aimed at closing the gap between "user downloads Harness" and "user experiences the parallelism value prop the landing page promises."

  • Starter task prompts in NewWorktreeScreen — replaces the locked "Pull from backlog" placeholder with three one-click prompts (Map the repo / Find TODOs / Sharpen README) that fill branch name + kickoff. Removes first-run blank-prompt paralysis and doubles as a useful shortcut for returning users.
  • First-agent sidebar nudge — while the user has zero non-main worktrees, a compact gradient-accented CTA card sits at the top of the sidebar: "Spawn your first agent." Disappears the instant an agent worktree exists.
  • Parallelism quest — a floating card (bottom-right) that teaches the one non-obvious lesson: don't sit and watch one agent; fork a second while it's still running, then ⌘1/⌘2 between them. Three steps (spawn-second → switch-between → finale) driven reactively by worktree count + activeWorktreeId transitions. Persisted across restarts via a new config.onboarding.quest field + config:getOnboarding / config:setOnboardingQuest IPC.

The quest advances or skips steps based on actual state at load time (e.g. someone who already has 2+ worktrees jumps straight to switch-between), and never shows again once dismissed or finished.

Test plan

  • Fresh launch with no worktrees: sidebar shows the "Spawn your first agent" CTA; main terminal for main still works normally
  • NewWorktreeScreen: three starter cards fill branch + prompt with one click
  • Create first agent: quest card appears with step 1 ("spawn another")
  • Create second agent: quest card advances to step 2 ("⌘1/⌘2 to jump")
  • Switch between two worktrees with ⌘1/⌘2: quest advances to finale
  • Dismiss quest via X: never reappears after restart
  • Restart app mid-quest: correct step restored from persisted state
  • Delete all agent worktrees (leaving only main): sidebar CTA reappears

🤖 Generated with Claude Code

frenchie4111 and others added 2 commits April 10, 2026 21:29
Replaces the locked "Pull from backlog" placeholder with three one-click
starter prompts (Map the repo / Find TODOs / Sharpen README) that fill
the branch name and kickoff textarea. Removes the blank-prompt paralysis
that stalls first-run sessions and doubles as a useful shortcut for
returning users.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Two onboarding nudges aimed at the landing page's promise of running
many agents at once:

- Sidebar CTA shown while the user has zero non-main worktrees. A small
  gradient-accented card above the grouped list: "Spawn your first
  agent." Clicking it opens the new-worktree screen. Disappears the
  moment an agent worktree exists.

- Parallelism quest — a floating card bottom-right that walks a new
  user through the one non-obvious lesson: don't sit and watch one
  agent, fork a second while the first is still running, then jump
  between them with ⌘1/⌘2. Three steps (spawn-second, switch-between,
  finale) driven reactively by worktree count and activeWorktreeId
  transitions, persisted across restarts via a new config.onboarding
  field and config:getOnboarding / config:setOnboardingQuest IPC.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@frenchie4111
frenchie4111 merged commit 7fcd508 into main Apr 11, 2026
frenchie4111 added a commit that referenced this pull request May 26, 2026
Add workflow rule #10 covering how the reviewer's agent should push
cleanup commits back to a contributor's PR branch when working inside
a Harness PR-review worktree. The trap: Harness fetches refs/pull/N/head
from origin into a local branch with no upstream configured, so
`git push -u origin <branch>` silently succeeds against the upstream
repo (creating a stray branch on frenchie4111/harness) instead of
landing on the contributor's fork — and the PR never updates. The fix:
run `gh pr checkout <num>` once inside the existing worktree to add
the fork as a remote and configure upstream, then plain `git push`
does the right thing.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
tresat added a commit to tresat/harness that referenced this pull request Jul 24, 2026
- Extract normalizeAlias() + ALIAS_MAX_LEN in shared/state/aliases.ts;
  IPC handler, MCP control-server dep, and control-server response
  echo all use it so the trim/clamp logic can't drift (fixes ness-dev#2)
- useHotkeys skips when focused element (or ancestor) has
  data-hotkeys="ignore"; AliasEditor input opts in so Cmd+W / Cmd+K /
  etc. don't fire while renaming. Opt-in (not a general "skip inputs"
  rule) because xterm's hidden textarea would otherwise break every
  terminal-time hotkey (fixes ness-dev#4)
- useAliasForPath now accepts string | null | undefined; App.tsx window
  title read no longer needs the '?? ...' fallback subscription to a
  permanently-empty key (fixes ness-dev#7)
- MCP control-server response includes clamped: true when the caller's
  input differed from what got stored; the set_worktree_alias tool
  surfaces this to the agent as "input was normalized" so silent
  whitespace/length changes are discoverable (fixes ness-dev#8)
- Add control-server.test.ts covering POST/DELETE /aliases end-to-end:
  scope-fallback, clamp reporting, empty-clears-alias, and 400 on no
  worktreePath + no scope (fixes ness-dev#9)
- displayLabel docstring now explains the resolution order, the
  machine-facing exclusion, and the per-id selector pairing (fixes ness-dev#10)
frenchie4111 pushed a commit that referenced this pull request Jul 24, 2026
- Extract normalizeAlias() + ALIAS_MAX_LEN in shared/state/aliases.ts;
  IPC handler, MCP control-server dep, and control-server response
  echo all use it so the trim/clamp logic can't drift (fixes #2)
- useHotkeys skips when focused element (or ancestor) has
  data-hotkeys="ignore"; AliasEditor input opts in so Cmd+W / Cmd+K /
  etc. don't fire while renaming. Opt-in (not a general "skip inputs"
  rule) because xterm's hidden textarea would otherwise break every
  terminal-time hotkey (fixes #4)
- useAliasForPath now accepts string | null | undefined; App.tsx window
  title read no longer needs the '?? ...' fallback subscription to a
  permanently-empty key (fixes #7)
- MCP control-server response includes clamped: true when the caller's
  input differed from what got stored; the set_worktree_alias tool
  surfaces this to the agent as "input was normalized" so silent
  whitespace/length changes are discoverable (fixes #8)
- Add control-server.test.ts covering POST/DELETE /aliases end-to-end:
  scope-fallback, clamp reporting, empty-clears-alias, and 400 on no
  worktreePath + no scope (fixes #9)
- displayLabel docstring now explains the resolution order, the
  machine-facing exclusion, and the per-id selector pairing (fixes #10)
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.

1 participant