feat(lanes): add ccam lanes agents install CLI (E3)

This commit is contained in:
2026-08-05 12:46:56 +07:00
parent 3fb70a3fc1
commit 727823d75e
+27
View File
@@ -2155,6 +2155,25 @@ async function cmdLanesProofLink(args) {
); );
} }
/** `ccam lanes agents install [<id>] [--cwd path]` — write the ship-feature-lane
* agent templates (qc-local, senior-gate-reviewer) into <lane>/.claude/agents/,
* git-excluded. Never run automatically; a session calls it explicitly. */
async function cmdLanesAgentsInstall(args) {
const resolved = await resolveLaneArg(args);
if (!resolved) return;
const result = await post(
`/api/lanes/${resolved.laneId}/agents/install`,
{},
{ allowError: true }
);
if (result.status) {
console.error(`✖ agents install → ${result.data?.error?.message || result.status}`);
process.exitCode = 1;
return;
}
console.log(`${c.green("✔")} installed: ${result.installed.join(", ")}`);
}
async function cmdFeatureShow(args) { async function cmdFeatureShow(args) {
const slug = args.find((arg) => !arg.startsWith("--")); const slug = args.find((arg) => !arg.startsWith("--"));
if (!slug) { if (!slug) {
@@ -2341,6 +2360,11 @@ const COMMAND_GROUPS = [
"[<id>]", "[<id>]",
"Converge clone-root proof/ onto .playwright-mcp/proof (idempotent, never automatic)", "Converge clone-root proof/ onto .playwright-mcp/proof (idempotent, never automatic)",
], ],
[
"lanes agents install",
"[<id>]",
"Write the ship-feature-lane agent templates (qc-local, senior-gate-reviewer) into <lane>/.claude/agents/, git-excluded",
],
[ [
"lock status|acquire|release", "lock status|acquire|release",
"[<name>] [--holder X] [--timeout N]", "[<name>] [--holder X] [--timeout N]",
@@ -3159,6 +3183,9 @@ async function runCommand(argv) {
return cmdLanesRuntime(rest[0], rest.slice(1)); return cmdLanesRuntime(rest[0], rest.slice(1));
} }
if (rest[0] === "proof-link") return cmdLanesProofLink(rest.slice(1)); if (rest[0] === "proof-link") return cmdLanesProofLink(rest.slice(1));
if (rest[0] === "agents" && rest[1] === "install") {
return cmdLanesAgentsInstall(rest.slice(2));
}
return cmdLanes(); return cmdLanes();
case "lock": { case "lock": {
const sub = rest[0]; const sub = rest[0];