Part of #334 (3): "plan (open several small issues and link them in one call)".
Done when
[ ] plan (write): { app, issues: [{ key, title, body, blockedBy?: (key | number)[] }] } opens every issue and every link, or none — one transaction; a bad link (cycle, unknown key) refuses the whole plan with which item was wrong
[ ] bounded: at most 12 issues per call, titles and bodies within the limits the issue API already enforces
[ ] answers with the numbers opened, keyed, and the resulting ready set
[ ] issues opened through plan are attributed to the token's owner like any other issue and emit the same events
[ ] docs/MCP.md lists plan with a worked example
[ ] tests: three issues where the third waits for the first two come back linked; a cycle opens nothing; an ro token is refused
Files: src/http/mcp.ts, perhaps a small src/actions/plan.ts reused by the API later, docs/MCP.md, tests.
Risks: partial plans on error (the transaction is the guard); spam (the bound).
Brief: the builder who did the map/link tools.
Part of #334 (3): "plan (open several small issues and link them in one call)".
Done when
plan(write):{ app, issues: [{ key, title, body, blockedBy?: (key | number)[] }] }opens every issue and every link, or none — one transaction; a bad link (cycle, unknown key) refuses the whole plan with which item was wrongplanare attributed to the token's owner like any other issue and emit the same eventsdocs/MCP.mdlistsplanwith a worked examplerotoken is refusedFiles:
src/http/mcp.ts, perhaps a smallsrc/actions/plan.tsreused by the API later,docs/MCP.md, tests. Risks: partial plans on error (the transaction is the guard); spam (the bound). Brief: the builder who did themap/linktools.