You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat(mcp): add REST route, CLI command, and stdio tool for loopover_plan_repo_issues
loopover_plan_repo_issues (generateIssuePlanDrafts) shipped only as a remote MCP
tool and never got the REST + CLI + local-stdio mirror surfaces its repo-scoped,
requireRepoManageAccess-gated siblings all have. Mirrors
loopover_generate_contributor_issue_drafts exactly: a POST
/v1/repos/:owner/:repo/issue-plan-drafts/generate route (same gate), a
maintain plan-issues CLI command calling it, and a loopover_plan_repo_issues
stdio tool. generateIssuePlanDrafts and the remote tool are unchanged.
Closes#7764
description: "Return per-gate-type false-positive precision for a repo's recorded gate blocks — blocked / blocked-then-merged counts and false-positive rates with low-sample guards. Optionally bounded by windowDays. Maintainer-authenticated; measurement only.",
1304
1340
},
1341
+
{
1342
+
name: "loopover_plan_repo_issues",
1343
+
category: "maintainer",
1344
+
description:
1345
+
"AI-plan a small set of concrete GitHub issue drafts for a repo from a maintainer-supplied free-form goal, same as `loopover-mcp maintain plan-issues --goal ...`. Dry-run BY DEFAULT: only previews the drafted title/body/labels unless the caller passes BOTH create:true and dryRun:false, so it can never silently open issues. Maintainer access required.",
1346
+
},
1305
1347
{
1306
1348
name: "loopover_open_pr",
1307
1349
category: "agent",
@@ -1373,7 +1415,9 @@ function stdioToolDescription(name: any) {
1373
1415
returntool.description;
1374
1416
}
1375
1417
1376
-
if(cliArgs[0]&&cliArgs[0]!=="--stdio"){
1418
+
/* v8 ignore next 8 -- the CLI dispatch runs only in the launched process (runAsCliEntrypoint); an in-process
1419
+
unit importer keeps it false and drives runCli/maintainCli directly instead (mcp-cli-plan-issues.test.ts). */
`Issue plan for ${owner}/${repo} (status=${payload.status}, dryRun=${payload.dryRun}): ${payload.proposed??0} proposed, ${payload.created??0} created.`,
2685
+
payload,
2686
+
);
2687
+
},
2688
+
);
2626
2689
// ── Write-tools (#6149): pure LOCAL-execution spec builders. loopover NEVER performs the write -- each tool
2627
2690
// returns a spec the caller runs with its OWN gh creds. Brings the local stdio server to parity with the
2628
2691
// miner-auto-dev profile's recommendedTools, using the same @loopover/engine builders as the remote server.
@@ -3167,7 +3230,10 @@ server.registerPrompt(
3167
3230
}),
3168
3231
);
3169
3232
3170
-
awaitserver.connect(newStdioServerTransport());
3233
+
// #7764: only bind the shared stdin/stdout transport when actually launched as the CLI/stdio process. An
3234
+
// in-process unit-test importer holds the exported `server` and connects it to an in-memory transport instead.
3235
+
/* v8 ignore next -- only the launched stdio process binds the real transport; unit tests connect in-memory. */
if(isRepoAgentPendingActionsPath(path))returntrue;// list (GET, requireRepoMaintainer) + propose (POST, requireRepoWriteAccess); decision POSTs on /:id/:decision require server tokens
0 commit comments