@outerlayer/cli 0.32.0 → 0.33.0-next.20261021171323
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/README.md +15 -1
- package/dist/{agent-setup-E7CMDUR5.js → agent-setup-NSUX64RU.js} +10 -10
- package/dist/{artifact-link-cmd-VY6OM7S5.js → artifact-link-cmd-IGVFGHC2.js} +2 -2
- package/dist/{build-7QD3VJ6U.js → build-HU24C46Z.js} +3 -2
- package/dist/build-info.json +1 -1
- package/dist/{builder-REQJGZJP.js → builder-VFREWHZA.js} +5 -4
- package/dist/{check-COMHCLXW.js → check-3TQJDGKM.js} +29 -28
- package/dist/{chunk-HSUUTD4E.js → chunk-3H7NZPYG.js} +1 -1
- package/dist/{chunk-IWFYKNAO.js → chunk-3WW2TL7V.js} +45 -2
- package/dist/{chunk-SJZL5F3F.js → chunk-3Z3MPR55.js} +1 -51
- package/dist/{chunk-4I3ZDQFU.js → chunk-54GBOMDW.js} +2 -2
- package/dist/{chunk-G2RRBBOX.js → chunk-6C3ZVE62.js} +1 -1
- package/dist/{chunk-XKZPL3GE.js → chunk-7LP3F2QH.js} +4 -4
- package/dist/{chunk-JFLVUA43.js → chunk-AR6UB2BP.js} +3 -3
- package/dist/{chunk-Z7HAIZ6X.js → chunk-BSHUTMXV.js} +54 -5
- package/dist/{chunk-SXJVL7NS.js → chunk-BXA6JLHQ.js} +2 -2
- package/dist/{chunk-JH2AMJ4K.js → chunk-CI6PRMWZ.js} +2 -2
- package/dist/{chunk-NIS2PIS4.js → chunk-D73OLAYE.js} +3 -3
- package/dist/{emit-artifact-cmd-NCK3VCDM.js → chunk-EKMMX5A5.js} +8 -36
- package/dist/{chunk-V6IYYQU3.js → chunk-FE3RTGJN.js} +2 -2
- package/dist/{chunk-VIHQLW4L.js → chunk-G7QBSH3X.js} +9 -8
- package/dist/{chunk-XB7TRWI2.js → chunk-GI6LOIHS.js} +4 -4
- package/dist/{chunk-V36AOTBP.js → chunk-GKNF4D62.js} +331 -20
- package/dist/{chunk-4XPAQXJF.js → chunk-H6Y5D6J7.js} +6 -6
- package/dist/{chunk-IGIGNYZK.js → chunk-HPOW2VCB.js} +4 -4
- package/dist/{chunk-3DSC2FN3.js → chunk-JKXTG3BV.js} +2 -2
- package/dist/{chunk-ZUOPFE22.js → chunk-JUXATN46.js} +1 -1
- package/dist/{chunk-FKNOPMUD.js → chunk-KQON2T4A.js} +4 -4
- package/dist/{chunk-BCWVTWS7.js → chunk-KURUM765.js} +4 -4
- package/dist/{chunk-3PYMMGYO.js → chunk-LAS3DOTW.js} +10 -10
- package/dist/chunk-LK2S5XZH.js +99 -0
- package/dist/{chunk-5TNEVWFJ.js → chunk-LQFDTQC2.js} +2 -2
- package/dist/{chunk-7F2VPHP7.js → chunk-LSMF3EET.js} +9 -9
- package/dist/{chunk-WRW6QCI6.js → chunk-NHXJU7CM.js} +2 -2
- package/dist/{chunk-ZWBRHH3L.js → chunk-NYKZC6HU.js} +3 -3
- package/dist/{chunk-XAV6XCI2.js → chunk-OX7CHZTJ.js} +7 -7
- package/dist/{chunk-XTKH5VAC.js → chunk-QCDVKCHA.js} +2 -2
- package/dist/{chunk-U4HMGT3L.js → chunk-SOTJ2V3A.js} +5 -5
- package/dist/{chunk-CVGMB4N7.js → chunk-TI5Y242B.js} +13 -13
- package/dist/{chunk-KCB6V5XH.js → chunk-VXYPD33W.js} +5 -5
- package/dist/{chunk-HJUGOAM7.js → chunk-WXEPMPHK.js} +1 -1
- package/dist/{chunk-UAFMC3PL.js → chunk-XRQ7DABQ.js} +1 -1
- package/dist/{chunk-AKKVPUGK.js → chunk-YW4PEGLN.js} +1 -1
- package/dist/{chunk-QDDPVBIS.js → chunk-ZAJKEHIE.js} +2 -2
- package/dist/{chunk-2JPVI45I.js → chunk-ZZWWKBLL.js} +3 -2
- package/dist/{claude-launcher-IG7GKYIT.js → claude-launcher-RNMUZZ3Y.js} +5 -5
- package/dist/{cli-DLUADCTG.js → cli-YQ64SSV3.js} +144 -89
- package/dist/{command-JRWYFDNM.js → command-RFVCDSJV.js} +19 -18
- package/dist/{connect-cmd-K73AOVUR.js → connect-cmd-HVHPNVAJ.js} +8 -8
- package/dist/{container-start-4RJRBPVB.js → container-start-DP3N72CK.js} +20 -19
- package/dist/{context-cleanup-D5EGQHQV.js → context-cleanup-VSDT77BZ.js} +3 -3
- package/dist/{control-plane-launch-JCUNTTC3.js → control-plane-launch-DHMD5WBU.js} +6 -6
- package/dist/{dist-BE3LYGNH.js → dist-MKY2BSYN.js} +2 -2
- package/dist/{docker-CVRCHNYC.js → docker-6G6IF4YO.js} +5 -4
- package/dist/{doctor-A3A4X2HJ.js → doctor-ZE4LA7EZ.js} +21 -20
- package/dist/emit-artifact-cmd-YRRXCZAI.js +43 -0
- package/dist/{emit-cmd-PSD7AAKJ.js → emit-cmd-T7NIBSF3.js} +6 -6
- package/dist/{emit-criteria-cmd-GTCZWV4B.js → emit-criteria-cmd-PSQORVHS.js} +9 -9
- package/dist/emit-demo-cmd-RJPSISCC.js +888 -0
- package/dist/{emit-finding-cmd-OUG72OQA.js → emit-finding-cmd-6FVW3GGK.js} +10 -10
- package/dist/{emit-result-cmd-YQ5DZMMR.js → emit-result-cmd-PFQ6HSVN.js} +12 -12
- package/dist/{emit-step-cmd-QJXSHSQF.js → emit-step-cmd-U32Y4PZJ.js} +10 -10
- package/dist/{findings-cmd-DYDEHJFI.js → findings-cmd-AMYNXO3S.js} +10 -10
- package/dist/{fleet-readiness-JEQ5ITV6.js → fleet-readiness-7ROJ54ZF.js} +8 -8
- package/dist/{governing-source-JSYW4RCL.js → governing-source-DYJQCHKU.js} +13 -13
- package/dist/{hook-fast-UFHR6EKZ.js → hook-fast-WQQYEXO5.js} +1 -1
- package/dist/index.js +4 -4
- package/dist/{init-CSXI3OQH.js → init-CHWFDK23.js} +20 -19
- package/dist/{init-SYNDV44H.js → init-QDUIHSTK.js} +20 -19
- package/dist/{init-cmd-ALBPEG7I.js → init-cmd-STCU6RGY.js} +18 -18
- package/dist/{init-update-PMDRKPA2.js → init-update-OIFOUIAN.js} +17 -17
- package/dist/{layout-3ISIED6A.js → layout-OQ7EJUMH.js} +4 -4
- package/dist/{login-browser-NTVVDJF7.js → login-browser-KP7YVYTN.js} +2 -2
- package/dist/{loop-XDJYLT4D.js → loop-NUW7SSZY.js} +29 -28
- package/dist/{machine-GC4MZB5W.js → machine-BJ7TT3B7.js} +19 -18
- package/dist/{machine-skills-I4DB2CP3.js → machine-skills-XWWYFNOZ.js} +4 -4
- package/dist/{runner-identity-D3XUB36T.js → runner-identity-FL67WQIA.js} +5 -4
- package/dist/{runner-key-7QNJNPQ6.js → runner-key-YHAJFEGN.js} +20 -19
- package/dist/{session-sender-S6KG6VOM.js → session-sender-PHQ6PJVD.js} +13 -13
- package/dist/{spec-cmd-4RD3A55B.js → spec-cmd-SAMHN5FU.js} +10 -10
- package/dist/{starter-pack-2WFNRGFA.js → starter-pack-6O7F6P7C.js} +5 -5
- package/dist/{status-ZR2N44KU.js → status-QWLX2CCV.js} +23 -22
- package/dist/{sync-cmd-NISS7HJJ.js → sync-cmd-O6UIF4QJ.js} +12 -12
- package/dist/{watch-VSTJUIRH.js → watch-5HMOSQ4Z.js} +12 -12
- package/dist/{work-claim-cmd-27OJUZ56.js → work-claim-cmd-6W7BW4O6.js} +12 -12
- package/dist/{work-cmd-B7YCAK5M.js → work-cmd-3G26E3NL.js} +10 -10
- package/dist/{work-comment-cmd-2X55NLNL.js → work-comment-cmd-S6EGHGHL.js} +10 -10
- package/dist/{work-logs-cmd-2CE5B2DP.js → work-logs-cmd-RQILRNHS.js} +10 -10
- package/dist/{work-open-pr-cmd-Q3HZJPSD.js → work-open-pr-cmd-5CDP6KOF.js} +11 -11
- package/dist/{work-pr-cmd-MT246E2A.js → work-pr-cmd-D3PJJQOX.js} +10 -10
- package/dist/{work-stop-cmd-CWNLRQKE.js → work-stop-cmd-AGZWXGRP.js} +10 -10
- package/package.json +1 -1
- package/skill-pack/maintained/outerlayer-evidence/SKILL.md +39 -0
|
@@ -1,44 +1,44 @@
|
|
|
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-
|
|
4
|
-
import './chunk-
|
|
5
|
-
import './chunk-
|
|
3
|
+
import { gatherDoctorChecks, doctorExitCode, summarizeChecks, renderDoctorText, recordWrapped, recordUnwrapped, recordRemoval, readManifest, recordInstall, recordStatusline } from './chunk-LSMF3EET.js';
|
|
4
|
+
import './chunk-KURUM765.js';
|
|
5
|
+
import './chunk-H6Y5D6J7.js';
|
|
6
6
|
import './chunk-KT4CN6OU.js';
|
|
7
|
-
import './chunk-
|
|
8
|
-
import { verifiedTrackerNames, TRACKERS } from './chunk-
|
|
9
|
-
import './chunk-
|
|
10
|
-
import './chunk-
|
|
11
|
-
import './chunk-
|
|
12
|
-
import './chunk-
|
|
13
|
-
import { FIRST_VERSION_READING_AGENTS_SKILLS } from './chunk-
|
|
14
|
-
import './chunk-
|
|
7
|
+
import './chunk-QCDVKCHA.js';
|
|
8
|
+
import { verifiedTrackerNames, TRACKERS } from './chunk-SOTJ2V3A.js';
|
|
9
|
+
import './chunk-JKXTG3BV.js';
|
|
10
|
+
import './chunk-HPOW2VCB.js';
|
|
11
|
+
import './chunk-3H7NZPYG.js';
|
|
12
|
+
import './chunk-GKNF4D62.js';
|
|
13
|
+
import { FIRST_VERSION_READING_AGENTS_SKILLS } from './chunk-ZAJKEHIE.js';
|
|
14
|
+
import './chunk-6C3ZVE62.js';
|
|
15
15
|
import './chunk-G2JWZDFA.js';
|
|
16
16
|
import { C, warnDeprecated, API_KEY_FLAG_DEPRECATION, NO_COLOR_FLAG, stripNoColor } from './chunk-ANPNT6PM.js';
|
|
17
|
-
import './chunk-
|
|
17
|
+
import './chunk-FE3RTGJN.js';
|
|
18
18
|
import './chunk-F3EF56LQ.js';
|
|
19
19
|
import './chunk-PJDQPF5N.js';
|
|
20
20
|
import './chunk-APSYTJ6I.js';
|
|
21
21
|
import './chunk-KP6R7CV3.js';
|
|
22
22
|
import './chunk-HDSDUTX4.js';
|
|
23
|
-
import { hookFiredMarkerPath, installedCliDistDir } from './chunk-
|
|
23
|
+
import { hookFiredMarkerPath, installedCliDistDir } from './chunk-NHXJU7CM.js';
|
|
24
24
|
import './chunk-ZJSNLVCE.js';
|
|
25
25
|
import './chunk-I7RZHMXW.js';
|
|
26
26
|
import './chunk-BKO6JEZI.js';
|
|
27
27
|
import './chunk-HCVLP7XA.js';
|
|
28
28
|
import { findGitDirs } from './chunk-BJ3KTMDH.js';
|
|
29
|
-
import './chunk-
|
|
30
|
-
import './chunk-
|
|
29
|
+
import './chunk-XRQ7DABQ.js';
|
|
30
|
+
import './chunk-YW4PEGLN.js';
|
|
31
31
|
import './chunk-5BHIBJDA.js';
|
|
32
32
|
import './chunk-CDDED64E.js';
|
|
33
33
|
import { resolveVersion, resolvePackageVersion } from './chunk-RA3O54FC.js';
|
|
34
34
|
import { parseTrackerNumber, trackerNumberError } from './chunk-WZBHBH3J.js';
|
|
35
35
|
import { cliInvocation, packageRunnerOf } from './chunk-CRB3POP4.js';
|
|
36
36
|
import { settingsPath, readSettings, SettingsParseError, listHookCandidates, PORTABLE_BIN, wrapHooks, writeSettings, unwrapHooks, REGISTERED_EVENTS, removeHooks, removeStatusline, cliBinResolvable, mergeHooks, repointWrappedHooks, AUTO_WRAP_EVENTS, mergeStatusline } from './chunk-URIZRCRY.js';
|
|
37
|
-
import './chunk-
|
|
37
|
+
import './chunk-WXEPMPHK.js';
|
|
38
38
|
import { cloneIsGoverned } from './chunk-YQR6E6OV.js';
|
|
39
39
|
import { removeJournalHooks, removePreCommitGuardHook } from './chunk-TUSYOL2O.js';
|
|
40
|
-
import './chunk-
|
|
41
|
-
import './chunk-
|
|
40
|
+
import './chunk-JUXATN46.js';
|
|
41
|
+
import './chunk-3WW2TL7V.js';
|
|
42
42
|
import { homeFromEnv } from './chunk-VNVZDWO3.js';
|
|
43
43
|
import './chunk-XD4ZCMA4.js';
|
|
44
44
|
import './chunk-MESOOLF4.js';
|
|
@@ -3658,14 +3658,14 @@ function apiKeyOption() {
|
|
|
3658
3658
|
return new Option("--api-key <key>", `deprecated: use \`${cliInvocation()} login\` or OUTERLAYER_API_KEY`).hideHelp();
|
|
3659
3659
|
}
|
|
3660
3660
|
async function installStarterPackInRepo() {
|
|
3661
|
-
const { installStarterPack, formatStarterPackOutput } = await import('./starter-pack-
|
|
3661
|
+
const { installStarterPack, formatStarterPackOutput } = await import('./starter-pack-6O7F6P7C.js');
|
|
3662
3662
|
const cwd = process.cwd();
|
|
3663
3663
|
let repoRoot = cwd;
|
|
3664
3664
|
try {
|
|
3665
3665
|
repoRoot = execFileSync("git", ["rev-parse", "--show-toplevel"], { cwd, encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] }).trim() || cwd;
|
|
3666
3666
|
} catch {
|
|
3667
3667
|
}
|
|
3668
|
-
const { declareAgentsMdLayout, isAgentsMdLayout, skillsBaseFor } = await import('./layout-
|
|
3668
|
+
const { declareAgentsMdLayout, isAgentsMdLayout, skillsBaseFor } = await import('./layout-OQ7EJUMH.js');
|
|
3669
3669
|
const fresh = !isAgentsMdLayout(repoRoot) && !existsSync(join(repoRoot, ".outerlayer"));
|
|
3670
3670
|
const result = installStarterPack({ repoRoot, base: fresh ? ".agents/skills" : skillsBaseFor(repoRoot) });
|
|
3671
3671
|
if (fresh) declareAgentsMdLayout(repoRoot);
|
|
@@ -3791,7 +3791,7 @@ ${starter.output}`),
|
|
|
3791
3791
|
}
|
|
3792
3792
|
}
|
|
3793
3793
|
async function installMachineSkillsForSetup() {
|
|
3794
|
-
const { setupMachineSkills } = await import('./machine-skills-
|
|
3794
|
+
const { setupMachineSkills } = await import('./machine-skills-XWWYFNOZ.js');
|
|
3795
3795
|
const result = setupMachineSkills(homeFromEnv());
|
|
3796
3796
|
for (const failure of result.failures) process.stderr.write(`${C.yellow}!${C.reset} Could not write a maintained skill: ${failure}
|
|
3797
3797
|
`);
|
|
@@ -3799,8 +3799,8 @@ async function installMachineSkillsForSetup() {
|
|
|
3799
3799
|
` : "";
|
|
3800
3800
|
}
|
|
3801
3801
|
async function realConnectDepsForCwd() {
|
|
3802
|
-
const { realConnectDeps } = await import('./connect-cmd-
|
|
3803
|
-
const { resolveRepoIdentity } = await import('./dist-
|
|
3802
|
+
const { realConnectDeps } = await import('./connect-cmd-HVHPNVAJ.js');
|
|
3803
|
+
const { resolveRepoIdentity } = await import('./dist-MKY2BSYN.js');
|
|
3804
3804
|
return {
|
|
3805
3805
|
...realConnectDeps(),
|
|
3806
3806
|
home: homeFromEnv(),
|
|
@@ -3817,7 +3817,7 @@ function buildProgram(argv = process.argv) {
|
|
|
3817
3817
|
const program2 = new Command();
|
|
3818
3818
|
program2.name(cliInvocation()).description("OuterLayer \u2014 see what your coding agents actually do").enablePositionalOptions().version(resolveVersion()).hook("preAction", async (_root, command) => {
|
|
3819
3819
|
if (command.opts().apiKey !== void 0) warnDeprecated(API_KEY_FLAG_DEPRECATION);
|
|
3820
|
-
const { machineRefreshSkipped, refreshMachineSkills } = await import('./machine-skills-
|
|
3820
|
+
const { machineRefreshSkipped, refreshMachineSkills } = await import('./machine-skills-XWWYFNOZ.js');
|
|
3821
3821
|
const names = [];
|
|
3822
3822
|
for (let at = command; at?.parent; at = at.parent) names.push(at.name());
|
|
3823
3823
|
if (!machineRefreshSkipped(names, command._hidden === true, argv)) refreshMachineSkills(homeFromEnv());
|
|
@@ -3874,8 +3874,8 @@ build, ../outerlayer-build/SKILL.md becomes ~/.agents/skills/outerlayer-build/SK
|
|
|
3874
3874
|
what CLIs older than ${FIRST_VERSION_READING_AGENTS_SKILLS} do. \`` + cliInvocation() + " doctor` reports the same\nstates under Starter files.\n"
|
|
3875
3875
|
).action(async (opts) => {
|
|
3876
3876
|
if (opts.update || opts.dryRun) {
|
|
3877
|
-
const { runInitUpdateWithFleet, formatInitUpdate, updateFlagProblem } = await import('./init-update-
|
|
3878
|
-
const { fleetReadiness } = await import('./fleet-readiness-
|
|
3877
|
+
const { runInitUpdateWithFleet, formatInitUpdate, updateFlagProblem } = await import('./init-update-OIFOUIAN.js');
|
|
3878
|
+
const { fleetReadiness } = await import('./fleet-readiness-7ROJ54ZF.js');
|
|
3879
3879
|
const problem = updateFlagProblem(opts);
|
|
3880
3880
|
if (problem !== void 0) {
|
|
3881
3881
|
fail(problem);
|
|
@@ -3892,7 +3892,7 @@ what CLIs older than ${FIRST_VERSION_READING_AGENTS_SKILLS} do. \`` + cliInvocat
|
|
|
3892
3892
|
}
|
|
3893
3893
|
let starterTemplate;
|
|
3894
3894
|
if (opts.template !== void 0) {
|
|
3895
|
-
const { assertKnownTemplate, StarterPackError } = await import('./starter-pack-
|
|
3895
|
+
const { assertKnownTemplate, StarterPackError } = await import('./starter-pack-6O7F6P7C.js');
|
|
3896
3896
|
try {
|
|
3897
3897
|
assertKnownTemplate(opts.template);
|
|
3898
3898
|
} catch (err) {
|
|
@@ -3926,13 +3926,13 @@ what CLIs older than ${FIRST_VERSION_READING_AGENTS_SKILLS} do. \`` + cliInvocat
|
|
|
3926
3926
|
if (changed.length > 0 && !opts.json) process.stdout.write(`Removed the claude function from ${changed.join(", ")}.
|
|
3927
3927
|
`);
|
|
3928
3928
|
}
|
|
3929
|
-
const shell = !opts.remove && opts.shellFunction !== void 0 ? (await import('./init-cmd-
|
|
3929
|
+
const shell = !opts.remove && opts.shellFunction !== void 0 ? (await import('./init-cmd-STCU6RGY.js')).applyShellFunctionFlag(opts.shellFunction, { home: homeFromEnv(), shellPath: process.env.SHELL }) : void 0;
|
|
3930
3930
|
if (opts.json) writeJson(shell === void 0 ? outcome.result : { ...outcome.result, shellFunction: { outcome: shell.outcome, reason: shell.reason } });
|
|
3931
3931
|
else process.stdout.write(outcome.text + skillsLine + (shell?.text ?? ""));
|
|
3932
3932
|
return;
|
|
3933
3933
|
}
|
|
3934
3934
|
await installMachineSkillsForSetup();
|
|
3935
|
-
const { runInitCommand } = await import('./init-cmd-
|
|
3935
|
+
const { runInitCommand } = await import('./init-cmd-STCU6RGY.js');
|
|
3936
3936
|
const code = await runInitCommand(
|
|
3937
3937
|
{ json: opts.json, factory: opts.factory, shellFunction: opts.shellFunction },
|
|
3938
3938
|
{
|
|
@@ -3944,7 +3944,7 @@ what CLIs older than ${FIRST_VERSION_READING_AGENTS_SKILLS} do. \`` + cliInvocat
|
|
|
3944
3944
|
return { ok, text, detail };
|
|
3945
3945
|
},
|
|
3946
3946
|
runAgentSetup: async () => {
|
|
3947
|
-
const { runAgentSetup } = await import('./agent-setup-
|
|
3947
|
+
const { runAgentSetup } = await import('./agent-setup-NSUX64RU.js');
|
|
3948
3948
|
return runAgentSetup({ cwd: process.cwd(), skillsLink: opts.skillsLink !== false });
|
|
3949
3949
|
},
|
|
3950
3950
|
runDoctorChecks: gatherDoctorChecks,
|
|
@@ -3953,7 +3953,7 @@ what CLIs older than ${FIRST_VERSION_READING_AGENTS_SKILLS} do. \`` + cliInvocat
|
|
|
3953
3953
|
shellPath: process.env.SHELL,
|
|
3954
3954
|
interactive: Boolean(process.stdin.isTTY && process.stderr.isTTY) && opts.json !== true,
|
|
3955
3955
|
ask: async () => {
|
|
3956
|
-
const { promptOnTerminal } = await import('./connect-cmd-
|
|
3956
|
+
const { promptOnTerminal } = await import('./connect-cmd-HVHPNVAJ.js');
|
|
3957
3957
|
const answer = await promptOnTerminal({
|
|
3958
3958
|
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.`,
|
|
3959
3959
|
options: [
|
|
@@ -3992,7 +3992,7 @@ linked (true, false, or null when it could not be checked) and, when false,
|
|
|
3992
3992
|
linkUrl.
|
|
3993
3993
|
`
|
|
3994
3994
|
).action(async (opts) => {
|
|
3995
|
-
const { runConnectCommand } = await import('./connect-cmd-
|
|
3995
|
+
const { runConnectCommand } = await import('./connect-cmd-HVHPNVAJ.js');
|
|
3996
3996
|
const code = await runConnectCommand({ factory: opts.factory, json: opts.json }, await realConnectDepsForCwd(), {
|
|
3997
3997
|
stdout: process.stdout,
|
|
3998
3998
|
stderr: process.stderr
|
|
@@ -4031,7 +4031,7 @@ Every later command reads the saved file, so none of them needs a key on
|
|
|
4031
4031
|
its command line. A saved key is checked for real on the first \`sync\`.
|
|
4032
4032
|
`
|
|
4033
4033
|
).action(async (opts) => {
|
|
4034
|
-
const { runLoginCommand, realLoginDeps } = await import('./login-browser-
|
|
4034
|
+
const { runLoginCommand, realLoginDeps } = await import('./login-browser-KP7YVYTN.js');
|
|
4035
4035
|
const code = await runLoginCommand(
|
|
4036
4036
|
{
|
|
4037
4037
|
browser: opts.browser !== false,
|
|
@@ -4064,13 +4064,13 @@ code is 1: revoke the token on /profile/security.
|
|
|
4064
4064
|
"\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"
|
|
4065
4065
|
).action(async (opts) => {
|
|
4066
4066
|
if (opts.link !== void 0) {
|
|
4067
|
-
const { lookupArtifactLink } = await import('./artifact-link-cmd-
|
|
4067
|
+
const { lookupArtifactLink } = await import('./artifact-link-cmd-IGVFGHC2.js');
|
|
4068
4068
|
const found = lookupArtifactLink(opts.link);
|
|
4069
4069
|
if (found.ok) process.stdout.write(found.url + "\n");
|
|
4070
4070
|
else fail(found.reason);
|
|
4071
4071
|
return;
|
|
4072
4072
|
}
|
|
4073
|
-
const { runSync, SyncConfigError, SyncTransportError } = await import('./sync-cmd-
|
|
4073
|
+
const { runSync, SyncConfigError, SyncTransportError } = await import('./sync-cmd-O6UIF4QJ.js');
|
|
4074
4074
|
try {
|
|
4075
4075
|
const result = await runSync({
|
|
4076
4076
|
url: opts.url,
|
|
@@ -4101,7 +4101,7 @@ code is 1: revoke the token on /profile/security.
|
|
|
4101
4101
|
if (invokedCommandToken(argv) === "watch") {
|
|
4102
4102
|
warnDeprecated(`\`${cliInvocation()} watch\` is now \`${cliInvocation()} daemon\`; the old name will be removed in a future release.`);
|
|
4103
4103
|
}
|
|
4104
|
-
const { runWatch } = await import('./watch-
|
|
4104
|
+
const { runWatch } = await import('./watch-5HMOSQ4Z.js');
|
|
4105
4105
|
await runWatch({ once: opts.once });
|
|
4106
4106
|
});
|
|
4107
4107
|
program2.command("hook <event>", { hidden: true }).description("capture-hook fast path, installed by `init`").action(() => {
|
|
@@ -4191,7 +4191,7 @@ code is 1: revoke the token on /profile/security.
|
|
|
4191
4191
|
process.exitCode = await runBuildCommand({ dir: opts.dir, argv: command });
|
|
4192
4192
|
});
|
|
4193
4193
|
program2.command("session-sender", { hidden: true }).description("stream a runner build's sessions to its work item while the build runs").action(async () => {
|
|
4194
|
-
const { runSessionSender } = await import('./session-sender-
|
|
4194
|
+
const { runSessionSender } = await import('./session-sender-PHQ6PJVD.js');
|
|
4195
4195
|
try {
|
|
4196
4196
|
await runSessionSender();
|
|
4197
4197
|
} catch (err) {
|
|
@@ -4234,7 +4234,7 @@ async function runCli(processArgv) {
|
|
|
4234
4234
|
await buildProgram(argv).parseAsync(argv);
|
|
4235
4235
|
}
|
|
4236
4236
|
async function compileContext(opts) {
|
|
4237
|
-
const { runEmit, EmitError } = await import('./emit-cmd-
|
|
4237
|
+
const { runEmit, EmitError } = await import('./emit-cmd-T7NIBSF3.js');
|
|
4238
4238
|
try {
|
|
4239
4239
|
const result = runEmit({ cwd: opts.dir, check: opts.check, json: opts.json });
|
|
4240
4240
|
if (result.exitCode !== 0) process.exitCode = result.exitCode;
|
|
@@ -4275,7 +4275,8 @@ A person's pass or fail on one criterion's proof is recorded on that
|
|
|
4275
4275
|
criterion's thread instead \u2014 see \`${cliInvocation()} work comment\`.
|
|
4276
4276
|
|
|
4277
4277
|
Subcommands: \`emit artifact <file>\` for screenshots, recordings, reports and
|
|
4278
|
-
logs; \`emit
|
|
4278
|
+
logs; \`emit demo <manifest>\` for a narrated demo with one chapter per criterion;
|
|
4279
|
+
\`emit finding\` / \`emit findings <file>\` to record a problem in the factory;
|
|
4279
4280
|
\`emit criteria <file>\` to record a work item's acceptance criteria;
|
|
4280
4281
|
\`emit step <name>\` to report that you started a step.
|
|
4281
4282
|
Compiling .outerlayer/ moved to \`${cliInvocation()} context emit\`.
|
|
@@ -4286,7 +4287,7 @@ Compiling .outerlayer/ moved to \`${cliInvocation()} context emit\`.
|
|
|
4286
4287
|
await compileContext({ dir: opts.dir, check: opts.check, json: opts.json });
|
|
4287
4288
|
return;
|
|
4288
4289
|
}
|
|
4289
|
-
const { runEmitResult, EmitResultError } = await import('./emit-result-cmd-
|
|
4290
|
+
const { runEmitResult, EmitResultError } = await import('./emit-result-cmd-PFQ6HSVN.js');
|
|
4290
4291
|
try {
|
|
4291
4292
|
const result = await runEmitResult({
|
|
4292
4293
|
name,
|
|
@@ -4337,7 +4338,7 @@ everywhere, bytes and deep link untouched; a still-queued one is cancelled
|
|
|
4337
4338
|
locally so it never uploads. One correction can retire several duplicates.
|
|
4338
4339
|
`
|
|
4339
4340
|
).action(async (file, opts) => {
|
|
4340
|
-
const { runEmitArtifact, EmitArtifactError } = await import('./emit-artifact-cmd-
|
|
4341
|
+
const { runEmitArtifact, EmitArtifactError } = await import('./emit-artifact-cmd-YRRXCZAI.js');
|
|
4341
4342
|
let pr;
|
|
4342
4343
|
if (opts.pr !== void 0) {
|
|
4343
4344
|
pr = parseTrackerNumber(opts.pr);
|
|
@@ -4367,6 +4368,60 @@ locally so it never uploads. One correction can retire several duplicates.
|
|
|
4367
4368
|
throw err;
|
|
4368
4369
|
}
|
|
4369
4370
|
});
|
|
4371
|
+
emitCmd.command("demo <manifest>").description("Emit a narrated demo: one video artifact for each chapter of a recorded manifest").option("--no-narration", "store the clips with no speech; needs neither espeak-ng nor the voice pack").option("--item <number>", "work item whose recorded criteria the chapters are checked against").option("--pr <number>", "pull request number to anchor to, outside a recorded session").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(
|
|
4372
|
+
"after",
|
|
4373
|
+
`
|
|
4374
|
+
${cliInvocation()} emit demo test-results/demo/manifest.json --item 412
|
|
4375
|
+
|
|
4376
|
+
The manifest is the JSON file \`@outerlayer/playwright\` writes next to its video. Each chapter
|
|
4377
|
+
becomes one WebM clip (VP9 video, Opus speech) and is emitted as a video artifact. A chapter whose
|
|
4378
|
+
checks all passed is bound to its criterion; a chapter with a failed check, and an opening chapter
|
|
4379
|
+
with no criterion, is stored unbound. The manifest is then emitted as the demo record.
|
|
4380
|
+
Needs ffmpeg and ffprobe on PATH, and espeak-ng unless --no-narration is given. The first narrated
|
|
4381
|
+
run downloads the voice pack (about 400 MB) to ~/.outerlayer/voice/ and checks it against pinned
|
|
4382
|
+
sha256 hashes. Every refusal comes before the first upload. Exit 1 means a chapter had a failed
|
|
4383
|
+
check: its clip and the record are stored all the same.
|
|
4384
|
+
`
|
|
4385
|
+
).action(async (manifest, opts) => {
|
|
4386
|
+
const { runEmitDemo, EmitDemoError } = await import('./emit-demo-cmd-RJPSISCC.js');
|
|
4387
|
+
let item;
|
|
4388
|
+
if (opts.item !== void 0) {
|
|
4389
|
+
item = parseTrackerNumber(opts.item);
|
|
4390
|
+
if (item === void 0) {
|
|
4391
|
+
fail(trackerNumberError("--item", opts.item));
|
|
4392
|
+
return;
|
|
4393
|
+
}
|
|
4394
|
+
}
|
|
4395
|
+
let pr;
|
|
4396
|
+
if (opts.pr !== void 0) {
|
|
4397
|
+
pr = parseTrackerNumber(opts.pr);
|
|
4398
|
+
if (pr === void 0) {
|
|
4399
|
+
fail(trackerNumberError("--pr", opts.pr));
|
|
4400
|
+
return;
|
|
4401
|
+
}
|
|
4402
|
+
}
|
|
4403
|
+
try {
|
|
4404
|
+
const result = await runEmitDemo({
|
|
4405
|
+
manifest,
|
|
4406
|
+
noNarration: opts.narration === false,
|
|
4407
|
+
item,
|
|
4408
|
+
pr,
|
|
4409
|
+
json: opts.json,
|
|
4410
|
+
url: opts.url,
|
|
4411
|
+
apiKey: opts.apiKey,
|
|
4412
|
+
appId: opts.appId
|
|
4413
|
+
});
|
|
4414
|
+
for (const failure of result.failures) process.stderr.write(`${C.red}\u2717${C.reset} ${failure}
|
|
4415
|
+
`);
|
|
4416
|
+
if (result.exitCode !== 0) process.exitCode = result.exitCode;
|
|
4417
|
+
} catch (err) {
|
|
4418
|
+
if (err instanceof EmitDemoError) {
|
|
4419
|
+
fail(err.message);
|
|
4420
|
+
return;
|
|
4421
|
+
}
|
|
4422
|
+
throw err;
|
|
4423
|
+
}
|
|
4424
|
+
});
|
|
4370
4425
|
emitCmd.command("finding").description("Record one finding: a problem you hit in the factory").requiredOption("--id <id>", "client id \u2014 re-emitting the same id replaces it").option("--category <context|flaky-test|tooling|environment|defect|other>", "what kind of problem this is").requiredOption("--title <text>", "one sentence").requiredOption("--file <path>", "the file the problem is in, or the instruction's own path").option("--line <number>", "line number in --file").option("--rule-path <path>", "the instruction's own path \u2014 required for a context finding").option("--rule-line <number>", "line number in --rule-path").option("--rule-quote <text>", "the instruction's quoted sentence \u2014 required unless --rule-relation is missing").option("--rule-relation <wrong|broken|missing>", "how the instruction fails \u2014 required for a context finding").requiredOption("--where <label>", 'where this was recorded, e.g. "build session"').option("--detail <text>", "what happened, a few paragraphs").option("--cause <text>", 'what is actually wrong, or "unknown"').option("--suggestion <text>", "what would help").option("--command <text>", "the command that misbehaved").option("--error <text>", "the first error line").option("--test <name>", "the test name, for a flaky test").option("--symbol <name>", "the function the problem is in, for a defect").option("--started-at <event>", "event id where you hit the problem (default: first output showing --error)").option("--ended-at <event>", "event id where you got past it (default: the newest event)").option("--untimed", "record no time, only when the problem cost none in this session").option("--find <text>", "list this session's events that contain the text, and record nothing").option("--problem <id>", "a problem this finding reports; repeat for each one (needs --link-reason)", (value, previous = []) => [...previous, value]).option("--link-reason <text>", "why the finding reports each --problem").option("--new", "record a new problem instead of linking an existing one").option("--trace-id <id>", "the session's trace id, when there is one").option("--turn <number>", "turn index within the session").option("--round <number>", "round number, when there is one").addOption(new Option("--subject <value>").hideHelp()).addOption(new Option("--kind <value>").hideHelp()).addOption(new Option("--severity <value>").hideHelp()).addOption(new Option("--verdict <value>").hideHelp()).addOption(new Option("--fixed").hideHelp()).addOption(new Option("--source <value>").hideHelp()).option("--head-sha <sha>", "the commit this batch was recorded against").option("--context-source-sha <sha>", "the context-source commit this batch was recorded against").option("--item <number>", "work item to record on directly, by its number in this factory").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(
|
|
4371
4426
|
"after",
|
|
4372
4427
|
`
|
|
@@ -4396,7 +4451,7 @@ recent events with their ids. --find <text> searches all of them.
|
|
|
4396
4451
|
item that session was launched for is used automatically.
|
|
4397
4452
|
`
|
|
4398
4453
|
).action(async (opts) => {
|
|
4399
|
-
const { runEmitFinding, refuseRemovedFindingFlags, EmitFindingError } = await import('./emit-finding-cmd-
|
|
4454
|
+
const { runEmitFinding, refuseRemovedFindingFlags, EmitFindingError } = await import('./emit-finding-cmd-6FVW3GGK.js');
|
|
4400
4455
|
try {
|
|
4401
4456
|
refuseRemovedFindingFlags(opts);
|
|
4402
4457
|
const result = await runEmitFinding({
|
|
@@ -4463,7 +4518,7 @@ the whole batch. "untimed": true records one with no time on purpose.
|
|
|
4463
4518
|
that session was launched for is used automatically.
|
|
4464
4519
|
`
|
|
4465
4520
|
).action(async (file, opts) => {
|
|
4466
|
-
const { runEmitFindings, EmitFindingError } = await import('./emit-finding-cmd-
|
|
4521
|
+
const { runEmitFindings, EmitFindingError } = await import('./emit-finding-cmd-6FVW3GGK.js');
|
|
4467
4522
|
try {
|
|
4468
4523
|
const result = await runEmitFindings({
|
|
4469
4524
|
file,
|
|
@@ -4498,7 +4553,7 @@ command, the command exits 0, and \`sync\` sends it later. If the gateway refuse
|
|
|
4498
4553
|
the step, the command prints why and exits 1.
|
|
4499
4554
|
`
|
|
4500
4555
|
).action(async (name, opts) => {
|
|
4501
|
-
const { runEmitStep, EmitStepError } = await import('./emit-step-cmd-
|
|
4556
|
+
const { runEmitStep, EmitStepError } = await import('./emit-step-cmd-U32Y4PZJ.js');
|
|
4502
4557
|
try {
|
|
4503
4558
|
await runEmitStep({
|
|
4504
4559
|
name,
|
|
@@ -4541,7 +4596,7 @@ of the item, and a (proof: <kind>) annotation names its proof.
|
|
|
4541
4596
|
${cliInvocation()} emit criteria acceptance/412-login.md --item 412
|
|
4542
4597
|
`
|
|
4543
4598
|
).action(async (file, opts) => {
|
|
4544
|
-
const { runEmitCriteria, EmitCriteriaError } = await import('./emit-criteria-cmd-
|
|
4599
|
+
const { runEmitCriteria, EmitCriteriaError } = await import('./emit-criteria-cmd-PSQORVHS.js');
|
|
4545
4600
|
try {
|
|
4546
4601
|
const result = await runEmitCriteria({
|
|
4547
4602
|
file,
|
|
@@ -4565,9 +4620,9 @@ function registerSpecCommands(program2) {
|
|
|
4565
4620
|
const specCmd = program2.command("spec").description("Find, file and edit the issue a spec lives in, in your factory's tracker");
|
|
4566
4621
|
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)");
|
|
4567
4622
|
const run = async (action) => {
|
|
4568
|
-
const { WorkCommandError } = await import('./work-cmd-
|
|
4623
|
+
const { WorkCommandError } = await import('./work-cmd-3G26E3NL.js');
|
|
4569
4624
|
try {
|
|
4570
|
-
await action(await import('./spec-cmd-
|
|
4625
|
+
await action(await import('./spec-cmd-SAMHN5FU.js'));
|
|
4571
4626
|
} catch (err) {
|
|
4572
4627
|
if (err instanceof WorkCommandError) {
|
|
4573
4628
|
fail(err.message);
|
|
@@ -4602,7 +4657,7 @@ Prints each problem the item covers with its id, its reports and its result.
|
|
|
4602
4657
|
session was launched for is used.
|
|
4603
4658
|
`
|
|
4604
4659
|
).action(async (opts) => {
|
|
4605
|
-
const { runFindingsShow, FindingsCommandError } = await import('./findings-cmd-
|
|
4660
|
+
const { runFindingsShow, FindingsCommandError } = await import('./findings-cmd-AMYNXO3S.js');
|
|
4606
4661
|
try {
|
|
4607
4662
|
const result = await runFindingsShow({
|
|
4608
4663
|
item: opts.item,
|
|
@@ -4630,7 +4685,7 @@ Give exactly one of --fixed and --not-fixed, and a --note. Run it again for the
|
|
|
4630
4685
|
problem to replace the earlier result. A problem the item does not cover is refused.
|
|
4631
4686
|
`
|
|
4632
4687
|
).action(async (problem, opts) => {
|
|
4633
|
-
const { runFindingsResult, FindingsCommandError } = await import('./findings-cmd-
|
|
4688
|
+
const { runFindingsResult, FindingsCommandError } = await import('./findings-cmd-AMYNXO3S.js');
|
|
4634
4689
|
try {
|
|
4635
4690
|
const result = await runFindingsResult({
|
|
4636
4691
|
problem,
|
|
@@ -4671,7 +4726,7 @@ takes it, and prints the line that starts your session on it. That
|
|
|
4671
4726
|
session links itself and holds the item's lease while it works.
|
|
4672
4727
|
`
|
|
4673
4728
|
).action(async (opts) => {
|
|
4674
|
-
const { runWorkBuild, WorkCommandError } = await import('./work-cmd-
|
|
4729
|
+
const { runWorkBuild, WorkCommandError } = await import('./work-cmd-3G26E3NL.js');
|
|
4675
4730
|
try {
|
|
4676
4731
|
await runWorkBuild(opts);
|
|
4677
4732
|
} catch (err) {
|
|
@@ -4694,7 +4749,7 @@ renews that session's own 20-minute lease, unless --no-lease or
|
|
|
4694
4749
|
--ended is given, or another worker already holds a live one.
|
|
4695
4750
|
`
|
|
4696
4751
|
).action(async (number, opts) => {
|
|
4697
|
-
const { runWorkLinkSession, WorkCommandError } = await import('./work-cmd-
|
|
4752
|
+
const { runWorkLinkSession, WorkCommandError } = await import('./work-cmd-3G26E3NL.js');
|
|
4698
4753
|
try {
|
|
4699
4754
|
await runWorkLinkSession({ ...opts, number, noLease: opts.lease === false, logFailures: opts.logFailures === true });
|
|
4700
4755
|
} catch (err) {
|
|
@@ -4718,8 +4773,8 @@ criterion's new proof; --ready hands the thread back to a person. At
|
|
|
4718
4773
|
most one action flag may be given.
|
|
4719
4774
|
`
|
|
4720
4775
|
).action(async (opts) => {
|
|
4721
|
-
const { runWorkComment, WorkCommentCommandError } = await import('./work-comment-cmd-
|
|
4722
|
-
const { WorkCommandError } = await import('./work-cmd-
|
|
4776
|
+
const { runWorkComment, WorkCommentCommandError } = await import('./work-comment-cmd-S6EGHGHL.js');
|
|
4777
|
+
const { WorkCommandError } = await import('./work-cmd-3G26E3NL.js');
|
|
4723
4778
|
try {
|
|
4724
4779
|
await runWorkComment(opts);
|
|
4725
4780
|
} catch (err) {
|
|
@@ -4740,8 +4795,8 @@ criterion that carries proof or a comment, each with who is waiting
|
|
|
4740
4795
|
on whom next.
|
|
4741
4796
|
`
|
|
4742
4797
|
).action(async (opts) => {
|
|
4743
|
-
const { runWorkThreads, WorkCommentCommandError } = await import('./work-comment-cmd-
|
|
4744
|
-
const { WorkCommandError } = await import('./work-cmd-
|
|
4798
|
+
const { runWorkThreads, WorkCommentCommandError } = await import('./work-comment-cmd-S6EGHGHL.js');
|
|
4799
|
+
const { WorkCommandError } = await import('./work-cmd-3G26E3NL.js');
|
|
4745
4800
|
try {
|
|
4746
4801
|
await runWorkThreads(opts);
|
|
4747
4802
|
} catch (err) {
|
|
@@ -4765,8 +4820,8 @@ still running, or that an older runner released, has no log and the
|
|
|
4765
4820
|
command exits 1.
|
|
4766
4821
|
`
|
|
4767
4822
|
).action(async (opts) => {
|
|
4768
|
-
const { runWorkLogs, WorkLogsCommandError } = await import('./work-logs-cmd-
|
|
4769
|
-
const { WorkCommandError } = await import('./work-cmd-
|
|
4823
|
+
const { runWorkLogs, WorkLogsCommandError } = await import('./work-logs-cmd-RQILRNHS.js');
|
|
4824
|
+
const { WorkCommandError } = await import('./work-cmd-3G26E3NL.js');
|
|
4770
4825
|
try {
|
|
4771
4826
|
await runWorkLogs(opts);
|
|
4772
4827
|
} catch (err) {
|
|
@@ -4789,8 +4844,8 @@ item is not built again until a new build request. Exits 1 when no host
|
|
|
4789
4844
|
build is running for the item.
|
|
4790
4845
|
`
|
|
4791
4846
|
).action(async (opts) => {
|
|
4792
|
-
const { runWorkStop, WorkStopCommandError } = await import('./work-stop-cmd-
|
|
4793
|
-
const { WorkCommandError } = await import('./work-cmd-
|
|
4847
|
+
const { runWorkStop, WorkStopCommandError } = await import('./work-stop-cmd-AGZWXGRP.js');
|
|
4848
|
+
const { WorkCommandError } = await import('./work-cmd-3G26E3NL.js');
|
|
4794
4849
|
try {
|
|
4795
4850
|
await runWorkStop(opts);
|
|
4796
4851
|
} catch (err) {
|
|
@@ -4811,7 +4866,7 @@ deletes anything \u2014 the item is removed from Work only once no
|
|
|
4811
4866
|
live addition remains on it.
|
|
4812
4867
|
`
|
|
4813
4868
|
).action(async (opts) => {
|
|
4814
|
-
const { runWorkRemove, WorkCommandError } = await import('./work-cmd-
|
|
4869
|
+
const { runWorkRemove, WorkCommandError } = await import('./work-cmd-3G26E3NL.js');
|
|
4815
4870
|
try {
|
|
4816
4871
|
await runWorkRemove(opts);
|
|
4817
4872
|
} catch (err) {
|
|
@@ -4823,7 +4878,7 @@ live addition remains on it.
|
|
|
4823
4878
|
}
|
|
4824
4879
|
});
|
|
4825
4880
|
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) => {
|
|
4826
|
-
const { runWorkStatus, WorkCommandError } = await import('./work-cmd-
|
|
4881
|
+
const { runWorkStatus, WorkCommandError } = await import('./work-cmd-3G26E3NL.js');
|
|
4827
4882
|
try {
|
|
4828
4883
|
await runWorkStatus(opts);
|
|
4829
4884
|
} catch (err) {
|
|
@@ -4835,7 +4890,7 @@ live addition remains on it.
|
|
|
4835
4890
|
}
|
|
4836
4891
|
});
|
|
4837
4892
|
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) => {
|
|
4838
|
-
const { runWorkList, WorkCommandError } = await import('./work-cmd-
|
|
4893
|
+
const { runWorkList, WorkCommandError } = await import('./work-cmd-3G26E3NL.js');
|
|
4839
4894
|
try {
|
|
4840
4895
|
await runWorkList(opts);
|
|
4841
4896
|
} catch (err) {
|
|
@@ -4856,7 +4911,7 @@ by a different key is refused; claiming again with the same key extends
|
|
|
4856
4911
|
it. --host is a label only.
|
|
4857
4912
|
`
|
|
4858
4913
|
).action(async (opts) => {
|
|
4859
|
-
const { runWorkClaim, WorkCommandError } = await import('./work-claim-cmd-
|
|
4914
|
+
const { runWorkClaim, WorkCommandError } = await import('./work-claim-cmd-6W7BW4O6.js');
|
|
4860
4915
|
try {
|
|
4861
4916
|
await runWorkClaim(opts);
|
|
4862
4917
|
} catch (err) {
|
|
@@ -4876,7 +4931,7 @@ Extends the live lease this API key holds. Refused with a 410 if the
|
|
|
4876
4931
|
lease has expired, or a 403 if a different key holds it.
|
|
4877
4932
|
`
|
|
4878
4933
|
).action(async (opts) => {
|
|
4879
|
-
const { runWorkRenew, WorkCommandError } = await import('./work-claim-cmd-
|
|
4934
|
+
const { runWorkRenew, WorkCommandError } = await import('./work-claim-cmd-6W7BW4O6.js');
|
|
4880
4935
|
try {
|
|
4881
4936
|
await runWorkRenew(opts);
|
|
4882
4937
|
} catch (err) {
|
|
@@ -4908,7 +4963,7 @@ applies to a host's lease only. A later tool call in the session
|
|
|
4908
4963
|
takes the lease again.
|
|
4909
4964
|
`
|
|
4910
4965
|
).action(async (opts) => {
|
|
4911
|
-
const { runWorkRelease, WorkCommandError } = await import('./work-claim-cmd-
|
|
4966
|
+
const { runWorkRelease, WorkCommandError } = await import('./work-claim-cmd-6W7BW4O6.js');
|
|
4912
4967
|
try {
|
|
4913
4968
|
await runWorkRelease(opts);
|
|
4914
4969
|
} catch (err) {
|
|
@@ -4935,7 +4990,7 @@ Idempotent: declaring the same pull request twice is a no-op.
|
|
|
4935
4990
|
needs your own login; an agent session or a factory key is refused.
|
|
4936
4991
|
`
|
|
4937
4992
|
).action(async (number, opts) => {
|
|
4938
|
-
const { runWorkPr, WorkPrCommandError } = await import('./work-pr-cmd-
|
|
4993
|
+
const { runWorkPr, WorkPrCommandError } = await import('./work-pr-cmd-D3PJJQOX.js');
|
|
4939
4994
|
try {
|
|
4940
4995
|
await runWorkPr({ ...opts, number });
|
|
4941
4996
|
} catch (err) {
|
|
@@ -4960,8 +5015,8 @@ login, then declares the pull request on the item, as \`work pr\` does.
|
|
|
4960
5015
|
Run it again after a change to the title or description.
|
|
4961
5016
|
`
|
|
4962
5017
|
).action(async (opts) => {
|
|
4963
|
-
const { runWorkOpenPr, WorkOpenPrCommandError } = await import('./work-open-pr-cmd-
|
|
4964
|
-
const { WorkCommandError } = await import('./work-cmd-
|
|
5018
|
+
const { runWorkOpenPr, WorkOpenPrCommandError } = await import('./work-open-pr-cmd-5CDP6KOF.js');
|
|
5019
|
+
const { WorkCommandError } = await import('./work-cmd-3G26E3NL.js');
|
|
4965
5020
|
try {
|
|
4966
5021
|
await runWorkOpenPr(opts);
|
|
4967
5022
|
} catch (err) {
|
|
@@ -4978,7 +5033,7 @@ function registerRunnerCommands(program2) {
|
|
|
4978
5033
|
const configOption = "the cloud config file to run against (default: ~/.outerlayer/config.json)";
|
|
4979
5034
|
runnerCmd.command("start").description("Run the loop: claim work, run it, report, clean up, repeat").option("--config <path>", configOption).action(async (opts) => {
|
|
4980
5035
|
const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-3JRFDYZL.js');
|
|
4981
|
-
const { start, RunnerStartError } = await import('./loop-
|
|
5036
|
+
const { start, RunnerStartError } = await import('./loop-NUW7SSZY.js');
|
|
4982
5037
|
const { RunnerAlreadyRunningError } = await import('./pidfile-BMFAUQAI.js');
|
|
4983
5038
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
4984
5039
|
try {
|
|
@@ -4997,8 +5052,8 @@ function registerRunnerCommands(program2) {
|
|
|
4997
5052
|
"\nReads OUTERLAYER_URL, OUTERLAYER_APP_ID, OUTERLAYER_API_KEY, OUTERLAYER_RUNNER_NAME and one Claude credential\n(CLAUDE_CODE_OAUTH_TOKEN or ANTHROPIC_API_KEY) 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"
|
|
4998
5053
|
).action(async () => {
|
|
4999
5054
|
const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-3JRFDYZL.js');
|
|
5000
|
-
const { containerStart } = await import('./container-start-
|
|
5001
|
-
const { start, RunnerStartError } = await import('./loop-
|
|
5055
|
+
const { containerStart } = await import('./container-start-DP3N72CK.js');
|
|
5056
|
+
const { start, RunnerStartError } = await import('./loop-NUW7SSZY.js');
|
|
5002
5057
|
const { RunnerAlreadyRunningError } = await import('./pidfile-BMFAUQAI.js');
|
|
5003
5058
|
try {
|
|
5004
5059
|
const result = await containerStart({
|
|
@@ -5018,7 +5073,7 @@ function registerRunnerCommands(program2) {
|
|
|
5018
5073
|
});
|
|
5019
5074
|
runnerCmd.command("check").description("Validate the config, the hooks and the key, and print the effective settings").option("--config <path>", configOption).action(async (opts) => {
|
|
5020
5075
|
const { defaultRunnerConfigPath } = await import('./config-3JRFDYZL.js');
|
|
5021
|
-
const { runRunnerCheck } = await import('./check-
|
|
5076
|
+
const { runRunnerCheck } = await import('./check-3TQJDGKM.js');
|
|
5022
5077
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
5023
5078
|
const result = await runRunnerCheck(configPath);
|
|
5024
5079
|
if (!result.ok) {
|
|
@@ -5052,7 +5107,7 @@ function registerRunnerCommands(program2) {
|
|
|
5052
5107
|
}
|
|
5053
5108
|
try {
|
|
5054
5109
|
if (opts.service === true) {
|
|
5055
|
-
const { installServiceCommand } = await import('./command-
|
|
5110
|
+
const { installServiceCommand } = await import('./command-RFVCDSJV.js');
|
|
5056
5111
|
const result2 = await installServiceCommand({
|
|
5057
5112
|
configPath,
|
|
5058
5113
|
print: opts.print,
|
|
@@ -5108,7 +5163,7 @@ To keep it running, run ${C.yellow}${cliInvocation()} runner install --service${
|
|
|
5108
5163
|
return;
|
|
5109
5164
|
}
|
|
5110
5165
|
const { defaultRunnerConfigPath } = await import('./config-3JRFDYZL.js');
|
|
5111
|
-
const { uninstallServiceCommand } = await import('./command-
|
|
5166
|
+
const { uninstallServiceCommand } = await import('./command-RFVCDSJV.js');
|
|
5112
5167
|
const result = await uninstallServiceCommand({ configPath: opts.config ?? defaultRunnerConfigPath(), unitName: opts.unitName, home: homeFromEnv() });
|
|
5113
5168
|
if (result.ok) for (const line of result.lines) process.stdout.write(`${C.green}\u2713${C.reset} ${line}
|
|
5114
5169
|
`);
|
|
@@ -5136,10 +5191,10 @@ already in claude.env is used.
|
|
|
5136
5191
|
`
|
|
5137
5192
|
).action(async (opts) => {
|
|
5138
5193
|
const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-3JRFDYZL.js');
|
|
5139
|
-
const { prepareRunnerInit, runRunnerInit, RunnerInitError, writeRunnerInit } = await import('./init-
|
|
5140
|
-
const { obtainRunnerKey, runnerKeyLogin } = await import('./runner-key-
|
|
5141
|
-
const { detectMachine } = await import('./machine-
|
|
5142
|
-
const { chooseVm, runVmInit, VmInitError } = await import('./init-
|
|
5194
|
+
const { prepareRunnerInit, runRunnerInit, RunnerInitError, writeRunnerInit } = await import('./init-QDUIHSTK.js');
|
|
5195
|
+
const { obtainRunnerKey, runnerKeyLogin } = await import('./runner-key-YHAJFEGN.js');
|
|
5196
|
+
const { detectMachine } = await import('./machine-BJ7TT3B7.js');
|
|
5197
|
+
const { chooseVm, runVmInit, VmInitError } = await import('./init-CHWFDK23.js');
|
|
5143
5198
|
const { AGENT_COMMANDS, credentialFromStdin, isAgentName, restartForCredential, RunnerEnvError } = await import('./runner-env-66RAFIDJ.js');
|
|
5144
5199
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
5145
5200
|
if (opts.agent !== void 0 && !isAgentName(opts.agent)) {
|
|
@@ -5154,7 +5209,7 @@ already in claude.env is used.
|
|
|
5154
5209
|
try {
|
|
5155
5210
|
let credential;
|
|
5156
5211
|
if (agent !== void 0) {
|
|
5157
|
-
const { readPipedKey } = await import('./login-browser-
|
|
5212
|
+
const { readPipedKey } = await import('./login-browser-KP7YVYTN.js');
|
|
5158
5213
|
credential = credentialFromStdin(
|
|
5159
5214
|
await readPipedKey(process.stdin, {
|
|
5160
5215
|
onWaiting: () => process.stderr.write(`runner init is waiting for Claude's credential on stdin; close stdin to use the one already in claude.env
|
|
@@ -5290,7 +5345,7 @@ ${C.yellow}The runner will not update itself: ${installErr.message}${C.reset}
|
|
|
5290
5345
|
let serviceUp = false;
|
|
5291
5346
|
let restart;
|
|
5292
5347
|
if (installedLayout) {
|
|
5293
|
-
const { installServiceCommand } = await import('./command-
|
|
5348
|
+
const { installServiceCommand } = await import('./command-RFVCDSJV.js');
|
|
5294
5349
|
const service = await installServiceCommand({
|
|
5295
5350
|
configPath,
|
|
5296
5351
|
entryPath: process.argv[1] ?? "",
|
|
@@ -5335,10 +5390,10 @@ Next:
|
|
|
5335
5390
|
"\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"
|
|
5336
5391
|
).action(async (opts) => {
|
|
5337
5392
|
const { defaultRunnerConfigPath } = await import('./config-3JRFDYZL.js');
|
|
5338
|
-
const { buildRepositoryImage, RecipeError } = await import('./build-
|
|
5393
|
+
const { buildRepositoryImage, RecipeError } = await import('./build-HU24C46Z.js');
|
|
5339
5394
|
const { currentCliBuild } = await import('./cli-build-K56DK4DS.js');
|
|
5340
|
-
const { createDockerHost } = await import('./docker-
|
|
5341
|
-
const { builderSpec } = await import('./builder-
|
|
5395
|
+
const { createDockerHost } = await import('./docker-6G6IF4YO.js');
|
|
5396
|
+
const { builderSpec } = await import('./builder-VFREWHZA.js');
|
|
5342
5397
|
const { loadRunnerConfig } = await import('./config-3JRFDYZL.js');
|
|
5343
5398
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
5344
5399
|
const loaded = (() => {
|
|
@@ -5350,11 +5405,11 @@ Next:
|
|
|
5350
5405
|
})();
|
|
5351
5406
|
const memory = loaded?.build?.memory ?? "8g";
|
|
5352
5407
|
try {
|
|
5353
|
-
const { ensureRunnerIdentity } = await import('./runner-identity-
|
|
5408
|
+
const { ensureRunnerIdentity } = await import('./runner-identity-FL67WQIA.js');
|
|
5354
5409
|
await ensureRunnerIdentity(configPath, { log: (line) => console.error(line) }).catch((err) => {
|
|
5355
5410
|
console.error(`the runner's Docker identity could not be stored: ${err instanceof Error ? err.message : String(err)}`);
|
|
5356
5411
|
});
|
|
5357
|
-
const { imageTargetFor } = await import('./governing-source-
|
|
5412
|
+
const { imageTargetFor } = await import('./governing-source-DYJQCHKU.js');
|
|
5358
5413
|
const target = await imageTargetFor({ config: loaded, repository: opts.repository, fetchImpl: fetch });
|
|
5359
5414
|
if (!target.ok) {
|
|
5360
5415
|
if (opts.json) {
|
|
@@ -5418,7 +5473,7 @@ Next:
|
|
|
5418
5473
|
});
|
|
5419
5474
|
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) => {
|
|
5420
5475
|
const { defaultRunnerConfigPath } = await import('./config-3JRFDYZL.js');
|
|
5421
|
-
const { requestStop } = await import('./loop-
|
|
5476
|
+
const { requestStop } = await import('./loop-NUW7SSZY.js');
|
|
5422
5477
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
5423
5478
|
const { runnerImageVersion } = await import('./image-tag-NM2YT2J2.js');
|
|
5424
5479
|
await requestStop(configPath, Boolean(opts.now), void 0, { image: runnerImageVersion() !== void 0 });
|
|
@@ -5426,8 +5481,8 @@ Next:
|
|
|
5426
5481
|
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) => {
|
|
5427
5482
|
const { defaultRunnerConfigPath, loadRunnerConfig } = await import('./config-3JRFDYZL.js');
|
|
5428
5483
|
const { jobsDir, runnerDir } = await import('./paths-OK2EZS7W.js');
|
|
5429
|
-
const { listJobFiles, runnerProcessState } = await import('./loop-
|
|
5430
|
-
const { renderStatus } = await import('./status-
|
|
5484
|
+
const { listJobFiles, runnerProcessState } = await import('./loop-NUW7SSZY.js');
|
|
5485
|
+
const { renderStatus } = await import('./status-QWLX2CCV.js');
|
|
5431
5486
|
const { readHousekeepingRecord } = await import('./record-26AH6WDB.js');
|
|
5432
5487
|
const path2 = await import('path');
|
|
5433
5488
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
@@ -5487,7 +5542,7 @@ Next:
|
|
|
5487
5542
|
});
|
|
5488
5543
|
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) => {
|
|
5489
5544
|
const { defaultRunnerConfigPath } = await import('./config-3JRFDYZL.js');
|
|
5490
|
-
const { listJobFiles } = await import('./loop-
|
|
5545
|
+
const { listJobFiles } = await import('./loop-NUW7SSZY.js');
|
|
5491
5546
|
const { newestAttempt, logPathFor, tail, RunnerLogsError } = await import('./logs-C3RJ3ZTC.js');
|
|
5492
5547
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
5493
5548
|
const item = parseTrackerNumber(itemArg);
|