@outerlayer/cli 0.22.2 → 0.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/{agent-setup-KXPDPTAJ.js → agent-setup-SNDCEHG2.js} +13 -10
  3. package/dist/{artifact-link-cmd-OWRI5AJX.js → artifact-link-cmd-LEI6EOZE.js} +2 -2
  4. package/dist/{build-6WRNZPVR.js → build-WHHFA7KM.js} +2 -2
  5. package/dist/build-info.json +1 -1
  6. package/dist/{builder-G3MLDMTI.js → builder-7FBQAWQZ.js} +3 -3
  7. package/dist/{check-N6WLZCER.js → check-3CGLWMHM.js} +32 -32
  8. package/dist/{chunk-ZCXP35T3.js → chunk-2TT7DEMZ.js} +2 -2
  9. package/dist/{chunk-BVR6MQLS.js → chunk-6AOZD3LY.js} +2 -2
  10. package/dist/{chunk-WKSBSEWT.js → chunk-BOG4ENP7.js} +9 -9
  11. package/dist/{chunk-G3IJ3N6F.js → chunk-BUP5N3X6.js} +1 -1
  12. package/dist/{chunk-FVDVC2GF.js → chunk-C2XZBNHY.js} +1 -1
  13. package/dist/{chunk-FQE5RDHI.js → chunk-C64D7HR3.js} +5 -5
  14. package/dist/{chunk-AEKSX4EY.js → chunk-CBCKD6DO.js} +1 -1
  15. package/dist/{chunk-JD6GWYY7.js → chunk-D64E222W.js} +4 -4
  16. package/dist/{chunk-U6RKHNC7.js → chunk-DJYOCD65.js} +6 -6
  17. package/dist/{chunk-QZX6DAAW.js → chunk-FX6IHR5C.js} +8 -8
  18. package/dist/{chunk-IPS2JCHK.js → chunk-G3LHWUBK.js} +4 -4
  19. package/dist/{chunk-EMUNEAQK.js → chunk-GXV73IIS.js} +3 -3
  20. package/dist/{chunk-5OCIHFGE.js → chunk-HBISTTG3.js} +32 -23
  21. package/dist/chunk-JKNYTNYD.js +151 -0
  22. package/dist/{chunk-IMCVQF5F.js → chunk-KGKFEONR.js} +3 -3
  23. package/dist/{chunk-USWVXQIH.js → chunk-MQ743JX3.js} +3 -3
  24. package/dist/{chunk-XR56WEA5.js → chunk-OGMZJWWD.js} +1 -1
  25. package/dist/{chunk-KOIMUHIS.js → chunk-QSEPKZXR.js} +13 -13
  26. package/dist/{chunk-7VUK5RFS.js → chunk-QZBXLLTV.js} +36 -1
  27. package/dist/{chunk-WFSUUUAN.js → chunk-RKOTJQVG.js} +1 -1
  28. package/dist/{chunk-2CPOAPU4.js → chunk-TFGXOHF6.js} +12 -12
  29. package/dist/{chunk-V7SAQ645.js → chunk-VJBFQP3H.js} +21 -12
  30. package/dist/{chunk-ZNPE7FW5.js → chunk-VPEGE3QZ.js} +1 -1
  31. package/dist/{chunk-W3SWJ2TD.js → chunk-VWFOKRYS.js} +5 -2
  32. package/dist/{chunk-XCRZTXRL.js → chunk-WX2WEERU.js} +63 -43
  33. package/dist/{chunk-4542B3RR.js → chunk-WY7HFY62.js} +3 -3
  34. package/dist/{chunk-VSUXCMMH.js → chunk-XFGL53GU.js} +51 -33
  35. package/dist/{chunk-SNVXHNU7.js → chunk-XGPC3IOR.js} +3 -3
  36. package/dist/{chunk-HWZCE745.js → chunk-XOEV4FVK.js} +2 -2
  37. package/dist/{chunk-EAQSOE62.js → chunk-XSPA5ODY.js} +21 -19
  38. package/dist/{chunk-4OYKJJ2V.js → chunk-ZKWKQIJU.js} +86 -6
  39. package/dist/{chunk-B42BIYC6.js → chunk-ZLZ3XVPI.js} +2 -2
  40. package/dist/{claude-launcher-QD3C427Y.js → claude-launcher-KEESTJHO.js} +5 -5
  41. package/dist/{cli-A2Y67WAB.js → cli-44WGGICQ.js} +115 -108
  42. package/dist/{command-Q5Q2EIO4.js → command-4FAP2D3P.js} +21 -21
  43. package/dist/{connect-cmd-TNGEIWCA.js → connect-cmd-6DUTUK63.js} +7 -7
  44. package/dist/{context-cleanup-DSA3HGQU.js → context-cleanup-LTH77FC3.js} +3 -3
  45. package/dist/{control-plane-launch-HE6OSWKO.js → control-plane-launch-SEYCOZFH.js} +7 -7
  46. package/dist/{dist-7IH56ELA.js → dist-SOH3O24Y.js} +2 -2
  47. package/dist/{docker-JU422JL7.js → docker-KMK4LOET.js} +3 -3
  48. package/dist/{doctor-BRN4BGMA.js → doctor-4H77CEB7.js} +23 -23
  49. package/dist/{emit-artifact-cmd-GPAJCCUC.js → emit-artifact-cmd-XCZ3ALLV.js} +11 -11
  50. package/dist/emit-cmd-WQH2NK7H.js +15 -0
  51. package/dist/{emit-criteria-cmd-R3FKHSQG.js → emit-criteria-cmd-JE72JHKJ.js} +8 -8
  52. package/dist/{emit-finding-cmd-IK7RAVP5.js → emit-finding-cmd-ILIDRMYN.js} +8 -8
  53. package/dist/{emit-result-cmd-5FJTF7YD.js → emit-result-cmd-WPKG5YAS.js} +11 -11
  54. package/dist/{emit-step-cmd-VRTD5YPP.js → emit-step-cmd-OVMLQSL6.js} +9 -9
  55. package/dist/{governing-source-WM736XR4.js → governing-source-EQBKPME7.js} +15 -15
  56. package/dist/{guest-init-2OZ4YC7R.js → guest-init-HWSE7W6L.js} +2 -2
  57. package/dist/{hook-fast-QUGEI2IT.js → hook-fast-27SHD72I.js} +1 -1
  58. package/dist/{import-capture-cmd-Q56DDZVO.js → import-capture-cmd-TCOKNVBM.js} +12 -7
  59. package/dist/{import-ruler-cmd-T6LLO6Q7.js → import-ruler-cmd-VJOHOJQ7.js} +2 -2
  60. package/dist/index.js +4 -4
  61. package/dist/{init-X7FCQDFX.js → init-HAAHIQFN.js} +22 -22
  62. package/dist/{init-U3I43XCP.js → init-WQ62BXDN.js} +22 -22
  63. package/dist/{init-cmd-VCKH2DUQ.js → init-cmd-VPFIDY64.js} +19 -18
  64. package/dist/init-update-UZIJ2FMU.js +529 -0
  65. package/dist/layout-UOJQGEPW.js +10 -0
  66. package/dist/{login-browser-BN5UKPHS.js → login-browser-4OMZFP3U.js} +4 -3
  67. package/dist/{logout-cmd-RZFWTNYD.js → logout-cmd-5V5MMBSY.js} +2 -2
  68. package/dist/{loop-P3QDQOE5.js → loop-JPW2QJ64.js} +32 -32
  69. package/dist/{machine-EEFOW32K.js → machine-PGDRWPI2.js} +21 -21
  70. package/dist/{mcp-install-cmd-GD4QUP7Z.js → mcp-install-cmd-GGWB3JJ2.js} +2 -2
  71. package/dist/{runner-identity-FTHZFMGY.js → runner-identity-IIZ3RK7M.js} +3 -3
  72. package/dist/{runner-key-O42EUXQU.js → runner-key-BPP5XRYR.js} +22 -22
  73. package/dist/{session-sender-HF6DXFA2.js → session-sender-EKKZ5DEU.js} +12 -12
  74. package/dist/{spec-cmd-ADPH236D.js → spec-cmd-JDHGNFVJ.js} +9 -9
  75. package/dist/{starter-pack-5EQYGSJF.js → starter-pack-55EFILC5.js} +7 -4
  76. package/dist/{status-LXFIVGP3.js → status-UCQDEMFX.js} +26 -26
  77. package/dist/{sync-cmd-5XS3CUV5.js → sync-cmd-NSVXOYFJ.js} +11 -11
  78. package/dist/{watch-FBZHZV56.js → watch-NQVZWPBJ.js} +11 -11
  79. package/dist/{work-claim-cmd-LIIINECF.js → work-claim-cmd-FPJXQAXP.js} +11 -11
  80. package/dist/{work-cmd-SM6DY2WK.js → work-cmd-FMPDXPU6.js} +9 -9
  81. package/dist/{work-comment-cmd-VYVXGT4W.js → work-comment-cmd-ZVUE2IUN.js} +9 -9
  82. package/dist/{work-logs-cmd-XZSCWWMW.js → work-logs-cmd-CQH2SYT4.js} +9 -9
  83. package/dist/{work-open-pr-cmd-YZNC3P3R.js → work-open-pr-cmd-YY2OGJOI.js} +10 -10
  84. package/dist/{work-pr-cmd-AMN23KFJ.js → work-pr-cmd-EHFTEVJO.js} +9 -9
  85. package/dist/{work-stop-cmd-HSR2GOJJ.js → work-stop-cmd-LGWSBSBT.js} +9 -9
  86. package/package.json +1 -1
  87. package/skill-pack/maintained/outerlayer-build/references/agent-briefs.md +7 -1
  88. package/skill-pack/maintained/outerlayer-build/references/criteria-judge.md +10 -0
  89. package/skill-pack/maintained/outerlayer-build/references/review-briefs.md +4 -0
  90. package/skill-pack/maintained/outerlayer-cli/SKILL.md +5 -3
  91. package/dist/emit-cmd-3W5IO5ET.js +0 -14
  92. package/dist/init-update-TCMH7M3Q.js +0 -210
  93. package/dist/{chunk-F35VMF5M.js → chunk-GOSFARMS.js} +1 -1
  94. package/dist/{chunk-3AZYLAJC.js → chunk-QILR6TZP.js} +1 -1
  95. package/dist/{chunk-DIB2WLBL.js → chunk-YVZJ6GKF.js} +1 -1
  96. package/dist/{chunk-SFHR45FA.js → chunk-Z42JY3LQ.js} +1 -1
  97. package/dist/{mcp-serve-cmd-TQSPFRC7.js → mcp-serve-cmd-CNRC5AL5.js} +1 -1
@@ -1,35 +1,36 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { gatherDoctorChecks, doctorExitCode, summarizeChecks, renderDoctorText, recordWrapped, recordUnwrapped, recordRemoval, readManifest, recordInstall, recordStatusline } from './chunk-QZX6DAAW.js';
4
- import './chunk-VSUXCMMH.js';
5
- import { verifiedTrackerNames, TRACKERS } from './chunk-FQE5RDHI.js';
6
- import './chunk-B42BIYC6.js';
7
- import './chunk-EMUNEAQK.js';
8
- import './chunk-G3IJ3N6F.js';
9
- import './chunk-EAQSOE62.js';
10
- import './chunk-F35VMF5M.js';
11
- import './chunk-USWVXQIH.js';
3
+ import { gatherDoctorChecks, doctorExitCode, summarizeChecks, renderDoctorText, recordWrapped, recordUnwrapped, recordRemoval, readManifest, recordInstall, recordStatusline } from './chunk-FX6IHR5C.js';
4
+ import './chunk-XFGL53GU.js';
5
+ import './chunk-VJBFQP3H.js';
6
+ import { verifiedTrackerNames, TRACKERS } from './chunk-C64D7HR3.js';
7
+ import './chunk-ZLZ3XVPI.js';
8
+ import './chunk-GXV73IIS.js';
9
+ import './chunk-BUP5N3X6.js';
10
+ import './chunk-XSPA5ODY.js';
11
+ import './chunk-GOSFARMS.js';
12
+ import './chunk-MQ743JX3.js';
12
13
  import './chunk-QS43O4DR.js';
13
- import { hookFiredMarkerPath, installedCliDistDir } from './chunk-HWZCE745.js';
14
+ import { hookFiredMarkerPath, installedCliDistDir } from './chunk-XOEV4FVK.js';
14
15
  import './chunk-ZJSNLVCE.js';
15
16
  import './chunk-DXDF43YG.js';
16
17
  import './chunk-BKO6JEZI.js';
17
18
  import './chunk-HCVLP7XA.js';
18
19
  import { findGitDirs } from './chunk-BJ3KTMDH.js';
19
- import './chunk-AEKSX4EY.js';
20
- import './chunk-DIB2WLBL.js';
21
- import './chunk-EABW6AJQ.js';
22
- import './chunk-V7SAQ645.js';
23
- import './chunk-5OCIHFGE.js';
20
+ import './chunk-CBCKD6DO.js';
21
+ import './chunk-YVZJ6GKF.js';
24
22
  import { C, warnDeprecated, API_KEY_FLAG_DEPRECATION, NO_COLOR_FLAG, stripNoColor } from './chunk-ANPNT6PM.js';
23
+ import './chunk-EABW6AJQ.js';
24
+ import { FIRST_VERSION_READING_AGENTS_SKILLS } from './chunk-JKNYTNYD.js';
25
+ import './chunk-HBISTTG3.js';
25
26
  import { parseTrackerNumber, trackerNumberError } from './chunk-WZBHBH3J.js';
26
27
  import { cliInvocation, packageRunnerOf } from './chunk-CRB3POP4.js';
27
28
  import { settingsPath, readSettings, SettingsParseError, listHookCandidates, wrapHooks, writeSettings, unwrapHooks, REGISTERED_EVENTS, cliCommand, removeHooks, removeStatusline, cliBinResolvable, mergeHooks, repointWrappedHooks, AUTO_WRAP_EVENTS, mergeStatusline } from './chunk-GNPTU4BM.js';
28
- import './chunk-W3SWJ2TD.js';
29
+ import './chunk-VWFOKRYS.js';
29
30
  import { cloneIsGoverned } from './chunk-YQR6E6OV.js';
30
31
  import { removeJournalHooks, removePreCommitGuardHook } from './chunk-TUSYOL2O.js';
31
- import './chunk-WFSUUUAN.js';
32
- import './chunk-7VUK5RFS.js';
32
+ import './chunk-RKOTJQVG.js';
33
+ import './chunk-QZBXLLTV.js';
33
34
  import { homeFromEnv } from './chunk-VNVZDWO3.js';
34
35
  import { resolveVersion } from './chunk-RA3O54FC.js';
35
36
  import './chunk-OW52QLK3.js';
@@ -3650,14 +3651,17 @@ function apiKeyOption() {
3650
3651
  return new Option("--api-key <key>", `deprecated: use \`${cliInvocation()} login\` or OUTERLAYER_API_KEY`).hideHelp();
3651
3652
  }
3652
3653
  async function installStarterPackInRepo() {
3653
- const { installStarterPack, formatStarterPackOutput } = await import('./starter-pack-5EQYGSJF.js');
3654
+ const { installStarterPack, formatStarterPackOutput } = await import('./starter-pack-55EFILC5.js');
3654
3655
  const cwd = process.cwd();
3655
3656
  let repoRoot = cwd;
3656
3657
  try {
3657
3658
  repoRoot = execFileSync("git", ["rev-parse", "--show-toplevel"], { cwd, encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] }).trim() || cwd;
3658
3659
  } catch {
3659
3660
  }
3660
- const result = installStarterPack({ repoRoot });
3661
+ const { declareAgentsMdLayout, isAgentsMdLayout, skillsBaseFor } = await import('./layout-UOJQGEPW.js');
3662
+ const fresh = !isAgentsMdLayout(repoRoot) && !existsSync(join(repoRoot, ".outerlayer"));
3663
+ const result = installStarterPack({ repoRoot, base: fresh ? ".agents/skills" : skillsBaseFor(repoRoot) });
3664
+ if (fresh) declareAgentsMdLayout(repoRoot);
3661
3665
  return { result, output: formatStarterPackOutput(result) };
3662
3666
  }
3663
3667
  function formatInitOutput(result, opts = {}) {
@@ -3780,8 +3784,8 @@ ${starter.output}`),
3780
3784
  }
3781
3785
  }
3782
3786
  async function realConnectDepsForCwd() {
3783
- const { realConnectDeps } = await import('./connect-cmd-TNGEIWCA.js');
3784
- const { resolveRepoIdentity } = await import('./dist-7IH56ELA.js');
3787
+ const { realConnectDeps } = await import('./connect-cmd-6DUTUK63.js');
3788
+ const { resolveRepoIdentity } = await import('./dist-SOH3O24Y.js');
3785
3789
  return {
3786
3790
  ...realConnectDeps(),
3787
3791
  home: homeFromEnv(),
@@ -3799,7 +3803,7 @@ function buildProgram(argv = process.argv) {
3799
3803
  program2.name(cliInvocation()).description("OuterLayer \u2014 see what your coding agents actually do").enablePositionalOptions().version(resolveVersion()).hook("preAction", (_root, command) => {
3800
3804
  if (command.opts().apiKey !== void 0) warnDeprecated(API_KEY_FLAG_DEPRECATION);
3801
3805
  }).option(NO_COLOR_FLAG, "disable color (NO_COLOR=1 does the same)").addHelpText("after", SUPPORT_TEXT);
3802
- program2.command("init").description("Connect this repository, install hooks and agent skills, run doctor").option("--user", "install into user settings [default]").option("--project", "install into project settings (./.claude/settings.json)").option("--org", "print a managed-settings.json snippet for MDM/GPO rollout").option("--remove", "uninstall OuterLayer hooks").option("--local", "install the hooks only: no connect step and no network call").option("--factory <org/factory>", `the factory to connect this repository to (see \`${cliInvocation()} connect\`)`).option("--gitignore", "also add .outerlayer/ to .gitignore (project scope)").option("--template <name>", "install the starter skills and a policy file (only: default)").option("--update", "update the files init wrote that you have not edited, and write missing ones").option("--dry-run", "with --update: print the plan and write nothing").option("--no-wrap-hooks", "leave PreToolUse/PostToolUse hooks unwrapped").option("--statusline", "install the status-line segment [default]").option("--no-statusline", "leave the statusLine slot untouched").option("--shell-function", "make plain claude run `outerlayer claude` (edits ~/.zshrc or ~/.bashrc)").option("--no-shell-function", "do not set up the shell function, and remove it if it is there").option("--json", "machine-readable JSON output").addHelpText(
3806
+ program2.command("init").description("Connect this repository, install hooks and agent skills, run doctor").option("--user", "install into user settings [default]").option("--project", "install into project settings (./.claude/settings.json)").option("--org", "print a managed-settings.json snippet for MDM/GPO rollout").option("--remove", "uninstall OuterLayer hooks").option("--local", "install the hooks only: no connect step and no network call").option("--factory <org/factory>", `the factory to connect this repository to (see \`${cliInvocation()} connect\`)`).option("--gitignore", "also add .outerlayer/ to .gitignore (project scope)").option("--template <name>", "install the starter skills and a policy file (only: default)").option("--update", "update the files init wrote that you have not edited, and write missing ones").option("--dry-run", "with --update: print the plan and write nothing").option("--no-skills-link", "do not link .claude/skills to .agents/skills").option("--control-plane", "with --update: this is a control plane; older CLIs keep .claude/skills/").option("--no-wrap-hooks", "leave PreToolUse/PostToolUse hooks unwrapped").option("--statusline", "install the status-line segment [default]").option("--no-statusline", "leave the statusLine slot untouched").option("--shell-function", "make plain claude run `outerlayer claude` (edits ~/.zshrc or ~/.bashrc)").option("--no-shell-function", "do not set up the shell function, and remove it if it is there").option("--json", "machine-readable JSON output").addHelpText(
3803
3807
  "after",
3804
3808
  `
3805
3809
  In a repository, init runs four steps: connect the repository to a
@@ -3810,20 +3814,20 @@ login it skips the connect step and says to run \`${cliInvocation()} login\`. Wi
3810
3814
  skipped or failed. The exit code is 1 when a step failed.
3811
3815
 
3812
3816
  The agent setup step installs the starter skills and the \`outerlayer\` skill
3813
- into .outerlayer/skills/, writes .outerlayer/config.json for Claude Code when
3814
- there is none, runs \`${cliInvocation()} context emit\` so the skills appear in
3815
- .claude/skills/, and adds the outerlayer and outerlayer-docs MCP servers to
3816
- .mcp.json. Nothing you wrote is changed: an existing config, policy, edited
3817
- skill, MCP entry or root CLAUDE.md and AGENTS.md is left as it is, and a
3818
- hand-written file the emit would replace is kept and listed. The files are
3819
- left uncommitted.
3817
+ into .agents/skills/, writes AGENTS.md when there is no AGENTS.md or
3818
+ CLAUDE.md, writes .outerlayer/config.json with "layout": 2 when there is
3819
+ none, links .claude/skills to ../.agents/skills, and adds the outerlayer and
3820
+ outerlayer-docs MCP servers to .mcp.json. Nothing is generated, so nothing
3821
+ needs \`` + cliInvocation() + ` context emit\`. --no-skills-link leaves out the link.
3822
+ Nothing you wrote is changed. A repository still in the earlier layout keeps
3823
+ its files in .outerlayer/ and is compiled as before until --update moves it.
3824
+ The files are left uncommitted.
3820
3825
  The step is skipped outside a git repository and in a repository whose
3821
3826
  context comes from a control plane, where it arrives at session start.
3822
3827
 
3823
3828
  --local installs only the hooks: no connect step, no agent setup and no
3824
3829
  network call. Add \`--template default\` to also write the starter skills and
3825
- a policy file into .outerlayer/ without compiling them; \`${cliInvocation()} context
3826
- emit\` does that.
3830
+ a policy file, with nothing to compile.
3827
3831
 
3828
3832
  Idempotent: settings are backed up before any write, and a second run
3829
3833
  changes nothing. Wrapping adds one spawn per hook firing; undo it with
@@ -3831,26 +3835,29 @@ changes nothing. Wrapping adds one spawn per hook firing; undo it with
3831
3835
  replaced.
3832
3836
 
3833
3837
  Three of the starter skills are copied once and are yours to edit. The
3834
- others are rewritten from this CLI on every \`context emit\`.
3838
+ others are rewritten from this CLI by \`init --update\`, or by \`context emit\`
3839
+ in a repository that has not moved.
3835
3840
 
3836
- --update brings the files init wrote once up to this CLI's version: the
3837
- template skills, the policy, the two starter checks and the two MCP
3838
- entries. A file still equal to a version an earlier release wrote is
3839
- replaced, and a missing one is written. A file you edited is never
3840
- touched. It then runs \`${cliInvocation()} context emit\` and leaves the changes
3841
+ --update first moves a repository in the earlier layout to AGENTS.md,
3842
+ .agents/skills/ and .mcp.json: it removes each file that holds exactly what
3843
+ \`` + cliInvocation() + ` context emit\` writes, moves the sources, links .claude/skills
3844
+ and sets "layout": 2. A file you edited is kept and listed. It then brings
3845
+ the files init wrote once up to this CLI's version: the template skills, the
3846
+ policy, the two starter checks and the two MCP entries. A file still equal
3847
+ to a version an earlier release wrote is replaced, and a missing one is
3848
+ written. A file you edited is never touched. The changes are left
3841
3849
  uncommitted. --dry-run prints the plan, with a command to compare each
3842
- edited file, and writes nothing. \`${cliInvocation()} doctor\` reports the same
3843
- states under Starter files.
3844
- `
3850
+ edited file, and writes nothing. --control-plane makes no link and says
3851
+ what CLIs older than ${FIRST_VERSION_READING_AGENTS_SKILLS} do. \`` + cliInvocation() + " doctor` reports the same\nstates under Starter files.\n"
3845
3852
  ).action(async (opts) => {
3846
3853
  if (opts.update || opts.dryRun) {
3847
- const { runInitUpdate, formatInitUpdate, updateFlagProblem } = await import('./init-update-TCMH7M3Q.js');
3854
+ const { runInitUpdate, formatInitUpdate, updateFlagProblem } = await import('./init-update-UZIJ2FMU.js');
3848
3855
  const problem = updateFlagProblem(opts);
3849
3856
  if (problem !== void 0) {
3850
3857
  fail(problem);
3851
3858
  return;
3852
3859
  }
3853
- const result = runInitUpdate({ cwd: process.cwd(), dryRun: opts.dryRun === true });
3860
+ const result = runInitUpdate({ cwd: process.cwd(), dryRun: opts.dryRun === true, skillsLink: opts.skillsLink !== false, controlPlane: opts.controlPlane === true });
3854
3861
  if (opts.json) writeJson(result);
3855
3862
  else process.stdout.write(formatInitUpdate(result));
3856
3863
  if (result.status === "failed") process.exitCode = 1;
@@ -3858,7 +3865,7 @@ states under Starter files.
3858
3865
  }
3859
3866
  let starterTemplate;
3860
3867
  if (opts.template !== void 0) {
3861
- const { assertKnownTemplate, StarterPackError } = await import('./starter-pack-5EQYGSJF.js');
3868
+ const { assertKnownTemplate, StarterPackError } = await import('./starter-pack-55EFILC5.js');
3862
3869
  try {
3863
3870
  assertKnownTemplate(opts.template);
3864
3871
  } catch (err) {
@@ -3891,12 +3898,12 @@ states under Starter files.
3891
3898
  if (changed.length > 0 && !opts.json) process.stdout.write(`Removed the claude function from ${changed.join(", ")}.
3892
3899
  `);
3893
3900
  }
3894
- const shell = !opts.remove && opts.shellFunction !== void 0 ? (await import('./init-cmd-VCKH2DUQ.js')).applyShellFunctionFlag(opts.shellFunction, { home: homeFromEnv(), shellPath: process.env.SHELL }) : void 0;
3901
+ const shell = !opts.remove && opts.shellFunction !== void 0 ? (await import('./init-cmd-VPFIDY64.js')).applyShellFunctionFlag(opts.shellFunction, { home: homeFromEnv(), shellPath: process.env.SHELL }) : void 0;
3895
3902
  if (opts.json) writeJson(shell === void 0 ? outcome.result : { ...outcome.result, shellFunction: { outcome: shell.outcome, reason: shell.reason } });
3896
3903
  else process.stdout.write(outcome.text + (shell?.text ?? ""));
3897
3904
  return;
3898
3905
  }
3899
- const { runInitCommand } = await import('./init-cmd-VCKH2DUQ.js');
3906
+ const { runInitCommand } = await import('./init-cmd-VPFIDY64.js');
3900
3907
  const code = await runInitCommand(
3901
3908
  { json: opts.json, factory: opts.factory, shellFunction: opts.shellFunction },
3902
3909
  {
@@ -3908,8 +3915,8 @@ states under Starter files.
3908
3915
  return { ok, text, detail };
3909
3916
  },
3910
3917
  runAgentSetup: async () => {
3911
- const { runAgentSetup } = await import('./agent-setup-KXPDPTAJ.js');
3912
- return runAgentSetup({ cwd: process.cwd() });
3918
+ const { runAgentSetup } = await import('./agent-setup-SNDCEHG2.js');
3919
+ return runAgentSetup({ cwd: process.cwd(), skillsLink: opts.skillsLink !== false });
3913
3920
  },
3914
3921
  runDoctorChecks: gatherDoctorChecks,
3915
3922
  shell: {
@@ -3917,7 +3924,7 @@ states under Starter files.
3917
3924
  shellPath: process.env.SHELL,
3918
3925
  interactive: Boolean(process.stdin.isTTY && process.stderr.isTTY) && opts.json !== true,
3919
3926
  ask: async () => {
3920
- const { promptOnTerminal } = await import('./connect-cmd-TNGEIWCA.js');
3927
+ const { promptOnTerminal } = await import('./connect-cmd-6DUTUK63.js');
3921
3928
  const answer = await promptOnTerminal({
3922
3929
  message: `Should plain claude start Claude Code through ${cliInvocation()} claude? That is how a session in a governed repository gets its control plane. It adds one block to your zsh or bash startup file.`,
3923
3930
  options: [
@@ -3956,7 +3963,7 @@ linked (true, false, or null when it could not be checked) and, when false,
3956
3963
  linkUrl.
3957
3964
  `
3958
3965
  ).action(async (opts) => {
3959
- const { runConnectCommand } = await import('./connect-cmd-TNGEIWCA.js');
3966
+ const { runConnectCommand } = await import('./connect-cmd-6DUTUK63.js');
3960
3967
  const code = await runConnectCommand({ factory: opts.factory, json: opts.json }, await realConnectDepsForCwd(), {
3961
3968
  stdout: process.stdout,
3962
3969
  stderr: process.stderr
@@ -3995,7 +4002,7 @@ Every later command reads the saved file, so none of them needs a key on
3995
4002
  its command line. A saved key is checked for real on the first \`sync\`.
3996
4003
  `
3997
4004
  ).action(async (opts) => {
3998
- const { runLoginCommand, realLoginDeps } = await import('./login-browser-BN5UKPHS.js');
4005
+ const { runLoginCommand, realLoginDeps } = await import('./login-browser-4OMZFP3U.js');
3999
4006
  const code = await runLoginCommand(
4000
4007
  {
4001
4008
  browser: opts.browser !== false,
@@ -4019,7 +4026,7 @@ dashboard cannot be reached the local copy is still deleted and the exit
4019
4026
  code is 1: revoke the token on /profile/security.
4020
4027
  `
4021
4028
  ).action(async () => {
4022
- const { runLogoutCommand, realLogoutDeps } = await import('./logout-cmd-RZFWTNYD.js');
4029
+ const { runLogoutCommand, realLogoutDeps } = await import('./logout-cmd-5V5MMBSY.js');
4023
4030
  const code = await runLogoutCommand(realLogoutDeps());
4024
4031
  if (code !== 0) process.exitCode = code;
4025
4032
  });
@@ -4028,13 +4035,13 @@ code is 1: revoke the token on /profile/security.
4028
4035
  "\nIncremental: only sessions newer than the last checkpoint ship. The tier\nis applied on this machine before anything leaves it; `--dry-run` prints\nexactly what would. The hook-triggered background sync runs `--quiet`.\nExit 2 means the server rejected at least one session.\n"
4029
4036
  ).action(async (opts) => {
4030
4037
  if (opts.link !== void 0) {
4031
- const { lookupArtifactLink } = await import('./artifact-link-cmd-OWRI5AJX.js');
4038
+ const { lookupArtifactLink } = await import('./artifact-link-cmd-LEI6EOZE.js');
4032
4039
  const found = lookupArtifactLink(opts.link);
4033
4040
  if (found.ok) process.stdout.write(found.url + "\n");
4034
4041
  else fail(found.reason);
4035
4042
  return;
4036
4043
  }
4037
- const { runSync, SyncConfigError, SyncTransportError } = await import('./sync-cmd-5XS3CUV5.js');
4044
+ const { runSync, SyncConfigError, SyncTransportError } = await import('./sync-cmd-NSVXOYFJ.js');
4038
4045
  try {
4039
4046
  const result = await runSync({
4040
4047
  url: opts.url,
@@ -4065,7 +4072,7 @@ code is 1: revoke the token on /profile/security.
4065
4072
  if (invokedCommandToken(argv) === "watch") {
4066
4073
  warnDeprecated(`\`${cliInvocation()} watch\` is now \`${cliInvocation()} daemon\`; the old name will be removed in a future release.`);
4067
4074
  }
4068
- const { runWatch } = await import('./watch-FBZHZV56.js');
4075
+ const { runWatch } = await import('./watch-NQVZWPBJ.js');
4069
4076
  await runWatch({ once: opts.once });
4070
4077
  });
4071
4078
  program2.command("hook <event>", { hidden: true }).description("capture-hook fast path, installed by `init`").action(() => {
@@ -4155,7 +4162,7 @@ code is 1: revoke the token on /profile/security.
4155
4162
  process.exitCode = await runBuildCommand({ dir: opts.dir, argv: command });
4156
4163
  });
4157
4164
  program2.command("session-sender", { hidden: true }).description("stream a runner build's sessions to its work item while the build runs").action(async () => {
4158
- const { runSessionSender } = await import('./session-sender-HF6DXFA2.js');
4165
+ const { runSessionSender } = await import('./session-sender-EKKZ5DEU.js');
4159
4166
  try {
4160
4167
  await runSessionSender();
4161
4168
  } catch (err) {
@@ -4163,7 +4170,7 @@ code is 1: revoke the token on /profile/security.
4163
4170
  }
4164
4171
  });
4165
4172
  program2.command("vm-init", { hidden: true }).description("lay out a microVM build's guest; the guest helper runs it").action(async () => {
4166
- const { realGuestHost, runGuestInit } = await import('./guest-init-2OZ4YC7R.js');
4173
+ const { realGuestHost, runGuestInit } = await import('./guest-init-HWSE7W6L.js');
4167
4174
  const { readFileSync: readFileSync3 } = await import('fs');
4168
4175
  try {
4169
4176
  runGuestInit(realGuestHost(), readFileSync3("/proc/cmdline", "utf8"));
@@ -4199,7 +4206,7 @@ async function runCli(processArgv) {
4199
4206
  await buildProgram(argv).parseAsync(argv);
4200
4207
  }
4201
4208
  async function compileContext(opts) {
4202
- const { runEmit, EmitError } = await import('./emit-cmd-3W5IO5ET.js');
4209
+ const { runEmit, EmitError } = await import('./emit-cmd-WQH2NK7H.js');
4203
4210
  try {
4204
4211
  const result = runEmit({ cwd: opts.dir, check: opts.check, json: opts.json });
4205
4212
  if (result.exitCode !== 0) process.exitCode = result.exitCode;
@@ -4246,7 +4253,7 @@ Compiling .outerlayer/ moved to \`${cliInvocation()} context emit\`.
4246
4253
  await compileContext({ dir: opts.dir, check: opts.check, json: opts.json });
4247
4254
  return;
4248
4255
  }
4249
- const { runEmitResult, EmitResultError } = await import('./emit-result-cmd-5FJTF7YD.js');
4256
+ const { runEmitResult, EmitResultError } = await import('./emit-result-cmd-WPKG5YAS.js');
4250
4257
  try {
4251
4258
  const result = await runEmitResult({
4252
4259
  name,
@@ -4296,7 +4303,7 @@ everywhere, bytes and deep link untouched; a still-queued one is cancelled
4296
4303
  locally so it never uploads. One correction can retire several duplicates.
4297
4304
  `
4298
4305
  ).action(async (file, opts) => {
4299
- const { runEmitArtifact, EmitArtifactError } = await import('./emit-artifact-cmd-GPAJCCUC.js');
4306
+ const { runEmitArtifact, EmitArtifactError } = await import('./emit-artifact-cmd-XCZ3ALLV.js');
4300
4307
  let pr;
4301
4308
  if (opts.pr !== void 0) {
4302
4309
  pr = parseTrackerNumber(opts.pr);
@@ -4355,7 +4362,7 @@ recent events with their ids. --find <text> searches all of them.
4355
4362
  item that session was launched for is used automatically.
4356
4363
  `
4357
4364
  ).action(async (opts) => {
4358
- const { runEmitFinding, refuseRemovedFindingFlags, EmitFindingError } = await import('./emit-finding-cmd-IK7RAVP5.js');
4365
+ const { runEmitFinding, refuseRemovedFindingFlags, EmitFindingError } = await import('./emit-finding-cmd-ILIDRMYN.js');
4359
4366
  try {
4360
4367
  refuseRemovedFindingFlags(opts);
4361
4368
  const result = await runEmitFinding({
@@ -4422,7 +4429,7 @@ the whole batch. "untimed": true records one with no time on purpose.
4422
4429
  that session was launched for is used automatically.
4423
4430
  `
4424
4431
  ).action(async (file, opts) => {
4425
- const { runEmitFindings, EmitFindingError } = await import('./emit-finding-cmd-IK7RAVP5.js');
4432
+ const { runEmitFindings, EmitFindingError } = await import('./emit-finding-cmd-ILIDRMYN.js');
4426
4433
  try {
4427
4434
  const result = await runEmitFindings({
4428
4435
  file,
@@ -4457,7 +4464,7 @@ command, the command exits 0, and \`sync\` sends it later. If the gateway refuse
4457
4464
  the step, the command prints why and exits 1.
4458
4465
  `
4459
4466
  ).action(async (name, opts) => {
4460
- const { runEmitStep, EmitStepError } = await import('./emit-step-cmd-VRTD5YPP.js');
4467
+ const { runEmitStep, EmitStepError } = await import('./emit-step-cmd-OVMLQSL6.js');
4461
4468
  try {
4462
4469
  await runEmitStep({
4463
4470
  name,
@@ -4500,7 +4507,7 @@ of the item, and a (proof: <kind>) annotation names its proof.
4500
4507
  ${cliInvocation()} emit criteria acceptance/412-login.md --item 412
4501
4508
  `
4502
4509
  ).action(async (file, opts) => {
4503
- const { runEmitCriteria, EmitCriteriaError } = await import('./emit-criteria-cmd-R3FKHSQG.js');
4510
+ const { runEmitCriteria, EmitCriteriaError } = await import('./emit-criteria-cmd-JE72JHKJ.js');
4504
4511
  try {
4505
4512
  const result = await runEmitCriteria({
4506
4513
  file,
@@ -4524,9 +4531,9 @@ function registerSpecCommands(program2) {
4524
4531
  const specCmd = program2.command("spec").description("Find, file and edit the issue a spec lives in, in your factory's tracker");
4525
4532
  const credentialOptions = (command) => command.option("--json", "machine-readable JSON output").option("--url <url>", "cloud base URL (or OUTERLAYER_URL / config)").addOption(apiKeyOption()).option("--app-id <id>", "factory id the key is bound to (or OUTERLAYER_APP_ID / config)");
4526
4533
  const run = async (action) => {
4527
- const { WorkCommandError } = await import('./work-cmd-SM6DY2WK.js');
4534
+ const { WorkCommandError } = await import('./work-cmd-FMPDXPU6.js');
4528
4535
  try {
4529
- await action(await import('./spec-cmd-ADPH236D.js'));
4536
+ await action(await import('./spec-cmd-JDHGNFVJ.js'));
4530
4537
  } catch (err) {
4531
4538
  if (err instanceof WorkCommandError) {
4532
4539
  fail(err.message);
@@ -4568,7 +4575,7 @@ takes it, and prints the line that starts your session on it. That
4568
4575
  session links itself and holds the item's lease while it works.
4569
4576
  `
4570
4577
  ).action(async (opts) => {
4571
- const { runWorkBuild, WorkCommandError } = await import('./work-cmd-SM6DY2WK.js');
4578
+ const { runWorkBuild, WorkCommandError } = await import('./work-cmd-FMPDXPU6.js');
4572
4579
  try {
4573
4580
  await runWorkBuild(opts);
4574
4581
  } catch (err) {
@@ -4591,7 +4598,7 @@ renews that session's own 20-minute lease, unless --no-lease or
4591
4598
  --ended is given, or another worker already holds a live one.
4592
4599
  `
4593
4600
  ).action(async (number, opts) => {
4594
- const { runWorkLinkSession, WorkCommandError } = await import('./work-cmd-SM6DY2WK.js');
4601
+ const { runWorkLinkSession, WorkCommandError } = await import('./work-cmd-FMPDXPU6.js');
4595
4602
  try {
4596
4603
  await runWorkLinkSession({ ...opts, number, noLease: opts.lease === false, logFailures: opts.logFailures === true });
4597
4604
  } catch (err) {
@@ -4615,8 +4622,8 @@ criterion's new proof; --ready hands the thread back to a person. At
4615
4622
  most one action flag may be given.
4616
4623
  `
4617
4624
  ).action(async (opts) => {
4618
- const { runWorkComment, WorkCommentCommandError } = await import('./work-comment-cmd-VYVXGT4W.js');
4619
- const { WorkCommandError } = await import('./work-cmd-SM6DY2WK.js');
4625
+ const { runWorkComment, WorkCommentCommandError } = await import('./work-comment-cmd-ZVUE2IUN.js');
4626
+ const { WorkCommandError } = await import('./work-cmd-FMPDXPU6.js');
4620
4627
  try {
4621
4628
  await runWorkComment(opts);
4622
4629
  } catch (err) {
@@ -4637,8 +4644,8 @@ criterion that carries proof or a comment, each with who is waiting
4637
4644
  on whom next.
4638
4645
  `
4639
4646
  ).action(async (opts) => {
4640
- const { runWorkThreads, WorkCommentCommandError } = await import('./work-comment-cmd-VYVXGT4W.js');
4641
- const { WorkCommandError } = await import('./work-cmd-SM6DY2WK.js');
4647
+ const { runWorkThreads, WorkCommentCommandError } = await import('./work-comment-cmd-ZVUE2IUN.js');
4648
+ const { WorkCommandError } = await import('./work-cmd-FMPDXPU6.js');
4642
4649
  try {
4643
4650
  await runWorkThreads(opts);
4644
4651
  } catch (err) {
@@ -4662,8 +4669,8 @@ still running, or that an older runner released, has no log and the
4662
4669
  command exits 1.
4663
4670
  `
4664
4671
  ).action(async (opts) => {
4665
- const { runWorkLogs, WorkLogsCommandError } = await import('./work-logs-cmd-XZSCWWMW.js');
4666
- const { WorkCommandError } = await import('./work-cmd-SM6DY2WK.js');
4672
+ const { runWorkLogs, WorkLogsCommandError } = await import('./work-logs-cmd-CQH2SYT4.js');
4673
+ const { WorkCommandError } = await import('./work-cmd-FMPDXPU6.js');
4667
4674
  try {
4668
4675
  await runWorkLogs(opts);
4669
4676
  } catch (err) {
@@ -4686,8 +4693,8 @@ item is not built again until a new build request. Exits 1 when no host
4686
4693
  build is running for the item.
4687
4694
  `
4688
4695
  ).action(async (opts) => {
4689
- const { runWorkStop, WorkStopCommandError } = await import('./work-stop-cmd-HSR2GOJJ.js');
4690
- const { WorkCommandError } = await import('./work-cmd-SM6DY2WK.js');
4696
+ const { runWorkStop, WorkStopCommandError } = await import('./work-stop-cmd-LGWSBSBT.js');
4697
+ const { WorkCommandError } = await import('./work-cmd-FMPDXPU6.js');
4691
4698
  try {
4692
4699
  await runWorkStop(opts);
4693
4700
  } catch (err) {
@@ -4708,7 +4715,7 @@ deletes anything \u2014 the item is removed from Work only once no
4708
4715
  live addition remains on it.
4709
4716
  `
4710
4717
  ).action(async (opts) => {
4711
- const { runWorkRemove, WorkCommandError } = await import('./work-cmd-SM6DY2WK.js');
4718
+ const { runWorkRemove, WorkCommandError } = await import('./work-cmd-FMPDXPU6.js');
4712
4719
  try {
4713
4720
  await runWorkRemove(opts);
4714
4721
  } catch (err) {
@@ -4720,7 +4727,7 @@ live addition remains on it.
4720
4727
  }
4721
4728
  });
4722
4729
  workCmd.command("status").description("Show one item's stage, gate ledger, and additions").option("--item <number>", "the item's number inside this factory").option("--issue <number>", "issue number, or a Linear/Jira key like ENG-123").option(TRACKER_OPTION_FLAG, "tracker for a keyed --issue, when both hold the key").option("--repo <owner/name>", "repository for an issue number (default: the checkout's remote)").option("--json", "machine-readable JSON output").option("--url <url>", "cloud base URL (or OUTERLAYER_URL / config)").addOption(apiKeyOption()).option("--app-id <id>", "factory id the key is bound to (or OUTERLAYER_APP_ID / config)").action(async (opts) => {
4723
- const { runWorkStatus, WorkCommandError } = await import('./work-cmd-SM6DY2WK.js');
4730
+ const { runWorkStatus, WorkCommandError } = await import('./work-cmd-FMPDXPU6.js');
4724
4731
  try {
4725
4732
  await runWorkStatus(opts);
4726
4733
  } catch (err) {
@@ -4732,7 +4739,7 @@ live addition remains on it.
4732
4739
  }
4733
4740
  });
4734
4741
  workCmd.command("list").description("List live work items for this factory").option("--stage <spec|build|review>", "filter by stage").option("--section <attention|waiting|flowing>", "filter by Queue section").option("--repo <owner/name>", "repository (default: the current checkout's remote)").option("--unclaimed", "only items with no live lease").option("--claimed", "only items with a live lease, held by a host or a local session").option("--startable", "only items a host can start: a build request, no open PR, no live lease").option("--needs <amend>", "only items with a thread waiting on an agent").option("--json", "machine-readable JSON output").option("--url <url>", "cloud base URL (or OUTERLAYER_URL / config)").addOption(apiKeyOption()).option("--app-id <id>", "factory id the key is bound to (or OUTERLAYER_APP_ID / config)").action(async (opts) => {
4735
- const { runWorkList, WorkCommandError } = await import('./work-cmd-SM6DY2WK.js');
4742
+ const { runWorkList, WorkCommandError } = await import('./work-cmd-FMPDXPU6.js');
4736
4743
  try {
4737
4744
  await runWorkList(opts);
4738
4745
  } catch (err) {
@@ -4753,7 +4760,7 @@ by a different key is refused; claiming again with the same key extends
4753
4760
  it. --host is a label only.
4754
4761
  `
4755
4762
  ).action(async (opts) => {
4756
- const { runWorkClaim, WorkCommandError } = await import('./work-claim-cmd-LIIINECF.js');
4763
+ const { runWorkClaim, WorkCommandError } = await import('./work-claim-cmd-FPJXQAXP.js');
4757
4764
  try {
4758
4765
  await runWorkClaim(opts);
4759
4766
  } catch (err) {
@@ -4773,7 +4780,7 @@ Extends the live lease this API key holds. Refused with a 410 if the
4773
4780
  lease has expired, or a 403 if a different key holds it.
4774
4781
  `
4775
4782
  ).action(async (opts) => {
4776
- const { runWorkRenew, WorkCommandError } = await import('./work-claim-cmd-LIIINECF.js');
4783
+ const { runWorkRenew, WorkCommandError } = await import('./work-claim-cmd-FPJXQAXP.js');
4777
4784
  try {
4778
4785
  await runWorkRenew(opts);
4779
4786
  } catch (err) {
@@ -4805,7 +4812,7 @@ applies to a host's lease only. A later tool call in the session
4805
4812
  takes the lease again.
4806
4813
  `
4807
4814
  ).action(async (opts) => {
4808
- const { runWorkRelease, WorkCommandError } = await import('./work-claim-cmd-LIIINECF.js');
4815
+ const { runWorkRelease, WorkCommandError } = await import('./work-claim-cmd-FPJXQAXP.js');
4809
4816
  try {
4810
4817
  await runWorkRelease(opts);
4811
4818
  } catch (err) {
@@ -4832,7 +4839,7 @@ Idempotent: declaring the same pull request twice is a no-op.
4832
4839
  needs your own login; an agent session or a factory key is refused.
4833
4840
  `
4834
4841
  ).action(async (number, opts) => {
4835
- const { runWorkPr, WorkPrCommandError } = await import('./work-pr-cmd-AMN23KFJ.js');
4842
+ const { runWorkPr, WorkPrCommandError } = await import('./work-pr-cmd-EHFTEVJO.js');
4836
4843
  try {
4837
4844
  await runWorkPr({ ...opts, number });
4838
4845
  } catch (err) {
@@ -4857,8 +4864,8 @@ login, then declares the pull request on the item, as \`work pr\` does.
4857
4864
  Run it again after a change to the title or description.
4858
4865
  `
4859
4866
  ).action(async (opts) => {
4860
- const { runWorkOpenPr, WorkOpenPrCommandError } = await import('./work-open-pr-cmd-YZNC3P3R.js');
4861
- const { WorkCommandError } = await import('./work-cmd-SM6DY2WK.js');
4867
+ const { runWorkOpenPr, WorkOpenPrCommandError } = await import('./work-open-pr-cmd-YY2OGJOI.js');
4868
+ const { WorkCommandError } = await import('./work-cmd-FMPDXPU6.js');
4862
4869
  try {
4863
4870
  await runWorkOpenPr(opts);
4864
4871
  } catch (err) {
@@ -4875,7 +4882,7 @@ function registerRunnerCommands(program2) {
4875
4882
  const configOption = "the cloud config file to run against (default: ~/.outerlayer/config.json)";
4876
4883
  runnerCmd.command("start").description("Run the loop: claim work, run it, report, clean up, repeat").option("--config <path>", configOption).action(async (opts) => {
4877
4884
  const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-H4QS332G.js');
4878
- const { start, RunnerStartError } = await import('./loop-P3QDQOE5.js');
4885
+ const { start, RunnerStartError } = await import('./loop-JPW2QJ64.js');
4879
4886
  const { RunnerAlreadyRunningError } = await import('./pidfile-G2J5WBQS.js');
4880
4887
  const configPath = opts.config ?? defaultRunnerConfigPath();
4881
4888
  try {
@@ -4891,7 +4898,7 @@ function registerRunnerCommands(program2) {
4891
4898
  });
4892
4899
  runnerCmd.command("check").description("Validate the config, the hooks and the key, and print the effective settings").option("--config <path>", configOption).action(async (opts) => {
4893
4900
  const { defaultRunnerConfigPath } = await import('./config-H4QS332G.js');
4894
- const { runRunnerCheck } = await import('./check-N6WLZCER.js');
4901
+ const { runRunnerCheck } = await import('./check-3CGLWMHM.js');
4895
4902
  const configPath = opts.config ?? defaultRunnerConfigPath();
4896
4903
  const result = await runRunnerCheck(configPath);
4897
4904
  if (!result.ok) {
@@ -4920,7 +4927,7 @@ function registerRunnerCommands(program2) {
4920
4927
  }
4921
4928
  try {
4922
4929
  if (opts.service === true) {
4923
- const { installServiceCommand } = await import('./command-Q5Q2EIO4.js');
4930
+ const { installServiceCommand } = await import('./command-4FAP2D3P.js');
4924
4931
  const result2 = await installServiceCommand({
4925
4932
  configPath,
4926
4933
  print: opts.print,
@@ -4976,7 +4983,7 @@ To keep it running, run ${C.yellow}${cliInvocation()} runner install --service${
4976
4983
  return;
4977
4984
  }
4978
4985
  const { defaultRunnerConfigPath } = await import('./config-H4QS332G.js');
4979
- const { uninstallServiceCommand } = await import('./command-Q5Q2EIO4.js');
4986
+ const { uninstallServiceCommand } = await import('./command-4FAP2D3P.js');
4980
4987
  const result = await uninstallServiceCommand({ configPath: opts.config ?? defaultRunnerConfigPath(), unitName: opts.unitName, home: homeFromEnv() });
4981
4988
  if (result.ok) for (const line of result.lines) process.stdout.write(`${C.green}\u2713${C.reset} ${line}
4982
4989
  `);
@@ -5004,10 +5011,10 @@ already in runner.env is used.
5004
5011
  `
5005
5012
  ).action(async (opts) => {
5006
5013
  const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-H4QS332G.js');
5007
- const { prepareRunnerInit, runRunnerInit, RunnerInitError, writeRunnerInit } = await import('./init-U3I43XCP.js');
5008
- const { obtainRunnerKey, runnerKeyLogin } = await import('./runner-key-O42EUXQU.js');
5009
- const { detectMachine } = await import('./machine-EEFOW32K.js');
5010
- const { chooseVm, runVmInit, VmInitError } = await import('./init-X7FCQDFX.js');
5014
+ const { prepareRunnerInit, runRunnerInit, RunnerInitError, writeRunnerInit } = await import('./init-WQ62BXDN.js');
5015
+ const { obtainRunnerKey, runnerKeyLogin } = await import('./runner-key-BPP5XRYR.js');
5016
+ const { detectMachine } = await import('./machine-PGDRWPI2.js');
5017
+ const { chooseVm, runVmInit, VmInitError } = await import('./init-HAAHIQFN.js');
5011
5018
  const { AGENT_COMMANDS, credentialFromStdin, isAgentName, restartForCredential, RunnerEnvError } = await import('./runner-env-GZHXM27A.js');
5012
5019
  const configPath = opts.config ?? defaultRunnerConfigPath();
5013
5020
  if (opts.agent !== void 0 && !isAgentName(opts.agent)) {
@@ -5022,7 +5029,7 @@ already in runner.env is used.
5022
5029
  try {
5023
5030
  let credential;
5024
5031
  if (agent !== void 0) {
5025
- const { readPipedKey } = await import('./login-browser-BN5UKPHS.js');
5032
+ const { readPipedKey } = await import('./login-browser-4OMZFP3U.js');
5026
5033
  credential = credentialFromStdin(
5027
5034
  await readPipedKey(process.stdin, {
5028
5035
  onWaiting: () => process.stderr.write(`runner init is waiting for Claude's credential on stdin; close stdin to use the one already in runner.env
@@ -5158,7 +5165,7 @@ ${C.yellow}The runner will not update itself: ${installErr.message}${C.reset}
5158
5165
  let serviceUp = false;
5159
5166
  let restart;
5160
5167
  if (installedLayout) {
5161
- const { installServiceCommand } = await import('./command-Q5Q2EIO4.js');
5168
+ const { installServiceCommand } = await import('./command-4FAP2D3P.js');
5162
5169
  const service = await installServiceCommand({
5163
5170
  configPath,
5164
5171
  entryPath: process.argv[1] ?? "",
@@ -5203,10 +5210,10 @@ Next:
5203
5210
  "\nA repository governed by a control plane builds the control plane's image, at the commit\nthe gateway has stored for it. A repository that governs itself fetches the head of its\ndefault branch into the runner's cache. Either way it reads .devcontainer/devcontainer.json\nand builds the image with the devcontainer CLI. Settings\nthat reach the host or widen the container's privileges are ignored and listed. The\nimage holds this CLI and a pinned Claude Code. Nothing runs inside the image.\n"
5204
5211
  ).action(async (opts) => {
5205
5212
  const { defaultRunnerConfigPath } = await import('./config-H4QS332G.js');
5206
- const { buildRepositoryImage, RecipeError } = await import('./build-6WRNZPVR.js');
5213
+ const { buildRepositoryImage, RecipeError } = await import('./build-WHHFA7KM.js');
5207
5214
  const { currentCliBuild } = await import('./cli-build-K56DK4DS.js');
5208
- const { createDockerHost } = await import('./docker-JU422JL7.js');
5209
- const { builderSpec } = await import('./builder-G3MLDMTI.js');
5215
+ const { createDockerHost } = await import('./docker-KMK4LOET.js');
5216
+ const { builderSpec } = await import('./builder-7FBQAWQZ.js');
5210
5217
  const { loadRunnerConfig } = await import('./config-H4QS332G.js');
5211
5218
  const configPath = opts.config ?? defaultRunnerConfigPath();
5212
5219
  const loaded = (() => {
@@ -5218,11 +5225,11 @@ Next:
5218
5225
  })();
5219
5226
  const memory = loaded?.build?.memory ?? "8g";
5220
5227
  try {
5221
- const { ensureRunnerIdentity } = await import('./runner-identity-FTHZFMGY.js');
5228
+ const { ensureRunnerIdentity } = await import('./runner-identity-IIZ3RK7M.js');
5222
5229
  await ensureRunnerIdentity(configPath, { log: (line) => console.error(line) }).catch((err) => {
5223
5230
  console.error(`the runner's Docker identity could not be stored: ${err instanceof Error ? err.message : String(err)}`);
5224
5231
  });
5225
- const { imageTargetFor } = await import('./governing-source-WM736XR4.js');
5232
+ const { imageTargetFor } = await import('./governing-source-EQBKPME7.js');
5226
5233
  const target = await imageTargetFor({ config: loaded, repository: opts.repository, fetchImpl: fetch });
5227
5234
  if (!target.ok) {
5228
5235
  if (opts.json) {
@@ -5286,15 +5293,15 @@ Next:
5286
5293
  });
5287
5294
  runnerCmd.command("stop").description("Take no more work; wait for running jobs to finish, then exit").option("--config <path>", "the cloud config file naming the runner to stop").option("--now", "end running jobs immediately, with outcome stopped").action(async (opts) => {
5288
5295
  const { defaultRunnerConfigPath } = await import('./config-H4QS332G.js');
5289
- const { requestStop } = await import('./loop-P3QDQOE5.js');
5296
+ const { requestStop } = await import('./loop-JPW2QJ64.js');
5290
5297
  const configPath = opts.config ?? defaultRunnerConfigPath();
5291
5298
  await requestStop(configPath, Boolean(opts.now));
5292
5299
  });
5293
5300
  runnerCmd.command("status").description("List running jobs; with --recent, finished ones too").option("--config <path>", "the cloud config file naming the runner to inspect").option("--recent", "also list finished jobs, newest first, capped at 20").option("--json", "machine-readable JSON output").action(async (opts) => {
5294
5301
  const { defaultRunnerConfigPath, loadRunnerConfig } = await import('./config-H4QS332G.js');
5295
5302
  const { jobsDir, runnerDir } = await import('./paths-AKX2OOLF.js');
5296
- const { listJobFiles, runnerProcessState } = await import('./loop-P3QDQOE5.js');
5297
- const { renderStatus } = await import('./status-LXFIVGP3.js');
5303
+ const { listJobFiles, runnerProcessState } = await import('./loop-JPW2QJ64.js');
5304
+ const { renderStatus } = await import('./status-UCQDEMFX.js');
5298
5305
  const { readHousekeepingRecord } = await import('./record-Q4IEYIVV.js');
5299
5306
  const path2 = await import('path');
5300
5307
  const configPath = opts.config ?? defaultRunnerConfigPath();
@@ -5350,7 +5357,7 @@ Next:
5350
5357
  });
5351
5358
  runnerCmd.command("logs").argument("<item>", "the work item's number in the factory").description("Print the newest attempt's log for one item").option("--config <path>", "the cloud config file naming the runner to inspect").option("-f, --follow", "keep printing as the log grows").action(async (itemArg, opts) => {
5352
5359
  const { defaultRunnerConfigPath } = await import('./config-H4QS332G.js');
5353
- const { listJobFiles } = await import('./loop-P3QDQOE5.js');
5360
+ const { listJobFiles } = await import('./loop-JPW2QJ64.js');
5354
5361
  const { newestAttempt, logPathFor, tail, RunnerLogsError } = await import('./logs-N3ZX7HFV.js');
5355
5362
  const configPath = opts.config ?? defaultRunnerConfigPath();
5356
5363
  const item = parseTrackerNumber(itemArg);
@@ -5577,7 +5584,7 @@ Self-host deployments also need --app-id: without a key service to resolve the
5577
5584
  caller from the bearer token, the gateway answers 401 without that header.
5578
5585
  `
5579
5586
  ).action(async (opts) => {
5580
- const { runMcpInstall, handleMcpInstallError, McpInstallError } = await import('./mcp-install-cmd-GD4QUP7Z.js');
5587
+ const { runMcpInstall, handleMcpInstallError, McpInstallError } = await import('./mcp-install-cmd-GGWB3JJ2.js');
5581
5588
  try {
5582
5589
  if (opts.transport !== void 0 && opts.transport !== "stdio" && opts.transport !== "http") {
5583
5590
  throw new McpInstallError(`--transport must be "stdio" or "http", got "${opts.transport}"`);
@@ -5599,7 +5606,7 @@ caller from the bearer token, the gateway answers 401 without that header.
5599
5606
  "after",
5600
5607
  "\nWhat the stdio .mcp.json entry spawns. Reads newline-delimited JSON-RPC 2.0 on\nstdin and writes responses on stdout. The API key comes from OUTERLAYER_API_KEY\nor ~/.outerlayer/config.json at start-up; with neither the command exits 1 and\nprints why, which the MCP client shows as the connect error.\n"
5601
5608
  ).action(async (opts) => {
5602
- const { runMcpServe, handleMcpServeError } = await import('./mcp-serve-cmd-TQSPFRC7.js');
5609
+ const { runMcpServe, handleMcpServeError } = await import('./mcp-serve-cmd-CNRC5AL5.js');
5603
5610
  try {
5604
5611
  await runMcpServe({ url: opts.url, appId: opts.appId });
5605
5612
  } catch (err) {
@@ -5610,7 +5617,7 @@ caller from the bearer token, the gateway answers 401 without that header.
5610
5617
  function registerImportCommands(program2) {
5611
5618
  const importCmd = program2.command("import").description("Import an existing config format into .outerlayer/");
5612
5619
  importCmd.command("ruler").description("Port a .ruler/ tree into the equivalent .outerlayer/ tree").option("--dir <path>", "repo root to read from (default: cwd)").option("--json", "machine-readable JSON output").addHelpText("after", "\nRuler: https://github.com/intellectronica/ruler. Mostly a rename.\n").action(async (opts) => {
5613
- const { runImportRuler, ImportRulerError } = await import('./import-ruler-cmd-T6LLO6Q7.js');
5620
+ const { runImportRuler, ImportRulerError } = await import('./import-ruler-cmd-VJOHOJQ7.js');
5614
5621
  try {
5615
5622
  const result = runImportRuler({ cwd: opts.dir, json: opts.json });
5616
5623
  if (result.exitCode !== 0) process.exitCode = result.exitCode;
@@ -5626,7 +5633,7 @@ function registerImportCommands(program2) {
5626
5633
  "after",
5627
5634
  "\nInstalls the five maintained skills (outerlayer-evidence, outerlayer-amend,\nouterlayer-findings, outerlayer-cli, outerlayer-build) and an AGENTS.md snippet teaching agents to run\n`emit artifact`. A skill that differs from this CLI's bundle is rewritten to it, and the output says so.\n"
5628
5635
  ).action(async (opts) => {
5629
- const { runImportCapture, ImportCaptureError } = await import('./import-capture-cmd-Q56DDZVO.js');
5636
+ const { runImportCapture, ImportCaptureError } = await import('./import-capture-cmd-TCOKNVBM.js');
5630
5637
  try {
5631
5638
  runImportCapture({ cwd: opts.dir, json: opts.json });
5632
5639
  } catch (err) {