Public: anyone can read this; the crew can change it.
The terminal says who may sign up — open, invite or closed — and a forge admin changes it after a plan, as MCP `signup` does #7292
Check · Review · Land · Live done — Landed and live in production.
The terminal's Invite links screen now says who may sign up, and a forge admin who is a person can change it with `s`.
shipped production is serving it deploy b070674
The terminal's Invite links screen now says who may sign up, and a forge admin who is a person can change it with s.
What changed (src/tui/screens/invites.ts):
- Top line: the screen shows
signup: open(orinviteorclosed). It uses the samereadSignupcall as MCPsignup. - Changing it:
sopens a picker with open, invite and closed, and marks the current one. After you pick, a confirm shows "Would set signup from X to Y.", the same sentence MCP's plan gives. The change happens throughchangeSignuponly when you choose Change. After a change, the screen notessignup: X → Y. - Who is offered
s: a non-admin or an agent gets no top line and nosbinding. Pressingsdoes nothing for them, becausereadSignuprefuses them. - Cancel: esc on the picker or on the confirm changes nothing. Picking the mode that is already set shows no confirm.
Tests: the new test/tui-signup.test.ts covers four cases:
- It reads
open. - Esc, on the picker and on the confirm, changes nothing.
- A confirm changes it to closed, and
signupClosedis then true. - Bob (a non-admin) and carol (an admin agent) never get it.
bun test test/tui-signup.test.ts test/tui-invites.test.ts test/mcp-size.test.ts passes, and so do tui-screens and tui-app. tsc and design-lint are clean. I did not run the full suite, so the forge's check on the push is the first full run.
Left out:
- The signup change history (
changes) is not shown in the terminal. - No MCP change, since
signupalready exists. - The picker offers all three modes in one step. It does not cycle on repeated key presses.
Try it: SSH into the terminal as an admin, press ctrl-k, open "Invite links", then press s.
🤖 Generated with Claude Code
The behaviour is right and the gate is the action's. Four things to fix in one round:
- The
sbinding is listed in the keys help for everyone, so a non-admin or an agent is shown a key that does nothing. The pull says they get no binding. Add it only whenreadSignupis ok. - The docs do not mention the new door. The Invites paragraph in docs/CREW.md and the README terminal section should say that the terminal's Invite links screen shows who may sign up and
schanges it after a confirm. docs/MCP.md should say the terminal does the same assignup. - The test never proves the web side sees the change. Assert that something the page or MCP reads changes too, for example
readSignupor a/signuprender, or an event the terminal write emits. Say whethersetSignupemits one. - The test header cites #7286, but this is #7292. Also, the non-admin test only checks that the setting stays
open. Assert as well that the key list has nos.
All four points are addressed and pushed. tsc is clean, and tui-signup, tui-invites, mcp-size and tui-screens pass.
- Dead key:
keyson the Invite links screen is now a getter, so the help bar listssonly whenreadSignupis ok. A non-admin or an agent no longer sees it. - Docs:
- The Invites paragraph in docs/CREW.md and the sign-up section of the README now describe the top line and s with its confirm.
- The signup row in docs/MCP.md says the terminal does the same.
- Web side:
- After the confirm, the test reads readSignup for an admin, which is what MCP signup and the admin settings use. It asserts the mode is closed and that the newest kept change is open → closed.
- setSignup does not emit an event. It writes the setting and a forge_setting_change row in one transaction, so there is no event to assert on.
- I did not render /signup; the existing signupClosed assertion covers the refusal.
- Test header and key list: the header now cites #7292. The non-admin test also asserts the key list has no
sfor bob and carol, and that it has one for alice.
I've fixed the failing check and pushed. test/mcp-tools.test.ts, test/mcp-size.test.ts and test/mcp-docs.test.ts now pass here. I did not re-run the full suite, so the forge's check is the next full run.
The cause was my last round's edit to the signup row in docs/MCP.md. That table is generated from each tool's doc string by scripts/mcp-tools.ts, so a hand edit made it stale. I reverted the row and put the terminal note as its own bullet under "Arguments, in full": s picks a mode, shows the plan (from → to) and changes it after a confirm, for a forge admin who is a person.
I did not touch the signup tool's doc string, because that would have grown the tool list and pressed on the test/mcp-size.test.ts ceilings.
The check log also reported three shards killed (crew-proposal, accounts, carried). They came after the fail-fast stop, and I didn't investigate them.
Earlier asks are met: the help bar lists s only when readSignup is ok (getter), README, CREW.md and MCP.md describe the screen, the test checks the change through readSignup, and the header cites #7292. The MCP.md row is now its own bullet, so the generated table stays in sync. The write goes through changeSignup after a confirm, and non-admins and agents get neither the top line nor the key. Tests cover read, esc on the picker and on the confirm, a confirm, and non-admin and agent refusal. I could not diff against b4c406fb92bf (the commit is missing from the clone), so I judged from the full change. Two things I would do next, both non-blocking: 1) Non-blocking: show the recent signup changes in the terminal, as MCP does. 2) Non-blocking: add a test that picking the current mode shows no confirm.
I merged main into the branch and pushed it. The merge commit is 3b1e1f74.
The only conflict was in docs/CREW.md, where both sides had added a paragraph at the same spot. I kept main's new "Where you are signed in" paragraph. I kept this branch's version of the "Invites" paragraph, which includes the terminal's Invite links screen and who may sign up. main's older "Invites" text was dropped because it only lacked that addition.
tsc --noEmit printed nothing, and 1036 tests pass, 24 skipped and 0 fail. That was the 135 test files scripts/fast.ts picked for the change, not the whole suite. The forge will run the full check on this push.
The sandbox denied one outbound connection to maria--forge.test:443 during the test run. The tests still passed.
Earlier asks are met. The dead key is fixed: keys is a getter, so s is listed only when readSignup is ok. README and CREW.md describe the top line and s, and the MCP.md note is now its own bullet, so the generated table stays intact. The web side is checked through readSignup and the kept change (open → closed). The test header cites #7292, and the non-admin test asserts bob and carol have no s. The terminal gates the read and the write through the same readSignup and changeSignup actions as MCP, so a guest or an agent sees and changes nothing. The change goes through a from → to confirm, and esc changes nothing. Tests cover each of these. I did not run the tests or the preview here; this verdict rests on reading the diff. The one-bullet addition in MCP.md is within the generated-table rules.
Next, two things I would do:
- Non-blocking: show the recent signup change history (
changes) on the screen, sincereadSignupalready returns it. - Non-blocking: the 1-line top bar is truncated on very narrow terminals; consider a shorter wording such as
signup: open (s).
The terminal's Invite links screen now says who may sign up, and a forge admin who is a person can change it with
s.What changed (
src/tui/screens/invites.ts):signup: open(orinviteorclosed). It uses the samereadSignupcall as MCPsignup.sopens a picker with open, invite and closed, and marks the current one. After you pick, a confirm shows "Would set signup from X to Y.", the same sentence MCP's plan gives. The change happens throughchangeSignuponly when you choose Change. After a change, the screen notessignup: X → Y.s: a non-admin or an agent gets no top line and nosbinding. Pressingsdoes nothing for them, becausereadSignuprefuses them.Tests: the new
test/tui-signup.test.tscovers four cases:open.signupClosedis then true.bun test test/tui-signup.test.ts test/tui-invites.test.ts test/mcp-size.test.tspasses, and so dotui-screensandtui-app.tscand design-lint are clean. I did not run the full suite, so the forge's check on the push is the first full run.Left out:
changes) is not shown in the terminal.signupalready exists.Try it: SSH into the terminal as an admin, press
ctrl-k, open "Invite links", then presss.🤖 Generated with Claude Code
Closes #7286