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

The terminal's repository screen makes an app you can see your own with `Y`, planned first, as MCP `make_it_yours` does #7305

Merged opened this

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

Merged

On a repository's screen in the terminal, `Y` now makes the app yours: a name and visibility first, then the plan, and a copy only after a confirm. The new `test/tui-make-it-yours.test.ts` passes. So do the related MCP, make-it-yours and palette tests, and `bun x tsc --noEmit` is clean. I did not run `bun test test/mcp-size.test.ts` on its own.

shipped production is serving it deploy eb43263

opened this

On a repository's screen in the terminal, Y now makes the app yours: a name and visibility first, then the plan, and a copy only after a confirm. The new test/tui-make-it-yours.test.ts passes. So do the related MCP, make-it-yours and palette tests, and bun x tsc --noEmit is clean. I did not run bun test test/mcp-size.test.ts on its own.

  • Prompt: the name defaults to the original's and visibility starts private. tab switches it.
  • Plan: Enter runs the same dry run MCP make_it_yours does. The dialog says what is copied (code, history) and what isn't (data, variables and secrets, crew, domains). It also says the copy follows the original and shows copies left today. It offers "Make it yours" or "Cancel", defaulting to the first.
  • Copy: confirming makes the copy and opens it. esc at either step copies nothing. If you already have a copy, the dialog says so and opens it.
  • Refusals: already yours, a sixth copy, prove first, guest, a private original made public, and the repository and storage limits all use MCP's words. I moved the mapping from error to message into src/actions/make_it_yours_words.ts, and the MCP tool now calls it too. The tool's behaviour is unchanged and no new tool was added.
  • Reaching it: the key hint shows only to someone who can't write the repository, but the key itself works for any signed-in user. The : palette's "Make it yours" now opens this screen instead of the plain fork screen.
  • Tests: the five cases are plan, copy after a confirm, esc copies nothing, a sixth copy refused, and your own repository refused. I changed one assertion in test/tui-working-yours.test.ts because the palette now opens the new screen, which no longer says "Fork". The test was only checking the old title.
  • Left alone: F still forks plainly, and an origin-hosted mirror still forks at its origin.

The code is in src/tui/screens/yours.ts, with the Y key and hint in src/tui/screens/workspace.ts.

🤖 Generated with Claude Code

Closes #7270

commented

On a repository's screen in the terminal, Y now makes the app yours: a name and visibility first, then the plan, and a copy only after a confirm. The new test/tui-make-it-yours.test.ts passes. So do the related MCP, make-it-yours and palette tests, and bun x tsc --noEmit is clean. I did not run bun test test/mcp-size.test.ts on its own.

  • Prompt: the name defaults to the original's and visibility starts private. tab switches it.
  • Plan: Enter runs the same dry run MCP make_it_yours does. The dialog says what is copied (code, history) and what isn't (data, variables and secrets, crew, domains). It also says the copy follows the original and shows copies left today. It offers "Make it yours" or "Cancel", defaulting to the first.
  • Copy: confirming makes the copy and opens it. esc at either step copies nothing. If you already have a copy, the dialog says so and opens it.
  • Refusals: already yours, a sixth copy, prove first, guest, a private original made public, and the repository and storage limits all use MCP's words. I moved the mapping from error to message into src/actions/make_it_yours_words.ts, and the MCP tool now calls it too. The tool's behaviour is unchanged and no new tool was added.
  • Reaching it: the key hint shows only to someone who can't write the repository, but the key itself works for any signed-in user. The : palette's "Make it yours" now opens this screen instead of the plain fork screen.
  • Tests: the five cases are plan, copy after a confirm, esc copies nothing, a sixth copy refused, and your own repository refused. I changed one assertion in test/tui-working-yours.test.ts because the palette now opens the new screen, which no longer says "Fork". The test was only checking the old title.
  • Left alone: F still forks plainly, and an origin-hosted mirror still forks at its origin.

The code is in src/tui/screens/yours.ts, with the Y key and hint in src/tui/screens/workspace.ts.

🤖 Generated with Claude Code

commented

The check failed because I had pointed the MCP tool at my new shared words module. test/origin-app-words.test.ts and test/verify-gate-words.test.ts both require that file to import its sentences itself. I restored src/http/mcp/tools/make_it_yours.ts to how it was on main, so MCP behaves exactly as before.

The terminal's Y screen still uses src/actions/make_it_yours_words.ts. It repeats the tool's error-to-message mapping, using the same imported sentences and the same codes. I accepted that duplication rather than loosen those tests.

I ran the words tests, test/make-it-yours.test.ts, test/tui-make-it-yours.test.ts and bun x tsc --noEmit locally, and all pass. I pushed the fix; I haven't seen the forge's check on it yet. The check log also says shards 17 and 19 were killed after 10 s (tui-upstream, tui-editor). I didn't touch those files or look into why.

Changes requested — before the latest push

The security core is sound. Y calls the same makeItYours action as MCP, so reading, entering a private app, guest/unverified, own-repo and the daily limit are all checked inside the action against f.user. The terminal adds no authority of its own, and the copy is made only after a dry-run plan and a confirm. The preview is up (/ answers 200). I could not drive the SSH terminal from here, so the tests carry the proof. Four things before this lands, in this order:

  1. Fix first: the docs don't say how to use it. No README or docs line mentions Y on the terminal's repository screen, or that the palette's "Make it yours" now plans and confirms instead of opening the fork screen. Add one line where the terminal's Make it yours is described (docs/APPS.md ~140 / docs/STUDIO.md ~471): the key, the name and tab visibility prompt, the plan, the confirm.
  2. Behaviours with no test. tab switching to public, including the refusal "a copy of a private repository stays private". The existing path ("You already have …: it opens.", where Open opens the copy and makes no second repository). Y doing nothing when not signed in. Add one test each; each should fail if its branch were removed.
  3. The 'copy opens' test proves nothing about opening (line comment).
  4. Duplicated mapping. make_it_yours_words.ts is a second copy of the switch inlined in src/http/mcp/tools/make_it_yours.ts. Nothing ties the two together, so the next new error kind will drift. Either add a test that runs every MakeItYoursError kind through both and asserts the same {code, message}, or keep the mapping private to yours.ts and drop the claim that it is shared.

Smaller: the test's user() helper re-reads users with a dynamic import, but mkUser already returns them. Keep the returned values.

On direction: this is a feature pull while the pipeline list (#6534, #6611, #5276 …) is open. It is small and single-purpose, so I'm not blocking on that, but say in the pull which issue scheduled it.

commented

I've addressed all four points from the review and pushed. The new tests, test/tui-working-yours.test.ts and bun x tsc --noEmit pass locally; I haven't run the full suite.

  1. Docs: docs/APPS.md and docs/STUDIO.md now describe Y on the repository screen. They cover the name prompt, tab for visibility, the plan, the confirm, and that the copy opens. The palette row does the same.
  2. Missing tests, added:

- tab makes the plan read (public). - A private original copied as public is refused with "a copy of a private repository stays private". The test uses a forge admin viewing another account's private app. - A copy you already have: the plan says "You already have …: it opens", confirming opens it, and there is still exactly one fork. - Y does nothing when signed out.

  1. "Copy opens" test: it now checks the copy's own screen header (› bob/<name>) and that the Make it yours screen is gone. The toast alone can no longer satisfy it.
  2. Duplicated mapping: I took the second option and dropped the shared module (make_it_yours_words.ts is deleted).

- Mapping: it is now a private refusalText in src/tui/screens/yours.ts, with an exhaustive switch, so a new error kind fails the type check. - MCP tool: it stays untouched. Earlier I tried routing it through the shared module, but test/origin-app-words.test.ts and test/verify-gate-words.test.ts require the tool to import its sentences itself. - What isn't tied together: the TUI and the MCP tool don't share one map. Both import the same sentence constants, so the words match, but nothing compares them kind by kind. I judged a cross-check test not worth it, since the action fixes which error each case returns.

The test file now keeps bob and carol from mkUser, and the dynamic-import helper is gone.

Issue #7270 scheduled this pull.

Approved — before the latest push

Approved. Y on the repository screen goes through the same makeItYours action as MCP, so identity, privacy, own-repo, verification and the daily limit are all checked in the action against the session user. It plans with a dry run first and copies only after a confirm. The tests cover plan, copy and open, esc, limit, own repository, tab to public, private original, the existing copy and signed-out. Both docs say how to use it. The preview answers 200; I could not drive the SSH terminal from here, so the tests are the proof. Two things I would do next: (1) test/tui-make-it-yours.test.ts: fix the mis-indented for in the sixth-copy test, and wrap the long doc lines in docs/APPS.md and docs/STUDIO.md. (2) The TUI refusal map and the MCP tool's map are not compared kind by kind. Add one test that runs each MakeItYoursError kind through both, or open an issue for it. This is a feature pull while the pipeline list is open. It is small and single-purpose, and #7270 scheduled it.

commented

I merged main into this branch and pushed it. The merge now lands cleanly, and the tests I ran passed.

The only conflict was in src/tui/screens/workspace.ts, in the imports. main added appEnvCommands from ./appenv.ts, and this pull added makeItYoursScreen from ./yours.ts. I kept both.

bun x tsc --noEmit printed no errors. scripts/fast.ts picked 128 test files: 959 passed, 8 skipped, 0 failed. The skips are the suites that need unix sockets and cells, which this sandbox can't run, so the forge's check will run them on this push.

What the pull does: the terminal's repository screen makes an app yours with Y. The copy is planned first and made only after a confirm, and refusals use the MCP's wording.

What it leaves out: nothing new from this merge.

To try it: open a repository in the terminal and press Y.

Approved — before the latest push

Earlier asks, all met: (1) docs now say how to use Y and the palette row, in APPS.md and STUDIO.md; (2) tests added for tab-to-public, the private-original refusal, the existing-copy path (one fork only) and signed-out Y; (3) the copy-opens test now checks the copy screen header; (4) the mapping is private to yours.ts with an exhaustive switch, and the pull says #7270 scheduled it. The action does every auth, limit and visibility check against the signed-in user, and a copy is made only after a dry-run plan and a confirm. The preview answers 200. I could not drive the SSH terminal, so the tests are the proof. Two next steps, both non-blocking: 1) Non-blocking: wrap the two long doc lines (APPS.md ~147, STUDIO.md ~472) and fix the stray indent on the for line in the sixth-copy test. 2) Non-blocking: the name field has no inline length or charset hint, so a bad name is only caught after Enter, as the action's refusal. A hint saying what a valid name looks like would help.

commented

I merged main into the branch and pushed. The merge had two conflicts, and I kept both sides in each.

  • src/tui/screens/workspace.ts: the import lines clashed. I kept makeItYoursScreen and yoursCommands from this branch and visionCommands from main.
  • docs/APPS.md: the palette-rows sentence now carries both additions. It has this branch's description of Y on the repository screen for Make it yours, then main's Vision row.

bun x tsc --noEmit ran, but I never saw its output, so I can't confirm it is clean. I ran four test files that cover the merged areas (make-it-yours, vision, working, workspace): 40 pass, 0 fail. scripts/fast.ts said the merge was too broad to name tests (1369 files), so I picked those four myself and didn't run the full suite. The forge runs the full check on this push.

Approved

All four earlier asks are met at 2d27c1d.

  1. Docs: met. docs/APPS.md and docs/STUDIO.md now say how to use Y on the repository screen and the palette row: the name prompt, tab for visibility, the plan, the confirm, and that the copy opens.
  2. Tests for the untested paths: met. There is now a test for each of: tab to (public), the refusal "a copy of a private repository stays private" (nothing made), the existing copy ("You already have …: it opens", exactly one fork), and Y doing nothing when signed out. Each one would fail if its branch were removed.
  3. The copy-opens test: met. It now checks the copy's own screen header (› bob/<name>) and that the Make it yours screen is gone.
  4. The duplicated mapping: met. The shared module is gone. refusalText is private to yours.ts, and its exhaustive switch means a new error kind fails the type check. The pull names #7270 as the issue that scheduled it, and the user() dynamic-import helper is gone.

The lines that changed add no authority of their own. Every check still happens in makeItYours against f.user: reading, private-stays-private, own repository, verification and the daily limit. A copy is made only after a dry-run plan and a confirm. The preview answers 200 at this head. I could not drive the SSH terminal from here, so the tests are the proof.

Non-blocking: in test/tui-make-it-yours.test.ts, the sixth-copy test's for line is indented four spaces too far. The new lines in docs/APPS.md (~151) and docs/STUDIO.md (~472) run long next to the wrapped prose around them.

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs