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
Check · Review · Land · Live done — Landed and live in production.
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
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.
tabswitches it. - Plan:
Enterruns the same dry run MCPmake_it_yoursdoes. 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.
escat 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,
esccopies nothing, a sixth copy refused, and your own repository refused. I changed one assertion intest/tui-working-yours.test.tsbecause the palette now opens the new screen, which no longer says "Fork". The test was only checking the old title. - Left alone:
Fstill 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
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.
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:
- Fix first: the docs don't say how to use it. No README or docs line mentions
Yon 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 andtabvisibility prompt, the plan, the confirm. - Behaviours with no test.
tabswitching to public, including the refusal "a copy of a private repository stays private". Theexistingpath ("You already have …: it opens.", where Open opens the copy and makes no second repository).Ydoing nothing when not signed in. Add one test each; each should fail if its branch were removed. - The 'copy opens' test proves nothing about opening (line comment).
- Duplicated mapping.
make_it_yours_words.tsis a second copy of the switch inlined insrc/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 everyMakeItYoursErrorkind through both and asserts the same{code, message}, or keep the mapping private toyours.tsand 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.
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.
- Docs:
docs/APPS.mdanddocs/STUDIO.mdnow describeYon the repository screen. They cover the name prompt,tabfor visibility, the plan, the confirm, and that the copy opens. The palette row does the same. - 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.
- "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. - Duplicated mapping: I took the second option and dropped the shared module (
make_it_yours_words.tsis 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. 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.
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.
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.
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 keptmakeItYoursScreenandyoursCommandsfrom this branch andvisionCommandsfrommain.docs/APPS.md: the palette-rows sentence now carries both additions. It has this branch's description ofYon the repository screen for Make it yours, thenmain'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.
All four earlier asks are met at 2d27c1d.
- Docs: met. docs/APPS.md and docs/STUDIO.md now say how to use
Yon the repository screen and the palette row: the name prompt,tabfor visibility, the plan, the confirm, and that the copy opens. - 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), andYdoing nothing when signed out. Each one would fail if its branch were removed. - 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. - The duplicated mapping: met. The shared module is gone.
refusalTextis 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 theuser()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.
On a repository's screen in the terminal,
Ynow makes the app yours: a name and visibility first, then the plan, and a copy only after a confirm. The newtest/tui-make-it-yours.test.tspasses. So do the related MCP, make-it-yours and palette tests, andbun x tsc --noEmitis clean. I did not runbun test test/mcp-size.test.tson its own.tabswitches it.Enterruns the same dry run MCPmake_it_yoursdoes. 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.escat either step copies nothing. If you already have a copy, the dialog says so and opens it.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.:palette's "Make it yours" now opens this screen instead of the plain fork screen.esccopies nothing, a sixth copy refused, and your own repository refused. I changed one assertion intest/tui-working-yours.test.tsbecause the palette now opens the new screen, which no longer says "Fork". The test was only checking the old title.Fstill forks plainly, and an origin-hosted mirror still forks at its origin.The code is in
src/tui/screens/yours.ts, with theYkey and hint insrc/tui/screens/workspace.ts.🤖 Generated with Claude Code
Closes #7270