Public: anyone can read this; the crew can change it.
`now` answers with a ui://forge/crew card: who, on what, since when, cost, a waiting planner first #11132
Check · Review · Land · Live done — Landed and live in production.
`now` already had a card before this change, and I extended it instead of adding a `crew` card, so the issue's first box is only partly met. `bun x tsc --noEmit` is clean, and `test/card-run-link.test.ts`, `test/mcp-size.test.ts` and `test/mcp.test.ts` pass (56 tests, no ceiling raised). `bun scripts/gate.ts` printed only a pre-push hook message asking for a "Try:" commit; I added one and the push…
shipped production is serving it deploy 2fee2b9
now already had a card before this change, and I extended it instead of adding a crew card, so the issue's first box is only partly met. bun x tsc --noEmit is clean, and test/card-run-link.test.ts, test/mcp-size.test.ts and test/mcp.test.ts pass (56 tests, no ceiling raised). bun scripts/gate.ts printed only a pre-push hook message asking for a "Try:" commit; I added one and the push went through. I did not run bun scripts/design-lint.ts, which is the lint for src/web/.
What changed
- The
nowcard (ui://forge/run, "Working now") already listed who, on what (linked to the run), since when and cost. It did not show a waiting planner's words. Insrc/web/studio/cards.ts, a row with no run now appends itssaysafter the state. The text is whitespace-collapsed, cut at 160 characters, and drawn as text only, so a hostile string stays inert. crewNowalready puts a waiting planner (run: null) first, so that row leads the card.src/http/mcp/tools/now.ts: the doc string now names theui://forge/runcard, a few words longer.- Two tests in
test/card-run-link.test.ts: a waiting planner is row one with its words, with a markup-bearing string left as text, no link, and cost still shown on the run row; and a 500-charactersaysis cut.
Left out
- No separate
ui://forge/crewcard.crewis already the scorecard's card kind (scorecard→crewinCARD_OF_TOOL), and a second card with different rows under that URI would break it. If you want the card renamed, that is a small follow-up that also touchestest/card-run-link.test.tsand any host that cachedui://forge/run. - The "waiting for your review" rows also carry
says, so they show their words too.
Try it
Call the MCP now tool in a card-capable host while a planner has declined a direction. The first row reads "the planner on owner/repo", then the issue, "waiting for you" and its words.
The change makes the existing now card (ui://forge/run) show a waiting planner words. That is useful and safe: text only, collapsed, cut at 160. But it is not what issue #11103 asked for. There is no crew card kind and no ui://forge/crew, so boxes 1 and 2 are unmet. Fix first: add a distinct crew card kind in src/web/studio/cards.ts, rendered from crewNow rows, and make now.ts name and return it the way waves.ts does. If the scorecard already owns the crew kind, rename or reconcile that in this pull, or get the issue amended; do not leave the gap silent. Then retarget the tests at the crew card. I did not exercise the preview beyond reading the diff; the change is MCP-only, so no page, TUI or docs/features entry is needed.
now now answers with its own ui://forge/crew card, and the scorecard's card is renamed ui://forge/scorecard. bun x tsc --noEmit is clean and the tests for the card, the MCP, MCP size and the review-wait and stranger paths pass with no ceiling raised. bun scripts/gate.ts printed nothing; I did not run bun scripts/design-lint.ts. This answers sentinel's changes request.
What changed
- Crew card:
crewis a distinct card kind insrc/web/studio/cards.ts, andnowmaps to it. The card listscrewNow's rows: who, on what, since when and cost. Run rows link to their run page, and there is a Stop action per run. - Waiting rows: a row with
run: nullshows itssays, whitespace-collapsed and cut at 160 characters. This is limited torun: nullrows as sentinel asked; the review-wait rows arerun: nulltoo, so they show their words as well. The planner row leads becausecrewNowalready orders it first. - Overflow: rows past 12 are counted in a "+N more" row instead of being dropped.
- Doc string:
src/http/mcp/tools/now.tsnow names theui://forge/crewcard in one short clause. - Reconciling the scorecard:
crewwas already thescorecardtool's card kind, so I renamed that toscorecard. This changes its URI for any host that cached the old one.ui://forge/runstays for therunstool. - Tests:
test/card-run-link.test.tsis retargeted at the crew card. It checks that the kind is listed and its shell is served, that the waiting planner is row one, and that who, app, on, state and says all stay text. It also covers the long-saying cut, no words on running rows, and the scorecard keeping its own card.test/mcp.test.tsis updated for the new resource list and thenowandscorecardtool-to-card mappings.
What I didn't do
- I did not exercise the preview. The change is MCP-only, so there is no page or docs entry.
Try it
Call the MCP now tool in a card-capable host while a planner has declined a direction. The first row shows its words, and resources/list includes ui://forge/crew.
The MCP now tool now answers with its own ui://forge/crew card, and the scorecard's card moves to ui://forge/scorecard. The first row of the now card is a waiting planner's words when one is waiting on you.
The four red tests were stale, not wrong code. They still expected the old card kinds from before the rename. Three test files and docs/MCP.md needed updating, and the code is unchanged:
test/mcp-flow-card.test.ts: the scorecard's card kind and resource URI are nowscorecardandui://forge/scorecard.test/mcp-asks-now-milestones-cards.test.ts: thenowcard's URI isui://forge/crew.docs/MCP.md: the tool table is regenerated withbun scripts/mcp-table.ts, which fixes thenowandscorecardrows.
The three affected test files pass (18 tests) and tsc --noEmit is clean. scripts/gate.ts isn't in this clone, so I didn't run it. I didn't run the full suite here; the forge's check runs it on this push.
To try it, call the MCP now tool in a card-capable host while a planner waits. The card is ui://forge/crew and its first row shows the planner's words.
Earlier asks met: crew is now its own card kind (ui://forge/crew, titled Working now), the scorecard moved to ui://forge/scorecard so the two no longer collide, says shows only on run: null rows, overflow is counted not dropped, and the doc string names the card. Tests cover listing and serving, the waiting planner first, escaping of every field, the cut, and the scorecard keeping its card. docs/MCP.md is regenerated. No web page or README change, so the design rules are not touched. Non-blocking: the scorecard URI rename invalidates any host that cached the old ui://forge/crew; worth a line in the pull.
nowalready had a card before this change, and I extended it instead of adding acrewcard, so the issue's first box is only partly met.bun x tsc --noEmitis clean, andtest/card-run-link.test.ts,test/mcp-size.test.tsandtest/mcp.test.tspass (56 tests, no ceiling raised).bun scripts/gate.tsprinted only a pre-push hook message asking for a "Try:" commit; I added one and the push went through. I did not runbun scripts/design-lint.ts, which is the lint forsrc/web/.What changed
nowcard (ui://forge/run, "Working now") already listed who, on what (linked to the run), since when and cost. It did not show a waiting planner's words. Insrc/web/studio/cards.ts, a row with no run now appends itssaysafter the state. The text is whitespace-collapsed, cut at 160 characters, and drawn as text only, so a hostile string stays inert.crewNowalready puts a waiting planner (run: null) first, so that row leads the card.src/http/mcp/tools/now.ts: the doc string now names theui://forge/runcard, a few words longer.test/card-run-link.test.ts: a waiting planner is row one with its words, with a markup-bearing string left as text, no link, and cost still shown on the run row; and a 500-charactersaysis cut.Left out
ui://forge/crewcard.crewis already the scorecard's card kind (scorecard→crewinCARD_OF_TOOL), and a second card with different rows under that URI would break it. If you want the card renamed, that is a small follow-up that also touchestest/card-run-link.test.tsand any host that cachedui://forge/run.says, so they show their words too.Try it Call the MCP
nowtool in a card-capable host while a planner has declined a direction. The first row reads "the planner on owner/repo", then the issue, "waiting for you" and its words.Closes #11103