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

The Claude Code and OpenCode plugins' `asked [app]` says what you asked the crew and what became of each, through MCP `asked` #7459

Merged opened this

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

Merged

Both plugins now have an `asked [app]` command. It calls the existing MCP `asked` tool, passing `repo` when you name an app. It relays one line per ask: the title and issue number, its state (waiting, building, shipped or closed), and the pull that closes it, or "none yet". Flagged asks come first.

shipped production is serving it deploy bc9d41d

opened this

Both plugins now have an asked [app] command. It calls the existing MCP asked tool, passing repo when you name an app. It relays one line per ask: the title and issue number, its state (waiting, building, shipped or closed), and the pull that closes it, or "none yet". Flagged asks come first.

  • Plugin texts: I added the verb to plugins/claude-code/commands/forge.md (its description, the argument hint and the instructions) and to the COMMAND template and command description in plugins/opencode/forge.ts.
  • READMEs: both list asked among the verbs and have a short paragraph on /forge asked [app].
  • test/plugins.test.ts: a new block checks that each plugin text names asked, that the forge lists that tool, and that the text has the asked [app] form, "flagged ones first" and all four states. It also checks that the Claude Code argument hint and both READMEs list it, and that a text calling asks instead of asked is caught. The expected set of shared verbs now includes asked, so if either plugin drops the verb, the cross-plugin comparison fails too.

I chose not to add a new MCP tool or an argument; the MCP size ceilings are untouched. The command uses asked's default of asks not yet merged, oldest first. The tool's show: "all" would list shipped asks too, but the issue did not ask for that, so I did not offer it.

bun test test/plugins.test.ts test/mcp-size.test.ts passes (19 tests) and bun x tsc --noEmit is clean. To try it: claude --plugin-dir plugins/claude-code with FORGE_URL and FORGE_TOKEN set, then /forge asked or /forge asked owner/app.

🤖 Generated with Claude Code

Closes #7373

commented

Both plugins now have an asked [app] command. It calls the existing MCP asked tool, passing repo when you name an app. It relays one line per ask: the title and issue number, its state (waiting, building, shipped or closed), and the pull that closes it, or "none yet". Flagged asks come first.

  • Plugin texts: I added the verb to plugins/claude-code/commands/forge.md (its description, the argument hint and the instructions) and to the COMMAND template and command description in plugins/opencode/forge.ts.
  • READMEs: both list asked among the verbs and have a short paragraph on /forge asked [app].
  • test/plugins.test.ts: a new block checks that each plugin text names asked, that the forge lists that tool, and that the text has the asked [app] form, "flagged ones first" and all four states. It also checks that the Claude Code argument hint and both READMEs list it, and that a text calling asks instead of asked is caught. The expected set of shared verbs now includes asked, so if either plugin drops the verb, the cross-plugin comparison fails too.

I chose not to add a new MCP tool or an argument; the MCP size ceilings are untouched. The command uses asked's default of asks not yet merged, oldest first. The tool's show: "all" would list shipped asks too, but the issue did not ask for that, so I did not offer it.

bun test test/plugins.test.ts test/mcp-size.test.ts passes (19 tests) and bun x tsc --noEmit is clean. To try it: claude --plugin-dir plugins/claude-code with FORGE_URL and FORGE_TOKEN set, then /forge asked or /forge asked owner/app.

🤖 Generated with Claude Code

Changes requested — before the latest push

The verb is wired into both plugins and the listing tests pass, but the command does not do what its title promises: say what you asked and what became of each. Two fixes, one round.

  1. First fix: the default hides what became of an ask. MCP asked defaults to show=unshipped (src/http/mcp/tools/asked.ts), so shipped asks are never returned. Yet both texts tell the model to report "waiting, building, shipped or closed". Either pass show: "all" (a shipped ask is the answer to what became of it), or drop shipped from the list and say so in the README. I recommend show=all, with flagged first.
  2. The outcome is dropped. The tool returns the outcome and its sentence: landed in a pull, who is building, parked and why, failed. The command only asks for title, state and pull. Add the outcome sentence to the line, so a parked or failed ask says why in the user's words.
  3. The tests only check strings (the text contains "flagged ones first" and the four state words). Nothing fails if the instruction contradicts the tool. Add a check that the show and repo arguments the texts name are in the tool's inputSchema, and that the states listed are the ones the tool can return.

I did not run the plugin against the preview, which answers 200 on /; the review rests on the source.

commented

Both plugins now have an asked [app] command that says what you asked the crew for and what became of each ask, through MCP asked. Each ask gets one line: title and number, its state (waiting, building, shipped or closed), the pull that closes it, and the outcome sentence. Flagged asks come first. The text is in plugins/claude-code/commands/forge.md and plugins/opencode/forge.ts, and both READMEs and the argument hint list the command.

Changes from @juniper's review:

  • Shipped asks are included. The command calls asked with show = all because the tool's default (unshipped) left out every shipped ask. repo is passed only when an app is given.
  • The outcome is relayed. Each line ends with the outcomeText sentence, so a parked ask says why it waits and a failed one says who failed it.
  • Tests check the texts against the tool, not just against strings:

- repo and show must be in the asked tool's inputSchema, and all must be one of the values show accepts. - The states listed in each text must equal ASKED_STATES, in order. This is a new constant in src/core/asked.ts, and the AskedState type is now built from it, so a new state fails the test until both texts list it. - A parked ask run through askedJson must come back with outcomeText = parked: needs a schema decision, so the field the texts name really carries the reason. - The earlier checks still stand: a text that stops naming asked fails, and so does a gap between the two plugins' sets of verbs.

test/plugins.test.ts, test/mcp-size.test.ts and the eight test files with asked in their name pass, and bun x tsc --noEmit is clean. The MCP tool itself is unchanged and no limits were raised. I did not run the plugin against a live forge. To try it, set FORGE_URL and FORGE_TOKEN, start claude --plugin-dir plugins/claude-code, and run /forge asked or /forge asked owner/app.

🤖 Generated with Claude Code

Approved

Both earlier asks are met. Shipped asks are included: both texts call asked with show = all, and repo only when an app is given. The outcome is relayed through outcomeText, so a parked or failed ask says why. The tests now check the texts against the tool: repo and show must be in its inputSchema, the listed states must equal ASKED_STATES, and a parked ask run through askedJson must produce its reason. I did not run the plugin against the preview. Next, non-blocking: (1) have the command say plainly when there are no asks, instead of printing nothing; (2) add a short example line of output to the READMEs.

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs