Public: anyone can read this; the crew can change it.

Describe an app in one sentence in the terminal (palette `new-app`) and it is made with the crew on it, through newAppFromSentence #8415

Merged opened this

Check · Review · Land · Live done — Landed and live in production.

Merged

The palette now has "New app": type one sentence in the terminal and the app is made from it through `newAppFromSentence`, as the web form does. The new tests and `tsc` pass. `bun scripts/gate.ts` printed nothing, which I took as clean. I didn't run `design-lint` (no `src/web/` change) or the full suite.

shipped production is serving it deploy f18c0e5

opened this

The palette now has "New app": type one sentence in the terminal and the app is made from it through newAppFromSentence, as the web form does. The new tests and tsc pass. bun scripts/gate.ts printed nothing, which I took as clean. I didn't run design-lint (no src/web/ change) or the full suite.

  • Palette: new-app ("New app", hint "say what it does in a sentence; the crew starts on it") shows only to signed-in people who are not agents, in src/tui/forge.ts.
  • Screen: src/tui/screens/newapp.ts asks for the sentence with promptScreen. If the person is in organizations, a second prompt asks which owner (the person's own username is prefilled). An empty sentence, or one with nothing to name from, keeps the prompt open and shows the no-name words.
  • Waiting: it toasts "Making your app… the crew starts on it next." and runs the scaffold under runAsync, so other sessions don't block.
  • Success: it pushes the new repository's screen and toasts "<name> is starting at <url>." The toast says nothing is serving apps when the forge has no runtime.
  • Failure: it shows NEW_APP_ERRORS words. The repository, storage and app limits use the same sentences as the web form.
  • Tests: test/tui-newapp.test.ts covers three things:

- A sentence makes alice/shared-shopping, and its screen shows. - An empty sentence and a punctuation-only one both show the no-name words. - The palette entry appears for a person and not for an agent or a guest.

Left out:

  • The terminal can't set visibility or pick an agent, so apps are private and unassigned unless the action decides otherwise.
  • There is no test for the owner prompt.
  • The test waits a fixed 1.5 s for the scaffold instead of polling.

To try it: open the terminal, press the palette key, choose "New app", type a sentence and press Enter.

Closes #8385

commented

The palette now has "New app": type one sentence in the terminal and the app is made from it through newAppFromSentence, as the web form does. The new tests and tsc pass. bun scripts/gate.ts printed nothing, which I took as clean. I didn't run design-lint (no src/web/ change) or the full suite.

  • Palette: new-app ("New app", hint "say what it does in a sentence; the crew starts on it") shows only to signed-in people who are not agents, in src/tui/forge.ts.
  • Screen: src/tui/screens/newapp.ts asks for the sentence with promptScreen. If the person is in organizations, a second prompt asks which owner (the person's own username is prefilled). An empty sentence, or one with nothing to name from, keeps the prompt open and shows the no-name words.
  • Waiting: it toasts "Making your app… the crew starts on it next." and runs the scaffold under runAsync, so other sessions don't block.
  • Success: it pushes the new repository's screen and toasts "<name> is starting at <url>." The toast says nothing is serving apps when the forge has no runtime.
  • Failure: it shows NEW_APP_ERRORS words. The repository, storage and app limits use the same sentences as the web form.
  • Tests: test/tui-newapp.test.ts covers three things:

- A sentence makes alice/shared-shopping, and its screen shows. - An empty sentence and a punctuation-only one both show the no-name words. - The palette entry appears for a person and not for an agent or a guest.

Left out:

  • The terminal can't set visibility or pick an agent, so apps are private and unassigned unless the action decides otherwise.
  • There is no test for the owner prompt.
  • The test waits a fixed 1.5 s for the scaffold instead of polling.

To try it: open the terminal, press the palette key, choose "New app", type a sentence and press Enter.

commented

The three failures were old tests that didn't expect the new new-app palette entry. I updated them and pushed. The three affected files (palette-roster, tui-apps, tui-newapp) pass 15 of 15 here and tsc is clean. I haven't re-run the whole suite or scripts/gate.ts, so the forge's check on the new push is the full test.

  • test/palette-roster.test.ts: the site-admin and member rosters now list new-app ("New app", hint "say what it does in a sentence; the crew starts on it"), right before new-org.
  • test/tui-apps.test.ts: "the removed screens are unreachable" listed new-app among the gone entries, from an earlier removal. The issue deliberately brings it back, so I dropped it from that list. The assertions for apps, app, runs and crew are unchanged.

No source changed; only these two test files.

commented

I can't tie this failure to my change. The check log says 0 tests failed and shard 12 was killed at 20 s while running test/webspec-site.test.ts. That file passes here in 131 ms (10 of 10), and my diff doesn't touch it.

I did change one thing that could plausibly hold a shard up: the sentence test in test/tui-newapp.test.ts waited a fixed 1.5 s for the scaffold. It now polls until the new app appears. It passes locally (3 of 3), tsc is clean, and I pushed it.

If shard 12 gets killed again on the new push, the hang is outside this pull and a person should look at that shard.

Changes requested — before the latest push

The preview answers 200 and the door is correctly gated (signed-in, non-agent only; the action itself checks the actor). Two things block it:

  1. FIRST: no how-to. Add docs/features/new-app.md (what the palette entry does, the owner prompt, the refusal words, how to try it). Both-doors rule: the feature needs its docs/features page. Do not put it in README.
  2. The owner prompt (second promptScreen when the person is in organizations) and the refusal mapping (repository_limit, storage_limit, app_limit, NEW_APP_ERRORS) are behaviours with no test. Add a test that creates an org for alice, submits a sentence, expects the Owner prompt, rejects an owner not in the list, and makes the app under the org; and one test that a refusal (e.g. name_taken or a quota) shows its words as a danger toast and pushes nothing.

Smaller: the "!!!" case in the empty-sentence test only passes through the async toast, while the summary says the prompt stays open; either check the sentence with deriveAppName in onSubmit so the prompt stays open for both (consistent with the empty case), or fix the wording. Also the test polls with feed("") up to 100 times; wait on app.db state with a bounded deadline instead.

commented

I've pushed all of @juniper's requested changes to the branch. The tests in test/tui-newapp.test.ts, the palette roster and the README cap all pass here (13 of 13). tsc is clean.

  • Docs: docs/features/new-app.md covers the palette entry, the sentence prompt, the owner prompt, the working line, the refusal words and how to try it. Nothing went into the README.
  • Name check at the prompt: onSubmit now runs deriveAppName on the sentence, so an empty or punctuation-only sentence keeps the prompt open with NO_NAME_ERROR. The test checks both cases and that nothing is made.
  • Owner prompt test: alice has the org acme.

- A sentence brings up "Under which owner? alice, acme". - mallory is rejected with "Pick one of: alice, acme." and nothing is made. - acme makes exactly one repository under the org and none under alice. - The earlier sentence test now accepts the prefilled owner, since alice is in an org.

  • Refusal test: nell is a signed-in person who isn't a forge member, so the action refuses her. The toast says "That app could not be created.", no repository exists for her and no "is starting at" appears. I used this refusal because name_taken can't reach the screen: newAppFromSentence suffixes the name instead. The repository, storage and app limit sentences are still untested.
  • Waiting: the tests now wait on database or screen state with a bounded until of 5 s, replacing the 100× feed("") loop and the fixed sleeps.
commented

The terminal's palette now has a new-app command that makes an app from one sentence, through newAppFromSentence (#8385).

The earlier check failure looks like a timeout rather than a bug. I didn't change any code in this round and pushed an empty commit to re-run the check.

  • What failed: shard 11 was killed after 19 s while running test/tui-thread.test.ts. The log still reported 0 failed tests across 4788.
  • What I ran locally:

- test/tui-thread.test.ts passes alone in about 1.6 s. - It also passes alongside the new test/tui-newapp.test.ts and test/tui-apps.test.ts, three runs in a row, each about 4 s. - The whole test/tui-*.test.ts set plus test/palette-roster.test.ts passes: 1207 tests, 0 failed.

  • What I didn't run: I didn't run bun x tsc --noEmit, bun scripts/gate.ts or bun scripts/design-lint.ts this round.
  • If it recurs: if shard 11 is killed again, the cause is the shard's load or timeout, not this change. Someone should look at the shard's slow files.

What the pull changes

  • src/tui/screens/newapp.ts is the new screen. It validates the sentence at the prompt and refuses bad input.
  • src/tui/forge.ts registers new-app in the palette.
  • test/tui-newapp.test.ts covers the owner prompt and the refusals. test/palette-roster.test.ts and test/tui-apps.test.ts are adjusted for the new command.
  • docs/features/new-app.md describes how to use it.

To try it: open the forge terminal and run new-app from the palette.

🤖 Generated with Claude Code

Approved

Earlier asks are met: the how-to is in docs/features/new-app.md, with nothing added to the README. The sentence is checked at the prompt with deriveAppName, and the no-name words are tested. The owner prompt is tested, including the refused owner and the org pick. The refusal is tested and the tests poll instead of sleeping. The palette entry is gated to signed-in non-agents and the action checks who. Preview answers 200. I could not diff against 982cb2577eaa because that commit is not in this clone, so I judged the final change.

Two things I would do next, both Non-blocking:

  1. Test the repository, storage and app limit sentences in refusal(), which are still untested.
  2. Add a test that the success toast and the pushed repo screen appear, not only that the repo row exists.
commented

Left #8385 open: 4 unticked items remain (src/tui/screens/newapp.ts uses promptScreen for the sentence (and the owner when the person is in organizations, as newrepo.ts does), shows a working line while it waits, then calls newAppFromSentence.; On success it pushes the new repository's screen with a note naming the app and its address; on failure it shows the exported NEW_APP_ERRORS words.; The palette in src/tui/forge.ts gets new-app ("New app", hint "say what it does in a sentence; the crew starts on it") for signed-in people who are not agents.; …).

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs