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.",
1293
1329
},
1330
+
{
1331
+
name: "loopover_plan_repo_issues",
1332
+
category: "maintainer",
1333
+
description:
1334
+
"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.",
1335
+
},
1294
1336
{
1295
1337
name: "loopover_open_pr",
1296
1338
category: "agent",
@@ -1362,7 +1404,9 @@ function stdioToolDescription(name: any) {
1362
1404
returntool.description;
1363
1405
}
1364
1406
1365
-
if(cliArgs[0]&&cliArgs[0]!=="--stdio"){
1407
+
/* v8 ignore next 8 -- the CLI dispatch runs only in the launched process (runAsCliEntrypoint); an in-process
1408
+
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.`,
2659
+
payload,
2660
+
);
2661
+
},
2662
+
);
2600
2663
// ── Write-tools (#6149): pure LOCAL-execution spec builders. loopover NEVER performs the write -- each tool
2601
2664
// returns a spec the caller runs with its OWN gh creds. Brings the local stdio server to parity with the
2602
2665
// miner-auto-dev profile's recommendedTools, using the same @loopover/engine builders as the remote server.
@@ -3141,7 +3204,10 @@ server.registerPrompt(
3141
3204
}),
3142
3205
);
3143
3206
3144
-
awaitserver.connect(newStdioServerTransport());
3207
+
// #7764: only bind the shared stdin/stdout transport when actually launched as the CLI/stdio process. An
3208
+
// in-process unit-test importer holds the exported `server` and connects it to an in-memory transport instead.
3209
+
/* 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