@outerlayer/cli 0.8.4 → 0.8.6

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @outerlayer/cli
2
2
 
3
+ ## 0.8.6
4
+
5
+ ### Patch Changes
6
+
7
+ - 30ac1c5: A runner no longer reads a person's review as a check result. A build whose OuterLayer checks pass now finishes whether or not a person has reviewed it or marked a criterion as failed.
8
+
9
+ ## 0.8.5
10
+
11
+ ### Patch Changes
12
+
13
+ - 32bd8fd: A runner its service started through `current` no longer says it cannot update itself while it is already draining to restart onto a version `runner install` put in place. That line told the operator to restart the runner, but the restart was already scheduled. The runner now logs only that it is taking no new work and will restart once its builds finish. A runner started by hand, or one whose service starts a version directory, still gets the line, because nothing restarts it for them.
14
+
3
15
  ## 0.8.4
4
16
 
5
17
  ### Patch Changes
package/README.md CHANGED
@@ -433,9 +433,9 @@ or whose evaluation is still waiting on a session link, with the code
433
433
  commit of every pull request the item had at the time; once one of them
434
434
  moves, that pass stops counting and a fresh review is needed. The base
435
435
  branch's `review` policy key (default `required`, beside `merge_gate`)
436
- holds the item at "Awaiting a person's review" until a current pass
437
- exists. The evidence check on GitHub does not wait for that review: it
438
- completes once the automated checks pass and says the review is pending.
436
+ changes only what the evidence check's title says. The check on GitHub never
437
+ waits for the review: it completes once OuterLayer's checks pass, and under
438
+ `merge_gate: on-flag` a person's request for changes fails it.
439
439
 
440
440
  A criterion thread is scoped to one acceptance criterion rather than the
441
441
  whole item: an agent attaches proof with `outerlayer work comment
@@ -1 +1 @@
1
- {"id":"2026-10-05T21:17:18.405Z+2bfc970","root":"/home/runner/_work/outerlayer/outerlayer","pkg":"outerlayer"}
1
+ {"id":"2026-10-06T01:19:33.337Z+ce11b1f","root":"/home/runner/_work/outerlayer/outerlayer","pkg":"outerlayer"}
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { probeCredentials } from './chunk-LUY6I65J.js';
3
+ import { probeCredentials } from './chunk-NQWTCX3A.js';
4
4
  import './chunk-IS4DIGBQ.js';
5
5
  import './chunk-I2UOAV7X.js';
6
- import './chunk-4KPMIGBQ.js';
6
+ import './chunk-ALCXFVUV.js';
7
7
  import './chunk-T6OIJQRT.js';
8
8
  import './chunk-AIW6GLET.js';
9
9
  import './chunk-UGP76IZ5.js';
@@ -832,7 +832,6 @@ function decideFromEvaluation(read) {
832
832
  if (evaluation === null) return { outcome: "incomplete", reason: "the item has no evidence evaluation yet" };
833
833
  if (evaluation.open.length > 0) return { outcome: "incomplete", reason: fit("checks not passing: ", evaluation.open.map(rowText)) };
834
834
  if (evaluation.verdict === "pass") return { outcome: "ok" };
835
- if (evaluation.verdict === "waiting" && evaluation.waitingOn === "review") return { outcome: "ok" };
836
835
  if (evaluation.verdict === "waiting" && evaluation.waitingOn === "links") {
837
836
  return { outcome: "incomplete", reason: "the item's evidence was still waiting on session links to be confirmed" };
838
837
  }
@@ -2,12 +2,12 @@
2
2
  import { createRequire } from 'node:module';
3
3
  import { decideInstalledSwitch, fetchVersionMeta, npmVersion, npmSupportsProvenance, fetchTarballDigest, fetchProvenance, installVersion, auditSignatures } from './chunk-IS4DIGBQ.js';
4
4
  import { compareVersions, satisfiesRange } from './chunk-I2UOAV7X.js';
5
- import { LEASE_SECONDS, releaseLease, isUnfinished, setStage, jobEnv, runHook, describeHookEnd, provisionMicroVm, deliverCommitHooks, provisionProcess, provisionEnvironment, readProvisionOut, resolveHostBuild, workdirProblem, listenOnBroker, hostEnvironment, hostCommandEnvironment, execArgv, microVmCommandLine, runCommand, execCommandLine, startSender, startHostServices, finishJob, isGroupAlive, outcomeFromExitCode, isTimedOut, readCpuUsec, isIdle, stopOrphanedMicroVms, unfinishedJobs, listAdoptableJobs, retryFailedReleases, recoverLostJobs, hookLimitsFor, needsRenew, renewLease, RENEW_INTERVAL_SECONDS, ALREADY_RELEASED } from './chunk-4KPMIGBQ.js';
5
+ import { LEASE_SECONDS, releaseLease, isUnfinished, setStage, jobEnv, runHook, describeHookEnd, provisionMicroVm, deliverCommitHooks, provisionProcess, provisionEnvironment, readProvisionOut, resolveHostBuild, workdirProblem, listenOnBroker, hostEnvironment, hostCommandEnvironment, execArgv, microVmCommandLine, runCommand, execCommandLine, startSender, startHostServices, finishJob, isGroupAlive, outcomeFromExitCode, isTimedOut, readCpuUsec, isIdle, stopOrphanedMicroVms, unfinishedJobs, listAdoptableJobs, retryFailedReleases, recoverLostJobs, hookLimitsFor, needsRenew, renewLease, RENEW_INTERVAL_SECONDS, ALREADY_RELEASED } from './chunk-ALCXFVUV.js';
6
6
  import { writeJobFile, readJobFile, readJobFileChecked } from './chunk-T6OIJQRT.js';
7
7
  import { RUNNER_PROTOCOL } from './chunk-AIW6GLET.js';
8
8
  import { readHousekeepingRecord, writeHousekeepingRecord } from './chunk-UGP76IZ5.js';
9
9
  import { placeholderQueues, placeholderProblem } from './chunk-SWGQAURM.js';
10
- import { currentVersion, entryIn, versionDir, startedThroughCurrent, writeMarker, readMarker, removeMarker, switchCurrent, cleanVersions, isInLayout, stagingDir } from './chunk-TI7B7UEO.js';
10
+ import { writeMarker, readMarker, currentVersion, removeMarker, entryIn, versionDir, startedThroughCurrent, switchCurrent, cleanVersions, isInLayout, stagingDir } from './chunk-TI7B7UEO.js';
11
11
  import { freeBytes, formatBytes } from './chunk-YYYRBYWG.js';
12
12
  import { RepoFilter } from './chunk-TBT347UY.js';
13
13
  import { describeCallFailure, retrySend, shortClaim, relativeToRunner, formatDuration, provisionContainer, lifecycleSteps, lifecycleFailureReason, prepareBranch, containerCommandLine, BuildTokens, classifyRefusal, refusalCode, measureDisk, createRunnerLog, setUpRunnerCgroup, parseCpuList, ensureTunnel, keepGhConfigCurrent, createContainerRuntime, formatClock } from './chunk-GJ3OWUFO.js';
@@ -949,7 +949,7 @@ function considerNamedVersion(state, named) {
949
949
  const updating = decision === "update" && !retryHeld(state, named);
950
950
  state.pendingUpdate = updating ? named : void 0;
951
951
  if (!updating || state.preflightedUpdate !== named) state.preflightedUpdate = void 0;
952
- if (decision === "cannot_self_update" && !state.cannotSelfUpdateLogged) {
952
+ if (decision === "cannot_self_update" && !state.cannotSelfUpdateLogged && installedSwitchOf(state, update).kind !== "restart") {
953
953
  state.cannotSelfUpdateLogged = true;
954
954
  logOf(state).line(`this runner cannot update itself to ${named}: ${blocker}`);
955
955
  }
@@ -980,19 +980,23 @@ function reportUpdateResult(state, version, result) {
980
980
  const retryAt = new Date(result.retryAtMs).toISOString().slice(11, 16);
981
981
  logOf(state).error(`could not update to ${version}: ${result.detail} \xB7 attempt ${result.attempts}, trying again after ${retryAt} UTC`);
982
982
  }
983
- function restartOntoInstalled(state) {
984
- const update = state.deps.update;
985
- if (update === void 0) return false;
983
+ function installedSwitchOf(state, update) {
986
984
  const configPath = state.config.configPath;
987
- const own = ownVersionOf(state.deps);
988
985
  const current = currentVersion(configPath);
989
- const decision = decideInstalledSwitch({
990
- own,
986
+ return decideInstalledSwitch({
987
+ own: ownVersionOf(state.deps),
991
988
  current,
992
989
  fromCurrent: startedThroughCurrent(configPath, update.entryPath),
993
990
  underService: update.underService === true,
994
991
  installed: current !== void 0 && existsSync(entryIn(versionDir(configPath, current)))
995
992
  });
993
+ }
994
+ function restartOntoInstalled(state) {
995
+ const update = state.deps.update;
996
+ if (update === void 0) return false;
997
+ const configPath = state.config.configPath;
998
+ const own = ownVersionOf(state.deps);
999
+ const decision = installedSwitchOf(state, update);
996
1000
  if (decision.kind === "none") {
997
1001
  state.installedSwitch = void 0;
998
1002
  return false;
@@ -1956,7 +1960,7 @@ async function start(configPath, deps = { fetchImpl: fetch }) {
1956
1960
  const outcome = await onStartUnderMarker({
1957
1961
  configPath,
1958
1962
  own: ownVersionOf(deps),
1959
- check: update.check ? () => update.check(configPath) : async () => (await import('./check-NJX52PBN.js')).runRunnerCheck(configPath, { fetchImpl: deps.fetchImpl }),
1963
+ check: update.check ? () => update.check(configPath) : async () => (await import('./check-443BADSD.js')).runRunnerCheck(configPath, { fetchImpl: deps.fetchImpl }),
1960
1964
  now: () => (deps.now ?? (() => /* @__PURE__ */ new Date()))().getTime(),
1961
1965
  log
1962
1966
  });
@@ -4452,11 +4452,11 @@ function registerRunnerCommands(program2) {
4452
4452
  const configOption = "the cloud config file to run against (default: ~/.outerlayer/config.json)";
4453
4453
  runnerCmd.command("start").description("Run the loop: claim work, run it, report, clean up, repeat").option("--config <path>", configOption).action(async (opts) => {
4454
4454
  const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-OOBPCY7Q.js');
4455
- const { start, RunnerStartError } = await import('./loop-C34EVXAP.js');
4455
+ const { start, RunnerStartError } = await import('./loop-U7GLISBM.js');
4456
4456
  const { RunnerAlreadyRunningError } = await import('./pidfile-UZRH774M.js');
4457
4457
  const configPath = opts.config ?? defaultRunnerConfigPath();
4458
4458
  try {
4459
- const { realUpdateDeps } = await import('./real-deps-TK6JMQSW.js');
4459
+ const { realUpdateDeps } = await import('./real-deps-AKVGIDPZ.js');
4460
4460
  await start(configPath, { update: realUpdateDeps(), fetchImpl: fetch });
4461
4461
  } catch (err) {
4462
4462
  if (err instanceof RunnerConfigError || err instanceof RunnerAlreadyRunningError || err instanceof RunnerStartError) {
@@ -4468,7 +4468,7 @@ function registerRunnerCommands(program2) {
4468
4468
  });
4469
4469
  runnerCmd.command("check").description("Validate the config, the hooks and the key, and print the effective settings").option("--config <path>", configOption).action(async (opts) => {
4470
4470
  const { defaultRunnerConfigPath } = await import('./config-OOBPCY7Q.js');
4471
- const { runRunnerCheck } = await import('./check-NJX52PBN.js');
4471
+ const { runRunnerCheck } = await import('./check-443BADSD.js');
4472
4472
  const configPath = opts.config ?? defaultRunnerConfigPath();
4473
4473
  const result = await runRunnerCheck(configPath);
4474
4474
  if (!result.ok) {
@@ -4768,15 +4768,15 @@ Next:
4768
4768
  });
4769
4769
  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) => {
4770
4770
  const { defaultRunnerConfigPath } = await import('./config-OOBPCY7Q.js');
4771
- const { requestStop } = await import('./loop-C34EVXAP.js');
4771
+ const { requestStop } = await import('./loop-U7GLISBM.js');
4772
4772
  const configPath = opts.config ?? defaultRunnerConfigPath();
4773
4773
  await requestStop(configPath, Boolean(opts.now));
4774
4774
  });
4775
4775
  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) => {
4776
4776
  const { defaultRunnerConfigPath, loadRunnerConfig } = await import('./config-OOBPCY7Q.js');
4777
4777
  const { jobsDir, runnerDir } = await import('./paths-OYKMVYJP.js');
4778
- const { listJobFiles, runnerProcessState } = await import('./loop-C34EVXAP.js');
4779
- const { renderStatus } = await import('./status-7RNWHYG6.js');
4778
+ const { listJobFiles, runnerProcessState } = await import('./loop-U7GLISBM.js');
4779
+ const { renderStatus } = await import('./status-OQ23WOUP.js');
4780
4780
  const { readHousekeepingRecord } = await import('./record-C43U4PKS.js');
4781
4781
  const path2 = await import('path');
4782
4782
  const configPath = opts.config ?? defaultRunnerConfigPath();
@@ -4828,7 +4828,7 @@ Next:
4828
4828
  });
4829
4829
  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) => {
4830
4830
  const { defaultRunnerConfigPath } = await import('./config-OOBPCY7Q.js');
4831
- const { listJobFiles } = await import('./loop-C34EVXAP.js');
4831
+ const { listJobFiles } = await import('./loop-U7GLISBM.js');
4832
4832
  const { newestAttempt, logPathFor, tail, RunnerLogsError } = await import('./logs-H55NWW4H.js');
4833
4833
  const configPath = opts.config ?? defaultRunnerConfigPath();
4834
4834
  const item = parseTrackerNumber(itemArg);
package/dist/index.js CHANGED
@@ -22,5 +22,5 @@ if (argv[0] === "statusline") {
22
22
  process.exit(0);
23
23
  }
24
24
  (await import('./hook-fast-CFLLVMSV.js')).recordLinkExitFailure(argv);
25
- var { runCli } = await import('./cli-JXPTHJHQ.js');
25
+ var { runCli } = await import('./cli-PNMCZVQ4.js');
26
26
  await runCli(process.argv);
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { RunnerStartError, listJobFiles, probeCredentials, requestStop, runnerProcessState, start, tick, watchTick } from './chunk-LUY6I65J.js';
3
+ export { RunnerStartError, listJobFiles, probeCredentials, requestStop, runnerProcessState, start, tick, watchTick } from './chunk-NQWTCX3A.js';
4
4
  import './chunk-IS4DIGBQ.js';
5
5
  import './chunk-I2UOAV7X.js';
6
- import './chunk-4KPMIGBQ.js';
6
+ import './chunk-ALCXFVUV.js';
7
7
  import './chunk-T6OIJQRT.js';
8
8
  import './chunk-AIW6GLET.js';
9
9
  import './chunk-UGP76IZ5.js';
@@ -6,7 +6,7 @@ import './chunk-Z5GEFMRW.js';
6
6
  createRequire(import.meta.url);
7
7
 
8
8
  // src/runner/update/real-deps.ts
9
- function realUpdateDeps() {
9
+ function realUpdateDeps(proc = process) {
10
10
  const nodePath = process.execPath;
11
11
  return {
12
12
  runNpm: realRunNpm(nodePath),
@@ -15,7 +15,7 @@ function realUpdateDeps() {
15
15
  nodePath,
16
16
  exit: (code) => process.exit(code),
17
17
  fetchImpl: fetch,
18
- underService: startedByService(process.env, process.ppid)
18
+ underService: startedByService(proc.env, proc.ppid)
19
19
  };
20
20
  }
21
21
 
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { LEASE_SECONDS, ALREADY_RELEASED, RENEW_INTERVAL_SECONDS } from './chunk-4KPMIGBQ.js';
3
+ import { LEASE_SECONDS, ALREADY_RELEASED, RENEW_INTERVAL_SECONDS } from './chunk-ALCXFVUV.js';
4
4
  import './chunk-T6OIJQRT.js';
5
5
  import './chunk-FCDET2U5.js';
6
6
  import './chunk-J5DPVNL3.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@outerlayer/cli",
3
- "version": "0.8.4",
3
+ "version": "0.8.6",
4
4
  "description": "OuterLayer CLI — commands: init, connect, doctor, login, logout, sync, daemon (alias: watch), emit, work, runner, hooks, mcp, import, 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.",