@outerlayer/cli 0.8.0 → 0.8.2
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 +30 -0
- package/README.md +27 -9
- package/dist/{agent-setup-C7PLRXZO.js → agent-setup-C5X4356W.js} +10 -10
- package/dist/{build-MS34XEGN.js → build-3FSJR5OO.js} +1 -1
- package/dist/build-info.json +1 -1
- package/dist/{builder-G52A6GW2.js → builder-QZA2Z3M3.js} +3 -3
- package/dist/{check-FOF3PUKI.js → check-HQHFAOXW.js} +30 -29
- package/dist/{chunk-R7STSBLC.js → chunk-2E2MG3KW.js} +1 -1
- package/dist/{chunk-OD2VTIHN.js → chunk-2FWL7CE2.js} +3 -2
- package/dist/{chunk-K35RW5HP.js → chunk-33GOCSRO.js} +4 -4
- package/dist/{chunk-4A5E2G4E.js → chunk-3J476JZC.js} +11 -11
- package/dist/{chunk-MQ3IPHIZ.js → chunk-47RS42OZ.js} +6 -3
- package/dist/{chunk-3S4P55NE.js → chunk-4ZZR5SKG.js} +3 -3
- package/dist/{chunk-PWBILI5P.js → chunk-7KI224YS.js} +1 -1
- package/dist/{chunk-5TNS3PL7.js → chunk-CLURXEWV.js} +4 -3
- package/dist/{chunk-7ZR5UPMB.js → chunk-CMFCCIQN.js} +167 -1
- package/dist/{chunk-AX23QKHS.js → chunk-CRLAB4PM.js} +1 -1
- package/dist/{chunk-CM5QTKM4.js → chunk-EQG7L6LM.js} +311 -29
- package/dist/{chunk-OEK4JEB3.js → chunk-ERI5GBNI.js} +18 -3
- package/dist/{chunk-ILEA3YHM.js → chunk-EWBM2USM.js} +2 -2
- package/dist/{chunk-EV3M3EH7.js → chunk-G54QHBTI.js} +2 -2
- package/dist/{chunk-M3SQ4YGD.js → chunk-GXSMDL4M.js} +1 -1
- package/dist/{chunk-GAYWY4GI.js → chunk-HN2JBGSI.js} +2 -1
- package/dist/{chunk-ZOAEPWGL.js → chunk-HWMYGAKF.js} +1 -1
- package/dist/chunk-I2UOAV7X.js +133 -0
- package/dist/{chunk-ABIWDUMS.js → chunk-IS4DIGBQ.js} +13 -1
- package/dist/{chunk-WVGSB3Z2.js → chunk-J5DPVNL3.js} +2 -2
- package/dist/{chunk-VXLJORHL.js → chunk-JXH6LEEH.js} +1 -1
- package/dist/{chunk-JPR2WHHF.js → chunk-KI7VPNKC.js} +1 -1
- package/dist/{chunk-TUUMW4TC.js → chunk-LSPJHYHM.js} +1 -1
- package/dist/{chunk-7VNURP6M.js → chunk-M2F2RAMK.js} +82 -26
- package/dist/{chunk-NALVDFIS.js → chunk-MJLUWGUD.js} +2 -2
- package/dist/{chunk-5FWNEQNZ.js → chunk-NACLOOXP.js} +5 -5
- package/dist/{chunk-U3GOI2B4.js → chunk-NPBLDMSD.js} +1 -1
- package/dist/{chunk-BOLTI6LR.js → chunk-PLMTLGYH.js} +1 -1
- package/dist/{chunk-IRCBTGWF.js → chunk-QJPO42VI.js} +6 -6
- package/dist/{chunk-5QLNZGAQ.js → chunk-R5SPFO6F.js} +6 -6
- package/dist/{chunk-M5POMKKW.js → chunk-V7NIVOFD.js} +5 -5
- package/dist/{chunk-IJBVPLZZ.js → chunk-VUGDEUMM.js} +71 -143
- package/dist/{chunk-4ACZCY4I.js → chunk-WMPO3SKK.js} +3 -3
- package/dist/{chunk-TTNFGMHO.js → chunk-Y7UQHKFY.js} +19 -1
- package/dist/{chunk-BCLJSQCV.js → chunk-YO4PSLVB.js} +1 -1
- package/dist/{chunk-AIL2R4SI.js → chunk-YU4Z2O3W.js} +5 -5
- package/dist/{chunk-ZZXLM64C.js → chunk-ZJ3WRVRG.js} +1 -1
- package/dist/{cli-AOJPAVFX.js → cli-OWM54BIU.js} +120 -93
- package/dist/{command-SY3SVLAI.js → command-LIHTWJHQ.js} +31 -25
- package/dist/{config-Z3USDBLU.js → config-OOBPCY7Q.js} +2 -2
- package/dist/{connect-cmd-PNZ6IJLJ.js → connect-cmd-NV7WVBY7.js} +3 -3
- package/dist/{context-adopt-CE4KDXS3.js → context-adopt-PPCNSN5D.js} +7 -7
- package/dist/{context-materialize-QL33HDJN.js → context-materialize-YR3JQCUF.js} +7 -7
- package/dist/{dist-3ZTZF2TP.js → dist-2LNAXGPZ.js} +1 -1
- package/dist/{docker-676FD3CQ.js → docker-RSALMGPL.js} +4 -4
- package/dist/{doctor-WR6TRPSU.js → doctor-PKT42NOJ.js} +59 -25
- package/dist/{emit-artifact-cmd-AVM4YXMQ.js → emit-artifact-cmd-BZYXRBCV.js} +8 -8
- package/dist/{emit-cmd-2QRMYPYO.js → emit-cmd-IRYNFHPM.js} +3 -3
- package/dist/{emit-criteria-cmd-LDBE4YDS.js → emit-criteria-cmd-PSZYZ32B.js} +6 -6
- package/dist/{emit-finding-cmd-6R5WBPCH.js → emit-finding-cmd-VTSYDJYZ.js} +6 -6
- package/dist/{emit-result-cmd-2DMN6O6U.js → emit-result-cmd-5P7ZFWMZ.js} +8 -8
- package/dist/{exec-client-NPYNUAF3.js → exec-client-2UX6NHAO.js} +3 -3
- package/dist/{guest-init-JWNNAH2H.js → guest-init-VHQNFCFS.js} +3 -3
- package/dist/{hook-fast-XBOZ3N6L.js → hook-fast-OCHVQZTU.js} +1 -1
- package/dist/{host-key-KDYZ5ECC.js → host-key-YMLXY6QB.js} +1 -1
- package/dist/{import-capture-cmd-T4556ELW.js → import-capture-cmd-2QFLZQFY.js} +3 -3
- package/dist/{import-ruler-cmd-SG3UVGI7.js → import-ruler-cmd-BD22GUJS.js} +1 -1
- package/dist/index.js +3 -3
- package/dist/{init-R2FJ5KNS.js → init-CY4IMZE4.js} +22 -22
- package/dist/{init-KDK5QLQZ.js → init-TQUN5RF7.js} +20 -20
- package/dist/{init-cmd-BYZYAJ5P.js → init-cmd-F4TZXQJH.js} +11 -11
- package/dist/{install-FHTVJZS6.js → install-C33LT5KQ.js} +3 -3
- package/dist/{install-cmd-DCF7TVXD.js → install-cmd-5HYMXLEW.js} +2 -1
- package/dist/{loop-AG3PLXPO.js → loop-NZP5FAC3.js} +30 -29
- package/dist/{machine-LV6WBRRK.js → machine-RUSNVLKO.js} +19 -19
- package/dist/{mcp-install-cmd-RLK4SO3N.js → mcp-install-cmd-4AQMSIGY.js} +1 -1
- package/dist/{mcp-serve-cmd-N6UD2KBX.js → mcp-serve-cmd-3KVYEUXG.js} +3 -3
- package/dist/{real-deps-SU24ZA2K.js → real-deps-TK6JMQSW.js} +3 -2
- package/dist/{session-sender-Q5HAMOL2.js → session-sender-EECVKXTC.js} +7 -7
- package/dist/{starter-pack-MUXMAU4S.js → starter-pack-VNWPYP5U.js} +3 -3
- package/dist/{status-HH4OSOHR.js → status-KCONQLOD.js} +31 -25
- package/dist/{sync-cmd-CAEPJR7B.js → sync-cmd-R54ZBHXX.js} +6 -6
- package/dist/{watch-LAAZFBHH.js → watch-YTFNBO3S.js} +6 -6
- package/dist/{work-claim-cmd-ARIYZARE.js → work-claim-cmd-HRPJ4VUF.js} +10 -10
- package/dist/{work-cmd-B3FOXZAL.js → work-cmd-W4GQUUBC.js} +7 -7
- package/dist/{work-comment-cmd-O5WGRI6K.js → work-comment-cmd-DDZ4SZ35.js} +7 -7
- package/dist/{work-open-pr-cmd-M6CQW7KW.js → work-open-pr-cmd-GXULDTSC.js} +8 -8
- package/dist/{work-pr-cmd-C4YEGKD6.js → work-pr-cmd-T6SU4TYN.js} +7 -7
- package/package.json +2 -2
- package/skill-pack/maintained/amend/SKILL.md +22 -6
- package/skill-pack/maintained/outerlayer/SKILL.md +12 -2
- package/skill-pack/maintained/outerlayer/references/open-pull-request.md +29 -0
- package/skill-pack/template/build/SKILL.md +3 -2
- package/skill-pack/template/build/references/release.md +11 -2
|
@@ -1,29 +1,29 @@
|
|
|
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-3J476JZC.js';
|
|
4
4
|
import './chunk-F47JBIAW.js';
|
|
5
5
|
import './chunk-BKO6JEZI.js';
|
|
6
|
-
import './chunk-
|
|
7
|
-
import './chunk-
|
|
6
|
+
import './chunk-R5SPFO6F.js';
|
|
7
|
+
import './chunk-WMPO3SKK.js';
|
|
8
8
|
import './chunk-BFESLKPP.js';
|
|
9
|
-
import './chunk-
|
|
9
|
+
import './chunk-EWBM2USM.js';
|
|
10
10
|
import './chunk-ZYHKJKSU.js';
|
|
11
|
-
import './chunk-
|
|
11
|
+
import './chunk-HN2JBGSI.js';
|
|
12
12
|
import './chunk-USO2DKBD.js';
|
|
13
13
|
import './chunk-N6LURUEF.js';
|
|
14
14
|
import { C, NO_COLOR_FLAG, warnDeprecated, stripNoColor, API_KEY_FLAG_DEPRECATION } from './chunk-YRYMNBGQ.js';
|
|
15
15
|
import { parseTrackerNumber, trackerNumberError } from './chunk-WZBHBH3J.js';
|
|
16
16
|
import { settingsPath, readSettings, SettingsParseError, listHookCandidates, wrapHooks, writeSettings, unwrapHooks, REGISTERED_EVENTS, cliCommand, removeHooks, removeStatusline, cliBinResolvable, mergeHooks, repointWrappedHooks, AUTO_WRAP_EVENTS, mergeStatusline } from './chunk-5QRP3MVS.js';
|
|
17
|
-
import { pinExists } from './chunk-
|
|
18
|
-
import './chunk-
|
|
19
|
-
import './chunk-
|
|
20
|
-
import './chunk-
|
|
17
|
+
import { pinExists } from './chunk-ZJ3WRVRG.js';
|
|
18
|
+
import './chunk-CMFCCIQN.js';
|
|
19
|
+
import './chunk-YO4PSLVB.js';
|
|
20
|
+
import './chunk-PLMTLGYH.js';
|
|
21
21
|
import './chunk-YNJEOGDL.js';
|
|
22
22
|
import './chunk-EABW6AJQ.js';
|
|
23
23
|
import { resolveVersion } from './chunk-RA3O54FC.js';
|
|
24
|
-
import './chunk-
|
|
24
|
+
import './chunk-V7NIVOFD.js';
|
|
25
25
|
import './chunk-ZM2IMMYN.js';
|
|
26
|
-
import { hookFiredMarkerPath, installedCliDistDir } from './chunk-
|
|
26
|
+
import { hookFiredMarkerPath, installedCliDistDir } from './chunk-KI7VPNKC.js';
|
|
27
27
|
import { managedHookScripts, removeJournalHooks, installPreCommitGuardHook, removePreCommitGuardHook } from './chunk-XCCLFVXM.js';
|
|
28
28
|
import './chunk-BJ3KTMDH.js';
|
|
29
29
|
import { homeFromEnv } from './chunk-VNVZDWO3.js';
|
|
@@ -3641,7 +3641,7 @@ function warnIfApiKeyFlag(opts) {
|
|
|
3641
3641
|
if (opts.apiKey !== void 0) warnDeprecated(API_KEY_FLAG_DEPRECATION);
|
|
3642
3642
|
}
|
|
3643
3643
|
async function installStarterPackInRepo() {
|
|
3644
|
-
const { installStarterPack, formatStarterPackOutput } = await import('./starter-pack-
|
|
3644
|
+
const { installStarterPack, formatStarterPackOutput } = await import('./starter-pack-VNWPYP5U.js');
|
|
3645
3645
|
const cwd = process.cwd();
|
|
3646
3646
|
let repoRoot = cwd;
|
|
3647
3647
|
try {
|
|
@@ -3801,8 +3801,8 @@ ${starter.output}`),
|
|
|
3801
3801
|
}
|
|
3802
3802
|
}
|
|
3803
3803
|
async function realConnectDepsForCwd() {
|
|
3804
|
-
const { realConnectDeps } = await import('./connect-cmd-
|
|
3805
|
-
const { resolveRepoIdentity } = await import('./dist-
|
|
3804
|
+
const { realConnectDeps } = await import('./connect-cmd-NV7WVBY7.js');
|
|
3805
|
+
const { resolveRepoIdentity } = await import('./dist-2LNAXGPZ.js');
|
|
3806
3806
|
return {
|
|
3807
3807
|
...realConnectDeps(),
|
|
3808
3808
|
home: homeFromEnv(),
|
|
@@ -3824,7 +3824,7 @@ function buildProgram(argv = process.argv) {
|
|
|
3824
3824
|
).action(async (opts) => {
|
|
3825
3825
|
let starterTemplate;
|
|
3826
3826
|
if (opts.template !== void 0) {
|
|
3827
|
-
const { assertKnownTemplate, StarterPackError } = await import('./starter-pack-
|
|
3827
|
+
const { assertKnownTemplate, StarterPackError } = await import('./starter-pack-VNWPYP5U.js');
|
|
3828
3828
|
try {
|
|
3829
3829
|
assertKnownTemplate(opts.template);
|
|
3830
3830
|
} catch (err) {
|
|
@@ -3855,7 +3855,7 @@ function buildProgram(argv = process.argv) {
|
|
|
3855
3855
|
else process.stdout.write(outcome.text);
|
|
3856
3856
|
return;
|
|
3857
3857
|
}
|
|
3858
|
-
const { runInitCommand } = await import('./init-cmd-
|
|
3858
|
+
const { runInitCommand } = await import('./init-cmd-F4TZXQJH.js');
|
|
3859
3859
|
const code = await runInitCommand(
|
|
3860
3860
|
{ json: opts.json, factory: opts.factory },
|
|
3861
3861
|
{
|
|
@@ -3867,7 +3867,7 @@ function buildProgram(argv = process.argv) {
|
|
|
3867
3867
|
return { ok, text, detail };
|
|
3868
3868
|
},
|
|
3869
3869
|
runAgentSetup: async () => {
|
|
3870
|
-
const { runAgentSetup } = await import('./agent-setup-
|
|
3870
|
+
const { runAgentSetup } = await import('./agent-setup-C5X4356W.js');
|
|
3871
3871
|
return runAgentSetup({ cwd: process.cwd() });
|
|
3872
3872
|
},
|
|
3873
3873
|
runDoctorChecks: gatherDoctorChecks
|
|
@@ -3879,7 +3879,7 @@ function buildProgram(argv = process.argv) {
|
|
|
3879
3879
|
"after",
|
|
3880
3880
|
"\nRun it in a repository, after `outerlayer login`. With a login, connect lists\nthe factories you can use and takes the first rule that leaves one answer:\n 1. --factory <org>/<factory>, or a factory id\n 2. the factory this repository is already connected to\n 3. the one factory this repository is linked to\n 4. the one factory you can use\n 5. on a terminal, ask; with no terminal, exit 1 and list each --factory value\n\nIt says what it chose and why. The choice is saved in this repository's git\ndirectory (outerlayer/connection.json), shared by every worktree of the\nclone and never committed. A factory key already belongs to one factory, so\nconnect changes nothing for it. Connect never links a repository.\n\nAfter it saves the choice, connect checks that this repository is linked to\nthe factory. If it is not, connect says so, prints the factory's Work page\nlink where you link it, and exits 2. The choice is saved either way. Run\nconnect again once the repository is linked. With --json, the document has\nlinked (true, false, or null when it could not be checked) and, when false,\nlinkUrl.\n"
|
|
3881
3881
|
).action(async (opts) => {
|
|
3882
|
-
const { runConnectCommand } = await import('./connect-cmd-
|
|
3882
|
+
const { runConnectCommand } = await import('./connect-cmd-NV7WVBY7.js');
|
|
3883
3883
|
const code = await runConnectCommand({ factory: opts.factory, json: opts.json }, await realConnectDepsForCwd(), {
|
|
3884
3884
|
stdout: process.stdout,
|
|
3885
3885
|
stderr: process.stderr
|
|
@@ -3927,7 +3927,7 @@ function buildProgram(argv = process.argv) {
|
|
|
3927
3927
|
"\nIncremental: only sessions newer than the last checkpoint ship. The tier\nis applied on this machine before anything leaves it; `--dry-run` prints\nexactly what would. The hook-triggered background sync runs `--quiet`.\nExit 2 means the server rejected at least one session.\n"
|
|
3928
3928
|
).action(async (opts) => {
|
|
3929
3929
|
warnIfApiKeyFlag(opts);
|
|
3930
|
-
const { runSync, SyncConfigError, SyncTransportError } = await import('./sync-cmd-
|
|
3930
|
+
const { runSync, SyncConfigError, SyncTransportError } = await import('./sync-cmd-R54ZBHXX.js');
|
|
3931
3931
|
try {
|
|
3932
3932
|
const result = await runSync({
|
|
3933
3933
|
url: opts.url,
|
|
@@ -3956,7 +3956,7 @@ function buildProgram(argv = process.argv) {
|
|
|
3956
3956
|
if (invokedCommandToken(argv) === "watch") {
|
|
3957
3957
|
warnDeprecated("`outerlayer watch` is now `outerlayer daemon`; the old name will be removed in a future release.");
|
|
3958
3958
|
}
|
|
3959
|
-
const { runWatch } = await import('./watch-
|
|
3959
|
+
const { runWatch } = await import('./watch-YTFNBO3S.js');
|
|
3960
3960
|
await runWatch({ once: opts.once });
|
|
3961
3961
|
});
|
|
3962
3962
|
program2.command("hook <event>", { hidden: true }).description("capture-hook fast path, installed by `init`").action(() => {
|
|
@@ -3985,7 +3985,7 @@ function buildProgram(argv = process.argv) {
|
|
|
3985
3985
|
await startRelay({ port, socketPath: opts.socket, forwards });
|
|
3986
3986
|
});
|
|
3987
3987
|
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) => {
|
|
3988
|
-
const { runVmExec } = await import('./exec-client-
|
|
3988
|
+
const { runVmExec } = await import('./exec-client-2UX6NHAO.js');
|
|
3989
3989
|
const env = {};
|
|
3990
3990
|
for (const entry of opts.env) {
|
|
3991
3991
|
const eq = entry.indexOf("=");
|
|
@@ -4010,7 +4010,7 @@ function buildProgram(argv = process.argv) {
|
|
|
4010
4010
|
}
|
|
4011
4011
|
});
|
|
4012
4012
|
program2.command("session-sender", { hidden: true }).description("stream a runner build's sessions to its work item while the build runs").action(async () => {
|
|
4013
|
-
const { runSessionSender } = await import('./session-sender-
|
|
4013
|
+
const { runSessionSender } = await import('./session-sender-EECVKXTC.js');
|
|
4014
4014
|
try {
|
|
4015
4015
|
await runSessionSender();
|
|
4016
4016
|
} catch (err) {
|
|
@@ -4018,7 +4018,7 @@ function buildProgram(argv = process.argv) {
|
|
|
4018
4018
|
}
|
|
4019
4019
|
});
|
|
4020
4020
|
program2.command("vm-init", { hidden: true }).description("lay out a microVM build's guest; the guest helper runs it").action(async () => {
|
|
4021
|
-
const { realGuestHost, runGuestInit } = await import('./guest-init-
|
|
4021
|
+
const { realGuestHost, runGuestInit } = await import('./guest-init-VHQNFCFS.js');
|
|
4022
4022
|
const { readFileSync: readFileSync3 } = await import('fs');
|
|
4023
4023
|
try {
|
|
4024
4024
|
runGuestInit(realGuestHost(), readFileSync3("/proc/cmdline", "utf8"));
|
|
@@ -4045,7 +4045,7 @@ async function runCli(processArgv) {
|
|
|
4045
4045
|
await buildProgram(argv).parseAsync(argv);
|
|
4046
4046
|
}
|
|
4047
4047
|
async function compileContext(opts) {
|
|
4048
|
-
const { runEmit, EmitError } = await import('./emit-cmd-
|
|
4048
|
+
const { runEmit, EmitError } = await import('./emit-cmd-IRYNFHPM.js');
|
|
4049
4049
|
try {
|
|
4050
4050
|
const result = runEmit({ cwd: opts.dir, check: opts.check, json: opts.json });
|
|
4051
4051
|
if (result.exitCode !== 0) process.exitCode = result.exitCode;
|
|
@@ -4068,7 +4068,7 @@ function registerEmitCommands(program2) {
|
|
|
4068
4068
|
return;
|
|
4069
4069
|
}
|
|
4070
4070
|
warnIfApiKeyFlag(opts);
|
|
4071
|
-
const { runEmitResult, EmitResultError } = await import('./emit-result-cmd-
|
|
4071
|
+
const { runEmitResult, EmitResultError } = await import('./emit-result-cmd-5P7ZFWMZ.js');
|
|
4072
4072
|
try {
|
|
4073
4073
|
const result = await runEmitResult({
|
|
4074
4074
|
name,
|
|
@@ -4119,7 +4119,7 @@ locally so it never uploads. One correction can retire several duplicates.
|
|
|
4119
4119
|
`
|
|
4120
4120
|
).action(async (file, opts) => {
|
|
4121
4121
|
warnIfApiKeyFlag(opts);
|
|
4122
|
-
const { runEmitArtifact, EmitArtifactError } = await import('./emit-artifact-cmd-
|
|
4122
|
+
const { runEmitArtifact, EmitArtifactError } = await import('./emit-artifact-cmd-BZYXRBCV.js');
|
|
4123
4123
|
let pr;
|
|
4124
4124
|
if (opts.pr !== void 0) {
|
|
4125
4125
|
pr = parseTrackerNumber(opts.pr);
|
|
@@ -4154,7 +4154,7 @@ locally so it never uploads. One correction can retire several duplicates.
|
|
|
4154
4154
|
'\n outerlayer emit finding --id gate-skip --category tooling \\\n --title "The pre-push gate prints green when a step was skipped" \\\n --file scripts/git/pre-push-checks.mjs --where "build session"\n\nRecords one problem you hit in the factory: an instruction that is wrong or\nmissing (context), a flaky test, a misbehaving script (tooling), a local\nsetup trap (environment), a bug outside your own change (defect), or\nanything else. A problem in your own change is fixed, not recorded.\nA context finding needs --rule-path and --rule-relation, and --rule-quote\nunless the relation is missing.\n--item names the work item; without it, inside a recorded session, the\nitem that session was launched for is used automatically.\n'
|
|
4155
4155
|
).action(async (opts) => {
|
|
4156
4156
|
warnIfApiKeyFlag(opts);
|
|
4157
|
-
const { runEmitFinding, refuseRemovedFindingFlags, EmitFindingError } = await import('./emit-finding-cmd-
|
|
4157
|
+
const { runEmitFinding, refuseRemovedFindingFlags, EmitFindingError } = await import('./emit-finding-cmd-VTSYDJYZ.js');
|
|
4158
4158
|
try {
|
|
4159
4159
|
refuseRemovedFindingFlags(opts);
|
|
4160
4160
|
const result = await runEmitFinding({
|
|
@@ -4193,7 +4193,7 @@ locally so it never uploads. One correction can retire several duplicates.
|
|
|
4193
4193
|
"\n outerlayer emit findings review.json --item 412\n\nRecords a whole batch at once \u2014 a FindingBatch JSON file (schemaVersion,\noptional headSha / contextSourceSha, and 1-500 findings), validated against\nthe same contract `emit finding` uses before anything is sent. Re-emitting\nan id already on the item replaces that row rather than adding a second one.\n--item names the work item; without it, inside a recorded session, the item\nthat session was launched for is used automatically.\n"
|
|
4194
4194
|
).action(async (file, opts) => {
|
|
4195
4195
|
warnIfApiKeyFlag(opts);
|
|
4196
|
-
const { runEmitFindings, EmitFindingError } = await import('./emit-finding-cmd-
|
|
4196
|
+
const { runEmitFindings, EmitFindingError } = await import('./emit-finding-cmd-VTSYDJYZ.js');
|
|
4197
4197
|
try {
|
|
4198
4198
|
const result = await runEmitFindings({
|
|
4199
4199
|
file,
|
|
@@ -4217,7 +4217,7 @@ locally so it never uploads. One correction can retire several duplicates.
|
|
|
4217
4217
|
'\n outerlayer emit criteria criteria.json --item 412\n\nRecords the item\'s acceptance criteria as one list. The file is JSON:\n { "criteria": [ { "id": "AC-1", "text": "Given ...", "proof": null },\n { "id": "login.redirect", "text": "...", "proof": "screenshot" } ] }\nAn id is 1-64 characters of A-Z a-z 0-9 . _ : - and is the id evidence is bound to with\n`emit artifact --for`. proof is video, screenshot, report, log, test, file or null (any bound\nartifact proves it). The list holds 1 to 200 criteria, each text at most 2,000\ncharacters, and no id twice. The list is validated before anything is sent.\nOnce an item has a list, only a person can replace it: run the command outside an\nagent session, with your own login. A key bound to no member cannot replace it either.\n--item names the work item; without it, inside a recorded session, the item that\nsession was launched for is used automatically.\n'
|
|
4218
4218
|
).action(async (file, opts) => {
|
|
4219
4219
|
warnIfApiKeyFlag(opts);
|
|
4220
|
-
const { runEmitCriteria, EmitCriteriaError } = await import('./emit-criteria-cmd-
|
|
4220
|
+
const { runEmitCriteria, EmitCriteriaError } = await import('./emit-criteria-cmd-PSZYZ32B.js');
|
|
4221
4221
|
try {
|
|
4222
4222
|
const result = await runEmitCriteria({
|
|
4223
4223
|
file,
|
|
@@ -4244,7 +4244,7 @@ function registerWorkCommands(program2) {
|
|
|
4244
4244
|
"\n outerlayer work build --issue 42 # a host builds it\n outerlayer work build --item 7 # retry an item already on Work\n outerlayer work build --issue 42 --local # you build it\n outerlayer work build --issue ENG-123 --tracker linear # a Linear issue\n\nWithout --local, records a build request: a host takes the item when it\nhas a free slot. It never links the calling session and never takes a\nlease, even run from inside one.\n\nWith --local, puts the item on Work with no build request, so no host\ntakes it, and prints the line that starts your session on it. That\nsession links itself and holds the item's lease while it works.\n"
|
|
4245
4245
|
).action(async (opts) => {
|
|
4246
4246
|
warnIfApiKeyFlag(opts);
|
|
4247
|
-
const { runWorkBuild, WorkCommandError } = await import('./work-cmd-
|
|
4247
|
+
const { runWorkBuild, WorkCommandError } = await import('./work-cmd-W4GQUUBC.js');
|
|
4248
4248
|
try {
|
|
4249
4249
|
await runWorkBuild(opts);
|
|
4250
4250
|
} catch (err) {
|
|
@@ -4260,7 +4260,7 @@ function registerWorkCommands(program2) {
|
|
|
4260
4260
|
"\n outerlayer work link-session 42\n\nNames an item that already exists on the calling session \u2014 it never\ncreates one. Create one with `outerlayer work build --local`. Linking\nthe same session to the same item twice is a no-op. Also takes or\nrenews that session's own 20-minute lease, unless --no-lease or\n--ended is given, or another worker already holds a live one.\n"
|
|
4261
4261
|
).action(async (number, opts) => {
|
|
4262
4262
|
warnIfApiKeyFlag(opts);
|
|
4263
|
-
const { runWorkLinkSession, WorkCommandError } = await import('./work-cmd-
|
|
4263
|
+
const { runWorkLinkSession, WorkCommandError } = await import('./work-cmd-W4GQUUBC.js');
|
|
4264
4264
|
try {
|
|
4265
4265
|
await runWorkLinkSession({ ...opts, number, noLease: opts.lease === false, logFailures: opts.logFailures === true });
|
|
4266
4266
|
} catch (err) {
|
|
@@ -4285,8 +4285,8 @@ most one action flag may be given.
|
|
|
4285
4285
|
`
|
|
4286
4286
|
).action(async (opts) => {
|
|
4287
4287
|
warnIfApiKeyFlag(opts);
|
|
4288
|
-
const { runWorkComment, WorkCommentCommandError } = await import('./work-comment-cmd-
|
|
4289
|
-
const { WorkCommandError } = await import('./work-cmd-
|
|
4288
|
+
const { runWorkComment, WorkCommentCommandError } = await import('./work-comment-cmd-DDZ4SZ35.js');
|
|
4289
|
+
const { WorkCommandError } = await import('./work-cmd-W4GQUUBC.js');
|
|
4290
4290
|
try {
|
|
4291
4291
|
await runWorkComment(opts);
|
|
4292
4292
|
} catch (err) {
|
|
@@ -4302,8 +4302,8 @@ most one action flag may be given.
|
|
|
4302
4302
|
"\n outerlayer work threads --item 7\n\nPrints the item's general thread, then one thread per acceptance\ncriterion that carries proof or a comment, each with who is waiting\non whom next.\n"
|
|
4303
4303
|
).action(async (opts) => {
|
|
4304
4304
|
warnIfApiKeyFlag(opts);
|
|
4305
|
-
const { runWorkThreads, WorkCommentCommandError } = await import('./work-comment-cmd-
|
|
4306
|
-
const { WorkCommandError } = await import('./work-cmd-
|
|
4305
|
+
const { runWorkThreads, WorkCommentCommandError } = await import('./work-comment-cmd-DDZ4SZ35.js');
|
|
4306
|
+
const { WorkCommandError } = await import('./work-cmd-W4GQUUBC.js');
|
|
4307
4307
|
try {
|
|
4308
4308
|
await runWorkThreads(opts);
|
|
4309
4309
|
} catch (err) {
|
|
@@ -4325,7 +4325,7 @@ live addition remains on it.
|
|
|
4325
4325
|
`
|
|
4326
4326
|
).action(async (opts) => {
|
|
4327
4327
|
warnIfApiKeyFlag(opts);
|
|
4328
|
-
const { runWorkRemove, WorkCommandError } = await import('./work-cmd-
|
|
4328
|
+
const { runWorkRemove, WorkCommandError } = await import('./work-cmd-W4GQUUBC.js');
|
|
4329
4329
|
try {
|
|
4330
4330
|
await runWorkRemove(opts);
|
|
4331
4331
|
} catch (err) {
|
|
@@ -4338,7 +4338,7 @@ live addition remains on it.
|
|
|
4338
4338
|
});
|
|
4339
4339
|
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").option("--repo <owner/name>", "repository (default: the current 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) => {
|
|
4340
4340
|
warnIfApiKeyFlag(opts);
|
|
4341
|
-
const { runWorkStatus, WorkCommandError } = await import('./work-cmd-
|
|
4341
|
+
const { runWorkStatus, WorkCommandError } = await import('./work-cmd-W4GQUUBC.js');
|
|
4342
4342
|
try {
|
|
4343
4343
|
await runWorkStatus(opts);
|
|
4344
4344
|
} catch (err) {
|
|
@@ -4351,7 +4351,7 @@ live addition remains on it.
|
|
|
4351
4351
|
});
|
|
4352
4352
|
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 with an unused build request and 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) => {
|
|
4353
4353
|
warnIfApiKeyFlag(opts);
|
|
4354
|
-
const { runWorkList, WorkCommandError } = await import('./work-cmd-
|
|
4354
|
+
const { runWorkList, WorkCommandError } = await import('./work-cmd-W4GQUUBC.js');
|
|
4355
4355
|
try {
|
|
4356
4356
|
await runWorkList(opts);
|
|
4357
4357
|
} catch (err) {
|
|
@@ -4362,12 +4362,12 @@ live addition remains on it.
|
|
|
4362
4362
|
throw err;
|
|
4363
4363
|
}
|
|
4364
4364
|
});
|
|
4365
|
-
workCmd.command("claim").description("Claim a work item under this
|
|
4365
|
+
workCmd.command("claim").description("Claim a work item under a lease this API key holds before working on it").option("--item <number>", "the item's number inside this factory").option("--issue <number>", "issue number (default: named by --item instead)").option("--repo <owner/name>", "repository (default: the current checkout's remote)").requiredOption("--kind <implement|amend>", "what this host is doing with the item").option("--host <name>", "the claiming host (default: this machine's hostname)").option("--seconds <n>", "lease length in seconds, clamped to 900 (default: 900)").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)").addHelpText(
|
|
4366
4366
|
"after",
|
|
4367
|
-
"\n outerlayer work claim --item 42 --kind implement\n\nRecords a lease
|
|
4367
|
+
"\n outerlayer work claim --item 42 --kind implement\n\nRecords a lease held by the API key that sends it. A live lease held\nby a different key is refused; claiming again with the same key extends\nit. --host is a label only.\n"
|
|
4368
4368
|
).action(async (opts) => {
|
|
4369
4369
|
warnIfApiKeyFlag(opts);
|
|
4370
|
-
const { runWorkClaim, WorkCommandError } = await import('./work-claim-cmd-
|
|
4370
|
+
const { runWorkClaim, WorkCommandError } = await import('./work-claim-cmd-HRPJ4VUF.js');
|
|
4371
4371
|
try {
|
|
4372
4372
|
await runWorkClaim(opts);
|
|
4373
4373
|
} catch (err) {
|
|
@@ -4378,12 +4378,12 @@ live addition remains on it.
|
|
|
4378
4378
|
throw err;
|
|
4379
4379
|
}
|
|
4380
4380
|
});
|
|
4381
|
-
workCmd.command("renew").description("Extend this
|
|
4381
|
+
workCmd.command("renew").description("Extend the lease this API key holds on a work item").option("--item <number>", "the item's number inside this factory").option("--issue <number>", "issue number (default: named by --item instead)").option("--repo <owner/name>", "repository (default: the current checkout's remote)").option("--host <name>", "the claiming host (default: this machine's hostname)").option("--seconds <n>", "lease length in seconds, clamped to 900 (default: 900)").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)").addHelpText(
|
|
4382
4382
|
"after",
|
|
4383
|
-
"\n outerlayer work renew --item 42\n\nExtends this
|
|
4383
|
+
"\n outerlayer work renew --item 42\n\nExtends the live lease this API key holds. Refused with a 410 if the\nlease has expired, or a 403 if a different key holds it.\n"
|
|
4384
4384
|
).action(async (opts) => {
|
|
4385
4385
|
warnIfApiKeyFlag(opts);
|
|
4386
|
-
const { runWorkRenew, WorkCommandError } = await import('./work-claim-cmd-
|
|
4386
|
+
const { runWorkRenew, WorkCommandError } = await import('./work-claim-cmd-HRPJ4VUF.js');
|
|
4387
4387
|
try {
|
|
4388
4388
|
await runWorkRenew(opts);
|
|
4389
4389
|
} catch (err) {
|
|
@@ -4394,15 +4394,15 @@ live addition remains on it.
|
|
|
4394
4394
|
throw err;
|
|
4395
4395
|
}
|
|
4396
4396
|
});
|
|
4397
|
-
workCmd.command("release").description("Release this
|
|
4397
|
+
workCmd.command("release").description("Release the lease this API key holds on a work item").option("--item <number>", "the item's number inside this factory").option("--issue <number>", "issue number (default: named by --item instead)").option("--repo <owner/name>", "repository (default: the current checkout's remote)").option("--host <name>", "the claiming host (default: this machine's hostname)").option(
|
|
4398
4398
|
"--outcome <ok|incomplete|failed|timed_out|idle|lease_lost|interrupted|stopped>",
|
|
4399
4399
|
"how the attempt ended (default: none)"
|
|
4400
4400
|
).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)").addHelpText(
|
|
4401
4401
|
"after",
|
|
4402
|
-
"\n outerlayer work release --item 42 --outcome ok\n\nMarks this
|
|
4402
|
+
"\n outerlayer work release --item 42 --outcome ok\n\nMarks the lease this API key holds released, optionally with an\noutcome. A lease held by a different key is refused. Releasing an\nalready-released lease is a no-op that returns the recorded release\ntime and outcome.\n"
|
|
4403
4403
|
).action(async (opts) => {
|
|
4404
4404
|
warnIfApiKeyFlag(opts);
|
|
4405
|
-
const { runWorkRelease, WorkCommandError } = await import('./work-claim-cmd-
|
|
4405
|
+
const { runWorkRelease, WorkCommandError } = await import('./work-claim-cmd-HRPJ4VUF.js');
|
|
4406
4406
|
try {
|
|
4407
4407
|
await runWorkRelease(opts);
|
|
4408
4408
|
} catch (err) {
|
|
@@ -4418,7 +4418,7 @@ live addition remains on it.
|
|
|
4418
4418
|
"\n outerlayer work pr 481\n\nRun inside a session already on a work item. Records that pull\nrequest 481 in the checkout's repository belongs to that item \u2014 the\nsame fact a `pr-link` in the session's own transcript records on\nsync. Idempotent: declaring the same pull request twice is a no-op.\n"
|
|
4419
4419
|
).action(async (number, opts) => {
|
|
4420
4420
|
warnIfApiKeyFlag(opts);
|
|
4421
|
-
const { runWorkPr, WorkPrCommandError } = await import('./work-pr-cmd-
|
|
4421
|
+
const { runWorkPr, WorkPrCommandError } = await import('./work-pr-cmd-T6SU4TYN.js');
|
|
4422
4422
|
try {
|
|
4423
4423
|
await runWorkPr({ ...opts, number });
|
|
4424
4424
|
} catch (err) {
|
|
@@ -4434,8 +4434,8 @@ live addition remains on it.
|
|
|
4434
4434
|
'\n outerlayer work open-pr --title "Add the thing" --body-file pr.md\n\nIn a host build, which holds an item key, the gateway opens the pull\nrequest as the factory\'s GitHub App, from the branch the claim named,\nor edits the one already open on that branch. No gh command runs.\nIn your own session it runs `gh pr create` (or `gh pr edit`) under your\nlogin, then declares the pull request on the item, as `work pr` does.\nRun it again after a change to the title or description.\n'
|
|
4435
4435
|
).action(async (opts) => {
|
|
4436
4436
|
warnIfApiKeyFlag(opts);
|
|
4437
|
-
const { runWorkOpenPr, WorkOpenPrCommandError } = await import('./work-open-pr-cmd-
|
|
4438
|
-
const { WorkCommandError } = await import('./work-cmd-
|
|
4437
|
+
const { runWorkOpenPr, WorkOpenPrCommandError } = await import('./work-open-pr-cmd-GXULDTSC.js');
|
|
4438
|
+
const { WorkCommandError } = await import('./work-cmd-W4GQUUBC.js');
|
|
4439
4439
|
try {
|
|
4440
4440
|
await runWorkOpenPr(opts);
|
|
4441
4441
|
} catch (err) {
|
|
@@ -4451,12 +4451,12 @@ function registerRunnerCommands(program2) {
|
|
|
4451
4451
|
const runnerCmd = program2.command("runner").description("Take work from the implement and amend queues on this machine");
|
|
4452
4452
|
const configOption = "the cloud config file to run against (default: ~/.outerlayer/config.json)";
|
|
4453
4453
|
runnerCmd.command("start").description("Run the loop: claim work, run it, report, clean up, repeat").option("--config <path>", configOption).action(async (opts) => {
|
|
4454
|
-
const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-
|
|
4455
|
-
const { start, RunnerStartError } = await import('./loop-
|
|
4454
|
+
const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-OOBPCY7Q.js');
|
|
4455
|
+
const { start, RunnerStartError } = await import('./loop-NZP5FAC3.js');
|
|
4456
4456
|
const { RunnerAlreadyRunningError } = await import('./pidfile-UZRH774M.js');
|
|
4457
4457
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
4458
4458
|
try {
|
|
4459
|
-
const { realUpdateDeps } = await import('./real-deps-
|
|
4459
|
+
const { realUpdateDeps } = await import('./real-deps-TK6JMQSW.js');
|
|
4460
4460
|
await start(configPath, { update: realUpdateDeps(), fetchImpl: fetch });
|
|
4461
4461
|
} catch (err) {
|
|
4462
4462
|
if (err instanceof RunnerConfigError || err instanceof RunnerAlreadyRunningError || err instanceof RunnerStartError) {
|
|
@@ -4467,8 +4467,8 @@ function registerRunnerCommands(program2) {
|
|
|
4467
4467
|
}
|
|
4468
4468
|
});
|
|
4469
4469
|
runnerCmd.command("check").description("Validate the config, the hooks and the key, and print the effective settings").option("--config <path>", configOption).action(async (opts) => {
|
|
4470
|
-
const { defaultRunnerConfigPath } = await import('./config-
|
|
4471
|
-
const { runRunnerCheck } = await import('./check-
|
|
4470
|
+
const { defaultRunnerConfigPath } = await import('./config-OOBPCY7Q.js');
|
|
4471
|
+
const { runRunnerCheck } = await import('./check-HQHFAOXW.js');
|
|
4472
4472
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
4473
4473
|
const result = await runRunnerCheck(configPath);
|
|
4474
4474
|
if (!result.ok) {
|
|
@@ -4483,9 +4483,9 @@ function registerRunnerCommands(program2) {
|
|
|
4483
4483
|
process.stdout.write(`${result.lines.join("\n")}
|
|
4484
4484
|
`);
|
|
4485
4485
|
});
|
|
4486
|
-
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").addOption(new Option("--unit-name <name>", "with --service, the unit's name").hideHelp()).action(async (opts) => {
|
|
4487
|
-
const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-
|
|
4488
|
-
const { runRunnerInstall, RunnerInstallError, launcherSummary } = await import('./install-cmd-
|
|
4486
|
+
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").addOption(new Option("--unit-name <name>", "with --service, the unit's name").hideHelp()).action(async (opts) => {
|
|
4487
|
+
const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-OOBPCY7Q.js');
|
|
4488
|
+
const { runRunnerInstall, RunnerInstallError, launcherSummary, restartNote } = await import('./install-cmd-5HYMXLEW.js');
|
|
4489
4489
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
4490
4490
|
if (opts.service !== true) {
|
|
4491
4491
|
for (const flag of ["print", "user", "unitName"]) {
|
|
@@ -4497,12 +4497,13 @@ function registerRunnerCommands(program2) {
|
|
|
4497
4497
|
}
|
|
4498
4498
|
try {
|
|
4499
4499
|
if (opts.service === true) {
|
|
4500
|
-
const { installServiceCommand } = await import('./command-
|
|
4500
|
+
const { installServiceCommand } = await import('./command-LIHTWJHQ.js');
|
|
4501
4501
|
const result2 = await installServiceCommand({
|
|
4502
4502
|
configPath,
|
|
4503
4503
|
print: opts.print,
|
|
4504
4504
|
user: opts.user,
|
|
4505
4505
|
replace: opts.replace,
|
|
4506
|
+
allowDowngrade: opts.allowDowngrade,
|
|
4506
4507
|
unitName: opts.unitName,
|
|
4507
4508
|
entryPath: process.argv[1] ?? "",
|
|
4508
4509
|
nodePath: process.execPath,
|
|
@@ -4517,8 +4518,19 @@ function registerRunnerCommands(program2) {
|
|
|
4517
4518
|
} else fail(result2.lines.length > 0 ? result2.lines.join("\n ") : "the service was not set up");
|
|
4518
4519
|
return;
|
|
4519
4520
|
}
|
|
4520
|
-
const result = runRunnerInstall({
|
|
4521
|
+
const result = runRunnerInstall({
|
|
4522
|
+
configPath,
|
|
4523
|
+
entryPath: process.argv[1] ?? "",
|
|
4524
|
+
nodePath: process.execPath,
|
|
4525
|
+
home: homeFromEnv(),
|
|
4526
|
+
PATH: process.env.PATH,
|
|
4527
|
+
replace: opts.replace,
|
|
4528
|
+
allowDowngrade: opts.allowDowngrade
|
|
4529
|
+
});
|
|
4521
4530
|
process.stdout.write(`${C.green}\u2713${C.reset} installed ${result.version} for the runner; \`current\` names it
|
|
4531
|
+
`);
|
|
4532
|
+
const restart = restartNote(result);
|
|
4533
|
+
if (restart !== void 0) process.stdout.write(`${C.green}\u2713${C.reset} ${restart}
|
|
4522
4534
|
`);
|
|
4523
4535
|
printLauncher(result, launcherSummary);
|
|
4524
4536
|
process.stdout.write(
|
|
@@ -4540,18 +4552,18 @@ To keep it running, run ${C.yellow}outerlayer runner install --service${C.reset}
|
|
|
4540
4552
|
fail("pass --service: `outerlayer runner uninstall --service` removes the runner's service.");
|
|
4541
4553
|
return;
|
|
4542
4554
|
}
|
|
4543
|
-
const { defaultRunnerConfigPath } = await import('./config-
|
|
4544
|
-
const { uninstallServiceCommand } = await import('./command-
|
|
4555
|
+
const { defaultRunnerConfigPath } = await import('./config-OOBPCY7Q.js');
|
|
4556
|
+
const { uninstallServiceCommand } = await import('./command-LIHTWJHQ.js');
|
|
4545
4557
|
const result = await uninstallServiceCommand({ configPath: opts.config ?? defaultRunnerConfigPath(), unitName: opts.unitName, home: homeFromEnv() });
|
|
4546
4558
|
if (result.ok) for (const line of result.lines) process.stdout.write(`${C.green}\u2713${C.reset} ${line}
|
|
4547
4559
|
`);
|
|
4548
4560
|
else fail(result.lines.length > 0 ? result.lines.join("\n ") : "the service was not removed");
|
|
4549
4561
|
});
|
|
4550
4562
|
runnerCmd.command("init").description("Write a runner block that fits this machine; on macOS, offers a Linux VM").option("--config <path>", configOption).option("--vm", "on macOS, run the runner in a Linux VM (Lima), with container builds").option("--no-vm", "on macOS, skip the VM and run builds as unisolated processes").option("--allow-process-builds", "where builds cannot be isolated, run them as processes anyway").addOption(new Option("--config-stdin", "the VM-side hand-off: read the whole config as JSON on stdin").hideHelp()).addOption(new Option("--vm-cli-package <path>", "install this packed CLI tarball in the VM instead of the published version").hideHelp()).addOption(new Option("--unit-name <name>", "the service unit's name").hideHelp()).action(async (opts) => {
|
|
4551
|
-
const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-
|
|
4552
|
-
const { runRunnerInit, RunnerInitError } = await import('./init-
|
|
4553
|
-
const { detectMachine } = await import('./machine-
|
|
4554
|
-
const { chooseVm, runVmInit, VmInitError } = await import('./init-
|
|
4563
|
+
const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-OOBPCY7Q.js');
|
|
4564
|
+
const { runRunnerInit, RunnerInitError } = await import('./init-TQUN5RF7.js');
|
|
4565
|
+
const { detectMachine } = await import('./machine-RUSNVLKO.js');
|
|
4566
|
+
const { chooseVm, runVmInit, VmInitError } = await import('./init-CY4IMZE4.js');
|
|
4555
4567
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
4556
4568
|
try {
|
|
4557
4569
|
const machine = detectMachine();
|
|
@@ -4559,7 +4571,7 @@ To keep it running, run ${C.yellow}outerlayer runner install --service${C.reset}
|
|
|
4559
4571
|
const chunks = [];
|
|
4560
4572
|
for await (const chunk of process.stdin) chunks.push(Buffer.from(chunk));
|
|
4561
4573
|
const result2 = runRunnerInit(configPath, { machine, configFromStdin: Buffer.concat(chunks).toString("utf8"), requireContainer: true });
|
|
4562
|
-
const { ensureHostKey: ensureHostKey2 } = await import('./host-key-
|
|
4574
|
+
const { ensureHostKey: ensureHostKey2 } = await import('./host-key-YMLXY6QB.js');
|
|
4563
4575
|
const hostKey2 = await ensureHostKey2(configPath);
|
|
4564
4576
|
process.stdout.write(`host key ${hostKey2.fingerprint}
|
|
4565
4577
|
hooks: ${result2.hooks}
|
|
@@ -4602,7 +4614,7 @@ hooks: ${result2.hooks}
|
|
|
4602
4614
|
}
|
|
4603
4615
|
const allowProcess = opts.allowProcessBuilds === true || machine.platform === "darwin" && declinedVm;
|
|
4604
4616
|
const result = runRunnerInit(configPath, { machine, allowProcess });
|
|
4605
|
-
const { ensureHostKey } = await import('./host-key-
|
|
4617
|
+
const { ensureHostKey } = await import('./host-key-YMLXY6QB.js');
|
|
4606
4618
|
const hostKey = await ensureHostKey(configPath);
|
|
4607
4619
|
process.stdout.write(`${C.green}\u2713${C.reset} wrote a runner block into ${result.configPath}
|
|
4608
4620
|
`);
|
|
@@ -4620,23 +4632,38 @@ ${C.yellow}${result.note}${C.reset}
|
|
|
4620
4632
|
To isolate builds in containers instead, run ${C.yellow}outerlayer runner init --vm${C.reset}.
|
|
4621
4633
|
`);
|
|
4622
4634
|
}
|
|
4623
|
-
const { runRunnerInstall, RunnerInstallError, launcherSummary } = await import('./install-cmd-
|
|
4635
|
+
const { runRunnerInstall, RunnerInstallError, RunnerDowngradeError, launcherSummary } = await import('./install-cmd-5HYMXLEW.js');
|
|
4624
4636
|
let installedLayout = false;
|
|
4637
|
+
let noService = "it starts the runner from the install layout, which needs a CLI installed with npm";
|
|
4625
4638
|
try {
|
|
4626
|
-
const installed = runRunnerInstall({
|
|
4639
|
+
const installed = runRunnerInstall({
|
|
4640
|
+
configPath,
|
|
4641
|
+
entryPath: process.argv[1] ?? "",
|
|
4642
|
+
nodePath: process.execPath,
|
|
4643
|
+
home: homeFromEnv(),
|
|
4644
|
+
PATH: process.env.PATH,
|
|
4645
|
+
command: "runner install --service"
|
|
4646
|
+
});
|
|
4627
4647
|
installedLayout = true;
|
|
4628
4648
|
process.stdout.write(`${C.green}\u2713${C.reset} installed ${installed.version} for the runner, so it can update itself
|
|
4629
4649
|
`);
|
|
4630
4650
|
printLauncher(installed, launcherSummary);
|
|
4631
4651
|
} catch (installErr) {
|
|
4632
4652
|
if (!(installErr instanceof RunnerInstallError)) throw installErr;
|
|
4633
|
-
|
|
4653
|
+
if (installErr instanceof RunnerDowngradeError) {
|
|
4654
|
+
noService = "the install layout was left as it is";
|
|
4655
|
+
process.stdout.write(`
|
|
4656
|
+
${C.yellow}The install layout was left alone: ${installErr.message}${C.reset}
|
|
4657
|
+
`);
|
|
4658
|
+
} else {
|
|
4659
|
+
process.stdout.write(`
|
|
4634
4660
|
${C.yellow}The runner will not update itself: ${installErr.message}${C.reset}
|
|
4635
4661
|
`);
|
|
4662
|
+
}
|
|
4636
4663
|
}
|
|
4637
4664
|
let serviceUp = false;
|
|
4638
4665
|
if (installedLayout) {
|
|
4639
|
-
const { installServiceCommand } = await import('./command-
|
|
4666
|
+
const { installServiceCommand } = await import('./command-LIHTWJHQ.js');
|
|
4640
4667
|
const service = await installServiceCommand({
|
|
4641
4668
|
configPath,
|
|
4642
4669
|
entryPath: process.argv[1] ?? "",
|
|
@@ -4650,7 +4677,7 @@ ${C.yellow}The runner will not update itself: ${installErr.message}${C.reset}
|
|
|
4650
4677
|
` : `${C.yellow}${line}${C.reset}
|
|
4651
4678
|
`);
|
|
4652
4679
|
} else {
|
|
4653
|
-
process.stdout.write(`${C.yellow}No service was set up:
|
|
4680
|
+
process.stdout.write(`${C.yellow}No service was set up: ${noService}.${C.reset}
|
|
4654
4681
|
`);
|
|
4655
4682
|
}
|
|
4656
4683
|
process.stdout.write(
|
|
@@ -4674,12 +4701,12 @@ Next:
|
|
|
4674
4701
|
"after",
|
|
4675
4702
|
"\nFetches the head of the default branch into the runner's cache, reads its\n.devcontainer/devcontainer.json, and 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"
|
|
4676
4703
|
).action(async (opts) => {
|
|
4677
|
-
const { defaultRunnerConfigPath } = await import('./config-
|
|
4678
|
-
const { buildRepositoryImage, RecipeError } = await import('./build-
|
|
4704
|
+
const { defaultRunnerConfigPath } = await import('./config-OOBPCY7Q.js');
|
|
4705
|
+
const { buildRepositoryImage, RecipeError } = await import('./build-3FSJR5OO.js');
|
|
4679
4706
|
const { currentCliBuild } = await import('./cli-build-K56DK4DS.js');
|
|
4680
|
-
const { createDockerHost } = await import('./docker-
|
|
4681
|
-
const { builderSpec } = await import('./builder-
|
|
4682
|
-
const { loadRunnerConfig } = await import('./config-
|
|
4707
|
+
const { createDockerHost } = await import('./docker-RSALMGPL.js');
|
|
4708
|
+
const { builderSpec } = await import('./builder-QZA2Z3M3.js');
|
|
4709
|
+
const { loadRunnerConfig } = await import('./config-OOBPCY7Q.js');
|
|
4683
4710
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
4684
4711
|
const memory = (() => {
|
|
4685
4712
|
try {
|
|
@@ -4740,16 +4767,16 @@ Next:
|
|
|
4740
4767
|
}
|
|
4741
4768
|
});
|
|
4742
4769
|
runnerCmd.command("stop").description("Take no more work; wait for running jobs to finish, 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) => {
|
|
4743
|
-
const { defaultRunnerConfigPath } = await import('./config-
|
|
4744
|
-
const { requestStop } = await import('./loop-
|
|
4770
|
+
const { defaultRunnerConfigPath } = await import('./config-OOBPCY7Q.js');
|
|
4771
|
+
const { requestStop } = await import('./loop-NZP5FAC3.js');
|
|
4745
4772
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
4746
4773
|
await requestStop(configPath, Boolean(opts.now));
|
|
4747
4774
|
});
|
|
4748
4775
|
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) => {
|
|
4749
|
-
const { defaultRunnerConfigPath, loadRunnerConfig } = await import('./config-
|
|
4776
|
+
const { defaultRunnerConfigPath, loadRunnerConfig } = await import('./config-OOBPCY7Q.js');
|
|
4750
4777
|
const { jobsDir, runnerDir } = await import('./paths-OYKMVYJP.js');
|
|
4751
|
-
const { listJobFiles, runnerProcessState } = await import('./loop-
|
|
4752
|
-
const { renderStatus } = await import('./status-
|
|
4778
|
+
const { listJobFiles, runnerProcessState } = await import('./loop-NZP5FAC3.js');
|
|
4779
|
+
const { renderStatus } = await import('./status-KCONQLOD.js');
|
|
4753
4780
|
const { readHousekeepingRecord } = await import('./record-C43U4PKS.js');
|
|
4754
4781
|
const path2 = await import('path');
|
|
4755
4782
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
@@ -4767,7 +4794,7 @@ Next:
|
|
|
4767
4794
|
const service = await (async () => {
|
|
4768
4795
|
if (process.platform !== "linux" || !existsSync("/run/systemd/system")) return void 0;
|
|
4769
4796
|
const { inspectService, realInspectProbes } = await import('./inspect-XAUSB7L3.js');
|
|
4770
|
-
const { DEFAULT_UNIT_NAME } = await import('./install-
|
|
4797
|
+
const { DEFAULT_UNIT_NAME } = await import('./install-C33LT5KQ.js');
|
|
4771
4798
|
const facts = inspectService(DEFAULT_UNIT_NAME, path2.dirname(configPath), realInspectProbes());
|
|
4772
4799
|
return facts === void 0 ? void 0 : { unit: facts.unit, running: facts.mainPid !== void 0, delegated: facts.delegate };
|
|
4773
4800
|
})();
|
|
@@ -4800,8 +4827,8 @@ Next:
|
|
|
4800
4827
|
);
|
|
4801
4828
|
});
|
|
4802
4829
|
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) => {
|
|
4803
|
-
const { defaultRunnerConfigPath } = await import('./config-
|
|
4804
|
-
const { listJobFiles } = await import('./loop-
|
|
4830
|
+
const { defaultRunnerConfigPath } = await import('./config-OOBPCY7Q.js');
|
|
4831
|
+
const { listJobFiles } = await import('./loop-NZP5FAC3.js');
|
|
4805
4832
|
const { newestAttempt, logPathFor, tail, RunnerLogsError } = await import('./logs-H55NWW4H.js');
|
|
4806
4833
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
4807
4834
|
const item = parseTrackerNumber(itemArg);
|
|
@@ -5021,11 +5048,11 @@ ${C.dim}${file.path}${C.reset}
|
|
|
5021
5048
|
}
|
|
5022
5049
|
function registerMcpCommands(program2) {
|
|
5023
5050
|
const mcpCmd = program2.command("mcp").description("Configure MCP clients against the OuterLayer gateway");
|
|
5024
|
-
mcpCmd.command("install").description("Write or update the OuterLayer entry in .mcp.json").option("--transport <stdio|http>", "how the client connects (default: stdio)").option("--command <exe>", "stdio only: executable the client spawns (default: outerlayer)").option("--url <url>", "gateway MCP endpoint (defaults to the gateway you logged in to)").option("--name <name>", 'mcpServers key to write under (default: "outerlayer")').option("--dir <path>", "repo root to write into (default: cwd)").option("--app-id <uuid>", "self-host only: factory id sent as X-Outerlayer-App-Id").option("--json", "machine-readable JSON output").addHelpText(
|
|
5051
|
+
mcpCmd.command("install").description("Write or update the OuterLayer entry in .mcp.json or .outerlayer/mcp.json").option("--transport <stdio|http>", "how the client connects (default: stdio)").option("--command <exe>", "stdio only: executable the client spawns (default: outerlayer)").option("--url <url>", "gateway MCP endpoint (defaults to the gateway you logged in to)").option("--name <name>", 'mcpServers key to write under (default: "outerlayer")').option("--dir <path>", "repo root to write into (default: cwd)").option("--app-id <uuid>", "self-host only: factory id sent as X-Outerlayer-App-Id").option("--json", "machine-readable JSON output").addHelpText(
|
|
5025
5052
|
"after",
|
|
5026
5053
|
"\nThe API key is never a flag and never written to .mcp.json as a literal value.\n stdio (default): the client spawns `outerlayer mcp serve`, which reads the key\n from ~/.outerlayer/config.json (or OUTERLAYER_API_KEY) on every connect, so a\n rotated key is picked up without rewriting the entry.\n http: the entry carries the ${OUTERLAYER_API_KEY} placeholder, which the client\n resolves from the environment it was launched with.\n\n--command: use an absolute or ${HOME}-relative path when the CLI is not on PATH.\n--url: with stdio the endpoint resolves from OUTERLAYER_URL / the config file at\nconnect time; for self-host pass your gateway-node origin + /v1/mcp.\nSelf-host deployments also need --app-id: without a key service to resolve the\ncaller from the bearer token, the gateway answers 401 without that header.\n"
|
|
5027
5054
|
).action(async (opts) => {
|
|
5028
|
-
const { runMcpInstall, handleMcpInstallError, McpInstallError } = await import('./mcp-install-cmd-
|
|
5055
|
+
const { runMcpInstall, handleMcpInstallError, McpInstallError } = await import('./mcp-install-cmd-4AQMSIGY.js');
|
|
5029
5056
|
try {
|
|
5030
5057
|
if (opts.transport !== void 0 && opts.transport !== "stdio" && opts.transport !== "http") {
|
|
5031
5058
|
throw new McpInstallError(`--transport must be "stdio" or "http", got "${opts.transport}"`);
|
|
@@ -5047,7 +5074,7 @@ function registerMcpCommands(program2) {
|
|
|
5047
5074
|
"after",
|
|
5048
5075
|
"\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"
|
|
5049
5076
|
).action(async (opts) => {
|
|
5050
|
-
const { runMcpServe, handleMcpServeError } = await import('./mcp-serve-cmd-
|
|
5077
|
+
const { runMcpServe, handleMcpServeError } = await import('./mcp-serve-cmd-3KVYEUXG.js');
|
|
5051
5078
|
try {
|
|
5052
5079
|
await runMcpServe({ url: opts.url, appId: opts.appId });
|
|
5053
5080
|
} catch (err) {
|
|
@@ -5058,7 +5085,7 @@ function registerMcpCommands(program2) {
|
|
|
5058
5085
|
function registerImportCommands(program2) {
|
|
5059
5086
|
const importCmd = program2.command("import").description("Import an existing config format into .outerlayer/");
|
|
5060
5087
|
importCmd.command("ruler").description("Port a .ruler/ tree into the equivalent .outerlayer/ tree").option("--dir <path>", "repo root to read from (default: cwd)").option("--json", "machine-readable JSON output").addHelpText("after", "\nRuler: https://github.com/intellectronica/ruler. Mostly a rename.\n").action(async (opts) => {
|
|
5061
|
-
const { runImportRuler, ImportRulerError } = await import('./import-ruler-cmd-
|
|
5088
|
+
const { runImportRuler, ImportRulerError } = await import('./import-ruler-cmd-BD22GUJS.js');
|
|
5062
5089
|
try {
|
|
5063
5090
|
const result = runImportRuler({ cwd: opts.dir, json: opts.json });
|
|
5064
5091
|
if (result.exitCode !== 0) process.exitCode = result.exitCode;
|
|
@@ -5074,7 +5101,7 @@ function registerImportCommands(program2) {
|
|
|
5074
5101
|
"after",
|
|
5075
5102
|
"\nInstalls the four maintained skills (emitting-evidence, amend,\nreporting-findings, outerlayer) and an AGENTS.md snippet teaching agents to run\n`emit artifact`. A skill that differs from this CLI's bundle is rewritten to it, and the output says so.\n"
|
|
5076
5103
|
).action(async (opts) => {
|
|
5077
|
-
const { runImportCapture, ImportCaptureError } = await import('./import-capture-cmd-
|
|
5104
|
+
const { runImportCapture, ImportCaptureError } = await import('./import-capture-cmd-2QFLZQFY.js');
|
|
5078
5105
|
try {
|
|
5079
5106
|
runImportCapture({ cwd: opts.dir, json: opts.json });
|
|
5080
5107
|
} catch (err) {
|
|
@@ -5117,7 +5144,7 @@ function registerContextCommands(program2) {
|
|
|
5117
5144
|
await compileContext({ dir: opts.dir, check: opts.check, json: opts.json });
|
|
5118
5145
|
});
|
|
5119
5146
|
contextCmd.command("adopt <stagedDir>", { hidden: true }).description("Copy context the runner staged into this checkout (container builds)").option("--json", "machine-readable JSON output").action(async (stagedDir) => {
|
|
5120
|
-
const { runContextAdopt } = await import('./context-adopt-
|
|
5147
|
+
const { runContextAdopt } = await import('./context-adopt-PPCNSN5D.js');
|
|
5121
5148
|
const { exitCode, stdout } = runContextAdopt(stagedDir, process.cwd());
|
|
5122
5149
|
process.stdout.write(stdout);
|
|
5123
5150
|
process.exitCode = exitCode;
|
|
@@ -5126,7 +5153,7 @@ function registerContextCommands(program2) {
|
|
|
5126
5153
|
"after",
|
|
5127
5154
|
"\nThe same flow SessionStart runs automatically, exposed for a manual retry or a\nfirst check outside a session. Writes AGENTS.md, .claude/**, and .outerlayer/**.\n"
|
|
5128
5155
|
).action(async (opts) => {
|
|
5129
|
-
const { materializeContext } = await import('./context-materialize-
|
|
5156
|
+
const { materializeContext } = await import('./context-materialize-YR3JQCUF.js');
|
|
5130
5157
|
const result = await materializeContext({ cwd: process.cwd(), sessionId: `manual-${Date.now()}` });
|
|
5131
5158
|
const output = formatContextMaterializeOutput(result);
|
|
5132
5159
|
if (output.exitCode !== void 0) process.exitCode = output.exitCode;
|