@outerlayer/cli 0.11.0 → 0.13.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 (88) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +16 -7
  3. package/dist/{agent-setup-YEFN74Y4.js → agent-setup-QE6PSCEZ.js} +8 -8
  4. package/dist/build-info.json +1 -1
  5. package/dist/{builder-PP436VGZ.js → builder-UUS4ORDH.js} +3 -3
  6. package/dist/{check-YDXOLVJ5.js → check-63IDCEEV.js} +31 -30
  7. package/dist/{chunk-XR3BJN33.js → chunk-22RMZBGW.js} +20 -1
  8. package/dist/{chunk-TB7EP24C.js → chunk-2M63GG56.js} +1 -1
  9. package/dist/{chunk-Y6P5XX2B.js → chunk-3D4OYFCD.js} +4 -4
  10. package/dist/{chunk-2GBCTEN4.js → chunk-3KTA5UU2.js} +1 -1
  11. package/dist/{chunk-USO2DKBD.js → chunk-4KSQKQXE.js} +8 -2
  12. package/dist/{chunk-UES67HLJ.js → chunk-4QVZCVWT.js} +5 -5
  13. package/dist/{chunk-I263FZ3A.js → chunk-6S3H3J6H.js} +3 -3
  14. package/dist/{chunk-BHOBM3IZ.js → chunk-C6IV5BV7.js} +10 -10
  15. package/dist/{chunk-VDI5POCC.js → chunk-CNFVHDHG.js} +1 -1
  16. package/dist/{chunk-EOWWTFUU.js → chunk-DPKX26LT.js} +92 -16
  17. package/dist/{chunk-SUMWRA7K.js → chunk-DXQ5MHCO.js} +1 -1
  18. package/dist/{chunk-ZQ5JGHUO.js → chunk-EFZLAYPE.js} +2 -2
  19. package/dist/{chunk-RWQWPZB4.js → chunk-GI4XXD4I.js} +3 -3
  20. package/dist/{chunk-YU5GL7QS.js → chunk-HDTVTA6I.js} +2 -2
  21. package/dist/{chunk-BFESLKPP.js → chunk-IP7BIBXJ.js} +19 -1
  22. package/dist/{chunk-YT35WGIP.js → chunk-J5M7BSJQ.js} +99 -7
  23. package/dist/{chunk-IU4NZROR.js → chunk-JXYVA45C.js} +1 -1
  24. package/dist/{chunk-BMX3L7CR.js → chunk-LCEXHCHD.js} +1 -1
  25. package/dist/{chunk-7C4T5BGN.js → chunk-MJXXRX4M.js} +54 -12
  26. package/dist/{chunk-E5DC4VZL.js → chunk-MZN7AQOB.js} +8 -8
  27. package/dist/{chunk-CJGQQZWB.js → chunk-NX57IBNK.js} +1 -1
  28. package/dist/{chunk-DTDZXDQ3.js → chunk-P4MM66C6.js} +31 -18
  29. package/dist/{chunk-BEZSECPA.js → chunk-P6FX4D43.js} +1 -1
  30. package/dist/{chunk-A56PYPDF.js → chunk-R7OQTKWT.js} +2 -1
  31. package/dist/{chunk-TFIOXPZT.js → chunk-RLYZLUQ7.js} +67 -5
  32. package/dist/chunk-RMWLBUCJ.js +50 -0
  33. package/dist/{chunk-4HMXH2OA.js → chunk-SFFHGX3G.js} +1 -1
  34. package/dist/{chunk-3YFCWYBU.js → chunk-SVEP7PVH.js} +14 -14
  35. package/dist/chunk-T5VPP6H7.js +65 -0
  36. package/dist/{chunk-BGWTYRSS.js → chunk-TCIW27FM.js} +1 -1
  37. package/dist/{chunk-R7BJYFD2.js → chunk-TOPDNXHZ.js} +5 -5
  38. package/dist/{chunk-HKUH5AR2.js → chunk-XJKL4BNU.js} +3 -3
  39. package/dist/{cli-RQZXTOEI.js → cli-WSBIAVZU.js} +176 -88
  40. package/dist/{command-U6UGIBVT.js → command-N7BAB4XJ.js} +21 -22
  41. package/dist/{config-MKBX2ZQD.js → config-N3C6DFQA.js} +1 -1
  42. package/dist/{connect-cmd-5MIUNYAY.js → connect-cmd-FGYRLLXL.js} +5 -5
  43. package/dist/{context-adopt-A77G67CP.js → context-adopt-B3PWGFHL.js} +5 -5
  44. package/dist/{context-materialize-KQZYATQZ.js → context-materialize-7S6NLLRO.js} +5 -5
  45. package/dist/{dist-3M3ZMEZF.js → dist-LKDWQWZ7.js} +2 -2
  46. package/dist/{docker-WVRRMK6R.js → docker-BZ55BMBJ.js} +4 -4
  47. package/dist/{doctor-ZF4PYWVN.js → doctor-3H25Q7WT.js} +23 -20
  48. package/dist/{emit-artifact-cmd-VKPW577P.js → emit-artifact-cmd-IQCRXOH7.js} +9 -9
  49. package/dist/{emit-cmd-SU62J2PB.js → emit-cmd-KDSM5VAO.js} +4 -4
  50. package/dist/{emit-criteria-cmd-U2TL6FYY.js → emit-criteria-cmd-EYUXME26.js} +7 -7
  51. package/dist/emit-finding-cmd-P4RKBPBB.js +465 -0
  52. package/dist/{emit-result-cmd-GKBVPMU4.js → emit-result-cmd-6XYENU6H.js} +9 -9
  53. package/dist/{hook-fast-AQCAQIA6.js → hook-fast-PXWKQPN6.js} +1 -1
  54. package/dist/{import-capture-cmd-5NJVL2HN.js → import-capture-cmd-2BKM5I2N.js} +3 -3
  55. package/dist/{import-ruler-cmd-TUK3MRPC.js → import-ruler-cmd-IXR7YK47.js} +2 -2
  56. package/dist/index.js +3 -3
  57. package/dist/{init-PUY2BUHH.js → init-2LWVS4AH.js} +21 -17
  58. package/dist/{init-M5IBAGVE.js → init-ZL7ORPTF.js} +53 -32
  59. package/dist/{init-cmd-NPNR23UL.js → init-cmd-JXOBCOIB.js} +16 -14
  60. package/dist/{install-HKOVISUP.js → install-HDBIPHTX.js} +2 -4
  61. package/dist/{login-browser-7XGSV7MA.js → login-browser-QZCS3WW6.js} +2 -1
  62. package/dist/{loop-3FNROLW7.js → loop-XOAE6ZIY.js} +32 -30
  63. package/dist/{machine-RWDDJRWB.js → machine-G6PY2J2J.js} +16 -16
  64. package/dist/{mcp-install-cmd-XZARXNYT.js → mcp-install-cmd-VXVIH7PH.js} +1 -1
  65. package/dist/runner-env-XTC53CHN.js +15 -0
  66. package/dist/runner-key-TDTLNAKJ.js +154 -0
  67. package/dist/{session-sender-E3UHGSNV.js → session-sender-XVGZFWRK.js} +7 -7
  68. package/dist/{starter-pack-I35VNYAR.js → starter-pack-B7JPGEDO.js} +4 -4
  69. package/dist/{status-2OW5AKWL.js → status-MRTPG34B.js} +22 -22
  70. package/dist/{sync-cmd-ULKXCHO2.js → sync-cmd-UBUZMMDN.js} +6 -6
  71. package/dist/{watch-IU6NHB4K.js → watch-STNPEWD6.js} +6 -6
  72. package/dist/{work-claim-cmd-LXXSNEGF.js → work-claim-cmd-CWGYEIJE.js} +11 -11
  73. package/dist/{work-cmd-ZJY3NA2G.js → work-cmd-X7NMJDFL.js} +8 -8
  74. package/dist/{work-comment-cmd-34FTLPUO.js → work-comment-cmd-FI2TMAYQ.js} +8 -8
  75. package/dist/{work-open-pr-cmd-YZAENDP6.js → work-open-pr-cmd-OVHJ5I5H.js} +9 -9
  76. package/dist/{work-pr-cmd-EXTOGBJC.js → work-pr-cmd-Y5TDMQ4O.js} +8 -8
  77. package/package.json +1 -1
  78. package/skill-pack/maintained/reporting-findings/SKILL.md +84 -5
  79. package/skill-pack/template/build/SKILL.md +60 -33
  80. package/skill-pack/template/build/references/agent-briefs.md +4 -2
  81. package/skill-pack/template/build/references/release.md +1 -1
  82. package/skill-pack/template/build/references/review-loop.md +6 -2
  83. package/skill-pack/template/build/scripts/record-criteria.mjs +109 -143
  84. package/skill-pack/validators/code-review.yaml +4 -2
  85. package/dist/chunk-FBTE2A2X.js +0 -38
  86. package/dist/chunk-JKIWMRFH.js +0 -27
  87. package/dist/chunk-T6OIJQRT.js +0 -31
  88. package/dist/emit-finding-cmd-TMOOKHPD.js +0 -251
@@ -1,43 +1,44 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
3
  import { npmSupportsProvenance } from './chunk-YETTWTAY.js';
4
- import { readConfigObject, RunnerInitError } from './chunk-7C4T5BGN.js';
5
- import './chunk-BEZSECPA.js';
6
- import './chunk-E5DC4VZL.js';
7
- import { VM_SERVICE_NAME } from './chunk-FBTE2A2X.js';
8
- import { checkFit, RUNNER_RESERVE_BYTES } from './chunk-JKIWMRFH.js';
4
+ import { RunnerInitError, readConfigObject } from './chunk-MJXXRX4M.js';
5
+ import './chunk-P6FX4D43.js';
6
+ import './chunk-MZN7AQOB.js';
7
+ import './chunk-T5VPP6H7.js';
8
+ import { checkFit, VM_SERVICE_NAME, RUNNER_RESERVE_BYTES } from './chunk-RLYZLUQ7.js';
9
+ import './chunk-6MZSX4M7.js';
9
10
  import { writeLaunchAgent } from './chunk-LF6MLJCY.js';
10
11
  import './chunk-3FMPZPJQ.js';
11
12
  import './chunk-N5FOE5PS.js';
12
13
  import './chunk-OGFGZQA3.js';
13
- import './chunk-2GBCTEN4.js';
14
+ import './chunk-3KTA5UU2.js';
14
15
  import './chunk-QOZKPLVJ.js';
15
- import './chunk-CJGQQZWB.js';
16
+ import './chunk-NX57IBNK.js';
16
17
  import './chunk-CX22S5BA.js';
17
18
  import './chunk-QKFB4K7X.js';
18
19
  import './chunk-RSNSZ2LJ.js';
19
- import './chunk-DTDZXDQ3.js';
20
- import './chunk-ZQ5JGHUO.js';
21
- import './chunk-BFESLKPP.js';
22
- import './chunk-UES67HLJ.js';
23
- import './chunk-VDI5POCC.js';
24
- import './chunk-IU4NZROR.js';
25
- import './chunk-USO2DKBD.js';
20
+ import './chunk-P4MM66C6.js';
21
+ import './chunk-EFZLAYPE.js';
22
+ import './chunk-IP7BIBXJ.js';
23
+ import './chunk-4QVZCVWT.js';
24
+ import './chunk-CNFVHDHG.js';
25
+ import './chunk-JXYVA45C.js';
26
+ import './chunk-4KSQKQXE.js';
26
27
  import './chunk-N6LURUEF.js';
27
28
  import './chunk-YRYMNBGQ.js';
28
- import { resolveBuild, resolveHousekeeping } from './chunk-XR3BJN33.js';
29
+ import { runnerCredentialProblem, resolveBuild, resolveHousekeeping } from './chunk-22RMZBGW.js';
29
30
  import './chunk-UXYLWVTQ.js';
30
31
  import { parseSize } from './chunk-7RQ73DLO.js';
31
32
  import './chunk-4Q7OMKAT.js';
32
33
  import './chunk-WZBHBH3J.js';
33
- import './chunk-RWQWPZB4.js';
34
+ import './chunk-GI4XXD4I.js';
34
35
  import './chunk-ZJSNLVCE.js';
35
- import './chunk-BMX3L7CR.js';
36
- import './chunk-BGWTYRSS.js';
37
- import './chunk-TB7EP24C.js';
36
+ import './chunk-TCIW27FM.js';
37
+ import './chunk-LCEXHCHD.js';
38
+ import './chunk-2M63GG56.js';
38
39
  import './chunk-YO4PSLVB.js';
39
40
  import './chunk-PLMTLGYH.js';
40
- import './chunk-YT35WGIP.js';
41
+ import './chunk-J5M7BSJQ.js';
41
42
  import './chunk-EABW6AJQ.js';
42
43
  import './chunk-BYT5O5RV.js';
43
44
  import './chunk-RA3O54FC.js';
@@ -47,7 +48,8 @@ import './chunk-XCCLFVXM.js';
47
48
  import './chunk-BJ3KTMDH.js';
48
49
  import './chunk-VNVZDWO3.js';
49
50
  import './chunk-Z5GEFMRW.js';
50
- import { readFileSync, writeFileSync, existsSync, rmSync } from 'fs';
51
+ import { existsSync, readFileSync, mkdirSync, writeFileSync, rmSync } from 'fs';
52
+ import { dirname } from 'path';
51
53
 
52
54
  createRequire(import.meta.url);
53
55
 
@@ -91,21 +93,29 @@ async function runVmInit(configPath, deps) {
91
93
  const { lima } = deps;
92
94
  const instance = deps.instance ?? VM_INSTANCE;
93
95
  const progress = deps.progress ?? (() => void 0);
96
+ if (deps.agent === "claude" && deps.credential === void 0) {
97
+ throw new RunnerInitError(
98
+ "--agent claude needs Claude's credential on stdin, because the new VM has none. Pipe a token from `claude setup-token`, or an Anthropic API key: printf '%s' \"$CLAUDE_CODE_OAUTH_TOKEN\" | outerlayer runner init --vm --agent claude"
99
+ );
100
+ }
94
101
  const limactl = lima.locate();
95
102
  if (limactl === void 0) {
96
103
  throw new VmInitError(
97
104
  "limactl is not installed, and the Linux VM needs it. Install Lima with `brew install lima` (https://lima-vm.io/docs/installation/), then run this again."
98
105
  );
99
106
  }
100
- const config = readConfigObject(configPath);
107
+ const onDisk = deps.runnerKey !== void 0 && !existsSync(configPath) ? {} : readConfigObject(configPath);
108
+ let config = onDisk;
101
109
  const noted = config.runnerVm;
102
110
  if (noted !== void 0) {
103
111
  throw new RunnerInitError(
104
112
  `${configPath}: the runner already lives in the VM ${noted.instance}. Start it with \`limactl start ${noted.instance}\`, or remove the runnerVm key after deleting the VM.`
105
113
  );
106
114
  }
107
- if (typeof config.url !== "string" || typeof config.apiKey !== "string" || typeof config.appId !== "string") {
108
- throw new RunnerInitError(`${configPath}: url, apiKey and appId are needed to move the runner into a VM. Run \`outerlayer login\` first.`);
115
+ const problem = deps.runnerKey === void 0 ? runnerCredentialProblem(config) : void 0;
116
+ if (problem !== void 0) {
117
+ const login = problem.reason === "is missing" ? " Run `outerlayer login` first." : "";
118
+ throw new RunnerInitError(`${configPath}: ${problem.field} ${problem.reason}. The runner in the VM needs url, apiKey and appId.${login}`);
109
119
  }
110
120
  const block = config.runner;
111
121
  const { hooks: _ownHooks, ...carried } = block ?? {};
@@ -129,6 +139,11 @@ async function runVmInit(configPath, deps) {
129
139
  if (!fit.fits) {
130
140
  throw new RunnerInitError(`${configPath}: the VM this Mac can give the runner is ${size.memoryGiB} GiB, and ${fit.message}. Lower runner.concurrency or runner.build.memory, then run this again.`);
131
141
  }
142
+ let created;
143
+ if (deps.runnerKey !== void 0) {
144
+ created = await deps.runnerKey();
145
+ config = { ...config, url: created.url, apiKey: created.apiKey, appId: created.appId };
146
+ }
132
147
  const leftBehind = `The VM ${instance} was left as it is; delete it with \`limactl delete --force ${instance}\` to start over.`;
133
148
  const failed = (what, result) => new VmInitError(`${what} failed: ${result.stderr.trim() || result.stdout.trim() || `exit status ${result.status}`}. ${leftBehind}`);
134
149
  const sh = async (argv, stdin) => {
@@ -149,8 +164,8 @@ async function runVmInit(configPath, deps) {
149
164
  }
150
165
  };
151
166
  progress(`creating the Linux VM ${instance}: this downloads an image and can take several minutes`);
152
- const created = await stillRunning("creating the VM", lima.create({ instance, cpus: size.cpus, memoryGiB: size.memoryGiB, diskGiB: size.diskGiB }));
153
- if (created.status !== 0) throw failed("`limactl create`", created);
167
+ const made = await stillRunning("creating the VM", lima.create({ instance, cpus: size.cpus, memoryGiB: size.memoryGiB, diskGiB: size.diskGiB }));
168
+ if (made.status !== 0) throw failed("`limactl create`", made);
154
169
  progress("starting the VM");
155
170
  const started = await stillRunning("starting the VM", lima.start(instance));
156
171
  if (started.status !== 0) throw failed("`limactl start`", started);
@@ -184,7 +199,10 @@ async function runVmInit(configPath, deps) {
184
199
  appId: config.appId,
185
200
  ...config.repos === void 0 ? {} : { repos: config.repos },
186
201
  ...config.scrub === void 0 ? {} : { scrub: config.scrub },
187
- ...block === void 0 ? {} : { runner: carried }
202
+ ...block === void 0 ? {} : { runner: carried },
203
+ // JSON leaves out a key whose value is undefined, so a hand-off with no agent carries neither key.
204
+ agent: deps.agent,
205
+ claudeCredential: deps.credential?.value
188
206
  };
189
207
  const innerOut = await sh(["sg", "docker", "-c", `${quote(outerlayer)} runner init --config-stdin --config ${quote(vmConfig)}`], JSON.stringify(handoff));
190
208
  const installOut = await sh(["sh", "-c", `${quote(outerlayer)} runner install --service --config ${quote(vmConfig)}`]);
@@ -192,7 +210,8 @@ async function runVmInit(configPath, deps) {
192
210
  let hadHostKey;
193
211
  try {
194
212
  agent = writeLaunchAgent(deps.home, limactl, instance);
195
- const { apiKey: _apiKey, runner: _runner, ...kept } = config;
213
+ const { apiKey: _apiKey, runner: _runner, ...kept } = onDisk;
214
+ mkdirSync(dirname(configPath), { recursive: true });
196
215
  writeFileSync(configPath, `${JSON.stringify({ ...kept, runnerVm: { instance, since: (deps.now ?? (() => /* @__PURE__ */ new Date()))().toISOString() } }, null, 2)}
197
216
  `);
198
217
  hadHostKey = existsSync(hostKeyPath(configPath));
@@ -206,12 +225,14 @@ async function runVmInit(configPath, deps) {
206
225
  `created the Linux VM ${instance}: ${size.cpus} CPUs, ${size.memoryGiB} GiB memory, ${size.diskGiB} GiB disk`,
207
226
  ...innerOut.split("\n").map((line) => line.trim()).filter((line) => line !== ""),
208
227
  `the VM starts at login through ${agent}`,
209
- `moved the runner key into the VM: apiKey and runner are gone from ${configPath}`,
228
+ created === void 0 ? `moved the runner key into the VM: apiKey and runner are gone from ${configPath}` : `created the runner key ${created.name} from your login and gave it to the VM; it is not stored on this Mac`,
210
229
  ...hadHostKey ? ["deleted this Mac's old host key. If the runner key was bound to it, a member uses Clear host key on the API keys page before the VM's first claim"] : [],
211
- "run outerlayer login again to use capture on this Mac, with a key that is not the runner key",
230
+ ...created === void 0 ? ["run outerlayer login again to use capture on this Mac, with a key that is not the runner key"] : [],
212
231
  ...installOut.split("\n").map((line) => line.trim()).filter((line) => line !== ""),
213
- `put CLAUDE_CODE_OAUTH_TOKEN in ${home}/.outerlayer/runner.env inside the VM, then restart the runner so it reads the file: limactl shell ${instance} sudo systemctl restart ${VM_SERVICE_NAME}`,
214
- `the runner claims nothing while a command in the VM's config is still the placeholder or the credential is missing; its host entry says why. Check it with: limactl shell ${instance} outerlayer runner status`
232
+ ...deps.credential === void 0 ? [
233
+ `put CLAUDE_CODE_OAUTH_TOKEN in ${home}/.outerlayer/runner.env inside the VM, then restart the runner so it reads the file: limactl shell ${instance} sudo systemctl restart ${VM_SERVICE_NAME}`
234
+ ] : [],
235
+ deps.agent === void 0 ? `the runner claims nothing while a command in the VM's config is still the placeholder or the credential is missing; its host entry says why. Check it with: limactl shell ${instance} outerlayer runner status` : `the runner in the VM starts ${deps.agent} for each item. Check the host from this Mac with: limactl shell ${instance} outerlayer runner check`
215
236
  ]
216
237
  };
217
238
  }
@@ -1,28 +1,28 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { summarizeChecks, summaryText, renderDoctorText } from './chunk-EOWWTFUU.js';
3
+ import { summarizeChecks, summaryText, renderDoctorText } from './chunk-DPKX26LT.js';
4
4
  import './chunk-F47JBIAW.js';
5
5
  import './chunk-BKO6JEZI.js';
6
- import './chunk-DTDZXDQ3.js';
7
- import './chunk-ZQ5JGHUO.js';
8
- import './chunk-BFESLKPP.js';
9
- import { runConnect, COMMIT_LINE } from './chunk-UES67HLJ.js';
10
- import './chunk-VDI5POCC.js';
11
- import './chunk-IU4NZROR.js';
12
- import './chunk-USO2DKBD.js';
6
+ import './chunk-P4MM66C6.js';
7
+ import './chunk-EFZLAYPE.js';
8
+ import './chunk-IP7BIBXJ.js';
9
+ import { runConnect, COMMIT_LINE } from './chunk-4QVZCVWT.js';
10
+ import './chunk-CNFVHDHG.js';
11
+ import './chunk-JXYVA45C.js';
12
+ import './chunk-4KSQKQXE.js';
13
13
  import './chunk-N6LURUEF.js';
14
14
  import { C } from './chunk-YRYMNBGQ.js';
15
15
  import './chunk-WZBHBH3J.js';
16
16
  import './chunk-5QRP3MVS.js';
17
- import './chunk-BMX3L7CR.js';
18
- import './chunk-TB7EP24C.js';
17
+ import './chunk-LCEXHCHD.js';
18
+ import './chunk-2M63GG56.js';
19
19
  import './chunk-YO4PSLVB.js';
20
20
  import './chunk-PLMTLGYH.js';
21
- import './chunk-YT35WGIP.js';
21
+ import './chunk-J5M7BSJQ.js';
22
22
  import './chunk-EABW6AJQ.js';
23
23
  import './chunk-V7NIVOFD.js';
24
24
  import './chunk-ZM2IMMYN.js';
25
- import './chunk-4HMXH2OA.js';
25
+ import './chunk-SFFHGX3G.js';
26
26
  import './chunk-XCCLFVXM.js';
27
27
  import './chunk-BJ3KTMDH.js';
28
28
  import './chunk-VNVZDWO3.js';
@@ -32,7 +32,7 @@ createRequire(import.meta.url);
32
32
 
33
33
  // src/init-cmd.ts
34
34
  var STEP_NAMES = ["connect", "hooks", "agent-setup", "doctor"];
35
- var CLOSING_LINE = "Add an issue on the Work page and press Build.";
35
+ var CLOSING_LINE = "Add an issue on the Work page and choose Build locally, or Build if a host runs for this factory.";
36
36
  var errorMessage = (err) => err instanceof Error ? err.message : String(err);
37
37
  async function runInitCommand(flags, deps) {
38
38
  const steps = {};
@@ -87,7 +87,9 @@ ${CLOSING_LINE}
87
87
  if (connect.linkUrl !== void 0 && connect.repository !== void 0) unlinked = { repository: connect.repository, url: connect.linkUrl };
88
88
  const connected = connect.outcome === "done";
89
89
  if (connect.outcome === "done") {
90
- (flags.json ? deps.stderr : { write: (s) => (say(`${C.green}\u2713${C.reset} ${s}`), true) }).write(connect.text);
90
+ const mark = connect.linked === false ? `${C.yellow}!${C.reset}` : `${C.green}\u2713${C.reset}`;
91
+ if (flags.json) deps.stderr.write(connect.text);
92
+ else say(`${mark} ${connect.text}`);
91
93
  } else if (connect.outcome === "skipped") {
92
94
  say(`${C.dim}- Connect skipped: ${connect.reason}${C.reset}
93
95
  `);
@@ -1,9 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { DEFAULT_UNIT_NAME, installService, uninstallService, unitPathFor } from './chunk-TFIOXPZT.js';
4
- import './chunk-FBTE2A2X.js';
5
- import './chunk-JKIWMRFH.js';
6
- import './chunk-XR3BJN33.js';
3
+ export { DEFAULT_UNIT_NAME, installService, uninstallService, unitPathFor } from './chunk-RLYZLUQ7.js';
4
+ import './chunk-22RMZBGW.js';
7
5
  import './chunk-UXYLWVTQ.js';
8
6
  import './chunk-7RQ73DLO.js';
9
7
  import './chunk-4Q7OMKAT.js';
@@ -1,9 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { DEFAULT_DASHBOARD, readPipedKey, realLoginDeps, runLoginCommand, sanitizeMachineName, stdinKind } from './chunk-USO2DKBD.js';
3
+ export { DEFAULT_DASHBOARD, readPipedKey, realLoginDeps, runLoginCommand, sanitizeMachineName, stdinKind } from './chunk-4KSQKQXE.js';
4
4
  import './chunk-N6LURUEF.js';
5
5
  import './chunk-YRYMNBGQ.js';
6
6
  import './chunk-EABW6AJQ.js';
7
+ import './chunk-BJ3KTMDH.js';
7
8
  import './chunk-VNVZDWO3.js';
8
9
  import './chunk-Z5GEFMRW.js';
9
10
 
@@ -1,67 +1,69 @@
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-3YFCWYBU.js';
3
+ export { RunnerStartError, listJobFiles, probeCredentials, requestStop, runnerProcessState, start, tick, watchTick } from './chunk-SVEP7PVH.js';
4
+ import './chunk-C6IV5BV7.js';
5
+ import './chunk-O765JR4W.js';
4
6
  import './chunk-UGP76IZ5.js';
5
7
  import './chunk-3JVYMD4G.js';
6
- import './chunk-I2UOAV7X.js';
7
8
  import './chunk-YETTWTAY.js';
8
- import './chunk-BHOBM3IZ.js';
9
- import './chunk-T6OIJQRT.js';
9
+ import './chunk-RMWLBUCJ.js';
10
+ import './chunk-I2UOAV7X.js';
10
11
  import './chunk-FI5UYJMQ.js';
11
- import './chunk-O765JR4W.js';
12
- import './chunk-HKUH5AR2.js';
13
- import './chunk-HYZRY4KZ.js';
14
- import './chunk-Y6P5XX2B.js';
12
+ import './chunk-XJKL4BNU.js';
13
+ import './chunk-3D4OYFCD.js';
15
14
  import './chunk-HHJDN6AU.js';
16
- import './chunk-R7BJYFD2.js';
17
- import './chunk-TI7B7UEO.js';
15
+ import './chunk-HYZRY4KZ.js';
16
+ import './chunk-TOPDNXHZ.js';
18
17
  import './chunk-YYYRBYWG.js';
18
+ import './chunk-TI7B7UEO.js';
19
19
  import './chunk-TBT347UY.js';
20
- import './chunk-7C4T5BGN.js';
21
- import './chunk-BEZSECPA.js';
22
- import './chunk-E5DC4VZL.js';
23
- import './chunk-JKIWMRFH.js';
20
+ import './chunk-MJXXRX4M.js';
21
+ import './chunk-P6FX4D43.js';
22
+ import './chunk-MZN7AQOB.js';
23
+ import './chunk-T5VPP6H7.js';
24
+ import './chunk-RLYZLUQ7.js';
25
+ import './chunk-6MZSX4M7.js';
24
26
  import './chunk-3FMPZPJQ.js';
25
27
  import './chunk-N5FOE5PS.js';
26
28
  import './chunk-OGFGZQA3.js';
27
- import './chunk-2GBCTEN4.js';
29
+ import './chunk-3KTA5UU2.js';
28
30
  import './chunk-QOZKPLVJ.js';
29
- import './chunk-CJGQQZWB.js';
31
+ import './chunk-NX57IBNK.js';
30
32
  import './chunk-CX22S5BA.js';
31
33
  import './chunk-QKFB4K7X.js';
32
34
  import './chunk-RSNSZ2LJ.js';
33
35
  import './chunk-F7CU5ABH.js';
34
36
  import './chunk-BKO6JEZI.js';
35
- import './chunk-DTDZXDQ3.js';
36
- import './chunk-ZQ5JGHUO.js';
37
- import './chunk-BFESLKPP.js';
38
- import './chunk-UES67HLJ.js';
39
- import './chunk-VDI5POCC.js';
40
- import './chunk-IU4NZROR.js';
41
- import './chunk-USO2DKBD.js';
37
+ import './chunk-P4MM66C6.js';
38
+ import './chunk-EFZLAYPE.js';
39
+ import './chunk-IP7BIBXJ.js';
40
+ import './chunk-4QVZCVWT.js';
41
+ import './chunk-CNFVHDHG.js';
42
+ import './chunk-JXYVA45C.js';
43
+ import './chunk-4KSQKQXE.js';
42
44
  import './chunk-N6LURUEF.js';
43
45
  import './chunk-YRYMNBGQ.js';
44
- import './chunk-XR3BJN33.js';
46
+ import './chunk-22RMZBGW.js';
45
47
  import './chunk-UXYLWVTQ.js';
46
48
  import './chunk-7RQ73DLO.js';
47
49
  import './chunk-4Q7OMKAT.js';
48
50
  import './chunk-GQD22KKN.js';
49
51
  import './chunk-WZBHBH3J.js';
50
52
  import './chunk-5QRP3MVS.js';
51
- import './chunk-RWQWPZB4.js';
53
+ import './chunk-GI4XXD4I.js';
52
54
  import './chunk-ZJSNLVCE.js';
53
- import './chunk-BMX3L7CR.js';
54
- import './chunk-BGWTYRSS.js';
55
- import './chunk-TB7EP24C.js';
55
+ import './chunk-TCIW27FM.js';
56
+ import './chunk-LCEXHCHD.js';
57
+ import './chunk-2M63GG56.js';
56
58
  import './chunk-YO4PSLVB.js';
57
59
  import './chunk-PLMTLGYH.js';
58
- import './chunk-YT35WGIP.js';
60
+ import './chunk-J5M7BSJQ.js';
59
61
  import './chunk-EABW6AJQ.js';
60
62
  import './chunk-BYT5O5RV.js';
61
63
  import './chunk-RA3O54FC.js';
62
64
  import './chunk-V7NIVOFD.js';
63
65
  import './chunk-ZM2IMMYN.js';
64
- import './chunk-4HMXH2OA.js';
66
+ import './chunk-SFFHGX3G.js';
65
67
  import './chunk-XCCLFVXM.js';
66
68
  import './chunk-BJ3KTMDH.js';
67
69
  import './chunk-VNVZDWO3.js';
@@ -1,37 +1,37 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { describeMachineDocker, detectMachine, microVmArchSupported, microVmAssetsPinned, reachDockerStep, supportsContainerBuilds, supportsMicroVmBuilds } from './chunk-BEZSECPA.js';
4
- import './chunk-E5DC4VZL.js';
3
+ export { describeMachineDocker, detectMachine, microVmArchSupported, microVmAssetsPinned, reachDockerStep, supportsContainerBuilds, supportsMicroVmBuilds } from './chunk-P6FX4D43.js';
4
+ import './chunk-MZN7AQOB.js';
5
5
  import './chunk-3FMPZPJQ.js';
6
6
  import './chunk-N5FOE5PS.js';
7
7
  import './chunk-OGFGZQA3.js';
8
- import './chunk-2GBCTEN4.js';
8
+ import './chunk-3KTA5UU2.js';
9
9
  import './chunk-QOZKPLVJ.js';
10
- import './chunk-CJGQQZWB.js';
10
+ import './chunk-NX57IBNK.js';
11
11
  import './chunk-CX22S5BA.js';
12
12
  import './chunk-QKFB4K7X.js';
13
13
  import './chunk-RSNSZ2LJ.js';
14
- import './chunk-DTDZXDQ3.js';
15
- import './chunk-ZQ5JGHUO.js';
16
- import './chunk-BFESLKPP.js';
17
- import './chunk-UES67HLJ.js';
18
- import './chunk-VDI5POCC.js';
19
- import './chunk-IU4NZROR.js';
20
- import './chunk-USO2DKBD.js';
14
+ import './chunk-P4MM66C6.js';
15
+ import './chunk-EFZLAYPE.js';
16
+ import './chunk-IP7BIBXJ.js';
17
+ import './chunk-4QVZCVWT.js';
18
+ import './chunk-CNFVHDHG.js';
19
+ import './chunk-JXYVA45C.js';
20
+ import './chunk-4KSQKQXE.js';
21
21
  import './chunk-N6LURUEF.js';
22
22
  import './chunk-YRYMNBGQ.js';
23
23
  import './chunk-UXYLWVTQ.js';
24
24
  import './chunk-7RQ73DLO.js';
25
25
  import './chunk-4Q7OMKAT.js';
26
26
  import './chunk-WZBHBH3J.js';
27
- import './chunk-RWQWPZB4.js';
27
+ import './chunk-GI4XXD4I.js';
28
28
  import './chunk-ZJSNLVCE.js';
29
- import './chunk-BMX3L7CR.js';
30
- import './chunk-BGWTYRSS.js';
31
- import './chunk-TB7EP24C.js';
29
+ import './chunk-TCIW27FM.js';
30
+ import './chunk-LCEXHCHD.js';
31
+ import './chunk-2M63GG56.js';
32
32
  import './chunk-YO4PSLVB.js';
33
33
  import './chunk-PLMTLGYH.js';
34
- import './chunk-YT35WGIP.js';
34
+ import './chunk-J5M7BSJQ.js';
35
35
  import './chunk-EABW6AJQ.js';
36
36
  import './chunk-BYT5O5RV.js';
37
37
  import './chunk-RA3O54FC.js';
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { DEFAULT_MCP_COMMAND, DOCS_MCP_SERVER_NAME, McpInstallError, addDocsMcpEntryIfAbsent, addStdioMcpEntryIfAbsent, buildServerEntry, buildStdioServerEntry, defaultMcpUrl, handleMcpInstallError, runMcpInstall } from './chunk-A56PYPDF.js';
3
+ export { DEFAULT_MCP_COMMAND, DOCS_MCP_SERVER_NAME, McpInstallError, addDocsMcpEntryIfAbsent, addStdioMcpEntryIfAbsent, buildServerEntry, buildStdioServerEntry, defaultMcpUrl, handleMcpInstallError, runMcpInstall } from './chunk-R7OQTKWT.js';
4
4
  import './chunk-YRYMNBGQ.js';
5
5
  import './chunk-EABW6AJQ.js';
6
6
  import './chunk-VNVZDWO3.js';
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from 'node:module';
3
+ export { AGENT_COMMANDS, RunnerEnvError, credentialFromStdin, hasStoredCredential, isAgentName, restartForCredential, storeClaudeCredential } from './chunk-T5VPP6H7.js';
4
+ import './chunk-RLYZLUQ7.js';
5
+ import './chunk-6MZSX4M7.js';
6
+ import './chunk-22RMZBGW.js';
7
+ import './chunk-UXYLWVTQ.js';
8
+ import './chunk-7RQ73DLO.js';
9
+ import './chunk-4Q7OMKAT.js';
10
+ import './chunk-BYT5O5RV.js';
11
+ import './chunk-ZM2IMMYN.js';
12
+ import './chunk-VNVZDWO3.js';
13
+ import './chunk-Z5GEFMRW.js';
14
+
15
+ createRequire(import.meta.url);
@@ -0,0 +1,154 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from 'node:module';
3
+ import { readConfigObject, RunnerInitError } from './chunk-MJXXRX4M.js';
4
+ import './chunk-P6FX4D43.js';
5
+ import './chunk-MZN7AQOB.js';
6
+ import './chunk-T5VPP6H7.js';
7
+ import './chunk-RLYZLUQ7.js';
8
+ import './chunk-6MZSX4M7.js';
9
+ import './chunk-3FMPZPJQ.js';
10
+ import './chunk-N5FOE5PS.js';
11
+ import './chunk-OGFGZQA3.js';
12
+ import './chunk-3KTA5UU2.js';
13
+ import './chunk-QOZKPLVJ.js';
14
+ import './chunk-NX57IBNK.js';
15
+ import './chunk-CX22S5BA.js';
16
+ import './chunk-QKFB4K7X.js';
17
+ import './chunk-RSNSZ2LJ.js';
18
+ import { postJson, WorkCommandError, getJson } from './chunk-P4MM66C6.js';
19
+ import './chunk-EFZLAYPE.js';
20
+ import './chunk-IP7BIBXJ.js';
21
+ import './chunk-4QVZCVWT.js';
22
+ import './chunk-CNFVHDHG.js';
23
+ import './chunk-JXYVA45C.js';
24
+ import './chunk-4KSQKQXE.js';
25
+ import './chunk-N6LURUEF.js';
26
+ import './chunk-YRYMNBGQ.js';
27
+ import { runnerCredentialProblem } from './chunk-22RMZBGW.js';
28
+ import './chunk-UXYLWVTQ.js';
29
+ import './chunk-7RQ73DLO.js';
30
+ import './chunk-4Q7OMKAT.js';
31
+ import './chunk-WZBHBH3J.js';
32
+ import './chunk-GI4XXD4I.js';
33
+ import './chunk-ZJSNLVCE.js';
34
+ import './chunk-TCIW27FM.js';
35
+ import './chunk-LCEXHCHD.js';
36
+ import './chunk-2M63GG56.js';
37
+ import './chunk-YO4PSLVB.js';
38
+ import './chunk-PLMTLGYH.js';
39
+ import './chunk-J5M7BSJQ.js';
40
+ import { readCloudConfig } from './chunk-EABW6AJQ.js';
41
+ import './chunk-BYT5O5RV.js';
42
+ import './chunk-RA3O54FC.js';
43
+ import './chunk-V7NIVOFD.js';
44
+ import './chunk-ZM2IMMYN.js';
45
+ import './chunk-XCCLFVXM.js';
46
+ import { readRepoConnection } from './chunk-BJ3KTMDH.js';
47
+ import { homeFromEnv } from './chunk-VNVZDWO3.js';
48
+ import './chunk-Z5GEFMRW.js';
49
+ import { existsSync } from 'fs';
50
+ import { hostname } from 'os';
51
+
52
+ createRequire(import.meta.url);
53
+ var RUNNER_KEY_PERMISSIONS = [
54
+ "sessions.ingest",
55
+ "evidence.insert",
56
+ "work.read",
57
+ "git.read",
58
+ "context.read",
59
+ "work.update",
60
+ "work.claim",
61
+ "hosts.ingest"
62
+ ];
63
+ var MAX_NAME_ATTEMPTS = 10;
64
+ var PASTED_KEY_FALLBACK = "Ask a member who can create keys to make one with the Runner preset on the factory's API keys page, then put it in the runner's config file as apiKey, with the Factory Id as appId, and run this again.";
65
+ function runnerKeyLogin(configPath, opts = {}) {
66
+ const env = opts.env ?? process.env;
67
+ const config = existsSync(configPath) ? readConfigObject(configPath) : {};
68
+ if (config.apiKey !== void 0) {
69
+ if (opts.appId !== void 0 && opts.appId !== config.appId) {
70
+ throw new RunnerInitError(
71
+ `${configPath} already holds a runner key, for the factory its appId names, so --app-id ${opts.appId} creates no key. Leave --app-id out, or give it the same id.`
72
+ );
73
+ }
74
+ return void 0;
75
+ }
76
+ const saved = readCloudConfig(opts.home ?? homeFromEnv(env));
77
+ const own = typeof config.accountToken === "string" && config.accountToken !== "";
78
+ const accountToken = own ? config.accountToken : saved.accountToken;
79
+ if (accountToken === void 0 || accountToken === "") return void 0;
80
+ const url = config.url ?? (own ? void 0 : saved.url);
81
+ const appId = opts.appId ?? (env.OUTERLAYER_APP_ID || void 0) ?? config.appId ?? readRepoConnection(opts.cwd ?? process.cwd())?.appId;
82
+ if (appId === void 0) {
83
+ throw new RunnerInitError(
84
+ "you are logged in, so this command creates the runner's key, but no factory is chosen. Pass --app-id with the Factory Id from the factory's Settings \u2192 General, or set OUTERLAYER_APP_ID."
85
+ );
86
+ }
87
+ const problem = runnerCredentialProblem({ url, apiKey: accountToken, appId });
88
+ if (problem !== void 0) {
89
+ const where = problem.field === "appId" ? "the factory id" : `${configPath}: ${problem.field}`;
90
+ throw new RunnerInitError(`${where} ${problem.reason}.`);
91
+ }
92
+ return { url, accountToken, appId };
93
+ }
94
+ function defaultRunnerKeyName(host = hostname()) {
95
+ const short = host.replace(/\..*$/, "").trim();
96
+ return short === "" ? "runner" : short;
97
+ }
98
+ function clause(message) {
99
+ return message.replace(/\.+$/, "");
100
+ }
101
+ function forbidden(err) {
102
+ return new RunnerInitError(`your login cannot create a runner key on this factory: ${clause(err.message)}. ${PASTED_KEY_FALLBACK}`);
103
+ }
104
+ async function createKey(login, name, fetchImpl) {
105
+ for (let attempt = 1; attempt <= MAX_NAME_ATTEMPTS; attempt++) {
106
+ const tried = attempt === 1 ? name : `${name}-${attempt}`;
107
+ try {
108
+ const { data } = await postJson(
109
+ login.url,
110
+ "/v1/api-keys",
111
+ login.accountToken,
112
+ login.appId,
113
+ { name: tried, permissions: [...RUNNER_KEY_PERMISSIONS], app_id: login.appId },
114
+ fetchImpl
115
+ );
116
+ const apiKey = data.plaintext_key;
117
+ if (typeof apiKey !== "string" || apiKey === "") {
118
+ throw new RunnerInitError(`the gateway created the key ${tried} but did not return it. Delete it on the factory's API keys page, then run this again.`);
119
+ }
120
+ return { apiKey, name: tried };
121
+ } catch (err) {
122
+ if (!(err instanceof WorkCommandError)) throw err;
123
+ if (err.status === 409) continue;
124
+ if (err.status === 403) throw forbidden(err);
125
+ throw new RunnerInitError(`the runner key was not created: ${clause(err.message)}.`);
126
+ }
127
+ }
128
+ throw new RunnerInitError(
129
+ `the names ${name} to ${name}-${MAX_NAME_ATTEMPTS} are all taken by keys on this factory. Pass --key-name with another name.`
130
+ );
131
+ }
132
+ async function checkKey(key, fetchImpl) {
133
+ const unusable = (why) => new RunnerInitError(
134
+ `the runner key ${key.name} was created, but ${why}. Nothing else was changed. Delete the key on the factory's API keys page, then run this again.`
135
+ );
136
+ let data;
137
+ try {
138
+ ({ data } = await getJson(key.url, "/v1/runner/host-key", key.apiKey, key.appId, fetchImpl));
139
+ } catch (err) {
140
+ throw unusable(`the gateway did not accept it: ${clause(err instanceof Error ? err.message : String(err))}`);
141
+ }
142
+ if (data.bound !== false) {
143
+ throw unusable("the gateway did not report it as a new runner key");
144
+ }
145
+ }
146
+ async function createRunnerKey(login, opts = {}) {
147
+ const fetchImpl = opts.fetchImpl ?? fetch;
148
+ const created = await createKey(login, opts.name ?? defaultRunnerKeyName(), fetchImpl);
149
+ const key = { url: login.url, apiKey: created.apiKey, appId: login.appId, name: created.name };
150
+ await checkKey(key, fetchImpl);
151
+ return key;
152
+ }
153
+
154
+ export { RUNNER_KEY_PERMISSIONS, createRunnerKey, defaultRunnerKeyName, runnerKeyLogin };
@@ -1,14 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { runSessionSender, senderPidfile, startSessionSender } from './chunk-HKUH5AR2.js';
4
- import './chunk-Y6P5XX2B.js';
3
+ export { runSessionSender, senderPidfile, startSessionSender } from './chunk-XJKL4BNU.js';
4
+ import './chunk-3D4OYFCD.js';
5
5
  import './chunk-HHJDN6AU.js';
6
6
  import './chunk-TBT347UY.js';
7
7
  import './chunk-F7CU5ABH.js';
8
8
  import './chunk-BKO6JEZI.js';
9
- import './chunk-BFESLKPP.js';
10
- import './chunk-VDI5POCC.js';
11
- import './chunk-IU4NZROR.js';
9
+ import './chunk-IP7BIBXJ.js';
10
+ import './chunk-CNFVHDHG.js';
11
+ import './chunk-JXYVA45C.js';
12
12
  import './chunk-YRYMNBGQ.js';
13
13
  import './chunk-GQD22KKN.js';
14
14
  import './chunk-WZBHBH3J.js';
@@ -16,11 +16,11 @@ import './chunk-5QRP3MVS.js';
16
16
  import './chunk-ZJSNLVCE.js';
17
17
  import './chunk-YO4PSLVB.js';
18
18
  import './chunk-PLMTLGYH.js';
19
- import './chunk-YT35WGIP.js';
19
+ import './chunk-J5M7BSJQ.js';
20
20
  import './chunk-EABW6AJQ.js';
21
21
  import './chunk-V7NIVOFD.js';
22
22
  import './chunk-ZM2IMMYN.js';
23
- import './chunk-4HMXH2OA.js';
23
+ import './chunk-SFFHGX3G.js';
24
24
  import './chunk-XCCLFVXM.js';
25
25
  import './chunk-BJ3KTMDH.js';
26
26
  import './chunk-VNVZDWO3.js';
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { StarterPackError, assertKnownTemplate, formatStarterPackOutput, installStarterPack } from './chunk-SUMWRA7K.js';
3
+ export { StarterPackError, assertKnownTemplate, formatStarterPackOutput, installStarterPack } from './chunk-DXQ5MHCO.js';
4
4
  import './chunk-YRYMNBGQ.js';
5
- import './chunk-BGWTYRSS.js';
6
- import './chunk-TB7EP24C.js';
7
- import './chunk-YT35WGIP.js';
5
+ import './chunk-TCIW27FM.js';
6
+ import './chunk-2M63GG56.js';
7
+ import './chunk-J5M7BSJQ.js';
8
8
  import './chunk-RA3O54FC.js';
9
9
  import './chunk-Z5GEFMRW.js';
10
10