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 (#7890)
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.",
1309
1345
},
1346
+
{
1347
+
name: "loopover_plan_repo_issues",
1348
+
category: "maintainer",
1349
+
description:
1350
+
"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.",
1351
+
},
1310
1352
{
1311
1353
name: "loopover_open_pr",
1312
1354
category: "agent",
@@ -1378,7 +1420,9 @@ function stdioToolDescription(name: any) {
1378
1420
returntool.description;
1379
1421
}
1380
1422
1381
-
if(cliArgs[0]&&cliArgs[0]!=="--stdio"){
1423
+
/* v8 ignore next 8 -- the CLI dispatch runs only in the launched process (runAsCliEntrypoint); an in-process
1424
+
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.`,
2705
+
payload,
2706
+
);
2707
+
},
2708
+
);
2646
2709
// ── Write-tools (#6149): pure LOCAL-execution spec builders. loopover NEVER performs the write -- each tool
2647
2710
// returns a spec the caller runs with its OWN gh creds. Brings the local stdio server to parity with the
2648
2711
// miner-auto-dev profile's recommendedTools, using the same @loopover/engine builders as the remote server.
@@ -3187,7 +3250,10 @@ server.registerPrompt(
3187
3250
}),
3188
3251
);
3189
3252
3190
-
awaitserver.connect(newStdioServerTransport());
3253
+
// #7764: only bind the shared stdin/stdout transport when actually launched as the CLI/stdio process. An
3254
+
// in-process unit-test importer holds the exported `server` and connects it to an in-memory transport instead.
3255
+
/* 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