@outerlayer/cli 0.34.0-next.20261024123749 → 0.34.0-next.20261024174615
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/dist/build-info.json +1 -1
- package/dist/{check-S6S7XIUP.js → check-K4I4EBEK.js} +1 -1
- package/dist/{chunk-LW254XRN.js → chunk-DFLHVTXI.js} +6 -4
- package/dist/{cli-RL2R7YTM.js → cli-KDAKXVVE.js} +7 -7
- package/dist/{container-start-7QFR3JWO.js → container-start-V5WVSWAB.js} +1 -1
- package/dist/index.js +1 -1
- package/dist/{loop-VC3EE3RK.js → loop-E4YJ6BLL.js} +1 -1
- package/package.json +1 -1
- package/skill-pack/maintained/outerlayer-amend/SKILL.md +11 -11
- package/skill-pack/maintained/outerlayer-build/SKILL.md +2 -1
package/dist/build-info.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"id":"2026-10-
|
|
1
|
+
{"id":"2026-10-24T17:47:37.980Z+5ab4e80","root":"/home/runner/_work/outerlayer/outerlayer","pkg":"outerlayer"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire } from 'node:module';
|
|
3
|
-
import { probeCredentials } from './chunk-
|
|
3
|
+
import { probeCredentials } from './chunk-DFLHVTXI.js';
|
|
4
4
|
import './chunk-3JVYMD4G.js';
|
|
5
5
|
import './chunk-PBIYM2Z6.js';
|
|
6
6
|
import './chunk-E7R2GIAW.js';
|
|
@@ -2842,7 +2842,7 @@ async function watchTick(state, active, nowMs, logMtimeMs) {
|
|
|
2842
2842
|
await endJob(state, active, "idle");
|
|
2843
2843
|
}
|
|
2844
2844
|
}
|
|
2845
|
-
async function probeCredentials(config, fetchImpl = fetch) {
|
|
2845
|
+
async function probeCredentials(config, fetchImpl = fetch, keySource = "config") {
|
|
2846
2846
|
try {
|
|
2847
2847
|
await listStartable(config, config.queues[0] ?? "implement", fetchImpl);
|
|
2848
2848
|
return { ok: true };
|
|
@@ -2859,10 +2859,12 @@ async function probeCredentials(config, fetchImpl = fetch) {
|
|
|
2859
2859
|
};
|
|
2860
2860
|
}
|
|
2861
2861
|
if (status === 401 || status === 403) {
|
|
2862
|
+
const source = keySource === "variable" ? "the OUTERLAYER_API_KEY variable" : `apiKey in ${config.configPath}`;
|
|
2863
|
+
const cause = status === 401 ? `the gateway does not accept the API key (401): it is wrong, revoked or deleted.` : `the API key was refused (403). A runner key needs git.read and work.read to list and read work items, and work.claim to claim, renew and release.`;
|
|
2862
2864
|
return {
|
|
2863
2865
|
ok: false,
|
|
2864
2866
|
fatal: true,
|
|
2865
|
-
reason: `${config.configPath}:
|
|
2867
|
+
reason: `${config.configPath}: ${cause} The key came from ${source}.`,
|
|
2866
2868
|
status,
|
|
2867
2869
|
code
|
|
2868
2870
|
};
|
|
@@ -3130,7 +3132,7 @@ async function startRunner(configPath, deps, startup) {
|
|
|
3130
3132
|
check: update.check ? () => update.check(configPath) : async () => {
|
|
3131
3133
|
const held = heldClaudeCredential();
|
|
3132
3134
|
const env = held === void 0 ? process.env : { ...process.env, [held.variable]: held.value };
|
|
3133
|
-
return (await import('./check-
|
|
3135
|
+
return (await import('./check-K4I4EBEK.js')).runRunnerCheck(configPath, { fetchImpl: deps.fetchImpl, env });
|
|
3134
3136
|
},
|
|
3135
3137
|
now: () => (deps.now ?? (() => /* @__PURE__ */ new Date()))().getTime(),
|
|
3136
3138
|
log
|
|
@@ -3161,7 +3163,7 @@ async function startRunner(configPath, deps, startup) {
|
|
|
3161
3163
|
}).catch((err) => log.error(`the runner's Docker identity could not be stored: ${describeCallFailure(err)} \xB7 using the names its folder's path gives`));
|
|
3162
3164
|
}
|
|
3163
3165
|
check = "credentials";
|
|
3164
|
-
const probe = await probeCredentials(config, deps.fetchImpl);
|
|
3166
|
+
const probe = await probeCredentials(config, deps.fetchImpl, deps.image === void 0 ? "config" : "variable");
|
|
3165
3167
|
if (!probe.ok && probe.fatal) {
|
|
3166
3168
|
probeRefusal = { status: probe.status, code: probe.code };
|
|
3167
3169
|
throw new RunnerStartError(probe.reason);
|
|
@@ -5109,7 +5109,7 @@ function registerRunnerCommands(program2) {
|
|
|
5109
5109
|
const configOption = "the cloud config file to run against (default: ~/.outerlayer/config.json)";
|
|
5110
5110
|
runnerCmd.command("start").description("Run the loop: claim work, run it, report, clean up, repeat").option("--config <path>", configOption).action(async (opts) => {
|
|
5111
5111
|
const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-WRHQDGVI.js');
|
|
5112
|
-
const { start, RunnerStartError } = await import('./loop-
|
|
5112
|
+
const { start, RunnerStartError } = await import('./loop-E4YJ6BLL.js');
|
|
5113
5113
|
const { RunnerAlreadyRunningError } = await import('./pidfile-5UDLYPMC.js');
|
|
5114
5114
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
5115
5115
|
try {
|
|
@@ -5128,8 +5128,8 @@ function registerRunnerCommands(program2) {
|
|
|
5128
5128
|
"\nReads OUTERLAYER_URL, OUTERLAYER_APP_ID, OUTERLAYER_API_KEY, OUTERLAYER_RUNNER_NAME and one Claude credential\n(CLAUDE_CODE_OAUTH_TOKEN or ANTHROPIC_API_KEY) from the environment. OUTERLAYER_AGENT\nis optional and defaults to claude. On a later start it refuses variables that disagree with the config in the volume.\nThe image sets OUTERLAYER_RUNNER_IMAGE; outside the image, use `runner start`.\n"
|
|
5129
5129
|
).action(async () => {
|
|
5130
5130
|
const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-WRHQDGVI.js');
|
|
5131
|
-
const { containerStart } = await import('./container-start-
|
|
5132
|
-
const { start, RunnerStartError } = await import('./loop-
|
|
5131
|
+
const { containerStart } = await import('./container-start-V5WVSWAB.js');
|
|
5132
|
+
const { start, RunnerStartError } = await import('./loop-E4YJ6BLL.js');
|
|
5133
5133
|
const { RunnerAlreadyRunningError } = await import('./pidfile-5UDLYPMC.js');
|
|
5134
5134
|
try {
|
|
5135
5135
|
const result = await containerStart({
|
|
@@ -5149,7 +5149,7 @@ function registerRunnerCommands(program2) {
|
|
|
5149
5149
|
});
|
|
5150
5150
|
runnerCmd.command("check").description("Validate the config, the hooks and the key, and print the effective settings").option("--config <path>", configOption).action(async (opts) => {
|
|
5151
5151
|
const { defaultRunnerConfigPath } = await import('./config-WRHQDGVI.js');
|
|
5152
|
-
const { runRunnerCheck } = await import('./check-
|
|
5152
|
+
const { runRunnerCheck } = await import('./check-K4I4EBEK.js');
|
|
5153
5153
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
5154
5154
|
const result = await runRunnerCheck(configPath);
|
|
5155
5155
|
if (!result.ok) {
|
|
@@ -5549,7 +5549,7 @@ Next:
|
|
|
5549
5549
|
});
|
|
5550
5550
|
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) => {
|
|
5551
5551
|
const { defaultRunnerConfigPath } = await import('./config-WRHQDGVI.js');
|
|
5552
|
-
const { requestStop } = await import('./loop-
|
|
5552
|
+
const { requestStop } = await import('./loop-E4YJ6BLL.js');
|
|
5553
5553
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
5554
5554
|
const { runnerImageVersion } = await import('./image-tag-ADSLWXBA.js');
|
|
5555
5555
|
await requestStop(configPath, Boolean(opts.now), void 0, { image: runnerImageVersion() !== void 0 });
|
|
@@ -5557,7 +5557,7 @@ Next:
|
|
|
5557
5557
|
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) => {
|
|
5558
5558
|
const { defaultRunnerConfigPath, loadRunnerConfig } = await import('./config-WRHQDGVI.js');
|
|
5559
5559
|
const { jobsDir, runnerDir } = await import('./paths-7HVTDE6J.js');
|
|
5560
|
-
const { listJobFiles, runnerProcessState } = await import('./loop-
|
|
5560
|
+
const { listJobFiles, runnerProcessState } = await import('./loop-E4YJ6BLL.js');
|
|
5561
5561
|
const { renderStatus } = await import('./status-6ISCZDBX.js');
|
|
5562
5562
|
const { readHousekeepingRecord } = await import('./record-PPZEXAVA.js');
|
|
5563
5563
|
const path2 = await import('path');
|
|
@@ -5618,7 +5618,7 @@ Next:
|
|
|
5618
5618
|
});
|
|
5619
5619
|
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) => {
|
|
5620
5620
|
const { defaultRunnerConfigPath } = await import('./config-WRHQDGVI.js');
|
|
5621
|
-
const { listJobFiles } = await import('./loop-
|
|
5621
|
+
const { listJobFiles } = await import('./loop-E4YJ6BLL.js');
|
|
5622
5622
|
const { newestAttempt, logPathFor, tail, RunnerLogsError } = await import('./logs-HI46FO6Z.js');
|
|
5623
5623
|
const configPath = opts.config ?? defaultRunnerConfigPath();
|
|
5624
5624
|
const item = parseTrackerNumber(itemArg);
|
|
@@ -215,7 +215,7 @@ async function containerStart(deps) {
|
|
|
215
215
|
const different = disagreements(stored, env);
|
|
216
216
|
if (different.length > 0) {
|
|
217
217
|
return refuse(
|
|
218
|
-
`the config in the volume and the container's variables disagree, so the runner does not start:
|
|
218
|
+
`the config in the volume (${configPath}) and the container's variables disagree, so the runner does not start:
|
|
219
219
|
${different.join("\n ")}
|
|
220
220
|
Change the variables to match the volume, or use a new volume to make a new runner.`
|
|
221
221
|
);
|
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-WENTLDMA.js')).recordLinkExitFailure(argv);
|
|
29
|
-
var { runCli } = await import('./cli-
|
|
29
|
+
var { runCli } = await import('./cli-KDAKXVVE.js');
|
|
30
30
|
await runCli(process.argv);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire } from 'node:module';
|
|
3
|
-
export { RunnerStartError, leaseTimeLeftFor, listJobFiles, logUnusableHelper, probeBuild, probeCredentials, requestStop, runnerProcessState, runtimeOf, sampleUsage, start, tick, watchTick } from './chunk-
|
|
3
|
+
export { RunnerStartError, leaseTimeLeftFor, listJobFiles, logUnusableHelper, probeBuild, probeCredentials, requestStop, runnerProcessState, runtimeOf, sampleUsage, start, tick, watchTick } from './chunk-DFLHVTXI.js';
|
|
4
4
|
import './chunk-3JVYMD4G.js';
|
|
5
5
|
import './chunk-PBIYM2Z6.js';
|
|
6
6
|
import './chunk-E7R2GIAW.js';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@outerlayer/cli",
|
|
3
|
-
"version": "0.34.0-next.
|
|
3
|
+
"version": "0.34.0-next.20261024174615",
|
|
4
4
|
"description": "OuterLayer CLI — commands: init, claude, connect, doctor, login, logout, sync, daemon (alias: watch), emit, findings, 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.",
|
|
@@ -27,7 +27,7 @@ branch first, unless the working tree is on it.
|
|
|
27
27
|
## Arguments
|
|
28
28
|
|
|
29
29
|
- `--unattended`: no person is watching. Never ask a question. A need for a
|
|
30
|
-
person becomes a hand-off (step
|
|
30
|
+
person becomes a hand-off (step 8), never a silent stop.
|
|
31
31
|
|
|
32
32
|
## Builds and local sessions
|
|
33
33
|
|
|
@@ -85,7 +85,7 @@ repository. Commit and push in each checkout you change, to its own branch only.
|
|
|
85
85
|
declares one.
|
|
86
86
|
- **The spec is wrong.** The criterion cannot be met as written, for
|
|
87
87
|
example one that names a path a repository rule forbids. Never rewrite it:
|
|
88
|
-
hand it off (step
|
|
88
|
+
hand it off (step 8) with the wording change.
|
|
89
89
|
- **Cannot tell.** Hand an ambiguous comment off with `--ready`: quote it
|
|
90
90
|
and ask one question.
|
|
91
91
|
5. **Fix, prove, reply.** An answer needs no commit: reply on its criterion
|
|
@@ -112,30 +112,30 @@ repository. Commit and push in each checkout you change, to its own branch only.
|
|
|
112
112
|
- **Otherwise**, reply with a sentence naming what changed and the commit:
|
|
113
113
|
`outerlayer work comment --item "$OUTERLAYER_WORK" [--criterion <criterion>] --body "<what changed>" --ready`.
|
|
114
114
|
Omit `--criterion` on the general thread.
|
|
115
|
-
6. **
|
|
115
|
+
6. **Record the proofs again** before you watch CI: the evidence check waits
|
|
116
|
+
on them. Push any recipe edit (`.outerlayer/proofs/<item key>.yaml`) first.
|
|
117
|
+
Run `outerlayer work proofs --record --comment --pr <prNumber>` in each
|
|
118
|
+
checkout you pushed.
|
|
119
|
+
7. **Watch CI.** Skip this step when you pushed nothing. Run
|
|
116
120
|
`gh pr checks <prNumber> --repo <repository> --watch` on each pull request
|
|
117
121
|
you pushed. Leave out any check that waits on results recorded after the
|
|
118
122
|
session ends. "No checks reported" is not green: query again.
|
|
119
123
|
- For a failed check, read `gh run view <run-id> --log-failed`, fix it, push
|
|
120
|
-
again.
|
|
124
|
+
again, and repeat step 6.
|
|
121
125
|
- If it also fails on the base branch, or outside the code, change nothing.
|
|
122
126
|
- Stop after two fixes for one check.
|
|
123
|
-
|
|
127
|
+
8. **Hand off what you cannot fix.** Reply on the thread with `--ready`: one
|
|
124
128
|
sentence of fact, then the decision a person must make. For a spec problem,
|
|
125
129
|
quote the criterion and give the replacement wording. `--ready` hands the
|
|
126
130
|
thread back to a person.
|
|
127
|
-
|
|
131
|
+
9. **Check nothing is left waiting.** Reread threads. A thread still waiting
|
|
128
132
|
on an agent has a reply that did not land or was flagged `unchanged`. Fix
|
|
129
133
|
or report it. Then run `outerlayer sync` and `outerlayer work proofs`.
|
|
130
|
-
9. **Record the proofs again.** Skip this step when you pushed nothing. If a
|
|
131
|
-
fix changes how a proof is made, commit the recipe edit
|
|
132
|
-
(`.outerlayer/proofs/<item key>.yaml`). Push, run
|
|
133
|
-
`outerlayer work proofs --record --comment --pr <prNumber>` per pushed checkout.
|
|
134
134
|
10. **Report.** Write one line per thread: the criterion (or the general
|
|
135
135
|
thread), and fixed (with the replacement) or handed off (with the reason).
|
|
136
136
|
Add a line for a merge conflict (merged with the base sha, or handed off
|
|
137
137
|
with the reason), a CI line when you pushed (green, or each red check and
|
|
138
|
-
why), the lines from step
|
|
138
|
+
why), the lines from step 6, and a line naming each proof missing or
|
|
139
139
|
out of date.
|
|
140
140
|
Post the lines once on the general thread:
|
|
141
141
|
`outerlayer work comment --item "$OUTERLAYER_WORK" --body "<the lines>"`.
|
|
@@ -338,7 +338,8 @@ Run them in order.
|
|
|
338
338
|
the criteria itself and records the `acceptance-criteria` check, as
|
|
339
339
|
release.md says. It records one check item per criterion. When the state
|
|
340
340
|
file holds no criteria, no judge runs.
|
|
341
|
-
Watch CI until every check has concluded.
|
|
341
|
+
Watch CI until every check has concluded. Start the Evidence phase at the
|
|
342
|
+
same time, as release.md's "Watch CI" says: CI never reads the proofs.
|
|
342
343
|
6. **Evidence.** Run `outerlayer emit step "Evidence" --item "$OUTERLAYER_WORK"`,
|
|
343
344
|
then apply the team's changes for this phase. Read [references/evidence.md](references/evidence.md)
|
|
344
345
|
when the pull request opens, and run it. Write and commit the proof recipe
|