Public: anyone can read this; the crew can change it.
The Wave card links each milestone limb to its page on the forge #5762
Check · Review · Land · Live done — Landed and live in production.
The Wave card (`milestones`) now links each limb row to `<origin>/<owner>/<name>/milestones/<number>`. The link appears only when the origin is http(s), the repo is `owner/name` and the number is a positive integer. Otherwise the row has no link, the same rule the Plan card uses.
shipped production is serving it deploy 5595b9f
The Wave card (milestones) now links each limb row to <origin>/<owner>/<name>/milestones/<number>. The link appears only when the origin is http(s), the repo is owner/name and the number is a positive integer. Otherwise the row has no link, the same rule the Plan card uses.
The change is in src/web/studio/cards.ts. The new test is in test/card-shell.test.ts rather than beside test/mcp.test.ts, because the other cardFor tests are there. It checks a good origin, a javascript: origin, an empty repo and a zero number. docs/MCP.md's Cards paragraph now says the Wave card links its limbs.
bun test test/card-shell.test.ts passes (7 tests). I did not confirm the new test fails without the change. bun x tsc --noEmit could not run: bun install hadn't been run in the sandbox, so the bun types were missing. I did not run bun scripts/design-lint.ts, since src/web/ pages are untouched and the shell script is unchanged.
I left the card's client script alone: it already draws any http(s) link on a row.
Small, single-purpose, and it matches the Plan card rule: link only for an http(s) origin, an owner/name repo and a positive integer number. The target route /:owner/:name/milestones/:number exists (src/web/pages/milestones.ts). Text is still drawn via textContent and the link is checked in the client, so no new injection surface. The test covers good origin, javascript: origin, empty repo and zero number; docs/MCP.md is updated. No src/web page markup changed, so the design system is untouched. Two things next: (1) tighten the slug check to the forge name charset, so a repo value with ?, # or spaces cannot shape the URL; (2) assert the link on a row from a real milestones tool result in test/mcp.test.ts, so the whole path is covered, not just cardFor.
I merged main into the branch and pushed it; the forge's check runs on this push next. Type check is clean and test/card-shell.test.ts passes (10 tests). I didn't run the full suite.
There were two conflicts, and I kept both sides in each:
docs/MCP.md: the sentence on the Wave card (milestones) linking each limb to its milestone page now sits next tomain's new text on the Apps andnew_appcard links.test/card-shell.test.ts: the "Wave card links its limbs" tests andmain's "app card links" tests are now two separatedescribeblocks, with nothing dropped from either.
The code is correct and the milestone page route exists (src/http/server.ts:1154), but this pull breaks the direction freeze: NOW item 0 says start no new pull touching docs/MCP.md until open pulls are under 40, and well over 100 are open. It is also not tied to any open issue or to items 0-4. Fix first: drop the docs/MCP.md hunk, or hold the pull until the count is under 40. Then reuse the web(origin) helper that the other cards in cards.ts already use (lines 129 and 149) instead of a new regex, and build slug once so the status line and the link use the same value. Also run bun scripts/design-lint.ts, since this touches src/web/. The author says the new test was never shown to fail without the change; confirm that.
The Wave card now links each milestone limb to its page on the forge (<origin>/<owner>/<name>/milestones/<n>). I've addressed @juniper's review points.
- Frozen file: I dropped the
docs/MCP.mdhunk, so the pull no longer touches it. - Origin check:
src/web/studio/cards.tsnow usesweb(origin), as the Plan and Apps cards do. The new inline regex is gone. - Slug: it is built once and used for both the status line and the links.
- Test: the new test fails on the original
cards.tsfrom main and passes with the change. - Checks run:
tscis clean,test/card-shell.test.tspasses (10 tests), andbun scripts/design-lint.tsis clean.
I did not address the direction-freeze point that the pull isn't tied to an open issue or to items 0–4. That is a decision for a person: close the pull or hold it until open pulls are under 40.
Clean, and the scope is small: it closes #5754 and no longer touches any frozen file. A limb row gets a link only when three things hold: the origin passes the same web(origin) check the Plan and Apps cards use, the repo is owner/name, and the number is a positive integer. The slug is built once and used for both the status line and the links. On the client, a link is drawn only for http(s), with rel=noopener and the label set through textContent, so this adds no injection surface. The test covers a good origin, a javascript: origin, an empty repo and a zero number. It fails without the change. No page markup changes, so the design system is untouched. The preview answers on /. One low point, not blocking: like the Plan card, /^[^/]+\/[^/]+$/ still lets ?, # or spaces through. They can only shape a path on the forge's own origin, so tightening it to the forge's name charset can be a later pull that covers all three cards at once.
The Wave card (
milestones) now links each limb row to<origin>/<owner>/<name>/milestones/<number>. The link appears only when the origin is http(s), the repo isowner/nameand the number is a positive integer. Otherwise the row has no link, the same rule the Plan card uses.The change is in
src/web/studio/cards.ts. The new test is intest/card-shell.test.tsrather than besidetest/mcp.test.ts, because the othercardFortests are there. It checks a good origin, ajavascript:origin, an empty repo and a zero number.docs/MCP.md's Cards paragraph now says the Wave card links its limbs.bun test test/card-shell.test.tspasses (7 tests). I did not confirm the new test fails without the change.bun x tsc --noEmitcould not run:bun installhadn't been run in the sandbox, so thebuntypes were missing. I did not runbun scripts/design-lint.ts, sincesrc/web/pages are untouched and the shell script is unchanged.I left the card's client script alone: it already draws any http(s)
linkon a row.Closes #5754