Public: anyone can read this; the crew can change it.

The Claude Code and OpenCode commands gain waves, held and forks, in the same words as the pages #11499

Merged opened this

Check · Review · Land · Live done — Landed and live in production.

Merged

The Claude Code `/forge` command and the OpenCode `forge` command now each have three more verbs: `waves <app>`, `held` and `forks <app>`. The plugin, MCP-size and tsc checks pass, and `scripts/gate.ts` ran clean; I did not run the full `bun test`, which the forge runs on the push.

shipped production is serving it deploy abf00b0

opened this

The Claude Code /forge command and the OpenCode forge command now each have three more verbs: waves <app>, held and forks <app>. The plugin, MCP-size and tsc checks pass, and scripts/gate.ts ran clean; I did not run the full bun test, which the forge runs on the push.

What changed

  • waves <app> calls waves and relays the newest three waves as version, date and headline.
  • held calls held without apply. It says how many themes the Later gate holds and which are done, meaning the issues in approve.
  • forks <app> calls forks with kind: "chain". It says in two lines what the app follows upstream and who follows it downstream, and notes a severed link.
  • Each verb's line says "Read-only", and held says "never" apply. Nothing is landed, and nothing is closed.
  • The Claude Code description and argument-hint lines, the OpenCode description, and both READMEs list the three verbs.

Guard against drift

  • test/plugins.test.ts already compared the two plugins' verb sets. Its expected list now includes the new verbs, so a plugin missing one fails.
  • A new test checks, for both plugins, that the three tools exist in the forge and that each line says "Read-only". It also checks that held forbids apply, that forks passes chain, and that the hints and READMEs list the verbs.
  • I added app and apply to the test's list of argument names that are not tools.

What I left alone

  • No new MCP tools or ceilings.
  • held's apply path, which closes issues, is deliberately not reachable from the command.

Try it

  • Run bun test test/plugins.test.ts test/mcp-size.test.ts.
  • With the plugin loaded, run /forge held or /forge forks <app>.

🤖 Generated with Claude Code

Closes #11481

commented

The Claude Code /forge command and the OpenCode forge command now each have three more verbs: waves <app>, held and forks <app>. The plugin, MCP-size and tsc checks pass, and scripts/gate.ts ran clean; I did not run the full bun test, which the forge runs on the push.

What changed

  • waves <app> calls waves and relays the newest three waves as version, date and headline.
  • held calls held without apply. It says how many themes the Later gate holds and which are done, meaning the issues in approve.
  • forks <app> calls forks with kind: "chain". It says in two lines what the app follows upstream and who follows it downstream, and notes a severed link.
  • Each verb's line says "Read-only", and held says "never" apply. Nothing is landed, and nothing is closed.
  • The Claude Code description and argument-hint lines, the OpenCode description, and both READMEs list the three verbs.

Guard against drift

  • test/plugins.test.ts already compared the two plugins' verb sets. Its expected list now includes the new verbs, so a plugin missing one fails.
  • A new test checks, for both plugins, that the three tools exist in the forge and that each line says "Read-only". It also checks that held forbids apply, that forks passes chain, and that the hints and READMEs list the verbs.
  • I added app and apply to the test's list of argument names that are not tools.

What I left alone

  • No new MCP tools or ceilings.
  • held's apply path, which closes issues, is deliberately not reachable from the command.

Try it

  • Run bun test test/plugins.test.ts test/mcp-size.test.ts.
  • With the plugin loaded, run /forge held or /forge forks <app>.

🤖 Generated with Claude Code

Changes requested — before the latest push

One fix, the rest is good. held requires app (src/http/mcp/tools/held.ts: required: ["app"]), but the verb is held with no argument and the command says "app set to the app when one is known". With none known the agent has nothing to pass and the call fails. Fix: either make the verb held <app> everywhere (both command texts, both argument-hint/description lines, both READMEs, the test regexes and the expected verb list stays the same), or say which app it defaults to. The issue text says held, so the smaller change is to tell the agent to ask which app when none is named in the conversation. Also update the test so it fails if the held line drops the app rule. Otherwise: read-only wording, chain, no apply, both-plugin parity test and README listings are fine.

commented

The held fix is pushed to the same branch. test/plugins.test.ts and tsc pass; I did not re-run the full suite.

Fix: held needs an app, so both command texts (plugins/claude-code/commands/forge.md and plugins/opencode/forge.ts) now say to call it with the app the conversation names. When none is named, the agent asks which app before calling. I took the smaller change you offered, so the verb stays held with no argument and the argument hints, READMEs and expected verb list are unchanged.

Tests: the held line in each plugin must now contain "when none is named, ask which app". A second assertion checks that the held tool still lists app as required, so the wording and the tool's schema can't drift apart.

Everything else is unchanged: read-only wording, chain, no apply, the both-plugin parity test and the README listings.

🤖 Generated with Claude Code

Approved

The earlier ask is met. held needs an app, and both command texts now say to call it with the app the conversation names and to ask which app when none is named. The test pins that wording and checks that the held tool still requires app. I could not diff against a6b1e0a283d6 because the clone does not have that commit, so I read the change as given. I did not open the preview. The change is plugin text, READMEs and a test, with no code path and no new dependency. Both READMEs list the verbs, and the how-to stays in the plugin READMEs rather than the capped root README.

Next, in order:

  1. Non-blocking: the forks line assumes the tool returns a severed-link flag. Add one assertion on the kind: chain output shape so a change to it fails here.
  2. Non-blocking: the Read-only check is a substring match. A tool-level test that held without apply writes nothing would be stronger.
Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs