@outerlayer/cli 0.22.1 → 0.23.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 +20 -0
- package/README.md +4 -1
- package/dist/{agent-setup-LTSLXPS3.js → agent-setup-SNDCEHG2.js} +14 -12
- package/dist/{artifact-link-cmd-OWRI5AJX.js → artifact-link-cmd-LEI6EOZE.js} +2 -2
- package/dist/bridge-QFN3KJP6.js +8 -0
- package/dist/{build-6WRNZPVR.js → build-WHHFA7KM.js} +2 -2
- package/dist/build-info.json +1 -1
- package/dist/{builder-G3MLDMTI.js → builder-7FBQAWQZ.js} +3 -3
- package/dist/{check-UYKEMQNR.js → check-3CGLWMHM.js} +37 -37
- package/dist/{chunk-ZPSLJFGL.js → chunk-2TT7DEMZ.js} +2 -2
- package/dist/{chunk-3V5C64Y5.js → chunk-6AOZD3LY.js} +3 -4
- package/dist/{chunk-5NJIWKD4.js → chunk-BOG4ENP7.js} +9 -9
- package/dist/{chunk-G3IJ3N6F.js → chunk-BUP5N3X6.js} +1 -1
- package/dist/{chunk-FRNYCJ4W.js → chunk-C2XZBNHY.js} +1 -1
- package/dist/{chunk-BET347JZ.js → chunk-C64D7HR3.js} +6 -7
- package/dist/{chunk-AEKSX4EY.js → chunk-CBCKD6DO.js} +1 -1
- package/dist/{chunk-56X5TOJY.js → chunk-D64E222W.js} +5 -6
- package/dist/{chunk-URAKVDSI.js → chunk-DJYOCD65.js} +9 -10
- package/dist/{chunk-IZSVXRDR.js → chunk-DXDF43YG.js} +1 -1
- package/dist/{chunk-F7CU5ABH.js → chunk-DYEFPYME.js} +1 -1
- package/dist/{chunk-ORNJJ7XN.js → chunk-FX6IHR5C.js} +11 -12
- package/dist/{chunk-ENTHEUKT.js → chunk-G3LHWUBK.js} +4 -4
- package/dist/{chunk-5QRP3MVS.js → chunk-GNPTU4BM.js} +9 -4
- package/dist/{chunk-JRCSET55.js → chunk-GXV73IIS.js} +6 -6
- package/dist/{chunk-5OCIHFGE.js → chunk-HBISTTG3.js} +32 -23
- package/dist/chunk-JKNYTNYD.js +151 -0
- package/dist/{chunk-CUFFDEF3.js → chunk-KGKFEONR.js} +4 -4
- package/dist/{chunk-USWVXQIH.js → chunk-MQ743JX3.js} +3 -3
- package/dist/{chunk-XR56WEA5.js → chunk-OGMZJWWD.js} +1 -1
- package/dist/chunk-QS43O4DR.js +113 -0
- package/dist/{chunk-FOCML5FI.js → chunk-QSEPKZXR.js} +15 -14
- package/dist/{chunk-7VUK5RFS.js → chunk-QZBXLLTV.js} +36 -1
- package/dist/{chunk-WFSUUUAN.js → chunk-RKOTJQVG.js} +1 -1
- package/dist/{chunk-7FEY33MY.js → chunk-TFGXOHF6.js} +13 -13
- package/dist/{chunk-V7SAQ645.js → chunk-VJBFQP3H.js} +21 -12
- package/dist/{chunk-ZNPE7FW5.js → chunk-VPEGE3QZ.js} +1 -1
- package/dist/{chunk-W3SWJ2TD.js → chunk-VWFOKRYS.js} +5 -2
- package/dist/{chunk-XCRZTXRL.js → chunk-WX2WEERU.js} +63 -43
- package/dist/chunk-WXJXHZVB.js +73 -0
- package/dist/{chunk-BOMRFYTZ.js → chunk-WY7HFY62.js} +3 -3
- package/dist/{chunk-VSUXCMMH.js → chunk-XFGL53GU.js} +51 -33
- package/dist/{chunk-6YBLN4TR.js → chunk-XGPC3IOR.js} +4 -5
- package/dist/{chunk-QC72I5GQ.js → chunk-XOEV4FVK.js} +3 -3
- package/dist/{chunk-EAQSOE62.js → chunk-XSPA5ODY.js} +21 -19
- package/dist/{chunk-JZGFDTNC.js → chunk-Z42JY3LQ.js} +20 -3
- package/dist/{chunk-O6RJ3QMU.js → chunk-ZKWKQIJU.js} +86 -6
- package/dist/{chunk-QOALB6ZD.js → chunk-ZLZ3XVPI.js} +3 -3
- package/dist/{claude-launcher-TBWV3YL3.js → claude-launcher-KEESTJHO.js} +5 -5
- package/dist/{cli-U253V422.js → cli-44WGGICQ.js} +126 -112
- package/dist/{command-IQTPFSXY.js → command-4FAP2D3P.js} +22 -23
- package/dist/connect-cmd-6DUTUK63.js +22 -0
- package/dist/{context-cleanup-DSA3HGQU.js → context-cleanup-LTH77FC3.js} +3 -3
- package/dist/{control-plane-launch-OWSNH6YA.js → control-plane-launch-SEYCOZFH.js} +8 -9
- package/dist/{dist-7IH56ELA.js → dist-SOH3O24Y.js} +2 -2
- package/dist/{docker-JU422JL7.js → docker-KMK4LOET.js} +3 -3
- package/dist/{doctor-FZTS57ZO.js → doctor-4H77CEB7.js} +24 -25
- package/dist/{emit-artifact-cmd-YLZ5WLSF.js → emit-artifact-cmd-XCZ3ALLV.js} +15 -15
- package/dist/emit-cmd-WQH2NK7H.js +15 -0
- package/dist/{emit-criteria-cmd-MF6TVE7C.js → emit-criteria-cmd-JE72JHKJ.js} +10 -10
- package/dist/{emit-finding-cmd-S3YMFTZT.js → emit-finding-cmd-ILIDRMYN.js} +10 -10
- package/dist/{emit-result-cmd-JHEUFTPX.js → emit-result-cmd-WPKG5YAS.js} +15 -15
- package/dist/{emit-step-cmd-TUI2T3DS.js → emit-step-cmd-OVMLQSL6.js} +11 -11
- package/dist/{governing-source-XSEIRSBE.js → governing-source-EQBKPME7.js} +16 -17
- package/dist/{guest-init-DF7V5D2R.js → guest-init-HWSE7W6L.js} +3 -2
- package/dist/{hook-fast-O3UUN6SO.js → hook-fast-27SHD72I.js} +1 -1
- package/dist/{hook-wrap-fast-NPLHJXFK.js → hook-wrap-fast-NOOGDNSW.js} +2 -2
- 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 +6 -6
- package/dist/{init-ZZZPYGUH.js → init-HAAHIQFN.js} +23 -24
- package/dist/{init-VZE72CR4.js → init-WQ62BXDN.js} +23 -24
- package/dist/{init-cmd-W5VV62ZN.js → init-cmd-VPFIDY64.js} +24 -24
- package/dist/init-update-UZIJ2FMU.js +529 -0
- 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/{loop-6WENRS5S.js → loop-JPW2QJ64.js} +37 -37
- package/dist/{machine-M4MQBV5A.js → machine-PGDRWPI2.js} +22 -23
- package/dist/{mcp-install-cmd-GD4QUP7Z.js → mcp-install-cmd-GGWB3JJ2.js} +2 -2
- package/dist/{mcp-serve-cmd-SBW7HYKD.js → mcp-serve-cmd-CNRC5AL5.js} +3 -3
- package/dist/{runner-identity-FTHZFMGY.js → runner-identity-IIZ3RK7M.js} +3 -3
- package/dist/{runner-key-QT7GKGEE.js → runner-key-BPP5XRYR.js} +23 -24
- package/dist/{session-sender-BK6TGNVO.js → session-sender-EKKZ5DEU.js} +16 -16
- package/dist/{settings-J2652U5N.js → settings-AKYEOCC2.js} +1 -1
- package/dist/{spec-cmd-ZNJ3GXWC.js → spec-cmd-JDHGNFVJ.js} +11 -11
- package/dist/{starter-pack-5EQYGSJF.js → starter-pack-55EFILC5.js} +7 -4
- package/dist/{status-JOO7MGIC.js → status-UCQDEMFX.js} +30 -30
- package/dist/{statusline-fast-2OK3DVAA.js → statusline-fast-GVRSBHAF.js} +2 -2
- package/dist/{sync-cmd-W2FPY3T5.js → sync-cmd-NSVXOYFJ.js} +15 -15
- package/dist/{watch-WLH5ZUZU.js → watch-NQVZWPBJ.js} +15 -15
- package/dist/{work-claim-cmd-4PLDTEZR.js → work-claim-cmd-FPJXQAXP.js} +13 -13
- package/dist/{work-cmd-KWHAYUYB.js → work-cmd-FMPDXPU6.js} +11 -11
- package/dist/{work-comment-cmd-4CUI7ZDE.js → work-comment-cmd-ZVUE2IUN.js} +11 -11
- package/dist/{work-logs-cmd-AF253WLM.js → work-logs-cmd-CQH2SYT4.js} +11 -11
- package/dist/{work-open-pr-cmd-JETE6HRL.js → work-open-pr-cmd-YY2OGJOI.js} +12 -12
- package/dist/{work-pr-cmd-V5G4CPMG.js → work-pr-cmd-EHFTEVJO.js} +11 -11
- package/dist/{work-stop-cmd-FIEKUDGE.js → work-stop-cmd-LGWSBSBT.js} +11 -11
- package/package.json +1 -1
- package/skill-pack/maintained/outerlayer-amend/SKILL.md +83 -82
- package/skill-pack/maintained/outerlayer-build/SKILL.md +4 -2
- package/skill-pack/maintained/outerlayer-build/references/agent-briefs.md +17 -4
- package/skill-pack/maintained/outerlayer-build/references/criteria-judge.md +10 -0
- package/skill-pack/maintained/outerlayer-build/references/release.md +7 -4
- package/skill-pack/maintained/outerlayer-build/references/review-briefs.md +10 -3
- package/skill-pack/maintained/outerlayer-cli/SKILL.md +13 -4
- package/skill-pack/maintained/outerlayer-cli/references/merge-base-branch.md +54 -0
- package/dist/chunk-NTRCK4NH.js +0 -38
- package/dist/chunk-QF7WZUU6.js +0 -56
- package/dist/connect-cmd-ZFOK6HEL.js +0 -17
- package/dist/emit-cmd-3W5IO5ET.js +0 -14
- package/dist/init-update-YFPIQS5G.js +0 -211
- package/dist/{chunk-F35VMF5M.js → chunk-GOSFARMS.js} +1 -1
- package/dist/{chunk-3AZYLAJC.js → chunk-QILR6TZP.js} +1 -1
- package/dist/{chunk-DIB2WLBL.js → chunk-YVZJ6GKF.js} +1 -1
|
@@ -1,36 +1,36 @@
|
|
|
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 './chunk-
|
|
14
|
-
import { hookFiredMarkerPath, installedCliDistDir } from './chunk-
|
|
3
|
+
import { gatherDoctorChecks, doctorExitCode, summarizeChecks, renderDoctorText, recordWrapped, recordUnwrapped, recordRemoval, readManifest, recordInstall, recordStatusline } from './chunk-FX6IHR5C.js';
|
|
4
|
+
import './chunk-XFGL53GU.js';
|
|
5
|
+
import './chunk-VJBFQP3H.js';
|
|
6
|
+
import { verifiedTrackerNames, TRACKERS } from './chunk-C64D7HR3.js';
|
|
7
|
+
import './chunk-ZLZ3XVPI.js';
|
|
8
|
+
import './chunk-GXV73IIS.js';
|
|
9
|
+
import './chunk-BUP5N3X6.js';
|
|
10
|
+
import './chunk-XSPA5ODY.js';
|
|
11
|
+
import './chunk-GOSFARMS.js';
|
|
12
|
+
import './chunk-MQ743JX3.js';
|
|
13
|
+
import './chunk-QS43O4DR.js';
|
|
14
|
+
import { hookFiredMarkerPath, installedCliDistDir } from './chunk-XOEV4FVK.js';
|
|
15
15
|
import './chunk-ZJSNLVCE.js';
|
|
16
|
-
import './chunk-
|
|
16
|
+
import './chunk-DXDF43YG.js';
|
|
17
17
|
import './chunk-BKO6JEZI.js';
|
|
18
18
|
import './chunk-HCVLP7XA.js';
|
|
19
19
|
import { findGitDirs } from './chunk-BJ3KTMDH.js';
|
|
20
|
-
import './chunk-
|
|
21
|
-
import './chunk-
|
|
22
|
-
import './chunk-EABW6AJQ.js';
|
|
23
|
-
import './chunk-V7SAQ645.js';
|
|
24
|
-
import './chunk-5OCIHFGE.js';
|
|
20
|
+
import './chunk-CBCKD6DO.js';
|
|
21
|
+
import './chunk-YVZJ6GKF.js';
|
|
25
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';
|
|
26
26
|
import { parseTrackerNumber, trackerNumberError } from './chunk-WZBHBH3J.js';
|
|
27
27
|
import { cliInvocation, packageRunnerOf } from './chunk-CRB3POP4.js';
|
|
28
|
-
import { settingsPath, readSettings, SettingsParseError, listHookCandidates, wrapHooks, writeSettings, unwrapHooks, REGISTERED_EVENTS, cliCommand, removeHooks, removeStatusline, cliBinResolvable, mergeHooks, repointWrappedHooks, AUTO_WRAP_EVENTS, mergeStatusline } from './chunk-
|
|
29
|
-
import './chunk-
|
|
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';
|
|
29
|
+
import './chunk-VWFOKRYS.js';
|
|
30
30
|
import { cloneIsGoverned } from './chunk-YQR6E6OV.js';
|
|
31
31
|
import { removeJournalHooks, removePreCommitGuardHook } from './chunk-TUSYOL2O.js';
|
|
32
|
-
import './chunk-
|
|
33
|
-
import './chunk-
|
|
32
|
+
import './chunk-RKOTJQVG.js';
|
|
33
|
+
import './chunk-QZBXLLTV.js';
|
|
34
34
|
import { homeFromEnv } from './chunk-VNVZDWO3.js';
|
|
35
35
|
import { resolveVersion } from './chunk-RA3O54FC.js';
|
|
36
36
|
import './chunk-OW52QLK3.js';
|
|
@@ -3651,14 +3651,17 @@ function apiKeyOption() {
|
|
|
3651
3651
|
return new Option("--api-key <key>", `deprecated: use \`${cliInvocation()} login\` or OUTERLAYER_API_KEY`).hideHelp();
|
|
3652
3652
|
}
|
|
3653
3653
|
async function installStarterPackInRepo() {
|
|
3654
|
-
const { installStarterPack, formatStarterPackOutput } = await import('./starter-pack-
|
|
3654
|
+
const { installStarterPack, formatStarterPackOutput } = await import('./starter-pack-55EFILC5.js');
|
|
3655
3655
|
const cwd = process.cwd();
|
|
3656
3656
|
let repoRoot = cwd;
|
|
3657
3657
|
try {
|
|
3658
3658
|
repoRoot = execFileSync("git", ["rev-parse", "--show-toplevel"], { cwd, encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] }).trim() || cwd;
|
|
3659
3659
|
} catch {
|
|
3660
3660
|
}
|
|
3661
|
-
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);
|
|
3662
3665
|
return { result, output: formatStarterPackOutput(result) };
|
|
3663
3666
|
}
|
|
3664
3667
|
function formatInitOutput(result, opts = {}) {
|
|
@@ -3781,8 +3784,8 @@ ${starter.output}`),
|
|
|
3781
3784
|
}
|
|
3782
3785
|
}
|
|
3783
3786
|
async function realConnectDepsForCwd() {
|
|
3784
|
-
const { realConnectDeps } = await import('./connect-cmd-
|
|
3785
|
-
const { resolveRepoIdentity } = await import('./dist-
|
|
3787
|
+
const { realConnectDeps } = await import('./connect-cmd-6DUTUK63.js');
|
|
3788
|
+
const { resolveRepoIdentity } = await import('./dist-SOH3O24Y.js');
|
|
3786
3789
|
return {
|
|
3787
3790
|
...realConnectDeps(),
|
|
3788
3791
|
home: homeFromEnv(),
|
|
@@ -3800,7 +3803,7 @@ function buildProgram(argv = process.argv) {
|
|
|
3800
3803
|
program2.name(cliInvocation()).description("OuterLayer \u2014 see what your coding agents actually do").enablePositionalOptions().version(resolveVersion()).hook("preAction", (_root, command) => {
|
|
3801
3804
|
if (command.opts().apiKey !== void 0) warnDeprecated(API_KEY_FLAG_DEPRECATION);
|
|
3802
3805
|
}).option(NO_COLOR_FLAG, "disable color (NO_COLOR=1 does the same)").addHelpText("after", SUPPORT_TEXT);
|
|
3803
|
-
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(
|
|
3804
3807
|
"after",
|
|
3805
3808
|
`
|
|
3806
3809
|
In a repository, init runs four steps: connect the repository to a
|
|
@@ -3811,20 +3814,20 @@ login it skips the connect step and says to run \`${cliInvocation()} login\`. Wi
|
|
|
3811
3814
|
skipped or failed. The exit code is 1 when a step failed.
|
|
3812
3815
|
|
|
3813
3816
|
The agent setup step installs the starter skills and the \`outerlayer\` skill
|
|
3814
|
-
into .
|
|
3815
|
-
|
|
3816
|
-
.claude/skills
|
|
3817
|
-
.mcp.json. Nothing
|
|
3818
|
-
|
|
3819
|
-
|
|
3820
|
-
|
|
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.
|
|
3821
3825
|
The step is skipped outside a git repository and in a repository whose
|
|
3822
3826
|
context comes from a control plane, where it arrives at session start.
|
|
3823
3827
|
|
|
3824
3828
|
--local installs only the hooks: no connect step, no agent setup and no
|
|
3825
3829
|
network call. Add \`--template default\` to also write the starter skills and
|
|
3826
|
-
a policy file
|
|
3827
|
-
emit\` does that.
|
|
3830
|
+
a policy file, with nothing to compile.
|
|
3828
3831
|
|
|
3829
3832
|
Idempotent: settings are backed up before any write, and a second run
|
|
3830
3833
|
changes nothing. Wrapping adds one spawn per hook firing; undo it with
|
|
@@ -3832,26 +3835,29 @@ changes nothing. Wrapping adds one spawn per hook firing; undo it with
|
|
|
3832
3835
|
replaced.
|
|
3833
3836
|
|
|
3834
3837
|
Three of the starter skills are copied once and are yours to edit. The
|
|
3835
|
-
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.
|
|
3836
3840
|
|
|
3837
|
-
--update
|
|
3838
|
-
|
|
3839
|
-
|
|
3840
|
-
|
|
3841
|
-
|
|
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
|
|
3842
3849
|
uncommitted. --dry-run prints the plan, with a command to compare each
|
|
3843
|
-
edited file, and writes nothing.
|
|
3844
|
-
|
|
3845
|
-
`
|
|
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"
|
|
3846
3852
|
).action(async (opts) => {
|
|
3847
3853
|
if (opts.update || opts.dryRun) {
|
|
3848
|
-
const { runInitUpdate, formatInitUpdate, updateFlagProblem } = await import('./init-update-
|
|
3854
|
+
const { runInitUpdate, formatInitUpdate, updateFlagProblem } = await import('./init-update-UZIJ2FMU.js');
|
|
3849
3855
|
const problem = updateFlagProblem(opts);
|
|
3850
3856
|
if (problem !== void 0) {
|
|
3851
3857
|
fail(problem);
|
|
3852
3858
|
return;
|
|
3853
3859
|
}
|
|
3854
|
-
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 });
|
|
3855
3861
|
if (opts.json) writeJson(result);
|
|
3856
3862
|
else process.stdout.write(formatInitUpdate(result));
|
|
3857
3863
|
if (result.status === "failed") process.exitCode = 1;
|
|
@@ -3859,7 +3865,7 @@ states under Starter files.
|
|
|
3859
3865
|
}
|
|
3860
3866
|
let starterTemplate;
|
|
3861
3867
|
if (opts.template !== void 0) {
|
|
3862
|
-
const { assertKnownTemplate, StarterPackError } = await import('./starter-pack-
|
|
3868
|
+
const { assertKnownTemplate, StarterPackError } = await import('./starter-pack-55EFILC5.js');
|
|
3863
3869
|
try {
|
|
3864
3870
|
assertKnownTemplate(opts.template);
|
|
3865
3871
|
} catch (err) {
|
|
@@ -3892,12 +3898,12 @@ states under Starter files.
|
|
|
3892
3898
|
if (changed.length > 0 && !opts.json) process.stdout.write(`Removed the claude function from ${changed.join(", ")}.
|
|
3893
3899
|
`);
|
|
3894
3900
|
}
|
|
3895
|
-
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-VPFIDY64.js')).applyShellFunctionFlag(opts.shellFunction, { home: homeFromEnv(), shellPath: process.env.SHELL }) : void 0;
|
|
3896
3902
|
if (opts.json) writeJson(shell === void 0 ? outcome.result : { ...outcome.result, shellFunction: { outcome: shell.outcome, reason: shell.reason } });
|
|
3897
3903
|
else process.stdout.write(outcome.text + (shell?.text ?? ""));
|
|
3898
3904
|
return;
|
|
3899
3905
|
}
|
|
3900
|
-
const { runInitCommand } = await import('./init-cmd-
|
|
3906
|
+
const { runInitCommand } = await import('./init-cmd-VPFIDY64.js');
|
|
3901
3907
|
const code = await runInitCommand(
|
|
3902
3908
|
{ json: opts.json, factory: opts.factory, shellFunction: opts.shellFunction },
|
|
3903
3909
|
{
|
|
@@ -3909,8 +3915,8 @@ states under Starter files.
|
|
|
3909
3915
|
return { ok, text, detail };
|
|
3910
3916
|
},
|
|
3911
3917
|
runAgentSetup: async () => {
|
|
3912
|
-
const { runAgentSetup } = await import('./agent-setup-
|
|
3913
|
-
return runAgentSetup({ cwd: process.cwd() });
|
|
3918
|
+
const { runAgentSetup } = await import('./agent-setup-SNDCEHG2.js');
|
|
3919
|
+
return runAgentSetup({ cwd: process.cwd(), skillsLink: opts.skillsLink !== false });
|
|
3914
3920
|
},
|
|
3915
3921
|
runDoctorChecks: gatherDoctorChecks,
|
|
3916
3922
|
shell: {
|
|
@@ -3918,7 +3924,7 @@ states under Starter files.
|
|
|
3918
3924
|
shellPath: process.env.SHELL,
|
|
3919
3925
|
interactive: Boolean(process.stdin.isTTY && process.stderr.isTTY) && opts.json !== true,
|
|
3920
3926
|
ask: async () => {
|
|
3921
|
-
const { promptOnTerminal } = await import('./connect-cmd-
|
|
3927
|
+
const { promptOnTerminal } = await import('./connect-cmd-6DUTUK63.js');
|
|
3922
3928
|
const answer = await promptOnTerminal({
|
|
3923
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.`,
|
|
3924
3930
|
options: [
|
|
@@ -3957,7 +3963,7 @@ linked (true, false, or null when it could not be checked) and, when false,
|
|
|
3957
3963
|
linkUrl.
|
|
3958
3964
|
`
|
|
3959
3965
|
).action(async (opts) => {
|
|
3960
|
-
const { runConnectCommand } = await import('./connect-cmd-
|
|
3966
|
+
const { runConnectCommand } = await import('./connect-cmd-6DUTUK63.js');
|
|
3961
3967
|
const code = await runConnectCommand({ factory: opts.factory, json: opts.json }, await realConnectDepsForCwd(), {
|
|
3962
3968
|
stdout: process.stdout,
|
|
3963
3969
|
stderr: process.stderr
|
|
@@ -3996,7 +4002,7 @@ Every later command reads the saved file, so none of them needs a key on
|
|
|
3996
4002
|
its command line. A saved key is checked for real on the first \`sync\`.
|
|
3997
4003
|
`
|
|
3998
4004
|
).action(async (opts) => {
|
|
3999
|
-
const { runLoginCommand, realLoginDeps } = await import('./login-browser-
|
|
4005
|
+
const { runLoginCommand, realLoginDeps } = await import('./login-browser-4OMZFP3U.js');
|
|
4000
4006
|
const code = await runLoginCommand(
|
|
4001
4007
|
{
|
|
4002
4008
|
browser: opts.browser !== false,
|
|
@@ -4020,7 +4026,7 @@ dashboard cannot be reached the local copy is still deleted and the exit
|
|
|
4020
4026
|
code is 1: revoke the token on /profile/security.
|
|
4021
4027
|
`
|
|
4022
4028
|
).action(async () => {
|
|
4023
|
-
const { runLogoutCommand, realLogoutDeps } = await import('./logout-cmd-
|
|
4029
|
+
const { runLogoutCommand, realLogoutDeps } = await import('./logout-cmd-5V5MMBSY.js');
|
|
4024
4030
|
const code = await runLogoutCommand(realLogoutDeps());
|
|
4025
4031
|
if (code !== 0) process.exitCode = code;
|
|
4026
4032
|
});
|
|
@@ -4029,13 +4035,13 @@ code is 1: revoke the token on /profile/security.
|
|
|
4029
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"
|
|
4030
4036
|
).action(async (opts) => {
|
|
4031
4037
|
if (opts.link !== void 0) {
|
|
4032
|
-
const { lookupArtifactLink } = await import('./artifact-link-cmd-
|
|
4038
|
+
const { lookupArtifactLink } = await import('./artifact-link-cmd-LEI6EOZE.js');
|
|
4033
4039
|
const found = lookupArtifactLink(opts.link);
|
|
4034
4040
|
if (found.ok) process.stdout.write(found.url + "\n");
|
|
4035
4041
|
else fail(found.reason);
|
|
4036
4042
|
return;
|
|
4037
4043
|
}
|
|
4038
|
-
const { runSync, SyncConfigError, SyncTransportError } = await import('./sync-cmd-
|
|
4044
|
+
const { runSync, SyncConfigError, SyncTransportError } = await import('./sync-cmd-NSVXOYFJ.js');
|
|
4039
4045
|
try {
|
|
4040
4046
|
const result = await runSync({
|
|
4041
4047
|
url: opts.url,
|
|
@@ -4066,7 +4072,7 @@ code is 1: revoke the token on /profile/security.
|
|
|
4066
4072
|
if (invokedCommandToken(argv) === "watch") {
|
|
4067
4073
|
warnDeprecated(`\`${cliInvocation()} watch\` is now \`${cliInvocation()} daemon\`; the old name will be removed in a future release.`);
|
|
4068
4074
|
}
|
|
4069
|
-
const { runWatch } = await import('./watch-
|
|
4075
|
+
const { runWatch } = await import('./watch-NQVZWPBJ.js');
|
|
4070
4076
|
await runWatch({ once: opts.once });
|
|
4071
4077
|
});
|
|
4072
4078
|
program2.command("hook <event>", { hidden: true }).description("capture-hook fast path, installed by `init`").action(() => {
|
|
@@ -4156,7 +4162,7 @@ code is 1: revoke the token on /profile/security.
|
|
|
4156
4162
|
process.exitCode = await runBuildCommand({ dir: opts.dir, argv: command });
|
|
4157
4163
|
});
|
|
4158
4164
|
program2.command("session-sender", { hidden: true }).description("stream a runner build's sessions to its work item while the build runs").action(async () => {
|
|
4159
|
-
const { runSessionSender } = await import('./session-sender-
|
|
4165
|
+
const { runSessionSender } = await import('./session-sender-EKKZ5DEU.js');
|
|
4160
4166
|
try {
|
|
4161
4167
|
await runSessionSender();
|
|
4162
4168
|
} catch (err) {
|
|
@@ -4164,7 +4170,7 @@ code is 1: revoke the token on /profile/security.
|
|
|
4164
4170
|
}
|
|
4165
4171
|
});
|
|
4166
4172
|
program2.command("vm-init", { hidden: true }).description("lay out a microVM build's guest; the guest helper runs it").action(async () => {
|
|
4167
|
-
const { realGuestHost, runGuestInit } = await import('./guest-init-
|
|
4173
|
+
const { realGuestHost, runGuestInit } = await import('./guest-init-HWSE7W6L.js');
|
|
4168
4174
|
const { readFileSync: readFileSync3 } = await import('fs');
|
|
4169
4175
|
try {
|
|
4170
4176
|
runGuestInit(realGuestHost(), readFileSync3("/proc/cmdline", "utf8"));
|
|
@@ -4172,6 +4178,14 @@ code is 1: revoke the token on /profile/security.
|
|
|
4172
4178
|
fail(`vm-init failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
4173
4179
|
}
|
|
4174
4180
|
});
|
|
4181
|
+
program2.command("vm-forward", { hidden: true }).description("pipe a guest port to another; vm-init runs it").requiredOption("--listen <host:port>", "the address to listen on").requiredOption("--to <host:port>", "the address to pipe each connection to").action(async (opts) => {
|
|
4182
|
+
const { startBridgeForward } = await import('./bridge-QFN3KJP6.js');
|
|
4183
|
+
try {
|
|
4184
|
+
await startBridgeForward(opts);
|
|
4185
|
+
} catch (err) {
|
|
4186
|
+
fail(`vm-forward failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
4187
|
+
}
|
|
4188
|
+
});
|
|
4175
4189
|
registerEmitCommands(program2);
|
|
4176
4190
|
registerImportCommands(program2);
|
|
4177
4191
|
registerHooksCommands(program2);
|
|
@@ -4192,7 +4206,7 @@ async function runCli(processArgv) {
|
|
|
4192
4206
|
await buildProgram(argv).parseAsync(argv);
|
|
4193
4207
|
}
|
|
4194
4208
|
async function compileContext(opts) {
|
|
4195
|
-
const { runEmit, EmitError } = await import('./emit-cmd-
|
|
4209
|
+
const { runEmit, EmitError } = await import('./emit-cmd-WQH2NK7H.js');
|
|
4196
4210
|
try {
|
|
4197
4211
|
const result = runEmit({ cwd: opts.dir, check: opts.check, json: opts.json });
|
|
4198
4212
|
if (result.exitCode !== 0) process.exitCode = result.exitCode;
|
|
@@ -4239,7 +4253,7 @@ Compiling .outerlayer/ moved to \`${cliInvocation()} context emit\`.
|
|
|
4239
4253
|
await compileContext({ dir: opts.dir, check: opts.check, json: opts.json });
|
|
4240
4254
|
return;
|
|
4241
4255
|
}
|
|
4242
|
-
const { runEmitResult, EmitResultError } = await import('./emit-result-cmd-
|
|
4256
|
+
const { runEmitResult, EmitResultError } = await import('./emit-result-cmd-WPKG5YAS.js');
|
|
4243
4257
|
try {
|
|
4244
4258
|
const result = await runEmitResult({
|
|
4245
4259
|
name,
|
|
@@ -4289,7 +4303,7 @@ everywhere, bytes and deep link untouched; a still-queued one is cancelled
|
|
|
4289
4303
|
locally so it never uploads. One correction can retire several duplicates.
|
|
4290
4304
|
`
|
|
4291
4305
|
).action(async (file, opts) => {
|
|
4292
|
-
const { runEmitArtifact, EmitArtifactError } = await import('./emit-artifact-cmd-
|
|
4306
|
+
const { runEmitArtifact, EmitArtifactError } = await import('./emit-artifact-cmd-XCZ3ALLV.js');
|
|
4293
4307
|
let pr;
|
|
4294
4308
|
if (opts.pr !== void 0) {
|
|
4295
4309
|
pr = parseTrackerNumber(opts.pr);
|
|
@@ -4348,7 +4362,7 @@ recent events with their ids. --find <text> searches all of them.
|
|
|
4348
4362
|
item that session was launched for is used automatically.
|
|
4349
4363
|
`
|
|
4350
4364
|
).action(async (opts) => {
|
|
4351
|
-
const { runEmitFinding, refuseRemovedFindingFlags, EmitFindingError } = await import('./emit-finding-cmd-
|
|
4365
|
+
const { runEmitFinding, refuseRemovedFindingFlags, EmitFindingError } = await import('./emit-finding-cmd-ILIDRMYN.js');
|
|
4352
4366
|
try {
|
|
4353
4367
|
refuseRemovedFindingFlags(opts);
|
|
4354
4368
|
const result = await runEmitFinding({
|
|
@@ -4415,7 +4429,7 @@ the whole batch. "untimed": true records one with no time on purpose.
|
|
|
4415
4429
|
that session was launched for is used automatically.
|
|
4416
4430
|
`
|
|
4417
4431
|
).action(async (file, opts) => {
|
|
4418
|
-
const { runEmitFindings, EmitFindingError } = await import('./emit-finding-cmd-
|
|
4432
|
+
const { runEmitFindings, EmitFindingError } = await import('./emit-finding-cmd-ILIDRMYN.js');
|
|
4419
4433
|
try {
|
|
4420
4434
|
const result = await runEmitFindings({
|
|
4421
4435
|
file,
|
|
@@ -4450,7 +4464,7 @@ command, the command exits 0, and \`sync\` sends it later. If the gateway refuse
|
|
|
4450
4464
|
the step, the command prints why and exits 1.
|
|
4451
4465
|
`
|
|
4452
4466
|
).action(async (name, opts) => {
|
|
4453
|
-
const { runEmitStep, EmitStepError } = await import('./emit-step-cmd-
|
|
4467
|
+
const { runEmitStep, EmitStepError } = await import('./emit-step-cmd-OVMLQSL6.js');
|
|
4454
4468
|
try {
|
|
4455
4469
|
await runEmitStep({
|
|
4456
4470
|
name,
|
|
@@ -4493,7 +4507,7 @@ of the item, and a (proof: <kind>) annotation names its proof.
|
|
|
4493
4507
|
${cliInvocation()} emit criteria acceptance/412-login.md --item 412
|
|
4494
4508
|
`
|
|
4495
4509
|
).action(async (file, opts) => {
|
|
4496
|
-
const { runEmitCriteria, EmitCriteriaError } = await import('./emit-criteria-cmd-
|
|
4510
|
+
const { runEmitCriteria, EmitCriteriaError } = await import('./emit-criteria-cmd-JE72JHKJ.js');
|
|
4497
4511
|
try {
|
|
4498
4512
|
const result = await runEmitCriteria({
|
|
4499
4513
|
file,
|
|
@@ -4517,9 +4531,9 @@ function registerSpecCommands(program2) {
|
|
|
4517
4531
|
const specCmd = program2.command("spec").description("Find, file and edit the issue a spec lives in, in your factory's tracker");
|
|
4518
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)");
|
|
4519
4533
|
const run = async (action) => {
|
|
4520
|
-
const { WorkCommandError } = await import('./work-cmd-
|
|
4534
|
+
const { WorkCommandError } = await import('./work-cmd-FMPDXPU6.js');
|
|
4521
4535
|
try {
|
|
4522
|
-
await action(await import('./spec-cmd-
|
|
4536
|
+
await action(await import('./spec-cmd-JDHGNFVJ.js'));
|
|
4523
4537
|
} catch (err) {
|
|
4524
4538
|
if (err instanceof WorkCommandError) {
|
|
4525
4539
|
fail(err.message);
|
|
@@ -4561,7 +4575,7 @@ takes it, and prints the line that starts your session on it. That
|
|
|
4561
4575
|
session links itself and holds the item's lease while it works.
|
|
4562
4576
|
`
|
|
4563
4577
|
).action(async (opts) => {
|
|
4564
|
-
const { runWorkBuild, WorkCommandError } = await import('./work-cmd-
|
|
4578
|
+
const { runWorkBuild, WorkCommandError } = await import('./work-cmd-FMPDXPU6.js');
|
|
4565
4579
|
try {
|
|
4566
4580
|
await runWorkBuild(opts);
|
|
4567
4581
|
} catch (err) {
|
|
@@ -4584,7 +4598,7 @@ renews that session's own 20-minute lease, unless --no-lease or
|
|
|
4584
4598
|
--ended is given, or another worker already holds a live one.
|
|
4585
4599
|
`
|
|
4586
4600
|
).action(async (number, opts) => {
|
|
4587
|
-
const { runWorkLinkSession, WorkCommandError } = await import('./work-cmd-
|
|
4601
|
+
const { runWorkLinkSession, WorkCommandError } = await import('./work-cmd-FMPDXPU6.js');
|
|
4588
4602
|
try {
|
|
4589
4603
|
await runWorkLinkSession({ ...opts, number, noLease: opts.lease === false, logFailures: opts.logFailures === true });
|
|
4590
4604
|
} catch (err) {
|
|
@@ -4608,8 +4622,8 @@ criterion's new proof; --ready hands the thread back to a person. At
|
|
|
4608
4622
|
most one action flag may be given.
|
|
4609
4623
|
`
|
|
4610
4624
|
).action(async (opts) => {
|
|
4611
|
-
const { runWorkComment, WorkCommentCommandError } = await import('./work-comment-cmd-
|
|
4612
|
-
const { WorkCommandError } = await import('./work-cmd-
|
|
4625
|
+
const { runWorkComment, WorkCommentCommandError } = await import('./work-comment-cmd-ZVUE2IUN.js');
|
|
4626
|
+
const { WorkCommandError } = await import('./work-cmd-FMPDXPU6.js');
|
|
4613
4627
|
try {
|
|
4614
4628
|
await runWorkComment(opts);
|
|
4615
4629
|
} catch (err) {
|
|
@@ -4630,8 +4644,8 @@ criterion that carries proof or a comment, each with who is waiting
|
|
|
4630
4644
|
on whom next.
|
|
4631
4645
|
`
|
|
4632
4646
|
).action(async (opts) => {
|
|
4633
|
-
const { runWorkThreads, WorkCommentCommandError } = await import('./work-comment-cmd-
|
|
4634
|
-
const { WorkCommandError } = await import('./work-cmd-
|
|
4647
|
+
const { runWorkThreads, WorkCommentCommandError } = await import('./work-comment-cmd-ZVUE2IUN.js');
|
|
4648
|
+
const { WorkCommandError } = await import('./work-cmd-FMPDXPU6.js');
|
|
4635
4649
|
try {
|
|
4636
4650
|
await runWorkThreads(opts);
|
|
4637
4651
|
} catch (err) {
|
|
@@ -4655,8 +4669,8 @@ still running, or that an older runner released, has no log and the
|
|
|
4655
4669
|
command exits 1.
|
|
4656
4670
|
`
|
|
4657
4671
|
).action(async (opts) => {
|
|
4658
|
-
const { runWorkLogs, WorkLogsCommandError } = await import('./work-logs-cmd-
|
|
4659
|
-
const { WorkCommandError } = await import('./work-cmd-
|
|
4672
|
+
const { runWorkLogs, WorkLogsCommandError } = await import('./work-logs-cmd-CQH2SYT4.js');
|
|
4673
|
+
const { WorkCommandError } = await import('./work-cmd-FMPDXPU6.js');
|
|
4660
4674
|
try {
|
|
4661
4675
|
await runWorkLogs(opts);
|
|
4662
4676
|
} catch (err) {
|
|
@@ -4679,8 +4693,8 @@ item is not built again until a new build request. Exits 1 when no host
|
|
|
4679
4693
|
build is running for the item.
|
|
4680
4694
|
`
|
|
4681
4695
|
).action(async (opts) => {
|
|
4682
|
-
const { runWorkStop, WorkStopCommandError } = await import('./work-stop-cmd-
|
|
4683
|
-
const { WorkCommandError } = await import('./work-cmd-
|
|
4696
|
+
const { runWorkStop, WorkStopCommandError } = await import('./work-stop-cmd-LGWSBSBT.js');
|
|
4697
|
+
const { WorkCommandError } = await import('./work-cmd-FMPDXPU6.js');
|
|
4684
4698
|
try {
|
|
4685
4699
|
await runWorkStop(opts);
|
|
4686
4700
|
} catch (err) {
|
|
@@ -4701,7 +4715,7 @@ deletes anything \u2014 the item is removed from Work only once no
|
|
|
4701
4715
|
live addition remains on it.
|
|
4702
4716
|
`
|
|
4703
4717
|
).action(async (opts) => {
|
|
4704
|
-
const { runWorkRemove, WorkCommandError } = await import('./work-cmd-
|
|
4718
|
+
const { runWorkRemove, WorkCommandError } = await import('./work-cmd-FMPDXPU6.js');
|
|
4705
4719
|
try {
|
|
4706
4720
|
await runWorkRemove(opts);
|
|
4707
4721
|
} catch (err) {
|
|
@@ -4713,7 +4727,7 @@ live addition remains on it.
|
|
|
4713
4727
|
}
|
|
4714
4728
|
});
|
|
4715
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) => {
|
|
4716
|
-
const { runWorkStatus, WorkCommandError } = await import('./work-cmd-
|
|
4730
|
+
const { runWorkStatus, WorkCommandError } = await import('./work-cmd-FMPDXPU6.js');
|
|
4717
4731
|
try {
|
|
4718
4732
|
await runWorkStatus(opts);
|
|
4719
4733
|
} catch (err) {
|
|
@@ -4725,7 +4739,7 @@ live addition remains on it.
|
|
|
4725
4739
|
}
|
|
4726
4740
|
});
|
|
4727
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) => {
|
|
4728
|
-
const { runWorkList, WorkCommandError } = await import('./work-cmd-
|
|
4742
|
+
const { runWorkList, WorkCommandError } = await import('./work-cmd-FMPDXPU6.js');
|
|
4729
4743
|
try {
|
|
4730
4744
|
await runWorkList(opts);
|
|
4731
4745
|
} catch (err) {
|
|
@@ -4746,7 +4760,7 @@ by a different key is refused; claiming again with the same key extends
|
|
|
4746
4760
|
it. --host is a label only.
|
|
4747
4761
|
`
|
|
4748
4762
|
).action(async (opts) => {
|
|
4749
|
-
const { runWorkClaim, WorkCommandError } = await import('./work-claim-cmd-
|
|
4763
|
+
const { runWorkClaim, WorkCommandError } = await import('./work-claim-cmd-FPJXQAXP.js');
|
|
4750
4764
|
try {
|
|
4751
4765
|
await runWorkClaim(opts);
|
|
4752
4766
|
} catch (err) {
|
|
@@ -4766,7 +4780,7 @@ Extends the live lease this API key holds. Refused with a 410 if the
|
|
|
4766
4780
|
lease has expired, or a 403 if a different key holds it.
|
|
4767
4781
|
`
|
|
4768
4782
|
).action(async (opts) => {
|
|
4769
|
-
const { runWorkRenew, WorkCommandError } = await import('./work-claim-cmd-
|
|
4783
|
+
const { runWorkRenew, WorkCommandError } = await import('./work-claim-cmd-FPJXQAXP.js');
|
|
4770
4784
|
try {
|
|
4771
4785
|
await runWorkRenew(opts);
|
|
4772
4786
|
} catch (err) {
|
|
@@ -4798,7 +4812,7 @@ applies to a host's lease only. A later tool call in the session
|
|
|
4798
4812
|
takes the lease again.
|
|
4799
4813
|
`
|
|
4800
4814
|
).action(async (opts) => {
|
|
4801
|
-
const { runWorkRelease, WorkCommandError } = await import('./work-claim-cmd-
|
|
4815
|
+
const { runWorkRelease, WorkCommandError } = await import('./work-claim-cmd-FPJXQAXP.js');
|
|
4802
4816
|
try {
|
|
4803
4817
|
await runWorkRelease(opts);
|
|
4804
4818
|
} catch (err) {
|
|
@@ -4825,7 +4839,7 @@ Idempotent: declaring the same pull request twice is a no-op.
|
|
|
4825
4839
|
needs your own login; an agent session or a factory key is refused.
|
|
4826
4840
|
`
|
|
4827
4841
|
).action(async (number, opts) => {
|
|
4828
|
-
const { runWorkPr, WorkPrCommandError } = await import('./work-pr-cmd-
|
|
4842
|
+
const { runWorkPr, WorkPrCommandError } = await import('./work-pr-cmd-EHFTEVJO.js');
|
|
4829
4843
|
try {
|
|
4830
4844
|
await runWorkPr({ ...opts, number });
|
|
4831
4845
|
} catch (err) {
|
|
@@ -4850,8 +4864,8 @@ login, then declares the pull request on the item, as \`work pr\` does.
|
|
|
4850
4864
|
Run it again after a change to the title or description.
|
|
4851
4865
|
`
|
|
4852
4866
|
).action(async (opts) => {
|
|
4853
|
-
const { runWorkOpenPr, WorkOpenPrCommandError } = await import('./work-open-pr-cmd-
|
|
4854
|
-
const { WorkCommandError } = await import('./work-cmd-
|
|
4867
|
+
const { runWorkOpenPr, WorkOpenPrCommandError } = await import('./work-open-pr-cmd-YY2OGJOI.js');
|
|
4868
|
+
const { WorkCommandError } = await import('./work-cmd-FMPDXPU6.js');
|
|
4855
4869
|
try {
|
|
4856
4870
|
await runWorkOpenPr(opts);
|
|
4857
4871
|
} catch (err) {
|
|
@@ -4868,7 +4882,7 @@ function registerRunnerCommands(program2) {
|
|
|
4868
4882
|
const configOption = "the cloud config file to run against (default: ~/.outerlayer/config.json)";
|
|
4869
4883
|
runnerCmd.command("start").description("Run the loop: claim work, run it, report, clean up, repeat").option("--config <path>", configOption).action(async (opts) => {
|
|
4870
4884
|
const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-H4QS332G.js');
|
|
4871
|
-
const { start, RunnerStartError } = await import('./loop-
|
|
4885
|
+
const { start, RunnerStartError } = await import('./loop-JPW2QJ64.js');
|
|
4872
4886
|
const { RunnerAlreadyRunningError } = await import('./pidfile-G2J5WBQS.js');
|
|
4873
4887
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
4874
4888
|
try {
|
|
@@ -4884,7 +4898,7 @@ function registerRunnerCommands(program2) {
|
|
|
4884
4898
|
});
|
|
4885
4899
|
runnerCmd.command("check").description("Validate the config, the hooks and the key, and print the effective settings").option("--config <path>", configOption).action(async (opts) => {
|
|
4886
4900
|
const { defaultRunnerConfigPath } = await import('./config-H4QS332G.js');
|
|
4887
|
-
const { runRunnerCheck } = await import('./check-
|
|
4901
|
+
const { runRunnerCheck } = await import('./check-3CGLWMHM.js');
|
|
4888
4902
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
4889
4903
|
const result = await runRunnerCheck(configPath);
|
|
4890
4904
|
if (!result.ok) {
|
|
@@ -4913,7 +4927,7 @@ function registerRunnerCommands(program2) {
|
|
|
4913
4927
|
}
|
|
4914
4928
|
try {
|
|
4915
4929
|
if (opts.service === true) {
|
|
4916
|
-
const { installServiceCommand } = await import('./command-
|
|
4930
|
+
const { installServiceCommand } = await import('./command-4FAP2D3P.js');
|
|
4917
4931
|
const result2 = await installServiceCommand({
|
|
4918
4932
|
configPath,
|
|
4919
4933
|
print: opts.print,
|
|
@@ -4969,7 +4983,7 @@ To keep it running, run ${C.yellow}${cliInvocation()} runner install --service${
|
|
|
4969
4983
|
return;
|
|
4970
4984
|
}
|
|
4971
4985
|
const { defaultRunnerConfigPath } = await import('./config-H4QS332G.js');
|
|
4972
|
-
const { uninstallServiceCommand } = await import('./command-
|
|
4986
|
+
const { uninstallServiceCommand } = await import('./command-4FAP2D3P.js');
|
|
4973
4987
|
const result = await uninstallServiceCommand({ configPath: opts.config ?? defaultRunnerConfigPath(), unitName: opts.unitName, home: homeFromEnv() });
|
|
4974
4988
|
if (result.ok) for (const line of result.lines) process.stdout.write(`${C.green}\u2713${C.reset} ${line}
|
|
4975
4989
|
`);
|
|
@@ -4997,10 +5011,10 @@ already in runner.env is used.
|
|
|
4997
5011
|
`
|
|
4998
5012
|
).action(async (opts) => {
|
|
4999
5013
|
const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-H4QS332G.js');
|
|
5000
|
-
const { prepareRunnerInit, runRunnerInit, RunnerInitError, writeRunnerInit } = await import('./init-
|
|
5001
|
-
const { obtainRunnerKey, runnerKeyLogin } = await import('./runner-key-
|
|
5002
|
-
const { detectMachine } = await import('./machine-
|
|
5003
|
-
const { chooseVm, runVmInit, VmInitError } = await import('./init-
|
|
5014
|
+
const { prepareRunnerInit, runRunnerInit, RunnerInitError, writeRunnerInit } = await import('./init-WQ62BXDN.js');
|
|
5015
|
+
const { obtainRunnerKey, runnerKeyLogin } = await import('./runner-key-BPP5XRYR.js');
|
|
5016
|
+
const { detectMachine } = await import('./machine-PGDRWPI2.js');
|
|
5017
|
+
const { chooseVm, runVmInit, VmInitError } = await import('./init-HAAHIQFN.js');
|
|
5004
5018
|
const { AGENT_COMMANDS, credentialFromStdin, isAgentName, restartForCredential, RunnerEnvError } = await import('./runner-env-GZHXM27A.js');
|
|
5005
5019
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
5006
5020
|
if (opts.agent !== void 0 && !isAgentName(opts.agent)) {
|
|
@@ -5015,7 +5029,7 @@ already in runner.env is used.
|
|
|
5015
5029
|
try {
|
|
5016
5030
|
let credential;
|
|
5017
5031
|
if (agent !== void 0) {
|
|
5018
|
-
const { readPipedKey } = await import('./login-browser-
|
|
5032
|
+
const { readPipedKey } = await import('./login-browser-4OMZFP3U.js');
|
|
5019
5033
|
credential = credentialFromStdin(
|
|
5020
5034
|
await readPipedKey(process.stdin, {
|
|
5021
5035
|
onWaiting: () => process.stderr.write(`runner init is waiting for Claude's credential on stdin; close stdin to use the one already in runner.env
|
|
@@ -5151,7 +5165,7 @@ ${C.yellow}The runner will not update itself: ${installErr.message}${C.reset}
|
|
|
5151
5165
|
let serviceUp = false;
|
|
5152
5166
|
let restart;
|
|
5153
5167
|
if (installedLayout) {
|
|
5154
|
-
const { installServiceCommand } = await import('./command-
|
|
5168
|
+
const { installServiceCommand } = await import('./command-4FAP2D3P.js');
|
|
5155
5169
|
const service = await installServiceCommand({
|
|
5156
5170
|
configPath,
|
|
5157
5171
|
entryPath: process.argv[1] ?? "",
|
|
@@ -5196,10 +5210,10 @@ Next:
|
|
|
5196
5210
|
"\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"
|
|
5197
5211
|
).action(async (opts) => {
|
|
5198
5212
|
const { defaultRunnerConfigPath } = await import('./config-H4QS332G.js');
|
|
5199
|
-
const { buildRepositoryImage, RecipeError } = await import('./build-
|
|
5213
|
+
const { buildRepositoryImage, RecipeError } = await import('./build-WHHFA7KM.js');
|
|
5200
5214
|
const { currentCliBuild } = await import('./cli-build-K56DK4DS.js');
|
|
5201
|
-
const { createDockerHost } = await import('./docker-
|
|
5202
|
-
const { builderSpec } = await import('./builder-
|
|
5215
|
+
const { createDockerHost } = await import('./docker-KMK4LOET.js');
|
|
5216
|
+
const { builderSpec } = await import('./builder-7FBQAWQZ.js');
|
|
5203
5217
|
const { loadRunnerConfig } = await import('./config-H4QS332G.js');
|
|
5204
5218
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
5205
5219
|
const loaded = (() => {
|
|
@@ -5211,11 +5225,11 @@ Next:
|
|
|
5211
5225
|
})();
|
|
5212
5226
|
const memory = loaded?.build?.memory ?? "8g";
|
|
5213
5227
|
try {
|
|
5214
|
-
const { ensureRunnerIdentity } = await import('./runner-identity-
|
|
5228
|
+
const { ensureRunnerIdentity } = await import('./runner-identity-IIZ3RK7M.js');
|
|
5215
5229
|
await ensureRunnerIdentity(configPath, { log: (line) => console.error(line) }).catch((err) => {
|
|
5216
5230
|
console.error(`the runner's Docker identity could not be stored: ${err instanceof Error ? err.message : String(err)}`);
|
|
5217
5231
|
});
|
|
5218
|
-
const { imageTargetFor } = await import('./governing-source-
|
|
5232
|
+
const { imageTargetFor } = await import('./governing-source-EQBKPME7.js');
|
|
5219
5233
|
const target = await imageTargetFor({ config: loaded, repository: opts.repository, fetchImpl: fetch });
|
|
5220
5234
|
if (!target.ok) {
|
|
5221
5235
|
if (opts.json) {
|
|
@@ -5279,15 +5293,15 @@ Next:
|
|
|
5279
5293
|
});
|
|
5280
5294
|
runnerCmd.command("stop").description("Take no more work; wait for running jobs to finish, then exit").option("--config <path>", "the cloud config file naming the runner to stop").option("--now", "end running jobs immediately, with outcome stopped").action(async (opts) => {
|
|
5281
5295
|
const { defaultRunnerConfigPath } = await import('./config-H4QS332G.js');
|
|
5282
|
-
const { requestStop } = await import('./loop-
|
|
5296
|
+
const { requestStop } = await import('./loop-JPW2QJ64.js');
|
|
5283
5297
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
5284
5298
|
await requestStop(configPath, Boolean(opts.now));
|
|
5285
5299
|
});
|
|
5286
5300
|
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) => {
|
|
5287
5301
|
const { defaultRunnerConfigPath, loadRunnerConfig } = await import('./config-H4QS332G.js');
|
|
5288
5302
|
const { jobsDir, runnerDir } = await import('./paths-AKX2OOLF.js');
|
|
5289
|
-
const { listJobFiles, runnerProcessState } = await import('./loop-
|
|
5290
|
-
const { renderStatus } = await import('./status-
|
|
5303
|
+
const { listJobFiles, runnerProcessState } = await import('./loop-JPW2QJ64.js');
|
|
5304
|
+
const { renderStatus } = await import('./status-UCQDEMFX.js');
|
|
5291
5305
|
const { readHousekeepingRecord } = await import('./record-Q4IEYIVV.js');
|
|
5292
5306
|
const path2 = await import('path');
|
|
5293
5307
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
@@ -5343,7 +5357,7 @@ Next:
|
|
|
5343
5357
|
});
|
|
5344
5358
|
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) => {
|
|
5345
5359
|
const { defaultRunnerConfigPath } = await import('./config-H4QS332G.js');
|
|
5346
|
-
const { listJobFiles } = await import('./loop-
|
|
5360
|
+
const { listJobFiles } = await import('./loop-JPW2QJ64.js');
|
|
5347
5361
|
const { newestAttempt, logPathFor, tail, RunnerLogsError } = await import('./logs-N3ZX7HFV.js');
|
|
5348
5362
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
5349
5363
|
const item = parseTrackerNumber(itemArg);
|
|
@@ -5570,7 +5584,7 @@ Self-host deployments also need --app-id: without a key service to resolve the
|
|
|
5570
5584
|
caller from the bearer token, the gateway answers 401 without that header.
|
|
5571
5585
|
`
|
|
5572
5586
|
).action(async (opts) => {
|
|
5573
|
-
const { runMcpInstall, handleMcpInstallError, McpInstallError } = await import('./mcp-install-cmd-
|
|
5587
|
+
const { runMcpInstall, handleMcpInstallError, McpInstallError } = await import('./mcp-install-cmd-GGWB3JJ2.js');
|
|
5574
5588
|
try {
|
|
5575
5589
|
if (opts.transport !== void 0 && opts.transport !== "stdio" && opts.transport !== "http") {
|
|
5576
5590
|
throw new McpInstallError(`--transport must be "stdio" or "http", got "${opts.transport}"`);
|
|
@@ -5592,7 +5606,7 @@ caller from the bearer token, the gateway answers 401 without that header.
|
|
|
5592
5606
|
"after",
|
|
5593
5607
|
"\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"
|
|
5594
5608
|
).action(async (opts) => {
|
|
5595
|
-
const { runMcpServe, handleMcpServeError } = await import('./mcp-serve-cmd-
|
|
5609
|
+
const { runMcpServe, handleMcpServeError } = await import('./mcp-serve-cmd-CNRC5AL5.js');
|
|
5596
5610
|
try {
|
|
5597
5611
|
await runMcpServe({ url: opts.url, appId: opts.appId });
|
|
5598
5612
|
} catch (err) {
|
|
@@ -5603,7 +5617,7 @@ caller from the bearer token, the gateway answers 401 without that header.
|
|
|
5603
5617
|
function registerImportCommands(program2) {
|
|
5604
5618
|
const importCmd = program2.command("import").description("Import an existing config format into .outerlayer/");
|
|
5605
5619
|
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) => {
|
|
5606
|
-
const { runImportRuler, ImportRulerError } = await import('./import-ruler-cmd-
|
|
5620
|
+
const { runImportRuler, ImportRulerError } = await import('./import-ruler-cmd-VJOHOJQ7.js');
|
|
5607
5621
|
try {
|
|
5608
5622
|
const result = runImportRuler({ cwd: opts.dir, json: opts.json });
|
|
5609
5623
|
if (result.exitCode !== 0) process.exitCode = result.exitCode;
|
|
@@ -5619,7 +5633,7 @@ function registerImportCommands(program2) {
|
|
|
5619
5633
|
"after",
|
|
5620
5634
|
"\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"
|
|
5621
5635
|
).action(async (opts) => {
|
|
5622
|
-
const { runImportCapture, ImportCaptureError } = await import('./import-capture-cmd-
|
|
5636
|
+
const { runImportCapture, ImportCaptureError } = await import('./import-capture-cmd-TCOKNVBM.js');
|
|
5623
5637
|
try {
|
|
5624
5638
|
runImportCapture({ cwd: opts.dir, json: opts.json });
|
|
5625
5639
|
} catch (err) {
|