@outerlayer/cli 0.7.0 → 0.8.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.
Files changed (74) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +5 -5
  3. package/dist/{agent-setup-TXLDY5RV.js → agent-setup-K6RD2Z4P.js} +4 -4
  4. package/dist/{build-JF5UOWKJ.js → build-MS34XEGN.js} +2 -1
  5. package/dist/build-info.json +1 -1
  6. package/dist/builder-IG6FNA54.js +13 -0
  7. package/dist/{check-ASZL5BEO.js → check-GX5ND6RO.js} +26 -22
  8. package/dist/chunk-2BRSMBBB.js +264 -0
  9. package/dist/{chunk-PUN7LMNS.js → chunk-4ACZCY4I.js} +2 -2
  10. package/dist/{chunk-2VO25HHO.js → chunk-4FPWKV7L.js} +3 -3
  11. package/dist/{chunk-AII7CKTH.js → chunk-5ODHQP6O.js} +68 -145
  12. package/dist/chunk-7RQ73DLO.js +23 -0
  13. package/dist/{chunk-7FTNIAHS.js → chunk-AX23QKHS.js} +7 -3
  14. package/dist/{chunk-6ZZHWY2Z.js → chunk-BF4KKEFY.js} +4 -4
  15. package/dist/{chunk-5FWNEQNZ.js → chunk-BQFNZOMQ.js} +1 -1
  16. package/dist/chunk-CX22S5BA.js +45 -0
  17. package/dist/{chunk-D6FXM5OW.js → chunk-GAYWY4GI.js} +8 -8
  18. package/dist/{chunk-MQPRB5K7.js → chunk-HSN5QNS5.js} +8 -8
  19. package/dist/chunk-I2UOAV7X.js +133 -0
  20. package/dist/chunk-I7CJIRMM.js +93 -0
  21. package/dist/{chunk-SSU747O6.js → chunk-ILEA3YHM.js} +1 -1
  22. package/dist/{chunk-OUUINEYB.js → chunk-JKIWMRFH.js} +1 -1
  23. package/dist/{chunk-JPR2WHHF.js → chunk-KSLNQOOS.js} +1 -1
  24. package/dist/{chunk-DGAIVMMN.js → chunk-KV47VQJZ.js} +5 -5
  25. package/dist/{chunk-E4PIFIC3.js → chunk-M4ERCYDB.js} +133 -159
  26. package/dist/chunk-PTW6W5NR.js +127 -0
  27. package/dist/{chunk-DTXOJDEH.js → chunk-PWBILI5P.js} +3 -2
  28. package/dist/{chunk-X2FSFU4C.js → chunk-PXFEYBDE.js} +3 -3
  29. package/dist/{chunk-6IYLDODX.js → chunk-Q4432IZT.js} +5 -5
  30. package/dist/{chunk-AJKEHABI.js → chunk-QB5JQH5V.js} +255 -54
  31. package/dist/{chunk-AQ54MKSQ.js → chunk-QNRSFEGY.js} +2 -2
  32. package/dist/{chunk-774HEQL6.js → chunk-TEKZRTM3.js} +91 -8
  33. package/dist/{chunk-CEBIA5FD.js → chunk-TTNFGMHO.js} +42 -50
  34. package/dist/{chunk-F6GFZXZ3.js → chunk-UXYLWVTQ.js} +1 -18
  35. package/dist/{chunk-M5POMKKW.js → chunk-V7NIVOFD.js} +5 -5
  36. package/dist/{chunk-BCLJSQCV.js → chunk-YO4PSLVB.js} +1 -1
  37. package/dist/{chunk-6QWV3YDJ.js → chunk-Z2THOHPP.js} +2 -2
  38. package/dist/{cli-LEVCGAQV.js → cli-X5ONGYNY.js} +128 -78
  39. package/dist/{command-FLSYCGIB.js → command-7NFU3IPO.js} +38 -20
  40. package/dist/{config-I3TVFYLH.js → config-Z3USDBLU.js} +3 -2
  41. package/dist/{connect-cmd-MJMUONDY.js → connect-cmd-PNZ6IJLJ.js} +2 -2
  42. package/dist/{context-adopt-CE4KDXS3.js → context-adopt-D2Z7F7PB.js} +3 -3
  43. package/dist/{context-materialize-QL33HDJN.js → context-materialize-4PMTDS6K.js} +3 -3
  44. package/dist/{dist-PXBSA7QX.js → dist-3ZTZF2TP.js} +1 -1
  45. package/dist/docker-PRHRSJM5.js +15 -0
  46. package/dist/{doctor-FVDT3KJZ.js → doctor-KALLPCRB.js} +39 -16
  47. package/dist/{emit-artifact-cmd-7RPMRSVP.js → emit-artifact-cmd-D5GMVWNC.js} +7 -7
  48. package/dist/{emit-criteria-cmd-MKI7WETO.js → emit-criteria-cmd-IE7VIM64.js} +5 -5
  49. package/dist/{emit-finding-cmd-RMLGZASB.js → emit-finding-cmd-46PTPN3A.js} +5 -5
  50. package/dist/{emit-result-cmd-MTXAZ2GV.js → emit-result-cmd-KXHHP6HX.js} +7 -7
  51. package/dist/{hook-fast-XBOZ3N6L.js → hook-fast-5H5QBJKT.js} +1 -1
  52. package/dist/{host-key-KDYZ5ECC.js → host-key-YMLXY6QB.js} +1 -1
  53. package/dist/index.js +3 -3
  54. package/dist/{init-VLW7H6RW.js → init-B4CECVOX.js} +25 -18
  55. package/dist/{init-BACXESVV.js → init-S4DH6PWW.js} +16 -13
  56. package/dist/{init-cmd-VJFB5L7X.js → init-cmd-P4MVCBCZ.js} +8 -8
  57. package/dist/{install-NMAPLLBQ.js → install-FHTVJZS6.js} +5 -4
  58. package/dist/{install-cmd-B5SEU3G7.js → install-cmd-BEC7XTNG.js} +3 -1
  59. package/dist/{loop-D3243JKT.js → loop-ODMRE3CW.js} +26 -22
  60. package/dist/{machine-EB3GEVI4.js → machine-J4SAB3Z2.js} +15 -12
  61. package/dist/{mcp-serve-cmd-N6UD2KBX.js → mcp-serve-cmd-CT47P4YQ.js} +2 -2
  62. package/dist/{session-sender-LMACEJJS.js → session-sender-V46VPWQ5.js} +6 -6
  63. package/dist/{status-F4THTJJK.js → status-QBKSH3QE.js} +19 -16
  64. package/dist/{sync-cmd-M6JA3OEE.js → sync-cmd-RJR77V4O.js} +5 -5
  65. package/dist/{watch-NB5TGPEZ.js → watch-YNZTFLEY.js} +5 -5
  66. package/dist/{work-claim-cmd-UHMWOS3G.js → work-claim-cmd-KAD3ZAH7.js} +10 -9
  67. package/dist/{work-cmd-6UMCFTAW.js → work-cmd-CNWPTH7W.js} +6 -6
  68. package/dist/{work-comment-cmd-E4LEUIXZ.js → work-comment-cmd-HH45S6UE.js} +6 -6
  69. package/dist/{work-open-pr-cmd-OPZWGSEQ.js → work-open-pr-cmd-5KR3KFCN.js} +7 -7
  70. package/dist/{work-pr-cmd-IDIAFFRU.js → work-pr-cmd-TTEGCP76.js} +6 -6
  71. package/package.json +2 -2
  72. package/skill-pack/maintained/amend/SKILL.md +22 -6
  73. package/dist/chunk-Q5G2ODUZ.js +0 -54
  74. package/dist/docker-NEGDLU6D.js +0 -7
@@ -1,14 +1,14 @@
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-MQPRB5K7.js';
3
+ import { gatherDoctorChecks, doctorExitCode, summarizeChecks, renderDoctorText, recordWrapped, recordUnwrapped, recordRemoval, readManifest, recordInstall, recordStatusline } from './chunk-HSN5QNS5.js';
4
4
  import './chunk-F47JBIAW.js';
5
5
  import './chunk-BKO6JEZI.js';
6
- import './chunk-DGAIVMMN.js';
7
- import './chunk-PUN7LMNS.js';
6
+ import './chunk-KV47VQJZ.js';
7
+ import './chunk-4ACZCY4I.js';
8
8
  import './chunk-BFESLKPP.js';
9
- import './chunk-SSU747O6.js';
9
+ import './chunk-ILEA3YHM.js';
10
10
  import './chunk-ZYHKJKSU.js';
11
- import './chunk-D6FXM5OW.js';
11
+ import './chunk-GAYWY4GI.js';
12
12
  import './chunk-USO2DKBD.js';
13
13
  import './chunk-N6LURUEF.js';
14
14
  import { C, NO_COLOR_FLAG, warnDeprecated, stripNoColor, API_KEY_FLAG_DEPRECATION } from './chunk-YRYMNBGQ.js';
@@ -16,14 +16,14 @@ import { parseTrackerNumber, trackerNumberError } from './chunk-WZBHBH3J.js';
16
16
  import { settingsPath, readSettings, SettingsParseError, listHookCandidates, wrapHooks, writeSettings, unwrapHooks, REGISTERED_EVENTS, cliCommand, removeHooks, removeStatusline, cliBinResolvable, mergeHooks, repointWrappedHooks, AUTO_WRAP_EVENTS, mergeStatusline } from './chunk-5QRP3MVS.js';
17
17
  import { pinExists } from './chunk-ZZXLM64C.js';
18
18
  import './chunk-7ZR5UPMB.js';
19
- import './chunk-BCLJSQCV.js';
19
+ import './chunk-YO4PSLVB.js';
20
20
  import './chunk-BOLTI6LR.js';
21
21
  import './chunk-YNJEOGDL.js';
22
22
  import './chunk-EABW6AJQ.js';
23
23
  import { resolveVersion } from './chunk-RA3O54FC.js';
24
- import './chunk-M5POMKKW.js';
24
+ import './chunk-V7NIVOFD.js';
25
25
  import './chunk-ZM2IMMYN.js';
26
- import { hookFiredMarkerPath, installedCliDistDir } from './chunk-JPR2WHHF.js';
26
+ import { hookFiredMarkerPath, installedCliDistDir } from './chunk-KSLNQOOS.js';
27
27
  import { managedHookScripts, removeJournalHooks, installPreCommitGuardHook, removePreCommitGuardHook } from './chunk-XCCLFVXM.js';
28
28
  import './chunk-BJ3KTMDH.js';
29
29
  import { homeFromEnv } from './chunk-VNVZDWO3.js';
@@ -3623,6 +3623,13 @@ function fail(message) {
3623
3623
  `);
3624
3624
  process.exitCode = 1;
3625
3625
  }
3626
+ function printLauncher(result, summary) {
3627
+ const line = summary(result.launcher);
3628
+ if (line !== void 0) process.stdout.write(`${C.green}\u2713${C.reset} ${line}
3629
+ `);
3630
+ for (const note of result.launcher.notes) process.stdout.write(`${C.yellow}${note}${C.reset}
3631
+ `);
3632
+ }
3626
3633
  function writeJson(value) {
3627
3634
  process.stdout.write(`${JSON.stringify(value, null, 2)}
3628
3635
  `);
@@ -3794,8 +3801,8 @@ ${starter.output}`),
3794
3801
  }
3795
3802
  }
3796
3803
  async function realConnectDepsForCwd() {
3797
- const { realConnectDeps } = await import('./connect-cmd-MJMUONDY.js');
3798
- const { resolveRepoIdentity } = await import('./dist-PXBSA7QX.js');
3804
+ const { realConnectDeps } = await import('./connect-cmd-PNZ6IJLJ.js');
3805
+ const { resolveRepoIdentity } = await import('./dist-3ZTZF2TP.js');
3799
3806
  return {
3800
3807
  ...realConnectDeps(),
3801
3808
  home: homeFromEnv(),
@@ -3848,7 +3855,7 @@ function buildProgram(argv = process.argv) {
3848
3855
  else process.stdout.write(outcome.text);
3849
3856
  return;
3850
3857
  }
3851
- const { runInitCommand } = await import('./init-cmd-VJFB5L7X.js');
3858
+ const { runInitCommand } = await import('./init-cmd-P4MVCBCZ.js');
3852
3859
  const code = await runInitCommand(
3853
3860
  { json: opts.json, factory: opts.factory },
3854
3861
  {
@@ -3860,7 +3867,7 @@ function buildProgram(argv = process.argv) {
3860
3867
  return { ok, text, detail };
3861
3868
  },
3862
3869
  runAgentSetup: async () => {
3863
- const { runAgentSetup } = await import('./agent-setup-TXLDY5RV.js');
3870
+ const { runAgentSetup } = await import('./agent-setup-K6RD2Z4P.js');
3864
3871
  return runAgentSetup({ cwd: process.cwd() });
3865
3872
  },
3866
3873
  runDoctorChecks: gatherDoctorChecks
@@ -3872,7 +3879,7 @@ function buildProgram(argv = process.argv) {
3872
3879
  "after",
3873
3880
  "\nRun it in a repository, after `outerlayer login`. With a login, connect lists\nthe factories you can use and takes the first rule that leaves one answer:\n 1. --factory <org>/<factory>, or a factory id\n 2. the factory this repository is already connected to\n 3. the one factory this repository is linked to\n 4. the one factory you can use\n 5. on a terminal, ask; with no terminal, exit 1 and list each --factory value\n\nIt says what it chose and why. The choice is saved in this repository's git\ndirectory (outerlayer/connection.json), shared by every worktree of the\nclone and never committed. A factory key already belongs to one factory, so\nconnect changes nothing for it. Connect never links a repository.\n\nAfter it saves the choice, connect checks that this repository is linked to\nthe factory. If it is not, connect says so, prints the factory's Work page\nlink where you link it, and exits 2. The choice is saved either way. Run\nconnect again once the repository is linked. With --json, the document has\nlinked (true, false, or null when it could not be checked) and, when false,\nlinkUrl.\n"
3874
3881
  ).action(async (opts) => {
3875
- const { runConnectCommand } = await import('./connect-cmd-MJMUONDY.js');
3882
+ const { runConnectCommand } = await import('./connect-cmd-PNZ6IJLJ.js');
3876
3883
  const code = await runConnectCommand({ factory: opts.factory, json: opts.json }, await realConnectDepsForCwd(), {
3877
3884
  stdout: process.stdout,
3878
3885
  stderr: process.stderr
@@ -3920,7 +3927,7 @@ function buildProgram(argv = process.argv) {
3920
3927
  "\nIncremental: only sessions newer than the last checkpoint ship. The tier\nis applied on this machine before anything leaves it; `--dry-run` prints\nexactly what would. The hook-triggered background sync runs `--quiet`.\nExit 2 means the server rejected at least one session.\n"
3921
3928
  ).action(async (opts) => {
3922
3929
  warnIfApiKeyFlag(opts);
3923
- const { runSync, SyncConfigError, SyncTransportError } = await import('./sync-cmd-M6JA3OEE.js');
3930
+ const { runSync, SyncConfigError, SyncTransportError } = await import('./sync-cmd-RJR77V4O.js');
3924
3931
  try {
3925
3932
  const result = await runSync({
3926
3933
  url: opts.url,
@@ -3949,7 +3956,7 @@ function buildProgram(argv = process.argv) {
3949
3956
  if (invokedCommandToken(argv) === "watch") {
3950
3957
  warnDeprecated("`outerlayer watch` is now `outerlayer daemon`; the old name will be removed in a future release.");
3951
3958
  }
3952
- const { runWatch } = await import('./watch-NB5TGPEZ.js');
3959
+ const { runWatch } = await import('./watch-YNZTFLEY.js');
3953
3960
  await runWatch({ once: opts.once });
3954
3961
  });
3955
3962
  program2.command("hook <event>", { hidden: true }).description("capture-hook fast path, installed by `init`").action(() => {
@@ -4003,7 +4010,7 @@ function buildProgram(argv = process.argv) {
4003
4010
  }
4004
4011
  });
4005
4012
  program2.command("session-sender", { hidden: true }).description("stream a runner build's sessions to its work item while the build runs").action(async () => {
4006
- const { runSessionSender } = await import('./session-sender-LMACEJJS.js');
4013
+ const { runSessionSender } = await import('./session-sender-V46VPWQ5.js');
4007
4014
  try {
4008
4015
  await runSessionSender();
4009
4016
  } catch (err) {
@@ -4061,7 +4068,7 @@ function registerEmitCommands(program2) {
4061
4068
  return;
4062
4069
  }
4063
4070
  warnIfApiKeyFlag(opts);
4064
- const { runEmitResult, EmitResultError } = await import('./emit-result-cmd-MTXAZ2GV.js');
4071
+ const { runEmitResult, EmitResultError } = await import('./emit-result-cmd-KXHHP6HX.js');
4065
4072
  try {
4066
4073
  const result = await runEmitResult({
4067
4074
  name,
@@ -4112,7 +4119,7 @@ locally so it never uploads. One correction can retire several duplicates.
4112
4119
  `
4113
4120
  ).action(async (file, opts) => {
4114
4121
  warnIfApiKeyFlag(opts);
4115
- const { runEmitArtifact, EmitArtifactError } = await import('./emit-artifact-cmd-7RPMRSVP.js');
4122
+ const { runEmitArtifact, EmitArtifactError } = await import('./emit-artifact-cmd-D5GMVWNC.js');
4116
4123
  let pr;
4117
4124
  if (opts.pr !== void 0) {
4118
4125
  pr = parseTrackerNumber(opts.pr);
@@ -4147,7 +4154,7 @@ locally so it never uploads. One correction can retire several duplicates.
4147
4154
  '\n outerlayer emit finding --id gate-skip --category tooling \\\n --title "The pre-push gate prints green when a step was skipped" \\\n --file scripts/git/pre-push-checks.mjs --where "build session"\n\nRecords one problem you hit in the factory: an instruction that is wrong or\nmissing (context), a flaky test, a misbehaving script (tooling), a local\nsetup trap (environment), a bug outside your own change (defect), or\nanything else. A problem in your own change is fixed, not recorded.\nA context finding needs --rule-path and --rule-relation, and --rule-quote\nunless the relation is missing.\n--item names the work item; without it, inside a recorded session, the\nitem that session was launched for is used automatically.\n'
4148
4155
  ).action(async (opts) => {
4149
4156
  warnIfApiKeyFlag(opts);
4150
- const { runEmitFinding, refuseRemovedFindingFlags, EmitFindingError } = await import('./emit-finding-cmd-RMLGZASB.js');
4157
+ const { runEmitFinding, refuseRemovedFindingFlags, EmitFindingError } = await import('./emit-finding-cmd-46PTPN3A.js');
4151
4158
  try {
4152
4159
  refuseRemovedFindingFlags(opts);
4153
4160
  const result = await runEmitFinding({
@@ -4186,7 +4193,7 @@ locally so it never uploads. One correction can retire several duplicates.
4186
4193
  "\n outerlayer emit findings review.json --item 412\n\nRecords a whole batch at once \u2014 a FindingBatch JSON file (schemaVersion,\noptional headSha / contextSourceSha, and 1-500 findings), validated against\nthe same contract `emit finding` uses before anything is sent. Re-emitting\nan id already on the item replaces that row rather than adding a second one.\n--item names the work item; without it, inside a recorded session, the item\nthat session was launched for is used automatically.\n"
4187
4194
  ).action(async (file, opts) => {
4188
4195
  warnIfApiKeyFlag(opts);
4189
- const { runEmitFindings, EmitFindingError } = await import('./emit-finding-cmd-RMLGZASB.js');
4196
+ const { runEmitFindings, EmitFindingError } = await import('./emit-finding-cmd-46PTPN3A.js');
4190
4197
  try {
4191
4198
  const result = await runEmitFindings({
4192
4199
  file,
@@ -4210,7 +4217,7 @@ locally so it never uploads. One correction can retire several duplicates.
4210
4217
  '\n outerlayer emit criteria criteria.json --item 412\n\nRecords the item\'s acceptance criteria as one list. The file is JSON:\n { "criteria": [ { "id": "AC-1", "text": "Given ...", "proof": null },\n { "id": "login.redirect", "text": "...", "proof": "screenshot" } ] }\nAn id is 1-64 characters of A-Z a-z 0-9 . _ : - and is the id evidence is bound to with\n`emit artifact --for`. proof is video, screenshot, report, log, test, file or null (any bound\nartifact proves it). The list holds 1 to 200 criteria, each text at most 2,000\ncharacters, and no id twice. The list is validated before anything is sent.\nOnce an item has a list, only a person can replace it: run the command outside an\nagent session, with your own login. A key bound to no member cannot replace it either.\n--item names the work item; without it, inside a recorded session, the item that\nsession was launched for is used automatically.\n'
4211
4218
  ).action(async (file, opts) => {
4212
4219
  warnIfApiKeyFlag(opts);
4213
- const { runEmitCriteria, EmitCriteriaError } = await import('./emit-criteria-cmd-MKI7WETO.js');
4220
+ const { runEmitCriteria, EmitCriteriaError } = await import('./emit-criteria-cmd-IE7VIM64.js');
4214
4221
  try {
4215
4222
  const result = await runEmitCriteria({
4216
4223
  file,
@@ -4237,7 +4244,7 @@ function registerWorkCommands(program2) {
4237
4244
  "\n outerlayer work build --issue 42 # a host builds it\n outerlayer work build --item 7 # retry an item already on Work\n outerlayer work build --issue 42 --local # you build it\n outerlayer work build --issue ENG-123 --tracker linear # a Linear issue\n\nWithout --local, records a build request: a host takes the item when it\nhas a free slot. It never links the calling session and never takes a\nlease, even run from inside one.\n\nWith --local, puts the item on Work with no build request, so no host\ntakes it, and prints the line that starts your session on it. That\nsession links itself and holds the item's lease while it works.\n"
4238
4245
  ).action(async (opts) => {
4239
4246
  warnIfApiKeyFlag(opts);
4240
- const { runWorkBuild, WorkCommandError } = await import('./work-cmd-6UMCFTAW.js');
4247
+ const { runWorkBuild, WorkCommandError } = await import('./work-cmd-CNWPTH7W.js');
4241
4248
  try {
4242
4249
  await runWorkBuild(opts);
4243
4250
  } catch (err) {
@@ -4253,7 +4260,7 @@ function registerWorkCommands(program2) {
4253
4260
  "\n outerlayer work link-session 42\n\nNames an item that already exists on the calling session \u2014 it never\ncreates one. Create one with `outerlayer work build --local`. Linking\nthe same session to the same item twice is a no-op. Also takes or\nrenews that session's own 20-minute lease, unless --no-lease or\n--ended is given, or another worker already holds a live one.\n"
4254
4261
  ).action(async (number, opts) => {
4255
4262
  warnIfApiKeyFlag(opts);
4256
- const { runWorkLinkSession, WorkCommandError } = await import('./work-cmd-6UMCFTAW.js');
4263
+ const { runWorkLinkSession, WorkCommandError } = await import('./work-cmd-CNWPTH7W.js');
4257
4264
  try {
4258
4265
  await runWorkLinkSession({ ...opts, number, noLease: opts.lease === false, logFailures: opts.logFailures === true });
4259
4266
  } catch (err) {
@@ -4278,8 +4285,8 @@ most one action flag may be given.
4278
4285
  `
4279
4286
  ).action(async (opts) => {
4280
4287
  warnIfApiKeyFlag(opts);
4281
- const { runWorkComment, WorkCommentCommandError } = await import('./work-comment-cmd-E4LEUIXZ.js');
4282
- const { WorkCommandError } = await import('./work-cmd-6UMCFTAW.js');
4288
+ const { runWorkComment, WorkCommentCommandError } = await import('./work-comment-cmd-HH45S6UE.js');
4289
+ const { WorkCommandError } = await import('./work-cmd-CNWPTH7W.js');
4283
4290
  try {
4284
4291
  await runWorkComment(opts);
4285
4292
  } catch (err) {
@@ -4295,8 +4302,8 @@ most one action flag may be given.
4295
4302
  "\n outerlayer work threads --item 7\n\nPrints the item's general thread, then one thread per acceptance\ncriterion that carries proof or a comment, each with who is waiting\non whom next.\n"
4296
4303
  ).action(async (opts) => {
4297
4304
  warnIfApiKeyFlag(opts);
4298
- const { runWorkThreads, WorkCommentCommandError } = await import('./work-comment-cmd-E4LEUIXZ.js');
4299
- const { WorkCommandError } = await import('./work-cmd-6UMCFTAW.js');
4305
+ const { runWorkThreads, WorkCommentCommandError } = await import('./work-comment-cmd-HH45S6UE.js');
4306
+ const { WorkCommandError } = await import('./work-cmd-CNWPTH7W.js');
4300
4307
  try {
4301
4308
  await runWorkThreads(opts);
4302
4309
  } catch (err) {
@@ -4318,7 +4325,7 @@ live addition remains on it.
4318
4325
  `
4319
4326
  ).action(async (opts) => {
4320
4327
  warnIfApiKeyFlag(opts);
4321
- const { runWorkRemove, WorkCommandError } = await import('./work-cmd-6UMCFTAW.js');
4328
+ const { runWorkRemove, WorkCommandError } = await import('./work-cmd-CNWPTH7W.js');
4322
4329
  try {
4323
4330
  await runWorkRemove(opts);
4324
4331
  } catch (err) {
@@ -4331,7 +4338,7 @@ live addition remains on it.
4331
4338
  });
4332
4339
  workCmd.command("status").description("Show one item's stage, gate ledger, and additions").option("--item <number>", "the item's number inside this factory").option("--issue <number>", "issue number").option("--repo <owner/name>", "repository (default: the current checkout's remote)").option("--json", "machine-readable JSON output").option("--url <url>", "cloud base URL (or OUTERLAYER_URL / config)").addOption(apiKeyOption()).option("--app-id <id>", "factory id the key is bound to (or OUTERLAYER_APP_ID / config)").action(async (opts) => {
4333
4340
  warnIfApiKeyFlag(opts);
4334
- const { runWorkStatus, WorkCommandError } = await import('./work-cmd-6UMCFTAW.js');
4341
+ const { runWorkStatus, WorkCommandError } = await import('./work-cmd-CNWPTH7W.js');
4335
4342
  try {
4336
4343
  await runWorkStatus(opts);
4337
4344
  } catch (err) {
@@ -4344,7 +4351,7 @@ live addition remains on it.
4344
4351
  });
4345
4352
  workCmd.command("list").description("List live work items for this factory").option("--stage <spec|build|review>", "filter by stage").option("--section <attention|waiting|flowing>", "filter by Queue section").option("--repo <owner/name>", "repository (default: the current checkout's remote)").option("--unclaimed", "only items with no live lease").option("--claimed", "only items with a live lease, held by a host or a local session").option("--startable", "only items with an unused build request and no live lease").option("--needs <amend>", "only items with a thread waiting on an agent").option("--json", "machine-readable JSON output").option("--url <url>", "cloud base URL (or OUTERLAYER_URL / config)").addOption(apiKeyOption()).option("--app-id <id>", "factory id the key is bound to (or OUTERLAYER_APP_ID / config)").action(async (opts) => {
4346
4353
  warnIfApiKeyFlag(opts);
4347
- const { runWorkList, WorkCommandError } = await import('./work-cmd-6UMCFTAW.js');
4354
+ const { runWorkList, WorkCommandError } = await import('./work-cmd-CNWPTH7W.js');
4348
4355
  try {
4349
4356
  await runWorkList(opts);
4350
4357
  } catch (err) {
@@ -4360,7 +4367,7 @@ live addition remains on it.
4360
4367
  "\n outerlayer work claim --item 42 --kind implement\n\nRecords a lease for this host. A live lease already held by a\ndifferent host is refused; claiming again under the same host extends\nit.\n"
4361
4368
  ).action(async (opts) => {
4362
4369
  warnIfApiKeyFlag(opts);
4363
- const { runWorkClaim, WorkCommandError } = await import('./work-claim-cmd-UHMWOS3G.js');
4370
+ const { runWorkClaim, WorkCommandError } = await import('./work-claim-cmd-KAD3ZAH7.js');
4364
4371
  try {
4365
4372
  await runWorkClaim(opts);
4366
4373
  } catch (err) {
@@ -4376,7 +4383,7 @@ live addition remains on it.
4376
4383
  "\n outerlayer work renew --item 42\n\nExtends this host's own live lease. Refused with a 410 if the lease\nhas expired, or a 403 if a different host holds it.\n"
4377
4384
  ).action(async (opts) => {
4378
4385
  warnIfApiKeyFlag(opts);
4379
- const { runWorkRenew, WorkCommandError } = await import('./work-claim-cmd-UHMWOS3G.js');
4386
+ const { runWorkRenew, WorkCommandError } = await import('./work-claim-cmd-KAD3ZAH7.js');
4380
4387
  try {
4381
4388
  await runWorkRenew(opts);
4382
4389
  } catch (err) {
@@ -4395,7 +4402,7 @@ live addition remains on it.
4395
4402
  "\n outerlayer work release --item 42 --outcome ok\n\nMarks this host's lease released, optionally with an outcome.\nReleasing an already-released lease is a no-op that returns the\nrecorded release time and outcome.\n"
4396
4403
  ).action(async (opts) => {
4397
4404
  warnIfApiKeyFlag(opts);
4398
- const { runWorkRelease, WorkCommandError } = await import('./work-claim-cmd-UHMWOS3G.js');
4405
+ const { runWorkRelease, WorkCommandError } = await import('./work-claim-cmd-KAD3ZAH7.js');
4399
4406
  try {
4400
4407
  await runWorkRelease(opts);
4401
4408
  } catch (err) {
@@ -4411,7 +4418,7 @@ live addition remains on it.
4411
4418
  "\n outerlayer work pr 481\n\nRun inside a session already on a work item. Records that pull\nrequest 481 in the checkout's repository belongs to that item \u2014 the\nsame fact a `pr-link` in the session's own transcript records on\nsync. Idempotent: declaring the same pull request twice is a no-op.\n"
4412
4419
  ).action(async (number, opts) => {
4413
4420
  warnIfApiKeyFlag(opts);
4414
- const { runWorkPr, WorkPrCommandError } = await import('./work-pr-cmd-IDIAFFRU.js');
4421
+ const { runWorkPr, WorkPrCommandError } = await import('./work-pr-cmd-TTEGCP76.js');
4415
4422
  try {
4416
4423
  await runWorkPr({ ...opts, number });
4417
4424
  } catch (err) {
@@ -4427,8 +4434,8 @@ live addition remains on it.
4427
4434
  '\n outerlayer work open-pr --title "Add the thing" --body-file pr.md\n\nIn a host build, which holds an item key, the gateway opens the pull\nrequest as the factory\'s GitHub App, from the branch the claim named,\nor edits the one already open on that branch. No gh command runs.\nIn your own session it runs `gh pr create` (or `gh pr edit`) under your\nlogin, then declares the pull request on the item, as `work pr` does.\nRun it again after a change to the title or description.\n'
4428
4435
  ).action(async (opts) => {
4429
4436
  warnIfApiKeyFlag(opts);
4430
- const { runWorkOpenPr, WorkOpenPrCommandError } = await import('./work-open-pr-cmd-OPZWGSEQ.js');
4431
- const { WorkCommandError } = await import('./work-cmd-6UMCFTAW.js');
4437
+ const { runWorkOpenPr, WorkOpenPrCommandError } = await import('./work-open-pr-cmd-5KR3KFCN.js');
4438
+ const { WorkCommandError } = await import('./work-cmd-CNWPTH7W.js');
4432
4439
  try {
4433
4440
  await runWorkOpenPr(opts);
4434
4441
  } catch (err) {
@@ -4444,8 +4451,8 @@ function registerRunnerCommands(program2) {
4444
4451
  const runnerCmd = program2.command("runner").description("Take work from the implement and amend queues on this machine");
4445
4452
  const configOption = "the cloud config file to run against (default: ~/.outerlayer/config.json)";
4446
4453
  runnerCmd.command("start").description("Run the loop: claim work, run it, report, clean up, repeat").option("--config <path>", configOption).action(async (opts) => {
4447
- const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-I3TVFYLH.js');
4448
- const { start, RunnerStartError } = await import('./loop-D3243JKT.js');
4454
+ const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-Z3USDBLU.js');
4455
+ const { start, RunnerStartError } = await import('./loop-ODMRE3CW.js');
4449
4456
  const { RunnerAlreadyRunningError } = await import('./pidfile-UZRH774M.js');
4450
4457
  const configPath = opts.config ?? defaultRunnerConfigPath();
4451
4458
  try {
@@ -4460,8 +4467,8 @@ function registerRunnerCommands(program2) {
4460
4467
  }
4461
4468
  });
4462
4469
  runnerCmd.command("check").description("Validate the config, the hooks and the key, and print the effective settings").option("--config <path>", configOption).action(async (opts) => {
4463
- const { defaultRunnerConfigPath } = await import('./config-I3TVFYLH.js');
4464
- const { runRunnerCheck } = await import('./check-ASZL5BEO.js');
4470
+ const { defaultRunnerConfigPath } = await import('./config-Z3USDBLU.js');
4471
+ const { runRunnerCheck } = await import('./check-GX5ND6RO.js');
4465
4472
  const configPath = opts.config ?? defaultRunnerConfigPath();
4466
4473
  const result = await runRunnerCheck(configPath);
4467
4474
  if (!result.ok) {
@@ -4476,12 +4483,12 @@ function registerRunnerCommands(program2) {
4476
4483
  process.stdout.write(`${result.lines.join("\n")}
4477
4484
  `);
4478
4485
  });
4479
- runnerCmd.command("install").description("Put this CLI in the runner's install layout; --service adds its service").option("--config <path>", configOption).option("--service", "set up the service that keeps the runner running").option("--print", "with --service, print the unit and set up nothing").option("--user <account>", "with --service, the account the service runs as").option("--replace", "with --service, replace a unit this command did not write").addOption(new Option("--unit-name <name>", "with --service, the unit's name").hideHelp()).action(async (opts) => {
4480
- const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-I3TVFYLH.js');
4481
- const { runRunnerInstall, RunnerInstallError } = await import('./install-cmd-B5SEU3G7.js');
4486
+ runnerCmd.command("install").description("Put this CLI in the runner's install layout; --service adds its service").option("--config <path>", configOption).option("--service", "set up the service that keeps the runner running").option("--print", "with --service, print the unit and set up nothing").option("--user <account>", "with --service, the account the service runs as").option("--replace", "replace a unit or launcher file this command did not write").option("--allow-downgrade", "install this CLI even when it is older than the version the runner runs").addOption(new Option("--unit-name <name>", "with --service, the unit's name").hideHelp()).action(async (opts) => {
4487
+ const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-Z3USDBLU.js');
4488
+ const { runRunnerInstall, RunnerInstallError, launcherSummary } = await import('./install-cmd-BEC7XTNG.js');
4482
4489
  const configPath = opts.config ?? defaultRunnerConfigPath();
4483
4490
  if (opts.service !== true) {
4484
- for (const flag of ["print", "user", "replace", "unitName"]) {
4491
+ for (const flag of ["print", "user", "unitName"]) {
4485
4492
  if (opts[flag] !== void 0) {
4486
4493
  fail(`--${flag === "unitName" ? "unit-name" : flag} is for --service.`);
4487
4494
  return;
@@ -4490,26 +4497,39 @@ function registerRunnerCommands(program2) {
4490
4497
  }
4491
4498
  try {
4492
4499
  if (opts.service === true) {
4493
- const { installServiceCommand } = await import('./command-FLSYCGIB.js');
4500
+ const { installServiceCommand } = await import('./command-7NFU3IPO.js');
4494
4501
  const result2 = await installServiceCommand({
4495
4502
  configPath,
4496
4503
  print: opts.print,
4497
4504
  user: opts.user,
4498
4505
  replace: opts.replace,
4506
+ allowDowngrade: opts.allowDowngrade,
4499
4507
  unitName: opts.unitName,
4500
4508
  entryPath: process.argv[1] ?? "",
4501
4509
  nodePath: process.execPath,
4502
4510
  home: homeFromEnv()
4503
4511
  });
4504
4512
  if (result2.unit !== void 0) process.stdout.write(result2.unit);
4505
- if (result2.ok) for (const line of result2.lines) process.stdout.write(`${C.green}\u2713${C.reset} ${line}
4513
+ if (result2.ok) {
4514
+ for (const line of result2.lines) process.stdout.write(`${C.green}\u2713${C.reset} ${line}
4506
4515
  `);
4507
- else fail(result2.lines.length > 0 ? result2.lines.join("\n ") : "the service was not set up");
4516
+ for (const note of result2.notes ?? []) process.stdout.write(`${C.yellow}${note}${C.reset}
4517
+ `);
4518
+ } else fail(result2.lines.length > 0 ? result2.lines.join("\n ") : "the service was not set up");
4508
4519
  return;
4509
4520
  }
4510
- const result = runRunnerInstall({ configPath, entryPath: process.argv[1] ?? "", nodePath: process.execPath });
4521
+ const result = runRunnerInstall({
4522
+ configPath,
4523
+ entryPath: process.argv[1] ?? "",
4524
+ nodePath: process.execPath,
4525
+ home: homeFromEnv(),
4526
+ PATH: process.env.PATH,
4527
+ replace: opts.replace,
4528
+ allowDowngrade: opts.allowDowngrade
4529
+ });
4511
4530
  process.stdout.write(`${C.green}\u2713${C.reset} installed ${result.version} for the runner; \`current\` names it
4512
4531
  `);
4532
+ printLauncher(result, launcherSummary);
4513
4533
  process.stdout.write(
4514
4534
  `
4515
4535
  To keep it running, run ${C.yellow}outerlayer runner install --service${C.reset}. To start the runner from the install layout yourself, use this line, then restart the service:
@@ -4529,18 +4549,18 @@ To keep it running, run ${C.yellow}outerlayer runner install --service${C.reset}
4529
4549
  fail("pass --service: `outerlayer runner uninstall --service` removes the runner's service.");
4530
4550
  return;
4531
4551
  }
4532
- const { defaultRunnerConfigPath } = await import('./config-I3TVFYLH.js');
4533
- const { uninstallServiceCommand } = await import('./command-FLSYCGIB.js');
4552
+ const { defaultRunnerConfigPath } = await import('./config-Z3USDBLU.js');
4553
+ const { uninstallServiceCommand } = await import('./command-7NFU3IPO.js');
4534
4554
  const result = await uninstallServiceCommand({ configPath: opts.config ?? defaultRunnerConfigPath(), unitName: opts.unitName, home: homeFromEnv() });
4535
4555
  if (result.ok) for (const line of result.lines) process.stdout.write(`${C.green}\u2713${C.reset} ${line}
4536
4556
  `);
4537
4557
  else fail(result.lines.length > 0 ? result.lines.join("\n ") : "the service was not removed");
4538
4558
  });
4539
4559
  runnerCmd.command("init").description("Write a runner block that fits this machine; on macOS, offers a Linux VM").option("--config <path>", configOption).option("--vm", "on macOS, run the runner in a Linux VM (Lima), with container builds").option("--no-vm", "on macOS, skip the VM and run builds as unisolated processes").option("--allow-process-builds", "where builds cannot be isolated, run them as processes anyway").addOption(new Option("--config-stdin", "the VM-side hand-off: read the whole config as JSON on stdin").hideHelp()).addOption(new Option("--vm-cli-package <path>", "install this packed CLI tarball in the VM instead of the published version").hideHelp()).addOption(new Option("--unit-name <name>", "the service unit's name").hideHelp()).action(async (opts) => {
4540
- const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-I3TVFYLH.js');
4541
- const { runRunnerInit, RunnerInitError } = await import('./init-BACXESVV.js');
4542
- const { detectMachine } = await import('./machine-EB3GEVI4.js');
4543
- const { chooseVm, runVmInit, VmInitError } = await import('./init-VLW7H6RW.js');
4560
+ const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-Z3USDBLU.js');
4561
+ const { runRunnerInit, RunnerInitError } = await import('./init-S4DH6PWW.js');
4562
+ const { detectMachine } = await import('./machine-J4SAB3Z2.js');
4563
+ const { chooseVm, runVmInit, VmInitError } = await import('./init-B4CECVOX.js');
4544
4564
  const configPath = opts.config ?? defaultRunnerConfigPath();
4545
4565
  try {
4546
4566
  const machine = detectMachine();
@@ -4548,7 +4568,7 @@ To keep it running, run ${C.yellow}outerlayer runner install --service${C.reset}
4548
4568
  const chunks = [];
4549
4569
  for await (const chunk of process.stdin) chunks.push(Buffer.from(chunk));
4550
4570
  const result2 = runRunnerInit(configPath, { machine, configFromStdin: Buffer.concat(chunks).toString("utf8"), requireContainer: true });
4551
- const { ensureHostKey: ensureHostKey2 } = await import('./host-key-KDYZ5ECC.js');
4571
+ const { ensureHostKey: ensureHostKey2 } = await import('./host-key-YMLXY6QB.js');
4552
4572
  const hostKey2 = await ensureHostKey2(configPath);
4553
4573
  process.stdout.write(`host key ${hostKey2.fingerprint}
4554
4574
  hooks: ${result2.hooks}
@@ -4591,7 +4611,7 @@ hooks: ${result2.hooks}
4591
4611
  }
4592
4612
  const allowProcess = opts.allowProcessBuilds === true || machine.platform === "darwin" && declinedVm;
4593
4613
  const result = runRunnerInit(configPath, { machine, allowProcess });
4594
- const { ensureHostKey } = await import('./host-key-KDYZ5ECC.js');
4614
+ const { ensureHostKey } = await import('./host-key-YMLXY6QB.js');
4595
4615
  const hostKey = await ensureHostKey(configPath);
4596
4616
  process.stdout.write(`${C.green}\u2713${C.reset} wrote a runner block into ${result.configPath}
4597
4617
  `);
@@ -4609,22 +4629,38 @@ ${C.yellow}${result.note}${C.reset}
4609
4629
  To isolate builds in containers instead, run ${C.yellow}outerlayer runner init --vm${C.reset}.
4610
4630
  `);
4611
4631
  }
4612
- const { runRunnerInstall, RunnerInstallError } = await import('./install-cmd-B5SEU3G7.js');
4632
+ const { runRunnerInstall, RunnerInstallError, RunnerDowngradeError, launcherSummary } = await import('./install-cmd-BEC7XTNG.js');
4613
4633
  let installedLayout = false;
4634
+ let noService = "it starts the runner from the install layout, which needs a CLI installed with npm";
4614
4635
  try {
4615
- const installed = runRunnerInstall({ configPath, entryPath: process.argv[1] ?? "", nodePath: process.execPath });
4636
+ const installed = runRunnerInstall({
4637
+ configPath,
4638
+ entryPath: process.argv[1] ?? "",
4639
+ nodePath: process.execPath,
4640
+ home: homeFromEnv(),
4641
+ PATH: process.env.PATH,
4642
+ command: "runner install --service"
4643
+ });
4616
4644
  installedLayout = true;
4617
4645
  process.stdout.write(`${C.green}\u2713${C.reset} installed ${installed.version} for the runner, so it can update itself
4618
4646
  `);
4647
+ printLauncher(installed, launcherSummary);
4619
4648
  } catch (installErr) {
4620
4649
  if (!(installErr instanceof RunnerInstallError)) throw installErr;
4621
- process.stdout.write(`
4650
+ if (installErr instanceof RunnerDowngradeError) {
4651
+ noService = "the install layout was left as it is";
4652
+ process.stdout.write(`
4653
+ ${C.yellow}The install layout was left alone: ${installErr.message}${C.reset}
4654
+ `);
4655
+ } else {
4656
+ process.stdout.write(`
4622
4657
  ${C.yellow}The runner will not update itself: ${installErr.message}${C.reset}
4623
4658
  `);
4659
+ }
4624
4660
  }
4625
4661
  let serviceUp = false;
4626
4662
  if (installedLayout) {
4627
- const { installServiceCommand } = await import('./command-FLSYCGIB.js');
4663
+ const { installServiceCommand } = await import('./command-7NFU3IPO.js');
4628
4664
  const service = await installServiceCommand({
4629
4665
  configPath,
4630
4666
  entryPath: process.argv[1] ?? "",
@@ -4638,7 +4674,7 @@ ${C.yellow}The runner will not update itself: ${installErr.message}${C.reset}
4638
4674
  ` : `${C.yellow}${line}${C.reset}
4639
4675
  `);
4640
4676
  } else {
4641
- process.stdout.write(`${C.yellow}No service was set up: it starts the runner from the install layout, which needs a CLI installed with npm.${C.reset}
4677
+ process.stdout.write(`${C.yellow}No service was set up: ${noService}.${C.reset}
4642
4678
  `);
4643
4679
  }
4644
4680
  process.stdout.write(
@@ -4662,19 +4698,33 @@ Next:
4662
4698
  "after",
4663
4699
  "\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"
4664
4700
  ).action(async (opts) => {
4665
- const { defaultRunnerConfigPath } = await import('./config-I3TVFYLH.js');
4666
- const { buildRepositoryImage, RecipeError } = await import('./build-JF5UOWKJ.js');
4701
+ const { defaultRunnerConfigPath } = await import('./config-Z3USDBLU.js');
4702
+ const { buildRepositoryImage, RecipeError } = await import('./build-MS34XEGN.js');
4667
4703
  const { currentCliBuild } = await import('./cli-build-K56DK4DS.js');
4668
- const { createDockerHost } = await import('./docker-NEGDLU6D.js');
4704
+ const { createDockerHost } = await import('./docker-PRHRSJM5.js');
4705
+ const { builderSpec } = await import('./builder-IG6FNA54.js');
4706
+ const { loadRunnerConfig } = await import('./config-Z3USDBLU.js');
4707
+ const configPath = opts.config ?? defaultRunnerConfigPath();
4708
+ const memory = (() => {
4709
+ try {
4710
+ return loadRunnerConfig(configPath).build?.memory ?? "8g";
4711
+ } catch {
4712
+ return "8g";
4713
+ }
4714
+ })();
4669
4715
  try {
4670
4716
  const result = await buildRepositoryImage(
4671
4717
  {
4672
4718
  repository: opts.repository,
4673
4719
  remote: opts.remote,
4674
- configPath: opts.config ?? defaultRunnerConfigPath(),
4675
- cli: currentCliBuild()
4720
+ configPath,
4721
+ cli: currentCliBuild(),
4722
+ log: (line) => {
4723
+ if (!opts.json) process.stdout.write(`${line}
4724
+ `);
4725
+ }
4676
4726
  },
4677
- { host: createDockerHost() }
4727
+ { host: createDockerHost({ builder: builderSpec(configPath, memory, process.env), replaceStaleBuilder: false }) }
4678
4728
  );
4679
4729
  if (opts.json) {
4680
4730
  writeJson(result);
@@ -4714,16 +4764,16 @@ Next:
4714
4764
  }
4715
4765
  });
4716
4766
  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) => {
4717
- const { defaultRunnerConfigPath } = await import('./config-I3TVFYLH.js');
4718
- const { requestStop } = await import('./loop-D3243JKT.js');
4767
+ const { defaultRunnerConfigPath } = await import('./config-Z3USDBLU.js');
4768
+ const { requestStop } = await import('./loop-ODMRE3CW.js');
4719
4769
  const configPath = opts.config ?? defaultRunnerConfigPath();
4720
4770
  await requestStop(configPath, Boolean(opts.now));
4721
4771
  });
4722
4772
  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) => {
4723
- const { defaultRunnerConfigPath, loadRunnerConfig } = await import('./config-I3TVFYLH.js');
4773
+ const { defaultRunnerConfigPath, loadRunnerConfig } = await import('./config-Z3USDBLU.js');
4724
4774
  const { jobsDir, runnerDir } = await import('./paths-OYKMVYJP.js');
4725
- const { listJobFiles, runnerProcessState } = await import('./loop-D3243JKT.js');
4726
- const { renderStatus } = await import('./status-F4THTJJK.js');
4775
+ const { listJobFiles, runnerProcessState } = await import('./loop-ODMRE3CW.js');
4776
+ const { renderStatus } = await import('./status-QBKSH3QE.js');
4727
4777
  const { readHousekeepingRecord } = await import('./record-C43U4PKS.js');
4728
4778
  const path2 = await import('path');
4729
4779
  const configPath = opts.config ?? defaultRunnerConfigPath();
@@ -4741,7 +4791,7 @@ Next:
4741
4791
  const service = await (async () => {
4742
4792
  if (process.platform !== "linux" || !existsSync("/run/systemd/system")) return void 0;
4743
4793
  const { inspectService, realInspectProbes } = await import('./inspect-XAUSB7L3.js');
4744
- const { DEFAULT_UNIT_NAME } = await import('./install-NMAPLLBQ.js');
4794
+ const { DEFAULT_UNIT_NAME } = await import('./install-FHTVJZS6.js');
4745
4795
  const facts = inspectService(DEFAULT_UNIT_NAME, path2.dirname(configPath), realInspectProbes());
4746
4796
  return facts === void 0 ? void 0 : { unit: facts.unit, running: facts.mainPid !== void 0, delegated: facts.delegate };
4747
4797
  })();
@@ -4774,8 +4824,8 @@ Next:
4774
4824
  );
4775
4825
  });
4776
4826
  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) => {
4777
- const { defaultRunnerConfigPath } = await import('./config-I3TVFYLH.js');
4778
- const { listJobFiles } = await import('./loop-D3243JKT.js');
4827
+ const { defaultRunnerConfigPath } = await import('./config-Z3USDBLU.js');
4828
+ const { listJobFiles } = await import('./loop-ODMRE3CW.js');
4779
4829
  const { newestAttempt, logPathFor, tail, RunnerLogsError } = await import('./logs-H55NWW4H.js');
4780
4830
  const configPath = opts.config ?? defaultRunnerConfigPath();
4781
4831
  const item = parseTrackerNumber(itemArg);
@@ -5021,7 +5071,7 @@ function registerMcpCommands(program2) {
5021
5071
  "after",
5022
5072
  "\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"
5023
5073
  ).action(async (opts) => {
5024
- const { runMcpServe, handleMcpServeError } = await import('./mcp-serve-cmd-N6UD2KBX.js');
5074
+ const { runMcpServe, handleMcpServeError } = await import('./mcp-serve-cmd-CT47P4YQ.js');
5025
5075
  try {
5026
5076
  await runMcpServe({ url: opts.url, appId: opts.appId });
5027
5077
  } catch (err) {
@@ -5091,7 +5141,7 @@ function registerContextCommands(program2) {
5091
5141
  await compileContext({ dir: opts.dir, check: opts.check, json: opts.json });
5092
5142
  });
5093
5143
  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) => {
5094
- const { runContextAdopt } = await import('./context-adopt-CE4KDXS3.js');
5144
+ const { runContextAdopt } = await import('./context-adopt-D2Z7F7PB.js');
5095
5145
  const { exitCode, stdout } = runContextAdopt(stagedDir, process.cwd());
5096
5146
  process.stdout.write(stdout);
5097
5147
  process.exitCode = exitCode;
@@ -5100,7 +5150,7 @@ function registerContextCommands(program2) {
5100
5150
  "after",
5101
5151
  "\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"
5102
5152
  ).action(async (opts) => {
5103
- const { materializeContext } = await import('./context-materialize-QL33HDJN.js');
5153
+ const { materializeContext } = await import('./context-materialize-4PMTDS6K.js');
5104
5154
  const result = await materializeContext({ cwd: process.cwd(), sessionId: `manual-${Date.now()}` });
5105
5155
  const output = formatContextMaterializeOutput(result);
5106
5156
  if (output.exitCode !== void 0) process.exitCode = output.exitCode;