@outerlayer/cli 0.34.0-next.20261026184303 → 0.34.0-next.20261026214534

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 (113) hide show
  1. package/dist/{agent-setup-WOEZELVB.js → agent-setup-2A6P2SYL.js} +10 -10
  2. package/dist/{artifact-link-cmd-LWPY3V4N.js → artifact-link-cmd-4XQJO55P.js} +2 -2
  3. package/dist/{build-UDOBVX5J.js → build-BBWAD5LR.js} +4 -4
  4. package/dist/{build-disk-C3WIAHCL.js → build-disk-TGLM5XK7.js} +4 -4
  5. package/dist/build-info.json +1 -1
  6. package/dist/{builder-YNXWVH2V.js → builder-FD53GTWL.js} +3 -3
  7. package/dist/{check-G2K76NEM.js → check-FOWN6M3C.js} +34 -34
  8. package/dist/{chunk-GHFI5GBF.js → chunk-25XBOX3K.js} +3 -3
  9. package/dist/{chunk-VEJWLQ4G.js → chunk-2GDKM2O4.js} +12 -12
  10. package/dist/{chunk-IWVGALDC.js → chunk-3HJMY3H5.js} +1 -1
  11. package/dist/{chunk-V2VJYK46.js → chunk-3NCWHEGM.js} +2 -2
  12. package/dist/{chunk-CNZRUVZ5.js → chunk-3PUOHONX.js} +11 -11
  13. package/dist/{chunk-P3CHDKXD.js → chunk-5ZBVKRDK.js} +2 -2
  14. package/dist/{chunk-5JGPTYLT.js → chunk-66LH5QAV.js} +3 -3
  15. package/dist/{chunk-6D7H5DMZ.js → chunk-6CK2OC4Q.js} +2 -2
  16. package/dist/{chunk-7FQYTM7M.js → chunk-72CJOYN6.js} +7 -7
  17. package/dist/{chunk-EPFFYDNX.js → chunk-77VBS2RT.js} +2 -2
  18. package/dist/{chunk-XSFR76J7.js → chunk-7DK2FOZ4.js} +4 -4
  19. package/dist/{chunk-ZIKZZ4LK.js → chunk-BQQPDBSF.js} +2 -2
  20. package/dist/{chunk-NHEU5CON.js → chunk-CCHSD7RS.js} +2 -2
  21. package/dist/{chunk-EOTMDIYC.js → chunk-DINRXUQA.js} +43 -2
  22. package/dist/{chunk-JSZRBQY3.js → chunk-EBVK3QBO.js} +3 -3
  23. package/dist/{chunk-LTN2YFLR.js → chunk-FVF2LMVG.js} +12 -12
  24. package/dist/{chunk-MECW77XP.js → chunk-IXPH4EXK.js} +1 -1
  25. package/dist/{chunk-4P6QGMPN.js → chunk-J7EJMIDR.js} +2 -2
  26. package/dist/{chunk-LTYBHCL4.js → chunk-JA2ARVY6.js} +6 -6
  27. package/dist/{chunk-SZU4YCBH.js → chunk-JKLSQOYO.js} +16 -16
  28. package/dist/{chunk-ELO5XEES.js → chunk-K3ACC2CV.js} +475 -103
  29. package/dist/{chunk-GYVMMU3U.js → chunk-KR2TIRNQ.js} +7 -7
  30. package/dist/{chunk-RCRE42V6.js → chunk-LASKTDCR.js} +1 -1
  31. package/dist/{chunk-JWNH4ZTF.js → chunk-LMYRR5MO.js} +2 -2
  32. package/dist/{chunk-WE4C3ODP.js → chunk-LY62UHRR.js} +1 -1
  33. package/dist/{chunk-NKOM4JKY.js → chunk-LYCJQOO2.js} +2 -2
  34. package/dist/{chunk-4J2FF5HZ.js → chunk-MYLOOVRJ.js} +3 -3
  35. package/dist/{chunk-Y5YCX6AL.js → chunk-NWHU5G6R.js} +1 -1
  36. package/dist/{chunk-EUQZAH2W.js → chunk-O7QPHJWN.js} +4 -4
  37. package/dist/{chunk-IO2BBKG4.js → chunk-OKGHWCSK.js} +2 -2
  38. package/dist/{chunk-Z7WMU3RA.js → chunk-OOD5NDQA.js} +1 -1
  39. package/dist/{chunk-ZQSANKS4.js → chunk-OVNF4LLC.js} +1 -1
  40. package/dist/{chunk-JKNOJKVD.js → chunk-QABXXQ67.js} +5 -5
  41. package/dist/{chunk-VUQKGBIQ.js → chunk-QRJIBTNQ.js} +5 -5
  42. package/dist/{chunk-XL2MPORM.js → chunk-QWXBWOVV.js} +5 -5
  43. package/dist/{chunk-ERTIEYDG.js → chunk-RNMCFAYH.js} +3 -3
  44. package/dist/{chunk-HVPW272H.js → chunk-T2HH7IHT.js} +1 -1
  45. package/dist/{chunk-KPHRRCUY.js → chunk-TWFBOZQ5.js} +4 -4
  46. package/dist/{chunk-XKJOIQ2Q.js → chunk-TZMDRHWB.js} +4 -4
  47. package/dist/{chunk-DQ6YO7FH.js → chunk-UPA5KOOX.js} +1 -1
  48. package/dist/{chunk-LD3BHLK7.js → chunk-WBTPI5MP.js} +3 -3
  49. package/dist/{chunk-OQT7RT5I.js → chunk-WYR4INK3.js} +2 -2
  50. package/dist/{chunk-FGXT5OXS.js → chunk-XFJ7YOPD.js} +1 -1
  51. package/dist/{chunk-H47VGSCW.js → chunk-XHZBLIB2.js} +1 -1
  52. package/dist/{chunk-HVQMIZ22.js → chunk-XYLHSCLR.js} +1 -1
  53. package/dist/{chunk-JC6AQ6PC.js → chunk-ZADRW2V2.js} +4 -4
  54. package/dist/{claude-launcher-6KGANL7E.js → claude-launcher-EO3ALKBS.js} +5 -5
  55. package/dist/{cli-5KY3TE3S.js → cli-3RDQSLYI.js} +115 -110
  56. package/dist/{command-VQPQDPCZ.js → command-C5YKBTK4.js} +20 -20
  57. package/dist/{config-WSZIWPP4.js → config-EBT5VYPX.js} +5 -5
  58. package/dist/{connect-cmd-LI34HS5Q.js → connect-cmd-65YBQRSY.js} +8 -8
  59. package/dist/{container-start-XRR4VC5Z.js → container-start-RLX2PL3C.js} +31 -31
  60. package/dist/{context-cleanup-LUBEZB3L.js → context-cleanup-VJXMM27E.js} +3 -3
  61. package/dist/{context-show-cmd-X27GMOT6.js → context-show-cmd-S5SEBOI2.js} +9 -9
  62. package/dist/{control-plane-launch-74EIIB5Z.js → control-plane-launch-BDSUP4DK.js} +6 -6
  63. package/dist/demo-voice-cmd-DF6C7EST.js +83 -0
  64. package/dist/{dist-HVXLUMRV.js → dist-ADKRGE7I.js} +2 -2
  65. package/dist/{docker-KZ3OQTPW.js → docker-CP656XNO.js} +3 -3
  66. package/dist/{doctor-KPKLFIJH.js → doctor-EQIAHHZD.js} +21 -21
  67. package/dist/{emit-artifact-cmd-BJICHW2E.js → emit-artifact-cmd-56C6DBUP.js} +13 -13
  68. package/dist/{emit-cmd-7TU3JBJ2.js → emit-cmd-C3BUFAUR.js} +6 -6
  69. package/dist/{emit-criteria-cmd-MUWPT25P.js → emit-criteria-cmd-HRCWXD3W.js} +10 -10
  70. package/dist/{emit-demo-cmd-YQN7VKQH.js → emit-demo-cmd-YKTL6XWP.js} +15 -14
  71. package/dist/{emit-finding-cmd-NPBWVY44.js → emit-finding-cmd-6MVFN4BO.js} +10 -10
  72. package/dist/{emit-result-cmd-7CJZZQGK.js → emit-result-cmd-E3YYBXRY.js} +12 -12
  73. package/dist/{emit-step-cmd-ZPLHZAMA.js → emit-step-cmd-DM4CRYYI.js} +10 -10
  74. package/dist/{find-unit-UKH6JH4S.js → find-unit-O6WL6UIW.js} +7 -7
  75. package/dist/{findings-cmd-DZ4ESTHX.js → findings-cmd-K2OYBTUH.js} +10 -10
  76. package/dist/{fleet-readiness-YSI4NOHT.js → fleet-readiness-VIAVQYRP.js} +8 -8
  77. package/dist/{governing-source-JPRMOB3O.js → governing-source-MQA2SDJT.js} +13 -13
  78. package/dist/{hook-fast-6EW2MGA2.js → hook-fast-KXAQ22LZ.js} +1 -1
  79. package/dist/{host-checks-NDXNYOMA.js → host-checks-V25YUP4Q.js} +29 -29
  80. package/dist/index.js +4 -4
  81. package/dist/{init-V6Y2VNKW.js → init-KO3FT2XP.js} +20 -20
  82. package/dist/{init-MN3MNG7V.js → init-YYZ7B4ZD.js} +20 -20
  83. package/dist/{init-cmd-QCWLJDIF.js → init-cmd-D3BDS7KY.js} +18 -18
  84. package/dist/{init-update-GTFLPDEL.js → init-update-JMVLGBDE.js} +17 -17
  85. package/dist/{layout-7B3O3FT3.js → layout-KRWLUGYZ.js} +4 -4
  86. package/dist/{login-browser-DQ6YRXUB.js → login-browser-BAFZYJBR.js} +2 -2
  87. package/dist/{loop-NGFNQF3Y.js → loop-UVONXWXB.js} +33 -33
  88. package/dist/{machine-XG54XYYZ.js → machine-2BI76JZO.js} +20 -20
  89. package/dist/{machine-skills-3FEGR376.js → machine-skills-YVS4ZYCT.js} +4 -4
  90. package/dist/{runner-env-YPXWTNP3.js → runner-env-QN4BLTVZ.js} +7 -7
  91. package/dist/{runner-identity-XPZO3TG4.js → runner-identity-53I4UTVY.js} +3 -3
  92. package/dist/{runner-key-B5EJH25Z.js → runner-key-JKXJWGGY.js} +20 -20
  93. package/dist/{session-sender-XED7CKHP.js → session-sender-KLOMLL7X.js} +13 -13
  94. package/dist/{spec-cmd-TRXAGQYM.js → spec-cmd-MX5QFW32.js} +11 -11
  95. package/dist/{starter-pack-LEL3Q2DB.js → starter-pack-QWDE6FDK.js} +5 -5
  96. package/dist/{status-WQ53MWC3.js → status-YCQHAY45.js} +29 -29
  97. package/dist/{sync-cmd-UQVENF25.js → sync-cmd-CO4DFMHU.js} +12 -12
  98. package/dist/{update-steps-IQVAL64Y.js → update-steps-MC3IUHW7.js} +30 -30
  99. package/dist/{watch-EZGDDRTQ.js → watch-GU62YVQY.js} +12 -12
  100. package/dist/{work-claim-cmd-YSAJ7DAK.js → work-claim-cmd-O54L5DSL.js} +15 -15
  101. package/dist/{work-cmd-V5FHLWJM.js → work-cmd-VR7PPSP6.js} +10 -10
  102. package/dist/{work-comment-cmd-KLEMDYI4.js → work-comment-cmd-HVZF72B4.js} +11 -11
  103. package/dist/{work-demo-cmd-XYRKFP4G.js → work-demo-cmd-EDGNM5VJ.js} +10 -10
  104. package/dist/{work-logs-cmd-DOGPK7Q6.js → work-logs-cmd-ZZVAHX36.js} +10 -10
  105. package/dist/{work-open-pr-cmd-UAUEEP3V.js → work-open-pr-cmd-AQWZRJHZ.js} +11 -11
  106. package/dist/{work-pr-cmd-LYWL7ZLF.js → work-pr-cmd-UJ7VWCJN.js} +10 -10
  107. package/dist/{work-proofs-cmd-YMMDAA6W.js → work-proofs-cmd-LIXV252G.js} +12 -12
  108. package/dist/{work-proofs-record-NUCWR7ZJ.js → work-proofs-record-MCSA56F5.js} +19 -18
  109. package/dist/{work-stop-cmd-MRLJEQRP.js → work-stop-cmd-SAT4XVM2.js} +10 -10
  110. package/package.json +1 -1
  111. package/skill-pack/maintained/outerlayer-build/references/agent-briefs.md +5 -2
  112. package/skill-pack/maintained/outerlayer-evidence/SKILL.md +19 -40
  113. package/skill-pack/maintained/outerlayer-evidence/references/demo.md +75 -0
@@ -1,43 +1,43 @@
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-VEJWLQ4G.js';
4
- import './chunk-XKJOIQ2Q.js';
3
+ import { gatherDoctorChecks, doctorExitCode, summarizeChecks, renderDoctorText, recordWrapped, recordUnwrapped, recordRemoval, readManifest, recordInstall, recordStatusline } from './chunk-2GDKM2O4.js';
4
+ import './chunk-TZMDRHWB.js';
5
5
  import './chunk-KT4CN6OU.js';
6
- import './chunk-4P6QGMPN.js';
7
- import { verifiedTrackerNames, TRACKERS } from './chunk-JKNOJKVD.js';
6
+ import './chunk-J7EJMIDR.js';
7
+ import { verifiedTrackerNames, TRACKERS } from './chunk-QABXXQ67.js';
8
8
  import './chunk-IP7BIBXJ.js';
9
- import './chunk-IO2BBKG4.js';
10
- import './chunk-EUQZAH2W.js';
11
- import './chunk-Y5YCX6AL.js';
9
+ import './chunk-OKGHWCSK.js';
10
+ import './chunk-O7QPHJWN.js';
11
+ import './chunk-NWHU5G6R.js';
12
12
  import './chunk-G2JWZDFA.js';
13
13
  import { C, warnDeprecated, API_KEY_FLAG_DEPRECATION, NO_COLOR_FLAG, stripNoColor } from './chunk-ANPNT6PM.js';
14
- import './chunk-LTYBHCL4.js';
15
- import './chunk-MECW77XP.js';
16
- import { FIRST_VERSION_READING_AGENTS_SKILLS } from './chunk-NKOM4JKY.js';
17
- import './chunk-JWNH4ZTF.js';
14
+ import './chunk-JA2ARVY6.js';
15
+ import './chunk-IXPH4EXK.js';
16
+ import { FIRST_VERSION_READING_AGENTS_SKILLS } from './chunk-LYCJQOO2.js';
17
+ import './chunk-LMYRR5MO.js';
18
18
  import './chunk-7QAJQDHS.js';
19
19
  import './chunk-PJDQPF5N.js';
20
20
  import './chunk-L5VHGRQE.js';
21
- import { hookFiredMarkerPath, installedCliDistDir } from './chunk-NHEU5CON.js';
21
+ import { hookFiredMarkerPath, installedCliDistDir } from './chunk-CCHSD7RS.js';
22
22
  import './chunk-ZJSNLVCE.js';
23
23
  import './chunk-I7RZHMXW.js';
24
24
  import './chunk-BKO6JEZI.js';
25
25
  import './chunk-HCVLP7XA.js';
26
26
  import { findGitDirs } from './chunk-BJ3KTMDH.js';
27
- import './chunk-RCRE42V6.js';
28
- import './chunk-ZQSANKS4.js';
29
- import './chunk-Z7WMU3RA.js';
27
+ import './chunk-LASKTDCR.js';
28
+ import './chunk-OVNF4LLC.js';
29
+ import './chunk-OOD5NDQA.js';
30
30
  import './chunk-5BHIBJDA.js';
31
31
  import './chunk-CDDED64E.js';
32
32
  import { resolveVersion, resolvePackageVersion } from './chunk-RA3O54FC.js';
33
33
  import { parseTrackerNumber, trackerNumberError } from './chunk-WZBHBH3J.js';
34
34
  import { cliInvocation, packageRunnerOf } from './chunk-CRB3POP4.js';
35
35
  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';
36
- import './chunk-DQ6YO7FH.js';
36
+ import './chunk-UPA5KOOX.js';
37
37
  import { cloneIsGoverned } from './chunk-YQR6E6OV.js';
38
38
  import { removeJournalHooks, removePreCommitGuardHook } from './chunk-TUSYOL2O.js';
39
- import './chunk-FGXT5OXS.js';
40
- import './chunk-EOTMDIYC.js';
39
+ import './chunk-XFJ7YOPD.js';
40
+ import './chunk-DINRXUQA.js';
41
41
  import { homeFromEnv } from './chunk-VNVZDWO3.js';
42
42
  import './chunk-GJ4KBHBD.js';
43
43
  import './chunk-SDAEXUIX.js';
@@ -3658,14 +3658,14 @@ function apiKeyOption() {
3658
3658
  return new Option("--api-key <key>", `deprecated: use \`${cliInvocation()} login\` or OUTERLAYER_API_KEY`).hideHelp();
3659
3659
  }
3660
3660
  async function installStarterPackInRepo() {
3661
- const { installStarterPack, formatStarterPackOutput } = await import('./starter-pack-LEL3Q2DB.js');
3661
+ const { installStarterPack, formatStarterPackOutput } = await import('./starter-pack-QWDE6FDK.js');
3662
3662
  const cwd = process.cwd();
3663
3663
  let repoRoot = cwd;
3664
3664
  try {
3665
3665
  repoRoot = execFileSync("git", ["rev-parse", "--show-toplevel"], { cwd, encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] }).trim() || cwd;
3666
3666
  } catch {
3667
3667
  }
3668
- const { declareAgentsMdLayout, isAgentsMdLayout, skillsBaseFor } = await import('./layout-7B3O3FT3.js');
3668
+ const { declareAgentsMdLayout, isAgentsMdLayout, skillsBaseFor } = await import('./layout-KRWLUGYZ.js');
3669
3669
  const fresh = !isAgentsMdLayout(repoRoot) && !existsSync(join(repoRoot, ".outerlayer/skills")) && !existsSync(join(repoRoot, ".outerlayer/AGENTS.md"));
3670
3670
  const result = installStarterPack({ repoRoot, base: fresh ? ".agents/skills" : skillsBaseFor(repoRoot) });
3671
3671
  if (fresh) declareAgentsMdLayout(repoRoot);
@@ -3791,7 +3791,7 @@ ${starter.output}`),
3791
3791
  }
3792
3792
  }
3793
3793
  async function installMachineSkillsForSetup() {
3794
- const { setupMachineSkills } = await import('./machine-skills-3FEGR376.js');
3794
+ const { setupMachineSkills } = await import('./machine-skills-YVS4ZYCT.js');
3795
3795
  const result = setupMachineSkills(homeFromEnv());
3796
3796
  for (const failure of result.failures) process.stderr.write(`${C.yellow}!${C.reset} Could not write a maintained skill: ${failure}
3797
3797
  `);
@@ -3799,8 +3799,8 @@ async function installMachineSkillsForSetup() {
3799
3799
  ` : "";
3800
3800
  }
3801
3801
  async function realConnectDepsForCwd() {
3802
- const { realConnectDeps } = await import('./connect-cmd-LI34HS5Q.js');
3803
- const { resolveRepoIdentity } = await import('./dist-HVXLUMRV.js');
3802
+ const { realConnectDeps } = await import('./connect-cmd-65YBQRSY.js');
3803
+ const { resolveRepoIdentity } = await import('./dist-ADKRGE7I.js');
3804
3804
  return {
3805
3805
  ...realConnectDeps(),
3806
3806
  home: homeFromEnv(),
@@ -3817,7 +3817,7 @@ function buildProgram(argv = process.argv) {
3817
3817
  const program2 = new Command();
3818
3818
  program2.name(cliInvocation()).description("OuterLayer \u2014 see what your coding agents actually do").enablePositionalOptions().version(resolveVersion()).hook("preAction", async (_root, command) => {
3819
3819
  if (command.opts().apiKey !== void 0) warnDeprecated(API_KEY_FLAG_DEPRECATION);
3820
- const { machineRefreshSkipped, refreshMachineSkills } = await import('./machine-skills-3FEGR376.js');
3820
+ const { machineRefreshSkipped, refreshMachineSkills } = await import('./machine-skills-YVS4ZYCT.js');
3821
3821
  const names = [];
3822
3822
  for (let at = command; at?.parent; at = at.parent) names.push(at.name());
3823
3823
  if (!machineRefreshSkipped(names, command._hidden === true, argv)) refreshMachineSkills(homeFromEnv());
@@ -3874,8 +3874,8 @@ build, ../outerlayer-build/SKILL.md becomes ~/.agents/skills/outerlayer-build/SK
3874
3874
  what CLIs older than ${FIRST_VERSION_READING_AGENTS_SKILLS} do. \`` + cliInvocation() + " doctor` reports the same\nstates under Starter files.\n"
3875
3875
  ).action(async (opts) => {
3876
3876
  if (opts.update || opts.dryRun) {
3877
- const { runInitUpdateWithFleet, formatInitUpdate, updateFlagProblem } = await import('./init-update-GTFLPDEL.js');
3878
- const { fleetReadiness } = await import('./fleet-readiness-YSI4NOHT.js');
3877
+ const { runInitUpdateWithFleet, formatInitUpdate, updateFlagProblem } = await import('./init-update-JMVLGBDE.js');
3878
+ const { fleetReadiness } = await import('./fleet-readiness-VIAVQYRP.js');
3879
3879
  const problem = updateFlagProblem(opts);
3880
3880
  if (problem !== void 0) {
3881
3881
  fail(problem);
@@ -3892,7 +3892,7 @@ what CLIs older than ${FIRST_VERSION_READING_AGENTS_SKILLS} do. \`` + cliInvocat
3892
3892
  }
3893
3893
  let starterTemplate;
3894
3894
  if (opts.template !== void 0) {
3895
- const { assertKnownTemplate, StarterPackError } = await import('./starter-pack-LEL3Q2DB.js');
3895
+ const { assertKnownTemplate, StarterPackError } = await import('./starter-pack-QWDE6FDK.js');
3896
3896
  try {
3897
3897
  assertKnownTemplate(opts.template);
3898
3898
  } catch (err) {
@@ -3926,13 +3926,13 @@ what CLIs older than ${FIRST_VERSION_READING_AGENTS_SKILLS} do. \`` + cliInvocat
3926
3926
  if (changed.length > 0 && !opts.json) process.stdout.write(`Removed the claude function from ${changed.join(", ")}.
3927
3927
  `);
3928
3928
  }
3929
- const shell = !opts.remove && opts.shellFunction !== void 0 ? (await import('./init-cmd-QCWLJDIF.js')).applyShellFunctionFlag(opts.shellFunction, { home: homeFromEnv(), shellPath: process.env.SHELL }) : void 0;
3929
+ const shell = !opts.remove && opts.shellFunction !== void 0 ? (await import('./init-cmd-D3BDS7KY.js')).applyShellFunctionFlag(opts.shellFunction, { home: homeFromEnv(), shellPath: process.env.SHELL }) : void 0;
3930
3930
  if (opts.json) writeJson(shell === void 0 ? outcome.result : { ...outcome.result, shellFunction: { outcome: shell.outcome, reason: shell.reason } });
3931
3931
  else process.stdout.write(outcome.text + skillsLine + (shell?.text ?? ""));
3932
3932
  return;
3933
3933
  }
3934
3934
  await installMachineSkillsForSetup();
3935
- const { runInitCommand } = await import('./init-cmd-QCWLJDIF.js');
3935
+ const { runInitCommand } = await import('./init-cmd-D3BDS7KY.js');
3936
3936
  const code = await runInitCommand(
3937
3937
  { json: opts.json, factory: opts.factory, shellFunction: opts.shellFunction },
3938
3938
  {
@@ -3944,7 +3944,7 @@ what CLIs older than ${FIRST_VERSION_READING_AGENTS_SKILLS} do. \`` + cliInvocat
3944
3944
  return { ok, text, detail };
3945
3945
  },
3946
3946
  runAgentSetup: async () => {
3947
- const { runAgentSetup } = await import('./agent-setup-WOEZELVB.js');
3947
+ const { runAgentSetup } = await import('./agent-setup-2A6P2SYL.js');
3948
3948
  return runAgentSetup({ cwd: process.cwd(), skillsLink: opts.skillsLink !== false });
3949
3949
  },
3950
3950
  runDoctorChecks: gatherDoctorChecks,
@@ -3953,7 +3953,7 @@ what CLIs older than ${FIRST_VERSION_READING_AGENTS_SKILLS} do. \`` + cliInvocat
3953
3953
  shellPath: process.env.SHELL,
3954
3954
  interactive: Boolean(process.stdin.isTTY && process.stderr.isTTY) && opts.json !== true,
3955
3955
  ask: async () => {
3956
- const { promptOnTerminal } = await import('./connect-cmd-LI34HS5Q.js');
3956
+ const { promptOnTerminal } = await import('./connect-cmd-65YBQRSY.js');
3957
3957
  const answer = await promptOnTerminal({
3958
3958
  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.`,
3959
3959
  options: [
@@ -3992,7 +3992,7 @@ linked (true, false, or null when it could not be checked) and, when false,
3992
3992
  linkUrl.
3993
3993
  `
3994
3994
  ).action(async (opts) => {
3995
- const { runConnectCommand } = await import('./connect-cmd-LI34HS5Q.js');
3995
+ const { runConnectCommand } = await import('./connect-cmd-65YBQRSY.js');
3996
3996
  const code = await runConnectCommand({ factory: opts.factory, json: opts.json }, await realConnectDepsForCwd(), {
3997
3997
  stdout: process.stdout,
3998
3998
  stderr: process.stderr
@@ -4031,7 +4031,7 @@ Every later command reads the saved file, so none of them needs a key on
4031
4031
  its command line. A saved key is checked for real on the first \`sync\`.
4032
4032
  `
4033
4033
  ).action(async (opts) => {
4034
- const { runLoginCommand, realLoginDeps } = await import('./login-browser-DQ6YRXUB.js');
4034
+ const { runLoginCommand, realLoginDeps } = await import('./login-browser-BAFZYJBR.js');
4035
4035
  const code = await runLoginCommand(
4036
4036
  {
4037
4037
  browser: opts.browser !== false,
@@ -4064,13 +4064,13 @@ code is 1: revoke the token on /profile/security.
4064
4064
  "\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"
4065
4065
  ).action(async (opts) => {
4066
4066
  if (opts.link !== void 0) {
4067
- const { lookupArtifactLink } = await import('./artifact-link-cmd-LWPY3V4N.js');
4067
+ const { lookupArtifactLink } = await import('./artifact-link-cmd-4XQJO55P.js');
4068
4068
  const found = lookupArtifactLink(opts.link);
4069
4069
  if (found.ok) process.stdout.write(found.url + "\n");
4070
4070
  else fail(found.reason);
4071
4071
  return;
4072
4072
  }
4073
- const { runSync, SyncConfigError, SyncTransportError } = await import('./sync-cmd-UQVENF25.js');
4073
+ const { runSync, SyncConfigError, SyncTransportError } = await import('./sync-cmd-CO4DFMHU.js');
4074
4074
  try {
4075
4075
  const result = await runSync({
4076
4076
  url: opts.url,
@@ -4101,7 +4101,7 @@ code is 1: revoke the token on /profile/security.
4101
4101
  if (invokedCommandToken(argv) === "watch") {
4102
4102
  warnDeprecated(`\`${cliInvocation()} watch\` is now \`${cliInvocation()} daemon\`; the old name will be removed in a future release.`);
4103
4103
  }
4104
- const { runWatch } = await import('./watch-EZGDDRTQ.js');
4104
+ const { runWatch } = await import('./watch-GU62YVQY.js');
4105
4105
  await runWatch({ once: opts.once });
4106
4106
  });
4107
4107
  program2.command("hook <event>", { hidden: true }).description("capture-hook fast path, installed by `init`").action(() => {
@@ -4191,7 +4191,7 @@ code is 1: revoke the token on /profile/security.
4191
4191
  process.exitCode = await runBuildCommand({ dir: opts.dir, argv: command });
4192
4192
  });
4193
4193
  program2.command("session-sender", { hidden: true }).description("stream a runner build's sessions to its work item while the build runs").action(async () => {
4194
- const { runSessionSender } = await import('./session-sender-XED7CKHP.js');
4194
+ const { runSessionSender } = await import('./session-sender-KLOMLL7X.js');
4195
4195
  try {
4196
4196
  await runSessionSender();
4197
4197
  } catch (err) {
@@ -4234,7 +4234,7 @@ async function runCli(processArgv) {
4234
4234
  await buildProgram(argv).parseAsync(argv);
4235
4235
  }
4236
4236
  async function compileContext(opts) {
4237
- const { runEmit, EmitError } = await import('./emit-cmd-7TU3JBJ2.js');
4237
+ const { runEmit, EmitError } = await import('./emit-cmd-C3BUFAUR.js');
4238
4238
  try {
4239
4239
  const result = runEmit({ cwd: opts.dir, check: opts.check, json: opts.json });
4240
4240
  if (result.exitCode !== 0) process.exitCode = result.exitCode;
@@ -4287,7 +4287,7 @@ Compiling .outerlayer/ moved to \`${cliInvocation()} context emit\`.
4287
4287
  await compileContext({ dir: opts.dir, check: opts.check, json: opts.json });
4288
4288
  return;
4289
4289
  }
4290
- const { runEmitResult, EmitResultError } = await import('./emit-result-cmd-7CJZZQGK.js');
4290
+ const { runEmitResult, EmitResultError } = await import('./emit-result-cmd-E3YYBXRY.js');
4291
4291
  try {
4292
4292
  const result = await runEmitResult({
4293
4293
  name,
@@ -4338,7 +4338,7 @@ everywhere, bytes and deep link untouched; a still-queued one is cancelled
4338
4338
  locally so it never uploads. One correction can retire several duplicates.
4339
4339
  `
4340
4340
  ).action(async (file, opts) => {
4341
- const { runEmitArtifact, EmitArtifactError } = await import('./emit-artifact-cmd-BJICHW2E.js');
4341
+ const { runEmitArtifact, EmitArtifactError } = await import('./emit-artifact-cmd-56C6DBUP.js');
4342
4342
  let pr;
4343
4343
  if (opts.pr !== void 0) {
4344
4344
  pr = parseTrackerNumber(opts.pr);
@@ -4368,7 +4368,7 @@ locally so it never uploads. One correction can retire several duplicates.
4368
4368
  throw err;
4369
4369
  }
4370
4370
  });
4371
- 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(
4371
+ 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("--output <file>", "render the demo to this WebM file and stop; uploads nothing and needs no 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(
4372
4372
  "after",
4373
4373
  `
4374
4374
  ${cliInvocation()} emit demo test-results/demo/manifest.json --item 412
@@ -4394,7 +4394,7 @@ its criterion, and the new record retires the old record. The id must be the ite
4394
4394
  as \`work demo --item <n> --json\` prints it.
4395
4395
  `
4396
4396
  ).action(async (manifest, opts) => {
4397
- const { runEmitDemo, EmitDemoError } = await import('./emit-demo-cmd-YQN7VKQH.js');
4397
+ const { runEmitDemo, EmitDemoError } = await import('./emit-demo-cmd-YKTL6XWP.js');
4398
4398
  let item;
4399
4399
  if (opts.item !== void 0) {
4400
4400
  item = parseTrackerNumber(opts.item);
@@ -4419,6 +4419,7 @@ as \`work demo --item <n> --json\` prints it.
4419
4419
  pr,
4420
4420
  compare: opts.compare,
4421
4421
  replaces: opts.replaces,
4422
+ output: opts.output,
4422
4423
  json: opts.json,
4423
4424
  url: opts.url,
4424
4425
  apiKey: opts.apiKey,
@@ -4435,6 +4436,10 @@ as \`work demo --item <n> --json\` prints it.
4435
4436
  throw err;
4436
4437
  }
4437
4438
  });
4439
+ program2.command("demo-voice", { hidden: true }).description("Speak demo lines for a recorder: JSON lines in on stdin, out on stdout").action(async () => {
4440
+ const { runDemoVoice } = await import('./demo-voice-cmd-DF6C7EST.js');
4441
+ await runDemoVoice();
4442
+ });
4438
4443
  emitCmd.command("finding").description("Record one finding: a problem you hit in the factory").requiredOption("--id <id>", "client id \u2014 re-emitting the same id replaces it").option("--category <context|flaky-test|tooling|environment|defect|other>", "what kind of problem this is").requiredOption("--title <text>", "one sentence").requiredOption("--file <path>", "the file the problem is in, or the instruction's own path").option("--line <number>", "line number in --file").option("--rule-path <path>", "the instruction's own path \u2014 required for a context finding").option("--rule-line <number>", "line number in --rule-path").option("--rule-quote <text>", "the instruction's quoted sentence \u2014 required unless --rule-relation is missing").option("--rule-relation <wrong|broken|missing>", "how the instruction fails \u2014 required for a context finding").requiredOption("--where <label>", 'where this was recorded, e.g. "build session"').option("--detail <text>", "what happened, a few paragraphs").option("--cause <text>", 'what is actually wrong, or "unknown"').option("--suggestion <text>", "what would help").option("--command <text>", "the command that misbehaved").option("--error <text>", "the first error line").option("--test <name>", "the test name, for a flaky test").option("--symbol <name>", "the function the problem is in, for a defect").option("--started-at <event>", "event id where you hit the problem (default: first output showing --error)").option("--ended-at <event>", "event id where you got past it (default: the newest event)").option("--untimed", "record no time, only when the problem cost none in this session").option("--find <text>", "list this session's events that contain the text, and record nothing").option("--problem <id>", "a problem this finding reports; repeat for each one (needs --link-reason)", (value, previous = []) => [...previous, value]).option("--link-reason <text>", "why the finding reports each --problem").option("--new", "record a new problem instead of linking an existing one").option("--trace-id <id>", "the session's trace id, when there is one").option("--turn <number>", "turn index within the session").option("--round <number>", "round number, when there is one").addOption(new Option("--subject <value>").hideHelp()).addOption(new Option("--kind <value>").hideHelp()).addOption(new Option("--severity <value>").hideHelp()).addOption(new Option("--verdict <value>").hideHelp()).addOption(new Option("--fixed").hideHelp()).addOption(new Option("--source <value>").hideHelp()).option("--head-sha <sha>", "the commit this batch was recorded against").option("--context-source-sha <sha>", "the context-source commit this batch was recorded against").option("--item <number>", "work item to record on directly, by its number in 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(
4439
4444
  "after",
4440
4445
  `
@@ -4464,7 +4469,7 @@ recent events with their ids. --find <text> searches all of them.
4464
4469
  item that session was launched for is used automatically.
4465
4470
  `
4466
4471
  ).action(async (opts) => {
4467
- const { runEmitFinding, refuseRemovedFindingFlags, EmitFindingError } = await import('./emit-finding-cmd-NPBWVY44.js');
4472
+ const { runEmitFinding, refuseRemovedFindingFlags, EmitFindingError } = await import('./emit-finding-cmd-6MVFN4BO.js');
4468
4473
  try {
4469
4474
  refuseRemovedFindingFlags(opts);
4470
4475
  const result = await runEmitFinding({
@@ -4531,7 +4536,7 @@ the whole batch. "untimed": true records one with no time on purpose.
4531
4536
  that session was launched for is used automatically.
4532
4537
  `
4533
4538
  ).action(async (file, opts) => {
4534
- const { runEmitFindings, EmitFindingError } = await import('./emit-finding-cmd-NPBWVY44.js');
4539
+ const { runEmitFindings, EmitFindingError } = await import('./emit-finding-cmd-6MVFN4BO.js');
4535
4540
  try {
4536
4541
  const result = await runEmitFindings({
4537
4542
  file,
@@ -4566,7 +4571,7 @@ command, the command exits 0, and \`sync\` sends it later. If the gateway refuse
4566
4571
  the step, the command prints why and exits 1.
4567
4572
  `
4568
4573
  ).action(async (name, opts) => {
4569
- const { runEmitStep, EmitStepError } = await import('./emit-step-cmd-ZPLHZAMA.js');
4574
+ const { runEmitStep, EmitStepError } = await import('./emit-step-cmd-DM4CRYYI.js');
4570
4575
  try {
4571
4576
  await runEmitStep({
4572
4577
  name,
@@ -4609,7 +4614,7 @@ of the item, and a (proof: <kind>) annotation names its proof.
4609
4614
  ${cliInvocation()} emit criteria acceptance/412-login.md --item 412
4610
4615
  `
4611
4616
  ).action(async (file, opts) => {
4612
- const { runEmitCriteria, EmitCriteriaError } = await import('./emit-criteria-cmd-MUWPT25P.js');
4617
+ const { runEmitCriteria, EmitCriteriaError } = await import('./emit-criteria-cmd-HRCWXD3W.js');
4613
4618
  try {
4614
4619
  const result = await runEmitCriteria({
4615
4620
  file,
@@ -4633,9 +4638,9 @@ function registerSpecCommands(program2) {
4633
4638
  const specCmd = program2.command("spec").description("Find, file and edit the issue a spec lives in, in your factory's tracker");
4634
4639
  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)");
4635
4640
  const run = async (action) => {
4636
- const { WorkCommandError } = await import('./work-cmd-V5FHLWJM.js');
4641
+ const { WorkCommandError } = await import('./work-cmd-VR7PPSP6.js');
4637
4642
  try {
4638
- await action(await import('./spec-cmd-TRXAGQYM.js'));
4643
+ await action(await import('./spec-cmd-MX5QFW32.js'));
4639
4644
  } catch (err) {
4640
4645
  if (err instanceof WorkCommandError) {
4641
4646
  fail(err.message);
@@ -4670,7 +4675,7 @@ Prints each problem the item covers with its id, its reports and its result.
4670
4675
  session was launched for is used.
4671
4676
  `
4672
4677
  ).action(async (opts) => {
4673
- const { runFindingsShow, FindingsCommandError } = await import('./findings-cmd-DZ4ESTHX.js');
4678
+ const { runFindingsShow, FindingsCommandError } = await import('./findings-cmd-K2OYBTUH.js');
4674
4679
  try {
4675
4680
  const result = await runFindingsShow({
4676
4681
  item: opts.item,
@@ -4698,7 +4703,7 @@ Give exactly one of --fixed and --not-fixed, and a --note. Run it again for the
4698
4703
  problem to replace the earlier result. A problem the item does not cover is refused.
4699
4704
  `
4700
4705
  ).action(async (problem, opts) => {
4701
- const { runFindingsResult, FindingsCommandError } = await import('./findings-cmd-DZ4ESTHX.js');
4706
+ const { runFindingsResult, FindingsCommandError } = await import('./findings-cmd-K2OYBTUH.js');
4702
4707
  try {
4703
4708
  const result = await runFindingsResult({
4704
4709
  problem,
@@ -4740,7 +4745,7 @@ takes it, and prints the line that starts your session on it. That
4740
4745
  session links itself and holds the item's lease while it works.
4741
4746
  `
4742
4747
  ).action(async (opts) => {
4743
- const { runWorkBuild, WorkCommandError } = await import('./work-cmd-V5FHLWJM.js');
4748
+ const { runWorkBuild, WorkCommandError } = await import('./work-cmd-VR7PPSP6.js');
4744
4749
  try {
4745
4750
  await runWorkBuild(opts);
4746
4751
  } catch (err) {
@@ -4763,7 +4768,7 @@ renews that session's own 20-minute lease, unless --no-lease or
4763
4768
  --ended is given, or another worker already holds a live one.
4764
4769
  `
4765
4770
  ).action(async (number, opts) => {
4766
- const { runWorkLinkSession, WorkCommandError } = await import('./work-cmd-V5FHLWJM.js');
4771
+ const { runWorkLinkSession, WorkCommandError } = await import('./work-cmd-VR7PPSP6.js');
4767
4772
  try {
4768
4773
  await runWorkLinkSession({ ...opts, number, noLease: opts.lease === false, logFailures: opts.logFailures === true });
4769
4774
  } catch (err) {
@@ -4787,8 +4792,8 @@ criterion's new proof; --ready hands the thread back to a person. At
4787
4792
  most one action flag may be given.
4788
4793
  `
4789
4794
  ).action(async (opts) => {
4790
- const { runWorkComment, WorkCommentCommandError } = await import('./work-comment-cmd-KLEMDYI4.js');
4791
- const { WorkCommandError } = await import('./work-cmd-V5FHLWJM.js');
4795
+ const { runWorkComment, WorkCommentCommandError } = await import('./work-comment-cmd-HVZF72B4.js');
4796
+ const { WorkCommandError } = await import('./work-cmd-VR7PPSP6.js');
4792
4797
  try {
4793
4798
  await runWorkComment(opts);
4794
4799
  } catch (err) {
@@ -4809,8 +4814,8 @@ criterion that carries proof or a comment, each with who is waiting
4809
4814
  on whom next.
4810
4815
  `
4811
4816
  ).action(async (opts) => {
4812
- const { runWorkThreads, WorkCommentCommandError } = await import('./work-comment-cmd-KLEMDYI4.js');
4813
- const { WorkCommandError } = await import('./work-cmd-V5FHLWJM.js');
4817
+ const { runWorkThreads, WorkCommentCommandError } = await import('./work-comment-cmd-HVZF72B4.js');
4818
+ const { WorkCommandError } = await import('./work-cmd-VR7PPSP6.js');
4814
4819
  try {
4815
4820
  await runWorkThreads(opts);
4816
4821
  } catch (err) {
@@ -4834,8 +4839,8 @@ still running, or that an older runner released, has no log and the
4834
4839
  command exits 1.
4835
4840
  `
4836
4841
  ).action(async (opts) => {
4837
- const { runWorkLogs, WorkLogsCommandError } = await import('./work-logs-cmd-DOGPK7Q6.js');
4838
- const { WorkCommandError } = await import('./work-cmd-V5FHLWJM.js');
4842
+ const { runWorkLogs, WorkLogsCommandError } = await import('./work-logs-cmd-ZZVAHX36.js');
4843
+ const { WorkCommandError } = await import('./work-cmd-VR7PPSP6.js');
4839
4844
  try {
4840
4845
  await runWorkLogs(opts);
4841
4846
  } catch (err) {
@@ -4858,8 +4863,8 @@ item is not built again until a new build request. Exits 1 when no host
4858
4863
  build is running for the item.
4859
4864
  `
4860
4865
  ).action(async (opts) => {
4861
- const { runWorkStop, WorkStopCommandError } = await import('./work-stop-cmd-MRLJEQRP.js');
4862
- const { WorkCommandError } = await import('./work-cmd-V5FHLWJM.js');
4866
+ const { runWorkStop, WorkStopCommandError } = await import('./work-stop-cmd-SAT4XVM2.js');
4867
+ const { WorkCommandError } = await import('./work-cmd-VR7PPSP6.js');
4863
4868
  try {
4864
4869
  await runWorkStop(opts);
4865
4870
  } catch (err) {
@@ -4880,8 +4885,8 @@ Prints the item's newest live demo record: its artifact id, the commit it was re
4880
4885
  test file that recorded it. With --json, prints { "demo": null } for an item with no demo.
4881
4886
  `
4882
4887
  ).action(async (opts) => {
4883
- const { runWorkDemo, WorkDemoCommandError } = await import('./work-demo-cmd-XYRKFP4G.js');
4884
- const { WorkCommandError } = await import('./work-cmd-V5FHLWJM.js');
4888
+ const { runWorkDemo, WorkDemoCommandError } = await import('./work-demo-cmd-EDGNM5VJ.js');
4889
+ const { WorkCommandError } = await import('./work-cmd-VR7PPSP6.js');
4885
4890
  try {
4886
4891
  await runWorkDemo(opts);
4887
4892
  } catch (err) {
@@ -4902,7 +4907,7 @@ deletes anything \u2014 the item is removed from Work only once no
4902
4907
  live addition remains on it.
4903
4908
  `
4904
4909
  ).action(async (opts) => {
4905
- const { runWorkRemove, WorkCommandError } = await import('./work-cmd-V5FHLWJM.js');
4910
+ const { runWorkRemove, WorkCommandError } = await import('./work-cmd-VR7PPSP6.js');
4906
4911
  try {
4907
4912
  await runWorkRemove(opts);
4908
4913
  } catch (err) {
@@ -4914,7 +4919,7 @@ live addition remains on it.
4914
4919
  }
4915
4920
  });
4916
4921
  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) => {
4917
- const { runWorkStatus, WorkCommandError } = await import('./work-cmd-V5FHLWJM.js');
4922
+ const { runWorkStatus, WorkCommandError } = await import('./work-cmd-VR7PPSP6.js');
4918
4923
  try {
4919
4924
  await runWorkStatus(opts);
4920
4925
  } catch (err) {
@@ -4959,11 +4964,11 @@ differs from HEAD.
4959
4964
  fail(trackerNumberError("--pr", opts.pr));
4960
4965
  return;
4961
4966
  }
4962
- const { runWorkProofsCommand } = await import('./work-proofs-cmd-YMMDAA6W.js');
4967
+ const { runWorkProofsCommand } = await import('./work-proofs-cmd-LIXV252G.js');
4963
4968
  await runWorkProofsCommand({ ...opts, ...pr === void 0 ? {} : { pr } });
4964
4969
  });
4965
4970
  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) => {
4966
- const { runWorkList, WorkCommandError } = await import('./work-cmd-V5FHLWJM.js');
4971
+ const { runWorkList, WorkCommandError } = await import('./work-cmd-VR7PPSP6.js');
4967
4972
  try {
4968
4973
  await runWorkList(opts);
4969
4974
  } catch (err) {
@@ -4984,7 +4989,7 @@ by a different key is refused; claiming again with the same key extends
4984
4989
  it. --host is a label only.
4985
4990
  `
4986
4991
  ).action(async (opts) => {
4987
- const { runWorkClaim, WorkCommandError } = await import('./work-claim-cmd-YSAJ7DAK.js');
4992
+ const { runWorkClaim, WorkCommandError } = await import('./work-claim-cmd-O54L5DSL.js');
4988
4993
  try {
4989
4994
  await runWorkClaim(opts);
4990
4995
  } catch (err) {
@@ -5004,7 +5009,7 @@ Extends the live lease this API key holds. Refused with a 410 if the
5004
5009
  lease has expired, or a 403 if a different key holds it.
5005
5010
  `
5006
5011
  ).action(async (opts) => {
5007
- const { runWorkRenew, WorkCommandError } = await import('./work-claim-cmd-YSAJ7DAK.js');
5012
+ const { runWorkRenew, WorkCommandError } = await import('./work-claim-cmd-O54L5DSL.js');
5008
5013
  try {
5009
5014
  await runWorkRenew(opts);
5010
5015
  } catch (err) {
@@ -5036,7 +5041,7 @@ applies to a host's lease only. A later tool call in the session
5036
5041
  takes the lease again.
5037
5042
  `
5038
5043
  ).action(async (opts) => {
5039
- const { runWorkRelease, WorkCommandError } = await import('./work-claim-cmd-YSAJ7DAK.js');
5044
+ const { runWorkRelease, WorkCommandError } = await import('./work-claim-cmd-O54L5DSL.js');
5040
5045
  try {
5041
5046
  await runWorkRelease(opts);
5042
5047
  } catch (err) {
@@ -5063,7 +5068,7 @@ Idempotent: declaring the same pull request twice is a no-op.
5063
5068
  needs your own login; an agent session or a factory key is refused.
5064
5069
  `
5065
5070
  ).action(async (number, opts) => {
5066
- const { runWorkPr, WorkPrCommandError } = await import('./work-pr-cmd-LYWL7ZLF.js');
5071
+ const { runWorkPr, WorkPrCommandError } = await import('./work-pr-cmd-UJ7VWCJN.js');
5067
5072
  try {
5068
5073
  await runWorkPr({ ...opts, number });
5069
5074
  } catch (err) {
@@ -5088,8 +5093,8 @@ login, then declares the pull request on the item, as \`work pr\` does.
5088
5093
  Run it again after a change to the title or description.
5089
5094
  `
5090
5095
  ).action(async (opts) => {
5091
- const { runWorkOpenPr, WorkOpenPrCommandError } = await import('./work-open-pr-cmd-UAUEEP3V.js');
5092
- const { WorkCommandError } = await import('./work-cmd-V5FHLWJM.js');
5096
+ const { runWorkOpenPr, WorkOpenPrCommandError } = await import('./work-open-pr-cmd-AQWZRJHZ.js');
5097
+ const { WorkCommandError } = await import('./work-cmd-VR7PPSP6.js');
5093
5098
  try {
5094
5099
  await runWorkOpenPr(opts);
5095
5100
  } catch (err) {
@@ -5105,8 +5110,8 @@ function registerRunnerCommands(program2) {
5105
5110
  const runnerCmd = program2.command("runner").description("Take work from the implement and amend queues on this machine");
5106
5111
  const configOption = "the cloud config file to run against (default: ~/.outerlayer/config.json)";
5107
5112
  runnerCmd.command("start").description("Run the loop: claim work, run it, report, clean up, repeat").option("--config <path>", configOption).action(async (opts) => {
5108
- const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-WSZIWPP4.js');
5109
- const { start, RunnerStartError } = await import('./loop-NGFNQF3Y.js');
5113
+ const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-EBT5VYPX.js');
5114
+ const { start, RunnerStartError } = await import('./loop-UVONXWXB.js');
5110
5115
  const { RunnerAlreadyRunningError } = await import('./pidfile-PCG2H5T4.js');
5111
5116
  const configPath = opts.config ?? defaultRunnerConfigPath();
5112
5117
  try {
@@ -5124,9 +5129,9 @@ function registerRunnerCommands(program2) {
5124
5129
  "after",
5125
5130
  "\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"
5126
5131
  ).action(async () => {
5127
- const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-WSZIWPP4.js');
5128
- const { containerStart } = await import('./container-start-XRR4VC5Z.js');
5129
- const { start, RunnerStartError } = await import('./loop-NGFNQF3Y.js');
5132
+ const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-EBT5VYPX.js');
5133
+ const { containerStart } = await import('./container-start-RLX2PL3C.js');
5134
+ const { start, RunnerStartError } = await import('./loop-UVONXWXB.js');
5130
5135
  const { RunnerAlreadyRunningError } = await import('./pidfile-PCG2H5T4.js');
5131
5136
  try {
5132
5137
  const result = await containerStart({
@@ -5148,16 +5153,16 @@ function registerRunnerCommands(program2) {
5148
5153
  "after",
5149
5154
  "\nIn the runner image, run it with `docker exec <container> outerlayer runner update-steps`. It reads the\ncontainer with `docker inspect` and changes nothing. The steps rename the old container and never remove it\nbefore the new one runs. They name the container's variables and never print a value.\n"
5150
5155
  ).action(async (opts) => {
5151
- const { defaultRunnerConfigPath } = await import('./config-WSZIWPP4.js');
5156
+ const { defaultRunnerConfigPath } = await import('./config-EBT5VYPX.js');
5152
5157
  const { runnerDir } = await import('./paths-AQ47ZRHK.js');
5153
- const { runUpdateSteps } = await import('./update-steps-IQVAL64Y.js');
5158
+ const { runUpdateSteps } = await import('./update-steps-MC3IUHW7.js');
5154
5159
  const text = await runUpdateSteps({ runnerDirPath: runnerDir(opts.config ?? defaultRunnerConfigPath()) });
5155
5160
  process.stdout.write(`${text}
5156
5161
  `);
5157
5162
  });
5158
5163
  runnerCmd.command("check").description("Validate the config, the hooks and the key, and print the effective settings").option("--config <path>", configOption).action(async (opts) => {
5159
- const { defaultRunnerConfigPath } = await import('./config-WSZIWPP4.js');
5160
- const { runRunnerCheck } = await import('./check-G2K76NEM.js');
5164
+ const { defaultRunnerConfigPath } = await import('./config-EBT5VYPX.js');
5165
+ const { runRunnerCheck } = await import('./check-FOWN6M3C.js');
5161
5166
  const configPath = opts.config ?? defaultRunnerConfigPath();
5162
5167
  const result = await runRunnerCheck(configPath);
5163
5168
  if (!result.ok) {
@@ -5178,7 +5183,7 @@ function registerRunnerCommands(program2) {
5178
5183
  `);
5179
5184
  });
5180
5185
  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").option("--build-memory-max <size>", "with --service, memory all builds may use together, such as 16g").option("--build-cpus-max <n>", "with --service, CPUs all builds may use together, such as 4").action(async (opts) => {
5181
- const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-WSZIWPP4.js');
5186
+ const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-EBT5VYPX.js');
5182
5187
  const { runRunnerInstall, RunnerInstallError, launcherSummary, restartNote } = await import('./install-cmd-RGO7NWKP.js');
5183
5188
  const configPath = opts.config ?? defaultRunnerConfigPath();
5184
5189
  if (opts.service !== true) {
@@ -5191,13 +5196,13 @@ function registerRunnerCommands(program2) {
5191
5196
  }
5192
5197
  }
5193
5198
  const buildCpusMax = opts.buildCpusMax === void 0 ? void 0 : Number(opts.buildCpusMax);
5194
- if (buildCpusMax !== void 0 && !(await import('./command-VQPQDPCZ.js')).cpusAreValid(buildCpusMax)) {
5199
+ if (buildCpusMax !== void 0 && !(await import('./command-C5YKBTK4.js')).cpusAreValid(buildCpusMax)) {
5195
5200
  fail(`--build-cpus-max ${opts.buildCpusMax} is not a number of CPUs from 0.01 to 1024.`);
5196
5201
  return;
5197
5202
  }
5198
5203
  try {
5199
5204
  if (opts.service === true) {
5200
- const { installServiceCommand } = await import('./command-VQPQDPCZ.js');
5205
+ const { installServiceCommand } = await import('./command-C5YKBTK4.js');
5201
5206
  const result2 = await installServiceCommand({
5202
5207
  configPath,
5203
5208
  print: opts.print,
@@ -5254,8 +5259,8 @@ To keep it running, run ${C.yellow}${cliInvocation()} runner install --service${
5254
5259
  fail(`pass --service: \`${cliInvocation()} runner uninstall --service\` removes the runner's service.`);
5255
5260
  return;
5256
5261
  }
5257
- const { defaultRunnerConfigPath } = await import('./config-WSZIWPP4.js');
5258
- const { uninstallServiceCommand } = await import('./command-VQPQDPCZ.js');
5262
+ const { defaultRunnerConfigPath } = await import('./config-EBT5VYPX.js');
5263
+ const { uninstallServiceCommand } = await import('./command-C5YKBTK4.js');
5259
5264
  const result = await uninstallServiceCommand({ configPath: opts.config ?? defaultRunnerConfigPath(), unitName: opts.unitName, home: homeFromEnv() });
5260
5265
  if (result.ok) for (const line of result.lines) process.stdout.write(`${C.green}\u2713${C.reset} ${line}
5261
5266
  `);
@@ -5282,12 +5287,12 @@ already in claude.env is used.
5282
5287
  printf '%s' "$CLAUDE_CODE_OAUTH_TOKEN" | ${cliInvocation()} runner init --agent claude --factory <org>/<factory>
5283
5288
  `
5284
5289
  ).action(async (opts) => {
5285
- const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-WSZIWPP4.js');
5286
- const { prepareRunnerInit, runRunnerInit, RunnerInitError, writeRunnerInit } = await import('./init-V6Y2VNKW.js');
5287
- const { obtainRunnerKey, runnerKeyLogin } = await import('./runner-key-B5EJH25Z.js');
5288
- const { detectMachine } = await import('./machine-XG54XYYZ.js');
5289
- const { chooseVm, runVmInit, VmInitError } = await import('./init-MN3MNG7V.js');
5290
- const { AGENT_COMMANDS, credentialFromStdin, isAgentName, restartForCredential, RunnerEnvError } = await import('./runner-env-YPXWTNP3.js');
5290
+ const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-EBT5VYPX.js');
5291
+ const { prepareRunnerInit, runRunnerInit, RunnerInitError, writeRunnerInit } = await import('./init-KO3FT2XP.js');
5292
+ const { obtainRunnerKey, runnerKeyLogin } = await import('./runner-key-JKXJWGGY.js');
5293
+ const { detectMachine } = await import('./machine-2BI76JZO.js');
5294
+ const { chooseVm, runVmInit, VmInitError } = await import('./init-YYZ7B4ZD.js');
5295
+ const { AGENT_COMMANDS, credentialFromStdin, isAgentName, restartForCredential, RunnerEnvError } = await import('./runner-env-QN4BLTVZ.js');
5291
5296
  const configPath = opts.config ?? defaultRunnerConfigPath();
5292
5297
  if (opts.agent !== void 0 && !isAgentName(opts.agent)) {
5293
5298
  fail(`--agent ${opts.agent}: runner init writes commands for ${Object.keys(AGENT_COMMANDS).join(", ")}. For another agent, leave --agent out and edit runner.commands.`);
@@ -5301,7 +5306,7 @@ already in claude.env is used.
5301
5306
  try {
5302
5307
  let credential;
5303
5308
  if (agent !== void 0) {
5304
- const { readPipedKey } = await import('./login-browser-DQ6YRXUB.js');
5309
+ const { readPipedKey } = await import('./login-browser-BAFZYJBR.js');
5305
5310
  credential = credentialFromStdin(
5306
5311
  await readPipedKey(process.stdin, {
5307
5312
  onWaiting: () => process.stderr.write(`runner init is waiting for Claude's credential on stdin; close stdin to use the one already in claude.env
@@ -5437,7 +5442,7 @@ ${C.yellow}The runner will not update itself: ${installErr.message}${C.reset}
5437
5442
  let serviceUp = false;
5438
5443
  let restart;
5439
5444
  if (installedLayout) {
5440
- const { installServiceCommand } = await import('./command-VQPQDPCZ.js');
5445
+ const { installServiceCommand } = await import('./command-C5YKBTK4.js');
5441
5446
  const service = await installServiceCommand({
5442
5447
  configPath,
5443
5448
  entryPath: process.argv[1] ?? "",
@@ -5481,12 +5486,12 @@ Next:
5481
5486
  "after",
5482
5487
  "\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"
5483
5488
  ).action(async (opts) => {
5484
- const { defaultRunnerConfigPath } = await import('./config-WSZIWPP4.js');
5485
- const { buildRepositoryImage, RecipeError } = await import('./build-UDOBVX5J.js');
5489
+ const { defaultRunnerConfigPath } = await import('./config-EBT5VYPX.js');
5490
+ const { buildRepositoryImage, RecipeError } = await import('./build-BBWAD5LR.js');
5486
5491
  const { currentCliBuild } = await import('./cli-build-K56DK4DS.js');
5487
- const { createDockerHost } = await import('./docker-KZ3OQTPW.js');
5488
- const { builderSpec } = await import('./builder-YNXWVH2V.js');
5489
- const { loadRunnerConfig } = await import('./config-WSZIWPP4.js');
5492
+ const { createDockerHost } = await import('./docker-CP656XNO.js');
5493
+ const { builderSpec } = await import('./builder-FD53GTWL.js');
5494
+ const { loadRunnerConfig } = await import('./config-EBT5VYPX.js');
5490
5495
  const configPath = opts.config ?? defaultRunnerConfigPath();
5491
5496
  const loaded = (() => {
5492
5497
  try {
@@ -5497,11 +5502,11 @@ Next:
5497
5502
  })();
5498
5503
  const memory = loaded?.build?.memory ?? "8g";
5499
5504
  try {
5500
- const { ensureRunnerIdentity } = await import('./runner-identity-XPZO3TG4.js');
5505
+ const { ensureRunnerIdentity } = await import('./runner-identity-53I4UTVY.js');
5501
5506
  await ensureRunnerIdentity(configPath, { log: (line) => console.error(line) }).catch((err) => {
5502
5507
  console.error(`the runner's Docker identity could not be stored: ${err instanceof Error ? err.message : String(err)}`);
5503
5508
  });
5504
- const { imageTargetFor } = await import('./governing-source-JPRMOB3O.js');
5509
+ const { imageTargetFor } = await import('./governing-source-MQA2SDJT.js');
5505
5510
  const target = await imageTargetFor({ config: loaded, repository: opts.repository, fetchImpl: fetch });
5506
5511
  if (!target.ok) {
5507
5512
  if (opts.json) {
@@ -5564,17 +5569,17 @@ Next:
5564
5569
  }
5565
5570
  });
5566
5571
  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) => {
5567
- const { defaultRunnerConfigPath } = await import('./config-WSZIWPP4.js');
5568
- const { requestStop } = await import('./loop-NGFNQF3Y.js');
5572
+ const { defaultRunnerConfigPath } = await import('./config-EBT5VYPX.js');
5573
+ const { requestStop } = await import('./loop-UVONXWXB.js');
5569
5574
  const configPath = opts.config ?? defaultRunnerConfigPath();
5570
5575
  const { runnerImageVersion } = await import('./image-tag-BTXKIH73.js');
5571
5576
  await requestStop(configPath, Boolean(opts.now), void 0, { image: runnerImageVersion() !== void 0 });
5572
5577
  });
5573
5578
  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) => {
5574
- const { defaultRunnerConfigPath, loadRunnerConfig } = await import('./config-WSZIWPP4.js');
5579
+ const { defaultRunnerConfigPath, loadRunnerConfig } = await import('./config-EBT5VYPX.js');
5575
5580
  const { jobsDir, runnerDir } = await import('./paths-AQ47ZRHK.js');
5576
- const { listJobFiles, runnerProcessState } = await import('./loop-NGFNQF3Y.js');
5577
- const { renderStatus } = await import('./status-WQ53MWC3.js');
5581
+ const { listJobFiles, runnerProcessState } = await import('./loop-UVONXWXB.js');
5582
+ const { renderStatus } = await import('./status-YCQHAY45.js');
5578
5583
  const { readHousekeepingRecord } = await import('./record-SVCNFCGQ.js');
5579
5584
  const path2 = await import('path');
5580
5585
  const configPath = opts.config ?? defaultRunnerConfigPath();
@@ -5595,7 +5600,7 @@ Next:
5595
5600
  const processState = runnerProcessState(configPath);
5596
5601
  const service = await (async () => {
5597
5602
  if (process.platform !== "linux" || !existsSync("/run/systemd/system")) return void 0;
5598
- const { inspectRunnerService } = await import('./find-unit-UKH6JH4S.js');
5603
+ const { inspectRunnerService } = await import('./find-unit-O6WL6UIW.js');
5599
5604
  const facts = inspectRunnerService(configPath);
5600
5605
  return facts === void 0 ? void 0 : { unit: facts.unit, running: facts.mainPid !== void 0, delegated: facts.delegate };
5601
5606
  })();
@@ -5632,8 +5637,8 @@ Next:
5632
5637
  );
5633
5638
  });
5634
5639
  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) => {
5635
- const { defaultRunnerConfigPath } = await import('./config-WSZIWPP4.js');
5636
- const { listJobFiles } = await import('./loop-NGFNQF3Y.js');
5640
+ const { defaultRunnerConfigPath } = await import('./config-EBT5VYPX.js');
5641
+ const { listJobFiles } = await import('./loop-UVONXWXB.js');
5637
5642
  const { newestAttempt, logPathFor, tail, RunnerLogsError } = await import('./logs-LEVH6VAI.js');
5638
5643
  const configPath = opts.config ?? defaultRunnerConfigPath();
5639
5644
  const item = parseTrackerNumber(itemArg);
@@ -5886,7 +5891,7 @@ would get, the instruction files and the names of the skills. It warns when the
5886
5891
  no \`build\`. It needs the context-read permission: a login or a factory key with it is enough.
5887
5892
  `
5888
5893
  ).action(async (opts) => {
5889
- const { runContextShow, ContextShowError } = await import('./context-show-cmd-X27GMOT6.js');
5894
+ const { runContextShow, ContextShowError } = await import('./context-show-cmd-S5SEBOI2.js');
5890
5895
  try {
5891
5896
  const result = await runContextShow({ repo: opts.repo, json: opts.json, url: opts.url, apiKey: opts.apiKey, appId: opts.appId });
5892
5897
  process.stdout.write(result.output);