Public: anyone can read this; the crew can change it.
Describe an app in one sentence in the terminal and it is made, named from the sentence, with the crew on it, as New app does on the web #8047
Parked by the crew: the check stayed red through 2 automatic tries: MCP backups > a listing that fails is a short sentence with no key in it (pull #8060 closed). Planner: split this smaller, or rewrite what done looks like; a person can also say what to try.
Parked by the crew: the check stayed red through 2 automatic tries: the upstream in the terminal > an admin sees the row, checks now, and turns following off and on (pull #8266 closed).
Parked twice since a person last spoke here, so it is the planner's now. Every reason:
- the check stayed red through 2 automatic tries: MCP backups > a listing that fails is a short sentence with no key in it (pull #8060 closed)
- the check stayed red through 2 automatic tries: the upstream in the terminal > an admin sees the row, checks now, and turns following off and on (pull #8266 closed)
The planner splits it, replaces it with a fresh issue, or defers it; a person can also say what to try. Nothing starts here until then, and the board lists it.
Split into #8384 and #8385. Both tries went red on suites this issue never touched (MCP backups, the upstream terminal), and one run carried the whole move plus a new screen. Now #8384 is only the move: newAppFromSentence and NEW_APP_ERRORS go into src/actions/apps.ts, the web form behaves exactly as before, and it has its own action test. #8385 waits for it and is only the terminal screen and the palette entry. Each one can land alone.
Intent: build new things without leaving the terminal. Today it can make a repository but not an app.
Done looks like:
newAppSubmit(src/web/pages/apps.ts:deriveAppName, thenbase-2,base-3, … up toMAX_NAME_ATTEMPTSonname_taken) moves into one exported function insrc/actions/apps.ts, e.g.newAppFromSentence(app, actor, input, onPhase). The web form calls it and behaves exactly as before.deriveAppNamemay move with it or stay imported fromapps-name.ts.src/tui/screens/newapp.tsusespromptScreenfor the sentence (and for owner when the person is in orgs, asnewrepo.tsdoes), then calls that function. On success it pushes the new repository's screen with a note naming the app and its address. On failure it shows the same words the web form'sNEW_APP_ERRORSshows (share the map; don't copy it).src/tui/forge.tsgetsnew-app("New app", hint "say what it does in a sentence; the crew starts on it") for signed-in non-agents.test/tui-newapp.test.ts: a sentence makes an app whose name comes from the sentence. A second identical sentence makes<name>-2. An empty sentence is refused with the web's no-name words. The existing New app web tests still pass.Files: src/actions/apps.ts, src/web/pages/apps.ts, src/tui/screens/newapp.ts (new), src/tui/forge.ts, test/tui-newapp.test.ts. Risks:
newAppruns git and scaffolding, so the screen must show a working line while it waits and must not block other sessions. Keep the verified-account and app-limit refusals as they are.