Skip to content

feat(desktop): open Home on New task's composer - #3729

Merged
luke-agent[bot] merged 26 commits into
mainfrom
luke/feat-home-new-task-composer
Oct 19, 2026
Merged

luke-agent[bot] merged 26 commits into
mainfrom
luke/feat-home-new-task-composer

Conversation

@dastratakos

@dastratakos dastratakos commented Oct 18, 2026 •

Copy link
Copy Markdown
Contributor

Summary

PR 8 of the "New task, prompt first" redesign: Home now opens on New task's composer, inline, the way Codex and ChatGPT open on a prompt box. This is question 5 of the approved design, done as the follow-up the developer approved. #3717 added NewTaskComposer.

  • Home (desktop-home.tsx): on main's DetailPage, the greeting is the page title. The composer sits at the top of the content, in .home-composer, in place of the "New task" header action. Inbox and Recent stay below it. The composer starts tasks in the workspace Home is showing.
    • It replaces the button rather than sitting beside it. The card already is New task on this page, so a button next to it would be a second way to do the same thing. ⌘N, the title bar, the sidebar, the command palette and a repository group's "+" still open the dialog. Only Home has the inline card.
    • The press that opened the dialog only picks a repository for the dialog. Home's card starts with no preset, so it never picks that repository up.
    • Signed out, there is no card.
  • Welcome page: an account with no task yet keeps main's centred welcome, with the card under Luke's face and line.
  • One composer for every state: while the task list loads, the page shows the card itself, since the card doesn't depend on the list. Home renders one composer, through a portal, into a box of its own (useComposerSlot). The loading page, the loaded page and the welcome each place that box where it belongs. So nothing typed while the list loads is lost when it lands, including when it lands as a brand-new account's welcome. The caret moves with the words.
  • Focus: the card doesn't set focusedByOwner, so it decides like agent-composer.tsx does. Its words take the caret when the editor mounts, unless a field or editor elsewhere already has it.
  • Keys: use-row-keys.ts already ignores any key not pressed from the window itself or from one of its rows, so ↑, ↓ and Return in the composer belong to the composer. Tests now pin this down. Escape in the card, when nothing in it needs closing, gives up focus. The arrows then reach Home's rows again.
  • Home's card and the dialog's stay in step on the mode. Both can be mounted at once (Home under ⌘N's dialog), so new-task-mode.ts is now one store that every card reads (useSyncExternalStore). Turning Plan on in the dialog turns it on in Home's card too.
  • Model sync dropped: an earlier round kept the cards' model chips in step through a write of the account default. main (fix(service,desktop): only Settings changes the coding agents' default model #3718) now changes the default only in Settings, and feat(desktop): start a coding agent from New task's prompt-first composer, with Plan mode for a call with Luke #3717 followed. Each card starts on the default as read, and a pick applies to that card's agent alone. So the sync code and its tests are gone.
  • Draft not kept, by choice: the card's words, files and issue do not survive leaving Home. NewTaskComposer keeps them in its own state. Keeping them would need a composer-drafts.ts place and a controlled draft on the composer; the orchestrator is tracking that as a follow-up.

Screenshots

These come from the real DesktopHome with fake data in headless Chromium, dark theme, not from the packaged app (evidence.sh only runs on macOS).

Home, with tasks:

Home with the composer under the greeting

A new account's welcome:

The welcome with the composer under Luke's line

Evidence

  • pnpm check:affected runs out of memory in this sandbox, so its parts were run one at a time on the head commit:
    • pnpm oxlint and biome on the changed files: passed.
    • tsc --project apps/desktop/tsconfig.json --noEmit: passed.
    • pnpm knip: passed.
    • ./scripts/repository-checks.sh: passed.
    • NODE_OPTIONS=--max-old-space-size=6500 pnpm discarded-effect: passed.
  • pnpm exec vitest run over desktop-home.test.ts, desktop-shell.test.ts and desktop-tasks.test.ts: 78 tests passed. The new welcome-draft test fails without the shared composer box.

Tests

desktop-home.test.ts goes from 23 to 29 tests: one removed and seven added.

  • Removed: "↑ and ↓ pressed on New plan leave the focus on it". The button is gone, and the composer key test below covers the same ground.
  • Added:
    • the composer takes the caret, and ↑/↓/Return typed in it move no row (Return starts its task);
    • it leaves the caret in a field that already has it;
    • Agent mode start (listed workspace, planning: false, agent on the words with the chip's model and the card's idempotency key, no dialog asked for);
    • Plan mode start (Shift+Tab, planning: true, Untitled, the words handed to Luke as the brief, no agent);
    • words typed while the list loads survive it landing, both as the page and as a new account's welcome;
    • with the dialog open over Home, Plan turned on in the dialog is Home's mode once the dialog closes.
  • Changed: the skeleton, greeting and welcome tests now check for the composer instead of the button. The welcome test also starts a task from it. The arrow-key test presses Escape in the composer first. The row-press test no longer clicks the button.
  • desktop-shell.test.ts: the welcome test checks that Home holds the composer, and opens the dialog from the title bar's New task.

Invariants

  • ./scripts/check.sh green. (CI)
  • JSON Schema goldens unchanged. (CI)
  • Every behavior change has, in this PR, the test that fails without it; no change-detector test added.
  • Gateway envelope goldens unchanged. (CI)
  • No new as type assertion.
  • No Effect.runPromise/runSync/runFork outside the runtime edges (the test file's beforeAll lands the editor bundle as the dialog's test and 18 others do).
  • No new setTimeout/setInterval/new Promise/AbortController/fs.watch.
  • No Effect, Stream, or Layer dropped.
  • Test count delta listed above.
  • No hand-rolled file replaced.
  • No CLAUDE.md/AGENTS.md sentence names a changed part.
  • PRIVACY.md unchanged (the composer's box is ph-no-capture, as the dialog's is).
  • No dependency changes.
  • No barrel/door change.

Notes

dastratakos and others added 13 commits October 18, 2026 19:57
…t the name field

The name field is a plain name again: typing in it lists no Linear issues
and searches nothing. Where the workspace the task starts in has Linear
connected, a Linear chip stands after the repository chip, and a press on
it, or Command-L from the card, opens the shared searchable menu over the
workspace's issues: those read as the card opened with nothing typed, the
same narrowing, rested Linear search, and key or link lookup as before
(moved unchanged into linear-issue-chip.tsx). Choosing an issue starts its
task at once, as choosing one did; Escape closes the menu and not the card;
a switch of workspace closes it and reads that workspace's issues.

SearchableMenu takes an onSearch for an owner that answers the search
itself, listing its rows unfiltered.

Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
Resolves the conflicts with main's SearchableMenu move onto SearchField and
ComboboxList: onSearch now rides the SearchField's onChange, and the Linear
chip caps its list with --luke-combobox-list-max as the repository chip does.

Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
…oser, with Plan mode for a call with Luke

New task's name field becomes the agent composer card: words, files,
dictation, the model chip, and Start, with the repository and Linear chips
and a Plan toggle at its foot. Agent mode starts the task without planning
and opens it on a draft agent tab that sends the words at once, so a refused
agent keeps them with Retry. A Linear issue picked becomes a chip whose
mention leads the agent's prompt. Plan mode starts today's plan and call,
named by the words until the brief lands. An Untitled task's tasks are read
again as its first agent's title lands.

Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
Resolves the conflict with #3694's move of the renderer runtime into
@luke/panel: the Linear chip's search atom reads it from there.

Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
…s menu shut across a reconnect or a composing key

- SearchableMenu holds a moved highlight by its row's id as well as its
  place, so an owner's search answering after the arrows moved, with an
  issue sorted ahead, leaves the highlight and Return on the issue chosen.
- The Linear chip closes its menu when Linear is let go, so its coming back
  draws nothing until the chip is pressed.
- Command-L opens nothing while an input method is composing.

Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
…s ask

Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
…-prompt-composer

Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
…field lands

Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
…ts Plan mode's files in the task-names allowlist

Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
Resolves the conflict with #3693's Start agent card and #3700's move of the
panel's leaf modules into @luke/panel: the Linear chip stands beside both,
and Create reads Start agent for an agent's card.

Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
…-prompt-composer

Takes main's @luke/panel move (New task's mode now lives at
@luke/panel/tasks/new-task-mode) and #3693's Start agent… from an issue: the
composer stands in Agent mode with no Plan toggle for it, and an agent on a
workspace issue with nothing written starts on the task's plan through
NewTaskStart.agent; the composer's words go as NewTaskStart.handed.

Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
… model is not kept as default, and offer no server reconnect where no servers are handed

Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
Home mounts New task's composer card under the greeting, in place of its
New task button, so the window's resting page opens on a prompt box. It
starts the task in the workspace Home lists, takes the caret as the page
shows unless a field elsewhere holds it, and keeps its keys from Home's
row navigation; Escape lets go of it. The welcome page holds it under
Luke's face and line, and the skeleton stands it too, in the same place,
so words typed while the list is read survive its landing. The dialog
stays for ⌘N and every other New task press.

Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
@vercel

vercel Bot commented Oct 18, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
luke-web Ready Ready Preview Oct 19, 2026 1:02am UTC

Request Review

dastratakos and others added 2 commits October 18, 2026 22:00
Brings #3717 up to date after #3697 was squash-merged into main.

Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
…-composer

Brings #3729 up to date with #3717, now on main.

Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
devin-ai-integration[bot]

This comment was marked as resolved.

…ver it chose

Home's New task card and the dialog's stand at once, and each read the
mode and the default model only as it opened, so turning Plan on or
picking a model in the dialog left Home's card on the old one. The mode
is now one store every card reads, and a model kept as the default in
one card is followed by another whose chip was not picked in it.

Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
devin-ai-integration[bot]

This comment was marked as resolved.

… kept

A model picked in one card moved the other cards' chips before its write
landed, so a refused write, or one overtaken by a later pick, left them on
a model that was never the default. The others now follow the latest pick
alone, once its write answers that it was kept.

Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
devin-ai-integration[bot]

This comment was marked as resolved.

…kept

Following one card's answered write could leave the others on the wrong
model when writes answered out of order, a refused later pick discarding
an earlier one that was kept. Once every write has answered, the other
cards whose chip was not picked read the default again and take what the
account stored.

Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
devin-ai-integration[bot]

This comment was marked as resolved.

Base automatically changed from luke/feat-new-task-prompt-composer to main October 18, 2026 23:26
Takes main's New task composer, dialog, and tasks tab from #3717 as it
merged, and re-applies Home's composer onto main's DetailPage Home: the
composer at the top of the page's content in place of the New task
action, standing in one place while the list is read and once it lands,
and under Luke's line in a new account's welcome. Keeps the shared mode
store and its test; drops the cross-card default-model sync and its
tests, which #3718's removal of writeDefault left nothing to follow.

Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
devin-ai-integration[bot]

This comment was marked as resolved.

…new account's welcome

The welcome and the page are two trees, so the list landing as a new
account's welcome mounted a second composer and let go of what was typed
while it was read. Home now draws one composer into a box of its own,
which whichever state stands takes into its place.

Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
@luke-agent
luke-agent Bot enabled auto-merge October 18, 2026 23:54
devin-ai-integration[bot]

This comment was marked as resolved.

dastratakos and others added 3 commits October 18, 2026 23:56
…he welcome

Moving the composer's box out of the page as the welcome replaced it
dropped the focus with it, so the next key missed the words. The box now
notes what held the focus inside it as its place goes, and focuses it
again in the new place where nothing else took the focus meanwhile.

Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
…re main moved them

Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
@luke-agent
luke-agent Bot added this pull request to the merge queue Oct 19, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Oct 19, 2026
dastratakos and others added 2 commits October 19, 2026 00:44
…d Plan-mode brief

Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
…sk-composer

# Conflicts:
#	apps/desktop/src/renderer/desktop/desktop-home.tsx
@luke-agent
luke-agent Bot added this pull request to the merge queue Oct 19, 2026
Merged via the queue into main with commit 86e09a4 Oct 19, 2026
11 checks passed
@luke-agent
luke-agent Bot deleted the luke/feat-home-new-task-composer branch October 19, 2026 01:09

This branch was successfully deployed

1 active deployment
Preview — 33b97b2f Deployed Oct 19, 2026 by vercel[bot]
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