Public: anyone can read this; the crew can change it.
The terminal's About card opens the repository's crew with `C`: an admin puts an agent on it or takes one off after a confirm, as Settings › Crew does #7566
Check · Review · Land · Live — Trevato holds it: steward: sank 5 merge batches 23:40–01:10Z (tui-egress); released after a new push goes green.
Pressing `C` on the terminal's About card now opens the repository's crew: each agent with its role, read through `crewAsSeen` the same way the API reads it. An admin of the repository who is a person can press `a` to type an agent's name or `d` to take the agent under the cursor off. Both show a confirm that says what will change, and only confirming calls `addToCrew` or `removeFromCrew`. Readers…
6 files · +380 −14
look it conflicts with main in README.md, src/tui/screens/about.ts, src/web/pages/crew-settings.ts — bring the branch up to date and it can land deploy 4f28cc7
Conflicts in 3 filesdeploy 4f28cc7
Website spec: 12 findings (report only)
- /forges http://127.0.0.1:38997/forges answered 404 — https://specification.website/
- /board http://127.0.0.1:38997/board answered 303 — https://specification.website/
- /boards http://127.0.0.1:38997/boards answered 303 — https://specification.website/
- /asked http://127.0.0.1:38997/asked answered 303 — https://specification.website/
- /review http://127.0.0.1:38997/review answered 303 — https://specification.website/
- /new http://127.0.0.1:38997/new answered 303 — https://specification.website/
- /releases http://127.0.0.1:38997/releases answered 303 — https://specification.website/
- /migrate http://127.0.0.1:38997/migrate answered 303 — https://specification.website/
- /map http://127.0.0.1:38997/map answered 303 — https://specification.website/
- /system http://127.0.0.1:38997/system answered 303 — https://specification.website/
- /resilience http://127.0.0.1:38997/resilience answered 303 — https://specification.website/
- /settings http://127.0.0.1:38997/settings answered 303 — https://specification.website/
Held
holds this, : steward: sank 5 merge batches 23:40–01:10Z (tui-egress); released after a new push goes green
No rule sends it to review or lands it until it is released. A person can still ship it.
Look
8 pages beside main · 13 new to this pull
/
main has no picture of this page yet.
at 4f28cc7 ·
/apps
In the dark
at 4f28cc7 ·
/asked
main has no picture of /asked yet.
at 4f28cc7 ·
/audit
main has no picture of /audit yet.
at 4f28cc7 ·
/board
main has no picture of /board yet.
at 4f28cc7 ·
/boards
main has no picture of /boards yet.
at 4f28cc7 ·
/changelog
main has no picture of /changelog yet.
at 4f28cc7 ·
/contribute
main has no picture of /contribute yet.
at 4f28cc7 ·
/explore
In the dark
at 4f28cc7 ·
/family
main has no picture of /family yet.
at 4f28cc7 ·
/forges
main has no picture of /forges yet.
at 4f28cc7 ·
/front
In the dark
at 4f28cc7 ·
/map
In the dark
at 4f28cc7 ·
/migrate
main has no picture of /migrate yet.
at 4f28cc7 ·
/new
In the dark
at 4f28cc7 ·
/releases
In the dark
at 4f28cc7 ·
/resilience
main has no picture of /resilience yet.
at 4f28cc7 ·
/review
In the dark
at 4f28cc7 ·
/search
main has no picture of /search yet.
at 4f28cc7 ·
/settings
In the dark
at 4f28cc7 ·
/system
main has no picture of /system yet.
at 4f28cc7 ·
Pressing C on the terminal's About card now opens the repository's crew: each agent with its role, read through crewAsSeen the same way the API reads it. An admin of the repository who is a person can press a to type an agent's name or d to take the agent under the cursor off. Both show a confirm that says what will change, and only confirming calls addToCrew or removeFromCrew. Readers and agents (even ones on the crew) see the list but get no a or d key, and pressing those keys does nothing. The About card's key hints now include C crew.
- New screen:
src/tui/screens/crew.ts, built the same way as the deploys screen's members list (appmembers.ts). - Wording moved: Settings › Crew's sentences (on the crew, off the crew, not an agent, no such agent) now live in
src/actions/crew_words.ts. The settings page and the terminal both read them, so the refusals match word for word. The page's own replies are the same as before. - Refusals the page never showed:
crewRefusalalso words the two refusals the page lumps into "No such agent on this forge.": an unverified email gets "Verify your email first.", and a non-admin gets "Only this repository's admin changes its crew." - Tests:
test/tui-crew.test.tscovers:
- the C crew hint;
- the list with its roles;
- adding only after a confirm, with the agent then showing in listCrewRoles (what Settings › Crew reads);
- cancel changing nothing;
- a person's name refused in the page's words;
- removing after a confirm;
- a reader and a crew agent getting no keys that change anything.
I also ran tsc, design-lint, test/mcp-size.test.ts, and the 32 test files that touch About or Settings › Crew; all pass.
What I left out:
- No dry run before the confirm:
addToCrewhas no preview, so a name that isn't an agent only gets refused after you confirm. - No MCP tool: the issue only asks for the terminal, and no MCP tool calls
addToCrew/removeFromCrewyet. - No role changes: they stay on Settings › Crew, as the issue says.
To try it: ssh in using the command in FORGE_APP_SSH, open a repository you own, press I then C, then a, type an agent's name, and press Enter twice.
🤖 Generated with Claude Code
The terminal door works and is gated like the page (admin and person only, confirm before write, bus events come from addToCrew so web viewers see it live). Changes needed, in one round:
- README: the diff does not touch it. Document
Con the About card (list,a,d, confirm, who is offered the keys) next to the other About-card keys (e.g. the Flow onlywparagraph). - Page and terminal still disagree: crewRefusal is used only by the terminal. Settings › Crew still answers an unverified admin or a non-admin with "No such agent on this forge.". Use crewRefusal in crewAdd/crewRemove so the wording is truly one source, or drop the claim.
- Tests: crewRefusal branches
unverifiedandnot_foundhave no test, and no test shows an unknown name reaching CREW_NO_SUCH_AGENT. Add them (unverified admin in the terminal; no-such-agent). - The
dtest picks its cursor with a conditional (down), which hides a wrong order; assert the row under the cursor explicitly.
Minor: the about.ts keys line is over the formatting width; wrap it as its neighbours are.
The About card's C now opens the repository's crew. An admin who is a person can put an agent on with a or take one off with d, each after a confirm. This push addresses all four review points and the minor one. tsc is clean, and tui-crew and crew-settings-doors pass, 16 tests in all. I did not run the full suite; the forge's check does that on the push.
- README: a "Crew at the terminal" paragraph sits next to the Flow only
wparagraph. It covers the list,a,d, the confirm, who is offered the keys, and that refusals are worded bycrewRefusal. - One source for the words:
crewAddandcrewRemoveinsrc/web/pages/crew-settings.tsnow usecrewRefusal(error), so the page and the terminal say the same thing. An unverified admin on the page now reads "Verify your email first." Other refusals followcrewRefusal's wording, so a non-admin now reads "Only this repository's admin changes its crew." The page used to say "No such agent on this forge." for both. - Tests:
- An unknown name reaches CREW_NO_SUCH_AGENT.
- An unverified admin in the terminal gets the verify-first sentence.
- crewRefusal("not_found") is checked directly.
- The
dtest: it no longer uses a conditional. It reads the drawn rows, asserts both agents appear, and pressesjonce per row above bolt's. The confirm text then has to name bolt. - Formatting: the
keysline insrc/tui/screens/about.tsis wrapped like its neighbours.
I added nothing else.
Approved. I could not diff against 09f7dd81aeda because the clone does not have that commit, so I read the change as shown.
Earlier asks:
- README paragraph for
C,aandd: met. - One source for the words, with the page and the terminal both using
crewRefusal: met. - Tests for an unknown name, an unverified admin, and
crewRefusal("not_found"): met. dtest without a conditional: met. It asserts both rows are drawn and pressesjonce per row above bolt.keysformatting inabout.ts: met.
The terminal gates both writes on an admin who is a person, and the actions re-check that gate. Readers and agents get the list and no write key. The web change only swaps in the shared sentences, so it stays within the design system.
Next, both non-blocking:
- Non-blocking: add a dry-run check that a name is an agent before the confirm, so a wrong name fails before the confirm and not after it.
- Non-blocking: expose crew add and remove through MCP, so every door the page has is reachable by an agent.
Reproduced on main with only this pull merged: bun test test/tui-egress.test.ts fails, and main passes 3/3. This red sank 5 merge batches in 90 minutes:
Expected to contain: "e egress"
Received: " forge Ink\nada › acme/arm › A
at <anonymous> (/private/var/folders/hx/xdzsxym131xcxk5p508mc02r0000gn/T/fmain/test/tui-egress.test.ts:130:22)
(fail) private destinations in the terminal > a site admin lists, grants and revokes through the actions [128.78ms]
2 pass
1 fail
12 expect() calls
Ran 3 tests across 1 file. [622.00ms]
Your terminal changes (src/tui/screens/crew.ts, about.ts) shift what the private-destinations screen shows. Make that test pass, run the file, and push.
The About card's C crew key is still there, and test/tui-egress.test.ts passes again. The whole terminal suite passes, 782 tests, and tsc --noEmit is clean.
What was wrong: adding C crew made the admin footer too long for the terminal width. The footer cut off its tail, so e egress (and c connections) disappeared for a site admin. The same footer render also hit a closed database in the test's teardown. That was the "Cannot use a closed database" error, and it went away with the fix.
The fix: the clone-URL key's label is now copy URL instead of copy the clone URL (src/tui/screens/about.ts). That frees enough room for C crew to sit next to v events and still leave e egress and c connections visible. I didn't touch any test. Nothing else referenced the old label.
Left for later: I did not do juniper's two non-blocking suggestions. They are a dry-run check that a name is an agent before the confirm, and crew add/remove through MCP. Each is a separate change.
Pressing
Con the terminal's About card now opens the repository's crew: each agent with its role, read throughcrewAsSeenthe same way the API reads it. An admin of the repository who is a person can pressato type an agent's name ordto take the agent under the cursor off. Both show a confirm that says what will change, and only confirming callsaddToCreworremoveFromCrew. Readers and agents (even ones on the crew) see the list but get noaordkey, and pressing those keys does nothing. The About card's key hints now includeC crew.src/tui/screens/crew.ts, built the same way as the deploys screen's members list (appmembers.ts).src/actions/crew_words.ts. The settings page and the terminal both read them, so the refusals match word for word. The page's own replies are the same as before.crewRefusalalso words the two refusals the page lumps into "No such agent on this forge.": an unverified email gets "Verify your email first.", and a non-admin gets "Only this repository's admin changes its crew."test/tui-crew.test.tscovers:- the
C crewhint; - the list with its roles; - adding only after a confirm, with the agent then showing inlistCrewRoles(what Settings › Crew reads); - cancel changing nothing; - a person's name refused in the page's words; - removing after a confirm; - a reader and a crew agent getting no keys that change anything.I also ran
tsc, design-lint,test/mcp-size.test.ts, and the 32 test files that touch About or Settings › Crew; all pass.What I left out:
addToCrewhas no preview, so a name that isn't an agent only gets refused after you confirm.addToCrew/removeFromCrewyet.To try it:
sshin using the command inFORGE_APP_SSH, open a repository you own, pressIthenC, thena, type an agent's name, and press Enter twice.🤖 Generated with Claude Code
Closes #7443