@outerlayer/cli 0.19.0 → 0.20.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 (63) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +11 -2
  3. package/dist/{agent-setup-TPR4BBFV.js → agent-setup-AM42SA2D.js} +6 -6
  4. package/dist/build-info.json +1 -1
  5. package/dist/{check-UWQAL2MN.js → check-BR5D27CX.js} +17 -17
  6. package/dist/{chunk-7KSSBQTS.js → chunk-3ZR7Y23Y.js} +2 -2
  7. package/dist/{chunk-ZHAUSEEN.js → chunk-5VML45HH.js} +2 -2
  8. package/dist/{chunk-5MYFOW5V.js → chunk-AD3EYI7P.js} +110 -19
  9. package/dist/{chunk-6U3MV7TZ.js → chunk-B6SCN5NY.js} +6 -6
  10. package/dist/{chunk-DJ3ZUSC3.js → chunk-CGGPS7SI.js} +3 -3
  11. package/dist/{chunk-452TM7J4.js → chunk-EAEELQVQ.js} +2 -2
  12. package/dist/{chunk-HPJNLETG.js → chunk-FBTGMSQF.js} +1 -1
  13. package/dist/{chunk-DADWEUH3.js → chunk-GEMQLBMW.js} +3 -3
  14. package/dist/{chunk-5TN7GLYX.js → chunk-HOKXGFDR.js} +4 -4
  15. package/dist/{chunk-5GHGAF6P.js → chunk-JHGEBPLE.js} +2 -2
  16. package/dist/{chunk-UVG35MWF.js → chunk-LW7G5TJB.js} +1 -1
  17. package/dist/{chunk-6D7GT22T.js → chunk-PIZRPNKR.js} +2 -2
  18. package/dist/{chunk-NFIR3GEE.js → chunk-PSN33ERW.js} +2 -2
  19. package/dist/{chunk-7SJPQWBM.js → chunk-R22NZSGA.js} +2 -2
  20. package/dist/{chunk-XSZD4AZ6.js → chunk-XZ4H4X5F.js} +2 -2
  21. package/dist/{chunk-VRRGENS4.js → chunk-Z7K3L4FC.js} +31 -1
  22. package/dist/{chunk-BWSUPRDK.js → chunk-ZX4I2MEK.js} +1 -1
  23. package/dist/{claude-launcher-FPPHZPMR.js → claude-launcher-J5M44PFS.js} +1 -1
  24. package/dist/{cli-HROW5T7X.js → cli-MKF7TU7X.js} +86 -56
  25. package/dist/{command-OEAV7BVX.js → command-ZQNEPDS6.js} +8 -8
  26. package/dist/connect-cmd-UNYKGDAL.js +1 -1
  27. package/dist/{context-cleanup-HSVYDGMI.js → context-cleanup-CHEWNYU6.js} +3 -1
  28. package/dist/{control-plane-launch-NYVDJESK.js → control-plane-launch-34LNRJWR.js} +5 -5
  29. package/dist/{doctor-23BBJWBX.js → doctor-DHUM5DBB.js} +10 -10
  30. package/dist/{emit-artifact-cmd-O6SCM7TV.js → emit-artifact-cmd-XBHM647X.js} +3 -3
  31. package/dist/{emit-cmd-7SP3I6UZ.js → emit-cmd-W55AEBCA.js} +3 -3
  32. package/dist/{emit-criteria-cmd-LQNERZRV.js → emit-criteria-cmd-UNMWHOUY.js} +40 -5
  33. package/dist/{emit-result-cmd-RUICOKWQ.js → emit-result-cmd-5NZMLCJK.js} +3 -3
  34. package/dist/emit-step-cmd-347XNGPQ.js +1 -1
  35. package/dist/{governing-source-V5EEGPTA.js → governing-source-HAA4OW57.js} +6 -6
  36. package/dist/{hook-fast-YAZG5MDX.js → hook-fast-RL5E5OXE.js} +1 -1
  37. package/dist/index.js +4 -4
  38. package/dist/{init-LWHDMZQG.js → init-V6FOMD2V.js} +9 -9
  39. package/dist/{init-MOINY2DD.js → init-XG47KCI4.js} +9 -9
  40. package/dist/{init-cmd-HSMRID6A.js → init-cmd-Z4O4PPLZ.js} +16 -14
  41. package/dist/{init-update-LWX5MPPR.js → init-update-7DVAKWW3.js} +6 -6
  42. package/dist/{loop-SYYPVFYW.js → loop-EAZQMAE2.js} +17 -17
  43. package/dist/{machine-6X63G2KH.js → machine-TRHBT5NE.js} +8 -8
  44. package/dist/{runner-key-276SJU5R.js → runner-key-5FOWCW7J.js} +9 -9
  45. package/dist/{session-sender-GGIY5OAX.js → session-sender-U2BBUWNO.js} +4 -4
  46. package/dist/{spec-cmd-SIZBRN7D.js → spec-cmd-FVLJOFGC.js} +2 -2
  47. package/dist/starter-pack-6LQVLBIA.js +1 -1
  48. package/dist/{status-NAK6DYSF.js → status-BINH7MBG.js} +11 -11
  49. package/dist/{sync-cmd-G7GF4UTW.js → sync-cmd-VXOUFS4I.js} +3 -3
  50. package/dist/{watch-EVM5GSMP.js → watch-OH645CV2.js} +3 -3
  51. package/dist/{work-claim-cmd-3J3QW56U.js → work-claim-cmd-DRQCHCOK.js} +5 -5
  52. package/dist/{work-cmd-5EPPD33Y.js → work-cmd-5I3J2XQQ.js} +2 -2
  53. package/dist/{work-comment-cmd-2ACOZQAE.js → work-comment-cmd-UCCPWUSR.js} +2 -2
  54. package/dist/{work-logs-cmd-QDD2NMJL.js → work-logs-cmd-7352CJPG.js} +2 -2
  55. package/dist/{work-open-pr-cmd-XNCEI4ZM.js → work-open-pr-cmd-LSH4VHJM.js} +2 -2
  56. package/dist/work-pr-cmd-H4OQR26N.js +1 -1
  57. package/dist/work-stop-cmd-CRDHXQVW.js +52 -0
  58. package/package.json +1 -1
  59. package/dist/{artifact-link-cmd-W7XF5BFB.js → artifact-link-cmd-OWRI5AJX.js} +1 -1
  60. package/dist/{chunk-IXYZUUYQ.js → chunk-7UWVLZXD.js} +1 -1
  61. package/dist/{emit-finding-cmd-AJPKHIOV.js → emit-finding-cmd-7JHVRYOP.js} +1 -1
  62. package/dist/{import-capture-cmd-KKFFOGWP.js → import-capture-cmd-TK4XY7RD.js} +1 -1
  63. package/dist/{import-ruler-cmd-5P6JOXQN.js → import-ruler-cmd-T6LLO6Q7.js} +1 -1
@@ -624,11 +624,11 @@ async function missingControlPlane(cwd, sessionId, home, env) {
624
624
  const dirs = findGitDirs(cwd);
625
625
  if (dirs === void 0) return void 0;
626
626
  if (existsSync(join(dirs.gitCommonDir, "outerlayer", "materialized.json")) || hasExcludeBlock(dirs.gitCommonDir)) {
627
- const { cleanupEarlierCopies } = await import('./context-cleanup-HSVYDGMI.js');
627
+ const { cleanupEarlierCopies } = await import('./context-cleanup-CHEWNYU6.js');
628
628
  cleanupEarlierCopies(dirs);
629
629
  }
630
630
  if (!contextPossiblyGoverned(cwd, home)) return void 0;
631
- const { governanceOf } = await import('./control-plane-launch-NYVDJESK.js');
631
+ const { governanceOf } = await import('./control-plane-launch-34LNRJWR.js');
632
632
  if (await governanceOf({ cwd, env, home }) !== "governed") return void 0;
633
633
  recordMissingContext(dirs, sessionId, home);
634
634
  const launcher = `${cliInvocation()} claude`;
@@ -4,7 +4,7 @@ import { uploadSpooledSteps } from './chunk-KYS3TQAG.js';
4
4
  import { LaunchFilter } from './chunk-ESVW4MJY.js';
5
5
  import { RepoFilter } from './chunk-TBT347UY.js';
6
6
  import { migrateLegacyArtifactSidecars, planArtifactUpload, artifactsStatePath, sanitizeTerminal, acquireArtifactSpoolLock, artifactBlobsDir, resolveArtifactTurnIndex, isArtifactTombstoned, ARTIFACT_RETRY_MAX_AGE_MS, writeArtifactSpoolState, reclaimUnneededArtifactBlobs, neededArtifactShas } from './chunk-G3IJ3N6F.js';
7
- import { writeSyncStatus, spoolDir } from './chunk-NFIR3GEE.js';
7
+ import { writeSyncStatus, spoolDir } from './chunk-PSN33ERW.js';
8
8
  import { hookExecSpoolPath } from './chunk-F7CU5ABH.js';
9
9
  import { applyReportedCost } from './chunk-BKO6JEZI.js';
10
10
  import { setCustomScrubbers, setLocalIdentity, tailTranscript, enrichSessionRepo, scanAll, setRepoRoot, resolveRepoIdentity, sessionIdFromPath, scrubDeep, SOURCE_ADAPTERS } from './chunk-QNLX477Q.js';
@@ -14,10 +14,10 @@ import { defaultFetch } from './chunk-FVMYKL6L.js';
14
14
  import { resolveGatewayCredentials, unauthorizedMessage } from './chunk-NTRCK4NH.js';
15
15
  import { readLatestProvenanceForSession, readContextProvenance } from './chunk-ZJSNLVCE.js';
16
16
  import { readRepoConnection, findGitDirs } from './chunk-BJ3KTMDH.js';
17
- import { CAPTURE_TIERS, inferArtifactKind, bannedPathsForTier, downconvertSession, isHumanUserTurn, turnCountBound, EVENT_TYPES } from './chunk-7VUK5RFS.js';
18
17
  import { readCloudConfig, cloudConfigPath, writeCloudConfig } from './chunk-EABW6AJQ.js';
19
18
  import { cliInvocation } from './chunk-CRB3POP4.js';
20
19
  import { removeJournalHooks } from './chunk-TUSYOL2O.js';
20
+ import { CAPTURE_TIERS, inferArtifactKind, bannedPathsForTier, downconvertSession, isHumanUserTurn, turnCountBound, EVENT_TYPES } from './chunk-7VUK5RFS.js';
21
21
  import { homeFromEnv } from './chunk-VNVZDWO3.js';
22
22
  import { signerFor, signRunnerRequest } from './chunk-M2ZWWTWZ.js';
23
23
  import { dirname, basename, join } from 'path';
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { WorkCommandError, postJson } from './chunk-HPJNLETG.js';
3
+ import { WorkCommandError, postJson } from './chunk-FBTGMSQF.js';
4
4
  import { composeDelivery } from './chunk-LLM3I5YU.js';
5
- import { defaultGitRunner, materializeContext, isStagingWriteFault, lookupGoverningSource } from './chunk-452TM7J4.js';
5
+ import { defaultGitRunner, materializeContext, isStagingWriteFault, lookupGoverningSource } from './chunk-EAEELQVQ.js';
6
6
  import { signingFetchFor } from './chunk-FVMYKL6L.js';
7
7
  import { SHIM_SCRIPT } from './chunk-G2YNJIGF.js';
8
8
  import { readDegraded, readContextManifest, readSourceCache } from './chunk-YQR6E6OV.js';
@@ -2,6 +2,7 @@
2
2
  import { createRequire } from 'node:module';
3
3
  import { readContextManifest, removeContextManifest } from './chunk-YQR6E6OV.js';
4
4
  import { removePreCommitGuardHook } from './chunk-TUSYOL2O.js';
5
+ import { CONTEXT_PIN_FILENAME } from './chunk-WFSUUUAN.js';
5
6
  import { execFileSync } from 'child_process';
6
7
  import { existsSync, unlinkSync, lstatSync, readdirSync, rmdirSync, readFileSync, mkdirSync, writeFileSync } from 'fs';
7
8
  import { join, dirname, isAbsolute } from 'path';
@@ -92,6 +93,34 @@ function trackedPaths(repoRoot) {
92
93
  return void 0;
93
94
  }
94
95
  }
96
+ function isPin(text) {
97
+ try {
98
+ const value = JSON.parse(text);
99
+ if (typeof value !== "object" || value === null || Array.isArray(value)) return false;
100
+ const { schemaVersion, sha, ...rest } = value;
101
+ return Object.keys(rest).length === 0 && typeof schemaVersion === "number" && typeof sha === "string" && /^[0-9a-f]{40}$/.test(sha);
102
+ } catch {
103
+ return false;
104
+ }
105
+ }
106
+ function pinMayDiffer(repoRoot, args) {
107
+ try {
108
+ execFileSync("git", ["diff", "--quiet", ...args, "--", CONTEXT_PIN_FILENAME], { cwd: repoRoot, stdio: "ignore", timeout: 5e3 });
109
+ return false;
110
+ } catch {
111
+ return true;
112
+ }
113
+ }
114
+ function restorePin(repoRoot) {
115
+ try {
116
+ if (!isPin(readFileSync(join(repoRoot, CONTEXT_PIN_FILENAME), "utf8"))) return false;
117
+ if (pinMayDiffer(repoRoot, ["--cached"]) || !pinMayDiffer(repoRoot, [])) return false;
118
+ execFileSync("git", ["checkout", "--", CONTEXT_PIN_FILENAME], { cwd: repoRoot, stdio: "ignore", timeout: 5e3 });
119
+ return true;
120
+ } catch {
121
+ return false;
122
+ }
123
+ }
95
124
  function pruneEmptyDirs(start, root) {
96
125
  let current = start;
97
126
  while (current !== root && current.startsWith(root)) {
@@ -106,7 +135,7 @@ function pruneEmptyDirs(start, root) {
106
135
  }
107
136
  function cleanupEarlierCopies(input) {
108
137
  const { repoRoot, gitCommonDir } = input;
109
- const result = { removedFiles: [], excludeRemoved: false, guardRemoved: false };
138
+ const result = { removedFiles: [], excludeRemoved: false, guardRemoved: false, pinRestored: false };
110
139
  if (!hasEarlierCopies(gitCommonDir)) return result;
111
140
  let complete = true;
112
141
  try {
@@ -132,6 +161,7 @@ function cleanupEarlierCopies(input) {
132
161
  return result;
133
162
  }
134
163
  if (!complete) return result;
164
+ result.pinRestored = restorePin(repoRoot);
135
165
  try {
136
166
  result.guardRemoved = removePreCommitGuardHook(repoRoot).removed;
137
167
  result.excludeRemoved = removeContextExcludes(gitCommonDir).changed;
@@ -4,6 +4,6 @@ import { createRequire } from 'node:module';
4
4
  createRequire(import.meta.url);
5
5
 
6
6
  // src/runner/protocol.ts
7
- var RUNNER_PROTOCOL = 20;
7
+ var RUNNER_PROTOCOL = 21;
8
8
 
9
9
  export { RUNNER_PROTOCOL };
@@ -88,7 +88,7 @@ async function runClaudeLauncher(args, deps = {}) {
88
88
  return 1;
89
89
  }
90
90
  } else {
91
- const { resolveLaunchPlane } = await import('./control-plane-launch-NYVDJESK.js');
91
+ const { resolveLaunchPlane } = await import('./control-plane-launch-34LNRJWR.js');
92
92
  const plane = await resolveLaunchPlane({ cwd, env, home: homeFromEnv(env), fetchImpl: deps.fetchImpl, stderr });
93
93
  if (plane.kind === "none") return run(claude, args, env, cwd, stderr);
94
94
  if (plane.kind === "refused") {
@@ -1,13 +1,13 @@
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-5TN7GLYX.js';
3
+ import { gatherDoctorChecks, doctorExitCode, summarizeChecks, renderDoctorText, recordWrapped, recordUnwrapped, recordRemoval, readManifest, recordInstall, recordStatusline } from './chunk-HOKXGFDR.js';
4
4
  import './chunk-TWF3RICI.js';
5
- import { verifiedTrackerNames, TRACKERS } from './chunk-HPJNLETG.js';
5
+ import { verifiedTrackerNames, TRACKERS } from './chunk-FBTGMSQF.js';
6
6
  import './chunk-IF2OSI5T.js';
7
7
  import './chunk-CG36IONK.js';
8
8
  import './chunk-G3IJ3N6F.js';
9
9
  import './chunk-BM63HB2M.js';
10
- import { hookFiredMarkerPath, installedCliDistDir } from './chunk-NFIR3GEE.js';
10
+ import { hookFiredMarkerPath, installedCliDistDir } from './chunk-PSN33ERW.js';
11
11
  import './chunk-DSF2FWAZ.js';
12
12
  import './chunk-BKO6JEZI.js';
13
13
  import './chunk-QNLX477Q.js';
@@ -17,19 +17,19 @@ import './chunk-GOSFARMS.js';
17
17
  import { C, warnDeprecated, API_KEY_FLAG_DEPRECATION, NO_COLOR_FLAG, stripNoColor } from './chunk-ANPNT6PM.js';
18
18
  import { parseTrackerNumber, trackerNumberError } from './chunk-WZBHBH3J.js';
19
19
  import { settingsPath, readSettings, SettingsParseError, listHookCandidates, wrapHooks, writeSettings, unwrapHooks, REGISTERED_EVENTS, cliCommand, removeHooks, removeStatusline, cliBinResolvable, mergeHooks, repointWrappedHooks, AUTO_WRAP_EVENTS, mergeStatusline } from './chunk-5QRP3MVS.js';
20
- import './chunk-IXYZUUYQ.js';
20
+ import './chunk-7UWVLZXD.js';
21
21
  import './chunk-FVMYKL6L.js';
22
22
  import './chunk-NTRCK4NH.js';
23
23
  import './chunk-ZJSNLVCE.js';
24
24
  import { findGitDirs } from './chunk-BJ3KTMDH.js';
25
25
  import './chunk-G2YNJIGF.js';
26
26
  import './chunk-NNLA7LLQ.js';
27
- import './chunk-WFSUUUAN.js';
28
- import './chunk-7VUK5RFS.js';
29
27
  import './chunk-EABW6AJQ.js';
30
28
  import { cliInvocation, packageRunnerOf } from './chunk-CRB3POP4.js';
31
29
  import { cloneIsGoverned } from './chunk-YQR6E6OV.js';
32
30
  import { removeJournalHooks, removePreCommitGuardHook } from './chunk-TUSYOL2O.js';
31
+ import './chunk-WFSUUUAN.js';
32
+ import './chunk-7VUK5RFS.js';
33
33
  import { homeFromEnv } from './chunk-VNVZDWO3.js';
34
34
  import { resolveVersion } from './chunk-RA3O54FC.js';
35
35
  import './chunk-M2ZWWTWZ.js';
@@ -3843,7 +3843,7 @@ states under Starter files.
3843
3843
  `
3844
3844
  ).action(async (opts) => {
3845
3845
  if (opts.update || opts.dryRun) {
3846
- const { runInitUpdate, formatInitUpdate, updateFlagProblem } = await import('./init-update-LWX5MPPR.js');
3846
+ const { runInitUpdate, formatInitUpdate, updateFlagProblem } = await import('./init-update-7DVAKWW3.js');
3847
3847
  const problem = updateFlagProblem(opts);
3848
3848
  if (problem !== void 0) {
3849
3849
  fail(problem);
@@ -3890,11 +3890,12 @@ states under Starter files.
3890
3890
  if (changed.length > 0 && !opts.json) process.stdout.write(`Removed the claude function from ${changed.join(", ")}.
3891
3891
  `);
3892
3892
  }
3893
- if (opts.json) writeJson(outcome.result);
3894
- else process.stdout.write(outcome.text);
3893
+ const shell = !opts.remove && opts.shellFunction !== void 0 ? (await import('./init-cmd-Z4O4PPLZ.js')).applyShellFunctionFlag(opts.shellFunction, { home: homeFromEnv(), shellPath: process.env.SHELL }) : void 0;
3894
+ if (opts.json) writeJson(shell === void 0 ? outcome.result : { ...outcome.result, shellFunction: { outcome: shell.outcome, reason: shell.reason } });
3895
+ else process.stdout.write(outcome.text + (shell?.text ?? ""));
3895
3896
  return;
3896
3897
  }
3897
- const { runInitCommand } = await import('./init-cmd-HSMRID6A.js');
3898
+ const { runInitCommand } = await import('./init-cmd-Z4O4PPLZ.js');
3898
3899
  const code = await runInitCommand(
3899
3900
  { json: opts.json, factory: opts.factory, shellFunction: opts.shellFunction },
3900
3901
  {
@@ -3906,7 +3907,7 @@ states under Starter files.
3906
3907
  return { ok, text, detail };
3907
3908
  },
3908
3909
  runAgentSetup: async () => {
3909
- const { runAgentSetup } = await import('./agent-setup-TPR4BBFV.js');
3910
+ const { runAgentSetup } = await import('./agent-setup-AM42SA2D.js');
3910
3911
  return runAgentSetup({ cwd: process.cwd() });
3911
3912
  },
3912
3913
  runDoctorChecks: gatherDoctorChecks,
@@ -4026,13 +4027,13 @@ code is 1: revoke the token on /profile/security.
4026
4027
  "\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"
4027
4028
  ).action(async (opts) => {
4028
4029
  if (opts.link !== void 0) {
4029
- const { lookupArtifactLink } = await import('./artifact-link-cmd-W7XF5BFB.js');
4030
+ const { lookupArtifactLink } = await import('./artifact-link-cmd-OWRI5AJX.js');
4030
4031
  const found = lookupArtifactLink(opts.link);
4031
4032
  if (found.ok) process.stdout.write(found.url + "\n");
4032
4033
  else fail(found.reason);
4033
4034
  return;
4034
4035
  }
4035
- const { runSync, SyncConfigError, SyncTransportError } = await import('./sync-cmd-G7GF4UTW.js');
4036
+ const { runSync, SyncConfigError, SyncTransportError } = await import('./sync-cmd-VXOUFS4I.js');
4036
4037
  try {
4037
4038
  const result = await runSync({
4038
4039
  url: opts.url,
@@ -4063,7 +4064,7 @@ code is 1: revoke the token on /profile/security.
4063
4064
  if (invokedCommandToken(argv) === "watch") {
4064
4065
  warnDeprecated(`\`${cliInvocation()} watch\` is now \`${cliInvocation()} daemon\`; the old name will be removed in a future release.`);
4065
4066
  }
4066
- const { runWatch } = await import('./watch-EVM5GSMP.js');
4067
+ const { runWatch } = await import('./watch-OH645CV2.js');
4067
4068
  await runWatch({ once: opts.once });
4068
4069
  });
4069
4070
  program2.command("hook <event>", { hidden: true }).description("capture-hook fast path, installed by `init`").action(() => {
@@ -4119,7 +4120,7 @@ code is 1: revoke the token on /profile/security.
4119
4120
  }
4120
4121
  });
4121
4122
  program2.command("session-sender", { hidden: true }).description("stream a runner build's sessions to its work item while the build runs").action(async () => {
4122
- const { runSessionSender } = await import('./session-sender-GGIY5OAX.js');
4123
+ const { runSessionSender } = await import('./session-sender-U2BBUWNO.js');
4123
4124
  try {
4124
4125
  await runSessionSender();
4125
4126
  } catch (err) {
@@ -4155,7 +4156,7 @@ async function runCli(processArgv) {
4155
4156
  await buildProgram(argv).parseAsync(argv);
4156
4157
  }
4157
4158
  async function compileContext(opts) {
4158
- const { runEmit, EmitError } = await import('./emit-cmd-7SP3I6UZ.js');
4159
+ const { runEmit, EmitError } = await import('./emit-cmd-W55AEBCA.js');
4159
4160
  try {
4160
4161
  const result = runEmit({ cwd: opts.dir, check: opts.check, json: opts.json });
4161
4162
  if (result.exitCode !== 0) process.exitCode = result.exitCode;
@@ -4202,7 +4203,7 @@ Compiling .outerlayer/ moved to \`${cliInvocation()} context emit\`.
4202
4203
  await compileContext({ dir: opts.dir, check: opts.check, json: opts.json });
4203
4204
  return;
4204
4205
  }
4205
- const { runEmitResult, EmitResultError } = await import('./emit-result-cmd-RUICOKWQ.js');
4206
+ const { runEmitResult, EmitResultError } = await import('./emit-result-cmd-5NZMLCJK.js');
4206
4207
  try {
4207
4208
  const result = await runEmitResult({
4208
4209
  name,
@@ -4252,7 +4253,7 @@ everywhere, bytes and deep link untouched; a still-queued one is cancelled
4252
4253
  locally so it never uploads. One correction can retire several duplicates.
4253
4254
  `
4254
4255
  ).action(async (file, opts) => {
4255
- const { runEmitArtifact, EmitArtifactError } = await import('./emit-artifact-cmd-O6SCM7TV.js');
4256
+ const { runEmitArtifact, EmitArtifactError } = await import('./emit-artifact-cmd-XBHM647X.js');
4256
4257
  let pr;
4257
4258
  if (opts.pr !== void 0) {
4258
4259
  pr = parseTrackerNumber(opts.pr);
@@ -4311,7 +4312,7 @@ recent events with their ids. --find <text> searches all of them.
4311
4312
  item that session was launched for is used automatically.
4312
4313
  `
4313
4314
  ).action(async (opts) => {
4314
- const { runEmitFinding, refuseRemovedFindingFlags, EmitFindingError } = await import('./emit-finding-cmd-AJPKHIOV.js');
4315
+ const { runEmitFinding, refuseRemovedFindingFlags, EmitFindingError } = await import('./emit-finding-cmd-7JHVRYOP.js');
4315
4316
  try {
4316
4317
  refuseRemovedFindingFlags(opts);
4317
4318
  const result = await runEmitFinding({
@@ -4378,7 +4379,7 @@ the whole batch. "untimed": true records one with no time on purpose.
4378
4379
  that session was launched for is used automatically.
4379
4380
  `
4380
4381
  ).action(async (file, opts) => {
4381
- const { runEmitFindings, EmitFindingError } = await import('./emit-finding-cmd-AJPKHIOV.js');
4382
+ const { runEmitFindings, EmitFindingError } = await import('./emit-finding-cmd-7JHVRYOP.js');
4382
4383
  try {
4383
4384
  const result = await runEmitFindings({
4384
4385
  file,
@@ -4431,7 +4432,7 @@ the step, the command prints why and exits 1.
4431
4432
  throw err;
4432
4433
  }
4433
4434
  });
4434
- emitCmd.command("criteria <file>").description("Record a work item's acceptance criteria from a JSON file (- for stdin)").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(
4435
+ emitCmd.command("criteria <file>").description("Record a work item's acceptance criteria from a JSON or acceptance .md file").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(
4435
4436
  "after",
4436
4437
  `
4437
4438
  ${cliInvocation()} emit criteria criteria.json --item 412
@@ -4449,9 +4450,14 @@ Once an item has a list, only a person can replace it: run the command outside a
4449
4450
  agent session, with your own login. A key bound to no member cannot replace it either.
4450
4451
  --item names the work item; without it, inside a recorded session, the item that
4451
4452
  session was launched for is used automatically.
4453
+
4454
+ A file ending in .md is read as an acceptance file, such as acceptance/412-login.md:
4455
+ each list item that opens with an id in backticks is a criterion, its text is the rest
4456
+ of the item, and a (proof: <kind>) annotation names its proof.
4457
+ ${cliInvocation()} emit criteria acceptance/412-login.md --item 412
4452
4458
  `
4453
4459
  ).action(async (file, opts) => {
4454
- const { runEmitCriteria, EmitCriteriaError } = await import('./emit-criteria-cmd-LQNERZRV.js');
4460
+ const { runEmitCriteria, EmitCriteriaError } = await import('./emit-criteria-cmd-UNMWHOUY.js');
4455
4461
  try {
4456
4462
  const result = await runEmitCriteria({
4457
4463
  file,
@@ -4475,9 +4481,9 @@ function registerSpecCommands(program2) {
4475
4481
  const specCmd = program2.command("spec").description("Find, file and edit the issue a spec lives in, in your factory's tracker");
4476
4482
  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)");
4477
4483
  const run = async (action) => {
4478
- const { WorkCommandError } = await import('./work-cmd-5EPPD33Y.js');
4484
+ const { WorkCommandError } = await import('./work-cmd-5I3J2XQQ.js');
4479
4485
  try {
4480
- await action(await import('./spec-cmd-SIZBRN7D.js'));
4486
+ await action(await import('./spec-cmd-FVLJOFGC.js'));
4481
4487
  } catch (err) {
4482
4488
  if (err instanceof WorkCommandError) {
4483
4489
  fail(err.message);
@@ -4518,7 +4524,7 @@ takes it, and prints the line that starts your session on it. That
4518
4524
  session links itself and holds the item's lease while it works.
4519
4525
  `
4520
4526
  ).action(async (opts) => {
4521
- const { runWorkBuild, WorkCommandError } = await import('./work-cmd-5EPPD33Y.js');
4527
+ const { runWorkBuild, WorkCommandError } = await import('./work-cmd-5I3J2XQQ.js');
4522
4528
  try {
4523
4529
  await runWorkBuild(opts);
4524
4530
  } catch (err) {
@@ -4541,7 +4547,7 @@ renews that session's own 20-minute lease, unless --no-lease or
4541
4547
  --ended is given, or another worker already holds a live one.
4542
4548
  `
4543
4549
  ).action(async (number, opts) => {
4544
- const { runWorkLinkSession, WorkCommandError } = await import('./work-cmd-5EPPD33Y.js');
4550
+ const { runWorkLinkSession, WorkCommandError } = await import('./work-cmd-5I3J2XQQ.js');
4545
4551
  try {
4546
4552
  await runWorkLinkSession({ ...opts, number, noLease: opts.lease === false, logFailures: opts.logFailures === true });
4547
4553
  } catch (err) {
@@ -4565,8 +4571,8 @@ criterion's new proof; --ready hands the thread back to a person. At
4565
4571
  most one action flag may be given.
4566
4572
  `
4567
4573
  ).action(async (opts) => {
4568
- const { runWorkComment, WorkCommentCommandError } = await import('./work-comment-cmd-2ACOZQAE.js');
4569
- const { WorkCommandError } = await import('./work-cmd-5EPPD33Y.js');
4574
+ const { runWorkComment, WorkCommentCommandError } = await import('./work-comment-cmd-UCCPWUSR.js');
4575
+ const { WorkCommandError } = await import('./work-cmd-5I3J2XQQ.js');
4570
4576
  try {
4571
4577
  await runWorkComment(opts);
4572
4578
  } catch (err) {
@@ -4587,8 +4593,8 @@ criterion that carries proof or a comment, each with who is waiting
4587
4593
  on whom next.
4588
4594
  `
4589
4595
  ).action(async (opts) => {
4590
- const { runWorkThreads, WorkCommentCommandError } = await import('./work-comment-cmd-2ACOZQAE.js');
4591
- const { WorkCommandError } = await import('./work-cmd-5EPPD33Y.js');
4596
+ const { runWorkThreads, WorkCommentCommandError } = await import('./work-comment-cmd-UCCPWUSR.js');
4597
+ const { WorkCommandError } = await import('./work-cmd-5I3J2XQQ.js');
4592
4598
  try {
4593
4599
  await runWorkThreads(opts);
4594
4600
  } catch (err) {
@@ -4612,8 +4618,8 @@ still running, or that an older runner released, has no log and the
4612
4618
  command exits 1.
4613
4619
  `
4614
4620
  ).action(async (opts) => {
4615
- const { runWorkLogs, WorkLogsCommandError } = await import('./work-logs-cmd-QDD2NMJL.js');
4616
- const { WorkCommandError } = await import('./work-cmd-5EPPD33Y.js');
4621
+ const { runWorkLogs, WorkLogsCommandError } = await import('./work-logs-cmd-7352CJPG.js');
4622
+ const { WorkCommandError } = await import('./work-cmd-5I3J2XQQ.js');
4617
4623
  try {
4618
4624
  await runWorkLogs(opts);
4619
4625
  } catch (err) {
@@ -4624,6 +4630,30 @@ command exits 1.
4624
4630
  throw err;
4625
4631
  }
4626
4632
  });
4633
+ workCmd.command("stop").description("Stop the host build running on a work item").requiredOption("--item <number>", "the item's number inside this factory").option("--note <text>", "why the build is stopped (up to 500 characters); kept with the attempt").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(
4634
+ "after",
4635
+ `
4636
+ ${cliInvocation()} work stop --item 7
4637
+ ${cliInvocation()} work stop --item 7 --note "wrong branch"
4638
+
4639
+ Asks the host that holds the item's build to end it. The host reads the
4640
+ request at its next heartbeat, so the build may run a little longer. The
4641
+ item is not built again until a new build request. Exits 1 when no host
4642
+ build is running for the item.
4643
+ `
4644
+ ).action(async (opts) => {
4645
+ const { runWorkStop, WorkStopCommandError } = await import('./work-stop-cmd-CRDHXQVW.js');
4646
+ const { WorkCommandError } = await import('./work-cmd-5I3J2XQQ.js');
4647
+ try {
4648
+ await runWorkStop(opts);
4649
+ } catch (err) {
4650
+ if (err instanceof WorkStopCommandError || err instanceof WorkCommandError) {
4651
+ fail(err.message);
4652
+ return;
4653
+ }
4654
+ throw err;
4655
+ }
4656
+ });
4627
4657
  workCmd.command("remove").description("Withdraw a source's addition \u2014 never deletes the item").option("--item <number>", "the item's number inside this factory").option("--issue <number>", "issue number or Linear/Jira key (default: named by --item instead)").option(TRACKER_OPTION_FLAG, "tracker for a keyed --issue, when both hold the key").option("--repo <owner/name>", "repository for an issue number (default: the checkout's remote)").requiredOption("--reason <text>", "why this source is no longer working on it").option("--json", "machine-readable JSON output").option("--url <url>", "cloud base URL (or OUTERLAYER_URL / config)").addOption(apiKeyOption()).option("--app-id <id>", "factory id the key is bound to (or OUTERLAYER_APP_ID / config)").addHelpText(
4628
4658
  "after",
4629
4659
  `
@@ -4634,7 +4664,7 @@ deletes anything \u2014 the item is removed from Work only once no
4634
4664
  live addition remains on it.
4635
4665
  `
4636
4666
  ).action(async (opts) => {
4637
- const { runWorkRemove, WorkCommandError } = await import('./work-cmd-5EPPD33Y.js');
4667
+ const { runWorkRemove, WorkCommandError } = await import('./work-cmd-5I3J2XQQ.js');
4638
4668
  try {
4639
4669
  await runWorkRemove(opts);
4640
4670
  } catch (err) {
@@ -4646,7 +4676,7 @@ live addition remains on it.
4646
4676
  }
4647
4677
  });
4648
4678
  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) => {
4649
- const { runWorkStatus, WorkCommandError } = await import('./work-cmd-5EPPD33Y.js');
4679
+ const { runWorkStatus, WorkCommandError } = await import('./work-cmd-5I3J2XQQ.js');
4650
4680
  try {
4651
4681
  await runWorkStatus(opts);
4652
4682
  } catch (err) {
@@ -4658,7 +4688,7 @@ live addition remains on it.
4658
4688
  }
4659
4689
  });
4660
4690
  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) => {
4661
- const { runWorkList, WorkCommandError } = await import('./work-cmd-5EPPD33Y.js');
4691
+ const { runWorkList, WorkCommandError } = await import('./work-cmd-5I3J2XQQ.js');
4662
4692
  try {
4663
4693
  await runWorkList(opts);
4664
4694
  } catch (err) {
@@ -4679,7 +4709,7 @@ by a different key is refused; claiming again with the same key extends
4679
4709
  it. --host is a label only.
4680
4710
  `
4681
4711
  ).action(async (opts) => {
4682
- const { runWorkClaim, WorkCommandError } = await import('./work-claim-cmd-3J3QW56U.js');
4712
+ const { runWorkClaim, WorkCommandError } = await import('./work-claim-cmd-DRQCHCOK.js');
4683
4713
  try {
4684
4714
  await runWorkClaim(opts);
4685
4715
  } catch (err) {
@@ -4699,7 +4729,7 @@ Extends the live lease this API key holds. Refused with a 410 if the
4699
4729
  lease has expired, or a 403 if a different key holds it.
4700
4730
  `
4701
4731
  ).action(async (opts) => {
4702
- const { runWorkRenew, WorkCommandError } = await import('./work-claim-cmd-3J3QW56U.js');
4732
+ const { runWorkRenew, WorkCommandError } = await import('./work-claim-cmd-DRQCHCOK.js');
4703
4733
  try {
4704
4734
  await runWorkRenew(opts);
4705
4735
  } catch (err) {
@@ -4731,7 +4761,7 @@ applies to a host's lease only. A later tool call in the session
4731
4761
  takes the lease again.
4732
4762
  `
4733
4763
  ).action(async (opts) => {
4734
- const { runWorkRelease, WorkCommandError } = await import('./work-claim-cmd-3J3QW56U.js');
4764
+ const { runWorkRelease, WorkCommandError } = await import('./work-claim-cmd-DRQCHCOK.js');
4735
4765
  try {
4736
4766
  await runWorkRelease(opts);
4737
4767
  } catch (err) {
@@ -4783,8 +4813,8 @@ login, then declares the pull request on the item, as \`work pr\` does.
4783
4813
  Run it again after a change to the title or description.
4784
4814
  `
4785
4815
  ).action(async (opts) => {
4786
- const { runWorkOpenPr, WorkOpenPrCommandError } = await import('./work-open-pr-cmd-XNCEI4ZM.js');
4787
- const { WorkCommandError } = await import('./work-cmd-5EPPD33Y.js');
4816
+ const { runWorkOpenPr, WorkOpenPrCommandError } = await import('./work-open-pr-cmd-LSH4VHJM.js');
4817
+ const { WorkCommandError } = await import('./work-cmd-5I3J2XQQ.js');
4788
4818
  try {
4789
4819
  await runWorkOpenPr(opts);
4790
4820
  } catch (err) {
@@ -4801,7 +4831,7 @@ function registerRunnerCommands(program2) {
4801
4831
  const configOption = "the cloud config file to run against (default: ~/.outerlayer/config.json)";
4802
4832
  runnerCmd.command("start").description("Run the loop: claim work, run it, report, clean up, repeat").option("--config <path>", configOption).action(async (opts) => {
4803
4833
  const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-CLSGABD5.js');
4804
- const { start, RunnerStartError } = await import('./loop-SYYPVFYW.js');
4834
+ const { start, RunnerStartError } = await import('./loop-EAZQMAE2.js');
4805
4835
  const { RunnerAlreadyRunningError } = await import('./pidfile-3DM4OBKO.js');
4806
4836
  const configPath = opts.config ?? defaultRunnerConfigPath();
4807
4837
  try {
@@ -4817,7 +4847,7 @@ function registerRunnerCommands(program2) {
4817
4847
  });
4818
4848
  runnerCmd.command("check").description("Validate the config, the hooks and the key, and print the effective settings").option("--config <path>", configOption).action(async (opts) => {
4819
4849
  const { defaultRunnerConfigPath } = await import('./config-CLSGABD5.js');
4820
- const { runRunnerCheck } = await import('./check-UWQAL2MN.js');
4850
+ const { runRunnerCheck } = await import('./check-BR5D27CX.js');
4821
4851
  const configPath = opts.config ?? defaultRunnerConfigPath();
4822
4852
  const result = await runRunnerCheck(configPath);
4823
4853
  if (!result.ok) {
@@ -4846,7 +4876,7 @@ function registerRunnerCommands(program2) {
4846
4876
  }
4847
4877
  try {
4848
4878
  if (opts.service === true) {
4849
- const { installServiceCommand } = await import('./command-OEAV7BVX.js');
4879
+ const { installServiceCommand } = await import('./command-ZQNEPDS6.js');
4850
4880
  const result2 = await installServiceCommand({
4851
4881
  configPath,
4852
4882
  print: opts.print,
@@ -4902,7 +4932,7 @@ To keep it running, run ${C.yellow}${cliInvocation()} runner install --service${
4902
4932
  return;
4903
4933
  }
4904
4934
  const { defaultRunnerConfigPath } = await import('./config-CLSGABD5.js');
4905
- const { uninstallServiceCommand } = await import('./command-OEAV7BVX.js');
4935
+ const { uninstallServiceCommand } = await import('./command-ZQNEPDS6.js');
4906
4936
  const result = await uninstallServiceCommand({ configPath: opts.config ?? defaultRunnerConfigPath(), unitName: opts.unitName, home: homeFromEnv() });
4907
4937
  if (result.ok) for (const line of result.lines) process.stdout.write(`${C.green}\u2713${C.reset} ${line}
4908
4938
  `);
@@ -4930,10 +4960,10 @@ already in runner.env is used.
4930
4960
  `
4931
4961
  ).action(async (opts) => {
4932
4962
  const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-CLSGABD5.js');
4933
- const { prepareRunnerInit, runRunnerInit, RunnerInitError, writeRunnerInit } = await import('./init-MOINY2DD.js');
4934
- const { obtainRunnerKey, runnerKeyLogin } = await import('./runner-key-276SJU5R.js');
4935
- const { detectMachine } = await import('./machine-6X63G2KH.js');
4936
- const { chooseVm, runVmInit, VmInitError } = await import('./init-LWHDMZQG.js');
4963
+ const { prepareRunnerInit, runRunnerInit, RunnerInitError, writeRunnerInit } = await import('./init-XG47KCI4.js');
4964
+ const { obtainRunnerKey, runnerKeyLogin } = await import('./runner-key-5FOWCW7J.js');
4965
+ const { detectMachine } = await import('./machine-TRHBT5NE.js');
4966
+ const { chooseVm, runVmInit, VmInitError } = await import('./init-V6FOMD2V.js');
4937
4967
  const { AGENT_COMMANDS, credentialFromStdin, isAgentName, restartForCredential, RunnerEnvError } = await import('./runner-env-FRZFFHDF.js');
4938
4968
  const configPath = opts.config ?? defaultRunnerConfigPath();
4939
4969
  if (opts.agent !== void 0 && !isAgentName(opts.agent)) {
@@ -5084,7 +5114,7 @@ ${C.yellow}The runner will not update itself: ${installErr.message}${C.reset}
5084
5114
  let serviceUp = false;
5085
5115
  let restart;
5086
5116
  if (installedLayout) {
5087
- const { installServiceCommand } = await import('./command-OEAV7BVX.js');
5117
+ const { installServiceCommand } = await import('./command-ZQNEPDS6.js');
5088
5118
  const service = await installServiceCommand({
5089
5119
  configPath,
5090
5120
  entryPath: process.argv[1] ?? "",
@@ -5144,7 +5174,7 @@ Next:
5144
5174
  })();
5145
5175
  const memory = loaded?.build?.memory ?? "8g";
5146
5176
  try {
5147
- const { imageTargetFor } = await import('./governing-source-V5EEGPTA.js');
5177
+ const { imageTargetFor } = await import('./governing-source-HAA4OW57.js');
5148
5178
  const target = await imageTargetFor({ config: loaded, repository: opts.repository, fetchImpl: fetch });
5149
5179
  if (!target.ok) {
5150
5180
  if (opts.json) {
@@ -5208,15 +5238,15 @@ Next:
5208
5238
  });
5209
5239
  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) => {
5210
5240
  const { defaultRunnerConfigPath } = await import('./config-CLSGABD5.js');
5211
- const { requestStop } = await import('./loop-SYYPVFYW.js');
5241
+ const { requestStop } = await import('./loop-EAZQMAE2.js');
5212
5242
  const configPath = opts.config ?? defaultRunnerConfigPath();
5213
5243
  await requestStop(configPath, Boolean(opts.now));
5214
5244
  });
5215
5245
  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) => {
5216
5246
  const { defaultRunnerConfigPath, loadRunnerConfig } = await import('./config-CLSGABD5.js');
5217
5247
  const { jobsDir, runnerDir } = await import('./paths-7XP63OAX.js');
5218
- const { listJobFiles, runnerProcessState } = await import('./loop-SYYPVFYW.js');
5219
- const { renderStatus } = await import('./status-NAK6DYSF.js');
5248
+ const { listJobFiles, runnerProcessState } = await import('./loop-EAZQMAE2.js');
5249
+ const { renderStatus } = await import('./status-BINH7MBG.js');
5220
5250
  const { readHousekeepingRecord } = await import('./record-3WP6V2K5.js');
5221
5251
  const path2 = await import('path');
5222
5252
  const configPath = opts.config ?? defaultRunnerConfigPath();
@@ -5272,7 +5302,7 @@ Next:
5272
5302
  });
5273
5303
  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) => {
5274
5304
  const { defaultRunnerConfigPath } = await import('./config-CLSGABD5.js');
5275
- const { listJobFiles } = await import('./loop-SYYPVFYW.js');
5305
+ const { listJobFiles } = await import('./loop-EAZQMAE2.js');
5276
5306
  const { newestAttempt, logPathFor, tail, RunnerLogsError } = await import('./logs-AMLKC3VP.js');
5277
5307
  const configPath = opts.config ?? defaultRunnerConfigPath();
5278
5308
  const item = parseTrackerNumber(itemArg);
@@ -5532,7 +5562,7 @@ caller from the bearer token, the gateway answers 401 without that header.
5532
5562
  function registerImportCommands(program2) {
5533
5563
  const importCmd = program2.command("import").description("Import an existing config format into .outerlayer/");
5534
5564
  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) => {
5535
- const { runImportRuler, ImportRulerError } = await import('./import-ruler-cmd-5P6JOXQN.js');
5565
+ const { runImportRuler, ImportRulerError } = await import('./import-ruler-cmd-T6LLO6Q7.js');
5536
5566
  try {
5537
5567
  const result = runImportRuler({ cwd: opts.dir, json: opts.json });
5538
5568
  if (result.exitCode !== 0) process.exitCode = result.exitCode;
@@ -5548,7 +5578,7 @@ function registerImportCommands(program2) {
5548
5578
  "after",
5549
5579
  "\nInstalls the four maintained skills (outerlayer-evidence, outerlayer-amend,\nouterlayer-findings, outerlayer-cli) 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"
5550
5580
  ).action(async (opts) => {
5551
- const { runImportCapture, ImportCaptureError } = await import('./import-capture-cmd-KKFFOGWP.js');
5581
+ const { runImportCapture, ImportCaptureError } = await import('./import-capture-cmd-TK4XY7RD.js');
5552
5582
  try {
5553
5583
  runImportCapture({ cwd: opts.dir, json: opts.json });
5554
5584
  } catch (err) {
@@ -5,16 +5,16 @@ import { runRunnerInstall, launcherSummary, restartNote } from './chunk-MLAAT4S6
5
5
  import './chunk-I2UOAV7X.js';
6
6
  import './chunk-VYAL7PUE.js';
7
7
  import { currentLink, execStartCommand } from './chunk-AMFWYESY.js';
8
- import { detectMachine } from './chunk-UVG35MWF.js';
9
- import './chunk-7KSSBQTS.js';
8
+ import { detectMachine } from './chunk-LW7G5TJB.js';
9
+ import './chunk-3ZR7Y23Y.js';
10
10
  import './chunk-OGFGZQA3.js';
11
11
  import './chunk-VMJPFQNE.js';
12
12
  import './chunk-3UZTIRLF.js';
13
13
  import './chunk-GGOMT6KF.js';
14
14
  import './chunk-X5H2WYMB.js';
15
- import './chunk-XSZD4AZ6.js';
15
+ import './chunk-XZ4H4X5F.js';
16
16
  import { installService, uninstallService, realTaskScheduler } from './chunk-QEFKA2QD.js';
17
- import './chunk-HPJNLETG.js';
17
+ import './chunk-FBTGMSQF.js';
18
18
  import './chunk-IF2OSI5T.js';
19
19
  import './chunk-CG36IONK.js';
20
20
  import './chunk-G3IJ3N6F.js';
@@ -34,19 +34,19 @@ import './chunk-GOSFARMS.js';
34
34
  import './chunk-ANPNT6PM.js';
35
35
  import './chunk-WZBHBH3J.js';
36
36
  import './chunk-LLM3I5YU.js';
37
- import './chunk-452TM7J4.js';
38
- import './chunk-IXYZUUYQ.js';
37
+ import './chunk-EAEELQVQ.js';
38
+ import './chunk-7UWVLZXD.js';
39
39
  import './chunk-FVMYKL6L.js';
40
40
  import './chunk-NTRCK4NH.js';
41
41
  import './chunk-ZJSNLVCE.js';
42
42
  import './chunk-BJ3KTMDH.js';
43
43
  import './chunk-G2YNJIGF.js';
44
44
  import './chunk-NNLA7LLQ.js';
45
- import './chunk-WFSUUUAN.js';
46
- import './chunk-7VUK5RFS.js';
47
45
  import './chunk-EABW6AJQ.js';
48
46
  import './chunk-CRB3POP4.js';
49
47
  import './chunk-YQR6E6OV.js';
48
+ import './chunk-WFSUUUAN.js';
49
+ import './chunk-7VUK5RFS.js';
50
50
  import './chunk-VNVZDWO3.js';
51
51
  import './chunk-RA3O54FC.js';
52
52
  import './chunk-M2ZWWTWZ.js';
@@ -8,9 +8,9 @@ import './chunk-GOSFARMS.js';
8
8
  import './chunk-ANPNT6PM.js';
9
9
  import './chunk-NTRCK4NH.js';
10
10
  import './chunk-BJ3KTMDH.js';
11
- import './chunk-7VUK5RFS.js';
12
11
  import './chunk-EABW6AJQ.js';
13
12
  import './chunk-CRB3POP4.js';
13
+ import './chunk-7VUK5RFS.js';
14
14
  import './chunk-VNVZDWO3.js';
15
15
  import './chunk-Z5GEFMRW.js';
16
16