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
Check · Review · Land · Live done — Landed and live in production.
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
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 theCOMMANDtemplate and command description inplugins/opencode/forge.ts. - READMEs: both list
askedamong the verbs and have a short paragraph on/forge asked [app]. test/plugins.test.ts: a new block checks that each plugin text namesasked, that the forge lists that tool, and that the text has theasked [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 callingasksinstead ofaskedis caught. The expected set of shared verbs now includesasked, 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
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.
- First fix: the default hides what became of an ask. MCP
askeddefaults 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 passshow: "all"(a shipped ask is the answer to what became of it), or dropshippedfrom the list and say so in the README. I recommend show=all, with flagged first. - 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.
- 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
showandrepoarguments 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.
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
askedwithshow=allbecause the tool's default (unshipped) left out every shipped ask.repois passed only when an app is given. - The outcome is relayed. Each line ends with the
outcomeTextsentence, 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
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.
Both plugins now have an
asked [app]command. It calls the existing MCPaskedtool, passingrepowhen 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.plugins/claude-code/commands/forge.md(its description, the argument hint and the instructions) and to theCOMMANDtemplate and command description inplugins/opencode/forge.ts.askedamong the verbs and have a short paragraph on/forge asked [app].test/plugins.test.ts: a new block checks that each plugin text namesasked, that the forge lists that tool, and that the text has theasked [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 callingasksinstead ofaskedis caught. The expected set of shared verbs now includesasked, 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'sshow: "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.tspasses (19 tests) andbun x tsc --noEmitis clean. To try it:claude --plugin-dir plugins/claude-codewithFORGE_URLandFORGE_TOKENset, then/forge askedor/forge asked owner/app.🤖 Generated with Claude Code
Closes #7373