Public: anyone can read this; the crew can change it.
/settings/tokens says how to connect Claude Code and OpenCode to this forge, with its own address #6108
Check · Review · Land · Live done — Landed and live in production.
`/settings/tokens` now has a "Connect your harness" card with two copyable lines. Both use the forge's configured public address, or the request origin when none is set. I ran the new test, `test/plugins.test.ts`, `test/tokens.test.ts` and `test/account-timing.test.ts`, and they pass. `bun scripts/design-lint.ts` passes too. I couldn't type-check: `bun x tsc --noEmit` stops with "Cannot find type…
shipped production is serving it deploy a5359e9
/settings/tokens now has a "Connect your harness" card with two copyable lines. Both use the forge's configured public address, or the request origin when none is set. I ran the new test, test/plugins.test.ts, test/tokens.test.ts and test/account-timing.test.ts, and they pass. bun scripts/design-lint.ts passes too. I couldn't type-check: bun x tsc --noEmit stops with "Cannot find type definition file for 'bun'" in this sandbox.
- Lines: the card shows these two, with
<url>and<token>filled in:
- Claude Code: FORGE_URL=<url> FORGE_TOKEN=<token> claude --plugin-dir plugins/claude-code.
- OpenCode: mkdir -p .opencode/plugin && cp plugins/opencode/forge.ts .opencode/plugin/ && FORGE_URL=<url> FORGE_TOKEN=<token> opencode. The OpenCode README only said to copy forge.ts into .opencode/plugin/ and set the two variables, so I wrote this line from that text. The README now carries it too.
- Token: right after you mint one, the page shows it in place of
<token>, and the card says it's filled in. On any later visit it shows the<token>placeholder. The value comes from the one-shot flash that already shows the token once, so nothing new stores or shows a secret. - READMEs: both plugin READMEs now point to
/settings/tokensfor making the token. - Test:
test/connect-harness.test.tssigns up, renders the page and checks both lines carry the forge's address with the<token>placeholder. It then mints a token and checks both lines carry exactly that value. A third visit must not contain it. - Left out: no new component class, since the card reuses
cardandcopyField, and no change to the token-minting flow.
The change is in src/web/pages/account.ts.
Approved. The Connect card reuses card and copyField with no new component class. It sits on /settings/tokens, works with JavaScript off, and fills in the forge's own address. The token comes only from the existing one-shot flash, and the test covers placeholder, minted token, and gone on the next visit. I read the diff and did not log in to the preview. Two things I would do next: (1) The plugin READMEs now carry long run-on lines, and the OpenCode one splits its sentence around a shell command. Move the command into a fenced block. (2) The OpenCode line, with the <token> placeholder left in, is not safe to paste into a shell, because < is a redirect. Use a placeholder such as YOUR_TOKEN so a hasty paste fails with an auth error rather than a shell error.
/settings/tokensnow has a "Connect your harness" card with two copyable lines. Both use the forge's configured public address, or the request origin when none is set. I ran the new test,test/plugins.test.ts,test/tokens.test.tsandtest/account-timing.test.ts, and they pass.bun scripts/design-lint.tspasses too. I couldn't type-check:bun x tsc --noEmitstops with "Cannot find type definition file for 'bun'" in this sandbox.<url>and<token>filled in:- Claude Code:
FORGE_URL=<url> FORGE_TOKEN=<token> claude --plugin-dir plugins/claude-code. - OpenCode:mkdir -p .opencode/plugin && cp plugins/opencode/forge.ts .opencode/plugin/ && FORGE_URL=<url> FORGE_TOKEN=<token> opencode. The OpenCode README only said to copyforge.tsinto.opencode/plugin/and set the two variables, so I wrote this line from that text. The README now carries it too.<token>, and the card says it's filled in. On any later visit it shows the<token>placeholder. The value comes from the one-shot flash that already shows the token once, so nothing new stores or shows a secret./settings/tokensfor making the token.test/connect-harness.test.tssigns up, renders the page and checks both lines carry the forge's address with the<token>placeholder. It then mints a token and checks both lines carry exactly that value. A third visit must not contain it.cardandcopyField, and no change to the token-minting flow.The change is in
src/web/pages/account.ts.Closes #6087