@outerlayer/cli 0.33.0-next.20261023003700 → 0.33.0-next.20261023120437

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 (107) hide show
  1. package/README.md +11 -4
  2. package/dist/{agent-setup-55ZDEXCS.js → agent-setup-YHEW3WXB.js} +10 -10
  3. package/dist/{artifact-link-cmd-6FF2Y6QI.js → artifact-link-cmd-7FYKWA7J.js} +2 -2
  4. package/dist/{build-disk-JHTMPRAA.js → build-disk-ECTLWTPC.js} +4 -4
  5. package/dist/build-info.json +1 -1
  6. package/dist/{builder-Y4P7QARW.js → builder-LUPHKUFM.js} +3 -3
  7. package/dist/{check-MRYFTLOO.js → check-4QNLMDP7.js} +28 -28
  8. package/dist/{chunk-3RIFVLPO.js → chunk-2JLM4GUF.js} +12 -12
  9. package/dist/{chunk-G63KT5I5.js → chunk-44V5SD4G.js} +1 -1
  10. package/dist/{chunk-ULBNTSAD.js → chunk-5M2J7B5N.js} +2 -2
  11. package/dist/{chunk-LJG6EMLJ.js → chunk-6CXNWKWD.js} +1 -1
  12. package/dist/{chunk-BKADJZ7F.js → chunk-6SPD266O.js} +3 -3
  13. package/dist/{chunk-Q2CMEQV7.js → chunk-7IFYI7XF.js} +3 -3
  14. package/dist/{chunk-AU346ENF.js → chunk-7UPMYRPS.js} +4 -4
  15. package/dist/{chunk-NSPRS7WK.js → chunk-7V5GUEDU.js} +1 -1
  16. package/dist/{chunk-EUVE2EAE.js → chunk-AKZRGFGT.js} +3 -3
  17. package/dist/{chunk-2N67C6IV.js → chunk-D3EDZPJR.js} +5 -5
  18. package/dist/{chunk-BJQ25STI.js → chunk-DKFUXYGD.js} +4 -4
  19. package/dist/{chunk-HE4FBF4T.js → chunk-EHOFFTVX.js} +2 -2
  20. package/dist/{chunk-HXA5GIHK.js → chunk-EJL6CWSP.js} +6 -6
  21. package/dist/chunk-ER6KQCVJ.js +18 -0
  22. package/dist/{chunk-DISTLL2Q.js → chunk-EXZACZ2P.js} +1 -1
  23. package/dist/{chunk-E6CO3MJE.js → chunk-F2D5BSXS.js} +38 -2
  24. package/dist/{chunk-UIUGTW5C.js → chunk-FT7MUQGO.js} +2 -2
  25. package/dist/{chunk-PWH3BEZF.js → chunk-FZUFUVLK.js} +13 -13
  26. package/dist/{chunk-XL2XWWU7.js → chunk-GO2DUPQS.js} +3 -3
  27. package/dist/{chunk-B2JURP6A.js → chunk-HLZMAJJD.js} +2 -2
  28. package/dist/{chunk-2EGCI2VW.js → chunk-IUPY54BZ.js} +10 -10
  29. package/dist/{chunk-GFYEMCPP.js → chunk-JEVKOZBB.js} +1 -1
  30. package/dist/{chunk-DY7Y7UT4.js → chunk-KUE4V2SK.js} +2 -2
  31. package/dist/{chunk-SVDOA4W2.js → chunk-L6MDOEHN.js} +7 -7
  32. package/dist/{chunk-HJYBWJAS.js → chunk-LYGI3T66.js} +2 -2
  33. package/dist/{chunk-EWVYQLD3.js → chunk-MPC2UAW2.js} +1 -1
  34. package/dist/{chunk-5DNCFOXA.js → chunk-NIY2UBT6.js} +1 -1
  35. package/dist/{chunk-FR7HWWCF.js → chunk-OGMXVPCS.js} +1 -1
  36. package/dist/{chunk-6Z4SZHV2.js → chunk-QKNFU5GA.js} +5 -5
  37. package/dist/{chunk-2WMZPJVE.js → chunk-S5CNYXUA.js} +4 -4
  38. package/dist/{chunk-7HHNGZS5.js → chunk-SQQD5MST.js} +4 -4
  39. package/dist/{chunk-QPWFVE3X.js → chunk-UK4RGH46.js} +2 -2
  40. package/dist/{chunk-JHTJPQSL.js → chunk-V673DFOL.js} +4 -4
  41. package/dist/{chunk-RQJMN5TJ.js → chunk-VWQCYOBS.js} +2 -2
  42. package/dist/{chunk-W2AEL4BJ.js → chunk-X4JEBMYN.js} +1 -1
  43. package/dist/{chunk-T5REPMNL.js → chunk-XCRET2GZ.js} +2 -2
  44. package/dist/{chunk-XHHTMFCX.js → chunk-YGZLRX5U.js} +1 -1
  45. package/dist/{chunk-SDU2IE22.js → chunk-YSM4EEUK.js} +12 -12
  46. package/dist/{chunk-VT4TTJPG.js → chunk-YXMGHGHR.js} +5 -5
  47. package/dist/{chunk-AVTI3FL5.js → chunk-ZF24JN7R.js} +1 -1
  48. package/dist/{claude-launcher-NTYHJUJM.js → claude-launcher-YRPW4SWA.js} +5 -5
  49. package/dist/{cli-K6XGL4EZ.js → cli-BC7JWQUQ.js} +149 -103
  50. package/dist/{command-7FAIIQGF.js → command-SQ4466SL.js} +19 -19
  51. package/dist/{config-QXMUWJAQ.js → config-MVA7YTFW.js} +5 -5
  52. package/dist/{connect-cmd-P5GASVAF.js → connect-cmd-KWXV2CGC.js} +8 -8
  53. package/dist/{container-start-CVP3NTDG.js → container-start-AQJ64LCF.js} +20 -20
  54. package/dist/{context-cleanup-BX5Y3AFL.js → context-cleanup-A2FGVVPH.js} +3 -3
  55. package/dist/{context-show-cmd-3EPJ7CJC.js → context-show-cmd-6F4UF4ND.js} +9 -9
  56. package/dist/{control-plane-launch-A3YCHQNQ.js → control-plane-launch-7SOH6IMA.js} +6 -6
  57. package/dist/{dist-ACTRIBVW.js → dist-IG2DKUJJ.js} +2 -2
  58. package/dist/{docker-ANW76BNW.js → docker-YKYQJHL2.js} +3 -3
  59. package/dist/{doctor-GJAHI3KU.js → doctor-4YZOP343.js} +20 -20
  60. package/dist/{emit-artifact-cmd-FDPJKGOO.js → emit-artifact-cmd-6QTTWBVN.js} +13 -13
  61. package/dist/{emit-cmd-OX6LYS6I.js → emit-cmd-3FG7FEGO.js} +6 -6
  62. package/dist/{emit-criteria-cmd-3SVGCMJN.js → emit-criteria-cmd-22VVCL2W.js} +10 -10
  63. package/dist/{emit-demo-cmd-6DF2QIAS.js → emit-demo-cmd-IQRS7BP2.js} +243 -51
  64. package/dist/{emit-finding-cmd-TLJWBGQE.js → emit-finding-cmd-TXDPJFVT.js} +10 -10
  65. package/dist/{emit-result-cmd-CJNVDV5V.js → emit-result-cmd-QHJDUC7J.js} +12 -12
  66. package/dist/{emit-step-cmd-347CZO7Y.js → emit-step-cmd-TQCOLXAA.js} +10 -10
  67. package/dist/{findings-cmd-LHTYEHYB.js → findings-cmd-EURKADAY.js} +10 -10
  68. package/dist/{fleet-readiness-KGR5AC2J.js → fleet-readiness-GXDSFTLP.js} +8 -8
  69. package/dist/{governing-source-JZQZUTMA.js → governing-source-IRRP7G5G.js} +13 -13
  70. package/dist/{hook-fast-6WDMNZG5.js → hook-fast-3IYSWDL4.js} +1 -1
  71. package/dist/index.js +4 -4
  72. package/dist/{init-ZQ5B3TJZ.js → init-63X6ECKF.js} +19 -19
  73. package/dist/{init-XDOKWBL2.js → init-T64C4MID.js} +19 -19
  74. package/dist/{init-cmd-YMGW2WXJ.js → init-cmd-7CGCDLBZ.js} +18 -18
  75. package/dist/{init-update-X7YLZL6H.js → init-update-LFKSC6Y4.js} +17 -17
  76. package/dist/{install-QPA7DQHO.js → install-47Z7VNWP.js} +6 -6
  77. package/dist/{layout-JGF7MJHG.js → layout-44S4OYLK.js} +4 -4
  78. package/dist/{login-browser-3RIZQJY2.js → login-browser-BJZYKWHF.js} +2 -2
  79. package/dist/{loop-UJL2UCUM.js → loop-YJF27PUS.js} +28 -28
  80. package/dist/{machine-2YPAFFCH.js → machine-VBITNWTR.js} +19 -19
  81. package/dist/{machine-skills-AGERT2HN.js → machine-skills-GOKW3U5N.js} +4 -4
  82. package/dist/{runner-env-HOUXKWIJ.js → runner-env-ILP6BAC2.js} +7 -7
  83. package/dist/{runner-identity-KPUVTRLS.js → runner-identity-MF3AYBR6.js} +3 -3
  84. package/dist/{runner-key-FUJD66R6.js → runner-key-5SGBLTDJ.js} +19 -19
  85. package/dist/{session-sender-7B3ZDWMC.js → session-sender-2DYAJIMM.js} +13 -13
  86. package/dist/{spec-cmd-Q26NE22H.js → spec-cmd-E6SINBX6.js} +11 -11
  87. package/dist/{starter-pack-UBEC5LTE.js → starter-pack-FWTXE6XB.js} +5 -5
  88. package/dist/{status-2KNTILGQ.js → status-AYHBGIAP.js} +24 -24
  89. package/dist/{sync-cmd-SSUYTMLJ.js → sync-cmd-NGX2PGIW.js} +12 -12
  90. package/dist/{watch-L5NCO46E.js → watch-ZIWZVU3Z.js} +12 -12
  91. package/dist/{work-claim-cmd-NJNOQFQE.js → work-claim-cmd-CIVWB7EJ.js} +15 -15
  92. package/dist/{work-cmd-W7WEHMQJ.js → work-cmd-OO6K6ELP.js} +10 -10
  93. package/dist/{work-comment-cmd-SSUOGVDD.js → work-comment-cmd-SY7NY2CR.js} +10 -10
  94. package/dist/work-demo-cmd-Y7EU335L.js +62 -0
  95. package/dist/{work-logs-cmd-WPMWMDX6.js → work-logs-cmd-PWOFLTGD.js} +10 -10
  96. package/dist/{work-open-pr-cmd-NO5YLOXD.js → work-open-pr-cmd-AJUTKYWN.js} +11 -11
  97. package/dist/{work-pr-cmd-37B5KECR.js → work-pr-cmd-DH43AH3V.js} +10 -10
  98. package/dist/work-proofs-cmd-6W6DDAP6.js +111 -0
  99. package/dist/{work-stop-cmd-3BJLXUJ3.js → work-stop-cmd-WZHBEKE4.js} +10 -10
  100. package/package.json +1 -1
  101. package/skill-pack/maintained/outerlayer-amend/SKILL.md +36 -34
  102. package/skill-pack/maintained/outerlayer-amend/scripts/rerecord-demo.mjs +187 -0
  103. package/skill-pack/maintained/outerlayer-build/SKILL.md +7 -2
  104. package/skill-pack/maintained/outerlayer-build/references/agent-briefs.md +16 -4
  105. package/skill-pack/maintained/outerlayer-build/references/evidence.md +11 -1
  106. package/skill-pack/maintained/outerlayer-build/references/release.md +3 -2
  107. package/skill-pack/maintained/outerlayer-evidence/SKILL.md +21 -18
@@ -1,45 +1,45 @@
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-3RIFVLPO.js';
4
- import './chunk-BJQ25STI.js';
5
- import './chunk-HXA5GIHK.js';
3
+ import { gatherDoctorChecks, doctorExitCode, summarizeChecks, renderDoctorText, recordWrapped, recordUnwrapped, recordRemoval, readManifest, recordInstall, recordStatusline } from './chunk-2JLM4GUF.js';
4
+ import './chunk-DKFUXYGD.js';
5
+ import './chunk-EJL6CWSP.js';
6
6
  import './chunk-KT4CN6OU.js';
7
- import './chunk-DY7Y7UT4.js';
8
- import { verifiedTrackerNames, TRACKERS } from './chunk-VT4TTJPG.js';
7
+ import './chunk-KUE4V2SK.js';
8
+ import { verifiedTrackerNames, TRACKERS } from './chunk-YXMGHGHR.js';
9
9
  import './chunk-IP7BIBXJ.js';
10
- import './chunk-B2JURP6A.js';
11
- import './chunk-2WMZPJVE.js';
12
- import './chunk-EWVYQLD3.js';
13
- import './chunk-5DNCFOXA.js';
14
- import { FIRST_VERSION_READING_AGENTS_SKILLS } from './chunk-HJYBWJAS.js';
15
- import './chunk-NSPRS7WK.js';
10
+ import './chunk-HLZMAJJD.js';
11
+ import './chunk-S5CNYXUA.js';
12
+ import './chunk-MPC2UAW2.js';
13
+ import './chunk-NIY2UBT6.js';
14
+ import { FIRST_VERSION_READING_AGENTS_SKILLS } from './chunk-LYGI3T66.js';
15
+ import './chunk-7V5GUEDU.js';
16
16
  import './chunk-G2JWZDFA.js';
17
17
  import { C, warnDeprecated, API_KEY_FLAG_DEPRECATION, NO_COLOR_FLAG, stripNoColor } from './chunk-ANPNT6PM.js';
18
- import './chunk-UIUGTW5C.js';
18
+ import './chunk-FT7MUQGO.js';
19
19
  import './chunk-6RKD7YZ6.js';
20
20
  import './chunk-PJDQPF5N.js';
21
21
  import './chunk-SOI6K5DY.js';
22
22
  import './chunk-PA6CK6WQ.js';
23
23
  import './chunk-BALIE3BA.js';
24
- import { hookFiredMarkerPath, installedCliDistDir } from './chunk-QPWFVE3X.js';
24
+ import { hookFiredMarkerPath, installedCliDistDir } from './chunk-UK4RGH46.js';
25
25
  import './chunk-ZJSNLVCE.js';
26
26
  import './chunk-I7RZHMXW.js';
27
27
  import './chunk-BKO6JEZI.js';
28
28
  import './chunk-HCVLP7XA.js';
29
29
  import { findGitDirs } from './chunk-BJ3KTMDH.js';
30
- import './chunk-GFYEMCPP.js';
31
- import './chunk-G63KT5I5.js';
30
+ import './chunk-JEVKOZBB.js';
31
+ import './chunk-44V5SD4G.js';
32
32
  import './chunk-5BHIBJDA.js';
33
33
  import './chunk-CDDED64E.js';
34
34
  import { resolveVersion, resolvePackageVersion } from './chunk-RA3O54FC.js';
35
35
  import { parseTrackerNumber, trackerNumberError } from './chunk-WZBHBH3J.js';
36
36
  import { cliInvocation, packageRunnerOf } from './chunk-CRB3POP4.js';
37
37
  import { settingsPath, readSettings, SettingsParseError, listHookCandidates, PORTABLE_BIN, wrapHooks, writeSettings, unwrapHooks, REGISTERED_EVENTS, removeHooks, removeStatusline, cliBinResolvable, mergeHooks, repointWrappedHooks, AUTO_WRAP_EVENTS, mergeStatusline } from './chunk-URIZRCRY.js';
38
- import './chunk-AVTI3FL5.js';
38
+ import './chunk-ZF24JN7R.js';
39
39
  import { cloneIsGoverned } from './chunk-YQR6E6OV.js';
40
40
  import { removeJournalHooks, removePreCommitGuardHook } from './chunk-TUSYOL2O.js';
41
- import './chunk-LJG6EMLJ.js';
42
- import './chunk-E6CO3MJE.js';
41
+ import './chunk-6CXNWKWD.js';
42
+ import './chunk-F2D5BSXS.js';
43
43
  import { homeFromEnv } from './chunk-VNVZDWO3.js';
44
44
  import './chunk-HACGUL52.js';
45
45
  import './chunk-MESOOLF4.js';
@@ -3659,14 +3659,14 @@ function apiKeyOption() {
3659
3659
  return new Option("--api-key <key>", `deprecated: use \`${cliInvocation()} login\` or OUTERLAYER_API_KEY`).hideHelp();
3660
3660
  }
3661
3661
  async function installStarterPackInRepo() {
3662
- const { installStarterPack, formatStarterPackOutput } = await import('./starter-pack-UBEC5LTE.js');
3662
+ const { installStarterPack, formatStarterPackOutput } = await import('./starter-pack-FWTXE6XB.js');
3663
3663
  const cwd = process.cwd();
3664
3664
  let repoRoot = cwd;
3665
3665
  try {
3666
3666
  repoRoot = execFileSync("git", ["rev-parse", "--show-toplevel"], { cwd, encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] }).trim() || cwd;
3667
3667
  } catch {
3668
3668
  }
3669
- const { declareAgentsMdLayout, isAgentsMdLayout, skillsBaseFor } = await import('./layout-JGF7MJHG.js');
3669
+ const { declareAgentsMdLayout, isAgentsMdLayout, skillsBaseFor } = await import('./layout-44S4OYLK.js');
3670
3670
  const fresh = !isAgentsMdLayout(repoRoot) && !existsSync(join(repoRoot, ".outerlayer/skills")) && !existsSync(join(repoRoot, ".outerlayer/AGENTS.md"));
3671
3671
  const result = installStarterPack({ repoRoot, base: fresh ? ".agents/skills" : skillsBaseFor(repoRoot) });
3672
3672
  if (fresh) declareAgentsMdLayout(repoRoot);
@@ -3792,7 +3792,7 @@ ${starter.output}`),
3792
3792
  }
3793
3793
  }
3794
3794
  async function installMachineSkillsForSetup() {
3795
- const { setupMachineSkills } = await import('./machine-skills-AGERT2HN.js');
3795
+ const { setupMachineSkills } = await import('./machine-skills-GOKW3U5N.js');
3796
3796
  const result = setupMachineSkills(homeFromEnv());
3797
3797
  for (const failure of result.failures) process.stderr.write(`${C.yellow}!${C.reset} Could not write a maintained skill: ${failure}
3798
3798
  `);
@@ -3800,8 +3800,8 @@ async function installMachineSkillsForSetup() {
3800
3800
  ` : "";
3801
3801
  }
3802
3802
  async function realConnectDepsForCwd() {
3803
- const { realConnectDeps } = await import('./connect-cmd-P5GASVAF.js');
3804
- const { resolveRepoIdentity } = await import('./dist-ACTRIBVW.js');
3803
+ const { realConnectDeps } = await import('./connect-cmd-KWXV2CGC.js');
3804
+ const { resolveRepoIdentity } = await import('./dist-IG2DKUJJ.js');
3805
3805
  return {
3806
3806
  ...realConnectDeps(),
3807
3807
  home: homeFromEnv(),
@@ -3818,7 +3818,7 @@ function buildProgram(argv = process.argv) {
3818
3818
  const program2 = new Command();
3819
3819
  program2.name(cliInvocation()).description("OuterLayer \u2014 see what your coding agents actually do").enablePositionalOptions().version(resolveVersion()).hook("preAction", async (_root, command) => {
3820
3820
  if (command.opts().apiKey !== void 0) warnDeprecated(API_KEY_FLAG_DEPRECATION);
3821
- const { machineRefreshSkipped, refreshMachineSkills } = await import('./machine-skills-AGERT2HN.js');
3821
+ const { machineRefreshSkipped, refreshMachineSkills } = await import('./machine-skills-GOKW3U5N.js');
3822
3822
  const names = [];
3823
3823
  for (let at = command; at?.parent; at = at.parent) names.push(at.name());
3824
3824
  if (!machineRefreshSkipped(names, command._hidden === true, argv)) refreshMachineSkills(homeFromEnv());
@@ -3875,8 +3875,8 @@ build, ../outerlayer-build/SKILL.md becomes ~/.agents/skills/outerlayer-build/SK
3875
3875
  what CLIs older than ${FIRST_VERSION_READING_AGENTS_SKILLS} do. \`` + cliInvocation() + " doctor` reports the same\nstates under Starter files.\n"
3876
3876
  ).action(async (opts) => {
3877
3877
  if (opts.update || opts.dryRun) {
3878
- const { runInitUpdateWithFleet, formatInitUpdate, updateFlagProblem } = await import('./init-update-X7YLZL6H.js');
3879
- const { fleetReadiness } = await import('./fleet-readiness-KGR5AC2J.js');
3878
+ const { runInitUpdateWithFleet, formatInitUpdate, updateFlagProblem } = await import('./init-update-LFKSC6Y4.js');
3879
+ const { fleetReadiness } = await import('./fleet-readiness-GXDSFTLP.js');
3880
3880
  const problem = updateFlagProblem(opts);
3881
3881
  if (problem !== void 0) {
3882
3882
  fail(problem);
@@ -3893,7 +3893,7 @@ what CLIs older than ${FIRST_VERSION_READING_AGENTS_SKILLS} do. \`` + cliInvocat
3893
3893
  }
3894
3894
  let starterTemplate;
3895
3895
  if (opts.template !== void 0) {
3896
- const { assertKnownTemplate, StarterPackError } = await import('./starter-pack-UBEC5LTE.js');
3896
+ const { assertKnownTemplate, StarterPackError } = await import('./starter-pack-FWTXE6XB.js');
3897
3897
  try {
3898
3898
  assertKnownTemplate(opts.template);
3899
3899
  } catch (err) {
@@ -3927,13 +3927,13 @@ what CLIs older than ${FIRST_VERSION_READING_AGENTS_SKILLS} do. \`` + cliInvocat
3927
3927
  if (changed.length > 0 && !opts.json) process.stdout.write(`Removed the claude function from ${changed.join(", ")}.
3928
3928
  `);
3929
3929
  }
3930
- const shell = !opts.remove && opts.shellFunction !== void 0 ? (await import('./init-cmd-YMGW2WXJ.js')).applyShellFunctionFlag(opts.shellFunction, { home: homeFromEnv(), shellPath: process.env.SHELL }) : void 0;
3930
+ const shell = !opts.remove && opts.shellFunction !== void 0 ? (await import('./init-cmd-7CGCDLBZ.js')).applyShellFunctionFlag(opts.shellFunction, { home: homeFromEnv(), shellPath: process.env.SHELL }) : void 0;
3931
3931
  if (opts.json) writeJson(shell === void 0 ? outcome.result : { ...outcome.result, shellFunction: { outcome: shell.outcome, reason: shell.reason } });
3932
3932
  else process.stdout.write(outcome.text + skillsLine + (shell?.text ?? ""));
3933
3933
  return;
3934
3934
  }
3935
3935
  await installMachineSkillsForSetup();
3936
- const { runInitCommand } = await import('./init-cmd-YMGW2WXJ.js');
3936
+ const { runInitCommand } = await import('./init-cmd-7CGCDLBZ.js');
3937
3937
  const code = await runInitCommand(
3938
3938
  { json: opts.json, factory: opts.factory, shellFunction: opts.shellFunction },
3939
3939
  {
@@ -3945,7 +3945,7 @@ what CLIs older than ${FIRST_VERSION_READING_AGENTS_SKILLS} do. \`` + cliInvocat
3945
3945
  return { ok, text, detail };
3946
3946
  },
3947
3947
  runAgentSetup: async () => {
3948
- const { runAgentSetup } = await import('./agent-setup-55ZDEXCS.js');
3948
+ const { runAgentSetup } = await import('./agent-setup-YHEW3WXB.js');
3949
3949
  return runAgentSetup({ cwd: process.cwd(), skillsLink: opts.skillsLink !== false });
3950
3950
  },
3951
3951
  runDoctorChecks: gatherDoctorChecks,
@@ -3954,7 +3954,7 @@ what CLIs older than ${FIRST_VERSION_READING_AGENTS_SKILLS} do. \`` + cliInvocat
3954
3954
  shellPath: process.env.SHELL,
3955
3955
  interactive: Boolean(process.stdin.isTTY && process.stderr.isTTY) && opts.json !== true,
3956
3956
  ask: async () => {
3957
- const { promptOnTerminal } = await import('./connect-cmd-P5GASVAF.js');
3957
+ const { promptOnTerminal } = await import('./connect-cmd-KWXV2CGC.js');
3958
3958
  const answer = await promptOnTerminal({
3959
3959
  message: `Should plain claude start Claude Code through ${cliInvocation()} claude? That is how a session in a governed repository gets its control plane. It adds one block to your zsh or bash startup file.`,
3960
3960
  options: [
@@ -3993,7 +3993,7 @@ linked (true, false, or null when it could not be checked) and, when false,
3993
3993
  linkUrl.
3994
3994
  `
3995
3995
  ).action(async (opts) => {
3996
- const { runConnectCommand } = await import('./connect-cmd-P5GASVAF.js');
3996
+ const { runConnectCommand } = await import('./connect-cmd-KWXV2CGC.js');
3997
3997
  const code = await runConnectCommand({ factory: opts.factory, json: opts.json }, await realConnectDepsForCwd(), {
3998
3998
  stdout: process.stdout,
3999
3999
  stderr: process.stderr
@@ -4032,7 +4032,7 @@ Every later command reads the saved file, so none of them needs a key on
4032
4032
  its command line. A saved key is checked for real on the first \`sync\`.
4033
4033
  `
4034
4034
  ).action(async (opts) => {
4035
- const { runLoginCommand, realLoginDeps } = await import('./login-browser-3RIZQJY2.js');
4035
+ const { runLoginCommand, realLoginDeps } = await import('./login-browser-BJZYKWHF.js');
4036
4036
  const code = await runLoginCommand(
4037
4037
  {
4038
4038
  browser: opts.browser !== false,
@@ -4065,13 +4065,13 @@ code is 1: revoke the token on /profile/security.
4065
4065
  "\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"
4066
4066
  ).action(async (opts) => {
4067
4067
  if (opts.link !== void 0) {
4068
- const { lookupArtifactLink } = await import('./artifact-link-cmd-6FF2Y6QI.js');
4068
+ const { lookupArtifactLink } = await import('./artifact-link-cmd-7FYKWA7J.js');
4069
4069
  const found = lookupArtifactLink(opts.link);
4070
4070
  if (found.ok) process.stdout.write(found.url + "\n");
4071
4071
  else fail(found.reason);
4072
4072
  return;
4073
4073
  }
4074
- const { runSync, SyncConfigError, SyncTransportError } = await import('./sync-cmd-SSUYTMLJ.js');
4074
+ const { runSync, SyncConfigError, SyncTransportError } = await import('./sync-cmd-NGX2PGIW.js');
4075
4075
  try {
4076
4076
  const result = await runSync({
4077
4077
  url: opts.url,
@@ -4102,7 +4102,7 @@ code is 1: revoke the token on /profile/security.
4102
4102
  if (invokedCommandToken(argv) === "watch") {
4103
4103
  warnDeprecated(`\`${cliInvocation()} watch\` is now \`${cliInvocation()} daemon\`; the old name will be removed in a future release.`);
4104
4104
  }
4105
- const { runWatch } = await import('./watch-L5NCO46E.js');
4105
+ const { runWatch } = await import('./watch-ZIWZVU3Z.js');
4106
4106
  await runWatch({ once: opts.once });
4107
4107
  });
4108
4108
  program2.command("hook <event>", { hidden: true }).description("capture-hook fast path, installed by `init`").action(() => {
@@ -4192,7 +4192,7 @@ code is 1: revoke the token on /profile/security.
4192
4192
  process.exitCode = await runBuildCommand({ dir: opts.dir, argv: command });
4193
4193
  });
4194
4194
  program2.command("session-sender", { hidden: true }).description("stream a runner build's sessions to its work item while the build runs").action(async () => {
4195
- const { runSessionSender } = await import('./session-sender-7B3ZDWMC.js');
4195
+ const { runSessionSender } = await import('./session-sender-2DYAJIMM.js');
4196
4196
  try {
4197
4197
  await runSessionSender();
4198
4198
  } catch (err) {
@@ -4235,7 +4235,7 @@ async function runCli(processArgv) {
4235
4235
  await buildProgram(argv).parseAsync(argv);
4236
4236
  }
4237
4237
  async function compileContext(opts) {
4238
- const { runEmit, EmitError } = await import('./emit-cmd-OX6LYS6I.js');
4238
+ const { runEmit, EmitError } = await import('./emit-cmd-3FG7FEGO.js');
4239
4239
  try {
4240
4240
  const result = runEmit({ cwd: opts.dir, check: opts.check, json: opts.json });
4241
4241
  if (result.exitCode !== 0) process.exitCode = result.exitCode;
@@ -4288,7 +4288,7 @@ Compiling .outerlayer/ moved to \`${cliInvocation()} context emit\`.
4288
4288
  await compileContext({ dir: opts.dir, check: opts.check, json: opts.json });
4289
4289
  return;
4290
4290
  }
4291
- const { runEmitResult, EmitResultError } = await import('./emit-result-cmd-CJNVDV5V.js');
4291
+ const { runEmitResult, EmitResultError } = await import('./emit-result-cmd-QHJDUC7J.js');
4292
4292
  try {
4293
4293
  const result = await runEmitResult({
4294
4294
  name,
@@ -4339,7 +4339,7 @@ everywhere, bytes and deep link untouched; a still-queued one is cancelled
4339
4339
  locally so it never uploads. One correction can retire several duplicates.
4340
4340
  `
4341
4341
  ).action(async (file, opts) => {
4342
- const { runEmitArtifact, EmitArtifactError } = await import('./emit-artifact-cmd-FDPJKGOO.js');
4342
+ const { runEmitArtifact, EmitArtifactError } = await import('./emit-artifact-cmd-6QTTWBVN.js');
4343
4343
  let pr;
4344
4344
  if (opts.pr !== void 0) {
4345
4345
  pr = parseTrackerNumber(opts.pr);
@@ -4369,10 +4369,11 @@ locally so it never uploads. One correction can retire several duplicates.
4369
4369
  throw err;
4370
4370
  }
4371
4371
  });
4372
- emitCmd.command("demo <manifest>").description("Emit a narrated demo: one video artifact for each chapter of a recorded manifest").option("--no-narration", "store the clips with no speech; needs neither espeak-ng nor the voice pack").option("--item <number>", "work item whose recorded criteria the chapters are checked against").option("--pr <number>", "pull request number to anchor to, outside a recorded session").option("--compare <manifest>", "manifest of a second run of the same demo, to compare their stills").option("--json", "machine-readable JSON output").option("--url <url>", "cloud base URL (or OUTERLAYER_URL / config)").addOption(apiKeyOption()).option("--app-id <id>", "factory id the key is bound to (or OUTERLAYER_APP_ID / config)").addHelpText(
4372
+ emitCmd.command("demo <manifest>").description("Emit a narrated demo: one video artifact for each chapter of a recorded manifest").option("--no-narration", "store the clips with no speech; needs neither espeak-ng nor the voice pack").option("--item <number>", "work item whose recorded criteria the chapters are checked against").option("--pr <number>", "pull request number to anchor to, outside a recorded session").option("--compare <manifest>", "manifest of a second run of the same demo, to compare their stills").option("--replaces <artifact-id>", "item's newest demo record id, to retire; outside a recorded session needs --item").option("--json", "machine-readable JSON output").option("--url <url>", "cloud base URL (or OUTERLAYER_URL / config)").addOption(apiKeyOption()).option("--app-id <id>", "factory id the key is bound to (or OUTERLAYER_APP_ID / config)").addHelpText(
4373
4373
  "after",
4374
4374
  `
4375
4375
  ${cliInvocation()} emit demo test-results/demo/manifest.json --item 412
4376
+ ${cliInvocation()} emit demo test-results/demo/manifest.json --item 412 --replaces <record id from work demo>
4376
4377
  ${cliInvocation()} emit demo run-1/demo/manifest.json --compare run-2/demo/manifest.json --item 412
4377
4378
 
4378
4379
  The manifest is the JSON file \`@outerlayer/playwright\` writes next to its video. Each chapter
@@ -4383,12 +4384,18 @@ Needs ffmpeg and ffprobe on PATH, and espeak-ng unless --no-narration is given.
4383
4384
  run downloads the voice pack (about 400 MB) to ~/.outerlayer/voice/ and checks it against pinned
4384
4385
  sha256 hashes. Every refusal comes before the first upload. Exit 1 means a chapter had a failed
4385
4386
  check: its clip and the record are stored all the same.
4387
+ A chapter of a version 4 manifest may hold a screenshot frame, which its test marked with demo.screenshot().
4388
+ The frame is stored as a screenshot of the chapter's criterion only when that criterion declares screenshot
4389
+ and every check of the chapter passed. Otherwise no frame is stored and the command says why.
4386
4390
  With --compare, the command pairs the chapters of the two runs, then compares the stills taken after each
4387
4391
  check. A chapter reads yes when every still matches and no when one differs; the output names the step and
4388
4392
  the region. One run, or a chapter with no stills, reads not checked. Comparing never changes which clips bind.
4393
+ With --replaces <record id>, the new video retires the old video, each new chapter retires the old chapters of
4394
+ its criterion, and the new record retires the old record. The id must be the item's newest demo record,
4395
+ as \`work demo --item <n> --json\` prints it.
4389
4396
  `
4390
4397
  ).action(async (manifest, opts) => {
4391
- const { runEmitDemo, EmitDemoError } = await import('./emit-demo-cmd-6DF2QIAS.js');
4398
+ const { runEmitDemo, EmitDemoError } = await import('./emit-demo-cmd-IQRS7BP2.js');
4392
4399
  let item;
4393
4400
  if (opts.item !== void 0) {
4394
4401
  item = parseTrackerNumber(opts.item);
@@ -4412,6 +4419,7 @@ the region. One run, or a chapter with no stills, reads not checked. Comparing n
4412
4419
  item,
4413
4420
  pr,
4414
4421
  compare: opts.compare,
4422
+ replaces: opts.replaces,
4415
4423
  json: opts.json,
4416
4424
  url: opts.url,
4417
4425
  apiKey: opts.apiKey,
@@ -4457,7 +4465,7 @@ recent events with their ids. --find <text> searches all of them.
4457
4465
  item that session was launched for is used automatically.
4458
4466
  `
4459
4467
  ).action(async (opts) => {
4460
- const { runEmitFinding, refuseRemovedFindingFlags, EmitFindingError } = await import('./emit-finding-cmd-TLJWBGQE.js');
4468
+ const { runEmitFinding, refuseRemovedFindingFlags, EmitFindingError } = await import('./emit-finding-cmd-TXDPJFVT.js');
4461
4469
  try {
4462
4470
  refuseRemovedFindingFlags(opts);
4463
4471
  const result = await runEmitFinding({
@@ -4524,7 +4532,7 @@ the whole batch. "untimed": true records one with no time on purpose.
4524
4532
  that session was launched for is used automatically.
4525
4533
  `
4526
4534
  ).action(async (file, opts) => {
4527
- const { runEmitFindings, EmitFindingError } = await import('./emit-finding-cmd-TLJWBGQE.js');
4535
+ const { runEmitFindings, EmitFindingError } = await import('./emit-finding-cmd-TXDPJFVT.js');
4528
4536
  try {
4529
4537
  const result = await runEmitFindings({
4530
4538
  file,
@@ -4559,7 +4567,7 @@ command, the command exits 0, and \`sync\` sends it later. If the gateway refuse
4559
4567
  the step, the command prints why and exits 1.
4560
4568
  `
4561
4569
  ).action(async (name, opts) => {
4562
- const { runEmitStep, EmitStepError } = await import('./emit-step-cmd-347CZO7Y.js');
4570
+ const { runEmitStep, EmitStepError } = await import('./emit-step-cmd-TQCOLXAA.js');
4563
4571
  try {
4564
4572
  await runEmitStep({
4565
4573
  name,
@@ -4602,7 +4610,7 @@ of the item, and a (proof: <kind>) annotation names its proof.
4602
4610
  ${cliInvocation()} emit criteria acceptance/412-login.md --item 412
4603
4611
  `
4604
4612
  ).action(async (file, opts) => {
4605
- const { runEmitCriteria, EmitCriteriaError } = await import('./emit-criteria-cmd-3SVGCMJN.js');
4613
+ const { runEmitCriteria, EmitCriteriaError } = await import('./emit-criteria-cmd-22VVCL2W.js');
4606
4614
  try {
4607
4615
  const result = await runEmitCriteria({
4608
4616
  file,
@@ -4626,9 +4634,9 @@ function registerSpecCommands(program2) {
4626
4634
  const specCmd = program2.command("spec").description("Find, file and edit the issue a spec lives in, in your factory's tracker");
4627
4635
  const credentialOptions = (command) => command.option("--json", "machine-readable JSON output").option("--url <url>", "cloud base URL (or OUTERLAYER_URL / config)").addOption(apiKeyOption()).option("--app-id <id>", "factory id the key is bound to (or OUTERLAYER_APP_ID / config)");
4628
4636
  const run = async (action) => {
4629
- const { WorkCommandError } = await import('./work-cmd-W7WEHMQJ.js');
4637
+ const { WorkCommandError } = await import('./work-cmd-OO6K6ELP.js');
4630
4638
  try {
4631
- await action(await import('./spec-cmd-Q26NE22H.js'));
4639
+ await action(await import('./spec-cmd-E6SINBX6.js'));
4632
4640
  } catch (err) {
4633
4641
  if (err instanceof WorkCommandError) {
4634
4642
  fail(err.message);
@@ -4663,7 +4671,7 @@ Prints each problem the item covers with its id, its reports and its result.
4663
4671
  session was launched for is used.
4664
4672
  `
4665
4673
  ).action(async (opts) => {
4666
- const { runFindingsShow, FindingsCommandError } = await import('./findings-cmd-LHTYEHYB.js');
4674
+ const { runFindingsShow, FindingsCommandError } = await import('./findings-cmd-EURKADAY.js');
4667
4675
  try {
4668
4676
  const result = await runFindingsShow({
4669
4677
  item: opts.item,
@@ -4691,7 +4699,7 @@ Give exactly one of --fixed and --not-fixed, and a --note. Run it again for the
4691
4699
  problem to replace the earlier result. A problem the item does not cover is refused.
4692
4700
  `
4693
4701
  ).action(async (problem, opts) => {
4694
- const { runFindingsResult, FindingsCommandError } = await import('./findings-cmd-LHTYEHYB.js');
4702
+ const { runFindingsResult, FindingsCommandError } = await import('./findings-cmd-EURKADAY.js');
4695
4703
  try {
4696
4704
  const result = await runFindingsResult({
4697
4705
  problem,
@@ -4732,7 +4740,7 @@ takes it, and prints the line that starts your session on it. That
4732
4740
  session links itself and holds the item's lease while it works.
4733
4741
  `
4734
4742
  ).action(async (opts) => {
4735
- const { runWorkBuild, WorkCommandError } = await import('./work-cmd-W7WEHMQJ.js');
4743
+ const { runWorkBuild, WorkCommandError } = await import('./work-cmd-OO6K6ELP.js');
4736
4744
  try {
4737
4745
  await runWorkBuild(opts);
4738
4746
  } catch (err) {
@@ -4755,7 +4763,7 @@ renews that session's own 20-minute lease, unless --no-lease or
4755
4763
  --ended is given, or another worker already holds a live one.
4756
4764
  `
4757
4765
  ).action(async (number, opts) => {
4758
- const { runWorkLinkSession, WorkCommandError } = await import('./work-cmd-W7WEHMQJ.js');
4766
+ const { runWorkLinkSession, WorkCommandError } = await import('./work-cmd-OO6K6ELP.js');
4759
4767
  try {
4760
4768
  await runWorkLinkSession({ ...opts, number, noLease: opts.lease === false, logFailures: opts.logFailures === true });
4761
4769
  } catch (err) {
@@ -4779,8 +4787,8 @@ criterion's new proof; --ready hands the thread back to a person. At
4779
4787
  most one action flag may be given.
4780
4788
  `
4781
4789
  ).action(async (opts) => {
4782
- const { runWorkComment, WorkCommentCommandError } = await import('./work-comment-cmd-SSUOGVDD.js');
4783
- const { WorkCommandError } = await import('./work-cmd-W7WEHMQJ.js');
4790
+ const { runWorkComment, WorkCommentCommandError } = await import('./work-comment-cmd-SY7NY2CR.js');
4791
+ const { WorkCommandError } = await import('./work-cmd-OO6K6ELP.js');
4784
4792
  try {
4785
4793
  await runWorkComment(opts);
4786
4794
  } catch (err) {
@@ -4801,8 +4809,8 @@ criterion that carries proof or a comment, each with who is waiting
4801
4809
  on whom next.
4802
4810
  `
4803
4811
  ).action(async (opts) => {
4804
- const { runWorkThreads, WorkCommentCommandError } = await import('./work-comment-cmd-SSUOGVDD.js');
4805
- const { WorkCommandError } = await import('./work-cmd-W7WEHMQJ.js');
4812
+ const { runWorkThreads, WorkCommentCommandError } = await import('./work-comment-cmd-SY7NY2CR.js');
4813
+ const { WorkCommandError } = await import('./work-cmd-OO6K6ELP.js');
4806
4814
  try {
4807
4815
  await runWorkThreads(opts);
4808
4816
  } catch (err) {
@@ -4826,8 +4834,8 @@ still running, or that an older runner released, has no log and the
4826
4834
  command exits 1.
4827
4835
  `
4828
4836
  ).action(async (opts) => {
4829
- const { runWorkLogs, WorkLogsCommandError } = await import('./work-logs-cmd-WPMWMDX6.js');
4830
- const { WorkCommandError } = await import('./work-cmd-W7WEHMQJ.js');
4837
+ const { runWorkLogs, WorkLogsCommandError } = await import('./work-logs-cmd-PWOFLTGD.js');
4838
+ const { WorkCommandError } = await import('./work-cmd-OO6K6ELP.js');
4831
4839
  try {
4832
4840
  await runWorkLogs(opts);
4833
4841
  } catch (err) {
@@ -4850,8 +4858,8 @@ item is not built again until a new build request. Exits 1 when no host
4850
4858
  build is running for the item.
4851
4859
  `
4852
4860
  ).action(async (opts) => {
4853
- const { runWorkStop, WorkStopCommandError } = await import('./work-stop-cmd-3BJLXUJ3.js');
4854
- const { WorkCommandError } = await import('./work-cmd-W7WEHMQJ.js');
4861
+ const { runWorkStop, WorkStopCommandError } = await import('./work-stop-cmd-WZHBEKE4.js');
4862
+ const { WorkCommandError } = await import('./work-cmd-OO6K6ELP.js');
4855
4863
  try {
4856
4864
  await runWorkStop(opts);
4857
4865
  } catch (err) {
@@ -4862,6 +4870,28 @@ build is running for the item.
4862
4870
  throw err;
4863
4871
  }
4864
4872
  });
4873
+ workCmd.command("demo").description("Show a work item's newest demo record").requiredOption("--item <number>", "the item's number inside this factory").option("--json", "machine-readable JSON output").option("--url <url>", "cloud base URL (or OUTERLAYER_URL / config)").addOption(apiKeyOption()).option("--app-id <id>", "factory id the key is bound to (or OUTERLAYER_APP_ID / config)").addHelpText(
4874
+ "after",
4875
+ `
4876
+ ${cliInvocation()} work demo --item 7
4877
+ ${cliInvocation()} work demo --item 7 --json
4878
+
4879
+ Prints the item's newest live demo record: its artifact id, the commit it was recorded at, and the
4880
+ test file that recorded it. With --json, prints { "demo": null } for an item with no demo.
4881
+ `
4882
+ ).action(async (opts) => {
4883
+ const { runWorkDemo, WorkDemoCommandError } = await import('./work-demo-cmd-Y7EU335L.js');
4884
+ const { WorkCommandError } = await import('./work-cmd-OO6K6ELP.js');
4885
+ try {
4886
+ await runWorkDemo(opts);
4887
+ } catch (err) {
4888
+ if (err instanceof WorkDemoCommandError || err instanceof WorkCommandError) {
4889
+ fail(err.message);
4890
+ return;
4891
+ }
4892
+ throw err;
4893
+ }
4894
+ });
4865
4895
  workCmd.command("remove").description("Withdraw a source's addition \u2014 never deletes the item").option("--item <number>", "the item's number inside this factory").option("--issue <number>", "issue number or Linear/Jira key (default: named by --item instead)").option(TRACKER_OPTION_FLAG, "tracker for a keyed --issue, when both hold the key").option("--repo <owner/name>", "repository for an issue number (default: the checkout's remote)").requiredOption("--reason <text>", "why this source is no longer working on it").option("--json", "machine-readable JSON output").option("--url <url>", "cloud base URL (or OUTERLAYER_URL / config)").addOption(apiKeyOption()).option("--app-id <id>", "factory id the key is bound to (or OUTERLAYER_APP_ID / config)").addHelpText(
4866
4896
  "after",
4867
4897
  `
@@ -4872,7 +4902,7 @@ deletes anything \u2014 the item is removed from Work only once no
4872
4902
  live addition remains on it.
4873
4903
  `
4874
4904
  ).action(async (opts) => {
4875
- const { runWorkRemove, WorkCommandError } = await import('./work-cmd-W7WEHMQJ.js');
4905
+ const { runWorkRemove, WorkCommandError } = await import('./work-cmd-OO6K6ELP.js');
4876
4906
  try {
4877
4907
  await runWorkRemove(opts);
4878
4908
  } catch (err) {
@@ -4884,7 +4914,7 @@ live addition remains on it.
4884
4914
  }
4885
4915
  });
4886
4916
  workCmd.command("status").description("Show one item's stage, gate ledger, and additions").option("--item <number>", "the item's number inside this factory").option("--issue <number>", "issue number, or a Linear/Jira key like ENG-123").option(TRACKER_OPTION_FLAG, "tracker for a keyed --issue, when both hold the key").option("--repo <owner/name>", "repository for an issue number (default: the checkout's remote)").option("--json", "machine-readable JSON output").option("--url <url>", "cloud base URL (or OUTERLAYER_URL / config)").addOption(apiKeyOption()).option("--app-id <id>", "factory id the key is bound to (or OUTERLAYER_APP_ID / config)").action(async (opts) => {
4887
- const { runWorkStatus, WorkCommandError } = await import('./work-cmd-W7WEHMQJ.js');
4917
+ const { runWorkStatus, WorkCommandError } = await import('./work-cmd-OO6K6ELP.js');
4888
4918
  try {
4889
4919
  await runWorkStatus(opts);
4890
4920
  } catch (err) {
@@ -4895,8 +4925,24 @@ live addition remains on it.
4895
4925
  throw err;
4896
4926
  }
4897
4927
  });
4928
+ workCmd.command("proofs").description("List each declared proof as current, out of date or missing").option("--item <number>", "the item's number inside this factory (default: OUTERLAYER_WORK)").option("--json", "machine-readable JSON output").option("--url <url>", "cloud base URL (or OUTERLAYER_URL / config)").addOption(apiKeyOption()).option("--app-id <id>", "factory id the key is bound to (or OUTERLAYER_APP_ID / config)").addHelpText(
4929
+ "after",
4930
+ `
4931
+ ${cliInvocation()} work proofs --item 7
4932
+ ${cliInvocation()} work proofs --json
4933
+
4934
+ A proof is current when it was recorded at this checkout's HEAD, or at the head of a
4935
+ linked pull request that is open or merged. Run \`outerlayer sync\` first, so the
4936
+ gateway has the artifacts you just emitted. Test proofs are not listed.
4937
+ Exits 0 when every listed proof is current, 1 when any is out of date or missing,
4938
+ and 2 when it cannot tell.
4939
+ `
4940
+ ).action(async (opts) => {
4941
+ const { runWorkProofsCommand } = await import('./work-proofs-cmd-6W6DDAP6.js');
4942
+ await runWorkProofsCommand(opts);
4943
+ });
4898
4944
  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) => {
4899
- const { runWorkList, WorkCommandError } = await import('./work-cmd-W7WEHMQJ.js');
4945
+ const { runWorkList, WorkCommandError } = await import('./work-cmd-OO6K6ELP.js');
4900
4946
  try {
4901
4947
  await runWorkList(opts);
4902
4948
  } catch (err) {
@@ -4917,7 +4963,7 @@ by a different key is refused; claiming again with the same key extends
4917
4963
  it. --host is a label only.
4918
4964
  `
4919
4965
  ).action(async (opts) => {
4920
- const { runWorkClaim, WorkCommandError } = await import('./work-claim-cmd-NJNOQFQE.js');
4966
+ const { runWorkClaim, WorkCommandError } = await import('./work-claim-cmd-CIVWB7EJ.js');
4921
4967
  try {
4922
4968
  await runWorkClaim(opts);
4923
4969
  } catch (err) {
@@ -4937,7 +4983,7 @@ Extends the live lease this API key holds. Refused with a 410 if the
4937
4983
  lease has expired, or a 403 if a different key holds it.
4938
4984
  `
4939
4985
  ).action(async (opts) => {
4940
- const { runWorkRenew, WorkCommandError } = await import('./work-claim-cmd-NJNOQFQE.js');
4986
+ const { runWorkRenew, WorkCommandError } = await import('./work-claim-cmd-CIVWB7EJ.js');
4941
4987
  try {
4942
4988
  await runWorkRenew(opts);
4943
4989
  } catch (err) {
@@ -4969,7 +5015,7 @@ applies to a host's lease only. A later tool call in the session
4969
5015
  takes the lease again.
4970
5016
  `
4971
5017
  ).action(async (opts) => {
4972
- const { runWorkRelease, WorkCommandError } = await import('./work-claim-cmd-NJNOQFQE.js');
5018
+ const { runWorkRelease, WorkCommandError } = await import('./work-claim-cmd-CIVWB7EJ.js');
4973
5019
  try {
4974
5020
  await runWorkRelease(opts);
4975
5021
  } catch (err) {
@@ -4996,7 +5042,7 @@ Idempotent: declaring the same pull request twice is a no-op.
4996
5042
  needs your own login; an agent session or a factory key is refused.
4997
5043
  `
4998
5044
  ).action(async (number, opts) => {
4999
- const { runWorkPr, WorkPrCommandError } = await import('./work-pr-cmd-37B5KECR.js');
5045
+ const { runWorkPr, WorkPrCommandError } = await import('./work-pr-cmd-DH43AH3V.js');
5000
5046
  try {
5001
5047
  await runWorkPr({ ...opts, number });
5002
5048
  } catch (err) {
@@ -5021,8 +5067,8 @@ login, then declares the pull request on the item, as \`work pr\` does.
5021
5067
  Run it again after a change to the title or description.
5022
5068
  `
5023
5069
  ).action(async (opts) => {
5024
- const { runWorkOpenPr, WorkOpenPrCommandError } = await import('./work-open-pr-cmd-NO5YLOXD.js');
5025
- const { WorkCommandError } = await import('./work-cmd-W7WEHMQJ.js');
5070
+ const { runWorkOpenPr, WorkOpenPrCommandError } = await import('./work-open-pr-cmd-AJUTKYWN.js');
5071
+ const { WorkCommandError } = await import('./work-cmd-OO6K6ELP.js');
5026
5072
  try {
5027
5073
  await runWorkOpenPr(opts);
5028
5074
  } catch (err) {
@@ -5038,8 +5084,8 @@ function registerRunnerCommands(program2) {
5038
5084
  const runnerCmd = program2.command("runner").description("Take work from the implement and amend queues on this machine");
5039
5085
  const configOption = "the cloud config file to run against (default: ~/.outerlayer/config.json)";
5040
5086
  runnerCmd.command("start").description("Run the loop: claim work, run it, report, clean up, repeat").option("--config <path>", configOption).action(async (opts) => {
5041
- const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-QXMUWJAQ.js');
5042
- const { start, RunnerStartError } = await import('./loop-UJL2UCUM.js');
5087
+ const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-MVA7YTFW.js');
5088
+ const { start, RunnerStartError } = await import('./loop-YJF27PUS.js');
5043
5089
  const { RunnerAlreadyRunningError } = await import('./pidfile-5UDLYPMC.js');
5044
5090
  const configPath = opts.config ?? defaultRunnerConfigPath();
5045
5091
  try {
@@ -5057,9 +5103,9 @@ function registerRunnerCommands(program2) {
5057
5103
  "after",
5058
5104
  "\nReads OUTERLAYER_URL, OUTERLAYER_APP_ID, OUTERLAYER_API_KEY, OUTERLAYER_RUNNER_NAME and one Claude credential\n(CLAUDE_CODE_OAUTH_TOKEN or ANTHROPIC_API_KEY) from the environment. OUTERLAYER_AGENT\nis optional and defaults to claude. On a later start it refuses variables that disagree with the config in the volume.\nThe image sets OUTERLAYER_RUNNER_IMAGE; outside the image, use `runner start`.\n"
5059
5105
  ).action(async () => {
5060
- const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-QXMUWJAQ.js');
5061
- const { containerStart } = await import('./container-start-CVP3NTDG.js');
5062
- const { start, RunnerStartError } = await import('./loop-UJL2UCUM.js');
5106
+ const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-MVA7YTFW.js');
5107
+ const { containerStart } = await import('./container-start-AQJ64LCF.js');
5108
+ const { start, RunnerStartError } = await import('./loop-YJF27PUS.js');
5063
5109
  const { RunnerAlreadyRunningError } = await import('./pidfile-5UDLYPMC.js');
5064
5110
  try {
5065
5111
  const result = await containerStart({
@@ -5078,8 +5124,8 @@ function registerRunnerCommands(program2) {
5078
5124
  }
5079
5125
  });
5080
5126
  runnerCmd.command("check").description("Validate the config, the hooks and the key, and print the effective settings").option("--config <path>", configOption).action(async (opts) => {
5081
- const { defaultRunnerConfigPath } = await import('./config-QXMUWJAQ.js');
5082
- const { runRunnerCheck } = await import('./check-MRYFTLOO.js');
5127
+ const { defaultRunnerConfigPath } = await import('./config-MVA7YTFW.js');
5128
+ const { runRunnerCheck } = await import('./check-4QNLMDP7.js');
5083
5129
  const configPath = opts.config ?? defaultRunnerConfigPath();
5084
5130
  const result = await runRunnerCheck(configPath);
5085
5131
  if (!result.ok) {
@@ -5100,7 +5146,7 @@ function registerRunnerCommands(program2) {
5100
5146
  `);
5101
5147
  });
5102
5148
  runnerCmd.command("install").description("Put this CLI in the runner's install layout; --service adds its service").option("--config <path>", configOption).option("--service", "set up the service that keeps the runner running").option("--print", "with --service, print the unit and set up nothing").option("--user <account>", "with --service, the account the service runs as").option("--replace", "replace a unit or launcher file this command did not write").option("--allow-downgrade", "install this CLI even when it is older than the version the runner runs").option("--unit-name <name>", "with --service, the unit's name, to run a second runner beside the first").action(async (opts) => {
5103
- const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-QXMUWJAQ.js');
5149
+ const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-MVA7YTFW.js');
5104
5150
  const { runRunnerInstall, RunnerInstallError, launcherSummary, restartNote } = await import('./install-cmd-FV7IZ7XF.js');
5105
5151
  const configPath = opts.config ?? defaultRunnerConfigPath();
5106
5152
  if (opts.service !== true) {
@@ -5113,7 +5159,7 @@ function registerRunnerCommands(program2) {
5113
5159
  }
5114
5160
  try {
5115
5161
  if (opts.service === true) {
5116
- const { installServiceCommand } = await import('./command-7FAIIQGF.js');
5162
+ const { installServiceCommand } = await import('./command-SQ4466SL.js');
5117
5163
  const result2 = await installServiceCommand({
5118
5164
  configPath,
5119
5165
  print: opts.print,
@@ -5168,8 +5214,8 @@ To keep it running, run ${C.yellow}${cliInvocation()} runner install --service${
5168
5214
  fail(`pass --service: \`${cliInvocation()} runner uninstall --service\` removes the runner's service.`);
5169
5215
  return;
5170
5216
  }
5171
- const { defaultRunnerConfigPath } = await import('./config-QXMUWJAQ.js');
5172
- const { uninstallServiceCommand } = await import('./command-7FAIIQGF.js');
5217
+ const { defaultRunnerConfigPath } = await import('./config-MVA7YTFW.js');
5218
+ const { uninstallServiceCommand } = await import('./command-SQ4466SL.js');
5173
5219
  const result = await uninstallServiceCommand({ configPath: opts.config ?? defaultRunnerConfigPath(), unitName: opts.unitName, home: homeFromEnv() });
5174
5220
  if (result.ok) for (const line of result.lines) process.stdout.write(`${C.green}\u2713${C.reset} ${line}
5175
5221
  `);
@@ -5196,12 +5242,12 @@ already in claude.env is used.
5196
5242
  printf '%s' "$CLAUDE_CODE_OAUTH_TOKEN" | ${cliInvocation()} runner init --agent claude --factory <org>/<factory>
5197
5243
  `
5198
5244
  ).action(async (opts) => {
5199
- const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-QXMUWJAQ.js');
5200
- const { prepareRunnerInit, runRunnerInit, RunnerInitError, writeRunnerInit } = await import('./init-XDOKWBL2.js');
5201
- const { obtainRunnerKey, runnerKeyLogin } = await import('./runner-key-FUJD66R6.js');
5202
- const { detectMachine } = await import('./machine-2YPAFFCH.js');
5203
- const { chooseVm, runVmInit, VmInitError } = await import('./init-ZQ5B3TJZ.js');
5204
- const { AGENT_COMMANDS, credentialFromStdin, isAgentName, restartForCredential, RunnerEnvError } = await import('./runner-env-HOUXKWIJ.js');
5245
+ const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-MVA7YTFW.js');
5246
+ const { prepareRunnerInit, runRunnerInit, RunnerInitError, writeRunnerInit } = await import('./init-T64C4MID.js');
5247
+ const { obtainRunnerKey, runnerKeyLogin } = await import('./runner-key-5SGBLTDJ.js');
5248
+ const { detectMachine } = await import('./machine-VBITNWTR.js');
5249
+ const { chooseVm, runVmInit, VmInitError } = await import('./init-63X6ECKF.js');
5250
+ const { AGENT_COMMANDS, credentialFromStdin, isAgentName, restartForCredential, RunnerEnvError } = await import('./runner-env-ILP6BAC2.js');
5205
5251
  const configPath = opts.config ?? defaultRunnerConfigPath();
5206
5252
  if (opts.agent !== void 0 && !isAgentName(opts.agent)) {
5207
5253
  fail(`--agent ${opts.agent}: runner init writes commands for ${Object.keys(AGENT_COMMANDS).join(", ")}. For another agent, leave --agent out and edit runner.commands.`);
@@ -5215,7 +5261,7 @@ already in claude.env is used.
5215
5261
  try {
5216
5262
  let credential;
5217
5263
  if (agent !== void 0) {
5218
- const { readPipedKey } = await import('./login-browser-3RIZQJY2.js');
5264
+ const { readPipedKey } = await import('./login-browser-BJZYKWHF.js');
5219
5265
  credential = credentialFromStdin(
5220
5266
  await readPipedKey(process.stdin, {
5221
5267
  onWaiting: () => process.stderr.write(`runner init is waiting for Claude's credential on stdin; close stdin to use the one already in claude.env
@@ -5351,7 +5397,7 @@ ${C.yellow}The runner will not update itself: ${installErr.message}${C.reset}
5351
5397
  let serviceUp = false;
5352
5398
  let restart;
5353
5399
  if (installedLayout) {
5354
- const { installServiceCommand } = await import('./command-7FAIIQGF.js');
5400
+ const { installServiceCommand } = await import('./command-SQ4466SL.js');
5355
5401
  const service = await installServiceCommand({
5356
5402
  configPath,
5357
5403
  entryPath: process.argv[1] ?? "",
@@ -5395,12 +5441,12 @@ Next:
5395
5441
  "after",
5396
5442
  "\nA repository governed by a control plane builds the control plane's image, at the commit\nthe gateway has stored for it. A repository that governs itself fetches the head of its\ndefault branch into the runner's cache. Either way it reads .devcontainer/devcontainer.json\nand builds the image with the devcontainer CLI. Settings\nthat reach the host or widen the container's privileges are ignored and listed. The\nimage holds this CLI and a pinned Claude Code. Nothing runs inside the image.\n"
5397
5443
  ).action(async (opts) => {
5398
- const { defaultRunnerConfigPath } = await import('./config-QXMUWJAQ.js');
5444
+ const { defaultRunnerConfigPath } = await import('./config-MVA7YTFW.js');
5399
5445
  const { buildRepositoryImage, RecipeError } = await import('./build-SEAQVLD5.js');
5400
5446
  const { currentCliBuild } = await import('./cli-build-K56DK4DS.js');
5401
- const { createDockerHost } = await import('./docker-ANW76BNW.js');
5402
- const { builderSpec } = await import('./builder-Y4P7QARW.js');
5403
- const { loadRunnerConfig } = await import('./config-QXMUWJAQ.js');
5447
+ const { createDockerHost } = await import('./docker-YKYQJHL2.js');
5448
+ const { builderSpec } = await import('./builder-LUPHKUFM.js');
5449
+ const { loadRunnerConfig } = await import('./config-MVA7YTFW.js');
5404
5450
  const configPath = opts.config ?? defaultRunnerConfigPath();
5405
5451
  const loaded = (() => {
5406
5452
  try {
@@ -5411,11 +5457,11 @@ Next:
5411
5457
  })();
5412
5458
  const memory = loaded?.build?.memory ?? "8g";
5413
5459
  try {
5414
- const { ensureRunnerIdentity } = await import('./runner-identity-KPUVTRLS.js');
5460
+ const { ensureRunnerIdentity } = await import('./runner-identity-MF3AYBR6.js');
5415
5461
  await ensureRunnerIdentity(configPath, { log: (line) => console.error(line) }).catch((err) => {
5416
5462
  console.error(`the runner's Docker identity could not be stored: ${err instanceof Error ? err.message : String(err)}`);
5417
5463
  });
5418
- const { imageTargetFor } = await import('./governing-source-JZQZUTMA.js');
5464
+ const { imageTargetFor } = await import('./governing-source-IRRP7G5G.js');
5419
5465
  const target = await imageTargetFor({ config: loaded, repository: opts.repository, fetchImpl: fetch });
5420
5466
  if (!target.ok) {
5421
5467
  if (opts.json) {
@@ -5478,17 +5524,17 @@ Next:
5478
5524
  }
5479
5525
  });
5480
5526
  runnerCmd.command("stop").description("Take no more work; finish running jobs, then exit").option("--config <path>", "the cloud config file naming the runner to stop").option("--now", "end running jobs immediately, with outcome stopped").action(async (opts) => {
5481
- const { defaultRunnerConfigPath } = await import('./config-QXMUWJAQ.js');
5482
- const { requestStop } = await import('./loop-UJL2UCUM.js');
5527
+ const { defaultRunnerConfigPath } = await import('./config-MVA7YTFW.js');
5528
+ const { requestStop } = await import('./loop-YJF27PUS.js');
5483
5529
  const configPath = opts.config ?? defaultRunnerConfigPath();
5484
5530
  const { runnerImageVersion } = await import('./image-tag-ADSLWXBA.js');
5485
5531
  await requestStop(configPath, Boolean(opts.now), void 0, { image: runnerImageVersion() !== void 0 });
5486
5532
  });
5487
5533
  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) => {
5488
- const { defaultRunnerConfigPath, loadRunnerConfig } = await import('./config-QXMUWJAQ.js');
5534
+ const { defaultRunnerConfigPath, loadRunnerConfig } = await import('./config-MVA7YTFW.js');
5489
5535
  const { jobsDir, runnerDir } = await import('./paths-7HVTDE6J.js');
5490
- const { listJobFiles, runnerProcessState } = await import('./loop-UJL2UCUM.js');
5491
- const { renderStatus } = await import('./status-2KNTILGQ.js');
5536
+ const { listJobFiles, runnerProcessState } = await import('./loop-YJF27PUS.js');
5537
+ const { renderStatus } = await import('./status-AYHBGIAP.js');
5492
5538
  const { readHousekeepingRecord } = await import('./record-PPZEXAVA.js');
5493
5539
  const path2 = await import('path');
5494
5540
  const configPath = opts.config ?? defaultRunnerConfigPath();
@@ -5510,7 +5556,7 @@ Next:
5510
5556
  const service = await (async () => {
5511
5557
  if (process.platform !== "linux" || !existsSync("/run/systemd/system")) return void 0;
5512
5558
  const { inspectService, realInspectProbes } = await import('./inspect-DNLXTXLA.js');
5513
- const { DEFAULT_UNIT_NAME } = await import('./install-QPA7DQHO.js');
5559
+ const { DEFAULT_UNIT_NAME } = await import('./install-47Z7VNWP.js');
5514
5560
  const facts = inspectService(DEFAULT_UNIT_NAME, path2.dirname(configPath), realInspectProbes());
5515
5561
  return facts === void 0 ? void 0 : { unit: facts.unit, running: facts.mainPid !== void 0, delegated: facts.delegate };
5516
5562
  })();
@@ -5547,8 +5593,8 @@ Next:
5547
5593
  );
5548
5594
  });
5549
5595
  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) => {
5550
- const { defaultRunnerConfigPath } = await import('./config-QXMUWJAQ.js');
5551
- const { listJobFiles } = await import('./loop-UJL2UCUM.js');
5596
+ const { defaultRunnerConfigPath } = await import('./config-MVA7YTFW.js');
5597
+ const { listJobFiles } = await import('./loop-YJF27PUS.js');
5552
5598
  const { newestAttempt, logPathFor, tail, RunnerLogsError } = await import('./logs-HI46FO6Z.js');
5553
5599
  const configPath = opts.config ?? defaultRunnerConfigPath();
5554
5600
  const item = parseTrackerNumber(itemArg);
@@ -5801,7 +5847,7 @@ would get, the instruction files and the names of the skills. It warns when the
5801
5847
  no \`build\`. It needs the context-read permission: a login or a factory key with it is enough.
5802
5848
  `
5803
5849
  ).action(async (opts) => {
5804
- const { runContextShow, ContextShowError } = await import('./context-show-cmd-3EPJ7CJC.js');
5850
+ const { runContextShow, ContextShowError } = await import('./context-show-cmd-6F4UF4ND.js');
5805
5851
  try {
5806
5852
  const result = await runContextShow({ repo: opts.repo, json: opts.json, url: opts.url, apiKey: opts.apiKey, appId: opts.appId });
5807
5853
  process.stdout.write(result.output);