@outerlayer/cli 0.25.2 → 0.26.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 (33) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +0 -1
  3. package/dist/{build-ONH22PN5.js → build-JK2DLT6X.js} +2 -2
  4. package/dist/build-info.json +1 -1
  5. package/dist/{builder-WPULEVMY.js → builder-TMA25KRR.js} +2 -2
  6. package/dist/{check-SSEVZJN5.js → check-FAGTKWHT.js} +9 -9
  7. package/dist/{chunk-CP24ZXXR.js → chunk-4QKHBDEN.js} +8 -5
  8. package/dist/{chunk-APBTVIM4.js → chunk-4R24DSL2.js} +4 -4
  9. package/dist/{chunk-PCADYUQT.js → chunk-6S3UEBLB.js} +2 -2
  10. package/dist/{chunk-Z6SWQV77.js → chunk-6WZKI6LQ.js} +14 -7
  11. package/dist/{chunk-F4267APM.js → chunk-7I6GZSN3.js} +1 -1
  12. package/dist/{chunk-3RBQSPW5.js → chunk-AINUN2TT.js} +1 -1
  13. package/dist/{chunk-QBENN6GA.js → chunk-ARMZI56S.js} +2 -2
  14. package/dist/{chunk-WMEADVIX.js → chunk-DVAAATJP.js} +5 -5
  15. package/dist/{chunk-Z453MOUL.js → chunk-TI33WRBT.js} +1 -1
  16. package/dist/{chunk-WXKAHUGA.js → chunk-XK7FRM5J.js} +1 -1
  17. package/dist/{cli-ZBZFCRTK.js → cli-CD4UNXBY.js} +22 -71
  18. package/dist/{command-A2XBWQGB.js → command-A54TSZWD.js} +5 -5
  19. package/dist/{container-start-L6LCWH6Z.js → container-start-NRPEMKKE.js} +6 -6
  20. package/dist/{docker-FATVQG5M.js → docker-4X2A5HDY.js} +2 -2
  21. package/dist/{doctor-EI22PDR5.js → doctor-AXJQQBKY.js} +10 -7
  22. package/dist/index.js +1 -1
  23. package/dist/{init-MRREKVT5.js → init-5WVPLO3G.js} +6 -6
  24. package/dist/{init-ZN47OUB3.js → init-IFQCZKY6.js} +6 -6
  25. package/dist/{init-cmd-ZGQ6HMZD.js → init-cmd-KNYXSA6O.js} +1 -1
  26. package/dist/{loop-JTKSTVDV.js → loop-HTWKPG3J.js} +9 -9
  27. package/dist/{machine-RCIMAKOA.js → machine-AYYL2WXW.js} +5 -5
  28. package/dist/{runner-identity-C2O6Q3RR.js → runner-identity-NH6RLVMI.js} +2 -2
  29. package/dist/{runner-key-ENQLA4Q6.js → runner-key-3HAVHQZI.js} +6 -6
  30. package/dist/{status-OTZ3VX47.js → status-IAXWRX7B.js} +5 -5
  31. package/package.json +2 -2
  32. package/dist/import-capture-cmd-TCOKNVBM.js +0 -73
  33. package/dist/import-ruler-cmd-VJOHOJQ7.js +0 -173
package/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # @outerlayer/cli
2
2
 
3
+ ## 0.26.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 9dab934: Remove `outerlayer import capture`, `outerlayer import ruler` and `outerlayer hooks install-git`. `outerlayer init` installs the maintained skills, and `outerlayer init --update` refreshes them. `outerlayer init` and `outerlayer sync` remove the git hooks that an earlier version installed.
8
+
9
+ ### Patch Changes
10
+
11
+ - 847b8eb: MicroVM builds use Firecracker 1.17.0. On a host with the root helper, run `outerlayer runner install --service --replace` so its builds use it too. Until then, `outerlayer doctor` and each build's log say the helper runs an older Firecracker.
12
+ - 0405fed: MicroVM builds no longer stop after a CLI update that pins a new Firecracker, guest kernel or guest helper. The runner keeps each file under its pinned hash and downloads the new one.
13
+
3
14
  ## 0.25.2
4
15
 
5
16
  ### Patch Changes
package/README.md CHANGED
@@ -437,7 +437,6 @@ before it gives up.
437
437
  | `outerlayer daemon` | Run the copy-out daemon in the foreground (`--once` for a single sweep, which uploads nothing). Once cloud credentials exist, it also streams a launched session's new turns as they land — see Privacy, above. `outerlayer watch` is the former name and still works, with a warning. |
438
438
  | `outerlayer doctor` | Check the installation: hooks, status-line freshness, sync health and, with a factory key, the GitHub App access builds need. `--json` prints the checks and a summary for scripts. |
439
439
  | `outerlayer context emit [--check]` | Compile `.outerlayer/` into each configured target tool's native files (targets come from `.outerlayer/config.json`). `--check` computes outputs and diffs against disk without writing (CI mode). Bare `outerlayer emit` with no name still compiles, with a deprecation warning. |
440
- | `outerlayer import ruler` | Port a `.ruler/` tree ([Ruler](https://github.com/intellectronica/ruler)) into the equivalent `.outerlayer/` tree — mostly a rename; never overwrites an existing `.outerlayer/`. |
441
440
  | `outerlayer hooks wrap` / `outerlayer hooks unwrap` | Auto-wrap (or undo wrapping) `PreToolUse`/`PostToolUse` hooks for execution evidence — one spawn per firing. |
442
441
  | `outerlayer emit artifact <file> --caption <text> [--for <criterion-id>] [--pr <n>]` | Upload a proof artifact — screenshot, recording, report, or log — with its caption. Inside a recorded session it spools locally and ships on the next `sync`; otherwise it uploads immediately, anchored to a pull request or the current checkout. `--replaces` retires artifacts an earlier run uploaded. A JUnit XML file bound with `--for` proves a criterion that declares `test` proof; `--test <name[=path:line]>` binds only the named tests. |
443
442
  | `outerlayer emit <name> --result <pass\|fail> [--link <url>] [--body <text>\|--body-file <path>] --item <number>` | Record one named check's outcome on a work item. A check that ran carries the run URL as its proof (`--link`); a judgment you are making yourself carries one sentence (`--body`, or `--body-file` to read it from a file — `-` reads standard input). A `fail` needs at least one of the two; a `pass` needs neither. `--item` names the work item by the number printed when the item was created — always required, in or out of a recorded session; a session records checks on its own item like any other, stored as the session's, but cannot clear a person's fail. Prints the recorded check's id. Who recorded it comes from your API key, never from what you send. |
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { buildRepositoryImage } from './chunk-3RBQSPW5.js';
3
+ export { buildRepositoryImage } from './chunk-AINUN2TT.js';
4
4
  import './chunk-PYSKSROG.js';
5
5
  import './chunk-JBJTC3UU.js';
6
- export { RecipeError } from './chunk-APBTVIM4.js';
6
+ export { RecipeError } from './chunk-4R24DSL2.js';
7
7
  import './chunk-L4CW6LZQ.js';
8
8
  import './chunk-2K3TCQHW.js';
9
9
  import './chunk-JGD5TWQ2.js';
@@ -1 +1 @@
1
- {"id":"2026-10-16T13:07:36.429Z+ced0b55","root":"/home/runner/_work/outerlayer/outerlayer","pkg":"outerlayer"}
1
+ {"id":"2026-10-16T14:55:16.789Z+b8b6796","root":"/home/runner/_work/outerlayer/outerlayer","pkg":"outerlayer"}
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { MIN_BUILDX_VERSION, builderName, builderSpec, buildxState, ensureBuilder, ensureFailureCount, isOutOfMemory, proxyEnvironment, trackImageBuild } from './chunk-F4267APM.js';
4
- import './chunk-APBTVIM4.js';
3
+ export { MIN_BUILDX_VERSION, builderName, builderSpec, buildxState, ensureBuilder, ensureFailureCount, isOutOfMemory, proxyEnvironment, trackImageBuild } from './chunk-7I6GZSN3.js';
4
+ import './chunk-4R24DSL2.js';
5
5
  import './chunk-7RQ73DLO.js';
6
6
  import './chunk-QE3UQAHK.js';
7
7
  import './chunk-QZBXLLTV.js';
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { probeCredentials } from './chunk-WMEADVIX.js';
4
- import './chunk-CP24ZXXR.js';
3
+ import { probeCredentials } from './chunk-DVAAATJP.js';
4
+ import './chunk-4QKHBDEN.js';
5
5
  import './chunk-TKL74NLB.js';
6
6
  import './chunk-ZVB57WI6.js';
7
7
  import './chunk-6FAP657M.js';
@@ -14,24 +14,24 @@ import './chunk-UNF7MWEL.js';
14
14
  import './chunk-ITP76BST.js';
15
15
  import './chunk-P7UQZFNY.js';
16
16
  import './chunk-ESVW4MJY.js';
17
- import { placeholderQueues, placeholderProblem, permissionModeProblems, permissionModeProblem, needsClaudeCredential, claudeCredentialCheck, claimPermissionProblem, formerSkillQueues, formerSkillProblem } from './chunk-Z453MOUL.js';
17
+ import { placeholderQueues, placeholderProblem, permissionModeProblems, permissionModeProblem, needsClaudeCredential, claudeCredentialCheck, claimPermissionProblem, formerSkillQueues, formerSkillProblem } from './chunk-TI33WRBT.js';
18
18
  import './chunk-4IFKLYMM.js';
19
19
  import './chunk-YYYRBYWG.js';
20
20
  import './chunk-TBT347UY.js';
21
- import './chunk-QBENN6GA.js';
22
- import './chunk-PCADYUQT.js';
23
- import './chunk-Z6SWQV77.js';
21
+ import './chunk-ARMZI56S.js';
22
+ import './chunk-6S3UEBLB.js';
23
+ import './chunk-6WZKI6LQ.js';
24
24
  import './chunk-665QWBNW.js';
25
25
  import './chunk-TQMI335S.js';
26
26
  import './chunk-5PMQDQFV.js';
27
27
  import './chunk-MLD2NA7N.js';
28
28
  import { parseRunnerEnv } from './chunk-6MZSX4M7.js';
29
- import './chunk-3RBQSPW5.js';
29
+ import './chunk-AINUN2TT.js';
30
30
  import './chunk-PYSKSROG.js';
31
31
  import './chunk-JBJTC3UU.js';
32
32
  import './chunk-OGFGZQA3.js';
33
- import './chunk-F4267APM.js';
34
- import './chunk-APBTVIM4.js';
33
+ import './chunk-7I6GZSN3.js';
34
+ import './chunk-4R24DSL2.js';
35
35
  import './chunk-HPOEVC2V.js';
36
36
  import './chunk-XGJUNNXL.js';
37
37
  import './chunk-WVM6PM2N.js';
@@ -5,11 +5,11 @@ import { senderPidfile } from './chunk-XBCJI6SV.js';
5
5
  import { DOCKERD_LOG, HELPER_PATH, HELPER_RECORD } from './chunk-2N72GPS2.js';
6
6
  import { writeDockerClientConfig } from './chunk-UNF7MWEL.js';
7
7
  import { installScrubContext } from './chunk-ITP76BST.js';
8
- import { ADDED_USER, AssetError, obtainImage, ensureRootfs, gitRemoteFor, startServicesFor, createBuildDisk, machineConfig, resolveAgentUser, AgentUserError, runBuildSteps, shellQuote, LEASE_SECONDS, createContainerRuntime, stopContainer, cleanupContainer, outOfMemoryReason, containerSenderCommand, signalInContainer, syncInContainer, copyTranscriptsFromContainer, senderAliveScript, HelperRefusal, GH_CONFIG_YML, ghHostsYml, isLiteralAddress, deleteBuildDisk, startCheckContainer, lifecycleSteps, lifecycleFailureReason, writeEvalInput, DeliveryFailure, EVAL_INPUT_NAME, copyTranscripts, senderSignalScript, containerJudgeEnvironment, copyJudgeTree } from './chunk-Z6SWQV77.js';
9
- import { readBranchHead, fetchCommit, diffBetween } from './chunk-3RBQSPW5.js';
8
+ import { ADDED_USER, AssetError, obtainImage, ensureRootfs, gitRemoteFor, startServicesFor, createBuildDisk, machineConfig, resolveAgentUser, AgentUserError, runBuildSteps, shellQuote, LEASE_SECONDS, createContainerRuntime, stopContainer, cleanupContainer, outOfMemoryReason, containerSenderCommand, signalInContainer, syncInContainer, copyTranscriptsFromContainer, senderAliveScript, helperFirecrackerNote, HelperRefusal, GH_CONFIG_YML, ghHostsYml, isLiteralAddress, deleteBuildDisk, startCheckContainer, lifecycleSteps, lifecycleFailureReason, writeEvalInput, DeliveryFailure, EVAL_INPUT_NAME, copyTranscripts, senderSignalScript, containerJudgeEnvironment, copyJudgeTree } from './chunk-6WZKI6LQ.js';
9
+ import { readBranchHead, fetchCommit, diffBetween } from './chunk-AINUN2TT.js';
10
10
  import { isSameProcess, startTimeOf } from './chunk-JBJTC3UU.js';
11
- import { HASH_ARGV, parseProgramHash, JUDGE_PROGRAM, writeJobFile, readJobFile, COMMAND_DIR, childEnvironment, judgeCommand, JUDGE_MAX_TURNS, MAX_REPORT_BYTES, JUDGE_DIR } from './chunk-F4267APM.js';
12
- import { CLAUDE_CODE_VERSION } from './chunk-APBTVIM4.js';
11
+ import { HASH_ARGV, parseProgramHash, JUDGE_PROGRAM, writeJobFile, readJobFile, COMMAND_DIR, childEnvironment, judgeCommand, JUDGE_MAX_TURNS, MAX_REPORT_BYTES, JUDGE_DIR } from './chunk-7I6GZSN3.js';
12
+ import { CLAUDE_CODE_VERSION, FIRECRACKER_VERSION } from './chunk-4R24DSL2.js';
13
13
  import { waitForAgent, vmExecArgs } from './chunk-HPOEVC2V.js';
14
14
  import { socketPathProblem, vsockLinks, linkVsockSockets } from './chunk-XGJUNNXL.js';
15
15
  import { describeCallFailure, resolveGoverningSource, refusalCode, removeStagedContext, stageGovernedContext, pinnedSourceOf, commandWithShim, logStamp, createRunnerLog, formatDuration, retrySend, formatClock } from './chunk-WVM6PM2N.js';
@@ -214,7 +214,10 @@ function makeBuildsDirPrivate(buildDir2) {
214
214
  }
215
215
  async function helperFor(runtime, log) {
216
216
  const probe = await runtime.vm.helper.probe();
217
- if (probe.ok) return probe.client;
217
+ if (probe.ok) {
218
+ if (probe.firecracker !== FIRECRACKER_VERSION) log(`${helperFirecrackerNote(probe.firecracker)}; run \`outerlayer runner install --service --replace\` to update it`);
219
+ return probe.client;
220
+ }
218
221
  if (probe.reason === "unsupported") log(probe.detail);
219
222
  else if (probe.unreachable === true) log(`${probe.detail}, so this build runs without the jailer`);
220
223
  return void 0;
@@ -242,12 +242,12 @@ var MICROVM_ARCHES = ["x86_64"];
242
242
  function firecrackerArch(nodeArch) {
243
243
  return nodeArch === "x64" ? "x86_64" : nodeArch === "arm64" ? "aarch64" : nodeArch;
244
244
  }
245
- var FIRECRACKER_VERSION = "1.16.2";
245
+ var FIRECRACKER_VERSION = "1.17.0";
246
246
  var FIRECRACKER_SHA256 = {
247
- x86_64: "32e3cdcd4081f91fe2b024a266f57dcb3b4e5fec5033e0cb22467ad7f7820bda"
247
+ x86_64: "06094a1108ae9e82aa4c23a775aa92758f53f1175d422270d9d6162cb9ade558"
248
248
  };
249
249
  var FIRECRACKER_BINARY_SHA256 = {
250
- x86_64: "8227875ceda44177a4d501052dae4a2f9d7837362f5399f02cf0748e68418377"
250
+ x86_64: "99ad0f5cd0514a88aad0e9ae8cfdb3cc3b4ab9d190e1194602406c786b5de7a5"
251
251
  };
252
252
  var GUEST_ASSETS_VERSION = "1";
253
253
  var GUEST_ASSETS_BASE_URL = `https://github.com/outerlayerai/guest-assets/releases/download/guest-${GUEST_ASSETS_VERSION}`;
@@ -262,7 +262,7 @@ function guestAssetsPinned(arch) {
262
262
  return GUEST_KERNEL_SHA256[arch] !== zero && GUEST_HELPER_SHA256[arch] !== zero;
263
263
  }
264
264
  var JAILER_BINARY_SHA256 = {
265
- x86_64: "99832d2270741af67ffacd46da716b4b016338541af5a742907ab965b2e9ac9e"
265
+ x86_64: "65ef226e96f0ceda55ba643f445801ef2cc0ea667ef67cad8ac4f406c9c8434f"
266
266
  };
267
267
  var HOST_HELPER_ASSETS_VERSION = "4";
268
268
  var HOST_HELPER_BASE_URL = `https://github.com/outerlayerai/guest-assets/releases/download/guest-${HOST_HELPER_ASSETS_VERSION}`;
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { MIN_ENGINE_MAJOR } from './chunk-Z6SWQV77.js';
3
+ import { MIN_ENGINE_MAJOR } from './chunk-6WZKI6LQ.js';
4
4
  import { runnerImageVersion } from './chunk-665QWBNW.js';
5
- import { firecrackerArch, MICROVM_ARCHES, guestAssetsPinned } from './chunk-APBTVIM4.js';
5
+ import { firecrackerArch, MICROVM_ARCHES, guestAssetsPinned } from './chunk-4R24DSL2.js';
6
6
  import { spawnSync } from 'child_process';
7
7
  import { existsSync, accessSync, constants, statSync, readFileSync } from 'fs';
8
8
 
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
3
  import { runnerImageVersion } from './chunk-665QWBNW.js';
4
- import { readDefaultBranchHead, cloneRepository, buildRepositoryImage } from './chunk-3RBQSPW5.js';
4
+ import { readDefaultBranchHead, cloneRepository, buildRepositoryImage } from './chunk-AINUN2TT.js';
5
5
  import { startTimeOf, isSameProcess } from './chunk-JBJTC3UU.js';
6
6
  import { currentCliBuild } from './chunk-OGFGZQA3.js';
7
- import { createDockerHost, builderSpec, runnerLabelValue, RUNNER_LABEL, BUILD_LABEL, prepareRunArgs, containerRunArgs, HASH_ARGV, parseProgramHash, JUDGE_PROGRAM, containerExecArgs, childEnvironment, JUDGE_DIR, JUDGE_REPORT, MAX_REPORT_BYTES, spawnRun } from './chunk-F4267APM.js';
8
- import { hostHelperPinned, firecrackerArch, MICROVM_ARCHES, RecipeError, DOCKER_FEATURE, CLAUDE_CODE_VERSION, GUEST_HELPER_SHA256, GUEST_ASSETS_BASE_URL, GUEST_KERNEL_SHA256, JAILER_BINARY_SHA256, FIRECRACKER_BINARY_SHA256, FIRECRACKER_SHA256, FIRECRACKER_VERSION, GUEST_ASSETS_VERSION, DEFAULT_BASE_IMAGE } from './chunk-APBTVIM4.js';
7
+ import { createDockerHost, builderSpec, runnerLabelValue, RUNNER_LABEL, BUILD_LABEL, prepareRunArgs, containerRunArgs, HASH_ARGV, parseProgramHash, JUDGE_PROGRAM, containerExecArgs, childEnvironment, JUDGE_DIR, JUDGE_REPORT, MAX_REPORT_BYTES, spawnRun } from './chunk-7I6GZSN3.js';
8
+ import { FIRECRACKER_VERSION, hostHelperPinned, firecrackerArch, MICROVM_ARCHES, RecipeError, DOCKER_FEATURE, CLAUDE_CODE_VERSION, GUEST_HELPER_SHA256, GUEST_ASSETS_BASE_URL, GUEST_KERNEL_SHA256, JAILER_BINARY_SHA256, FIRECRACKER_BINARY_SHA256, FIRECRACKER_SHA256, GUEST_ASSETS_VERSION, DEFAULT_BASE_IMAGE } from './chunk-4R24DSL2.js';
9
9
  import { execCapture } from './chunk-HPOEVC2V.js';
10
10
  import { GUEST_CID } from './chunk-XGJUNNXL.js';
11
11
  import { describeCallFailure, controlPlaneTokenFailure, refusalCode, resolveGoverningSource, removeStagedContext, stageGovernedContext, pinnedSourceOf, commandWithShim, shimScript } from './chunk-WVM6PM2N.js';
@@ -213,6 +213,9 @@ function helperClient(socketPath, options = {}) {
213
213
  }
214
214
  };
215
215
  }
216
+ function helperFirecrackerNote(helperFirecracker) {
217
+ return `the root helper runs Firecracker ${helperFirecracker}, not the ${FIRECRACKER_VERSION} this release pins, so microVM builds run under the jailer with Firecracker ${helperFirecracker}`;
218
+ }
216
219
  function reinstallMessage(protocol) {
217
220
  const spoken = protocol === void 0 ? "a protocol it does not name" : `protocol ${protocol}`;
218
221
  return `the root helper speaks ${spoken}, which this runner does not support, so microVM builds run without the jailer; run \`outerlayer runner install --service --replace\` to install the helper that goes with this release`;
@@ -476,8 +479,12 @@ async function download(file, url, fetchImpl) {
476
479
  if (!response.ok) throw new AssetError(file, `${file} could not be downloaded from ${url}: the server answered ${response.status}`);
477
480
  return Buffer.from(await response.arrayBuffer());
478
481
  }
482
+ function keptPath(dir, sha256, name) {
483
+ mkdirSync(join(dir, sha256), { recursive: true, mode: RUNNER_DIR_MODE });
484
+ return join(dir, sha256, name);
485
+ }
479
486
  async function ensureFile(dir, file, pin, fetchImpl, mode) {
480
- const path = join(dir, file);
487
+ const path = keptPath(dir, pin.sha256, file);
481
488
  if (existsSync(path)) {
482
489
  const actual2 = sha256Of(readFileSync(path));
483
490
  if (actual2 !== pin.sha256) throw pinProblem(file, pin.sha256, actual2, `at ${path}`);
@@ -499,7 +506,7 @@ function extractWithTar(arch, program = "firecracker") {
499
506
  }
500
507
  async function ensureFirecracker(input) {
501
508
  const { dir, arch, pins, fetchImpl } = input;
502
- const firecracker = join(dir, "firecracker");
509
+ const firecracker = keptPath(dir, pins.firecracker.binarySha256, "firecracker");
503
510
  if (existsSync(firecracker)) {
504
511
  const actual = sha256Of(readFileSync(firecracker));
505
512
  if (actual !== pins.firecracker.binarySha256) throw pinProblem("firecracker", pins.firecracker.binarySha256, actual, `at ${firecracker}`);
@@ -549,7 +556,7 @@ async function ensureJailer(options) {
549
556
  const fetchImpl = options.fetchImpl ?? fetch;
550
557
  const dir = vmAssetsDir(options.runnerDir);
551
558
  mkdirSync(dir, { recursive: true, mode: RUNNER_DIR_MODE });
552
- const jailer = join(dir, "jailer");
559
+ const jailer = keptPath(dir, expected, "jailer");
553
560
  if (existsSync(jailer)) {
554
561
  const actual = sha256Of(readFileSync(jailer));
555
562
  if (actual !== expected) throw pinProblem("jailer", expected, actual, `at ${jailer}`);
@@ -3304,4 +3311,4 @@ async function startCheckContainer(input) {
3304
3311
  };
3305
3312
  }
3306
3313
 
3307
- export { ADDED_USER, AgentUserError, AssetError, DeliveryFailure, EVAL_INPUT_NAME, GH_CONFIG_YML, HelperRefusal, LEASE_SECONDS, MIN_ENGINE_MAJOR, cleanupContainer, containerCommandExec, containerJudgeEnvironment, containerSenderCommand, copyJudgeTree, copyTranscripts, copyTranscriptsFromContainer, createBuildDisk, createContainerRuntime, deleteBuildDisk, deliverContainerHooks, ensureFirecrackerAndJailer, ensureRootfs, ensureTunnel, filesAreCopied, ghHostsYml, gitRemoteFor, helperSocketPath, isLiteralAddress, keepGhConfigCurrent, leaseExpiresAtMs, lifecycleFailureReason, lifecycleSteps, machineConfig, measureDisk, obtainImage, outOfMemoryReason, parseCpuList, prepareBranch, probeHelper, provisionContainer, resolveAgentUser, runBuildSteps, senderAliveScript, senderSignalScript, setUpRunnerCgroup, shellQuote, signalInContainer, startCheckContainer, startServicesFor, stopContainer, syncInContainer, writeEvalInput };
3314
+ export { ADDED_USER, AgentUserError, AssetError, DeliveryFailure, EVAL_INPUT_NAME, GH_CONFIG_YML, HelperRefusal, LEASE_SECONDS, MIN_ENGINE_MAJOR, cleanupContainer, containerCommandExec, containerJudgeEnvironment, containerSenderCommand, copyJudgeTree, copyTranscripts, copyTranscriptsFromContainer, createBuildDisk, createContainerRuntime, deleteBuildDisk, deliverContainerHooks, ensureFirecrackerAndJailer, ensureRootfs, ensureTunnel, filesAreCopied, ghHostsYml, gitRemoteFor, helperFirecrackerNote, helperSocketPath, isLiteralAddress, keepGhConfigCurrent, leaseExpiresAtMs, lifecycleFailureReason, lifecycleSteps, machineConfig, measureDisk, obtainImage, outOfMemoryReason, parseCpuList, prepareBranch, probeHelper, provisionContainer, resolveAgentUser, runBuildSteps, senderAliveScript, senderSignalScript, setUpRunnerCgroup, shellQuote, signalInContainer, startCheckContainer, startServicesFor, stopContainer, syncInContainer, writeEvalInput };
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { RecipeError, BUILDKIT_IMAGE } from './chunk-APBTVIM4.js';
3
+ import { RecipeError, BUILDKIT_IMAGE } from './chunk-4R24DSL2.js';
4
4
  import { parseSize } from './chunk-7RQ73DLO.js';
5
5
  import { compareVersions } from './chunk-QE3UQAHK.js';
6
6
  import { ensureHostKey } from './chunk-F6DIHHBS.js';
@@ -2,7 +2,7 @@
2
2
  import { createRequire } from 'node:module';
3
3
  import { claimPidFile, RunnerAlreadyRunningError, releasePidFile } from './chunk-PYSKSROG.js';
4
4
  import { startTimeOf } from './chunk-JBJTC3UU.js';
5
- import { CLAUDE_CODE_VERSION, NODE_IMAGE, DEFAULT_BASE_IMAGE, RecipeError, locateRecipe, readRecipe, assertBuildable, TINI_VERSION, GH_VERSION, writeSanitizedRecipe, classifyProperties, GH_SHA256, TINI_SHA256, SANITIZED_NAME } from './chunk-APBTVIM4.js';
5
+ import { CLAUDE_CODE_VERSION, NODE_IMAGE, DEFAULT_BASE_IMAGE, RecipeError, locateRecipe, readRecipe, assertBuildable, TINI_VERSION, GH_VERSION, writeSanitizedRecipe, classifyProperties, GH_SHA256, TINI_SHA256, SANITIZED_NAME } from './chunk-4R24DSL2.js';
6
6
  import { RUNNER_DIR_MODE, repoCacheDir, imagesDir, attemptStamp, runnerDir, rootfsPathFor, RUNNER_FILE_MODE } from './chunk-L4CW6LZQ.js';
7
7
  import { withGitConfig, tokenHeader, PROXY_WARNING_FLAG } from './chunk-2K3TCQHW.js';
8
8
  import { RELAY_ID, RELAY_USER } from './chunk-JGD5TWQ2.js';
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { detectMachine, supportsContainerBuilds, reachDockerStep, describeMachineDocker, supportsMicroVmBuilds } from './chunk-PCADYUQT.js';
4
- import { MIN_ENGINE_MAJOR } from './chunk-Z6SWQV77.js';
3
+ import { detectMachine, supportsContainerBuilds, reachDockerStep, describeMachineDocker, supportsMicroVmBuilds } from './chunk-6S3UEBLB.js';
4
+ import { MIN_ENGINE_MAJOR } from './chunk-6WZKI6LQ.js';
5
5
  import { hasStoredCredential, AGENT_COMMANDS, storeClaudeCredential, credentialFromStdin, isAgentName } from './chunk-5PMQDQFV.js';
6
6
  import { runnerCredentialProblem } from './chunk-JWRX5ZTT.js';
7
7
  import { runnerDir, RUNNER_DIR_MODE, RUNNER_FILE_MODE } from './chunk-L4CW6LZQ.js';
@@ -1,23 +1,23 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { releaseLease, isUnfinished, setStage, jobEnv, runHook, describeHookEnd, provisionMicroVm, deliverCommitHooks, provisionProcess, provisionEnvironment, readProvisionOut, resolveHostBuild, workdirProblem, listenOnBroker, hostEnvironment, hostCommandEnvironment, execArgv, microVmCommandLine, runCommand, commandLogOffset, execCommandLine, startSender, startHostServices, finishJob, isContainerTracked, probeCommand, appendCommandLog, judgeProbe, EXIT_CODE_FILE, isGroupAlive, outcomeFromExitCode, isTimedOut, readCpuUsec, isIdle, stopOrphanedMicroVms, unfinishedJobs, listUnreadableJobs, listAdoptableJobs, retryFailedReleases, recoverLostJobs, hookLimitsFor, AttemptLogBook, needsRenew, renewLease, RENEW_INTERVAL_SECONDS, listTrackedJobs, restartSender, ALREADY_RELEASED, inTeardown } from './chunk-CP24ZXXR.js';
3
+ import { releaseLease, isUnfinished, setStage, jobEnv, runHook, describeHookEnd, provisionMicroVm, deliverCommitHooks, provisionProcess, provisionEnvironment, readProvisionOut, resolveHostBuild, workdirProblem, listenOnBroker, hostEnvironment, hostCommandEnvironment, execArgv, microVmCommandLine, runCommand, commandLogOffset, execCommandLine, startSender, startHostServices, finishJob, isContainerTracked, probeCommand, appendCommandLog, judgeProbe, EXIT_CODE_FILE, isGroupAlive, outcomeFromExitCode, isTimedOut, readCpuUsec, isIdle, stopOrphanedMicroVms, unfinishedJobs, listUnreadableJobs, listAdoptableJobs, retryFailedReleases, recoverLostJobs, hookLimitsFor, AttemptLogBook, needsRenew, renewLease, RENEW_INTERVAL_SECONDS, listTrackedJobs, restartSender, ALREADY_RELEASED, inTeardown } from './chunk-4QKHBDEN.js';
4
4
  import { writePendingUpdate } from './chunk-TKL74NLB.js';
5
5
  import { JOB_STATE_FORMAT, readsJobState, jobStateFormatOf } from './chunk-ZVB57WI6.js';
6
6
  import { readHousekeepingRecord, writeHousekeepingRecord } from './chunk-6FAP657M.js';
7
7
  import { decideInstalledSwitch } from './chunk-3JVYMD4G.js';
8
8
  import { fetchVersionMeta, npmVersion, npmSupportsProvenance, fetchTarballDigest, fetchProvenance, installVersion, auditSignatures } from './chunk-YETTWTAY.js';
9
9
  import { RUNNER_PROTOCOL } from './chunk-TPKYTORP.js';
10
- import { currentSkillCommand, formerSkillProblem, placeholderQueues, placeholderProblem } from './chunk-Z453MOUL.js';
10
+ import { currentSkillCommand, formerSkillProblem, placeholderQueues, placeholderProblem } from './chunk-TI33WRBT.js';
11
11
  import { writeMarker, readMarker, currentVersion, removeMarker, entryIn, versionDir, startedThroughCurrent, switchCurrent, isInLayout, cleanVersions, stagingDir } from './chunk-4IFKLYMM.js';
12
12
  import { freeBytes, formatBytes } from './chunk-YYYRBYWG.js';
13
13
  import { RepoFilter } from './chunk-TBT347UY.js';
14
- import { LEASE_SECONDS, provisionContainer, leaseExpiresAtMs, deliverContainerHooks, lifecycleSteps, lifecycleFailureReason, prepareBranch, containerCommandExec, measureDisk, setUpRunnerCgroup, createContainerRuntime, parseCpuList, ensureTunnel, keepGhConfigCurrent, filesAreCopied } from './chunk-Z6SWQV77.js';
14
+ import { LEASE_SECONDS, provisionContainer, leaseExpiresAtMs, deliverContainerHooks, lifecycleSteps, lifecycleFailureReason, prepareBranch, containerCommandExec, measureDisk, setUpRunnerCgroup, createContainerRuntime, parseCpuList, ensureTunnel, keepGhConfigCurrent, filesAreCopied } from './chunk-6WZKI6LQ.js';
15
15
  import { tagToPull, pullInstruction, imageTag, writeUpdateStatus } from './chunk-665QWBNW.js';
16
16
  import { isVersion, compareVersions, satisfiesRange } from './chunk-TQMI335S.js';
17
17
  import { checkFit } from './chunk-MLD2NA7N.js';
18
18
  import { claimPidFile, readPidFile, releasePidFile } from './chunk-PYSKSROG.js';
19
19
  import { startTimeOf, isSameProcess } from './chunk-JBJTC3UU.js';
20
- import { writeJobFile, ensureRunnerIdentity, readJobFile, builderName, runnerLabelValue, ensureFailureCount, builderSpec, ensureBuilder, spawnRun, BUILD_LABEL, RUNNER_LABEL, readJobFileChecked } from './chunk-F4267APM.js';
20
+ import { writeJobFile, ensureRunnerIdentity, readJobFile, builderName, runnerLabelValue, ensureFailureCount, builderSpec, ensureBuilder, spawnRun, BUILD_LABEL, RUNNER_LABEL, readJobFileChecked } from './chunk-7I6GZSN3.js';
21
21
  import { describeCallFailure, retrySend, shortClaim, relativeToRunner, formatDuration, BuildTokens, classifyRefusal, refusalCode, createRunnerLog, formatClock } from './chunk-WVM6PM2N.js';
22
22
  import { isSignatureRefusal, WorkCommandError, getJson, postJson } from './chunk-DZUANBKP.js';
23
23
  import { isBuiltinContainer, isBuiltinVm, isBuiltinProcess, loadRunnerConfig, checkHooks, builtinKind, DEFAULT_UPDATE_MAX_WAIT_HOURS } from './chunk-JWRX5ZTT.js';
@@ -2730,7 +2730,7 @@ async function start(configPath, deps = { fetchImpl: fetch }) {
2730
2730
  const outcome = await onStartUnderMarker({
2731
2731
  configPath,
2732
2732
  own: ownVersionOf(deps),
2733
- check: update.check ? () => update.check(configPath) : async () => (await import('./check-SSEVZJN5.js')).runRunnerCheck(configPath, { fetchImpl: deps.fetchImpl }),
2733
+ check: update.check ? () => update.check(configPath) : async () => (await import('./check-FAGTKWHT.js')).runRunnerCheck(configPath, { fetchImpl: deps.fetchImpl }),
2734
2734
  now: () => (deps.now ?? (() => /* @__PURE__ */ new Date()))().getTime(),
2735
2735
  log
2736
2736
  });
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { isPlaceholderCommand } from './chunk-QBENN6GA.js';
3
+ import { isPlaceholderCommand } from './chunk-ARMZI56S.js';
4
4
  import { describeCallFailure } from './chunk-WVM6PM2N.js';
5
5
  import { WorkCommandError, getJson } from './chunk-DZUANBKP.js';
6
6
  import { sanitizeTerminal } from './chunk-BUP5N3X6.js';
@@ -1186,7 +1186,7 @@ async function gatherDoctorChecks() {
1186
1186
  const { runnerVmCheck } = await import('./doctor-53F2PYY7.js');
1187
1187
  checks.push(runnerVmCheck(configPath, { lima: realLima(), home: homeFromEnv(), instance: runnerVm.instance }));
1188
1188
  } else if (hasRunnerBlock(configPath)) {
1189
- const { runnerHostChecks } = await import('./doctor-EI22PDR5.js');
1189
+ const { runnerHostChecks } = await import('./doctor-AXJQQBKY.js');
1190
1190
  const hooks = (() => {
1191
1191
  try {
1192
1192
  return loadRunnerConfig(configPath).hooks;
@@ -1,6 +1,6 @@
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-WXKAHUGA.js';
3
+ import { gatherDoctorChecks, doctorExitCode, summarizeChecks, renderDoctorText, recordWrapped, recordUnwrapped, recordRemoval, readManifest, recordInstall, recordStatusline } from './chunk-XK7FRM5J.js';
4
4
  import './chunk-XFGL53GU.js';
5
5
  import './chunk-VJBFQP3H.js';
6
6
  import { verifiedTrackerNames, TRACKERS } from './chunk-DZUANBKP.js';
@@ -3898,12 +3898,12 @@ what CLIs older than ${FIRST_VERSION_READING_AGENTS_SKILLS} do. \`` + cliInvocat
3898
3898
  if (changed.length > 0 && !opts.json) process.stdout.write(`Removed the claude function from ${changed.join(", ")}.
3899
3899
  `);
3900
3900
  }
3901
- const shell = !opts.remove && opts.shellFunction !== void 0 ? (await import('./init-cmd-ZGQ6HMZD.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-KNYXSA6O.js')).applyShellFunctionFlag(opts.shellFunction, { home: homeFromEnv(), shellPath: process.env.SHELL }) : void 0;
3902
3902
  if (opts.json) writeJson(shell === void 0 ? outcome.result : { ...outcome.result, shellFunction: { outcome: shell.outcome, reason: shell.reason } });
3903
3903
  else process.stdout.write(outcome.text + (shell?.text ?? ""));
3904
3904
  return;
3905
3905
  }
3906
- const { runInitCommand } = await import('./init-cmd-ZGQ6HMZD.js');
3906
+ const { runInitCommand } = await import('./init-cmd-KNYXSA6O.js');
3907
3907
  const code = await runInitCommand(
3908
3908
  { json: opts.json, factory: opts.factory, shellFunction: opts.shellFunction },
3909
3909
  {
@@ -4187,7 +4187,6 @@ code is 1: revoke the token on /profile/security.
4187
4187
  }
4188
4188
  });
4189
4189
  registerEmitCommands(program2);
4190
- registerImportCommands(program2);
4191
4190
  registerHooksCommands(program2);
4192
4191
  registerMcpCommands(program2);
4193
4192
  registerContextCommands(program2);
@@ -4882,7 +4881,7 @@ function registerRunnerCommands(program2) {
4882
4881
  const configOption = "the cloud config file to run against (default: ~/.outerlayer/config.json)";
4883
4882
  runnerCmd.command("start").description("Run the loop: claim work, run it, report, clean up, repeat").option("--config <path>", configOption).action(async (opts) => {
4884
4883
  const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-JJ3EO7SB.js');
4885
- const { start, RunnerStartError } = await import('./loop-JTKSTVDV.js');
4884
+ const { start, RunnerStartError } = await import('./loop-HTWKPG3J.js');
4886
4885
  const { RunnerAlreadyRunningError } = await import('./pidfile-BY5Z6YH7.js');
4887
4886
  const configPath = opts.config ?? defaultRunnerConfigPath();
4888
4887
  try {
@@ -4901,8 +4900,8 @@ function registerRunnerCommands(program2) {
4901
4900
  "\nReads OUTERLAYER_URL, OUTERLAYER_APP_ID, OUTERLAYER_API_KEY, OUTERLAYER_RUNNER_NAME and one Claude credential\n(CLAUDE_CODE_OAUTH_TOKEN, ANTHROPIC_API_KEY or ANTHROPIC_AUTH_TOKEN) from the environment. OUTERLAYER_AGENT\nis optional and defaults to claude. On a later start it refuses variables that disagree with the config in the volume.\nThe image sets OUTERLAYER_RUNNER_IMAGE; outside the image, use `runner start`.\n"
4902
4901
  ).action(async () => {
4903
4902
  const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-JJ3EO7SB.js');
4904
- const { containerStart } = await import('./container-start-L6LCWH6Z.js');
4905
- const { start, RunnerStartError } = await import('./loop-JTKSTVDV.js');
4903
+ const { containerStart } = await import('./container-start-NRPEMKKE.js');
4904
+ const { start, RunnerStartError } = await import('./loop-HTWKPG3J.js');
4906
4905
  const { RunnerAlreadyRunningError } = await import('./pidfile-BY5Z6YH7.js');
4907
4906
  try {
4908
4907
  const result = await containerStart({
@@ -4922,7 +4921,7 @@ function registerRunnerCommands(program2) {
4922
4921
  });
4923
4922
  runnerCmd.command("check").description("Validate the config, the hooks and the key, and print the effective settings").option("--config <path>", configOption).action(async (opts) => {
4924
4923
  const { defaultRunnerConfigPath } = await import('./config-JJ3EO7SB.js');
4925
- const { runRunnerCheck } = await import('./check-SSEVZJN5.js');
4924
+ const { runRunnerCheck } = await import('./check-FAGTKWHT.js');
4926
4925
  const configPath = opts.config ?? defaultRunnerConfigPath();
4927
4926
  const result = await runRunnerCheck(configPath);
4928
4927
  if (!result.ok) {
@@ -4956,7 +4955,7 @@ function registerRunnerCommands(program2) {
4956
4955
  }
4957
4956
  try {
4958
4957
  if (opts.service === true) {
4959
- const { installServiceCommand } = await import('./command-A2XBWQGB.js');
4958
+ const { installServiceCommand } = await import('./command-A54TSZWD.js');
4960
4959
  const result2 = await installServiceCommand({
4961
4960
  configPath,
4962
4961
  print: opts.print,
@@ -5012,7 +5011,7 @@ To keep it running, run ${C.yellow}${cliInvocation()} runner install --service${
5012
5011
  return;
5013
5012
  }
5014
5013
  const { defaultRunnerConfigPath } = await import('./config-JJ3EO7SB.js');
5015
- const { uninstallServiceCommand } = await import('./command-A2XBWQGB.js');
5014
+ const { uninstallServiceCommand } = await import('./command-A54TSZWD.js');
5016
5015
  const result = await uninstallServiceCommand({ configPath: opts.config ?? defaultRunnerConfigPath(), unitName: opts.unitName, home: homeFromEnv() });
5017
5016
  if (result.ok) for (const line of result.lines) process.stdout.write(`${C.green}\u2713${C.reset} ${line}
5018
5017
  `);
@@ -5040,10 +5039,10 @@ already in runner.env is used.
5040
5039
  `
5041
5040
  ).action(async (opts) => {
5042
5041
  const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-JJ3EO7SB.js');
5043
- const { prepareRunnerInit, runRunnerInit, RunnerInitError, writeRunnerInit } = await import('./init-ZN47OUB3.js');
5044
- const { obtainRunnerKey, runnerKeyLogin } = await import('./runner-key-ENQLA4Q6.js');
5045
- const { detectMachine } = await import('./machine-RCIMAKOA.js');
5046
- const { chooseVm, runVmInit, VmInitError } = await import('./init-MRREKVT5.js');
5042
+ const { prepareRunnerInit, runRunnerInit, RunnerInitError, writeRunnerInit } = await import('./init-IFQCZKY6.js');
5043
+ const { obtainRunnerKey, runnerKeyLogin } = await import('./runner-key-3HAVHQZI.js');
5044
+ const { detectMachine } = await import('./machine-AYYL2WXW.js');
5045
+ const { chooseVm, runVmInit, VmInitError } = await import('./init-5WVPLO3G.js');
5047
5046
  const { AGENT_COMMANDS, credentialFromStdin, isAgentName, restartForCredential, RunnerEnvError } = await import('./runner-env-2D7MPOIJ.js');
5048
5047
  const configPath = opts.config ?? defaultRunnerConfigPath();
5049
5048
  if (opts.agent !== void 0 && !isAgentName(opts.agent)) {
@@ -5194,7 +5193,7 @@ ${C.yellow}The runner will not update itself: ${installErr.message}${C.reset}
5194
5193
  let serviceUp = false;
5195
5194
  let restart;
5196
5195
  if (installedLayout) {
5197
- const { installServiceCommand } = await import('./command-A2XBWQGB.js');
5196
+ const { installServiceCommand } = await import('./command-A54TSZWD.js');
5198
5197
  const service = await installServiceCommand({
5199
5198
  configPath,
5200
5199
  entryPath: process.argv[1] ?? "",
@@ -5239,10 +5238,10 @@ Next:
5239
5238
  "\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"
5240
5239
  ).action(async (opts) => {
5241
5240
  const { defaultRunnerConfigPath } = await import('./config-JJ3EO7SB.js');
5242
- const { buildRepositoryImage, RecipeError } = await import('./build-ONH22PN5.js');
5241
+ const { buildRepositoryImage, RecipeError } = await import('./build-JK2DLT6X.js');
5243
5242
  const { currentCliBuild } = await import('./cli-build-K56DK4DS.js');
5244
- const { createDockerHost } = await import('./docker-FATVQG5M.js');
5245
- const { builderSpec } = await import('./builder-WPULEVMY.js');
5243
+ const { createDockerHost } = await import('./docker-4X2A5HDY.js');
5244
+ const { builderSpec } = await import('./builder-TMA25KRR.js');
5246
5245
  const { loadRunnerConfig } = await import('./config-JJ3EO7SB.js');
5247
5246
  const configPath = opts.config ?? defaultRunnerConfigPath();
5248
5247
  const loaded = (() => {
@@ -5254,7 +5253,7 @@ Next:
5254
5253
  })();
5255
5254
  const memory = loaded?.build?.memory ?? "8g";
5256
5255
  try {
5257
- const { ensureRunnerIdentity } = await import('./runner-identity-C2O6Q3RR.js');
5256
+ const { ensureRunnerIdentity } = await import('./runner-identity-NH6RLVMI.js');
5258
5257
  await ensureRunnerIdentity(configPath, { log: (line) => console.error(line) }).catch((err) => {
5259
5258
  console.error(`the runner's Docker identity could not be stored: ${err instanceof Error ? err.message : String(err)}`);
5260
5259
  });
@@ -5322,7 +5321,7 @@ Next:
5322
5321
  });
5323
5322
  runnerCmd.command("stop").description("Take no more work; finish running jobs, then exit").option("--config <path>", "the cloud config file naming the runner to stop").option("--now", "end running jobs immediately, with outcome stopped").action(async (opts) => {
5324
5323
  const { defaultRunnerConfigPath } = await import('./config-JJ3EO7SB.js');
5325
- const { requestStop } = await import('./loop-JTKSTVDV.js');
5324
+ const { requestStop } = await import('./loop-HTWKPG3J.js');
5326
5325
  const configPath = opts.config ?? defaultRunnerConfigPath();
5327
5326
  const { runnerImageVersion } = await import('./image-tag-5SJ6ZKT7.js');
5328
5327
  await requestStop(configPath, Boolean(opts.now), void 0, { image: runnerImageVersion() !== void 0 });
@@ -5330,8 +5329,8 @@ Next:
5330
5329
  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) => {
5331
5330
  const { defaultRunnerConfigPath, loadRunnerConfig } = await import('./config-JJ3EO7SB.js');
5332
5331
  const { jobsDir, runnerDir } = await import('./paths-ZC6BMWMT.js');
5333
- const { listJobFiles, runnerProcessState } = await import('./loop-JTKSTVDV.js');
5334
- const { renderStatus } = await import('./status-OTZ3VX47.js');
5332
+ const { listJobFiles, runnerProcessState } = await import('./loop-HTWKPG3J.js');
5333
+ const { renderStatus } = await import('./status-IAXWRX7B.js');
5335
5334
  const { readHousekeepingRecord } = await import('./record-K23IN6QN.js');
5336
5335
  const path2 = await import('path');
5337
5336
  const configPath = opts.config ?? defaultRunnerConfigPath();
@@ -5391,7 +5390,7 @@ Next:
5391
5390
  });
5392
5391
  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) => {
5393
5392
  const { defaultRunnerConfigPath } = await import('./config-JJ3EO7SB.js');
5394
- const { listJobFiles } = await import('./loop-JTKSTVDV.js');
5393
+ const { listJobFiles } = await import('./loop-HTWKPG3J.js');
5395
5394
  const { newestAttempt, logPathFor, tail, RunnerLogsError } = await import('./logs-VN2HKDSH.js');
5396
5395
  const configPath = opts.config ?? defaultRunnerConfigPath();
5397
5396
  const item = parseTrackerNumber(itemArg);
@@ -5426,23 +5425,6 @@ function registerHooksCommands(program2) {
5426
5425
  "after",
5427
5426
  "\n`init` auto-wraps PreToolUse/PostToolUse hooks; these subcommands cover the\nrest: manual re-scans, other events, and undo.\n"
5428
5427
  );
5429
- hooksCmd.command("install-git").description("Remove the git hooks an earlier version installed in this repo").addHelpText(
5430
- "after",
5431
- "\nEarlier versions installed a pre-commit guard and commit journal hooks. This removes\nthe ones OuterLayer wrote and leaves any hook it did not write untouched.\n"
5432
- ).action(() => {
5433
- const removal = removeJournalHooks(process.cwd());
5434
- if (removal.removed) {
5435
- process.stdout.write(`${C.green}\u2713${C.reset} removed the commit journal hooks an earlier version installed \u2192 ${removal.path}
5436
- `);
5437
- }
5438
- const guard = removePreCommitGuardHook(process.cwd());
5439
- if (guard.removed) {
5440
- process.stdout.write(`${C.green}\u2713${C.reset} removed the pre-commit guard an earlier version installed \u2192 ${guard.path}
5441
- `);
5442
- }
5443
- if (!removal.removed && !guard.removed) process.stdout.write(`${C.dim}No git hooks from an earlier version were found.${C.reset}
5444
- `);
5445
- });
5446
5428
  hooksCmd.command("status").description("List hook entries in user and project settings, marking the wrapped ones").option("--json", "machine-readable JSON output").action((opts) => {
5447
5429
  const report = [];
5448
5430
  for (const scope of ["user", "project"]) {
@@ -5648,37 +5630,6 @@ caller from the bearer token, the gateway answers 401 without that header.
5648
5630
  }
5649
5631
  });
5650
5632
  }
5651
- function registerImportCommands(program2) {
5652
- const importCmd = program2.command("import").description("Import an existing config format into .outerlayer/");
5653
- 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) => {
5654
- const { runImportRuler, ImportRulerError } = await import('./import-ruler-cmd-VJOHOJQ7.js');
5655
- try {
5656
- const result = runImportRuler({ cwd: opts.dir, json: opts.json });
5657
- if (result.exitCode !== 0) process.exitCode = result.exitCode;
5658
- } catch (err) {
5659
- if (err instanceof ImportRulerError) {
5660
- fail(err.message);
5661
- return;
5662
- }
5663
- throw err;
5664
- }
5665
- });
5666
- importCmd.command("capture").description("Install the maintained skills into .outerlayer/").option("--dir <path>", "repo root to write into (default: cwd)").option("--json", "machine-readable JSON output").addHelpText(
5667
- "after",
5668
- "\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"
5669
- ).action(async (opts) => {
5670
- const { runImportCapture, ImportCaptureError } = await import('./import-capture-cmd-TCOKNVBM.js');
5671
- try {
5672
- runImportCapture({ cwd: opts.dir, json: opts.json });
5673
- } catch (err) {
5674
- if (err instanceof ImportCaptureError) {
5675
- fail(err.message);
5676
- return;
5677
- }
5678
- throw err;
5679
- }
5680
- });
5681
- }
5682
5633
  function registerContextCommands(program2) {
5683
5634
  const contextCmd = program2.command("context").description("Compile agent context");
5684
5635
  contextCmd.command("emit").description("Compile .outerlayer/ into each configured target tool's native files").option("--check", "compare against disk, write nothing, exit 1 on drift (CI mode)").option("--dir <path>", "repo root to read from (default: cwd)").option("--json", "machine-readable JSON output").addHelpText(
@@ -3,17 +3,17 @@ import { createRequire } from 'node:module';
3
3
  import { runRunnerInstall, launcherSummary, restartNote } from './chunk-JF572PM5.js';
4
4
  import './chunk-KDDFI5MR.js';
5
5
  import { currentLink, execStartCommand } from './chunk-4IFKLYMM.js';
6
- import { detectMachine } from './chunk-PCADYUQT.js';
7
- import { helperSocketPath, ensureFirecrackerAndJailer } from './chunk-Z6SWQV77.js';
6
+ import { detectMachine } from './chunk-6S3UEBLB.js';
7
+ import { helperSocketPath, ensureFirecrackerAndJailer } from './chunk-6WZKI6LQ.js';
8
8
  import './chunk-665QWBNW.js';
9
9
  import './chunk-TQMI335S.js';
10
10
  import { DEFAULT_UNIT_NAME, installService, uninstallService, realTaskScheduler, UNIT_MARKER } from './chunk-MLD2NA7N.js';
11
- import './chunk-3RBQSPW5.js';
11
+ import './chunk-AINUN2TT.js';
12
12
  import './chunk-PYSKSROG.js';
13
13
  import './chunk-JBJTC3UU.js';
14
14
  import './chunk-OGFGZQA3.js';
15
- import { readJobFile } from './chunk-F4267APM.js';
16
- import { firecrackerArch, MICROVM_ARCHES, FIRECRACKER_VERSION, FIRECRACKER_BINARY_SHA256, JAILER_BINARY_SHA256, HOST_HELPER_SHA256, HOST_HELPER_BASE_URL, HOST_HELPER_ASSETS_VERSION, hostHelperPinned } from './chunk-APBTVIM4.js';
15
+ import { readJobFile } from './chunk-7I6GZSN3.js';
16
+ import { firecrackerArch, MICROVM_ARCHES, FIRECRACKER_VERSION, FIRECRACKER_BINARY_SHA256, JAILER_BINARY_SHA256, HOST_HELPER_SHA256, HOST_HELPER_BASE_URL, HOST_HELPER_ASSETS_VERSION, hostHelperPinned } from './chunk-4R24DSL2.js';
17
17
  import './chunk-HPOEVC2V.js';
18
18
  import './chunk-XGJUNNXL.js';
19
19
  import './chunk-WVM6PM2N.js';
@@ -1,19 +1,19 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { RunnerInitError, prepareRunnerInit, writeRunnerInit } from './chunk-QBENN6GA.js';
4
- import { detectMachine, supportsContainerBuilds, describeMachineDocker } from './chunk-PCADYUQT.js';
5
- import { MIN_ENGINE_MAJOR } from './chunk-Z6SWQV77.js';
3
+ import { RunnerInitError, prepareRunnerInit, writeRunnerInit } from './chunk-ARMZI56S.js';
4
+ import { detectMachine, supportsContainerBuilds, describeMachineDocker } from './chunk-6S3UEBLB.js';
5
+ import { MIN_ENGINE_MAJOR } from './chunk-6WZKI6LQ.js';
6
6
  import { runnerImageVersion, IMAGE_VERSION_VARIABLE } from './chunk-665QWBNW.js';
7
7
  import './chunk-TQMI335S.js';
8
8
  import { isAgentName, AGENT_COMMANDS } from './chunk-5PMQDQFV.js';
9
9
  import './chunk-MLD2NA7N.js';
10
10
  import './chunk-6MZSX4M7.js';
11
- import './chunk-3RBQSPW5.js';
11
+ import './chunk-AINUN2TT.js';
12
12
  import './chunk-PYSKSROG.js';
13
13
  import './chunk-JBJTC3UU.js';
14
14
  import './chunk-OGFGZQA3.js';
15
- import './chunk-F4267APM.js';
16
- import './chunk-APBTVIM4.js';
15
+ import './chunk-7I6GZSN3.js';
16
+ import './chunk-4R24DSL2.js';
17
17
  import './chunk-HPOEVC2V.js';
18
18
  import './chunk-XGJUNNXL.js';
19
19
  import './chunk-WVM6PM2N.js';
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { childEnvironment, createDockerHost, spawnRun } from './chunk-F4267APM.js';
4
- import './chunk-APBTVIM4.js';
3
+ export { childEnvironment, createDockerHost, spawnRun } from './chunk-7I6GZSN3.js';
4
+ import './chunk-4R24DSL2.js';
5
5
  import './chunk-7RQ73DLO.js';
6
6
  import './chunk-QE3UQAHK.js';
7
7
  import './chunk-QZBXLLTV.js';
@@ -1,24 +1,24 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
3
  import { launcherCheck } from './chunk-KDDFI5MR.js';
4
- import { needsClaudeCredential, claudeCredentialCheck, missingPermissionOf, missingPermissionFix } from './chunk-Z453MOUL.js';
4
+ import { needsClaudeCredential, claudeCredentialCheck, missingPermissionOf, missingPermissionFix } from './chunk-TI33WRBT.js';
5
5
  import './chunk-4IFKLYMM.js';
6
6
  import { freeBytes, formatBytes } from './chunk-YYYRBYWG.js';
7
7
  import { RepoFilter } from './chunk-TBT347UY.js';
8
- import './chunk-QBENN6GA.js';
9
- import { detectMachine, supportsContainerBuilds, describeMachineDocker, reachDockerStep, supportsMicroVmBuilds, microVmArchSupported, microVmAssetsPinned } from './chunk-PCADYUQT.js';
10
- import { MIN_ENGINE_MAJOR, probeHelper, helperSocketPath } from './chunk-Z6SWQV77.js';
8
+ import './chunk-ARMZI56S.js';
9
+ import { detectMachine, supportsContainerBuilds, describeMachineDocker, reachDockerStep, supportsMicroVmBuilds, microVmArchSupported, microVmAssetsPinned } from './chunk-6S3UEBLB.js';
10
+ import { MIN_ENGINE_MAJOR, helperFirecrackerNote, probeHelper, helperSocketPath } from './chunk-6WZKI6LQ.js';
11
11
  import { runnerImageVersion, imageAdvice, readUpdateStatus, imageTag, pullInstruction } from './chunk-665QWBNW.js';
12
12
  import './chunk-TQMI335S.js';
13
13
  import './chunk-5PMQDQFV.js';
14
14
  import './chunk-MLD2NA7N.js';
15
15
  import './chunk-6MZSX4M7.js';
16
- import './chunk-3RBQSPW5.js';
16
+ import './chunk-AINUN2TT.js';
17
17
  import './chunk-PYSKSROG.js';
18
18
  import './chunk-JBJTC3UU.js';
19
19
  import './chunk-OGFGZQA3.js';
20
- import { resolveDevcontainerCli, buildxState, spawnRun } from './chunk-F4267APM.js';
21
- import { locateRecipe, assertBuildable, readRecipe, RecipeError, CLAUDE_CODE_VERSION } from './chunk-APBTVIM4.js';
20
+ import { resolveDevcontainerCli, buildxState, spawnRun } from './chunk-7I6GZSN3.js';
21
+ import { locateRecipe, assertBuildable, readRecipe, RecipeError, FIRECRACKER_VERSION, CLAUDE_CODE_VERSION } from './chunk-4R24DSL2.js';
22
22
  import './chunk-HPOEVC2V.js';
23
23
  import './chunk-XGJUNNXL.js';
24
24
  import './chunk-WVM6PM2N.js';
@@ -137,6 +137,9 @@ function helperCheck(facts) {
137
137
  fix: `run \`chmod 700 ${facts.writableBuildsDir}\``
138
138
  };
139
139
  }
140
+ if (facts.present && facts.firecracker !== FIRECRACKER_VERSION) {
141
+ return { name, status: "warn", detail: helperFirecrackerNote(facts.firecracker), fix: REINSTALL };
142
+ }
140
143
  if (facts.present) {
141
144
  return {
142
145
  name,
package/dist/index.js CHANGED
@@ -26,5 +26,5 @@ if (argv[0] === "claude") {
26
26
  process.exit(await runClaudeLauncher(argv.slice(1)));
27
27
  }
28
28
  (await import('./hook-fast-GD7F2EBL.js')).recordLinkExitFailure(argv);
29
- var { runCli } = await import('./cli-ZBZFCRTK.js');
29
+ var { runCli } = await import('./cli-CD4UNXBY.js');
30
30
  await runCli(process.argv);
@@ -1,20 +1,20 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
3
  import { npmSupportsProvenance } from './chunk-YETTWTAY.js';
4
- import { RunnerInitError, readConfigObject } from './chunk-QBENN6GA.js';
5
- import './chunk-PCADYUQT.js';
6
- import './chunk-Z6SWQV77.js';
4
+ import { RunnerInitError, readConfigObject } from './chunk-ARMZI56S.js';
5
+ import './chunk-6S3UEBLB.js';
6
+ import './chunk-6WZKI6LQ.js';
7
7
  import './chunk-665QWBNW.js';
8
8
  import './chunk-TQMI335S.js';
9
9
  import './chunk-5PMQDQFV.js';
10
10
  import { checkFit, VM_SERVICE_NAME, RUNNER_RESERVE_BYTES } from './chunk-MLD2NA7N.js';
11
11
  import './chunk-6MZSX4M7.js';
12
- import './chunk-3RBQSPW5.js';
12
+ import './chunk-AINUN2TT.js';
13
13
  import './chunk-PYSKSROG.js';
14
14
  import './chunk-JBJTC3UU.js';
15
15
  import './chunk-OGFGZQA3.js';
16
- import './chunk-F4267APM.js';
17
- import './chunk-APBTVIM4.js';
16
+ import './chunk-7I6GZSN3.js';
17
+ import './chunk-4R24DSL2.js';
18
18
  import './chunk-HPOEVC2V.js';
19
19
  import './chunk-XGJUNNXL.js';
20
20
  import './chunk-WVM6PM2N.js';
@@ -1,19 +1,19 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { PLACEHOLDER_MARKER, RunnerInitError, isPlaceholderCommand, prepareRunnerInit, readConfigObject, runRunnerInit, writeRunnerInit } from './chunk-QBENN6GA.js';
4
- import './chunk-PCADYUQT.js';
5
- import './chunk-Z6SWQV77.js';
3
+ export { PLACEHOLDER_MARKER, RunnerInitError, isPlaceholderCommand, prepareRunnerInit, readConfigObject, runRunnerInit, writeRunnerInit } from './chunk-ARMZI56S.js';
4
+ import './chunk-6S3UEBLB.js';
5
+ import './chunk-6WZKI6LQ.js';
6
6
  import './chunk-665QWBNW.js';
7
7
  import './chunk-TQMI335S.js';
8
8
  import './chunk-5PMQDQFV.js';
9
9
  import './chunk-MLD2NA7N.js';
10
10
  import './chunk-6MZSX4M7.js';
11
- import './chunk-3RBQSPW5.js';
11
+ import './chunk-AINUN2TT.js';
12
12
  import './chunk-PYSKSROG.js';
13
13
  import './chunk-JBJTC3UU.js';
14
14
  import './chunk-OGFGZQA3.js';
15
- import './chunk-F4267APM.js';
16
- import './chunk-APBTVIM4.js';
15
+ import './chunk-7I6GZSN3.js';
16
+ import './chunk-4R24DSL2.js';
17
17
  import './chunk-HPOEVC2V.js';
18
18
  import './chunk-XGJUNNXL.js';
19
19
  import './chunk-WVM6PM2N.js';
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { summarizeChecks, summaryText, renderDoctorText } from './chunk-WXKAHUGA.js';
3
+ import { summarizeChecks, summaryText, renderDoctorText } from './chunk-XK7FRM5J.js';
4
4
  import './chunk-XFGL53GU.js';
5
5
  import { shellFunctionInstalled, removeShellFunction, installShellFunction, SHELL_FUNCTION_LINE } from './chunk-CJJDJ7AT.js';
6
6
  import './chunk-VJBFQP3H.js';
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { RunnerStartError, listJobFiles, logUnusableHelper, probeBuild, probeCredentials, requestStop, runnerProcessState, start, tick, watchTick } from './chunk-WMEADVIX.js';
4
- import './chunk-CP24ZXXR.js';
3
+ export { RunnerStartError, listJobFiles, logUnusableHelper, probeBuild, probeCredentials, requestStop, runnerProcessState, start, tick, watchTick } from './chunk-DVAAATJP.js';
4
+ import './chunk-4QKHBDEN.js';
5
5
  import './chunk-TKL74NLB.js';
6
6
  import './chunk-ZVB57WI6.js';
7
7
  import './chunk-6FAP657M.js';
@@ -14,24 +14,24 @@ import './chunk-UNF7MWEL.js';
14
14
  import './chunk-ITP76BST.js';
15
15
  import './chunk-P7UQZFNY.js';
16
16
  import './chunk-ESVW4MJY.js';
17
- import './chunk-Z453MOUL.js';
17
+ import './chunk-TI33WRBT.js';
18
18
  import './chunk-4IFKLYMM.js';
19
19
  import './chunk-YYYRBYWG.js';
20
20
  import './chunk-TBT347UY.js';
21
- import './chunk-QBENN6GA.js';
22
- import './chunk-PCADYUQT.js';
23
- import './chunk-Z6SWQV77.js';
21
+ import './chunk-ARMZI56S.js';
22
+ import './chunk-6S3UEBLB.js';
23
+ import './chunk-6WZKI6LQ.js';
24
24
  import './chunk-665QWBNW.js';
25
25
  import './chunk-TQMI335S.js';
26
26
  import './chunk-5PMQDQFV.js';
27
27
  import './chunk-MLD2NA7N.js';
28
28
  import './chunk-6MZSX4M7.js';
29
- import './chunk-3RBQSPW5.js';
29
+ import './chunk-AINUN2TT.js';
30
30
  import './chunk-PYSKSROG.js';
31
31
  import './chunk-JBJTC3UU.js';
32
32
  import './chunk-OGFGZQA3.js';
33
- import './chunk-F4267APM.js';
34
- import './chunk-APBTVIM4.js';
33
+ import './chunk-7I6GZSN3.js';
34
+ import './chunk-4R24DSL2.js';
35
35
  import './chunk-HPOEVC2V.js';
36
36
  import './chunk-XGJUNNXL.js';
37
37
  import './chunk-WVM6PM2N.js';
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { describeMachineDocker, detectMachine, microVmArchSupported, microVmAssetsPinned, reachDockerStep, supportsContainerBuilds, supportsMicroVmBuilds } from './chunk-PCADYUQT.js';
4
- import './chunk-Z6SWQV77.js';
3
+ export { describeMachineDocker, detectMachine, microVmArchSupported, microVmAssetsPinned, reachDockerStep, supportsContainerBuilds, supportsMicroVmBuilds } from './chunk-6S3UEBLB.js';
4
+ import './chunk-6WZKI6LQ.js';
5
5
  import './chunk-665QWBNW.js';
6
6
  import './chunk-TQMI335S.js';
7
- import './chunk-3RBQSPW5.js';
7
+ import './chunk-AINUN2TT.js';
8
8
  import './chunk-PYSKSROG.js';
9
9
  import './chunk-JBJTC3UU.js';
10
10
  import './chunk-OGFGZQA3.js';
11
- import './chunk-F4267APM.js';
12
- import './chunk-APBTVIM4.js';
11
+ import './chunk-7I6GZSN3.js';
12
+ import './chunk-4R24DSL2.js';
13
13
  import './chunk-HPOEVC2V.js';
14
14
  import './chunk-XGJUNNXL.js';
15
15
  import './chunk-WVM6PM2N.js';
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { RUNNER_LABEL, builderNameFor, dockerIdentity, ensureRunnerIdentity, pathLabelValue, readRunnerIdentity } from './chunk-F4267APM.js';
4
- import './chunk-APBTVIM4.js';
3
+ export { RUNNER_LABEL, builderNameFor, dockerIdentity, ensureRunnerIdentity, pathLabelValue, readRunnerIdentity } from './chunk-7I6GZSN3.js';
4
+ import './chunk-4R24DSL2.js';
5
5
  import './chunk-7RQ73DLO.js';
6
6
  import './chunk-QE3UQAHK.js';
7
7
  import './chunk-QZBXLLTV.js';
@@ -1,19 +1,19 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { readConfigObject, RunnerInitError } from './chunk-QBENN6GA.js';
4
- import './chunk-PCADYUQT.js';
5
- import './chunk-Z6SWQV77.js';
3
+ import { readConfigObject, RunnerInitError } from './chunk-ARMZI56S.js';
4
+ import './chunk-6S3UEBLB.js';
5
+ import './chunk-6WZKI6LQ.js';
6
6
  import './chunk-665QWBNW.js';
7
7
  import './chunk-TQMI335S.js';
8
8
  import './chunk-5PMQDQFV.js';
9
9
  import './chunk-MLD2NA7N.js';
10
10
  import './chunk-6MZSX4M7.js';
11
- import './chunk-3RBQSPW5.js';
11
+ import './chunk-AINUN2TT.js';
12
12
  import './chunk-PYSKSROG.js';
13
13
  import './chunk-JBJTC3UU.js';
14
14
  import './chunk-OGFGZQA3.js';
15
- import './chunk-F4267APM.js';
16
- import './chunk-APBTVIM4.js';
15
+ import './chunk-7I6GZSN3.js';
16
+ import './chunk-4R24DSL2.js';
17
17
  import './chunk-HPOEVC2V.js';
18
18
  import './chunk-XGJUNNXL.js';
19
19
  import './chunk-WVM6PM2N.js';
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { isReadable, ALREADY_RELEASED, RENEW_INTERVAL_SECONDS } from './chunk-CP24ZXXR.js';
3
+ import { isReadable, ALREADY_RELEASED, RENEW_INTERVAL_SECONDS } from './chunk-4QKHBDEN.js';
4
4
  import { jobStateFormatOf } from './chunk-ZVB57WI6.js';
5
5
  import './chunk-XBCJI6SV.js';
6
6
  import './chunk-2N72GPS2.js';
@@ -10,15 +10,15 @@ import './chunk-P7UQZFNY.js';
10
10
  import './chunk-ESVW4MJY.js';
11
11
  import { formatBytes } from './chunk-YYYRBYWG.js';
12
12
  import './chunk-TBT347UY.js';
13
- import { LEASE_SECONDS } from './chunk-Z6SWQV77.js';
13
+ import { LEASE_SECONDS } from './chunk-6WZKI6LQ.js';
14
14
  import { pullInstruction } from './chunk-665QWBNW.js';
15
15
  import './chunk-TQMI335S.js';
16
- import './chunk-3RBQSPW5.js';
16
+ import './chunk-AINUN2TT.js';
17
17
  import './chunk-PYSKSROG.js';
18
18
  import './chunk-JBJTC3UU.js';
19
19
  import './chunk-OGFGZQA3.js';
20
- import './chunk-F4267APM.js';
21
- import './chunk-APBTVIM4.js';
20
+ import './chunk-7I6GZSN3.js';
21
+ import './chunk-4R24DSL2.js';
22
22
  import './chunk-HPOEVC2V.js';
23
23
  import './chunk-XGJUNNXL.js';
24
24
  import { formatDuration, formatClock, relativeToRunner } from './chunk-WVM6PM2N.js';
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@outerlayer/cli",
3
- "version": "0.25.2",
4
- "description": "OuterLayer CLI — commands: init, claude, connect, doctor, login, logout, sync, daemon (alias: watch), emit, work, spec, runner, hooks, mcp, import, context. Capture and sync coding-agent sessions, and record proof of factory work.",
3
+ "version": "0.26.0",
4
+ "description": "OuterLayer CLI — commands: init, claude, connect, doctor, login, logout, sync, daemon (alias: watch), emit, work, spec, runner, hooks, mcp, context. Capture and sync coding-agent sessions, and record proof of factory work.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Magu Studios, Inc.",
7
7
  "repository": {
@@ -1,73 +0,0 @@
1
- #!/usr/bin/env node
2
- import { createRequire } from 'node:module';
3
- import { C } from './chunk-ANPNT6PM.js';
4
- import { skillsBaseFor, isAgentsMdLayout } from './chunk-JKNYTNYD.js';
5
- import { loadMaintainedFiles, writeMaintainedFiles } from './chunk-HBISTTG3.js';
6
- import { cliInvocation } from './chunk-CRB3POP4.js';
7
- import './chunk-RKOTJQVG.js';
8
- import './chunk-QZBXLLTV.js';
9
- import './chunk-VNVZDWO3.js';
10
- import './chunk-RA3O54FC.js';
11
- import './chunk-Z5GEFMRW.js';
12
- import { statSync, existsSync, readFileSync, writeFileSync } from 'fs';
13
- import { join } from 'path';
14
-
15
- createRequire(import.meta.url);
16
- var ImportCaptureError = class extends Error {
17
- };
18
- var SNIPPET_FILE = "outerlayer-evidence/references/agents-snippet.md";
19
- var AGENTS_MD_MARKER = "<!-- outerlayer:capture-pack -->";
20
- function runImportCapture(opts = {}) {
21
- const cwd = opts.cwd ?? process.cwd();
22
- let cwdStat;
23
- try {
24
- cwdStat = statSync(cwd);
25
- } catch {
26
- throw new ImportCaptureError(`no such directory: ${cwd}`);
27
- }
28
- if (!cwdStat.isDirectory()) throw new ImportCaptureError(`not a directory: ${cwd}`);
29
- const base = skillsBaseFor(cwd);
30
- const SNIPPET_PATH = `${base}/${SNIPPET_FILE}`;
31
- const AGENTS_MD_PATH = isAgentsMdLayout(cwd) ? "AGENTS.md" : ".outerlayer/AGENTS.md";
32
- const bundle = loadMaintainedFiles(void 0, void 0, base);
33
- const { created: files, rewritten } = writeMaintainedFiles(cwd, bundle);
34
- const snippet = bundle.find((f) => f.path === SNIPPET_PATH)?.content ?? "";
35
- let appendedAgentsMd = false;
36
- const agentsMdAbs = join(cwd, AGENTS_MD_PATH);
37
- if (existsSync(agentsMdAbs)) {
38
- const existing = readFileSync(agentsMdAbs, "utf8");
39
- if (!existing.includes(AGENTS_MD_MARKER)) {
40
- writeFileSync(agentsMdAbs, existing + "\n" + snippet);
41
- appendedAgentsMd = true;
42
- }
43
- }
44
- let output;
45
- if (opts.json) {
46
- output = JSON.stringify({ files, rewritten, appendedAgentsMd });
47
- } else {
48
- const lines = [
49
- ...files.map((f) => `${C.green}\u2713${C.reset} wrote ${f}`),
50
- ...rewritten.map((f) => `${C.yellow}!${C.reset} rewrote ${f} to match this CLI's bundle (local edits were overwritten)`)
51
- ];
52
- if (appendedAgentsMd) lines.push(`${C.green}\u2713${C.reset} appended the evidence snippet to ${AGENTS_MD_PATH}`);
53
- if (files.length === 0 && rewritten.length === 0 && !appendedAgentsMd) {
54
- lines.push(`${C.dim}capture pack already installed \u2014 nothing to write${C.reset}`);
55
- }
56
- if (!isAgentsMdLayout(cwd)) {
57
- lines.push(`Run ${C.yellow}\`${cliInvocation()} context emit\`${C.reset} to compile the pack into your agent's native files.`);
58
- }
59
- output = lines.join("\n");
60
- }
61
- if (!opts.quiet) {
62
- process.stdout.write(output + "\n");
63
- if (!opts.json && !appendedAgentsMd && !existsSync(agentsMdAbs)) {
64
- process.stdout.write(
65
- `${C.dim} no ${AGENTS_MD_PATH} to append to \u2014 paste ${SNIPPET_PATH} into your instructions file if your harness reads no skills${C.reset}
66
- `
67
- );
68
- }
69
- }
70
- return { files, rewritten, appendedAgentsMd, output };
71
- }
72
-
73
- export { ImportCaptureError, runImportCapture };
@@ -1,173 +0,0 @@
1
- #!/usr/bin/env node
2
- import { createRequire } from 'node:module';
3
- import { C } from './chunk-ANPNT6PM.js';
4
- import './chunk-CRB3POP4.js';
5
- import { normalizePath } from './chunk-RKOTJQVG.js';
6
- import './chunk-QZBXLLTV.js';
7
- import './chunk-VNVZDWO3.js';
8
- import './chunk-Z5GEFMRW.js';
9
- import { existsSync, readdirSync, readFileSync, mkdirSync, writeFileSync } from 'fs';
10
- import { join, dirname } from 'path';
11
-
12
- createRequire(import.meta.url);
13
- var SKIP_DIRS = /* @__PURE__ */ new Set(["node_modules", ".git"]);
14
- var ImportRulerError = class extends Error {
15
- };
16
- function toRepoRelative(base, name) {
17
- return normalizePath(`${base}/${name}`);
18
- }
19
- function discoverRulerDirs(repoRoot) {
20
- const out = [];
21
- walk(repoRoot, repoRoot, "", out);
22
- return out.sort();
23
- }
24
- function walk(dirAbs, repoRoot, dirRel, out) {
25
- let entries;
26
- try {
27
- entries = readdirSync(dirAbs, { withFileTypes: true });
28
- } catch {
29
- return;
30
- }
31
- for (const entry of entries) {
32
- if (entry.isSymbolicLink() || !entry.isDirectory()) continue;
33
- if (SKIP_DIRS.has(entry.name)) continue;
34
- const childRel = dirRel === "" ? entry.name : toRepoRelative(dirRel, entry.name);
35
- if (entry.name === ".ruler") {
36
- out.push(childRel);
37
- continue;
38
- }
39
- walk(join(dirAbs, entry.name), repoRoot, childRel, out);
40
- }
41
- }
42
- function collectFilesRecursively(dirAbs, dirRel) {
43
- const out = [];
44
- let entries;
45
- try {
46
- entries = readdirSync(dirAbs, { withFileTypes: true });
47
- } catch {
48
- return out;
49
- }
50
- for (const entry of entries) {
51
- if (entry.isSymbolicLink()) continue;
52
- const childRel = toRepoRelative(dirRel, entry.name);
53
- const childAbs = join(dirAbs, entry.name);
54
- if (entry.isDirectory()) out.push(...collectFilesRecursively(childAbs, childRel));
55
- else if (entry.isFile()) out.push(childRel);
56
- }
57
- return out;
58
- }
59
- function catalogRulerDir(repoRoot, rulerDirRel) {
60
- const abs = join(repoRoot, rulerDirRel);
61
- const catalog = { otherMd: [], unmapped: [] };
62
- const mdFilenames = [];
63
- let entries;
64
- try {
65
- entries = readdirSync(abs, { withFileTypes: true });
66
- } catch {
67
- entries = [];
68
- }
69
- for (const entry of entries) {
70
- if (entry.isSymbolicLink()) continue;
71
- const childRel = toRepoRelative(rulerDirRel, entry.name);
72
- if (entry.isDirectory()) {
73
- catalog.unmapped.push(...collectFilesRecursively(join(abs, entry.name), childRel));
74
- continue;
75
- }
76
- if (!entry.isFile()) continue;
77
- if (entry.name === "AGENTS.md") catalog.agentsMd = readFileSync(join(abs, entry.name), "utf8");
78
- else if (entry.name === "mcp.json") catalog.mcpJson = readFileSync(join(abs, entry.name), "utf8");
79
- else if (entry.name === "ruler.toml") catalog.rulerTomlPath = childRel;
80
- else if (entry.name.endsWith(".md")) mdFilenames.push(entry.name);
81
- else catalog.unmapped.push(childRel);
82
- }
83
- catalog.otherMd = mdFilenames.sort((a, b) => a.localeCompare(b)).map((filename) => ({ filename, content: readFileSync(join(abs, filename), "utf8") }));
84
- return catalog;
85
- }
86
- function scopeOf(rulerDirRel) {
87
- if (rulerDirRel === ".ruler") return "";
88
- return rulerDirRel.slice(0, rulerDirRel.length - "/.ruler".length);
89
- }
90
- function outerlayerDirFor(scopePath) {
91
- return scopePath === "" ? ".outerlayer" : `${scopePath}/.outerlayer`;
92
- }
93
- function writeOutFile(repoRoot, relPath, content) {
94
- const abs = join(repoRoot, relPath);
95
- mkdirSync(dirname(abs), { recursive: true });
96
- writeFileSync(abs, content);
97
- }
98
- function renderSuccess(scopes, warnings) {
99
- const warningSuffix = warnings.length > 0 ? `, ${warnings.length} warning${warnings.length === 1 ? "" : "s"}` : "";
100
- const lines = [`${C.green}\u2713${C.reset} imported ${scopes.length} .ruler/ scope${scopes.length === 1 ? "" : "s"}${warningSuffix}`];
101
- for (const s of scopes) {
102
- const written = [s.agentsMdWritten, s.mcpWritten].filter((p) => p !== void 0);
103
- lines.push(` ${C.dim}${s.scopePath === "" ? "(root)" : s.scopePath}${C.reset} \u2192 ${written.join(", ") || "nothing to import"}`);
104
- }
105
- return lines.join("\n");
106
- }
107
- function runImportRuler(opts = {}) {
108
- const cwd = opts.cwd ?? process.cwd();
109
- if (!existsSync(cwd)) throw new ImportRulerError(`no such directory: ${cwd}`);
110
- const rulerDirs = discoverRulerDirs(cwd);
111
- if (rulerDirs.length === 0) {
112
- const output2 = opts.json ? JSON.stringify({ scopes: [], warnings: [] }) : `${C.dim}no .ruler/ directories found \u2014 nothing to import${C.reset}`;
113
- if (!opts.quiet) process.stdout.write(output2 + "\n");
114
- return { scopes: [], warnings: [], output: output2, exitCode: 0 };
115
- }
116
- const conflicts = rulerDirs.map((rel) => outerlayerDirFor(scopeOf(rel))).filter((outerlayerRel) => existsSync(join(cwd, outerlayerRel)));
117
- if (conflicts.length > 0) {
118
- throw new ImportRulerError(
119
- `refusing to import \u2014 .outerlayer/ already exists at: ${conflicts.join(", ")} (never overwritten; remove it first to replace it)`
120
- );
121
- }
122
- const scopes = [];
123
- const warnings = [];
124
- for (const rulerDirRel of rulerDirs) {
125
- const scopePath = scopeOf(rulerDirRel);
126
- const outerlayerRel = outerlayerDirFor(scopePath);
127
- const catalog = catalogRulerDir(cwd, rulerDirRel);
128
- const scope = { scopePath };
129
- if (catalog.agentsMd !== void 0 || catalog.otherMd.length > 0) {
130
- let content = catalog.agentsMd ?? "";
131
- for (const { filename, content: mdContent } of catalog.otherMd) {
132
- content += `
133
-
134
- <!-- imported from .ruler/${filename} -->
135
-
136
- ${mdContent}`;
137
- }
138
- const agentsPath = toRepoRelative(outerlayerRel, "AGENTS.md");
139
- writeOutFile(cwd, agentsPath, content);
140
- scope.agentsMdWritten = agentsPath;
141
- }
142
- if (catalog.mcpJson !== void 0) {
143
- const mcpPath = toRepoRelative(outerlayerRel, "mcp.json");
144
- writeOutFile(cwd, mcpPath, catalog.mcpJson);
145
- scope.mcpWritten = mcpPath;
146
- }
147
- if (catalog.rulerTomlPath !== void 0) {
148
- warnings.push({
149
- code: "ruler_toml_not_imported",
150
- path: catalog.rulerTomlPath,
151
- message: `${catalog.rulerTomlPath} was not imported \u2014 target selection now lives in .outerlayer/config.json; per-tool config is superseded`
152
- });
153
- }
154
- for (const path of catalog.unmapped) {
155
- warnings.push({ code: "unmapped_file", path, message: `${path} has no .outerlayer/ equivalent \u2014 not imported` });
156
- }
157
- scopes.push(scope);
158
- }
159
- warnings.sort((a, b) => a.path.localeCompare(b.path));
160
- const output = opts.json ? JSON.stringify({ scopes, warnings }) : renderSuccess(scopes, warnings);
161
- if (!opts.quiet) {
162
- if (opts.json) {
163
- process.stdout.write(output + "\n");
164
- } else {
165
- process.stdout.write(output + "\n");
166
- for (const w of warnings) process.stderr.write(` ${C.yellow}!${C.reset} ${w.path}: ${w.message}
167
- `);
168
- }
169
- }
170
- return { scopes, warnings, output, exitCode: 0 };
171
- }
172
-
173
- export { ImportRulerError, runImportRuler };