@outerlayer/cli 0.22.2 → 0.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -0
- package/README.md +4 -0
- package/dist/agent-setup-QQYRBPK2.js +30 -0
- package/dist/{artifact-link-cmd-OWRI5AJX.js → artifact-link-cmd-LEI6EOZE.js} +2 -2
- package/dist/{bridge-QFN3KJP6.js → bridge-4ZARDVGS.js} +2 -2
- package/dist/{build-6WRNZPVR.js → build-OVZIT2G2.js} +5 -5
- package/dist/build-info.json +1 -1
- package/dist/{builder-G3MLDMTI.js → builder-MECDEKXX.js} +6 -6
- package/dist/{check-N6WLZCER.js → check-YYKNYFNI.js} +46 -44
- package/dist/{chunk-IPS2JCHK.js → chunk-5ECUMU53.js} +7 -7
- package/dist/{chunk-XR56WEA5.js → chunk-5XCAPBE2.js} +4 -4
- package/dist/{chunk-KOIMUHIS.js → chunk-6GSA2SKT.js} +20 -20
- package/dist/{chunk-HWZCE745.js → chunk-755WXDBI.js} +2 -2
- package/dist/{chunk-SFHR45FA.js → chunk-A62QFN2M.js} +3 -3
- package/dist/{chunk-URWYRAIC.js → chunk-BN3CSI7S.js} +0 -2
- package/dist/{chunk-ZCXP35T3.js → chunk-BOQY756V.js} +9 -8
- package/dist/{chunk-BVR6MQLS.js → chunk-BUBCPP3F.js} +3 -3
- package/dist/{chunk-G3IJ3N6F.js → chunk-BUP5N3X6.js} +1 -1
- package/dist/{chunk-WXJXHZVB.js → chunk-CZUH2SLQ.js} +1 -1
- package/dist/{chunk-AEKSX4EY.js → chunk-D4AMAEZ7.js} +13 -12
- package/dist/{chunk-U6RKHNC7.js → chunk-D7K446H6.js} +8 -8
- package/dist/{chunk-V5CG75NX.js → chunk-D7X5ITVT.js} +1 -1
- package/dist/{chunk-OBCFK4QD.js → chunk-DG2ULWM6.js} +2 -2
- package/dist/{chunk-SNVXHNU7.js → chunk-E4OUL7ZP.js} +5 -5
- package/dist/{chunk-B42BIYC6.js → chunk-F2W2IYNP.js} +3 -3
- package/dist/{chunk-JD6GWYY7.js → chunk-F7Y2USIM.js} +5 -5
- package/dist/{chunk-QS43O4DR.js → chunk-FKXGQOF5.js} +1 -1
- package/dist/{chunk-JV4YGAAW.js → chunk-FQPN5S4Q.js} +4 -4
- package/dist/{chunk-XACXXKQ5.js → chunk-FWEWFW3F.js} +1 -1
- package/dist/{chunk-WKSBSEWT.js → chunk-GU4PKXN7.js} +13 -13
- package/dist/{chunk-2CPOAPU4.js → chunk-H6IUKXXI.js} +90 -24
- package/dist/{chunk-5OCIHFGE.js → chunk-HBISTTG3.js} +32 -23
- package/dist/{chunk-EFB3FGLC.js → chunk-HHXBOTRO.js} +1 -1
- package/dist/chunk-IDSHLKQA.js +66 -0
- package/dist/chunk-JKNYTNYD.js +151 -0
- package/dist/{chunk-IHNQWF6F.js → chunk-KF37SUDM.js} +1 -1
- package/dist/{chunk-4AVDD7VX.js → chunk-LBCZXXOX.js} +2 -2
- package/dist/{chunk-NYTZ7HVN.js → chunk-LY2L3O2O.js} +1 -1
- package/dist/{chunk-USWVXQIH.js → chunk-MQ743JX3.js} +3 -3
- package/dist/{chunk-CQAEV3Z5.js → chunk-NGZID7UI.js} +1 -1
- package/dist/{chunk-UF5L4BAI.js → chunk-NTQTDCYR.js} +1 -1
- package/dist/{chunk-2Q3PZ42G.js → chunk-PDIM5T65.js} +1 -1
- package/dist/{chunk-OW52QLK3.js → chunk-PVRBE7S4.js} +1 -1
- package/dist/{chunk-7VUK5RFS.js → chunk-QZBXLLTV.js} +36 -1
- package/dist/{chunk-WFSUUUAN.js → chunk-RKOTJQVG.js} +1 -1
- package/dist/{chunk-FQE5RDHI.js → chunk-RVYOOYOA.js} +7 -7
- package/dist/{chunk-IMCVQF5F.js → chunk-TQ6Y7YV6.js} +6 -6
- package/dist/{chunk-I2UOAV7X.js → chunk-TQMI335S.js} +4 -1
- package/dist/{chunk-3AZYLAJC.js → chunk-TTLVQZSH.js} +4 -4
- package/dist/{chunk-EMUNEAQK.js → chunk-V5Q3S4NM.js} +19 -7
- package/dist/{chunk-FVDVC2GF.js → chunk-VBEXKEBV.js} +1 -1
- package/dist/{chunk-V7SAQ645.js → chunk-VJBFQP3H.js} +21 -12
- package/dist/{chunk-ZNPE7FW5.js → chunk-VPEGE3QZ.js} +1 -1
- package/dist/{chunk-276D7BJ7.js → chunk-VV7ZD5LR.js} +1 -1
- package/dist/{chunk-W3SWJ2TD.js → chunk-VWFOKRYS.js} +5 -2
- package/dist/{chunk-4542B3RR.js → chunk-W7O4LA4E.js} +3 -3
- package/dist/{chunk-4OYKJJ2V.js → chunk-WH2QV3UL.js} +86 -6
- package/dist/{chunk-XCRZTXRL.js → chunk-WX2WEERU.js} +63 -43
- package/dist/{chunk-VSUXCMMH.js → chunk-XFGL53GU.js} +51 -33
- package/dist/{chunk-EAQSOE62.js → chunk-XSPA5ODY.js} +21 -19
- package/dist/{chunk-QZX6DAAW.js → chunk-ZFLOFAUG.js} +11 -11
- package/dist/{claude-launcher-QD3C427Y.js → claude-launcher-JCPSHDZQ.js} +5 -5
- package/dist/{cli-A2Y67WAB.js → cli-ZTBH3FBG.js} +173 -137
- package/dist/{command-Q5Q2EIO4.js → command-DO4TERRT.js} +34 -33
- package/dist/{config-H4QS332G.js → config-7Z5DHSGY.js} +2 -2
- package/dist/connect-cmd-NY5LIKVC.js +25 -0
- package/dist/container-start-OHBUZEJJ.js +170 -0
- package/dist/{context-cleanup-DSA3HGQU.js → context-cleanup-LTH77FC3.js} +3 -3
- package/dist/{control-plane-launch-HE6OSWKO.js → control-plane-launch-GKGI6HJA.js} +11 -11
- package/dist/{dist-7IH56ELA.js → dist-2APO44JG.js} +2 -2
- package/dist/{docker-JU422JL7.js → docker-RKGBJESN.js} +6 -6
- package/dist/{doctor-BRN4BGMA.js → doctor-DOAFZV4O.js} +47 -34
- package/dist/{emit-artifact-cmd-GPAJCCUC.js → emit-artifact-cmd-VZHIDPXQ.js} +18 -15
- package/dist/emit-cmd-WQH2NK7H.js +15 -0
- package/dist/{emit-criteria-cmd-R3FKHSQG.js → emit-criteria-cmd-SYLBCWHW.js} +15 -12
- package/dist/{emit-finding-cmd-IK7RAVP5.js → emit-finding-cmd-52M43NPC.js} +15 -12
- package/dist/{emit-result-cmd-5FJTF7YD.js → emit-result-cmd-BTMTGDAV.js} +18 -15
- package/dist/{emit-step-cmd-VRTD5YPP.js → emit-step-cmd-6XTJITZT.js} +16 -13
- package/dist/{exec-client-ATPF2DDB.js → exec-client-CKPK62K2.js} +3 -3
- package/dist/governing-source-GWN7GVEN.js +35 -0
- package/dist/{guest-init-2OZ4YC7R.js → guest-init-ZBL5CN7Y.js} +4 -4
- package/dist/{hook-fast-QUGEI2IT.js → hook-fast-3JL4PXLG.js} +1 -1
- package/dist/{host-key-ATB23GI3.js → host-key-W2DLZGZ7.js} +3 -3
- package/dist/image-tag-AO4RBAKW.js +10 -0
- package/dist/{import-capture-cmd-Q56DDZVO.js → import-capture-cmd-TCOKNVBM.js} +12 -7
- package/dist/{import-ruler-cmd-T6LLO6Q7.js → import-ruler-cmd-VJOHOJQ7.js} +2 -2
- package/dist/index.js +4 -4
- package/dist/{init-X7FCQDFX.js → init-EQTR7AEF.js} +32 -31
- package/dist/init-TSQ3EOQW.js +52 -0
- package/dist/{init-cmd-VCKH2DUQ.js → init-cmd-AF2MH36A.js} +24 -23
- package/dist/init-update-SHISHMXV.js +555 -0
- package/dist/{install-SFACZU7E.js → install-ORQC26ZE.js} +4 -4
- package/dist/{install-cmd-6HTP7I43.js → install-cmd-4LA3UJZ4.js} +6 -6
- package/dist/layout-UOJQGEPW.js +10 -0
- package/dist/{login-browser-BN5UKPHS.js → login-browser-4OMZFP3U.js} +4 -3
- package/dist/{logout-cmd-RZFWTNYD.js → logout-cmd-5V5MMBSY.js} +2 -2
- package/dist/{logs-N3ZX7HFV.js → logs-5EPHIPZB.js} +2 -2
- package/dist/loop-4WUCS5JP.js +77 -0
- package/dist/machine-6UNLIPLE.js +47 -0
- package/dist/{mcp-install-cmd-GD4QUP7Z.js → mcp-install-cmd-GGWB3JJ2.js} +2 -2
- package/dist/{mcp-serve-cmd-TQSPFRC7.js → mcp-serve-cmd-KMWEKM7C.js} +5 -5
- package/dist/{paths-AKX2OOLF.js → paths-XY5ADO32.js} +2 -2
- package/dist/{pending-7SGWZCEH.js → pending-35J3ZPLR.js} +3 -3
- package/dist/{pidfile-G2J5WBQS.js → pidfile-OJ7RP4Q2.js} +3 -3
- package/dist/{record-Q4IEYIVV.js → record-BEJB4J7N.js} +3 -3
- package/dist/{runner-env-GZHXM27A.js → runner-env-ZJWJOJKQ.js} +5 -5
- package/dist/{runner-identity-FTHZFMGY.js → runner-identity-2OOUJSFJ.js} +6 -6
- package/dist/{runner-key-O42EUXQU.js → runner-key-WDFBSJRX.js} +32 -31
- package/dist/{session-sender-HF6DXFA2.js → session-sender-X3BBQZMF.js} +19 -16
- package/dist/{spec-cmd-ADPH236D.js → spec-cmd-QRF5YXKK.js} +16 -13
- package/dist/{starter-pack-5EQYGSJF.js → starter-pack-55EFILC5.js} +7 -4
- package/dist/{status-LXFIVGP3.js → status-ZCAAF6MD.js} +43 -34
- package/dist/{sync-cmd-5XS3CUV5.js → sync-cmd-UQK3RYAC.js} +18 -15
- package/dist/{watch-FBZHZV56.js → watch-MOQ3GQTE.js} +18 -15
- package/dist/{work-claim-cmd-LIIINECF.js → work-claim-cmd-RT343CLA.js} +19 -16
- package/dist/{work-cmd-SM6DY2WK.js → work-cmd-APXSER2D.js} +16 -13
- package/dist/{work-comment-cmd-VYVXGT4W.js → work-comment-cmd-AT5NUYUU.js} +16 -13
- package/dist/{work-logs-cmd-XZSCWWMW.js → work-logs-cmd-Z5DMNEJP.js} +16 -13
- package/dist/{work-open-pr-cmd-YZNC3P3R.js → work-open-pr-cmd-ZTS6MJHL.js} +17 -14
- package/dist/{work-pr-cmd-AMN23KFJ.js → work-pr-cmd-IWZCC3WH.js} +16 -13
- package/dist/{work-stop-cmd-HSR2GOJJ.js → work-stop-cmd-DCAWFDZC.js} +16 -13
- package/package.json +1 -1
- package/skill-pack/maintained/outerlayer-build/references/agent-briefs.md +7 -1
- package/skill-pack/maintained/outerlayer-build/references/criteria-judge.md +10 -0
- package/skill-pack/maintained/outerlayer-build/references/review-briefs.md +4 -0
- package/skill-pack/maintained/outerlayer-cli/SKILL.md +5 -3
- package/dist/agent-setup-KXPDPTAJ.js +0 -27
- package/dist/connect-cmd-TNGEIWCA.js +0 -22
- package/dist/emit-cmd-3W5IO5ET.js +0 -14
- package/dist/governing-source-WM736XR4.js +0 -34
- package/dist/init-U3I43XCP.js +0 -51
- package/dist/init-update-TCMH7M3Q.js +0 -210
- package/dist/loop-P3QDQOE5.js +0 -75
- package/dist/machine-EEFOW32K.js +0 -46
- package/dist/{chunk-F35VMF5M.js → chunk-GOSFARMS.js} +1 -1
- package/dist/{chunk-DIB2WLBL.js → chunk-YVZJ6GKF.js} +1 -1
|
@@ -1,40 +1,41 @@
|
|
|
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
|
|
6
|
-
import './chunk-
|
|
7
|
-
import './chunk-
|
|
8
|
-
import './chunk-
|
|
9
|
-
import './chunk-
|
|
10
|
-
import './chunk-
|
|
11
|
-
import './chunk-
|
|
12
|
-
import './chunk-
|
|
13
|
-
import
|
|
3
|
+
import { gatherDoctorChecks, doctorExitCode, summarizeChecks, renderDoctorText, recordWrapped, recordUnwrapped, recordRemoval, readManifest, recordInstall, recordStatusline } from './chunk-ZFLOFAUG.js';
|
|
4
|
+
import './chunk-XFGL53GU.js';
|
|
5
|
+
import './chunk-VJBFQP3H.js';
|
|
6
|
+
import { verifiedTrackerNames, TRACKERS } from './chunk-RVYOOYOA.js';
|
|
7
|
+
import './chunk-F2W2IYNP.js';
|
|
8
|
+
import './chunk-V5Q3S4NM.js';
|
|
9
|
+
import './chunk-BUP5N3X6.js';
|
|
10
|
+
import './chunk-XSPA5ODY.js';
|
|
11
|
+
import './chunk-GOSFARMS.js';
|
|
12
|
+
import './chunk-MQ743JX3.js';
|
|
13
|
+
import './chunk-FKXGQOF5.js';
|
|
14
|
+
import { hookFiredMarkerPath, installedCliDistDir } from './chunk-755WXDBI.js';
|
|
14
15
|
import './chunk-ZJSNLVCE.js';
|
|
15
16
|
import './chunk-DXDF43YG.js';
|
|
16
17
|
import './chunk-BKO6JEZI.js';
|
|
17
18
|
import './chunk-HCVLP7XA.js';
|
|
18
19
|
import { findGitDirs } from './chunk-BJ3KTMDH.js';
|
|
19
|
-
import './chunk-
|
|
20
|
-
import './chunk-
|
|
21
|
-
import './chunk-EABW6AJQ.js';
|
|
22
|
-
import './chunk-V7SAQ645.js';
|
|
23
|
-
import './chunk-5OCIHFGE.js';
|
|
20
|
+
import './chunk-D4AMAEZ7.js';
|
|
21
|
+
import './chunk-YVZJ6GKF.js';
|
|
24
22
|
import { C, warnDeprecated, API_KEY_FLAG_DEPRECATION, NO_COLOR_FLAG, stripNoColor } from './chunk-ANPNT6PM.js';
|
|
23
|
+
import './chunk-EABW6AJQ.js';
|
|
24
|
+
import { FIRST_VERSION_READING_AGENTS_SKILLS } from './chunk-JKNYTNYD.js';
|
|
25
|
+
import './chunk-HBISTTG3.js';
|
|
25
26
|
import { parseTrackerNumber, trackerNumberError } from './chunk-WZBHBH3J.js';
|
|
26
27
|
import { cliInvocation, packageRunnerOf } from './chunk-CRB3POP4.js';
|
|
27
28
|
import { settingsPath, readSettings, SettingsParseError, listHookCandidates, wrapHooks, writeSettings, unwrapHooks, REGISTERED_EVENTS, cliCommand, removeHooks, removeStatusline, cliBinResolvable, mergeHooks, repointWrappedHooks, AUTO_WRAP_EVENTS, mergeStatusline } from './chunk-GNPTU4BM.js';
|
|
28
|
-
import './chunk-
|
|
29
|
+
import './chunk-VWFOKRYS.js';
|
|
29
30
|
import { cloneIsGoverned } from './chunk-YQR6E6OV.js';
|
|
30
31
|
import { removeJournalHooks, removePreCommitGuardHook } from './chunk-TUSYOL2O.js';
|
|
31
|
-
import './chunk-
|
|
32
|
-
import './chunk-
|
|
32
|
+
import './chunk-RKOTJQVG.js';
|
|
33
|
+
import './chunk-QZBXLLTV.js';
|
|
33
34
|
import { homeFromEnv } from './chunk-VNVZDWO3.js';
|
|
34
35
|
import { resolveVersion } from './chunk-RA3O54FC.js';
|
|
35
|
-
import './chunk-
|
|
36
|
-
import './chunk-
|
|
37
|
-
import './chunk-
|
|
36
|
+
import './chunk-PVRBE7S4.js';
|
|
37
|
+
import './chunk-KF37SUDM.js';
|
|
38
|
+
import './chunk-BN3CSI7S.js';
|
|
38
39
|
import './chunk-GISNHSYL.js';
|
|
39
40
|
import './chunk-Z5GEFMRW.js';
|
|
40
41
|
import { EventEmitter } from 'events';
|
|
@@ -3650,14 +3651,17 @@ function apiKeyOption() {
|
|
|
3650
3651
|
return new Option("--api-key <key>", `deprecated: use \`${cliInvocation()} login\` or OUTERLAYER_API_KEY`).hideHelp();
|
|
3651
3652
|
}
|
|
3652
3653
|
async function installStarterPackInRepo() {
|
|
3653
|
-
const { installStarterPack, formatStarterPackOutput } = await import('./starter-pack-
|
|
3654
|
+
const { installStarterPack, formatStarterPackOutput } = await import('./starter-pack-55EFILC5.js');
|
|
3654
3655
|
const cwd = process.cwd();
|
|
3655
3656
|
let repoRoot = cwd;
|
|
3656
3657
|
try {
|
|
3657
3658
|
repoRoot = execFileSync("git", ["rev-parse", "--show-toplevel"], { cwd, encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] }).trim() || cwd;
|
|
3658
3659
|
} catch {
|
|
3659
3660
|
}
|
|
3660
|
-
const
|
|
3661
|
+
const { declareAgentsMdLayout, isAgentsMdLayout, skillsBaseFor } = await import('./layout-UOJQGEPW.js');
|
|
3662
|
+
const fresh = !isAgentsMdLayout(repoRoot) && !existsSync(join(repoRoot, ".outerlayer"));
|
|
3663
|
+
const result = installStarterPack({ repoRoot, base: fresh ? ".agents/skills" : skillsBaseFor(repoRoot) });
|
|
3664
|
+
if (fresh) declareAgentsMdLayout(repoRoot);
|
|
3661
3665
|
return { result, output: formatStarterPackOutput(result) };
|
|
3662
3666
|
}
|
|
3663
3667
|
function formatInitOutput(result, opts = {}) {
|
|
@@ -3780,8 +3784,8 @@ ${starter.output}`),
|
|
|
3780
3784
|
}
|
|
3781
3785
|
}
|
|
3782
3786
|
async function realConnectDepsForCwd() {
|
|
3783
|
-
const { realConnectDeps } = await import('./connect-cmd-
|
|
3784
|
-
const { resolveRepoIdentity } = await import('./dist-
|
|
3787
|
+
const { realConnectDeps } = await import('./connect-cmd-NY5LIKVC.js');
|
|
3788
|
+
const { resolveRepoIdentity } = await import('./dist-2APO44JG.js');
|
|
3785
3789
|
return {
|
|
3786
3790
|
...realConnectDeps(),
|
|
3787
3791
|
home: homeFromEnv(),
|
|
@@ -3799,7 +3803,7 @@ function buildProgram(argv = process.argv) {
|
|
|
3799
3803
|
program2.name(cliInvocation()).description("OuterLayer \u2014 see what your coding agents actually do").enablePositionalOptions().version(resolveVersion()).hook("preAction", (_root, command) => {
|
|
3800
3804
|
if (command.opts().apiKey !== void 0) warnDeprecated(API_KEY_FLAG_DEPRECATION);
|
|
3801
3805
|
}).option(NO_COLOR_FLAG, "disable color (NO_COLOR=1 does the same)").addHelpText("after", SUPPORT_TEXT);
|
|
3802
|
-
program2.command("init").description("Connect this repository, install hooks and agent skills, run doctor").option("--user", "install into user settings [default]").option("--project", "install into project settings (./.claude/settings.json)").option("--org", "print a managed-settings.json snippet for MDM/GPO rollout").option("--remove", "uninstall OuterLayer hooks").option("--local", "install the hooks only: no connect step and no network call").option("--factory <org/factory>", `the factory to connect this repository to (see \`${cliInvocation()} connect\`)`).option("--gitignore", "also add .outerlayer/ to .gitignore (project scope)").option("--template <name>", "install the starter skills and a policy file (only: default)").option("--update", "update the files init wrote that you have not edited, and write missing ones").option("--dry-run", "with --update: print the plan and write nothing").option("--no-wrap-hooks", "leave PreToolUse/PostToolUse hooks unwrapped").option("--statusline", "install the status-line segment [default]").option("--no-statusline", "leave the statusLine slot untouched").option("--shell-function", "make plain claude run `outerlayer claude` (edits ~/.zshrc or ~/.bashrc)").option("--no-shell-function", "do not set up the shell function, and remove it if it is there").option("--json", "machine-readable JSON output").addHelpText(
|
|
3806
|
+
program2.command("init").description("Connect this repository, install hooks and agent skills, run doctor").option("--user", "install into user settings [default]").option("--project", "install into project settings (./.claude/settings.json)").option("--org", "print a managed-settings.json snippet for MDM/GPO rollout").option("--remove", "uninstall OuterLayer hooks").option("--local", "install the hooks only: no connect step and no network call").option("--factory <org/factory>", `the factory to connect this repository to (see \`${cliInvocation()} connect\`)`).option("--gitignore", "also add .outerlayer/ to .gitignore (project scope)").option("--template <name>", "install the starter skills and a policy file (only: default)").option("--update", "update the files init wrote that you have not edited, and write missing ones").option("--dry-run", "with --update: print the plan and write nothing").option("--no-skills-link", "do not link .claude/skills to .agents/skills").option("--control-plane", "with --update: this is a control plane; older CLIs keep .claude/skills/").option("--no-wrap-hooks", "leave PreToolUse/PostToolUse hooks unwrapped").option("--statusline", "install the status-line segment [default]").option("--no-statusline", "leave the statusLine slot untouched").option("--shell-function", "make plain claude run `outerlayer claude` (edits ~/.zshrc or ~/.bashrc)").option("--no-shell-function", "do not set up the shell function, and remove it if it is there").option("--json", "machine-readable JSON output").addHelpText(
|
|
3803
3807
|
"after",
|
|
3804
3808
|
`
|
|
3805
3809
|
In a repository, init runs four steps: connect the repository to a
|
|
@@ -3810,20 +3814,20 @@ login it skips the connect step and says to run \`${cliInvocation()} login\`. Wi
|
|
|
3810
3814
|
skipped or failed. The exit code is 1 when a step failed.
|
|
3811
3815
|
|
|
3812
3816
|
The agent setup step installs the starter skills and the \`outerlayer\` skill
|
|
3813
|
-
into .
|
|
3814
|
-
|
|
3815
|
-
.claude/skills
|
|
3816
|
-
.mcp.json. Nothing
|
|
3817
|
-
|
|
3818
|
-
|
|
3819
|
-
|
|
3817
|
+
into .agents/skills/, writes AGENTS.md when there is no AGENTS.md or
|
|
3818
|
+
CLAUDE.md, writes .outerlayer/config.json with "layout": 2 when there is
|
|
3819
|
+
none, links .claude/skills to ../.agents/skills, and adds the outerlayer and
|
|
3820
|
+
outerlayer-docs MCP servers to .mcp.json. Nothing is generated, so nothing
|
|
3821
|
+
needs \`` + cliInvocation() + ` context emit\`. --no-skills-link leaves out the link.
|
|
3822
|
+
Nothing you wrote is changed. A repository still in the earlier layout keeps
|
|
3823
|
+
its files in .outerlayer/ and is compiled as before until --update moves it.
|
|
3824
|
+
The files are left uncommitted.
|
|
3820
3825
|
The step is skipped outside a git repository and in a repository whose
|
|
3821
3826
|
context comes from a control plane, where it arrives at session start.
|
|
3822
3827
|
|
|
3823
3828
|
--local installs only the hooks: no connect step, no agent setup and no
|
|
3824
3829
|
network call. Add \`--template default\` to also write the starter skills and
|
|
3825
|
-
a policy file
|
|
3826
|
-
emit\` does that.
|
|
3830
|
+
a policy file, with nothing to compile.
|
|
3827
3831
|
|
|
3828
3832
|
Idempotent: settings are backed up before any write, and a second run
|
|
3829
3833
|
changes nothing. Wrapping adds one spawn per hook firing; undo it with
|
|
@@ -3831,26 +3835,29 @@ changes nothing. Wrapping adds one spawn per hook firing; undo it with
|
|
|
3831
3835
|
replaced.
|
|
3832
3836
|
|
|
3833
3837
|
Three of the starter skills are copied once and are yours to edit. The
|
|
3834
|
-
others are rewritten from this CLI
|
|
3838
|
+
others are rewritten from this CLI by \`init --update\`, or by \`context emit\`
|
|
3839
|
+
in a repository that has not moved.
|
|
3835
3840
|
|
|
3836
|
-
--update
|
|
3837
|
-
|
|
3838
|
-
|
|
3839
|
-
|
|
3840
|
-
|
|
3841
|
+
--update first moves a repository in the earlier layout to AGENTS.md,
|
|
3842
|
+
.agents/skills/ and .mcp.json: it removes each file that holds exactly what
|
|
3843
|
+
\`` + cliInvocation() + ` context emit\` writes, moves the sources, links .claude/skills
|
|
3844
|
+
and sets "layout": 2. A file you edited is kept and listed. It then brings
|
|
3845
|
+
the files init wrote once up to this CLI's version: the template skills, the
|
|
3846
|
+
policy, the two starter checks and the two MCP entries. A file still equal
|
|
3847
|
+
to a version an earlier release wrote is replaced, and a missing one is
|
|
3848
|
+
written. A file you edited is never touched. The changes are left
|
|
3841
3849
|
uncommitted. --dry-run prints the plan, with a command to compare each
|
|
3842
|
-
edited file, and writes nothing.
|
|
3843
|
-
|
|
3844
|
-
`
|
|
3850
|
+
edited file, and writes nothing. --control-plane makes no link and says
|
|
3851
|
+
what CLIs older than ${FIRST_VERSION_READING_AGENTS_SKILLS} do. \`` + cliInvocation() + " doctor` reports the same\nstates under Starter files.\n"
|
|
3845
3852
|
).action(async (opts) => {
|
|
3846
3853
|
if (opts.update || opts.dryRun) {
|
|
3847
|
-
const { runInitUpdate, formatInitUpdate, updateFlagProblem } = await import('./init-update-
|
|
3854
|
+
const { runInitUpdate, formatInitUpdate, updateFlagProblem } = await import('./init-update-SHISHMXV.js');
|
|
3848
3855
|
const problem = updateFlagProblem(opts);
|
|
3849
3856
|
if (problem !== void 0) {
|
|
3850
3857
|
fail(problem);
|
|
3851
3858
|
return;
|
|
3852
3859
|
}
|
|
3853
|
-
const result = runInitUpdate({ cwd: process.cwd(), dryRun: opts.dryRun === true });
|
|
3860
|
+
const result = runInitUpdate({ cwd: process.cwd(), dryRun: opts.dryRun === true, skillsLink: opts.skillsLink !== false, controlPlane: opts.controlPlane === true });
|
|
3854
3861
|
if (opts.json) writeJson(result);
|
|
3855
3862
|
else process.stdout.write(formatInitUpdate(result));
|
|
3856
3863
|
if (result.status === "failed") process.exitCode = 1;
|
|
@@ -3858,7 +3865,7 @@ states under Starter files.
|
|
|
3858
3865
|
}
|
|
3859
3866
|
let starterTemplate;
|
|
3860
3867
|
if (opts.template !== void 0) {
|
|
3861
|
-
const { assertKnownTemplate, StarterPackError } = await import('./starter-pack-
|
|
3868
|
+
const { assertKnownTemplate, StarterPackError } = await import('./starter-pack-55EFILC5.js');
|
|
3862
3869
|
try {
|
|
3863
3870
|
assertKnownTemplate(opts.template);
|
|
3864
3871
|
} catch (err) {
|
|
@@ -3891,12 +3898,12 @@ states under Starter files.
|
|
|
3891
3898
|
if (changed.length > 0 && !opts.json) process.stdout.write(`Removed the claude function from ${changed.join(", ")}.
|
|
3892
3899
|
`);
|
|
3893
3900
|
}
|
|
3894
|
-
const shell = !opts.remove && opts.shellFunction !== void 0 ? (await import('./init-cmd-
|
|
3901
|
+
const shell = !opts.remove && opts.shellFunction !== void 0 ? (await import('./init-cmd-AF2MH36A.js')).applyShellFunctionFlag(opts.shellFunction, { home: homeFromEnv(), shellPath: process.env.SHELL }) : void 0;
|
|
3895
3902
|
if (opts.json) writeJson(shell === void 0 ? outcome.result : { ...outcome.result, shellFunction: { outcome: shell.outcome, reason: shell.reason } });
|
|
3896
3903
|
else process.stdout.write(outcome.text + (shell?.text ?? ""));
|
|
3897
3904
|
return;
|
|
3898
3905
|
}
|
|
3899
|
-
const { runInitCommand } = await import('./init-cmd-
|
|
3906
|
+
const { runInitCommand } = await import('./init-cmd-AF2MH36A.js');
|
|
3900
3907
|
const code = await runInitCommand(
|
|
3901
3908
|
{ json: opts.json, factory: opts.factory, shellFunction: opts.shellFunction },
|
|
3902
3909
|
{
|
|
@@ -3908,8 +3915,8 @@ states under Starter files.
|
|
|
3908
3915
|
return { ok, text, detail };
|
|
3909
3916
|
},
|
|
3910
3917
|
runAgentSetup: async () => {
|
|
3911
|
-
const { runAgentSetup } = await import('./agent-setup-
|
|
3912
|
-
return runAgentSetup({ cwd: process.cwd() });
|
|
3918
|
+
const { runAgentSetup } = await import('./agent-setup-QQYRBPK2.js');
|
|
3919
|
+
return runAgentSetup({ cwd: process.cwd(), skillsLink: opts.skillsLink !== false });
|
|
3913
3920
|
},
|
|
3914
3921
|
runDoctorChecks: gatherDoctorChecks,
|
|
3915
3922
|
shell: {
|
|
@@ -3917,7 +3924,7 @@ states under Starter files.
|
|
|
3917
3924
|
shellPath: process.env.SHELL,
|
|
3918
3925
|
interactive: Boolean(process.stdin.isTTY && process.stderr.isTTY) && opts.json !== true,
|
|
3919
3926
|
ask: async () => {
|
|
3920
|
-
const { promptOnTerminal } = await import('./connect-cmd-
|
|
3927
|
+
const { promptOnTerminal } = await import('./connect-cmd-NY5LIKVC.js');
|
|
3921
3928
|
const answer = await promptOnTerminal({
|
|
3922
3929
|
message: `Should plain claude start Claude Code through ${cliInvocation()} claude? That is how a session in a governed repository gets its control plane. It adds one block to your zsh or bash startup file.`,
|
|
3923
3930
|
options: [
|
|
@@ -3956,7 +3963,7 @@ linked (true, false, or null when it could not be checked) and, when false,
|
|
|
3956
3963
|
linkUrl.
|
|
3957
3964
|
`
|
|
3958
3965
|
).action(async (opts) => {
|
|
3959
|
-
const { runConnectCommand } = await import('./connect-cmd-
|
|
3966
|
+
const { runConnectCommand } = await import('./connect-cmd-NY5LIKVC.js');
|
|
3960
3967
|
const code = await runConnectCommand({ factory: opts.factory, json: opts.json }, await realConnectDepsForCwd(), {
|
|
3961
3968
|
stdout: process.stdout,
|
|
3962
3969
|
stderr: process.stderr
|
|
@@ -3995,7 +4002,7 @@ Every later command reads the saved file, so none of them needs a key on
|
|
|
3995
4002
|
its command line. A saved key is checked for real on the first \`sync\`.
|
|
3996
4003
|
`
|
|
3997
4004
|
).action(async (opts) => {
|
|
3998
|
-
const { runLoginCommand, realLoginDeps } = await import('./login-browser-
|
|
4005
|
+
const { runLoginCommand, realLoginDeps } = await import('./login-browser-4OMZFP3U.js');
|
|
3999
4006
|
const code = await runLoginCommand(
|
|
4000
4007
|
{
|
|
4001
4008
|
browser: opts.browser !== false,
|
|
@@ -4019,7 +4026,7 @@ dashboard cannot be reached the local copy is still deleted and the exit
|
|
|
4019
4026
|
code is 1: revoke the token on /profile/security.
|
|
4020
4027
|
`
|
|
4021
4028
|
).action(async () => {
|
|
4022
|
-
const { runLogoutCommand, realLogoutDeps } = await import('./logout-cmd-
|
|
4029
|
+
const { runLogoutCommand, realLogoutDeps } = await import('./logout-cmd-5V5MMBSY.js');
|
|
4023
4030
|
const code = await runLogoutCommand(realLogoutDeps());
|
|
4024
4031
|
if (code !== 0) process.exitCode = code;
|
|
4025
4032
|
});
|
|
@@ -4028,13 +4035,13 @@ code is 1: revoke the token on /profile/security.
|
|
|
4028
4035
|
"\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"
|
|
4029
4036
|
).action(async (opts) => {
|
|
4030
4037
|
if (opts.link !== void 0) {
|
|
4031
|
-
const { lookupArtifactLink } = await import('./artifact-link-cmd-
|
|
4038
|
+
const { lookupArtifactLink } = await import('./artifact-link-cmd-LEI6EOZE.js');
|
|
4032
4039
|
const found = lookupArtifactLink(opts.link);
|
|
4033
4040
|
if (found.ok) process.stdout.write(found.url + "\n");
|
|
4034
4041
|
else fail(found.reason);
|
|
4035
4042
|
return;
|
|
4036
4043
|
}
|
|
4037
|
-
const { runSync, SyncConfigError, SyncTransportError } = await import('./sync-cmd-
|
|
4044
|
+
const { runSync, SyncConfigError, SyncTransportError } = await import('./sync-cmd-UQK3RYAC.js');
|
|
4038
4045
|
try {
|
|
4039
4046
|
const result = await runSync({
|
|
4040
4047
|
url: opts.url,
|
|
@@ -4065,7 +4072,7 @@ code is 1: revoke the token on /profile/security.
|
|
|
4065
4072
|
if (invokedCommandToken(argv) === "watch") {
|
|
4066
4073
|
warnDeprecated(`\`${cliInvocation()} watch\` is now \`${cliInvocation()} daemon\`; the old name will be removed in a future release.`);
|
|
4067
4074
|
}
|
|
4068
|
-
const { runWatch } = await import('./watch-
|
|
4075
|
+
const { runWatch } = await import('./watch-MOQ3GQTE.js');
|
|
4069
4076
|
await runWatch({ once: opts.once });
|
|
4070
4077
|
});
|
|
4071
4078
|
program2.command("hook <event>", { hidden: true }).description("capture-hook fast path, installed by `init`").action(() => {
|
|
@@ -4126,7 +4133,7 @@ code is 1: revoke the token on /profile/security.
|
|
|
4126
4133
|
}
|
|
4127
4134
|
});
|
|
4128
4135
|
program2.command("vm-exec", { hidden: true }).description("run a command in a microVM build's guest through its exec agent").requiredOption("--socket <path>", "the Unix socket Firecracker serves the build's vsock device on").option("--user <user>", "the user to run as", "").option("--cwd <dir>", "the working directory", "/").option("--env <NAME=value>", "an environment value the command line carries; repeatable", (value, previous) => [...previous, value], []).option("--pass <NAME>", "an environment variable whose value is read from this process; repeatable", (value, previous) => [...previous, value], []).argument("<argv...>", "the command and its arguments").action(async (argv2, opts) => {
|
|
4129
|
-
const { runVmExec } = await import('./exec-client-
|
|
4136
|
+
const { runVmExec } = await import('./exec-client-CKPK62K2.js');
|
|
4130
4137
|
const env = {};
|
|
4131
4138
|
for (const entry of opts.env) {
|
|
4132
4139
|
const eq = entry.indexOf("=");
|
|
@@ -4155,7 +4162,7 @@ code is 1: revoke the token on /profile/security.
|
|
|
4155
4162
|
process.exitCode = await runBuildCommand({ dir: opts.dir, argv: command });
|
|
4156
4163
|
});
|
|
4157
4164
|
program2.command("session-sender", { hidden: true }).description("stream a runner build's sessions to its work item while the build runs").action(async () => {
|
|
4158
|
-
const { runSessionSender } = await import('./session-sender-
|
|
4165
|
+
const { runSessionSender } = await import('./session-sender-X3BBQZMF.js');
|
|
4159
4166
|
try {
|
|
4160
4167
|
await runSessionSender();
|
|
4161
4168
|
} catch (err) {
|
|
@@ -4163,7 +4170,7 @@ code is 1: revoke the token on /profile/security.
|
|
|
4163
4170
|
}
|
|
4164
4171
|
});
|
|
4165
4172
|
program2.command("vm-init", { hidden: true }).description("lay out a microVM build's guest; the guest helper runs it").action(async () => {
|
|
4166
|
-
const { realGuestHost, runGuestInit } = await import('./guest-init-
|
|
4173
|
+
const { realGuestHost, runGuestInit } = await import('./guest-init-ZBL5CN7Y.js');
|
|
4167
4174
|
const { readFileSync: readFileSync3 } = await import('fs');
|
|
4168
4175
|
try {
|
|
4169
4176
|
runGuestInit(realGuestHost(), readFileSync3("/proc/cmdline", "utf8"));
|
|
@@ -4172,7 +4179,7 @@ code is 1: revoke the token on /profile/security.
|
|
|
4172
4179
|
}
|
|
4173
4180
|
});
|
|
4174
4181
|
program2.command("vm-forward", { hidden: true }).description("pipe a guest port to another; vm-init runs it").requiredOption("--listen <host:port>", "the address to listen on").requiredOption("--to <host:port>", "the address to pipe each connection to").action(async (opts) => {
|
|
4175
|
-
const { startBridgeForward } = await import('./bridge-
|
|
4182
|
+
const { startBridgeForward } = await import('./bridge-4ZARDVGS.js');
|
|
4176
4183
|
try {
|
|
4177
4184
|
await startBridgeForward(opts);
|
|
4178
4185
|
} catch (err) {
|
|
@@ -4199,7 +4206,7 @@ async function runCli(processArgv) {
|
|
|
4199
4206
|
await buildProgram(argv).parseAsync(argv);
|
|
4200
4207
|
}
|
|
4201
4208
|
async function compileContext(opts) {
|
|
4202
|
-
const { runEmit, EmitError } = await import('./emit-cmd-
|
|
4209
|
+
const { runEmit, EmitError } = await import('./emit-cmd-WQH2NK7H.js');
|
|
4203
4210
|
try {
|
|
4204
4211
|
const result = runEmit({ cwd: opts.dir, check: opts.check, json: opts.json });
|
|
4205
4212
|
if (result.exitCode !== 0) process.exitCode = result.exitCode;
|
|
@@ -4246,7 +4253,7 @@ Compiling .outerlayer/ moved to \`${cliInvocation()} context emit\`.
|
|
|
4246
4253
|
await compileContext({ dir: opts.dir, check: opts.check, json: opts.json });
|
|
4247
4254
|
return;
|
|
4248
4255
|
}
|
|
4249
|
-
const { runEmitResult, EmitResultError } = await import('./emit-result-cmd-
|
|
4256
|
+
const { runEmitResult, EmitResultError } = await import('./emit-result-cmd-BTMTGDAV.js');
|
|
4250
4257
|
try {
|
|
4251
4258
|
const result = await runEmitResult({
|
|
4252
4259
|
name,
|
|
@@ -4296,7 +4303,7 @@ everywhere, bytes and deep link untouched; a still-queued one is cancelled
|
|
|
4296
4303
|
locally so it never uploads. One correction can retire several duplicates.
|
|
4297
4304
|
`
|
|
4298
4305
|
).action(async (file, opts) => {
|
|
4299
|
-
const { runEmitArtifact, EmitArtifactError } = await import('./emit-artifact-cmd-
|
|
4306
|
+
const { runEmitArtifact, EmitArtifactError } = await import('./emit-artifact-cmd-VZHIDPXQ.js');
|
|
4300
4307
|
let pr;
|
|
4301
4308
|
if (opts.pr !== void 0) {
|
|
4302
4309
|
pr = parseTrackerNumber(opts.pr);
|
|
@@ -4355,7 +4362,7 @@ recent events with their ids. --find <text> searches all of them.
|
|
|
4355
4362
|
item that session was launched for is used automatically.
|
|
4356
4363
|
`
|
|
4357
4364
|
).action(async (opts) => {
|
|
4358
|
-
const { runEmitFinding, refuseRemovedFindingFlags, EmitFindingError } = await import('./emit-finding-cmd-
|
|
4365
|
+
const { runEmitFinding, refuseRemovedFindingFlags, EmitFindingError } = await import('./emit-finding-cmd-52M43NPC.js');
|
|
4359
4366
|
try {
|
|
4360
4367
|
refuseRemovedFindingFlags(opts);
|
|
4361
4368
|
const result = await runEmitFinding({
|
|
@@ -4422,7 +4429,7 @@ the whole batch. "untimed": true records one with no time on purpose.
|
|
|
4422
4429
|
that session was launched for is used automatically.
|
|
4423
4430
|
`
|
|
4424
4431
|
).action(async (file, opts) => {
|
|
4425
|
-
const { runEmitFindings, EmitFindingError } = await import('./emit-finding-cmd-
|
|
4432
|
+
const { runEmitFindings, EmitFindingError } = await import('./emit-finding-cmd-52M43NPC.js');
|
|
4426
4433
|
try {
|
|
4427
4434
|
const result = await runEmitFindings({
|
|
4428
4435
|
file,
|
|
@@ -4457,7 +4464,7 @@ command, the command exits 0, and \`sync\` sends it later. If the gateway refuse
|
|
|
4457
4464
|
the step, the command prints why and exits 1.
|
|
4458
4465
|
`
|
|
4459
4466
|
).action(async (name, opts) => {
|
|
4460
|
-
const { runEmitStep, EmitStepError } = await import('./emit-step-cmd-
|
|
4467
|
+
const { runEmitStep, EmitStepError } = await import('./emit-step-cmd-6XTJITZT.js');
|
|
4461
4468
|
try {
|
|
4462
4469
|
await runEmitStep({
|
|
4463
4470
|
name,
|
|
@@ -4500,7 +4507,7 @@ of the item, and a (proof: <kind>) annotation names its proof.
|
|
|
4500
4507
|
${cliInvocation()} emit criteria acceptance/412-login.md --item 412
|
|
4501
4508
|
`
|
|
4502
4509
|
).action(async (file, opts) => {
|
|
4503
|
-
const { runEmitCriteria, EmitCriteriaError } = await import('./emit-criteria-cmd-
|
|
4510
|
+
const { runEmitCriteria, EmitCriteriaError } = await import('./emit-criteria-cmd-SYLBCWHW.js');
|
|
4504
4511
|
try {
|
|
4505
4512
|
const result = await runEmitCriteria({
|
|
4506
4513
|
file,
|
|
@@ -4524,9 +4531,9 @@ function registerSpecCommands(program2) {
|
|
|
4524
4531
|
const specCmd = program2.command("spec").description("Find, file and edit the issue a spec lives in, in your factory's tracker");
|
|
4525
4532
|
const credentialOptions = (command) => command.option("--json", "machine-readable JSON output").option("--url <url>", "cloud base URL (or OUTERLAYER_URL / config)").addOption(apiKeyOption()).option("--app-id <id>", "factory id the key is bound to (or OUTERLAYER_APP_ID / config)");
|
|
4526
4533
|
const run = async (action) => {
|
|
4527
|
-
const { WorkCommandError } = await import('./work-cmd-
|
|
4534
|
+
const { WorkCommandError } = await import('./work-cmd-APXSER2D.js');
|
|
4528
4535
|
try {
|
|
4529
|
-
await action(await import('./spec-cmd-
|
|
4536
|
+
await action(await import('./spec-cmd-QRF5YXKK.js'));
|
|
4530
4537
|
} catch (err) {
|
|
4531
4538
|
if (err instanceof WorkCommandError) {
|
|
4532
4539
|
fail(err.message);
|
|
@@ -4568,7 +4575,7 @@ takes it, and prints the line that starts your session on it. That
|
|
|
4568
4575
|
session links itself and holds the item's lease while it works.
|
|
4569
4576
|
`
|
|
4570
4577
|
).action(async (opts) => {
|
|
4571
|
-
const { runWorkBuild, WorkCommandError } = await import('./work-cmd-
|
|
4578
|
+
const { runWorkBuild, WorkCommandError } = await import('./work-cmd-APXSER2D.js');
|
|
4572
4579
|
try {
|
|
4573
4580
|
await runWorkBuild(opts);
|
|
4574
4581
|
} catch (err) {
|
|
@@ -4591,7 +4598,7 @@ renews that session's own 20-minute lease, unless --no-lease or
|
|
|
4591
4598
|
--ended is given, or another worker already holds a live one.
|
|
4592
4599
|
`
|
|
4593
4600
|
).action(async (number, opts) => {
|
|
4594
|
-
const { runWorkLinkSession, WorkCommandError } = await import('./work-cmd-
|
|
4601
|
+
const { runWorkLinkSession, WorkCommandError } = await import('./work-cmd-APXSER2D.js');
|
|
4595
4602
|
try {
|
|
4596
4603
|
await runWorkLinkSession({ ...opts, number, noLease: opts.lease === false, logFailures: opts.logFailures === true });
|
|
4597
4604
|
} catch (err) {
|
|
@@ -4615,8 +4622,8 @@ criterion's new proof; --ready hands the thread back to a person. At
|
|
|
4615
4622
|
most one action flag may be given.
|
|
4616
4623
|
`
|
|
4617
4624
|
).action(async (opts) => {
|
|
4618
|
-
const { runWorkComment, WorkCommentCommandError } = await import('./work-comment-cmd-
|
|
4619
|
-
const { WorkCommandError } = await import('./work-cmd-
|
|
4625
|
+
const { runWorkComment, WorkCommentCommandError } = await import('./work-comment-cmd-AT5NUYUU.js');
|
|
4626
|
+
const { WorkCommandError } = await import('./work-cmd-APXSER2D.js');
|
|
4620
4627
|
try {
|
|
4621
4628
|
await runWorkComment(opts);
|
|
4622
4629
|
} catch (err) {
|
|
@@ -4637,8 +4644,8 @@ criterion that carries proof or a comment, each with who is waiting
|
|
|
4637
4644
|
on whom next.
|
|
4638
4645
|
`
|
|
4639
4646
|
).action(async (opts) => {
|
|
4640
|
-
const { runWorkThreads, WorkCommentCommandError } = await import('./work-comment-cmd-
|
|
4641
|
-
const { WorkCommandError } = await import('./work-cmd-
|
|
4647
|
+
const { runWorkThreads, WorkCommentCommandError } = await import('./work-comment-cmd-AT5NUYUU.js');
|
|
4648
|
+
const { WorkCommandError } = await import('./work-cmd-APXSER2D.js');
|
|
4642
4649
|
try {
|
|
4643
4650
|
await runWorkThreads(opts);
|
|
4644
4651
|
} catch (err) {
|
|
@@ -4662,8 +4669,8 @@ still running, or that an older runner released, has no log and the
|
|
|
4662
4669
|
command exits 1.
|
|
4663
4670
|
`
|
|
4664
4671
|
).action(async (opts) => {
|
|
4665
|
-
const { runWorkLogs, WorkLogsCommandError } = await import('./work-logs-cmd-
|
|
4666
|
-
const { WorkCommandError } = await import('./work-cmd-
|
|
4672
|
+
const { runWorkLogs, WorkLogsCommandError } = await import('./work-logs-cmd-Z5DMNEJP.js');
|
|
4673
|
+
const { WorkCommandError } = await import('./work-cmd-APXSER2D.js');
|
|
4667
4674
|
try {
|
|
4668
4675
|
await runWorkLogs(opts);
|
|
4669
4676
|
} catch (err) {
|
|
@@ -4686,8 +4693,8 @@ item is not built again until a new build request. Exits 1 when no host
|
|
|
4686
4693
|
build is running for the item.
|
|
4687
4694
|
`
|
|
4688
4695
|
).action(async (opts) => {
|
|
4689
|
-
const { runWorkStop, WorkStopCommandError } = await import('./work-stop-cmd-
|
|
4690
|
-
const { WorkCommandError } = await import('./work-cmd-
|
|
4696
|
+
const { runWorkStop, WorkStopCommandError } = await import('./work-stop-cmd-DCAWFDZC.js');
|
|
4697
|
+
const { WorkCommandError } = await import('./work-cmd-APXSER2D.js');
|
|
4691
4698
|
try {
|
|
4692
4699
|
await runWorkStop(opts);
|
|
4693
4700
|
} catch (err) {
|
|
@@ -4708,7 +4715,7 @@ deletes anything \u2014 the item is removed from Work only once no
|
|
|
4708
4715
|
live addition remains on it.
|
|
4709
4716
|
`
|
|
4710
4717
|
).action(async (opts) => {
|
|
4711
|
-
const { runWorkRemove, WorkCommandError } = await import('./work-cmd-
|
|
4718
|
+
const { runWorkRemove, WorkCommandError } = await import('./work-cmd-APXSER2D.js');
|
|
4712
4719
|
try {
|
|
4713
4720
|
await runWorkRemove(opts);
|
|
4714
4721
|
} catch (err) {
|
|
@@ -4720,7 +4727,7 @@ live addition remains on it.
|
|
|
4720
4727
|
}
|
|
4721
4728
|
});
|
|
4722
4729
|
workCmd.command("status").description("Show one item's stage, gate ledger, and additions").option("--item <number>", "the item's number inside this factory").option("--issue <number>", "issue number, or a Linear/Jira key like ENG-123").option(TRACKER_OPTION_FLAG, "tracker for a keyed --issue, when both hold the key").option("--repo <owner/name>", "repository for an issue number (default: the checkout's remote)").option("--json", "machine-readable JSON output").option("--url <url>", "cloud base URL (or OUTERLAYER_URL / config)").addOption(apiKeyOption()).option("--app-id <id>", "factory id the key is bound to (or OUTERLAYER_APP_ID / config)").action(async (opts) => {
|
|
4723
|
-
const { runWorkStatus, WorkCommandError } = await import('./work-cmd-
|
|
4730
|
+
const { runWorkStatus, WorkCommandError } = await import('./work-cmd-APXSER2D.js');
|
|
4724
4731
|
try {
|
|
4725
4732
|
await runWorkStatus(opts);
|
|
4726
4733
|
} catch (err) {
|
|
@@ -4732,7 +4739,7 @@ live addition remains on it.
|
|
|
4732
4739
|
}
|
|
4733
4740
|
});
|
|
4734
4741
|
workCmd.command("list").description("List live work items for this factory").option("--stage <spec|build|review>", "filter by stage").option("--section <attention|waiting|flowing>", "filter by Queue section").option("--repo <owner/name>", "repository (default: the current checkout's remote)").option("--unclaimed", "only items with no live lease").option("--claimed", "only items with a live lease, held by a host or a local session").option("--startable", "only items a host can start: a build request, no open PR, no live lease").option("--needs <amend>", "only items with a thread waiting on an agent").option("--json", "machine-readable JSON output").option("--url <url>", "cloud base URL (or OUTERLAYER_URL / config)").addOption(apiKeyOption()).option("--app-id <id>", "factory id the key is bound to (or OUTERLAYER_APP_ID / config)").action(async (opts) => {
|
|
4735
|
-
const { runWorkList, WorkCommandError } = await import('./work-cmd-
|
|
4742
|
+
const { runWorkList, WorkCommandError } = await import('./work-cmd-APXSER2D.js');
|
|
4736
4743
|
try {
|
|
4737
4744
|
await runWorkList(opts);
|
|
4738
4745
|
} catch (err) {
|
|
@@ -4753,7 +4760,7 @@ by a different key is refused; claiming again with the same key extends
|
|
|
4753
4760
|
it. --host is a label only.
|
|
4754
4761
|
`
|
|
4755
4762
|
).action(async (opts) => {
|
|
4756
|
-
const { runWorkClaim, WorkCommandError } = await import('./work-claim-cmd-
|
|
4763
|
+
const { runWorkClaim, WorkCommandError } = await import('./work-claim-cmd-RT343CLA.js');
|
|
4757
4764
|
try {
|
|
4758
4765
|
await runWorkClaim(opts);
|
|
4759
4766
|
} catch (err) {
|
|
@@ -4773,7 +4780,7 @@ Extends the live lease this API key holds. Refused with a 410 if the
|
|
|
4773
4780
|
lease has expired, or a 403 if a different key holds it.
|
|
4774
4781
|
`
|
|
4775
4782
|
).action(async (opts) => {
|
|
4776
|
-
const { runWorkRenew, WorkCommandError } = await import('./work-claim-cmd-
|
|
4783
|
+
const { runWorkRenew, WorkCommandError } = await import('./work-claim-cmd-RT343CLA.js');
|
|
4777
4784
|
try {
|
|
4778
4785
|
await runWorkRenew(opts);
|
|
4779
4786
|
} catch (err) {
|
|
@@ -4805,7 +4812,7 @@ applies to a host's lease only. A later tool call in the session
|
|
|
4805
4812
|
takes the lease again.
|
|
4806
4813
|
`
|
|
4807
4814
|
).action(async (opts) => {
|
|
4808
|
-
const { runWorkRelease, WorkCommandError } = await import('./work-claim-cmd-
|
|
4815
|
+
const { runWorkRelease, WorkCommandError } = await import('./work-claim-cmd-RT343CLA.js');
|
|
4809
4816
|
try {
|
|
4810
4817
|
await runWorkRelease(opts);
|
|
4811
4818
|
} catch (err) {
|
|
@@ -4832,7 +4839,7 @@ Idempotent: declaring the same pull request twice is a no-op.
|
|
|
4832
4839
|
needs your own login; an agent session or a factory key is refused.
|
|
4833
4840
|
`
|
|
4834
4841
|
).action(async (number, opts) => {
|
|
4835
|
-
const { runWorkPr, WorkPrCommandError } = await import('./work-pr-cmd-
|
|
4842
|
+
const { runWorkPr, WorkPrCommandError } = await import('./work-pr-cmd-IWZCC3WH.js');
|
|
4836
4843
|
try {
|
|
4837
4844
|
await runWorkPr({ ...opts, number });
|
|
4838
4845
|
} catch (err) {
|
|
@@ -4857,8 +4864,8 @@ login, then declares the pull request on the item, as \`work pr\` does.
|
|
|
4857
4864
|
Run it again after a change to the title or description.
|
|
4858
4865
|
`
|
|
4859
4866
|
).action(async (opts) => {
|
|
4860
|
-
const { runWorkOpenPr, WorkOpenPrCommandError } = await import('./work-open-pr-cmd-
|
|
4861
|
-
const { WorkCommandError } = await import('./work-cmd-
|
|
4867
|
+
const { runWorkOpenPr, WorkOpenPrCommandError } = await import('./work-open-pr-cmd-ZTS6MJHL.js');
|
|
4868
|
+
const { WorkCommandError } = await import('./work-cmd-APXSER2D.js');
|
|
4862
4869
|
try {
|
|
4863
4870
|
await runWorkOpenPr(opts);
|
|
4864
4871
|
} catch (err) {
|
|
@@ -4874,9 +4881,9 @@ function registerRunnerCommands(program2) {
|
|
|
4874
4881
|
const runnerCmd = program2.command("runner").description("Take work from the implement and amend queues on this machine");
|
|
4875
4882
|
const configOption = "the cloud config file to run against (default: ~/.outerlayer/config.json)";
|
|
4876
4883
|
runnerCmd.command("start").description("Run the loop: claim work, run it, report, clean up, repeat").option("--config <path>", configOption).action(async (opts) => {
|
|
4877
|
-
const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-
|
|
4878
|
-
const { start, RunnerStartError } = await import('./loop-
|
|
4879
|
-
const { RunnerAlreadyRunningError } = await import('./pidfile-
|
|
4884
|
+
const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-7Z5DHSGY.js');
|
|
4885
|
+
const { start, RunnerStartError } = await import('./loop-4WUCS5JP.js');
|
|
4886
|
+
const { RunnerAlreadyRunningError } = await import('./pidfile-OJ7RP4Q2.js');
|
|
4880
4887
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
4881
4888
|
try {
|
|
4882
4889
|
const { realUpdateDeps } = await import('./real-deps-KNNBQC75.js');
|
|
@@ -4889,9 +4896,33 @@ function registerRunnerCommands(program2) {
|
|
|
4889
4896
|
throw err;
|
|
4890
4897
|
}
|
|
4891
4898
|
});
|
|
4899
|
+
runnerCmd.command("container-start").description("Container entrypoint: write the config from variables, then run").addHelpText(
|
|
4900
|
+
"after",
|
|
4901
|
+
"\nReads OUTERLAYER_URL, OUTERLAYER_APP_ID, OUTERLAYER_API_KEY, OUTERLAYER_HOST and one Claude credential\n(CLAUDE_CODE_OAUTH_TOKEN, ANTHROPIC_API_KEY or ANTHROPIC_AUTH_TOKEN) from the environment. OUTERLAYER_AGENT\nis optional and defaults to claude. On a later start it refuses variables that disagree with the config in the volume.\nThe image sets OUTERLAYER_RUNNER_IMAGE; outside the image, use `runner start`.\n"
|
|
4902
|
+
).action(async () => {
|
|
4903
|
+
const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-7Z5DHSGY.js');
|
|
4904
|
+
const { containerStart } = await import('./container-start-OHBUZEJJ.js');
|
|
4905
|
+
const { start, RunnerStartError } = await import('./loop-4WUCS5JP.js');
|
|
4906
|
+
const { RunnerAlreadyRunningError } = await import('./pidfile-OJ7RP4Q2.js');
|
|
4907
|
+
try {
|
|
4908
|
+
const result = await containerStart({
|
|
4909
|
+
env: process.env,
|
|
4910
|
+
configPath: defaultRunnerConfigPath(),
|
|
4911
|
+
start,
|
|
4912
|
+
exit: (code) => process.exit(code)
|
|
4913
|
+
});
|
|
4914
|
+
if (!result.ok) fail(result.message);
|
|
4915
|
+
} catch (err) {
|
|
4916
|
+
if (err instanceof RunnerConfigError || err instanceof RunnerAlreadyRunningError || err instanceof RunnerStartError) {
|
|
4917
|
+
fail(err.message);
|
|
4918
|
+
return;
|
|
4919
|
+
}
|
|
4920
|
+
throw err;
|
|
4921
|
+
}
|
|
4922
|
+
});
|
|
4892
4923
|
runnerCmd.command("check").description("Validate the config, the hooks and the key, and print the effective settings").option("--config <path>", configOption).action(async (opts) => {
|
|
4893
|
-
const { defaultRunnerConfigPath } = await import('./config-
|
|
4894
|
-
const { runRunnerCheck } = await import('./check-
|
|
4924
|
+
const { defaultRunnerConfigPath } = await import('./config-7Z5DHSGY.js');
|
|
4925
|
+
const { runRunnerCheck } = await import('./check-YYKNYFNI.js');
|
|
4895
4926
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
4896
4927
|
const result = await runRunnerCheck(configPath);
|
|
4897
4928
|
if (!result.ok) {
|
|
@@ -4907,8 +4938,8 @@ function registerRunnerCommands(program2) {
|
|
|
4907
4938
|
`);
|
|
4908
4939
|
});
|
|
4909
4940
|
runnerCmd.command("install").description("Put this CLI in the runner's install layout; --service adds its service").option("--config <path>", configOption).option("--service", "set up the service that keeps the runner running").option("--print", "with --service, print the unit and set up nothing").option("--user <account>", "with --service, the account the service runs as").option("--replace", "replace a unit or launcher file this command did not write").option("--allow-downgrade", "install this CLI even when it is older than the version the runner runs").option("--unit-name <name>", "with --service, the unit's name, to run a second runner beside the first").action(async (opts) => {
|
|
4910
|
-
const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-
|
|
4911
|
-
const { runRunnerInstall, RunnerInstallError, launcherSummary, restartNote } = await import('./install-cmd-
|
|
4941
|
+
const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-7Z5DHSGY.js');
|
|
4942
|
+
const { runRunnerInstall, RunnerInstallError, launcherSummary, restartNote } = await import('./install-cmd-4LA3UJZ4.js');
|
|
4912
4943
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
4913
4944
|
if (opts.service !== true) {
|
|
4914
4945
|
for (const flag of ["print", "user", "unitName"]) {
|
|
@@ -4920,7 +4951,7 @@ function registerRunnerCommands(program2) {
|
|
|
4920
4951
|
}
|
|
4921
4952
|
try {
|
|
4922
4953
|
if (opts.service === true) {
|
|
4923
|
-
const { installServiceCommand } = await import('./command-
|
|
4954
|
+
const { installServiceCommand } = await import('./command-DO4TERRT.js');
|
|
4924
4955
|
const result2 = await installServiceCommand({
|
|
4925
4956
|
configPath,
|
|
4926
4957
|
print: opts.print,
|
|
@@ -4975,8 +5006,8 @@ To keep it running, run ${C.yellow}${cliInvocation()} runner install --service${
|
|
|
4975
5006
|
fail(`pass --service: \`${cliInvocation()} runner uninstall --service\` removes the runner's service.`);
|
|
4976
5007
|
return;
|
|
4977
5008
|
}
|
|
4978
|
-
const { defaultRunnerConfigPath } = await import('./config-
|
|
4979
|
-
const { uninstallServiceCommand } = await import('./command-
|
|
5009
|
+
const { defaultRunnerConfigPath } = await import('./config-7Z5DHSGY.js');
|
|
5010
|
+
const { uninstallServiceCommand } = await import('./command-DO4TERRT.js');
|
|
4980
5011
|
const result = await uninstallServiceCommand({ configPath: opts.config ?? defaultRunnerConfigPath(), unitName: opts.unitName, home: homeFromEnv() });
|
|
4981
5012
|
if (result.ok) for (const line of result.lines) process.stdout.write(`${C.green}\u2713${C.reset} ${line}
|
|
4982
5013
|
`);
|
|
@@ -5003,12 +5034,12 @@ already in runner.env is used.
|
|
|
5003
5034
|
printf '%s' "$CLAUDE_CODE_OAUTH_TOKEN" | ${cliInvocation()} runner init --agent claude --factory <org>/<factory>
|
|
5004
5035
|
`
|
|
5005
5036
|
).action(async (opts) => {
|
|
5006
|
-
const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-
|
|
5007
|
-
const { prepareRunnerInit, runRunnerInit, RunnerInitError, writeRunnerInit } = await import('./init-
|
|
5008
|
-
const { obtainRunnerKey, runnerKeyLogin } = await import('./runner-key-
|
|
5009
|
-
const { detectMachine } = await import('./machine-
|
|
5010
|
-
const { chooseVm, runVmInit, VmInitError } = await import('./init-
|
|
5011
|
-
const { AGENT_COMMANDS, credentialFromStdin, isAgentName, restartForCredential, RunnerEnvError } = await import('./runner-env-
|
|
5037
|
+
const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-7Z5DHSGY.js');
|
|
5038
|
+
const { prepareRunnerInit, runRunnerInit, RunnerInitError, writeRunnerInit } = await import('./init-TSQ3EOQW.js');
|
|
5039
|
+
const { obtainRunnerKey, runnerKeyLogin } = await import('./runner-key-WDFBSJRX.js');
|
|
5040
|
+
const { detectMachine } = await import('./machine-6UNLIPLE.js');
|
|
5041
|
+
const { chooseVm, runVmInit, VmInitError } = await import('./init-EQTR7AEF.js');
|
|
5042
|
+
const { AGENT_COMMANDS, credentialFromStdin, isAgentName, restartForCredential, RunnerEnvError } = await import('./runner-env-ZJWJOJKQ.js');
|
|
5012
5043
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
5013
5044
|
if (opts.agent !== void 0 && !isAgentName(opts.agent)) {
|
|
5014
5045
|
fail(`--agent ${opts.agent}: runner init writes commands for ${Object.keys(AGENT_COMMANDS).join(", ")}. For another agent, leave --agent out and edit runner.commands.`);
|
|
@@ -5022,7 +5053,7 @@ already in runner.env is used.
|
|
|
5022
5053
|
try {
|
|
5023
5054
|
let credential;
|
|
5024
5055
|
if (agent !== void 0) {
|
|
5025
|
-
const { readPipedKey } = await import('./login-browser-
|
|
5056
|
+
const { readPipedKey } = await import('./login-browser-4OMZFP3U.js');
|
|
5026
5057
|
credential = credentialFromStdin(
|
|
5027
5058
|
await readPipedKey(process.stdin, {
|
|
5028
5059
|
onWaiting: () => process.stderr.write(`runner init is waiting for Claude's credential on stdin; close stdin to use the one already in runner.env
|
|
@@ -5039,7 +5070,7 @@ already in runner.env is used.
|
|
|
5039
5070
|
const chunks = [];
|
|
5040
5071
|
for await (const chunk of process.stdin) chunks.push(Buffer.from(chunk));
|
|
5041
5072
|
const result2 = runRunnerInit(configPath, { machine, configFromStdin: Buffer.concat(chunks).toString("utf8"), requireContainer: true });
|
|
5042
|
-
const { ensureHostKey: ensureHostKey2 } = await import('./host-key-
|
|
5073
|
+
const { ensureHostKey: ensureHostKey2 } = await import('./host-key-W2DLZGZ7.js');
|
|
5043
5074
|
const hostKey2 = await ensureHostKey2(configPath);
|
|
5044
5075
|
process.stdout.write(`host key ${hostKey2.fingerprint}
|
|
5045
5076
|
hooks: ${result2.hooks}
|
|
@@ -5098,7 +5129,7 @@ hooks: ${result2.hooks}
|
|
|
5098
5129
|
const prepared = prepareRunnerInit(configPath, { machine, allowProcess, agent, credential, keyFromLogin: makeKey !== void 0 });
|
|
5099
5130
|
const created = makeKey === void 0 ? void 0 : await makeKey();
|
|
5100
5131
|
const result = writeRunnerInit(prepared, created);
|
|
5101
|
-
const { ensureHostKey } = await import('./host-key-
|
|
5132
|
+
const { ensureHostKey } = await import('./host-key-W2DLZGZ7.js');
|
|
5102
5133
|
const hostKey = await ensureHostKey(configPath);
|
|
5103
5134
|
if (created !== void 0) {
|
|
5104
5135
|
process.stdout.write(`${C.green}\u2713${C.reset} saved the runner key in ${result.configPath}
|
|
@@ -5126,7 +5157,7 @@ ${C.yellow}${result.note}${C.reset}
|
|
|
5126
5157
|
To isolate builds in containers instead, run ${C.yellow}${cliInvocation()} runner init --vm${C.reset}.
|
|
5127
5158
|
`);
|
|
5128
5159
|
}
|
|
5129
|
-
const { runRunnerInstall, RunnerInstallError, RunnerDowngradeError, launcherSummary } = await import('./install-cmd-
|
|
5160
|
+
const { runRunnerInstall, RunnerInstallError, RunnerDowngradeError, launcherSummary } = await import('./install-cmd-4LA3UJZ4.js');
|
|
5130
5161
|
let installedLayout = false;
|
|
5131
5162
|
let noService = "it starts the runner from the install layout, which needs a CLI installed with npm";
|
|
5132
5163
|
try {
|
|
@@ -5158,7 +5189,7 @@ ${C.yellow}The runner will not update itself: ${installErr.message}${C.reset}
|
|
|
5158
5189
|
let serviceUp = false;
|
|
5159
5190
|
let restart;
|
|
5160
5191
|
if (installedLayout) {
|
|
5161
|
-
const { installServiceCommand } = await import('./command-
|
|
5192
|
+
const { installServiceCommand } = await import('./command-DO4TERRT.js');
|
|
5162
5193
|
const service = await installServiceCommand({
|
|
5163
5194
|
configPath,
|
|
5164
5195
|
entryPath: process.argv[1] ?? "",
|
|
@@ -5202,12 +5233,12 @@ Next:
|
|
|
5202
5233
|
"after",
|
|
5203
5234
|
"\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"
|
|
5204
5235
|
).action(async (opts) => {
|
|
5205
|
-
const { defaultRunnerConfigPath } = await import('./config-
|
|
5206
|
-
const { buildRepositoryImage, RecipeError } = await import('./build-
|
|
5236
|
+
const { defaultRunnerConfigPath } = await import('./config-7Z5DHSGY.js');
|
|
5237
|
+
const { buildRepositoryImage, RecipeError } = await import('./build-OVZIT2G2.js');
|
|
5207
5238
|
const { currentCliBuild } = await import('./cli-build-K56DK4DS.js');
|
|
5208
|
-
const { createDockerHost } = await import('./docker-
|
|
5209
|
-
const { builderSpec } = await import('./builder-
|
|
5210
|
-
const { loadRunnerConfig } = await import('./config-
|
|
5239
|
+
const { createDockerHost } = await import('./docker-RKGBJESN.js');
|
|
5240
|
+
const { builderSpec } = await import('./builder-MECDEKXX.js');
|
|
5241
|
+
const { loadRunnerConfig } = await import('./config-7Z5DHSGY.js');
|
|
5211
5242
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
5212
5243
|
const loaded = (() => {
|
|
5213
5244
|
try {
|
|
@@ -5218,11 +5249,11 @@ Next:
|
|
|
5218
5249
|
})();
|
|
5219
5250
|
const memory = loaded?.build?.memory ?? "8g";
|
|
5220
5251
|
try {
|
|
5221
|
-
const { ensureRunnerIdentity } = await import('./runner-identity-
|
|
5252
|
+
const { ensureRunnerIdentity } = await import('./runner-identity-2OOUJSFJ.js');
|
|
5222
5253
|
await ensureRunnerIdentity(configPath, { log: (line) => console.error(line) }).catch((err) => {
|
|
5223
5254
|
console.error(`the runner's Docker identity could not be stored: ${err instanceof Error ? err.message : String(err)}`);
|
|
5224
5255
|
});
|
|
5225
|
-
const { imageTargetFor } = await import('./governing-source-
|
|
5256
|
+
const { imageTargetFor } = await import('./governing-source-GWN7GVEN.js');
|
|
5226
5257
|
const target = await imageTargetFor({ config: loaded, repository: opts.repository, fetchImpl: fetch });
|
|
5227
5258
|
if (!target.ok) {
|
|
5228
5259
|
if (opts.json) {
|
|
@@ -5284,24 +5315,27 @@ Next:
|
|
|
5284
5315
|
throw err;
|
|
5285
5316
|
}
|
|
5286
5317
|
});
|
|
5287
|
-
runnerCmd.command("stop").description("Take no more work;
|
|
5288
|
-
const { defaultRunnerConfigPath } = await import('./config-
|
|
5289
|
-
const { requestStop } = await import('./loop-
|
|
5318
|
+
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) => {
|
|
5319
|
+
const { defaultRunnerConfigPath } = await import('./config-7Z5DHSGY.js');
|
|
5320
|
+
const { requestStop } = await import('./loop-4WUCS5JP.js');
|
|
5290
5321
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
5291
|
-
await
|
|
5322
|
+
const { runnerImageVersion } = await import('./image-tag-AO4RBAKW.js');
|
|
5323
|
+
await requestStop(configPath, Boolean(opts.now), void 0, { image: runnerImageVersion() !== void 0 });
|
|
5292
5324
|
});
|
|
5293
5325
|
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) => {
|
|
5294
|
-
const { defaultRunnerConfigPath, loadRunnerConfig } = await import('./config-
|
|
5295
|
-
const { jobsDir, runnerDir } = await import('./paths-
|
|
5296
|
-
const { listJobFiles, runnerProcessState } = await import('./loop-
|
|
5297
|
-
const { renderStatus } = await import('./status-
|
|
5298
|
-
const { readHousekeepingRecord } = await import('./record-
|
|
5326
|
+
const { defaultRunnerConfigPath, loadRunnerConfig } = await import('./config-7Z5DHSGY.js');
|
|
5327
|
+
const { jobsDir, runnerDir } = await import('./paths-XY5ADO32.js');
|
|
5328
|
+
const { listJobFiles, runnerProcessState } = await import('./loop-4WUCS5JP.js');
|
|
5329
|
+
const { renderStatus } = await import('./status-ZCAAF6MD.js');
|
|
5330
|
+
const { readHousekeepingRecord } = await import('./record-BEJB4J7N.js');
|
|
5299
5331
|
const path2 = await import('path');
|
|
5300
5332
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
5301
5333
|
const all = listJobFiles(configPath);
|
|
5302
5334
|
const housekeeping = readHousekeepingRecord(runnerDir(configPath));
|
|
5303
|
-
const { readPendingUpdate } = await import('./pending-
|
|
5335
|
+
const { readPendingUpdate } = await import('./pending-35J3ZPLR.js');
|
|
5304
5336
|
const pendingUpdate = readPendingUpdate(runnerDir(configPath));
|
|
5337
|
+
const { readImageStatus } = await import('./image-tag-AO4RBAKW.js');
|
|
5338
|
+
const image = readImageStatus(runnerDir(configPath));
|
|
5305
5339
|
let host = "unknown";
|
|
5306
5340
|
let concurrency = 1;
|
|
5307
5341
|
try {
|
|
@@ -5314,7 +5348,7 @@ Next:
|
|
|
5314
5348
|
const service = await (async () => {
|
|
5315
5349
|
if (process.platform !== "linux" || !existsSync("/run/systemd/system")) return void 0;
|
|
5316
5350
|
const { inspectService, realInspectProbes } = await import('./inspect-6UYAAXH7.js');
|
|
5317
|
-
const { DEFAULT_UNIT_NAME } = await import('./install-
|
|
5351
|
+
const { DEFAULT_UNIT_NAME } = await import('./install-ORQC26ZE.js');
|
|
5318
5352
|
const facts = inspectService(DEFAULT_UNIT_NAME, path2.dirname(configPath), realInspectProbes());
|
|
5319
5353
|
return facts === void 0 ? void 0 : { unit: facts.unit, running: facts.mainPid !== void 0, delegated: facts.delegate };
|
|
5320
5354
|
})();
|
|
@@ -5328,6 +5362,7 @@ Next:
|
|
|
5328
5362
|
// A hold is only true of a runner that is running.
|
|
5329
5363
|
housekeeping: processState.state === "running" ? housekeeping : { ...housekeeping, holding: void 0 },
|
|
5330
5364
|
pendingUpdate: processState.state === "running" ? pendingUpdate : void 0,
|
|
5365
|
+
image,
|
|
5331
5366
|
jobs: all.map(({ dirName, job }) => ({ ...withoutItemKey(job), jobDir: path2.join(jobsDir(configPath), dirName) }))
|
|
5332
5367
|
});
|
|
5333
5368
|
return;
|
|
@@ -5343,15 +5378,16 @@ Next:
|
|
|
5343
5378
|
recent: Boolean(opts.recent),
|
|
5344
5379
|
housekeeping,
|
|
5345
5380
|
pendingUpdate,
|
|
5381
|
+
image,
|
|
5346
5382
|
service
|
|
5347
5383
|
})}
|
|
5348
5384
|
`
|
|
5349
5385
|
);
|
|
5350
5386
|
});
|
|
5351
5387
|
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) => {
|
|
5352
|
-
const { defaultRunnerConfigPath } = await import('./config-
|
|
5353
|
-
const { listJobFiles } = await import('./loop-
|
|
5354
|
-
const { newestAttempt, logPathFor, tail, RunnerLogsError } = await import('./logs-
|
|
5388
|
+
const { defaultRunnerConfigPath } = await import('./config-7Z5DHSGY.js');
|
|
5389
|
+
const { listJobFiles } = await import('./loop-4WUCS5JP.js');
|
|
5390
|
+
const { newestAttempt, logPathFor, tail, RunnerLogsError } = await import('./logs-5EPHIPZB.js');
|
|
5355
5391
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
5356
5392
|
const item = parseTrackerNumber(itemArg);
|
|
5357
5393
|
if (item === void 0) {
|
|
@@ -5577,7 +5613,7 @@ Self-host deployments also need --app-id: without a key service to resolve the
|
|
|
5577
5613
|
caller from the bearer token, the gateway answers 401 without that header.
|
|
5578
5614
|
`
|
|
5579
5615
|
).action(async (opts) => {
|
|
5580
|
-
const { runMcpInstall, handleMcpInstallError, McpInstallError } = await import('./mcp-install-cmd-
|
|
5616
|
+
const { runMcpInstall, handleMcpInstallError, McpInstallError } = await import('./mcp-install-cmd-GGWB3JJ2.js');
|
|
5581
5617
|
try {
|
|
5582
5618
|
if (opts.transport !== void 0 && opts.transport !== "stdio" && opts.transport !== "http") {
|
|
5583
5619
|
throw new McpInstallError(`--transport must be "stdio" or "http", got "${opts.transport}"`);
|
|
@@ -5599,7 +5635,7 @@ caller from the bearer token, the gateway answers 401 without that header.
|
|
|
5599
5635
|
"after",
|
|
5600
5636
|
"\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"
|
|
5601
5637
|
).action(async (opts) => {
|
|
5602
|
-
const { runMcpServe, handleMcpServeError } = await import('./mcp-serve-cmd-
|
|
5638
|
+
const { runMcpServe, handleMcpServeError } = await import('./mcp-serve-cmd-KMWEKM7C.js');
|
|
5603
5639
|
try {
|
|
5604
5640
|
await runMcpServe({ url: opts.url, appId: opts.appId });
|
|
5605
5641
|
} catch (err) {
|
|
@@ -5610,7 +5646,7 @@ caller from the bearer token, the gateway answers 401 without that header.
|
|
|
5610
5646
|
function registerImportCommands(program2) {
|
|
5611
5647
|
const importCmd = program2.command("import").description("Import an existing config format into .outerlayer/");
|
|
5612
5648
|
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) => {
|
|
5613
|
-
const { runImportRuler, ImportRulerError } = await import('./import-ruler-cmd-
|
|
5649
|
+
const { runImportRuler, ImportRulerError } = await import('./import-ruler-cmd-VJOHOJQ7.js');
|
|
5614
5650
|
try {
|
|
5615
5651
|
const result = runImportRuler({ cwd: opts.dir, json: opts.json });
|
|
5616
5652
|
if (result.exitCode !== 0) process.exitCode = result.exitCode;
|
|
@@ -5626,7 +5662,7 @@ function registerImportCommands(program2) {
|
|
|
5626
5662
|
"after",
|
|
5627
5663
|
"\nInstalls the five maintained skills (outerlayer-evidence, outerlayer-amend,\nouterlayer-findings, outerlayer-cli, outerlayer-build) 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"
|
|
5628
5664
|
).action(async (opts) => {
|
|
5629
|
-
const { runImportCapture, ImportCaptureError } = await import('./import-capture-cmd-
|
|
5665
|
+
const { runImportCapture, ImportCaptureError } = await import('./import-capture-cmd-TCOKNVBM.js');
|
|
5630
5666
|
try {
|
|
5631
5667
|
runImportCapture({ cwd: opts.dir, json: opts.json });
|
|
5632
5668
|
} catch (err) {
|