@outerlayer/cli 0.23.0 → 0.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +26 -0
- package/README.md +13 -0
- package/dist/{agent-setup-SNDCEHG2.js → agent-setup-PDIIGMKE.js} +7 -7
- package/dist/{bridge-QFN3KJP6.js → bridge-5KZ36YDG.js} +3 -3
- package/dist/build-Q2OBF77R.js +12 -0
- package/dist/build-info.json +1 -1
- package/dist/{builder-7FBQAWQZ.js → builder-PRSCX5AH.js} +7 -7
- package/dist/{check-3CGLWMHM.js → check-EPYRTE3R.js} +40 -37
- package/dist/{chunk-URWYRAIC.js → chunk-2K3TCQHW.js} +1 -3
- package/dist/{chunk-Z42JY3LQ.js → chunk-2N72GPS2.js} +3 -3
- package/dist/{chunk-WY7HFY62.js → chunk-34ANPNVB.js} +3 -3
- package/dist/{chunk-QSEPKZXR.js → chunk-3I44PQ26.js} +206 -57
- package/dist/{chunk-ZKWKQIJU.js → chunk-4S4VBDSO.js} +1 -1
- package/dist/chunk-5222PA6S.js +66 -0
- package/dist/{chunk-GXV73IIS.js → chunk-6CNHXHI2.js} +17 -5
- package/dist/{chunk-NYTZ7HVN.js → chunk-7OWPLRJR.js} +1 -1
- package/dist/{chunk-EFB3FGLC.js → chunk-ATGHVEU4.js} +1 -1
- package/dist/{chunk-QILR6TZP.js → chunk-AXPCGD46.js} +5 -5
- package/dist/{chunk-CBCKD6DO.js → chunk-D4AMAEZ7.js} +12 -11
- package/dist/{chunk-XACXXKQ5.js → chunk-DEBOL6ON.js} +1 -1
- package/dist/{chunk-XGPC3IOR.js → chunk-FXUVXSY2.js} +2 -2
- package/dist/{chunk-6AOZD3LY.js → chunk-HBLLZLOH.js} +3 -3
- package/dist/{chunk-ZLZ3XVPI.js → chunk-HWEIFHSW.js} +3 -3
- package/dist/{chunk-D64E222W.js → chunk-IDJIWKTY.js} +3 -3
- package/dist/{chunk-OBCFK4QD.js → chunk-IGRRD7PX.js} +11 -7
- package/dist/{chunk-GISNHSYL.js → chunk-JGD5TWQ2.js} +4 -2
- package/dist/{chunk-2TT7DEMZ.js → chunk-JKILLWZF.js} +11 -9
- package/dist/{chunk-V5CG75NX.js → chunk-JWRX5ZTT.js} +6 -2
- package/dist/{chunk-XOEV4FVK.js → chunk-K5WVK7IC.js} +1 -1
- package/dist/{chunk-TFGXOHF6.js → chunk-L2FZLBF7.js} +278 -40
- package/dist/{chunk-QS43O4DR.js → chunk-M4B6QKNZ.js} +1 -1
- package/dist/{chunk-UF5L4BAI.js → chunk-O2WYUIK7.js} +1 -1
- package/dist/{chunk-276D7BJ7.js → chunk-QMQC6JCO.js} +1 -1
- package/dist/{chunk-OGMZJWWD.js → chunk-QUGYGO6L.js} +6 -6
- package/dist/{chunk-JV4YGAAW.js → chunk-QXNJWSTM.js} +5 -5
- package/dist/{chunk-3W333NFO.js → chunk-RGW7ERF3.js} +15 -4
- package/dist/{chunk-I2UOAV7X.js → chunk-TQMI335S.js} +4 -1
- package/dist/{chunk-WXJXHZVB.js → chunk-UNF7MWEL.js} +1 -1
- package/dist/{chunk-FX6IHR5C.js → chunk-VMF5LK3D.js} +8 -8
- package/dist/{chunk-C2XZBNHY.js → chunk-VNGENFOG.js} +19 -6
- package/dist/{chunk-G3LHWUBK.js → chunk-VPUNOGXO.js} +6 -6
- package/dist/{chunk-C64D7HR3.js → chunk-X5LNCIZT.js} +19 -10
- package/dist/{chunk-2Q3PZ42G.js → chunk-XGJUNNXL.js} +1 -1
- package/dist/{chunk-BOG4ENP7.js → chunk-XHXDCYSK.js} +185 -38
- package/dist/{chunk-CQAEV3Z5.js → chunk-XRYUJTAT.js} +8 -1
- package/dist/{chunk-KGKFEONR.js → chunk-YMKQVCKC.js} +5 -5
- package/dist/{chunk-DJYOCD65.js → chunk-YTTHDPWF.js} +5 -5
- package/dist/{chunk-4AVDD7VX.js → chunk-ZGMQQWCV.js} +2 -2
- package/dist/{chunk-IHNQWF6F.js → chunk-ZI2ZVWKT.js} +1 -1
- package/dist/{chunk-OW52QLK3.js → chunk-ZODVSFI4.js} +1 -1
- package/dist/chunk-ZVB57WI6.js +19 -0
- package/dist/{claude-launcher-KEESTJHO.js → claude-launcher-WGOCLTG6.js} +1 -1
- package/dist/{cli-44WGGICQ.js → cli-2LGSPAYZ.js} +131 -97
- package/dist/command-ITLPJ5XU.js +533 -0
- package/dist/{config-H4QS332G.js → config-JJ3EO7SB.js} +3 -3
- package/dist/connect-cmd-JFDZKPND.js +25 -0
- package/dist/container-start-X22OXY6E.js +179 -0
- package/dist/{control-plane-launch-SEYCOZFH.js → control-plane-launch-ZFT6SI4N.js} +6 -6
- package/dist/{dist-SOH3O24Y.js → dist-2APO44JG.js} +1 -1
- package/dist/{docker-KMK4LOET.js → docker-PQHWAY5J.js} +7 -7
- package/dist/{doctor-4H77CEB7.js → doctor-73GNT4VV.js} +90 -31
- package/dist/{emit-artifact-cmd-XCZ3ALLV.js → emit-artifact-cmd-AIOTX6YT.js} +14 -11
- package/dist/{emit-criteria-cmd-JE72JHKJ.js → emit-criteria-cmd-7PJINOHA.js} +11 -8
- package/dist/{emit-finding-cmd-ILIDRMYN.js → emit-finding-cmd-JRDSZ4DR.js} +11 -8
- package/dist/{emit-result-cmd-WPKG5YAS.js → emit-result-cmd-ZGF6Q6OP.js} +14 -11
- package/dist/{emit-step-cmd-OVMLQSL6.js → emit-step-cmd-DUR34STQ.js} +12 -9
- package/dist/{exec-client-ATPF2DDB.js → exec-client-S5IA7JRG.js} +4 -4
- package/dist/{governing-source-EQBKPME7.js → governing-source-DKJABQAT.js} +12 -11
- package/dist/{guest-init-HWSE7W6L.js → guest-init-TOSKPGPF.js} +5 -5
- package/dist/{hook-fast-27SHD72I.js → hook-fast-NEELST6G.js} +1 -1
- package/dist/host-key-ICJEQBWH.js +9 -0
- package/dist/image-tag-6KJOGBQK.js +10 -0
- package/dist/index.js +4 -4
- package/dist/{init-HAAHIQFN.js → init-NE3VR3EY.js} +26 -23
- package/dist/{init-WQ62BXDN.js → init-SKOXNJND.js} +26 -23
- package/dist/{init-cmd-VPFIDY64.js → init-cmd-UEDOJ7LG.js} +12 -12
- package/dist/{init-update-UZIJ2FMU.js → init-update-VKZ4S6HH.js} +36 -10
- package/dist/{install-SFACZU7E.js → install-MPEJJ7X6.js} +5 -5
- package/dist/install-cmd-SE6NCTJK.js +12 -0
- package/dist/job-state-format-WJQGQB6F.js +6 -0
- package/dist/{logs-N3ZX7HFV.js → logs-T4ERSOQ4.js} +3 -3
- package/dist/loop-BPVEA5OC.js +78 -0
- package/dist/{machine-PGDRWPI2.js → machine-G3GICXQN.js} +22 -19
- package/dist/{mcp-serve-cmd-CNRC5AL5.js → mcp-serve-cmd-7M4VLNI4.js} +5 -5
- package/dist/{paths-AKX2OOLF.js → paths-2KGM2LZV.js} +3 -3
- package/dist/pending-BGLMTB5Q.js +9 -0
- package/dist/{pidfile-G2J5WBQS.js → pidfile-VYBH3IMN.js} +4 -4
- package/dist/{record-Q4IEYIVV.js → record-GNOHDJ2O.js} +4 -4
- package/dist/{relay-PSZ4LGMW.js → relay-GFPPD6GF.js} +1 -1
- package/dist/relay-protocol-HELO5SNH.js +6 -0
- package/dist/{runner-env-GZHXM27A.js → runner-env-GUFV544G.js} +6 -6
- package/dist/{runner-identity-IIZ3RK7M.js → runner-identity-J6DXJ6MF.js} +7 -7
- package/dist/{runner-key-BPP5XRYR.js → runner-key-L55O7Y7W.js} +26 -23
- package/dist/{session-sender-EKKZ5DEU.js → session-sender-LXTASWBY.js} +15 -12
- package/dist/{spec-cmd-JDHGNFVJ.js → spec-cmd-G2JNXKD7.js} +12 -9
- package/dist/{status-UCQDEMFX.js → status-U6DXOR6C.js} +43 -28
- package/dist/{sync-cmd-NSVXOYFJ.js → sync-cmd-VPNS5ITY.js} +14 -11
- package/dist/{watch-NQVZWPBJ.js → watch-ZOCYD2NE.js} +14 -11
- package/dist/{work-claim-cmd-FPJXQAXP.js → work-claim-cmd-BUMIPJNF.js} +15 -12
- package/dist/{work-cmd-FMPDXPU6.js → work-cmd-LRAXUOJV.js} +12 -9
- package/dist/{work-comment-cmd-ZVUE2IUN.js → work-comment-cmd-4RDIBUYO.js} +12 -9
- package/dist/{work-logs-cmd-CQH2SYT4.js → work-logs-cmd-YYN2CPJQ.js} +12 -9
- package/dist/{work-open-pr-cmd-YY2OGJOI.js → work-open-pr-cmd-3MCND2LZ.js} +13 -10
- package/dist/{work-pr-cmd-EHFTEVJO.js → work-pr-cmd-BODEZAXN.js} +12 -9
- package/dist/{work-stop-cmd-LGWSBSBT.js → work-stop-cmd-P7HXVKEG.js} +12 -9
- package/package.json +2 -2
- package/skill-pack/maintained/outerlayer-build/SKILL.md +1 -1
- package/skill-pack/maintained/outerlayer-build/references/agent-briefs.md +3 -2
- package/skill-pack/maintained/outerlayer-build/references/review-briefs.md +3 -1
- package/dist/build-WHHFA7KM.js +0 -12
- package/dist/command-4FAP2D3P.js +0 -207
- package/dist/connect-cmd-6DUTUK63.js +0 -22
- package/dist/host-key-ATB23GI3.js +0 -9
- package/dist/install-cmd-6HTP7I43.js +0 -12
- package/dist/loop-JPW2QJ64.js +0 -75
- package/dist/pending-7SGWZCEH.js +0 -9
- package/dist/relay-protocol-K7KP2SPI.js +0 -6
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire } from 'node:module';
|
|
3
|
-
import { gatherDoctorChecks, doctorExitCode, summarizeChecks, renderDoctorText, recordWrapped, recordUnwrapped, recordRemoval, readManifest, recordInstall, recordStatusline } from './chunk-
|
|
3
|
+
import { gatherDoctorChecks, doctorExitCode, summarizeChecks, renderDoctorText, recordWrapped, recordUnwrapped, recordRemoval, readManifest, recordInstall, recordStatusline } from './chunk-VMF5LK3D.js';
|
|
4
4
|
import './chunk-XFGL53GU.js';
|
|
5
5
|
import './chunk-VJBFQP3H.js';
|
|
6
|
-
import { verifiedTrackerNames, TRACKERS } from './chunk-
|
|
7
|
-
import './chunk-
|
|
8
|
-
import './chunk-
|
|
6
|
+
import { verifiedTrackerNames, TRACKERS } from './chunk-X5LNCIZT.js';
|
|
7
|
+
import './chunk-HWEIFHSW.js';
|
|
8
|
+
import './chunk-6CNHXHI2.js';
|
|
9
9
|
import './chunk-BUP5N3X6.js';
|
|
10
10
|
import './chunk-XSPA5ODY.js';
|
|
11
11
|
import './chunk-GOSFARMS.js';
|
|
12
12
|
import './chunk-MQ743JX3.js';
|
|
13
|
-
import './chunk-
|
|
14
|
-
import { hookFiredMarkerPath, installedCliDistDir } from './chunk-
|
|
13
|
+
import './chunk-M4B6QKNZ.js';
|
|
14
|
+
import { hookFiredMarkerPath, installedCliDistDir } from './chunk-K5WVK7IC.js';
|
|
15
15
|
import './chunk-ZJSNLVCE.js';
|
|
16
16
|
import './chunk-DXDF43YG.js';
|
|
17
17
|
import './chunk-BKO6JEZI.js';
|
|
18
18
|
import './chunk-HCVLP7XA.js';
|
|
19
19
|
import { findGitDirs } from './chunk-BJ3KTMDH.js';
|
|
20
|
-
import './chunk-
|
|
20
|
+
import './chunk-D4AMAEZ7.js';
|
|
21
21
|
import './chunk-YVZJ6GKF.js';
|
|
22
22
|
import { C, warnDeprecated, API_KEY_FLAG_DEPRECATION, NO_COLOR_FLAG, stripNoColor } from './chunk-ANPNT6PM.js';
|
|
23
23
|
import './chunk-EABW6AJQ.js';
|
|
@@ -33,10 +33,10 @@ import './chunk-RKOTJQVG.js';
|
|
|
33
33
|
import './chunk-QZBXLLTV.js';
|
|
34
34
|
import { homeFromEnv } from './chunk-VNVZDWO3.js';
|
|
35
35
|
import { resolveVersion } from './chunk-RA3O54FC.js';
|
|
36
|
-
import './chunk-
|
|
37
|
-
import './chunk-
|
|
38
|
-
import './chunk-
|
|
39
|
-
import './chunk-
|
|
36
|
+
import './chunk-ZODVSFI4.js';
|
|
37
|
+
import './chunk-ZI2ZVWKT.js';
|
|
38
|
+
import './chunk-2K3TCQHW.js';
|
|
39
|
+
import './chunk-JGD5TWQ2.js';
|
|
40
40
|
import './chunk-Z5GEFMRW.js';
|
|
41
41
|
import { EventEmitter } from 'events';
|
|
42
42
|
import childProcess, { execFileSync } from 'child_process';
|
|
@@ -3784,8 +3784,8 @@ ${starter.output}`),
|
|
|
3784
3784
|
}
|
|
3785
3785
|
}
|
|
3786
3786
|
async function realConnectDepsForCwd() {
|
|
3787
|
-
const { realConnectDeps } = await import('./connect-cmd-
|
|
3788
|
-
const { resolveRepoIdentity } = await import('./dist-
|
|
3787
|
+
const { realConnectDeps } = await import('./connect-cmd-JFDZKPND.js');
|
|
3788
|
+
const { resolveRepoIdentity } = await import('./dist-2APO44JG.js');
|
|
3789
3789
|
return {
|
|
3790
3790
|
...realConnectDeps(),
|
|
3791
3791
|
home: homeFromEnv(),
|
|
@@ -3851,7 +3851,7 @@ edited file, and writes nothing. --control-plane makes no link and says
|
|
|
3851
3851
|
what CLIs older than ${FIRST_VERSION_READING_AGENTS_SKILLS} do. \`` + cliInvocation() + " doctor` reports the same\nstates under Starter files.\n"
|
|
3852
3852
|
).action(async (opts) => {
|
|
3853
3853
|
if (opts.update || opts.dryRun) {
|
|
3854
|
-
const { runInitUpdate, formatInitUpdate, updateFlagProblem } = await import('./init-update-
|
|
3854
|
+
const { runInitUpdate, formatInitUpdate, updateFlagProblem } = await import('./init-update-VKZ4S6HH.js');
|
|
3855
3855
|
const problem = updateFlagProblem(opts);
|
|
3856
3856
|
if (problem !== void 0) {
|
|
3857
3857
|
fail(problem);
|
|
@@ -3898,12 +3898,12 @@ what CLIs older than ${FIRST_VERSION_READING_AGENTS_SKILLS} do. \`` + cliInvocat
|
|
|
3898
3898
|
if (changed.length > 0 && !opts.json) process.stdout.write(`Removed the claude function from ${changed.join(", ")}.
|
|
3899
3899
|
`);
|
|
3900
3900
|
}
|
|
3901
|
-
const shell = !opts.remove && opts.shellFunction !== void 0 ? (await import('./init-cmd-
|
|
3901
|
+
const shell = !opts.remove && opts.shellFunction !== void 0 ? (await import('./init-cmd-UEDOJ7LG.js')).applyShellFunctionFlag(opts.shellFunction, { home: homeFromEnv(), shellPath: process.env.SHELL }) : void 0;
|
|
3902
3902
|
if (opts.json) writeJson(shell === void 0 ? outcome.result : { ...outcome.result, shellFunction: { outcome: shell.outcome, reason: shell.reason } });
|
|
3903
3903
|
else process.stdout.write(outcome.text + (shell?.text ?? ""));
|
|
3904
3904
|
return;
|
|
3905
3905
|
}
|
|
3906
|
-
const { runInitCommand } = await import('./init-cmd-
|
|
3906
|
+
const { runInitCommand } = await import('./init-cmd-UEDOJ7LG.js');
|
|
3907
3907
|
const code = await runInitCommand(
|
|
3908
3908
|
{ json: opts.json, factory: opts.factory, shellFunction: opts.shellFunction },
|
|
3909
3909
|
{
|
|
@@ -3915,7 +3915,7 @@ what CLIs older than ${FIRST_VERSION_READING_AGENTS_SKILLS} do. \`` + cliInvocat
|
|
|
3915
3915
|
return { ok, text, detail };
|
|
3916
3916
|
},
|
|
3917
3917
|
runAgentSetup: async () => {
|
|
3918
|
-
const { runAgentSetup } = await import('./agent-setup-
|
|
3918
|
+
const { runAgentSetup } = await import('./agent-setup-PDIIGMKE.js');
|
|
3919
3919
|
return runAgentSetup({ cwd: process.cwd(), skillsLink: opts.skillsLink !== false });
|
|
3920
3920
|
},
|
|
3921
3921
|
runDoctorChecks: gatherDoctorChecks,
|
|
@@ -3924,7 +3924,7 @@ what CLIs older than ${FIRST_VERSION_READING_AGENTS_SKILLS} do. \`` + cliInvocat
|
|
|
3924
3924
|
shellPath: process.env.SHELL,
|
|
3925
3925
|
interactive: Boolean(process.stdin.isTTY && process.stderr.isTTY) && opts.json !== true,
|
|
3926
3926
|
ask: async () => {
|
|
3927
|
-
const { promptOnTerminal } = await import('./connect-cmd-
|
|
3927
|
+
const { promptOnTerminal } = await import('./connect-cmd-JFDZKPND.js');
|
|
3928
3928
|
const answer = await promptOnTerminal({
|
|
3929
3929
|
message: `Should plain claude start Claude Code through ${cliInvocation()} claude? That is how a session in a governed repository gets its control plane. It adds one block to your zsh or bash startup file.`,
|
|
3930
3930
|
options: [
|
|
@@ -3963,7 +3963,7 @@ linked (true, false, or null when it could not be checked) and, when false,
|
|
|
3963
3963
|
linkUrl.
|
|
3964
3964
|
`
|
|
3965
3965
|
).action(async (opts) => {
|
|
3966
|
-
const { runConnectCommand } = await import('./connect-cmd-
|
|
3966
|
+
const { runConnectCommand } = await import('./connect-cmd-JFDZKPND.js');
|
|
3967
3967
|
const code = await runConnectCommand({ factory: opts.factory, json: opts.json }, await realConnectDepsForCwd(), {
|
|
3968
3968
|
stdout: process.stdout,
|
|
3969
3969
|
stderr: process.stderr
|
|
@@ -4041,7 +4041,7 @@ code is 1: revoke the token on /profile/security.
|
|
|
4041
4041
|
else fail(found.reason);
|
|
4042
4042
|
return;
|
|
4043
4043
|
}
|
|
4044
|
-
const { runSync, SyncConfigError, SyncTransportError } = await import('./sync-cmd-
|
|
4044
|
+
const { runSync, SyncConfigError, SyncTransportError } = await import('./sync-cmd-VPNS5ITY.js');
|
|
4045
4045
|
try {
|
|
4046
4046
|
const result = await runSync({
|
|
4047
4047
|
url: opts.url,
|
|
@@ -4072,7 +4072,7 @@ code is 1: revoke the token on /profile/security.
|
|
|
4072
4072
|
if (invokedCommandToken(argv) === "watch") {
|
|
4073
4073
|
warnDeprecated(`\`${cliInvocation()} watch\` is now \`${cliInvocation()} daemon\`; the old name will be removed in a future release.`);
|
|
4074
4074
|
}
|
|
4075
|
-
const { runWatch } = await import('./watch-
|
|
4075
|
+
const { runWatch } = await import('./watch-ZOCYD2NE.js');
|
|
4076
4076
|
await runWatch({ once: opts.once });
|
|
4077
4077
|
});
|
|
4078
4078
|
program2.command("hook <event>", { hidden: true }).description("capture-hook fast path, installed by `init`").action(() => {
|
|
@@ -4084,8 +4084,8 @@ code is 1: revoke the token on /profile/security.
|
|
|
4084
4084
|
program2.command("claude [args...]").description("start Claude Code with the repository's control plane attached").allowUnknownOption().helpOption(false).action(() => {
|
|
4085
4085
|
});
|
|
4086
4086
|
const brokerRelay = program2.command("broker-relay", { hidden: true }).description("relay a build's loopback connections to the runner's tunnel and destinations").enablePositionalOptions().option("--port <port>", "the loopback port to listen on").option("--socket <path>", "the runner's tunnel socket").option("--join <path>", "the socket the runner's joining process connects to").option("--lease-watchdog", "exit when the runner's lease expiry passes; needs --join").option("--forward <port=target>", "also relay a loopback port to a destination; repeatable", (value, previous) => [...previous, value], []).action(async (opts) => {
|
|
4087
|
-
const { startRelay, startSessionRelay } = await import('./relay-
|
|
4088
|
-
const { TARGET_TUNNEL, targetOfPath } = await import('./relay-protocol-
|
|
4087
|
+
const { startRelay, startSessionRelay } = await import('./relay-GFPPD6GF.js');
|
|
4088
|
+
const { TARGET_TUNNEL, targetOfPath } = await import('./relay-protocol-HELO5SNH.js');
|
|
4089
4089
|
const port = Number(opts.port);
|
|
4090
4090
|
if (!Number.isInteger(port) || port < 1 || port > 65535) {
|
|
4091
4091
|
fail(opts.port === void 0 ? "--port is required" : `--port must be a port number, not ${opts.port}`);
|
|
@@ -4117,7 +4117,7 @@ code is 1: revoke the token on /profile/security.
|
|
|
4117
4117
|
await startRelay({ port, socketPath: opts.socket, forwards: forwards.map((forward) => ({ port: forward.port, socketPath: forward.spec })) });
|
|
4118
4118
|
});
|
|
4119
4119
|
brokerRelay.command("join").description("carry the runner's session to the relay over standard input and output").option("--socket <path>", "the relay's joining socket", "/run/outerlayer-relay/join.sock").action(async (opts) => {
|
|
4120
|
-
const { joinRelay } = await import('./relay-
|
|
4120
|
+
const { joinRelay } = await import('./relay-GFPPD6GF.js');
|
|
4121
4121
|
try {
|
|
4122
4122
|
await joinRelay({ socketPath: opts.socket, input: process.stdin, output: process.stdout });
|
|
4123
4123
|
} catch (err) {
|
|
@@ -4133,7 +4133,7 @@ code is 1: revoke the token on /profile/security.
|
|
|
4133
4133
|
}
|
|
4134
4134
|
});
|
|
4135
4135
|
program2.command("vm-exec", { hidden: true }).description("run a command in a microVM build's guest through its exec agent").requiredOption("--socket <path>", "the Unix socket Firecracker serves the build's vsock device on").option("--user <user>", "the user to run as", "").option("--cwd <dir>", "the working directory", "/").option("--env <NAME=value>", "an environment value the command line carries; repeatable", (value, previous) => [...previous, value], []).option("--pass <NAME>", "an environment variable whose value is read from this process; repeatable", (value, previous) => [...previous, value], []).argument("<argv...>", "the command and its arguments").action(async (argv2, opts) => {
|
|
4136
|
-
const { runVmExec } = await import('./exec-client-
|
|
4136
|
+
const { runVmExec } = await import('./exec-client-S5IA7JRG.js');
|
|
4137
4137
|
const env = {};
|
|
4138
4138
|
for (const entry of opts.env) {
|
|
4139
4139
|
const eq = entry.indexOf("=");
|
|
@@ -4162,7 +4162,7 @@ code is 1: revoke the token on /profile/security.
|
|
|
4162
4162
|
process.exitCode = await runBuildCommand({ dir: opts.dir, argv: command });
|
|
4163
4163
|
});
|
|
4164
4164
|
program2.command("session-sender", { hidden: true }).description("stream a runner build's sessions to its work item while the build runs").action(async () => {
|
|
4165
|
-
const { runSessionSender } = await import('./session-sender-
|
|
4165
|
+
const { runSessionSender } = await import('./session-sender-LXTASWBY.js');
|
|
4166
4166
|
try {
|
|
4167
4167
|
await runSessionSender();
|
|
4168
4168
|
} catch (err) {
|
|
@@ -4170,7 +4170,7 @@ code is 1: revoke the token on /profile/security.
|
|
|
4170
4170
|
}
|
|
4171
4171
|
});
|
|
4172
4172
|
program2.command("vm-init", { hidden: true }).description("lay out a microVM build's guest; the guest helper runs it").action(async () => {
|
|
4173
|
-
const { realGuestHost, runGuestInit } = await import('./guest-init-
|
|
4173
|
+
const { realGuestHost, runGuestInit } = await import('./guest-init-TOSKPGPF.js');
|
|
4174
4174
|
const { readFileSync: readFileSync3 } = await import('fs');
|
|
4175
4175
|
try {
|
|
4176
4176
|
runGuestInit(realGuestHost(), readFileSync3("/proc/cmdline", "utf8"));
|
|
@@ -4179,7 +4179,7 @@ code is 1: revoke the token on /profile/security.
|
|
|
4179
4179
|
}
|
|
4180
4180
|
});
|
|
4181
4181
|
program2.command("vm-forward", { hidden: true }).description("pipe a guest port to another; vm-init runs it").requiredOption("--listen <host:port>", "the address to listen on").requiredOption("--to <host:port>", "the address to pipe each connection to").action(async (opts) => {
|
|
4182
|
-
const { startBridgeForward } = await import('./bridge-
|
|
4182
|
+
const { startBridgeForward } = await import('./bridge-5KZ36YDG.js');
|
|
4183
4183
|
try {
|
|
4184
4184
|
await startBridgeForward(opts);
|
|
4185
4185
|
} catch (err) {
|
|
@@ -4253,7 +4253,7 @@ Compiling .outerlayer/ moved to \`${cliInvocation()} context emit\`.
|
|
|
4253
4253
|
await compileContext({ dir: opts.dir, check: opts.check, json: opts.json });
|
|
4254
4254
|
return;
|
|
4255
4255
|
}
|
|
4256
|
-
const { runEmitResult, EmitResultError } = await import('./emit-result-cmd-
|
|
4256
|
+
const { runEmitResult, EmitResultError } = await import('./emit-result-cmd-ZGF6Q6OP.js');
|
|
4257
4257
|
try {
|
|
4258
4258
|
const result = await runEmitResult({
|
|
4259
4259
|
name,
|
|
@@ -4303,7 +4303,7 @@ everywhere, bytes and deep link untouched; a still-queued one is cancelled
|
|
|
4303
4303
|
locally so it never uploads. One correction can retire several duplicates.
|
|
4304
4304
|
`
|
|
4305
4305
|
).action(async (file, opts) => {
|
|
4306
|
-
const { runEmitArtifact, EmitArtifactError } = await import('./emit-artifact-cmd-
|
|
4306
|
+
const { runEmitArtifact, EmitArtifactError } = await import('./emit-artifact-cmd-AIOTX6YT.js');
|
|
4307
4307
|
let pr;
|
|
4308
4308
|
if (opts.pr !== void 0) {
|
|
4309
4309
|
pr = parseTrackerNumber(opts.pr);
|
|
@@ -4362,7 +4362,7 @@ recent events with their ids. --find <text> searches all of them.
|
|
|
4362
4362
|
item that session was launched for is used automatically.
|
|
4363
4363
|
`
|
|
4364
4364
|
).action(async (opts) => {
|
|
4365
|
-
const { runEmitFinding, refuseRemovedFindingFlags, EmitFindingError } = await import('./emit-finding-cmd-
|
|
4365
|
+
const { runEmitFinding, refuseRemovedFindingFlags, EmitFindingError } = await import('./emit-finding-cmd-JRDSZ4DR.js');
|
|
4366
4366
|
try {
|
|
4367
4367
|
refuseRemovedFindingFlags(opts);
|
|
4368
4368
|
const result = await runEmitFinding({
|
|
@@ -4429,7 +4429,7 @@ the whole batch. "untimed": true records one with no time on purpose.
|
|
|
4429
4429
|
that session was launched for is used automatically.
|
|
4430
4430
|
`
|
|
4431
4431
|
).action(async (file, opts) => {
|
|
4432
|
-
const { runEmitFindings, EmitFindingError } = await import('./emit-finding-cmd-
|
|
4432
|
+
const { runEmitFindings, EmitFindingError } = await import('./emit-finding-cmd-JRDSZ4DR.js');
|
|
4433
4433
|
try {
|
|
4434
4434
|
const result = await runEmitFindings({
|
|
4435
4435
|
file,
|
|
@@ -4464,7 +4464,7 @@ command, the command exits 0, and \`sync\` sends it later. If the gateway refuse
|
|
|
4464
4464
|
the step, the command prints why and exits 1.
|
|
4465
4465
|
`
|
|
4466
4466
|
).action(async (name, opts) => {
|
|
4467
|
-
const { runEmitStep, EmitStepError } = await import('./emit-step-cmd-
|
|
4467
|
+
const { runEmitStep, EmitStepError } = await import('./emit-step-cmd-DUR34STQ.js');
|
|
4468
4468
|
try {
|
|
4469
4469
|
await runEmitStep({
|
|
4470
4470
|
name,
|
|
@@ -4507,7 +4507,7 @@ of the item, and a (proof: <kind>) annotation names its proof.
|
|
|
4507
4507
|
${cliInvocation()} emit criteria acceptance/412-login.md --item 412
|
|
4508
4508
|
`
|
|
4509
4509
|
).action(async (file, opts) => {
|
|
4510
|
-
const { runEmitCriteria, EmitCriteriaError } = await import('./emit-criteria-cmd-
|
|
4510
|
+
const { runEmitCriteria, EmitCriteriaError } = await import('./emit-criteria-cmd-7PJINOHA.js');
|
|
4511
4511
|
try {
|
|
4512
4512
|
const result = await runEmitCriteria({
|
|
4513
4513
|
file,
|
|
@@ -4531,9 +4531,9 @@ function registerSpecCommands(program2) {
|
|
|
4531
4531
|
const specCmd = program2.command("spec").description("Find, file and edit the issue a spec lives in, in your factory's tracker");
|
|
4532
4532
|
const credentialOptions = (command) => command.option("--json", "machine-readable JSON output").option("--url <url>", "cloud base URL (or OUTERLAYER_URL / config)").addOption(apiKeyOption()).option("--app-id <id>", "factory id the key is bound to (or OUTERLAYER_APP_ID / config)");
|
|
4533
4533
|
const run = async (action) => {
|
|
4534
|
-
const { WorkCommandError } = await import('./work-cmd-
|
|
4534
|
+
const { WorkCommandError } = await import('./work-cmd-LRAXUOJV.js');
|
|
4535
4535
|
try {
|
|
4536
|
-
await action(await import('./spec-cmd-
|
|
4536
|
+
await action(await import('./spec-cmd-G2JNXKD7.js'));
|
|
4537
4537
|
} catch (err) {
|
|
4538
4538
|
if (err instanceof WorkCommandError) {
|
|
4539
4539
|
fail(err.message);
|
|
@@ -4575,7 +4575,7 @@ takes it, and prints the line that starts your session on it. That
|
|
|
4575
4575
|
session links itself and holds the item's lease while it works.
|
|
4576
4576
|
`
|
|
4577
4577
|
).action(async (opts) => {
|
|
4578
|
-
const { runWorkBuild, WorkCommandError } = await import('./work-cmd-
|
|
4578
|
+
const { runWorkBuild, WorkCommandError } = await import('./work-cmd-LRAXUOJV.js');
|
|
4579
4579
|
try {
|
|
4580
4580
|
await runWorkBuild(opts);
|
|
4581
4581
|
} catch (err) {
|
|
@@ -4598,7 +4598,7 @@ renews that session's own 20-minute lease, unless --no-lease or
|
|
|
4598
4598
|
--ended is given, or another worker already holds a live one.
|
|
4599
4599
|
`
|
|
4600
4600
|
).action(async (number, opts) => {
|
|
4601
|
-
const { runWorkLinkSession, WorkCommandError } = await import('./work-cmd-
|
|
4601
|
+
const { runWorkLinkSession, WorkCommandError } = await import('./work-cmd-LRAXUOJV.js');
|
|
4602
4602
|
try {
|
|
4603
4603
|
await runWorkLinkSession({ ...opts, number, noLease: opts.lease === false, logFailures: opts.logFailures === true });
|
|
4604
4604
|
} catch (err) {
|
|
@@ -4622,8 +4622,8 @@ criterion's new proof; --ready hands the thread back to a person. At
|
|
|
4622
4622
|
most one action flag may be given.
|
|
4623
4623
|
`
|
|
4624
4624
|
).action(async (opts) => {
|
|
4625
|
-
const { runWorkComment, WorkCommentCommandError } = await import('./work-comment-cmd-
|
|
4626
|
-
const { WorkCommandError } = await import('./work-cmd-
|
|
4625
|
+
const { runWorkComment, WorkCommentCommandError } = await import('./work-comment-cmd-4RDIBUYO.js');
|
|
4626
|
+
const { WorkCommandError } = await import('./work-cmd-LRAXUOJV.js');
|
|
4627
4627
|
try {
|
|
4628
4628
|
await runWorkComment(opts);
|
|
4629
4629
|
} catch (err) {
|
|
@@ -4644,8 +4644,8 @@ criterion that carries proof or a comment, each with who is waiting
|
|
|
4644
4644
|
on whom next.
|
|
4645
4645
|
`
|
|
4646
4646
|
).action(async (opts) => {
|
|
4647
|
-
const { runWorkThreads, WorkCommentCommandError } = await import('./work-comment-cmd-
|
|
4648
|
-
const { WorkCommandError } = await import('./work-cmd-
|
|
4647
|
+
const { runWorkThreads, WorkCommentCommandError } = await import('./work-comment-cmd-4RDIBUYO.js');
|
|
4648
|
+
const { WorkCommandError } = await import('./work-cmd-LRAXUOJV.js');
|
|
4649
4649
|
try {
|
|
4650
4650
|
await runWorkThreads(opts);
|
|
4651
4651
|
} catch (err) {
|
|
@@ -4669,8 +4669,8 @@ still running, or that an older runner released, has no log and the
|
|
|
4669
4669
|
command exits 1.
|
|
4670
4670
|
`
|
|
4671
4671
|
).action(async (opts) => {
|
|
4672
|
-
const { runWorkLogs, WorkLogsCommandError } = await import('./work-logs-cmd-
|
|
4673
|
-
const { WorkCommandError } = await import('./work-cmd-
|
|
4672
|
+
const { runWorkLogs, WorkLogsCommandError } = await import('./work-logs-cmd-YYN2CPJQ.js');
|
|
4673
|
+
const { WorkCommandError } = await import('./work-cmd-LRAXUOJV.js');
|
|
4674
4674
|
try {
|
|
4675
4675
|
await runWorkLogs(opts);
|
|
4676
4676
|
} catch (err) {
|
|
@@ -4693,8 +4693,8 @@ item is not built again until a new build request. Exits 1 when no host
|
|
|
4693
4693
|
build is running for the item.
|
|
4694
4694
|
`
|
|
4695
4695
|
).action(async (opts) => {
|
|
4696
|
-
const { runWorkStop, WorkStopCommandError } = await import('./work-stop-cmd-
|
|
4697
|
-
const { WorkCommandError } = await import('./work-cmd-
|
|
4696
|
+
const { runWorkStop, WorkStopCommandError } = await import('./work-stop-cmd-P7HXVKEG.js');
|
|
4697
|
+
const { WorkCommandError } = await import('./work-cmd-LRAXUOJV.js');
|
|
4698
4698
|
try {
|
|
4699
4699
|
await runWorkStop(opts);
|
|
4700
4700
|
} catch (err) {
|
|
@@ -4715,7 +4715,7 @@ deletes anything \u2014 the item is removed from Work only once no
|
|
|
4715
4715
|
live addition remains on it.
|
|
4716
4716
|
`
|
|
4717
4717
|
).action(async (opts) => {
|
|
4718
|
-
const { runWorkRemove, WorkCommandError } = await import('./work-cmd-
|
|
4718
|
+
const { runWorkRemove, WorkCommandError } = await import('./work-cmd-LRAXUOJV.js');
|
|
4719
4719
|
try {
|
|
4720
4720
|
await runWorkRemove(opts);
|
|
4721
4721
|
} catch (err) {
|
|
@@ -4727,7 +4727,7 @@ live addition remains on it.
|
|
|
4727
4727
|
}
|
|
4728
4728
|
});
|
|
4729
4729
|
workCmd.command("status").description("Show one item's stage, gate ledger, and additions").option("--item <number>", "the item's number inside this factory").option("--issue <number>", "issue number, or a Linear/Jira key like ENG-123").option(TRACKER_OPTION_FLAG, "tracker for a keyed --issue, when both hold the key").option("--repo <owner/name>", "repository for an issue number (default: the checkout's remote)").option("--json", "machine-readable JSON output").option("--url <url>", "cloud base URL (or OUTERLAYER_URL / config)").addOption(apiKeyOption()).option("--app-id <id>", "factory id the key is bound to (or OUTERLAYER_APP_ID / config)").action(async (opts) => {
|
|
4730
|
-
const { runWorkStatus, WorkCommandError } = await import('./work-cmd-
|
|
4730
|
+
const { runWorkStatus, WorkCommandError } = await import('./work-cmd-LRAXUOJV.js');
|
|
4731
4731
|
try {
|
|
4732
4732
|
await runWorkStatus(opts);
|
|
4733
4733
|
} catch (err) {
|
|
@@ -4739,7 +4739,7 @@ live addition remains on it.
|
|
|
4739
4739
|
}
|
|
4740
4740
|
});
|
|
4741
4741
|
workCmd.command("list").description("List live work items for this factory").option("--stage <spec|build|review>", "filter by stage").option("--section <attention|waiting|flowing>", "filter by Queue section").option("--repo <owner/name>", "repository (default: the current checkout's remote)").option("--unclaimed", "only items with no live lease").option("--claimed", "only items with a live lease, held by a host or a local session").option("--startable", "only items a host can start: a build request, no open PR, no live lease").option("--needs <amend>", "only items with a thread waiting on an agent").option("--json", "machine-readable JSON output").option("--url <url>", "cloud base URL (or OUTERLAYER_URL / config)").addOption(apiKeyOption()).option("--app-id <id>", "factory id the key is bound to (or OUTERLAYER_APP_ID / config)").action(async (opts) => {
|
|
4742
|
-
const { runWorkList, WorkCommandError } = await import('./work-cmd-
|
|
4742
|
+
const { runWorkList, WorkCommandError } = await import('./work-cmd-LRAXUOJV.js');
|
|
4743
4743
|
try {
|
|
4744
4744
|
await runWorkList(opts);
|
|
4745
4745
|
} catch (err) {
|
|
@@ -4760,7 +4760,7 @@ by a different key is refused; claiming again with the same key extends
|
|
|
4760
4760
|
it. --host is a label only.
|
|
4761
4761
|
`
|
|
4762
4762
|
).action(async (opts) => {
|
|
4763
|
-
const { runWorkClaim, WorkCommandError } = await import('./work-claim-cmd-
|
|
4763
|
+
const { runWorkClaim, WorkCommandError } = await import('./work-claim-cmd-BUMIPJNF.js');
|
|
4764
4764
|
try {
|
|
4765
4765
|
await runWorkClaim(opts);
|
|
4766
4766
|
} catch (err) {
|
|
@@ -4780,7 +4780,7 @@ Extends the live lease this API key holds. Refused with a 410 if the
|
|
|
4780
4780
|
lease has expired, or a 403 if a different key holds it.
|
|
4781
4781
|
`
|
|
4782
4782
|
).action(async (opts) => {
|
|
4783
|
-
const { runWorkRenew, WorkCommandError } = await import('./work-claim-cmd-
|
|
4783
|
+
const { runWorkRenew, WorkCommandError } = await import('./work-claim-cmd-BUMIPJNF.js');
|
|
4784
4784
|
try {
|
|
4785
4785
|
await runWorkRenew(opts);
|
|
4786
4786
|
} catch (err) {
|
|
@@ -4812,7 +4812,7 @@ applies to a host's lease only. A later tool call in the session
|
|
|
4812
4812
|
takes the lease again.
|
|
4813
4813
|
`
|
|
4814
4814
|
).action(async (opts) => {
|
|
4815
|
-
const { runWorkRelease, WorkCommandError } = await import('./work-claim-cmd-
|
|
4815
|
+
const { runWorkRelease, WorkCommandError } = await import('./work-claim-cmd-BUMIPJNF.js');
|
|
4816
4816
|
try {
|
|
4817
4817
|
await runWorkRelease(opts);
|
|
4818
4818
|
} catch (err) {
|
|
@@ -4839,7 +4839,7 @@ Idempotent: declaring the same pull request twice is a no-op.
|
|
|
4839
4839
|
needs your own login; an agent session or a factory key is refused.
|
|
4840
4840
|
`
|
|
4841
4841
|
).action(async (number, opts) => {
|
|
4842
|
-
const { runWorkPr, WorkPrCommandError } = await import('./work-pr-cmd-
|
|
4842
|
+
const { runWorkPr, WorkPrCommandError } = await import('./work-pr-cmd-BODEZAXN.js');
|
|
4843
4843
|
try {
|
|
4844
4844
|
await runWorkPr({ ...opts, number });
|
|
4845
4845
|
} catch (err) {
|
|
@@ -4864,8 +4864,8 @@ login, then declares the pull request on the item, as \`work pr\` does.
|
|
|
4864
4864
|
Run it again after a change to the title or description.
|
|
4865
4865
|
`
|
|
4866
4866
|
).action(async (opts) => {
|
|
4867
|
-
const { runWorkOpenPr, WorkOpenPrCommandError } = await import('./work-open-pr-cmd-
|
|
4868
|
-
const { WorkCommandError } = await import('./work-cmd-
|
|
4867
|
+
const { runWorkOpenPr, WorkOpenPrCommandError } = await import('./work-open-pr-cmd-3MCND2LZ.js');
|
|
4868
|
+
const { WorkCommandError } = await import('./work-cmd-LRAXUOJV.js');
|
|
4869
4869
|
try {
|
|
4870
4870
|
await runWorkOpenPr(opts);
|
|
4871
4871
|
} catch (err) {
|
|
@@ -4881,9 +4881,9 @@ function registerRunnerCommands(program2) {
|
|
|
4881
4881
|
const runnerCmd = program2.command("runner").description("Take work from the implement and amend queues on this machine");
|
|
4882
4882
|
const configOption = "the cloud config file to run against (default: ~/.outerlayer/config.json)";
|
|
4883
4883
|
runnerCmd.command("start").description("Run the loop: claim work, run it, report, clean up, repeat").option("--config <path>", configOption).action(async (opts) => {
|
|
4884
|
-
const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-
|
|
4885
|
-
const { start, RunnerStartError } = await import('./loop-
|
|
4886
|
-
const { RunnerAlreadyRunningError } = await import('./pidfile-
|
|
4884
|
+
const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-JJ3EO7SB.js');
|
|
4885
|
+
const { start, RunnerStartError } = await import('./loop-BPVEA5OC.js');
|
|
4886
|
+
const { RunnerAlreadyRunningError } = await import('./pidfile-VYBH3IMN.js');
|
|
4887
4887
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
4888
4888
|
try {
|
|
4889
4889
|
const { realUpdateDeps } = await import('./real-deps-KNNBQC75.js');
|
|
@@ -4896,9 +4896,33 @@ function registerRunnerCommands(program2) {
|
|
|
4896
4896
|
throw err;
|
|
4897
4897
|
}
|
|
4898
4898
|
});
|
|
4899
|
+
runnerCmd.command("container-start").description("Container entrypoint: write the config from variables, then run").addHelpText(
|
|
4900
|
+
"after",
|
|
4901
|
+
"\nReads OUTERLAYER_URL, OUTERLAYER_APP_ID, OUTERLAYER_API_KEY, OUTERLAYER_RUNNER_NAME and one Claude credential\n(CLAUDE_CODE_OAUTH_TOKEN, ANTHROPIC_API_KEY or ANTHROPIC_AUTH_TOKEN) from the environment. OUTERLAYER_AGENT\nis optional and defaults to claude. On a later start it refuses variables that disagree with the config in the volume.\nThe image sets OUTERLAYER_RUNNER_IMAGE; outside the image, use `runner start`.\n"
|
|
4902
|
+
).action(async () => {
|
|
4903
|
+
const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-JJ3EO7SB.js');
|
|
4904
|
+
const { containerStart } = await import('./container-start-X22OXY6E.js');
|
|
4905
|
+
const { start, RunnerStartError } = await import('./loop-BPVEA5OC.js');
|
|
4906
|
+
const { RunnerAlreadyRunningError } = await import('./pidfile-VYBH3IMN.js');
|
|
4907
|
+
try {
|
|
4908
|
+
const result = await containerStart({
|
|
4909
|
+
env: process.env,
|
|
4910
|
+
configPath: defaultRunnerConfigPath(),
|
|
4911
|
+
start,
|
|
4912
|
+
exit: (code) => process.exit(code)
|
|
4913
|
+
});
|
|
4914
|
+
if (!result.ok) fail(result.message);
|
|
4915
|
+
} catch (err) {
|
|
4916
|
+
if (err instanceof RunnerConfigError || err instanceof RunnerAlreadyRunningError || err instanceof RunnerStartError) {
|
|
4917
|
+
fail(err.message);
|
|
4918
|
+
return;
|
|
4919
|
+
}
|
|
4920
|
+
throw err;
|
|
4921
|
+
}
|
|
4922
|
+
});
|
|
4899
4923
|
runnerCmd.command("check").description("Validate the config, the hooks and the key, and print the effective settings").option("--config <path>", configOption).action(async (opts) => {
|
|
4900
|
-
const { defaultRunnerConfigPath } = await import('./config-
|
|
4901
|
-
const { runRunnerCheck } = await import('./check-
|
|
4924
|
+
const { defaultRunnerConfigPath } = await import('./config-JJ3EO7SB.js');
|
|
4925
|
+
const { runRunnerCheck } = await import('./check-EPYRTE3R.js');
|
|
4902
4926
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
4903
4927
|
const result = await runRunnerCheck(configPath);
|
|
4904
4928
|
if (!result.ok) {
|
|
@@ -4911,11 +4935,16 @@ function registerRunnerCommands(program2) {
|
|
|
4911
4935
|
`
|
|
4912
4936
|
);
|
|
4913
4937
|
process.stdout.write(`${result.lines.join("\n")}
|
|
4938
|
+
`);
|
|
4939
|
+
});
|
|
4940
|
+
runnerCmd.command("job-state-formats", { hidden: true }).description("Print the job-state formats this version reads and the one it writes, as JSON").action(async () => {
|
|
4941
|
+
const { jobStateFormatsAnswer } = await import('./job-state-format-WJQGQB6F.js');
|
|
4942
|
+
process.stdout.write(`${JSON.stringify(jobStateFormatsAnswer())}
|
|
4914
4943
|
`);
|
|
4915
4944
|
});
|
|
4916
4945
|
runnerCmd.command("install").description("Put this CLI in the runner's install layout; --service adds its service").option("--config <path>", configOption).option("--service", "set up the service that keeps the runner running").option("--print", "with --service, print the unit and set up nothing").option("--user <account>", "with --service, the account the service runs as").option("--replace", "replace a unit or launcher file this command did not write").option("--allow-downgrade", "install this CLI even when it is older than the version the runner runs").option("--unit-name <name>", "with --service, the unit's name, to run a second runner beside the first").action(async (opts) => {
|
|
4917
|
-
const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-
|
|
4918
|
-
const { runRunnerInstall, RunnerInstallError, launcherSummary, restartNote } = await import('./install-cmd-
|
|
4946
|
+
const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-JJ3EO7SB.js');
|
|
4947
|
+
const { runRunnerInstall, RunnerInstallError, launcherSummary, restartNote } = await import('./install-cmd-SE6NCTJK.js');
|
|
4919
4948
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
4920
4949
|
if (opts.service !== true) {
|
|
4921
4950
|
for (const flag of ["print", "user", "unitName"]) {
|
|
@@ -4927,7 +4956,7 @@ function registerRunnerCommands(program2) {
|
|
|
4927
4956
|
}
|
|
4928
4957
|
try {
|
|
4929
4958
|
if (opts.service === true) {
|
|
4930
|
-
const { installServiceCommand } = await import('./command-
|
|
4959
|
+
const { installServiceCommand } = await import('./command-ITLPJ5XU.js');
|
|
4931
4960
|
const result2 = await installServiceCommand({
|
|
4932
4961
|
configPath,
|
|
4933
4962
|
print: opts.print,
|
|
@@ -4982,8 +5011,8 @@ To keep it running, run ${C.yellow}${cliInvocation()} runner install --service${
|
|
|
4982
5011
|
fail(`pass --service: \`${cliInvocation()} runner uninstall --service\` removes the runner's service.`);
|
|
4983
5012
|
return;
|
|
4984
5013
|
}
|
|
4985
|
-
const { defaultRunnerConfigPath } = await import('./config-
|
|
4986
|
-
const { uninstallServiceCommand } = await import('./command-
|
|
5014
|
+
const { defaultRunnerConfigPath } = await import('./config-JJ3EO7SB.js');
|
|
5015
|
+
const { uninstallServiceCommand } = await import('./command-ITLPJ5XU.js');
|
|
4987
5016
|
const result = await uninstallServiceCommand({ configPath: opts.config ?? defaultRunnerConfigPath(), unitName: opts.unitName, home: homeFromEnv() });
|
|
4988
5017
|
if (result.ok) for (const line of result.lines) process.stdout.write(`${C.green}\u2713${C.reset} ${line}
|
|
4989
5018
|
`);
|
|
@@ -5010,12 +5039,12 @@ already in runner.env is used.
|
|
|
5010
5039
|
printf '%s' "$CLAUDE_CODE_OAUTH_TOKEN" | ${cliInvocation()} runner init --agent claude --factory <org>/<factory>
|
|
5011
5040
|
`
|
|
5012
5041
|
).action(async (opts) => {
|
|
5013
|
-
const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-
|
|
5014
|
-
const { prepareRunnerInit, runRunnerInit, RunnerInitError, writeRunnerInit } = await import('./init-
|
|
5015
|
-
const { obtainRunnerKey, runnerKeyLogin } = await import('./runner-key-
|
|
5016
|
-
const { detectMachine } = await import('./machine-
|
|
5017
|
-
const { chooseVm, runVmInit, VmInitError } = await import('./init-
|
|
5018
|
-
const { AGENT_COMMANDS, credentialFromStdin, isAgentName, restartForCredential, RunnerEnvError } = await import('./runner-env-
|
|
5042
|
+
const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-JJ3EO7SB.js');
|
|
5043
|
+
const { prepareRunnerInit, runRunnerInit, RunnerInitError, writeRunnerInit } = await import('./init-SKOXNJND.js');
|
|
5044
|
+
const { obtainRunnerKey, runnerKeyLogin } = await import('./runner-key-L55O7Y7W.js');
|
|
5045
|
+
const { detectMachine } = await import('./machine-G3GICXQN.js');
|
|
5046
|
+
const { chooseVm, runVmInit, VmInitError } = await import('./init-NE3VR3EY.js');
|
|
5047
|
+
const { AGENT_COMMANDS, credentialFromStdin, isAgentName, restartForCredential, RunnerEnvError } = await import('./runner-env-GUFV544G.js');
|
|
5019
5048
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
5020
5049
|
if (opts.agent !== void 0 && !isAgentName(opts.agent)) {
|
|
5021
5050
|
fail(`--agent ${opts.agent}: runner init writes commands for ${Object.keys(AGENT_COMMANDS).join(", ")}. For another agent, leave --agent out and edit runner.commands.`);
|
|
@@ -5046,7 +5075,7 @@ already in runner.env is used.
|
|
|
5046
5075
|
const chunks = [];
|
|
5047
5076
|
for await (const chunk of process.stdin) chunks.push(Buffer.from(chunk));
|
|
5048
5077
|
const result2 = runRunnerInit(configPath, { machine, configFromStdin: Buffer.concat(chunks).toString("utf8"), requireContainer: true });
|
|
5049
|
-
const { ensureHostKey: ensureHostKey2 } = await import('./host-key-
|
|
5078
|
+
const { ensureHostKey: ensureHostKey2 } = await import('./host-key-ICJEQBWH.js');
|
|
5050
5079
|
const hostKey2 = await ensureHostKey2(configPath);
|
|
5051
5080
|
process.stdout.write(`host key ${hostKey2.fingerprint}
|
|
5052
5081
|
hooks: ${result2.hooks}
|
|
@@ -5105,7 +5134,7 @@ hooks: ${result2.hooks}
|
|
|
5105
5134
|
const prepared = prepareRunnerInit(configPath, { machine, allowProcess, agent, credential, keyFromLogin: makeKey !== void 0 });
|
|
5106
5135
|
const created = makeKey === void 0 ? void 0 : await makeKey();
|
|
5107
5136
|
const result = writeRunnerInit(prepared, created);
|
|
5108
|
-
const { ensureHostKey } = await import('./host-key-
|
|
5137
|
+
const { ensureHostKey } = await import('./host-key-ICJEQBWH.js');
|
|
5109
5138
|
const hostKey = await ensureHostKey(configPath);
|
|
5110
5139
|
if (created !== void 0) {
|
|
5111
5140
|
process.stdout.write(`${C.green}\u2713${C.reset} saved the runner key in ${result.configPath}
|
|
@@ -5133,7 +5162,7 @@ ${C.yellow}${result.note}${C.reset}
|
|
|
5133
5162
|
To isolate builds in containers instead, run ${C.yellow}${cliInvocation()} runner init --vm${C.reset}.
|
|
5134
5163
|
`);
|
|
5135
5164
|
}
|
|
5136
|
-
const { runRunnerInstall, RunnerInstallError, RunnerDowngradeError, launcherSummary } = await import('./install-cmd-
|
|
5165
|
+
const { runRunnerInstall, RunnerInstallError, RunnerDowngradeError, launcherSummary } = await import('./install-cmd-SE6NCTJK.js');
|
|
5137
5166
|
let installedLayout = false;
|
|
5138
5167
|
let noService = "it starts the runner from the install layout, which needs a CLI installed with npm";
|
|
5139
5168
|
try {
|
|
@@ -5165,7 +5194,7 @@ ${C.yellow}The runner will not update itself: ${installErr.message}${C.reset}
|
|
|
5165
5194
|
let serviceUp = false;
|
|
5166
5195
|
let restart;
|
|
5167
5196
|
if (installedLayout) {
|
|
5168
|
-
const { installServiceCommand } = await import('./command-
|
|
5197
|
+
const { installServiceCommand } = await import('./command-ITLPJ5XU.js');
|
|
5169
5198
|
const service = await installServiceCommand({
|
|
5170
5199
|
configPath,
|
|
5171
5200
|
entryPath: process.argv[1] ?? "",
|
|
@@ -5209,12 +5238,12 @@ Next:
|
|
|
5209
5238
|
"after",
|
|
5210
5239
|
"\nA repository governed by a control plane builds the control plane's image, at the commit\nthe gateway has stored for it. A repository that governs itself fetches the head of its\ndefault branch into the runner's cache. Either way it reads .devcontainer/devcontainer.json\nand builds the image with the devcontainer CLI. Settings\nthat reach the host or widen the container's privileges are ignored and listed. The\nimage holds this CLI and a pinned Claude Code. Nothing runs inside the image.\n"
|
|
5211
5240
|
).action(async (opts) => {
|
|
5212
|
-
const { defaultRunnerConfigPath } = await import('./config-
|
|
5213
|
-
const { buildRepositoryImage, RecipeError } = await import('./build-
|
|
5241
|
+
const { defaultRunnerConfigPath } = await import('./config-JJ3EO7SB.js');
|
|
5242
|
+
const { buildRepositoryImage, RecipeError } = await import('./build-Q2OBF77R.js');
|
|
5214
5243
|
const { currentCliBuild } = await import('./cli-build-K56DK4DS.js');
|
|
5215
|
-
const { createDockerHost } = await import('./docker-
|
|
5216
|
-
const { builderSpec } = await import('./builder-
|
|
5217
|
-
const { loadRunnerConfig } = await import('./config-
|
|
5244
|
+
const { createDockerHost } = await import('./docker-PQHWAY5J.js');
|
|
5245
|
+
const { builderSpec } = await import('./builder-PRSCX5AH.js');
|
|
5246
|
+
const { loadRunnerConfig } = await import('./config-JJ3EO7SB.js');
|
|
5218
5247
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
5219
5248
|
const loaded = (() => {
|
|
5220
5249
|
try {
|
|
@@ -5225,11 +5254,11 @@ Next:
|
|
|
5225
5254
|
})();
|
|
5226
5255
|
const memory = loaded?.build?.memory ?? "8g";
|
|
5227
5256
|
try {
|
|
5228
|
-
const { ensureRunnerIdentity } = await import('./runner-identity-
|
|
5257
|
+
const { ensureRunnerIdentity } = await import('./runner-identity-J6DXJ6MF.js');
|
|
5229
5258
|
await ensureRunnerIdentity(configPath, { log: (line) => console.error(line) }).catch((err) => {
|
|
5230
5259
|
console.error(`the runner's Docker identity could not be stored: ${err instanceof Error ? err.message : String(err)}`);
|
|
5231
5260
|
});
|
|
5232
|
-
const { imageTargetFor } = await import('./governing-source-
|
|
5261
|
+
const { imageTargetFor } = await import('./governing-source-DKJABQAT.js');
|
|
5233
5262
|
const target = await imageTargetFor({ config: loaded, repository: opts.repository, fetchImpl: fetch });
|
|
5234
5263
|
if (!target.ok) {
|
|
5235
5264
|
if (opts.json) {
|
|
@@ -5291,24 +5320,27 @@ Next:
|
|
|
5291
5320
|
throw err;
|
|
5292
5321
|
}
|
|
5293
5322
|
});
|
|
5294
|
-
runnerCmd.command("stop").description("Take no more work;
|
|
5295
|
-
const { defaultRunnerConfigPath } = await import('./config-
|
|
5296
|
-
const { requestStop } = await import('./loop-
|
|
5323
|
+
runnerCmd.command("stop").description("Take no more work; finish running jobs, then exit").option("--config <path>", "the cloud config file naming the runner to stop").option("--now", "end running jobs immediately, with outcome stopped").action(async (opts) => {
|
|
5324
|
+
const { defaultRunnerConfigPath } = await import('./config-JJ3EO7SB.js');
|
|
5325
|
+
const { requestStop } = await import('./loop-BPVEA5OC.js');
|
|
5297
5326
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
5298
|
-
await
|
|
5327
|
+
const { runnerImageVersion } = await import('./image-tag-6KJOGBQK.js');
|
|
5328
|
+
await requestStop(configPath, Boolean(opts.now), void 0, { image: runnerImageVersion() !== void 0 });
|
|
5299
5329
|
});
|
|
5300
5330
|
runnerCmd.command("status").description("List running jobs; with --recent, finished ones too").option("--config <path>", "the cloud config file naming the runner to inspect").option("--recent", "also list finished jobs, newest first, capped at 20").option("--json", "machine-readable JSON output").action(async (opts) => {
|
|
5301
|
-
const { defaultRunnerConfigPath, loadRunnerConfig } = await import('./config-
|
|
5302
|
-
const { jobsDir, runnerDir } = await import('./paths-
|
|
5303
|
-
const { listJobFiles, runnerProcessState } = await import('./loop-
|
|
5304
|
-
const { renderStatus } = await import('./status-
|
|
5305
|
-
const { readHousekeepingRecord } = await import('./record-
|
|
5331
|
+
const { defaultRunnerConfigPath, loadRunnerConfig } = await import('./config-JJ3EO7SB.js');
|
|
5332
|
+
const { jobsDir, runnerDir } = await import('./paths-2KGM2LZV.js');
|
|
5333
|
+
const { listJobFiles, runnerProcessState } = await import('./loop-BPVEA5OC.js');
|
|
5334
|
+
const { renderStatus } = await import('./status-U6DXOR6C.js');
|
|
5335
|
+
const { readHousekeepingRecord } = await import('./record-GNOHDJ2O.js');
|
|
5306
5336
|
const path2 = await import('path');
|
|
5307
5337
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
5308
5338
|
const all = listJobFiles(configPath);
|
|
5309
5339
|
const housekeeping = readHousekeepingRecord(runnerDir(configPath));
|
|
5310
|
-
const { readPendingUpdate } = await import('./pending-
|
|
5340
|
+
const { readPendingUpdate } = await import('./pending-BGLMTB5Q.js');
|
|
5311
5341
|
const pendingUpdate = readPendingUpdate(runnerDir(configPath));
|
|
5342
|
+
const { readImageStatus } = await import('./image-tag-6KJOGBQK.js');
|
|
5343
|
+
const image = readImageStatus(runnerDir(configPath));
|
|
5312
5344
|
let host = "unknown";
|
|
5313
5345
|
let concurrency = 1;
|
|
5314
5346
|
try {
|
|
@@ -5321,7 +5353,7 @@ Next:
|
|
|
5321
5353
|
const service = await (async () => {
|
|
5322
5354
|
if (process.platform !== "linux" || !existsSync("/run/systemd/system")) return void 0;
|
|
5323
5355
|
const { inspectService, realInspectProbes } = await import('./inspect-6UYAAXH7.js');
|
|
5324
|
-
const { DEFAULT_UNIT_NAME } = await import('./install-
|
|
5356
|
+
const { DEFAULT_UNIT_NAME } = await import('./install-MPEJJ7X6.js');
|
|
5325
5357
|
const facts = inspectService(DEFAULT_UNIT_NAME, path2.dirname(configPath), realInspectProbes());
|
|
5326
5358
|
return facts === void 0 ? void 0 : { unit: facts.unit, running: facts.mainPid !== void 0, delegated: facts.delegate };
|
|
5327
5359
|
})();
|
|
@@ -5335,6 +5367,7 @@ Next:
|
|
|
5335
5367
|
// A hold is only true of a runner that is running.
|
|
5336
5368
|
housekeeping: processState.state === "running" ? housekeeping : { ...housekeeping, holding: void 0 },
|
|
5337
5369
|
pendingUpdate: processState.state === "running" ? pendingUpdate : void 0,
|
|
5370
|
+
image,
|
|
5338
5371
|
jobs: all.map(({ dirName, job }) => ({ ...withoutItemKey(job), jobDir: path2.join(jobsDir(configPath), dirName) }))
|
|
5339
5372
|
});
|
|
5340
5373
|
return;
|
|
@@ -5350,15 +5383,16 @@ Next:
|
|
|
5350
5383
|
recent: Boolean(opts.recent),
|
|
5351
5384
|
housekeeping,
|
|
5352
5385
|
pendingUpdate,
|
|
5386
|
+
image,
|
|
5353
5387
|
service
|
|
5354
5388
|
})}
|
|
5355
5389
|
`
|
|
5356
5390
|
);
|
|
5357
5391
|
});
|
|
5358
5392
|
runnerCmd.command("logs").argument("<item>", "the work item's number in the factory").description("Print the newest attempt's log for one item").option("--config <path>", "the cloud config file naming the runner to inspect").option("-f, --follow", "keep printing as the log grows").action(async (itemArg, opts) => {
|
|
5359
|
-
const { defaultRunnerConfigPath } = await import('./config-
|
|
5360
|
-
const { listJobFiles } = await import('./loop-
|
|
5361
|
-
const { newestAttempt, logPathFor, tail, RunnerLogsError } = await import('./logs-
|
|
5393
|
+
const { defaultRunnerConfigPath } = await import('./config-JJ3EO7SB.js');
|
|
5394
|
+
const { listJobFiles } = await import('./loop-BPVEA5OC.js');
|
|
5395
|
+
const { newestAttempt, logPathFor, tail, RunnerLogsError } = await import('./logs-T4ERSOQ4.js');
|
|
5362
5396
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
5363
5397
|
const item = parseTrackerNumber(itemArg);
|
|
5364
5398
|
if (item === void 0) {
|
|
@@ -5606,7 +5640,7 @@ caller from the bearer token, the gateway answers 401 without that header.
|
|
|
5606
5640
|
"after",
|
|
5607
5641
|
"\nWhat the stdio .mcp.json entry spawns. Reads newline-delimited JSON-RPC 2.0 on\nstdin and writes responses on stdout. The API key comes from OUTERLAYER_API_KEY\nor ~/.outerlayer/config.json at start-up; with neither the command exits 1 and\nprints why, which the MCP client shows as the connect error.\n"
|
|
5608
5642
|
).action(async (opts) => {
|
|
5609
|
-
const { runMcpServe, handleMcpServeError } = await import('./mcp-serve-cmd-
|
|
5643
|
+
const { runMcpServe, handleMcpServeError } = await import('./mcp-serve-cmd-7M4VLNI4.js');
|
|
5610
5644
|
try {
|
|
5611
5645
|
await runMcpServe({ url: opts.url, appId: opts.appId });
|
|
5612
5646
|
} catch (err) {
|