feat(desktop): make the new plan page the home screen, redesigned as a composer
What
The empty home ("Plan a feature with Luke" + a New plan button) is gone. Whenever no plan is open, the work column is the new plan page, and it's redesigned as a devtool-style new-task page (ChatGPT/Codex/Cursor/Conductor) instead of a form.
- Home = new plan page.
PLANS_PAGE.LISTand the panel'scomposingstate are removed: no open plan means the new plan page. Leaving or deleting a plan lands there. Escape on it falls through to closing the panel, the same way Escape on the old list did. - Composer. A vertically centered "What are we planning?" heading over one rounded card:
- a large borderless name field, focused on arrival
- along the card's foot, a folder chip (folder icon + folder name, or "Choose folder" while unset)
- a round start button (arrow up) on the right. It's enabled only once both a name and a folder are set, and Enter submits.
- The start-failure note shows quietly under the card. The Back button, the Cancel button, and the "New plan" toolbar title are all gone.
- Default folder = last used. The chip starts on the folder of the newest started plan this Mac holds a folder for. This is derived from the existing
plans/folders(since #1835 the list is newest started first), so nothing new is stored. When there are recent folders, the chip opens a small menu: up to 5 recent folders, then "Choose another folder…" (the system picker). The menu supports arrow keys. Escape closes the menu without reaching the panel's Escape ladder, and the menu closes when focus leaves it. - Sidebar "New plan" (Dean's extra item). The button no longer has a background at rest. It reads as a plan row: transparent, with the same hover as
.sidebar-planand the same selected style (aria-current="page", replacingdata-active). It's selected whenever the new plan page is showing, which is now any time no plan is open on the Plans tab. Pressing it leaves any open plan (this moved intoonNewPlaninuse-plans-tab) and refocuses the name field, even when that page is already showing. - The composer's two acts (folder picker, start) now go through
PlansControl.newPlan, so the page can be tested with a fake. - Removed now-dead code: the old form CSS, the empty-state CSS, and
DocumentIcon(its only user was the deleted empty home). AddedFolderIconandArrowUpIcon. docs/PLANNING.mdnow describes the new page.
Uses only the existing tokens. The app is dark-only today, so there are no light-mode tokens to follow. The one entrance animation is the menu's, which reuses search-enter on --duration-quick, so reduced motion zeroes it. The design contract checks pass.
Screens (headless Chrome render of the real components and stylesheet, Linux)
- First run: no plans, chip reads "Choose folder", start disabled.
- Typed: chip defaulted to the last used folder (
relay), start enabled (white). - Folder menu: Recent: relay ✓, billing; then "Choose another folder…".
The PNGs are in the Conductor workspace (.context/new-plan-*.png). I didn't commit image files to the repo.
Tests
new-plan-form.test.ts(jsdom), throughNewPlanFormwith a fake host:- the heading shows and the name field takes focus
- start is enabled only with both a name and a folder, and submitting starts the plan with the trimmed name and the folder
- the folder defaults to the last used one, and the menu picks another
- a cancelled picker keeps the folder that was chosen
- Escape closes the menu and goes no further
- a refused start shows the reason
- each press of New plan refocuses the name field
desktop-plans.test.ts: with no plan open, the work column is the new plan page, with no toolbar, Back, or Cancel.desktop-sidebar.test.ts: New plan is the selected row only when no plan is open on Plans. Pressing it from Settings brings Plans forward.use-plans-tab.test.ts: Back only leaves an open plan; New plan leaves an open plan; recent folders come from the plans; a refused start answers its reason.planning-model.test.ts:plansPage,folderName,recentFolders(order, de-dupe, skips plans without a folder, cap of 5).
./scripts/check.sh exits 0, rebased on the latest main (#1827, #1829, #1832–#1835). Devin's review (the folder menu dropped focus on Escape) is fixed: closing the menu now hands focus back to the chip, and a test covers it.
Mac verification
CI cannot verify the Mac UI, and ./scripts/verify.sh was not run. This was built in a Linux cloud VM. The screens above are a headless Chrome render, not the Electron app. LUKE-159 is the manual Mac verify.sh pass.
🤖 Generated with Claude Code