@outerlayer/cli 0.13.0 → 0.14.1
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 +19 -0
- package/dist/agent-setup-CN2HUBEJ.js +26 -0
- package/dist/{build-LELVCWHV.js → build-BG2YENGK.js} +2 -2
- package/dist/build-info.json +1 -1
- package/dist/{builder-UUS4ORDH.js → builder-2D3WSOOY.js} +4 -4
- package/dist/{check-63IDCEEV.js → check-SRGR36KI.js} +30 -30
- package/dist/{chunk-GI4XXD4I.js → chunk-3NLOVYJQ.js} +4 -4
- package/dist/{chunk-C6IV5BV7.js → chunk-4OGPT6I2.js} +11 -11
- package/dist/{chunk-DXQ5MHCO.js → chunk-FOJGZYFC.js} +11 -5
- package/dist/{chunk-HDTVTA6I.js → chunk-HFKKFTXU.js} +11 -15
- package/dist/{chunk-DPKX26LT.js → chunk-HFKQIZXL.js} +9 -6
- package/dist/{chunk-6S3H3J6H.js → chunk-JJEGKEFV.js} +5 -7
- package/dist/{chunk-P6FX4D43.js → chunk-JYIEHQIF.js} +1 -1
- package/dist/{chunk-XJKL4BNU.js → chunk-KFRM23WD.js} +2 -2
- package/dist/{chunk-3KTA5UU2.js → chunk-KMDLFI4P.js} +1 -1
- package/dist/{chunk-3D4OYFCD.js → chunk-MSASO5O4.js} +42 -6
- package/dist/chunk-MTF3PHVZ.js +161 -0
- package/dist/{chunk-SVEP7PVH.js → chunk-NHDVD7DU.js} +9 -9
- package/dist/{chunk-EFZLAYPE.js → chunk-NPQWKGUA.js} +1 -1
- package/dist/{chunk-SFFHGX3G.js → chunk-PQUM37BK.js} +1 -1
- package/dist/{chunk-MJXXRX4M.js → chunk-Q2UK3C4P.js} +2 -2
- package/dist/{chunk-MZN7AQOB.js → chunk-RBKIH5ST.js} +11 -11
- package/dist/{chunk-TOPDNXHZ.js → chunk-SMHOCDCI.js} +4 -4
- package/dist/{chunk-P4MM66C6.js → chunk-SWHQ4LUM.js} +4 -4
- package/dist/{agent-setup-QE6PSCEZ.js → chunk-SXWS25JC.js} +6 -19
- package/dist/{chunk-CNFVHDHG.js → chunk-WUYTWNMA.js} +3 -1
- package/dist/{chunk-R7OQTKWT.js → chunk-XCK2YAY5.js} +12 -3
- package/dist/{chunk-4QVZCVWT.js → chunk-YDSMROTB.js} +1 -1
- package/dist/{chunk-TCIW27FM.js → chunk-ZA5CHAFY.js} +1 -1
- package/dist/{cli-WSBIAVZU.js → cli-UW2H3UUW.js} +79 -62
- package/dist/{command-N7BAB4XJ.js → command-5LD7G2QQ.js} +22 -22
- package/dist/{connect-cmd-FGYRLLXL.js → connect-cmd-JUAW6MU4.js} +2 -2
- package/dist/{context-adopt-B3PWGFHL.js → context-adopt-PJUMW2EZ.js} +5 -5
- package/dist/{context-materialize-7S6NLLRO.js → context-materialize-FDHYKNDT.js} +5 -5
- package/dist/{docker-BZ55BMBJ.js → docker-4J77Q2BF.js} +5 -5
- package/dist/{doctor-3H25Q7WT.js → doctor-H7REBSLQ.js} +24 -24
- package/dist/{emit-artifact-cmd-IQCRXOH7.js → emit-artifact-cmd-FOGNJXVR.js} +15 -18
- package/dist/{emit-cmd-KDSM5VAO.js → emit-cmd-ZEYWLC2C.js} +3 -2
- package/dist/{emit-criteria-cmd-EYUXME26.js → emit-criteria-cmd-HBP6XS5C.js} +5 -8
- package/dist/{emit-finding-cmd-P4RKBPBB.js → emit-finding-cmd-DLI4MKMN.js} +5 -8
- package/dist/{emit-result-cmd-6XYENU6H.js → emit-result-cmd-MUSL7GQA.js} +9 -12
- package/dist/{hook-fast-PXWKQPN6.js → hook-fast-WYQD6D7T.js} +1 -1
- package/dist/{import-capture-cmd-2BKM5I2N.js → import-capture-cmd-6QVCOIHK.js} +8 -11
- package/dist/{import-ruler-cmd-IXR7YK47.js → import-ruler-cmd-KLRGRBCP.js} +5 -8
- package/dist/index.js +3 -3
- package/dist/{init-2LWVS4AH.js → init-NTXA3SN7.js} +23 -23
- package/dist/{init-ZL7ORPTF.js → init-UBXK6MF7.js} +23 -23
- package/dist/{init-cmd-JXOBCOIB.js → init-cmd-NARDUPIG.js} +13 -8
- package/dist/init-update-O5YYFGF4.js +165 -0
- package/dist/{loop-XOAE6ZIY.js → loop-SW2M5VDD.js} +30 -30
- package/dist/{machine-G6PY2J2J.js → machine-U66FKVDP.js} +21 -21
- package/dist/mcp-install-cmd-FDTPQQS6.js +9 -0
- package/dist/{runner-key-TDTLNAKJ.js → runner-key-3JSMDRJA.js} +23 -23
- package/dist/{session-sender-XVGZFWRK.js → session-sender-4M247XSV.js} +5 -5
- package/dist/{starter-pack-B7JPGEDO.js → starter-pack-IB4UUIX3.js} +2 -2
- package/dist/{status-MRTPG34B.js → status-STZYPU3W.js} +26 -26
- package/dist/{sync-cmd-UBUZMMDN.js → sync-cmd-UWD5JOFU.js} +4 -4
- package/dist/{watch-STNPEWD6.js → watch-DBNB7R6X.js} +4 -4
- package/dist/{work-claim-cmd-CWGYEIJE.js → work-claim-cmd-LY4U6QHN.js} +11 -11
- package/dist/{work-cmd-X7NMJDFL.js → work-cmd-RVRQ32EH.js} +4 -4
- package/dist/{work-comment-cmd-FI2TMAYQ.js → work-comment-cmd-FFUM4TJU.js} +7 -10
- package/dist/{work-open-pr-cmd-OVHJ5I5H.js → work-open-pr-cmd-HLDWP4T2.js} +7 -10
- package/dist/{work-pr-cmd-Y5TDMQ4O.js → work-pr-cmd-L77K32WK.js} +4 -4
- package/package.json +1 -1
- package/skill-pack/maintained/emitting-evidence/SKILL.md +8 -2
- package/skill-pack/shipped.json +75 -0
- package/skill-pack/template/build/SKILL.md +8 -3
- package/skill-pack/template/build/references/release.md +42 -11
- package/skill-pack/template/build/references/review-loop.md +1 -1
- package/skill-pack/template/build/scripts/criterion-citations.mjs +184 -0
- package/skill-pack/template/spec/SKILL.md +33 -22
- package/skill-pack/template/writing-specs/SKILL.md +36 -3
- package/skill-pack/template/writing-specs/references/agents-snippet.md +57 -0
- package/skill-pack/template/writing-tests/SKILL.md +117 -0
- package/skill-pack/validators/acceptance-criteria.yaml +35 -0
- package/dist/mcp-install-cmd-VXVIH7PH.js +0 -9
- package/dist/{chunk-NX57IBNK.js → chunk-4NPZVMJU.js} +2 -2
- package/dist/{chunk-3FMPZPJQ.js → chunk-R7PF5OOU.js} +1 -1
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire } from 'node:module';
|
|
3
|
-
import { gatherDoctorChecks, doctorExitCode, summarizeChecks, renderDoctorText, recordWrapped, recordUnwrapped, recordRemoval, readManifest, recordInstall, recordStatusline } from './chunk-
|
|
3
|
+
import { gatherDoctorChecks, doctorExitCode, summarizeChecks, renderDoctorText, recordWrapped, recordUnwrapped, recordRemoval, readManifest, recordInstall, recordStatusline } from './chunk-HFKQIZXL.js';
|
|
4
|
+
import './chunk-MTF3PHVZ.js';
|
|
5
|
+
import './chunk-SWHQ4LUM.js';
|
|
6
|
+
import './chunk-NPQWKGUA.js';
|
|
7
|
+
import './chunk-IP7BIBXJ.js';
|
|
4
8
|
import './chunk-F47JBIAW.js';
|
|
5
9
|
import './chunk-BKO6JEZI.js';
|
|
6
|
-
import './chunk-
|
|
7
|
-
import './chunk-
|
|
8
|
-
import './chunk-
|
|
9
|
-
import './chunk-
|
|
10
|
-
import './chunk-CNFVHDHG.js';
|
|
10
|
+
import './chunk-XCK2YAY5.js';
|
|
11
|
+
import './chunk-FOJGZYFC.js';
|
|
12
|
+
import './chunk-YDSMROTB.js';
|
|
13
|
+
import './chunk-WUYTWNMA.js';
|
|
11
14
|
import './chunk-JXYVA45C.js';
|
|
12
15
|
import './chunk-4KSQKQXE.js';
|
|
13
16
|
import './chunk-N6LURUEF.js';
|
|
@@ -15,15 +18,16 @@ import { C, NO_COLOR_FLAG, warnDeprecated, stripNoColor, API_KEY_FLAG_DEPRECATIO
|
|
|
15
18
|
import { parseTrackerNumber, trackerNumberError } from './chunk-WZBHBH3J.js';
|
|
16
19
|
import { settingsPath, readSettings, SettingsParseError, listHookCandidates, wrapHooks, writeSettings, unwrapHooks, REGISTERED_EVENTS, cliCommand, removeHooks, removeStatusline, cliBinResolvable, mergeHooks, repointWrappedHooks, AUTO_WRAP_EVENTS, mergeStatusline } from './chunk-5QRP3MVS.js';
|
|
17
20
|
import { pinExists } from './chunk-LCEXHCHD.js';
|
|
18
|
-
import './chunk-2M63GG56.js';
|
|
19
21
|
import './chunk-YO4PSLVB.js';
|
|
22
|
+
import './chunk-ZA5CHAFY.js';
|
|
23
|
+
import './chunk-2M63GG56.js';
|
|
20
24
|
import './chunk-PLMTLGYH.js';
|
|
21
25
|
import './chunk-J5M7BSJQ.js';
|
|
22
26
|
import './chunk-EABW6AJQ.js';
|
|
23
27
|
import { resolveVersion } from './chunk-RA3O54FC.js';
|
|
24
28
|
import './chunk-V7NIVOFD.js';
|
|
25
29
|
import './chunk-ZM2IMMYN.js';
|
|
26
|
-
import { hookFiredMarkerPath, installedCliDistDir } from './chunk-
|
|
30
|
+
import { hookFiredMarkerPath, installedCliDistDir } from './chunk-PQUM37BK.js';
|
|
27
31
|
import { managedHookScripts, removeJournalHooks, installPreCommitGuardHook, removePreCommitGuardHook } from './chunk-XCCLFVXM.js';
|
|
28
32
|
import './chunk-BJ3KTMDH.js';
|
|
29
33
|
import { homeFromEnv } from './chunk-VNVZDWO3.js';
|
|
@@ -3641,7 +3645,7 @@ function warnIfApiKeyFlag(opts) {
|
|
|
3641
3645
|
if (opts.apiKey !== void 0) warnDeprecated(API_KEY_FLAG_DEPRECATION);
|
|
3642
3646
|
}
|
|
3643
3647
|
async function installStarterPackInRepo() {
|
|
3644
|
-
const { installStarterPack, formatStarterPackOutput } = await import('./starter-pack-
|
|
3648
|
+
const { installStarterPack, formatStarterPackOutput } = await import('./starter-pack-IB4UUIX3.js');
|
|
3645
3649
|
const cwd = process.cwd();
|
|
3646
3650
|
let repoRoot = cwd;
|
|
3647
3651
|
try {
|
|
@@ -3801,7 +3805,7 @@ ${starter.output}`),
|
|
|
3801
3805
|
}
|
|
3802
3806
|
}
|
|
3803
3807
|
async function realConnectDepsForCwd() {
|
|
3804
|
-
const { realConnectDeps } = await import('./connect-cmd-
|
|
3808
|
+
const { realConnectDeps } = await import('./connect-cmd-JUAW6MU4.js');
|
|
3805
3809
|
const { resolveRepoIdentity } = await import('./dist-LKDWQWZ7.js');
|
|
3806
3810
|
return {
|
|
3807
3811
|
...realConnectDeps(),
|
|
@@ -3818,13 +3822,26 @@ function invokedCommandToken(argv) {
|
|
|
3818
3822
|
function buildProgram(argv = process.argv) {
|
|
3819
3823
|
const program2 = new Command();
|
|
3820
3824
|
program2.name("outerlayer").description("OuterLayer \u2014 see what your coding agents actually do").enablePositionalOptions().version(resolveVersion()).option(NO_COLOR_FLAG, "disable color (NO_COLOR=1 does the same)").addHelpText("after", SUPPORT_TEXT);
|
|
3821
|
-
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 `outerlayer connect`)").option("--gitignore", "also add .outerlayer/ to .gitignore (project scope)").option("--template <name>", "install the starter skills and a policy file (only: default)").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("--json", "machine-readable JSON output").addHelpText(
|
|
3825
|
+
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 `outerlayer 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("--json", "machine-readable JSON output").addHelpText(
|
|
3822
3826
|
"after",
|
|
3823
|
-
"\nIn a repository, init runs four steps: connect the repository to a\nfactory (`outerlayer connect`), install the hooks, set up the coding agent,\nand run `outerlayer doctor`. It never signs in and asks nothing. With no\nlogin it skips the connect step and says to run `outerlayer login`. With\n--json it prints one document naming the outcome of each step: done,\nskipped or failed. The exit code is 1 when a step failed.\n\nThe agent setup step installs the starter skills and the `outerlayer` skill\ninto .outerlayer/skills/, writes .outerlayer/config.json for Claude Code when\nthere is none, runs `outerlayer context emit` so the skills appear in\n.claude/skills/, and adds the outerlayer and outerlayer-docs MCP servers to\n.mcp.json. Nothing you wrote is changed: an existing config, policy, edited\nskill, MCP entry or root CLAUDE.md and AGENTS.md is left as it is, and a\nhand-written file the emit would replace is kept and listed. The files are\nleft uncommitted.\nThe step is skipped outside a git repository and in a repository whose\ncontext comes from a control plane, where it arrives at session start.\n\n--local installs only the hooks: no connect step, no agent setup and no\nnetwork call. Add `--template default` to also write the starter skills and\na policy file into .outerlayer/ without compiling them; `outerlayer context\nemit` does that.\n\nIdempotent: settings are backed up before any write, and a second run\nchanges nothing. Wrapping adds one spawn per hook firing; undo it with\n`outerlayer hooks unwrap`. An occupied status-line slot is wrapped, never\nreplaced.\n\nThree of the starter skills are copied once and are yours to edit. The\nothers are rewritten from this CLI on every `context emit`.\n"
|
|
3827
|
+
"\nIn a repository, init runs four steps: connect the repository to a\nfactory (`outerlayer connect`), install the hooks, set up the coding agent,\nand run `outerlayer doctor`. It never signs in and asks nothing. With no\nlogin it skips the connect step and says to run `outerlayer login`. With\n--json it prints one document naming the outcome of each step: done,\nskipped or failed. The exit code is 1 when a step failed.\n\nThe agent setup step installs the starter skills and the `outerlayer` skill\ninto .outerlayer/skills/, writes .outerlayer/config.json for Claude Code when\nthere is none, runs `outerlayer context emit` so the skills appear in\n.claude/skills/, and adds the outerlayer and outerlayer-docs MCP servers to\n.mcp.json. Nothing you wrote is changed: an existing config, policy, edited\nskill, MCP entry or root CLAUDE.md and AGENTS.md is left as it is, and a\nhand-written file the emit would replace is kept and listed. The files are\nleft uncommitted.\nThe step is skipped outside a git repository and in a repository whose\ncontext comes from a control plane, where it arrives at session start.\n\n--local installs only the hooks: no connect step, no agent setup and no\nnetwork call. Add `--template default` to also write the starter skills and\na policy file into .outerlayer/ without compiling them; `outerlayer context\nemit` does that.\n\nIdempotent: settings are backed up before any write, and a second run\nchanges nothing. Wrapping adds one spawn per hook firing; undo it with\n`outerlayer hooks unwrap`. An occupied status-line slot is wrapped, never\nreplaced.\n\nThree of the starter skills are copied once and are yours to edit. The\nothers are rewritten from this CLI on every `context emit`.\n\n--update brings the files init wrote once up to this CLI's version: the\ntemplate skills, the policy, the two starter checks and the two MCP\nentries. A file still equal to a version an earlier release wrote is\nreplaced, and a missing one is written. A file you edited is never\ntouched. It then runs `outerlayer context emit` and leaves the changes\nuncommitted. --dry-run prints the plan, with a command to compare each\nedited file, and writes nothing. `outerlayer doctor` reports the same\nstates under Starter files.\n"
|
|
3824
3828
|
).action(async (opts) => {
|
|
3829
|
+
if (opts.update || opts.dryRun) {
|
|
3830
|
+
const { runInitUpdate, formatInitUpdate, updateFlagProblem } = await import('./init-update-O5YYFGF4.js');
|
|
3831
|
+
const problem = updateFlagProblem(opts);
|
|
3832
|
+
if (problem !== void 0) {
|
|
3833
|
+
fail(problem);
|
|
3834
|
+
return;
|
|
3835
|
+
}
|
|
3836
|
+
const result = runInitUpdate({ cwd: process.cwd(), dryRun: opts.dryRun === true });
|
|
3837
|
+
if (opts.json) writeJson(result);
|
|
3838
|
+
else process.stdout.write(formatInitUpdate(result));
|
|
3839
|
+
if (result.status === "failed") process.exitCode = 1;
|
|
3840
|
+
return;
|
|
3841
|
+
}
|
|
3825
3842
|
let starterTemplate;
|
|
3826
3843
|
if (opts.template !== void 0) {
|
|
3827
|
-
const { assertKnownTemplate, StarterPackError } = await import('./starter-pack-
|
|
3844
|
+
const { assertKnownTemplate, StarterPackError } = await import('./starter-pack-IB4UUIX3.js');
|
|
3828
3845
|
try {
|
|
3829
3846
|
assertKnownTemplate(opts.template);
|
|
3830
3847
|
} catch (err) {
|
|
@@ -3855,7 +3872,7 @@ function buildProgram(argv = process.argv) {
|
|
|
3855
3872
|
else process.stdout.write(outcome.text);
|
|
3856
3873
|
return;
|
|
3857
3874
|
}
|
|
3858
|
-
const { runInitCommand } = await import('./init-cmd-
|
|
3875
|
+
const { runInitCommand } = await import('./init-cmd-NARDUPIG.js');
|
|
3859
3876
|
const code = await runInitCommand(
|
|
3860
3877
|
{ json: opts.json, factory: opts.factory },
|
|
3861
3878
|
{
|
|
@@ -3867,7 +3884,7 @@ function buildProgram(argv = process.argv) {
|
|
|
3867
3884
|
return { ok, text, detail };
|
|
3868
3885
|
},
|
|
3869
3886
|
runAgentSetup: async () => {
|
|
3870
|
-
const { runAgentSetup } = await import('./agent-setup-
|
|
3887
|
+
const { runAgentSetup } = await import('./agent-setup-CN2HUBEJ.js');
|
|
3871
3888
|
return runAgentSetup({ cwd: process.cwd() });
|
|
3872
3889
|
},
|
|
3873
3890
|
runDoctorChecks: gatherDoctorChecks
|
|
@@ -3879,7 +3896,7 @@ function buildProgram(argv = process.argv) {
|
|
|
3879
3896
|
"after",
|
|
3880
3897
|
"\nRun it in a repository, after `outerlayer login`. With a login, connect lists\nthe factories you can use and takes the first rule that leaves one answer:\n 1. --factory <org>/<factory>, or a factory id\n 2. the factory this repository is already connected to\n 3. the one factory this repository is linked to\n 4. the one factory you can use\n 5. on a terminal, ask; with no terminal, exit 1 and list each --factory value\n\nIt says what it chose and why. The choice is saved in this repository's git\ndirectory (outerlayer/connection.json), shared by every worktree of the\nclone and never committed. A factory key already belongs to one factory, so\nconnect changes nothing for it. Connect never links a repository.\n\nAfter it saves the choice, connect checks that this repository is linked to\nthe factory. If it is not, connect says so, prints the factory's Work page\nlink where you link it, and exits 2. The choice is saved either way. Run\nconnect again once the repository is linked. With --json, the document has\nlinked (true, false, or null when it could not be checked) and, when false,\nlinkUrl.\n"
|
|
3881
3898
|
).action(async (opts) => {
|
|
3882
|
-
const { runConnectCommand } = await import('./connect-cmd-
|
|
3899
|
+
const { runConnectCommand } = await import('./connect-cmd-JUAW6MU4.js');
|
|
3883
3900
|
const code = await runConnectCommand({ factory: opts.factory, json: opts.json }, await realConnectDepsForCwd(), {
|
|
3884
3901
|
stdout: process.stdout,
|
|
3885
3902
|
stderr: process.stderr
|
|
@@ -3927,7 +3944,7 @@ function buildProgram(argv = process.argv) {
|
|
|
3927
3944
|
"\nIncremental: only sessions newer than the last checkpoint ship. The tier\nis applied on this machine before anything leaves it; `--dry-run` prints\nexactly what would. The hook-triggered background sync runs `--quiet`.\nExit 2 means the server rejected at least one session.\n"
|
|
3928
3945
|
).action(async (opts) => {
|
|
3929
3946
|
warnIfApiKeyFlag(opts);
|
|
3930
|
-
const { runSync, SyncConfigError, SyncTransportError } = await import('./sync-cmd-
|
|
3947
|
+
const { runSync, SyncConfigError, SyncTransportError } = await import('./sync-cmd-UWD5JOFU.js');
|
|
3931
3948
|
try {
|
|
3932
3949
|
const result = await runSync({
|
|
3933
3950
|
url: opts.url,
|
|
@@ -3956,7 +3973,7 @@ function buildProgram(argv = process.argv) {
|
|
|
3956
3973
|
if (invokedCommandToken(argv) === "watch") {
|
|
3957
3974
|
warnDeprecated("`outerlayer watch` is now `outerlayer daemon`; the old name will be removed in a future release.");
|
|
3958
3975
|
}
|
|
3959
|
-
const { runWatch } = await import('./watch-
|
|
3976
|
+
const { runWatch } = await import('./watch-DBNB7R6X.js');
|
|
3960
3977
|
await runWatch({ once: opts.once });
|
|
3961
3978
|
});
|
|
3962
3979
|
program2.command("hook <event>", { hidden: true }).description("capture-hook fast path, installed by `init`").action(() => {
|
|
@@ -4010,7 +4027,7 @@ function buildProgram(argv = process.argv) {
|
|
|
4010
4027
|
}
|
|
4011
4028
|
});
|
|
4012
4029
|
program2.command("session-sender", { hidden: true }).description("stream a runner build's sessions to its work item while the build runs").action(async () => {
|
|
4013
|
-
const { runSessionSender } = await import('./session-sender-
|
|
4030
|
+
const { runSessionSender } = await import('./session-sender-4M247XSV.js');
|
|
4014
4031
|
try {
|
|
4015
4032
|
await runSessionSender();
|
|
4016
4033
|
} catch (err) {
|
|
@@ -4045,7 +4062,7 @@ async function runCli(processArgv) {
|
|
|
4045
4062
|
await buildProgram(argv).parseAsync(argv);
|
|
4046
4063
|
}
|
|
4047
4064
|
async function compileContext(opts) {
|
|
4048
|
-
const { runEmit, EmitError } = await import('./emit-cmd-
|
|
4065
|
+
const { runEmit, EmitError } = await import('./emit-cmd-ZEYWLC2C.js');
|
|
4049
4066
|
try {
|
|
4050
4067
|
const result = runEmit({ cwd: opts.dir, check: opts.check, json: opts.json });
|
|
4051
4068
|
if (result.exitCode !== 0) process.exitCode = result.exitCode;
|
|
@@ -4068,7 +4085,7 @@ function registerEmitCommands(program2) {
|
|
|
4068
4085
|
return;
|
|
4069
4086
|
}
|
|
4070
4087
|
warnIfApiKeyFlag(opts);
|
|
4071
|
-
const { runEmitResult, EmitResultError } = await import('./emit-result-cmd-
|
|
4088
|
+
const { runEmitResult, EmitResultError } = await import('./emit-result-cmd-MUSL7GQA.js');
|
|
4072
4089
|
try {
|
|
4073
4090
|
const result = await runEmitResult({
|
|
4074
4091
|
name,
|
|
@@ -4119,7 +4136,7 @@ locally so it never uploads. One correction can retire several duplicates.
|
|
|
4119
4136
|
`
|
|
4120
4137
|
).action(async (file, opts) => {
|
|
4121
4138
|
warnIfApiKeyFlag(opts);
|
|
4122
|
-
const { runEmitArtifact, EmitArtifactError } = await import('./emit-artifact-cmd-
|
|
4139
|
+
const { runEmitArtifact, EmitArtifactError } = await import('./emit-artifact-cmd-FOGNJXVR.js');
|
|
4123
4140
|
let pr;
|
|
4124
4141
|
if (opts.pr !== void 0) {
|
|
4125
4142
|
pr = parseTrackerNumber(opts.pr);
|
|
@@ -4154,7 +4171,7 @@ locally so it never uploads. One correction can retire several duplicates.
|
|
|
4154
4171
|
'\n outerlayer emit finding --id gate-skip --category tooling \\\n --title "The pre-push gate prints green when a step was skipped" \\\n --file scripts/git/pre-push-checks.mjs --where "build session"\n\nRecords one problem you hit in the factory: an instruction that is wrong or\nmissing (context), a flaky test, a misbehaving script (tooling), a local\nsetup trap (environment), a bug outside your own change (defect), or\nanything else. A problem in your own change is fixed, not recorded.\nA context finding needs --rule-path and --rule-relation, and --rule-quote\nunless the relation is missing. Add --cause, --detail and --suggestion, and\n--command, --error (first error line), --test or --symbol when there is one.\n\nEvery finding joins a factory-level problem. When one of its keys matches a\nknown problem it joins that problem. Otherwise nothing is stored: the command\nprints the closest problems and exits with code 3. Run it again with\n--problem <id> --link-reason <why> (repeat --problem for each problem the\nfinding reports), or with --new if none of them is the same problem.\nWithout --started-at and --ended-at it lists your recent session events with\nids and times; name the event where you hit the problem and the one where\nyou got past it to record the time it cost.\n--item names the work item; without it, inside a recorded session, the\nitem that session was launched for is used automatically.\n'
|
|
4155
4172
|
).action(async (opts) => {
|
|
4156
4173
|
warnIfApiKeyFlag(opts);
|
|
4157
|
-
const { runEmitFinding, refuseRemovedFindingFlags, EmitFindingError } = await import('./emit-finding-cmd-
|
|
4174
|
+
const { runEmitFinding, refuseRemovedFindingFlags, EmitFindingError } = await import('./emit-finding-cmd-DLI4MKMN.js');
|
|
4158
4175
|
try {
|
|
4159
4176
|
refuseRemovedFindingFlags(opts);
|
|
4160
4177
|
const result = await runEmitFinding({
|
|
@@ -4205,7 +4222,7 @@ locally so it never uploads. One correction can retire several duplicates.
|
|
|
4205
4222
|
"\n outerlayer emit findings review.json --item 412\n\nRecords a whole batch at once \u2014 a FindingBatch JSON file (schemaVersion 3,\noptional headSha / contextSourceSha, and 1-500 findings), validated against\nthe same contract `emit finding` uses before anything is sent. Re-emitting\nan id already on the item replaces that row rather than adding a second one.\nFindings that need a choice between candidate problems are listed and not\nstored; the rest are stored, and the exit code is 3.\n--item names the work item; without it, inside a recorded session, the item\nthat session was launched for is used automatically.\n"
|
|
4206
4223
|
).action(async (file, opts) => {
|
|
4207
4224
|
warnIfApiKeyFlag(opts);
|
|
4208
|
-
const { runEmitFindings, EmitFindingError } = await import('./emit-finding-cmd-
|
|
4225
|
+
const { runEmitFindings, EmitFindingError } = await import('./emit-finding-cmd-DLI4MKMN.js');
|
|
4209
4226
|
try {
|
|
4210
4227
|
const result = await runEmitFindings({
|
|
4211
4228
|
file,
|
|
@@ -4245,7 +4262,7 @@ session was launched for is used automatically.
|
|
|
4245
4262
|
`
|
|
4246
4263
|
).action(async (file, opts) => {
|
|
4247
4264
|
warnIfApiKeyFlag(opts);
|
|
4248
|
-
const { runEmitCriteria, EmitCriteriaError } = await import('./emit-criteria-cmd-
|
|
4265
|
+
const { runEmitCriteria, EmitCriteriaError } = await import('./emit-criteria-cmd-HBP6XS5C.js');
|
|
4249
4266
|
try {
|
|
4250
4267
|
const result = await runEmitCriteria({
|
|
4251
4268
|
file,
|
|
@@ -4272,7 +4289,7 @@ function registerWorkCommands(program2) {
|
|
|
4272
4289
|
"\n outerlayer work build --issue 42 # a host builds it\n outerlayer work build --item 7 # retry an item already on Work\n outerlayer work build --issue 42 --local # you build it\n outerlayer work build --issue ENG-123 --tracker linear # a Linear issue\n\nWithout --local, records a build request: a host takes the item when it\nhas a free slot. It never links the calling session and never takes a\nlease, even run from inside one.\n\nWith --local, puts the item on Work with no build request, so no host\ntakes it, and prints the line that starts your session on it. That\nsession links itself and holds the item's lease while it works.\n"
|
|
4273
4290
|
).action(async (opts) => {
|
|
4274
4291
|
warnIfApiKeyFlag(opts);
|
|
4275
|
-
const { runWorkBuild, WorkCommandError } = await import('./work-cmd-
|
|
4292
|
+
const { runWorkBuild, WorkCommandError } = await import('./work-cmd-RVRQ32EH.js');
|
|
4276
4293
|
try {
|
|
4277
4294
|
await runWorkBuild(opts);
|
|
4278
4295
|
} catch (err) {
|
|
@@ -4288,7 +4305,7 @@ function registerWorkCommands(program2) {
|
|
|
4288
4305
|
"\n outerlayer work link-session 42\n\nNames an item that already exists on the calling session \u2014 it never\ncreates one. Create one with `outerlayer work build --local`. Linking\nthe same session to the same item twice is a no-op. Also takes or\nrenews that session's own 20-minute lease, unless --no-lease or\n--ended is given, or another worker already holds a live one.\n"
|
|
4289
4306
|
).action(async (number, opts) => {
|
|
4290
4307
|
warnIfApiKeyFlag(opts);
|
|
4291
|
-
const { runWorkLinkSession, WorkCommandError } = await import('./work-cmd-
|
|
4308
|
+
const { runWorkLinkSession, WorkCommandError } = await import('./work-cmd-RVRQ32EH.js');
|
|
4292
4309
|
try {
|
|
4293
4310
|
await runWorkLinkSession({ ...opts, number, noLease: opts.lease === false, logFailures: opts.logFailures === true });
|
|
4294
4311
|
} catch (err) {
|
|
@@ -4313,8 +4330,8 @@ most one action flag may be given.
|
|
|
4313
4330
|
`
|
|
4314
4331
|
).action(async (opts) => {
|
|
4315
4332
|
warnIfApiKeyFlag(opts);
|
|
4316
|
-
const { runWorkComment, WorkCommentCommandError } = await import('./work-comment-cmd-
|
|
4317
|
-
const { WorkCommandError } = await import('./work-cmd-
|
|
4333
|
+
const { runWorkComment, WorkCommentCommandError } = await import('./work-comment-cmd-FFUM4TJU.js');
|
|
4334
|
+
const { WorkCommandError } = await import('./work-cmd-RVRQ32EH.js');
|
|
4318
4335
|
try {
|
|
4319
4336
|
await runWorkComment(opts);
|
|
4320
4337
|
} catch (err) {
|
|
@@ -4330,8 +4347,8 @@ most one action flag may be given.
|
|
|
4330
4347
|
"\n outerlayer work threads --item 7\n\nPrints the item's general thread, then one thread per acceptance\ncriterion that carries proof or a comment, each with who is waiting\non whom next.\n"
|
|
4331
4348
|
).action(async (opts) => {
|
|
4332
4349
|
warnIfApiKeyFlag(opts);
|
|
4333
|
-
const { runWorkThreads, WorkCommentCommandError } = await import('./work-comment-cmd-
|
|
4334
|
-
const { WorkCommandError } = await import('./work-cmd-
|
|
4350
|
+
const { runWorkThreads, WorkCommentCommandError } = await import('./work-comment-cmd-FFUM4TJU.js');
|
|
4351
|
+
const { WorkCommandError } = await import('./work-cmd-RVRQ32EH.js');
|
|
4335
4352
|
try {
|
|
4336
4353
|
await runWorkThreads(opts);
|
|
4337
4354
|
} catch (err) {
|
|
@@ -4353,7 +4370,7 @@ live addition remains on it.
|
|
|
4353
4370
|
`
|
|
4354
4371
|
).action(async (opts) => {
|
|
4355
4372
|
warnIfApiKeyFlag(opts);
|
|
4356
|
-
const { runWorkRemove, WorkCommandError } = await import('./work-cmd-
|
|
4373
|
+
const { runWorkRemove, WorkCommandError } = await import('./work-cmd-RVRQ32EH.js');
|
|
4357
4374
|
try {
|
|
4358
4375
|
await runWorkRemove(opts);
|
|
4359
4376
|
} catch (err) {
|
|
@@ -4366,7 +4383,7 @@ live addition remains on it.
|
|
|
4366
4383
|
});
|
|
4367
4384
|
workCmd.command("status").description("Show one item's stage, gate ledger, and additions").option("--item <number>", "the item's number inside this factory").option("--issue <number>", "issue number").option("--repo <owner/name>", "repository (default: the current checkout's remote)").option("--json", "machine-readable JSON output").option("--url <url>", "cloud base URL (or OUTERLAYER_URL / config)").addOption(apiKeyOption()).option("--app-id <id>", "factory id the key is bound to (or OUTERLAYER_APP_ID / config)").action(async (opts) => {
|
|
4368
4385
|
warnIfApiKeyFlag(opts);
|
|
4369
|
-
const { runWorkStatus, WorkCommandError } = await import('./work-cmd-
|
|
4386
|
+
const { runWorkStatus, WorkCommandError } = await import('./work-cmd-RVRQ32EH.js');
|
|
4370
4387
|
try {
|
|
4371
4388
|
await runWorkStatus(opts);
|
|
4372
4389
|
} catch (err) {
|
|
@@ -4379,7 +4396,7 @@ live addition remains on it.
|
|
|
4379
4396
|
});
|
|
4380
4397
|
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) => {
|
|
4381
4398
|
warnIfApiKeyFlag(opts);
|
|
4382
|
-
const { runWorkList, WorkCommandError } = await import('./work-cmd-
|
|
4399
|
+
const { runWorkList, WorkCommandError } = await import('./work-cmd-RVRQ32EH.js');
|
|
4383
4400
|
try {
|
|
4384
4401
|
await runWorkList(opts);
|
|
4385
4402
|
} catch (err) {
|
|
@@ -4395,7 +4412,7 @@ live addition remains on it.
|
|
|
4395
4412
|
"\n outerlayer work claim --item 42 --kind implement\n\nRecords a lease held by the API key that sends it. A live lease held\nby a different key is refused; claiming again with the same key extends\nit. --host is a label only.\n"
|
|
4396
4413
|
).action(async (opts) => {
|
|
4397
4414
|
warnIfApiKeyFlag(opts);
|
|
4398
|
-
const { runWorkClaim, WorkCommandError } = await import('./work-claim-cmd-
|
|
4415
|
+
const { runWorkClaim, WorkCommandError } = await import('./work-claim-cmd-LY4U6QHN.js');
|
|
4399
4416
|
try {
|
|
4400
4417
|
await runWorkClaim(opts);
|
|
4401
4418
|
} catch (err) {
|
|
@@ -4411,7 +4428,7 @@ live addition remains on it.
|
|
|
4411
4428
|
"\n outerlayer work renew --item 42\n\nExtends the live lease this API key holds. Refused with a 410 if the\nlease has expired, or a 403 if a different key holds it.\n"
|
|
4412
4429
|
).action(async (opts) => {
|
|
4413
4430
|
warnIfApiKeyFlag(opts);
|
|
4414
|
-
const { runWorkRenew, WorkCommandError } = await import('./work-claim-cmd-
|
|
4431
|
+
const { runWorkRenew, WorkCommandError } = await import('./work-claim-cmd-LY4U6QHN.js');
|
|
4415
4432
|
try {
|
|
4416
4433
|
await runWorkRenew(opts);
|
|
4417
4434
|
} catch (err) {
|
|
@@ -4430,7 +4447,7 @@ live addition remains on it.
|
|
|
4430
4447
|
"\n outerlayer work release --item 42 --outcome ok\n outerlayer work release --item 42\n\nMarks the lease this API key holds released, optionally with an\noutcome. A lease held by a different key is refused. Releasing an\nalready-released lease is a no-op that returns the recorded release\ntime and outcome.\n\nRun inside a session with no --host, it releases that session's own\nlease instead, so the item's review opens without ending the\nsession. It never releases another session's lease. --outcome\napplies to a host's lease only. A later tool call in the session\ntakes the lease again.\n"
|
|
4431
4448
|
).action(async (opts) => {
|
|
4432
4449
|
warnIfApiKeyFlag(opts);
|
|
4433
|
-
const { runWorkRelease, WorkCommandError } = await import('./work-claim-cmd-
|
|
4450
|
+
const { runWorkRelease, WorkCommandError } = await import('./work-claim-cmd-LY4U6QHN.js');
|
|
4434
4451
|
try {
|
|
4435
4452
|
await runWorkRelease(opts);
|
|
4436
4453
|
} catch (err) {
|
|
@@ -4446,7 +4463,7 @@ live addition remains on it.
|
|
|
4446
4463
|
"\n outerlayer work pr 481\n outerlayer work pr 481 --withdraw --item 250\n\nRun inside a session already on a work item. Records that pull\nrequest 481 in the checkout's repository belongs to the item named by\nOUTERLAYER_WORK, or refuses when the session is not on it. The same\nfact a `pr-link` in the session's own transcript records on sync.\nIdempotent: declaring the same pull request twice is a no-op.\n\n--withdraw removes one item's declaration of the pull request. It\nneeds your own login; an agent session or a factory key is refused.\n"
|
|
4447
4464
|
).action(async (number, opts) => {
|
|
4448
4465
|
warnIfApiKeyFlag(opts);
|
|
4449
|
-
const { runWorkPr, WorkPrCommandError } = await import('./work-pr-cmd-
|
|
4466
|
+
const { runWorkPr, WorkPrCommandError } = await import('./work-pr-cmd-L77K32WK.js');
|
|
4450
4467
|
try {
|
|
4451
4468
|
await runWorkPr({ ...opts, number });
|
|
4452
4469
|
} catch (err) {
|
|
@@ -4462,8 +4479,8 @@ live addition remains on it.
|
|
|
4462
4479
|
'\n outerlayer work open-pr --title "Add the thing" --body-file pr.md\n outerlayer work open-pr --repository acme/web --title "Add the thing" --body-file pr.md\n\nIn a host build, which holds an item key, the gateway opens the pull\nrequest as the factory\'s GitHub App, from the branch the claim named,\nor edits the one already open on that branch. No gh command runs.\nIn your own session it runs `gh pr create` (or `gh pr edit`) under your\nlogin, then declares the pull request on the item, as `work pr` does.\nRun it again after a change to the title or description.\n'
|
|
4463
4480
|
).action(async (opts) => {
|
|
4464
4481
|
warnIfApiKeyFlag(opts);
|
|
4465
|
-
const { runWorkOpenPr, WorkOpenPrCommandError } = await import('./work-open-pr-cmd-
|
|
4466
|
-
const { WorkCommandError } = await import('./work-cmd-
|
|
4482
|
+
const { runWorkOpenPr, WorkOpenPrCommandError } = await import('./work-open-pr-cmd-HLDWP4T2.js');
|
|
4483
|
+
const { WorkCommandError } = await import('./work-cmd-RVRQ32EH.js');
|
|
4467
4484
|
try {
|
|
4468
4485
|
await runWorkOpenPr(opts);
|
|
4469
4486
|
} catch (err) {
|
|
@@ -4480,7 +4497,7 @@ function registerRunnerCommands(program2) {
|
|
|
4480
4497
|
const configOption = "the cloud config file to run against (default: ~/.outerlayer/config.json)";
|
|
4481
4498
|
runnerCmd.command("start").description("Run the loop: claim work, run it, report, clean up, repeat").option("--config <path>", configOption).action(async (opts) => {
|
|
4482
4499
|
const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-N3C6DFQA.js');
|
|
4483
|
-
const { start, RunnerStartError } = await import('./loop-
|
|
4500
|
+
const { start, RunnerStartError } = await import('./loop-SW2M5VDD.js');
|
|
4484
4501
|
const { RunnerAlreadyRunningError } = await import('./pidfile-UZRH774M.js');
|
|
4485
4502
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
4486
4503
|
try {
|
|
@@ -4496,7 +4513,7 @@ function registerRunnerCommands(program2) {
|
|
|
4496
4513
|
});
|
|
4497
4514
|
runnerCmd.command("check").description("Validate the config, the hooks and the key, and print the effective settings").option("--config <path>", configOption).action(async (opts) => {
|
|
4498
4515
|
const { defaultRunnerConfigPath } = await import('./config-N3C6DFQA.js');
|
|
4499
|
-
const { runRunnerCheck } = await import('./check-
|
|
4516
|
+
const { runRunnerCheck } = await import('./check-SRGR36KI.js');
|
|
4500
4517
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
4501
4518
|
const result = await runRunnerCheck(configPath);
|
|
4502
4519
|
if (!result.ok) {
|
|
@@ -4525,7 +4542,7 @@ function registerRunnerCommands(program2) {
|
|
|
4525
4542
|
}
|
|
4526
4543
|
try {
|
|
4527
4544
|
if (opts.service === true) {
|
|
4528
|
-
const { installServiceCommand } = await import('./command-
|
|
4545
|
+
const { installServiceCommand } = await import('./command-5LD7G2QQ.js');
|
|
4529
4546
|
const result2 = await installServiceCommand({
|
|
4530
4547
|
configPath,
|
|
4531
4548
|
print: opts.print,
|
|
@@ -4581,7 +4598,7 @@ To keep it running, run ${C.yellow}outerlayer runner install --service${C.reset}
|
|
|
4581
4598
|
return;
|
|
4582
4599
|
}
|
|
4583
4600
|
const { defaultRunnerConfigPath } = await import('./config-N3C6DFQA.js');
|
|
4584
|
-
const { uninstallServiceCommand } = await import('./command-
|
|
4601
|
+
const { uninstallServiceCommand } = await import('./command-5LD7G2QQ.js');
|
|
4585
4602
|
const result = await uninstallServiceCommand({ configPath: opts.config ?? defaultRunnerConfigPath(), unitName: opts.unitName, home: homeFromEnv() });
|
|
4586
4603
|
if (result.ok) for (const line of result.lines) process.stdout.write(`${C.green}\u2713${C.reset} ${line}
|
|
4587
4604
|
`);
|
|
@@ -4592,10 +4609,10 @@ To keep it running, run ${C.yellow}outerlayer runner install --service${C.reset}
|
|
|
4592
4609
|
"\nWith no apiKey in the config file, and a login saved by `outerlayer login`,\nrunner init creates the runner key itself, with the Runner preset, on the\nfactory --app-id names (or OUTERLAYER_APP_ID, or this repository's\nconnection). Your login needs factory_keys.insert on that factory.\n\nWith --agent claude, the queue commands start Claude Code instead of the\nplaceholder, and Claude's credential is read from stdin: a token from\n`claude setup-token` (sk-ant-oat...) or an API key (sk-ant-api...). It is\nnever printed, and is stored in the runner.env beside the config with mode\n600. Other lines in the file are kept. With nothing piped, a credential\nalready in runner.env is used.\n\n printf '%s' \"$CLAUDE_CODE_OAUTH_TOKEN\" | outerlayer runner init --agent claude\n"
|
|
4593
4610
|
).action(async (opts) => {
|
|
4594
4611
|
const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-N3C6DFQA.js');
|
|
4595
|
-
const { prepareRunnerInit, runRunnerInit, RunnerInitError, writeRunnerInit } = await import('./init-
|
|
4596
|
-
const { createRunnerKey, runnerKeyLogin } = await import('./runner-key-
|
|
4597
|
-
const { detectMachine } = await import('./machine-
|
|
4598
|
-
const { chooseVm, runVmInit, VmInitError } = await import('./init-
|
|
4612
|
+
const { prepareRunnerInit, runRunnerInit, RunnerInitError, writeRunnerInit } = await import('./init-NTXA3SN7.js');
|
|
4613
|
+
const { createRunnerKey, runnerKeyLogin } = await import('./runner-key-3JSMDRJA.js');
|
|
4614
|
+
const { detectMachine } = await import('./machine-U66FKVDP.js');
|
|
4615
|
+
const { chooseVm, runVmInit, VmInitError } = await import('./init-UBXK6MF7.js');
|
|
4599
4616
|
const { AGENT_COMMANDS, credentialFromStdin, isAgentName, restartForCredential, RunnerEnvError } = await import('./runner-env-XTC53CHN.js');
|
|
4600
4617
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
4601
4618
|
if (opts.agent !== void 0 && !isAgentName(opts.agent)) {
|
|
@@ -4745,7 +4762,7 @@ ${C.yellow}The runner will not update itself: ${installErr.message}${C.reset}
|
|
|
4745
4762
|
let serviceUp = false;
|
|
4746
4763
|
let restart;
|
|
4747
4764
|
if (installedLayout) {
|
|
4748
|
-
const { installServiceCommand } = await import('./command-
|
|
4765
|
+
const { installServiceCommand } = await import('./command-5LD7G2QQ.js');
|
|
4749
4766
|
const service = await installServiceCommand({
|
|
4750
4767
|
configPath,
|
|
4751
4768
|
entryPath: process.argv[1] ?? "",
|
|
@@ -4790,10 +4807,10 @@ Next:
|
|
|
4790
4807
|
"\nFetches the head of the default branch into the runner's cache, reads its\n.devcontainer/devcontainer.json, and builds the image with the devcontainer CLI. Settings\nthat reach the host or widen the container's privileges are ignored and listed. The\nimage holds this CLI and a pinned Claude Code. Nothing runs inside the image.\n"
|
|
4791
4808
|
).action(async (opts) => {
|
|
4792
4809
|
const { defaultRunnerConfigPath } = await import('./config-N3C6DFQA.js');
|
|
4793
|
-
const { buildRepositoryImage, RecipeError } = await import('./build-
|
|
4810
|
+
const { buildRepositoryImage, RecipeError } = await import('./build-BG2YENGK.js');
|
|
4794
4811
|
const { currentCliBuild } = await import('./cli-build-K56DK4DS.js');
|
|
4795
|
-
const { createDockerHost } = await import('./docker-
|
|
4796
|
-
const { builderSpec } = await import('./builder-
|
|
4812
|
+
const { createDockerHost } = await import('./docker-4J77Q2BF.js');
|
|
4813
|
+
const { builderSpec } = await import('./builder-2D3WSOOY.js');
|
|
4797
4814
|
const { loadRunnerConfig } = await import('./config-N3C6DFQA.js');
|
|
4798
4815
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
4799
4816
|
const memory = (() => {
|
|
@@ -4856,15 +4873,15 @@ Next:
|
|
|
4856
4873
|
});
|
|
4857
4874
|
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) => {
|
|
4858
4875
|
const { defaultRunnerConfigPath } = await import('./config-N3C6DFQA.js');
|
|
4859
|
-
const { requestStop } = await import('./loop-
|
|
4876
|
+
const { requestStop } = await import('./loop-SW2M5VDD.js');
|
|
4860
4877
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
4861
4878
|
await requestStop(configPath, Boolean(opts.now));
|
|
4862
4879
|
});
|
|
4863
4880
|
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) => {
|
|
4864
4881
|
const { defaultRunnerConfigPath, loadRunnerConfig } = await import('./config-N3C6DFQA.js');
|
|
4865
4882
|
const { jobsDir, runnerDir } = await import('./paths-OYKMVYJP.js');
|
|
4866
|
-
const { listJobFiles, runnerProcessState } = await import('./loop-
|
|
4867
|
-
const { renderStatus } = await import('./status-
|
|
4883
|
+
const { listJobFiles, runnerProcessState } = await import('./loop-SW2M5VDD.js');
|
|
4884
|
+
const { renderStatus } = await import('./status-STZYPU3W.js');
|
|
4868
4885
|
const { readHousekeepingRecord } = await import('./record-C43U4PKS.js');
|
|
4869
4886
|
const path2 = await import('path');
|
|
4870
4887
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
@@ -4920,7 +4937,7 @@ Next:
|
|
|
4920
4937
|
});
|
|
4921
4938
|
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) => {
|
|
4922
4939
|
const { defaultRunnerConfigPath } = await import('./config-N3C6DFQA.js');
|
|
4923
|
-
const { listJobFiles } = await import('./loop-
|
|
4940
|
+
const { listJobFiles } = await import('./loop-SW2M5VDD.js');
|
|
4924
4941
|
const { newestAttempt, logPathFor, tail, RunnerLogsError } = await import('./logs-H55NWW4H.js');
|
|
4925
4942
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
4926
4943
|
const item = parseTrackerNumber(itemArg);
|
|
@@ -5144,7 +5161,7 @@ function registerMcpCommands(program2) {
|
|
|
5144
5161
|
"after",
|
|
5145
5162
|
"\nThe API key is never a flag and never written to .mcp.json as a literal value.\n stdio (default): the client spawns `outerlayer mcp serve`, which reads the key\n from ~/.outerlayer/config.json (or OUTERLAYER_API_KEY) on every connect, so a\n rotated key is picked up without rewriting the entry.\n http: the entry carries the ${OUTERLAYER_API_KEY} placeholder, which the client\n resolves from the environment it was launched with.\n\n--command: use an absolute or ${HOME}-relative path when the CLI is not on PATH.\n--url: with stdio the endpoint resolves from OUTERLAYER_URL / the config file at\nconnect time; for self-host pass your gateway-node origin + /v1/mcp.\nSelf-host deployments also need --app-id: without a key service to resolve the\ncaller from the bearer token, the gateway answers 401 without that header.\n"
|
|
5146
5163
|
).action(async (opts) => {
|
|
5147
|
-
const { runMcpInstall, handleMcpInstallError, McpInstallError } = await import('./mcp-install-cmd-
|
|
5164
|
+
const { runMcpInstall, handleMcpInstallError, McpInstallError } = await import('./mcp-install-cmd-FDTPQQS6.js');
|
|
5148
5165
|
try {
|
|
5149
5166
|
if (opts.transport !== void 0 && opts.transport !== "stdio" && opts.transport !== "http") {
|
|
5150
5167
|
throw new McpInstallError(`--transport must be "stdio" or "http", got "${opts.transport}"`);
|
|
@@ -5177,7 +5194,7 @@ function registerMcpCommands(program2) {
|
|
|
5177
5194
|
function registerImportCommands(program2) {
|
|
5178
5195
|
const importCmd = program2.command("import").description("Import an existing config format into .outerlayer/");
|
|
5179
5196
|
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) => {
|
|
5180
|
-
const { runImportRuler, ImportRulerError } = await import('./import-ruler-cmd-
|
|
5197
|
+
const { runImportRuler, ImportRulerError } = await import('./import-ruler-cmd-KLRGRBCP.js');
|
|
5181
5198
|
try {
|
|
5182
5199
|
const result = runImportRuler({ cwd: opts.dir, json: opts.json });
|
|
5183
5200
|
if (result.exitCode !== 0) process.exitCode = result.exitCode;
|
|
@@ -5193,7 +5210,7 @@ function registerImportCommands(program2) {
|
|
|
5193
5210
|
"after",
|
|
5194
5211
|
"\nInstalls the four maintained skills (emitting-evidence, amend,\nreporting-findings, outerlayer) and an AGENTS.md snippet teaching agents to run\n`emit artifact`. A skill that differs from this CLI's bundle is rewritten to it, and the output says so.\n"
|
|
5195
5212
|
).action(async (opts) => {
|
|
5196
|
-
const { runImportCapture, ImportCaptureError } = await import('./import-capture-cmd-
|
|
5213
|
+
const { runImportCapture, ImportCaptureError } = await import('./import-capture-cmd-6QVCOIHK.js');
|
|
5197
5214
|
try {
|
|
5198
5215
|
runImportCapture({ cwd: opts.dir, json: opts.json });
|
|
5199
5216
|
} catch (err) {
|
|
@@ -5231,12 +5248,12 @@ function registerContextCommands(program2) {
|
|
|
5231
5248
|
const contextCmd = program2.command("context").description("Compile and materialize agent context");
|
|
5232
5249
|
contextCmd.command("emit").description("Compile .outerlayer/ into each configured target tool's native files").option("--check", "compare against disk, write nothing, exit 1 on drift (CI mode)").option("--dir <path>", "repo root to read from (default: cwd)").option("--json", "machine-readable JSON output").addHelpText(
|
|
5233
5250
|
"after",
|
|
5234
|
-
'\nTargets come from .outerlayer/config.json only; there is no --target flag.\nMissing or empty config: {"targets": [...]}, e.g. {"targets": ["claude-code"]}.\nKnown targets: claude-code, cursor, codex, copilot, factory.\n\nThe maintained skills (emitting-evidence, amend, reporting-findings, outerlayer)\nfollow this CLI: emit rewrites one that differs from its bundle, and --check reports it as\ndrift. Templates (spec, writing-specs, build) are never rewritten or reported.\n\nOrphan detection (--check) only covers header-carrying outputs: every markdown\ntarget file gets a generated-by comment, but .mcp.json and .cursor/mcp.json are\nJSON with no comment syntax, so they can never be flagged as orphaned; missing\nand content drift still apply to them.\n'
|
|
5251
|
+
'\nTargets come from .outerlayer/config.json only; there is no --target flag.\nMissing or empty config: {"targets": [...]}, e.g. {"targets": ["claude-code"]}.\nKnown targets: claude-code, cursor, codex, copilot, factory.\n\nThe maintained skills (emitting-evidence, amend, reporting-findings, outerlayer)\nfollow this CLI: emit rewrites one that differs from its bundle, and --check reports it as\ndrift. Templates (spec, writing-specs, writing-tests, build) are never rewritten or reported.\n\nOrphan detection (--check) only covers header-carrying outputs: every markdown\ntarget file gets a generated-by comment, but .mcp.json and .cursor/mcp.json are\nJSON with no comment syntax, so they can never be flagged as orphaned; missing\nand content drift still apply to them.\n'
|
|
5235
5252
|
).action(async (opts) => {
|
|
5236
5253
|
await compileContext({ dir: opts.dir, check: opts.check, json: opts.json });
|
|
5237
5254
|
});
|
|
5238
5255
|
contextCmd.command("adopt <stagedDir>", { hidden: true }).description("Copy context the runner staged into this checkout (container builds)").option("--json", "machine-readable JSON output").action(async (stagedDir) => {
|
|
5239
|
-
const { runContextAdopt } = await import('./context-adopt-
|
|
5256
|
+
const { runContextAdopt } = await import('./context-adopt-PJUMW2EZ.js');
|
|
5240
5257
|
const { exitCode, stdout } = runContextAdopt(stagedDir, process.cwd());
|
|
5241
5258
|
process.stdout.write(stdout);
|
|
5242
5259
|
process.exitCode = exitCode;
|
|
@@ -5245,7 +5262,7 @@ function registerContextCommands(program2) {
|
|
|
5245
5262
|
"after",
|
|
5246
5263
|
"\nThe same flow SessionStart runs automatically, exposed for a manual retry or a\nfirst check outside a session. Writes AGENTS.md, .claude/**, and .outerlayer/**.\n"
|
|
5247
5264
|
).action(async (opts) => {
|
|
5248
|
-
const { materializeContext } = await import('./context-materialize-
|
|
5265
|
+
const { materializeContext } = await import('./context-materialize-FDHYKNDT.js');
|
|
5249
5266
|
const result = await materializeContext({ cwd: process.cwd(), sessionId: `manual-${Date.now()}` });
|
|
5250
5267
|
const output = formatContextMaterializeOutput(result);
|
|
5251
5268
|
if (output.exitCode !== void 0) process.exitCode = output.exitCode;
|
|
@@ -5,44 +5,44 @@ import { runRunnerInstall, launcherSummary, restartNote } from './chunk-ERI5GBNI
|
|
|
5
5
|
import './chunk-I2UOAV7X.js';
|
|
6
6
|
import './chunk-PTW6W5NR.js';
|
|
7
7
|
import { currentLink, execStartCommand } from './chunk-TI7B7UEO.js';
|
|
8
|
-
import { detectMachine } from './chunk-
|
|
9
|
-
import './chunk-
|
|
8
|
+
import { detectMachine } from './chunk-JYIEHQIF.js';
|
|
9
|
+
import './chunk-RBKIH5ST.js';
|
|
10
|
+
import './chunk-KMDLFI4P.js';
|
|
11
|
+
import './chunk-QKFB4K7X.js';
|
|
12
|
+
import './chunk-RSNSZ2LJ.js';
|
|
10
13
|
import { installService, uninstallService, realTaskScheduler } from './chunk-RLYZLUQ7.js';
|
|
14
|
+
import './chunk-SWHQ4LUM.js';
|
|
15
|
+
import './chunk-NPQWKGUA.js';
|
|
16
|
+
import './chunk-IP7BIBXJ.js';
|
|
17
|
+
import { runnerVmOf, loadRunnerConfig } from './chunk-22RMZBGW.js';
|
|
18
|
+
import './chunk-UXYLWVTQ.js';
|
|
11
19
|
import { realLima } from './chunk-77MM5RYD.js';
|
|
12
20
|
import { writeLaunchAgent, launchAgentPath } from './chunk-LF6MLJCY.js';
|
|
13
|
-
import './chunk-
|
|
21
|
+
import './chunk-R7PF5OOU.js';
|
|
22
|
+
import './chunk-QOZKPLVJ.js';
|
|
14
23
|
import './chunk-N5FOE5PS.js';
|
|
15
24
|
import './chunk-OGFGZQA3.js';
|
|
16
|
-
import './chunk-
|
|
17
|
-
import './chunk-
|
|
18
|
-
import './chunk-
|
|
25
|
+
import './chunk-4NPZVMJU.js';
|
|
26
|
+
import './chunk-7RQ73DLO.js';
|
|
27
|
+
import './chunk-4Q7OMKAT.js';
|
|
19
28
|
import './chunk-CX22S5BA.js';
|
|
20
|
-
import './chunk-
|
|
21
|
-
import './chunk-
|
|
22
|
-
import './chunk-P4MM66C6.js';
|
|
23
|
-
import './chunk-EFZLAYPE.js';
|
|
24
|
-
import './chunk-IP7BIBXJ.js';
|
|
25
|
-
import './chunk-4QVZCVWT.js';
|
|
26
|
-
import './chunk-CNFVHDHG.js';
|
|
29
|
+
import './chunk-YDSMROTB.js';
|
|
30
|
+
import './chunk-WUYTWNMA.js';
|
|
27
31
|
import './chunk-JXYVA45C.js';
|
|
28
32
|
import './chunk-4KSQKQXE.js';
|
|
29
33
|
import './chunk-N6LURUEF.js';
|
|
30
34
|
import './chunk-YRYMNBGQ.js';
|
|
31
|
-
import { runnerVmOf, loadRunnerConfig } from './chunk-22RMZBGW.js';
|
|
32
|
-
import './chunk-UXYLWVTQ.js';
|
|
33
|
-
import './chunk-7RQ73DLO.js';
|
|
34
|
-
import './chunk-4Q7OMKAT.js';
|
|
35
35
|
import './chunk-WZBHBH3J.js';
|
|
36
|
-
import './chunk-
|
|
37
|
-
import './chunk-ZJSNLVCE.js';
|
|
38
|
-
import './chunk-TCIW27FM.js';
|
|
36
|
+
import './chunk-3NLOVYJQ.js';
|
|
39
37
|
import './chunk-LCEXHCHD.js';
|
|
40
|
-
import './chunk-
|
|
38
|
+
import './chunk-ZJSNLVCE.js';
|
|
41
39
|
import './chunk-YO4PSLVB.js';
|
|
40
|
+
import './chunk-BYT5O5RV.js';
|
|
41
|
+
import './chunk-ZA5CHAFY.js';
|
|
42
|
+
import './chunk-2M63GG56.js';
|
|
42
43
|
import './chunk-PLMTLGYH.js';
|
|
43
44
|
import './chunk-J5M7BSJQ.js';
|
|
44
45
|
import './chunk-EABW6AJQ.js';
|
|
45
|
-
import './chunk-BYT5O5RV.js';
|
|
46
46
|
import './chunk-RA3O54FC.js';
|
|
47
47
|
import './chunk-V7NIVOFD.js';
|
|
48
48
|
import './chunk-ZM2IMMYN.js';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire } from 'node:module';
|
|
3
|
-
export { COMMIT_LINE, autoConnectedLine, fetchFactories, promptOnTerminal, realConnectDeps, runConnect, runConnectCommand, saveFactoryConnection, selectFactory } from './chunk-
|
|
4
|
-
import './chunk-
|
|
3
|
+
export { COMMIT_LINE, autoConnectedLine, fetchFactories, promptOnTerminal, realConnectDeps, runConnect, runConnectCommand, saveFactoryConnection, selectFactory } from './chunk-YDSMROTB.js';
|
|
4
|
+
import './chunk-WUYTWNMA.js';
|
|
5
5
|
import './chunk-JXYVA45C.js';
|
|
6
6
|
import './chunk-4KSQKQXE.js';
|
|
7
7
|
import './chunk-N6LURUEF.js';
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire } from 'node:module';
|
|
3
|
-
import { defaultGitRunner, hasSymlinkComponent } from './chunk-
|
|
4
|
-
import './chunk-ZJSNLVCE.js';
|
|
5
|
-
import './chunk-TCIW27FM.js';
|
|
3
|
+
import { defaultGitRunner, hasSymlinkComponent } from './chunk-3NLOVYJQ.js';
|
|
6
4
|
import { writeContextManifest, writePinIfChanged, touchLastCheck, clearDegraded, writeSourceCache, SOURCE_CACHE_TTL_SUCCESS_MS, writeBuildHold } from './chunk-LCEXHCHD.js';
|
|
7
|
-
import './chunk-
|
|
5
|
+
import './chunk-ZJSNLVCE.js';
|
|
8
6
|
import './chunk-YO4PSLVB.js';
|
|
7
|
+
import './chunk-BYT5O5RV.js';
|
|
8
|
+
import './chunk-ZA5CHAFY.js';
|
|
9
|
+
import './chunk-2M63GG56.js';
|
|
9
10
|
import './chunk-PLMTLGYH.js';
|
|
10
11
|
import './chunk-J5M7BSJQ.js';
|
|
11
12
|
import './chunk-EABW6AJQ.js';
|
|
12
|
-
import './chunk-BYT5O5RV.js';
|
|
13
13
|
import './chunk-RA3O54FC.js';
|
|
14
14
|
import './chunk-V7NIVOFD.js';
|
|
15
15
|
import './chunk-ZM2IMMYN.js';
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire } from 'node:module';
|
|
3
|
-
export { defaultGitRunner, hasSymlinkComponent, materializeContext, parseOwnerRepo, parseRemoteHost, resolveGitCommonDir } from './chunk-
|
|
4
|
-
import './chunk-ZJSNLVCE.js';
|
|
5
|
-
import './chunk-TCIW27FM.js';
|
|
3
|
+
export { defaultGitRunner, hasSymlinkComponent, materializeContext, parseOwnerRepo, parseRemoteHost, resolveGitCommonDir } from './chunk-3NLOVYJQ.js';
|
|
6
4
|
import './chunk-LCEXHCHD.js';
|
|
7
|
-
import './chunk-
|
|
5
|
+
import './chunk-ZJSNLVCE.js';
|
|
8
6
|
import './chunk-YO4PSLVB.js';
|
|
7
|
+
import './chunk-BYT5O5RV.js';
|
|
8
|
+
import './chunk-ZA5CHAFY.js';
|
|
9
|
+
import './chunk-2M63GG56.js';
|
|
9
10
|
import './chunk-PLMTLGYH.js';
|
|
10
11
|
import './chunk-J5M7BSJQ.js';
|
|
11
12
|
import './chunk-EABW6AJQ.js';
|
|
12
|
-
import './chunk-BYT5O5RV.js';
|
|
13
13
|
import './chunk-RA3O54FC.js';
|
|
14
14
|
import './chunk-V7NIVOFD.js';
|
|
15
15
|
import './chunk-ZM2IMMYN.js';
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire } from 'node:module';
|
|
3
|
-
export { childEnvironment, createDockerHost, spawnRun } from './chunk-
|
|
3
|
+
export { childEnvironment, createDockerHost, spawnRun } from './chunk-KMDLFI4P.js';
|
|
4
4
|
import './chunk-QOZKPLVJ.js';
|
|
5
|
-
import './chunk-
|
|
6
|
-
import './chunk-CX22S5BA.js';
|
|
7
|
-
import './chunk-JXYVA45C.js';
|
|
5
|
+
import './chunk-4NPZVMJU.js';
|
|
8
6
|
import './chunk-7RQ73DLO.js';
|
|
9
7
|
import './chunk-4Q7OMKAT.js';
|
|
10
|
-
import './chunk-
|
|
8
|
+
import './chunk-CX22S5BA.js';
|
|
9
|
+
import './chunk-JXYVA45C.js';
|
|
11
10
|
import './chunk-BYT5O5RV.js';
|
|
11
|
+
import './chunk-J5M7BSJQ.js';
|
|
12
12
|
import './chunk-ZM2IMMYN.js';
|
|
13
13
|
import './chunk-Z5GEFMRW.js';
|
|
14
14
|
|