@outerlayer/cli 0.19.1 → 0.22.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 (146) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +26 -7
  3. package/dist/{agent-setup-AM42SA2D.js → agent-setup-XAJH6MPW.js} +13 -12
  4. package/dist/build-GTMEADQD.js +12 -0
  5. package/dist/build-command-ND2ENDBS.js +50 -0
  6. package/dist/build-info.json +1 -1
  7. package/dist/{builder-C4QNTYMS.js → builder-OAUSTZHL.js} +7 -5
  8. package/dist/{check-W2JGXN3B.js → check-3YHMJQ3P.js} +48 -50
  9. package/dist/{chunk-F2KXHIFI.js → chunk-22DYXLU7.js} +360 -66
  10. package/dist/{chunk-P53VEAOF.js → chunk-2CMJLYV6.js} +1 -1
  11. package/dist/{chunk-FBTGMSQF.js → chunk-2HT2XGJX.js} +16 -9
  12. package/dist/{chunk-S5PCA3SN.js → chunk-2J5JGLW5.js} +1 -1
  13. package/dist/{chunk-R22NZSGA.js → chunk-34XORKFD.js} +9 -9
  14. package/dist/{chunk-QOZKPLVJ.js → chunk-3W333NFO.js} +40 -1
  15. package/dist/{chunk-HOKXGFDR.js → chunk-4JHVPFH6.js} +22 -16
  16. package/dist/{chunk-AMFWYESY.js → chunk-4NM3I3VV.js} +1 -1
  17. package/dist/{chunk-PIZRPNKR.js → chunk-4QKLMNI3.js} +5 -5
  18. package/dist/{chunk-NNLA7LLQ.js → chunk-5OCIHFGE.js} +29 -5
  19. package/dist/{chunk-PSN33ERW.js → chunk-6IO62VJS.js} +3 -3
  20. package/dist/{chunk-7YP7T6GV.js → chunk-7V7KG3YM.js} +2 -2
  21. package/dist/{chunk-QNLX477Q.js → chunk-AEKSX4EY.js} +165 -72
  22. package/dist/{chunk-JHGEBPLE.js → chunk-ATRIVTRE.js} +3 -3
  23. package/dist/{chunk-X5H2WYMB.js → chunk-BLW6GPBZ.js} +1 -1
  24. package/dist/{chunk-MLAAT4S6.js → chunk-C3HKR67W.js} +3 -3
  25. package/dist/{chunk-XZ4H4X5F.js → chunk-C3OVGKVJ.js} +15 -8
  26. package/dist/{chunk-BM63HB2M.js → chunk-EAQSOE62.js} +2 -2
  27. package/dist/{chunk-LW7G5TJB.js → chunk-EXV37PKS.js} +2 -2
  28. package/dist/{chunk-B6SCN5NY.js → chunk-FGW2774C.js} +175 -44
  29. package/dist/{chunk-KYS3TQAG.js → chunk-G2WME4RG.js} +4 -4
  30. package/dist/{chunk-LRG3ZMZD.js → chunk-G6DZCKA6.js} +4 -4
  31. package/dist/chunk-GISNHSYL.js +41 -0
  32. package/dist/{chunk-G2YNJIGF.js → chunk-HCVLP7XA.js} +10 -1
  33. package/dist/{chunk-QEFKA2QD.js → chunk-I66MQDXH.js} +2 -2
  34. package/dist/{chunk-3CWUOFV6.js → chunk-IRBNIRQJ.js} +12 -7
  35. package/dist/{chunk-CG36IONK.js → chunk-JRCSET55.js} +2 -2
  36. package/dist/{chunk-CGGPS7SI.js → chunk-JVB63NIB.js} +5 -5
  37. package/dist/{chunk-M2ZWWTWZ.js → chunk-KDHYLBRR.js} +1 -1
  38. package/dist/{chunk-N2PXGQRL.js → chunk-KIGSGZBB.js} +1 -1
  39. package/dist/{chunk-EAEELQVQ.js → chunk-KOQELWQ6.js} +5 -5
  40. package/dist/{chunk-MTP2QEVO.js → chunk-KPBQYEND.js} +1 -1
  41. package/dist/{chunk-VYAL7PUE.js → chunk-LOB2SUM3.js} +1 -1
  42. package/dist/{chunk-GGOMT6KF.js → chunk-PHHBYAL6.js} +1 -1
  43. package/dist/{chunk-IF2OSI5T.js → chunk-QOALB6ZD.js} +2 -2
  44. package/dist/{chunk-BWSUPRDK.js → chunk-TPKYTORP.js} +1 -1
  45. package/dist/{chunk-XNGMQ27R.js → chunk-UD3EXMKB.js} +2 -2
  46. package/dist/{chunk-7UWVLZXD.js → chunk-USWVXQIH.js} +1 -1
  47. package/dist/{chunk-BQXFBI7T.js → chunk-V7MQKOZY.js} +32 -7
  48. package/dist/{chunk-6X4SQ5MY.js → chunk-V7SAQ645.js} +1 -1
  49. package/dist/{chunk-TWF3RICI.js → chunk-VSUXCMMH.js} +110 -11
  50. package/dist/{chunk-FVMYKL6L.js → chunk-VWLOQ6FI.js} +1 -1
  51. package/dist/{chunk-3ZR7Y23Y.js → chunk-VX74ND77.js} +650 -70
  52. package/dist/{chunk-Z7K3L4FC.js → chunk-W3SWJ2TD.js} +2 -2
  53. package/dist/chunk-WERZMIKA.js +718 -0
  54. package/dist/{chunk-GEMQLBMW.js → chunk-WMHYIBJW.js} +6 -6
  55. package/dist/{chunk-5VML45HH.js → chunk-XCRZTXRL.js} +2 -2
  56. package/dist/{chunk-ECODQ7II.js → chunk-ZFLOGMUC.js} +1 -1
  57. package/dist/chunk-ZNPE7FW5.js +137 -0
  58. package/dist/claude-launcher-4BQNXYAF.js +267 -0
  59. package/dist/{cli-EXX2R73G.js → cli-NMGVZQPB.js} +189 -119
  60. package/dist/{command-ZQNEPDS6.js → command-GE62AJZY.js} +32 -34
  61. package/dist/{config-CLSGABD5.js → config-7Q52COZ3.js} +3 -2
  62. package/dist/{connect-cmd-UNYKGDAL.js → connect-cmd-ZFOK6HEL.js} +5 -5
  63. package/dist/{context-cleanup-CHEWNYU6.js → context-cleanup-DSA3HGQU.js} +1 -1
  64. package/dist/{control-plane-launch-34LNRJWR.js → control-plane-launch-SZTE4TUS.js} +62 -28
  65. package/dist/{dist-WO7NOJNG.js → dist-7IH56ELA.js} +1 -1
  66. package/dist/{docker-BFU3AQGY.js → docker-2OVBKVRK.js} +7 -7
  67. package/dist/{doctor-DHUM5DBB.js → doctor-3SQGZVYP.js} +35 -36
  68. package/dist/{emit-artifact-cmd-XBHM647X.js → emit-artifact-cmd-R42BE6ID.js} +19 -18
  69. package/dist/{emit-cmd-W55AEBCA.js → emit-cmd-3W5IO5ET.js} +3 -3
  70. package/dist/{emit-criteria-cmd-CRTYEF7D.js → emit-criteria-cmd-MQZE7W4Y.js} +52 -16
  71. package/dist/{emit-finding-cmd-7JHVRYOP.js → emit-finding-cmd-ZS5JEGGM.js} +13 -12
  72. package/dist/{emit-result-cmd-5NZMLCJK.js → emit-result-cmd-FUE3DXBW.js} +19 -18
  73. package/dist/{emit-step-cmd-347XNGPQ.js → emit-step-cmd-T7PRA44X.js} +14 -13
  74. package/dist/{exec-client-7UMESIE2.js → exec-client-YIDTWXMZ.js} +4 -3
  75. package/dist/{governing-source-HAA4OW57.js → governing-source-TORXL4I4.js} +19 -18
  76. package/dist/{guest-init-KPBQOFE5.js → guest-init-TO6HAWIT.js} +4 -3
  77. package/dist/{hook-fast-RL5E5OXE.js → hook-fast-WFB2ZMRB.js} +2 -2
  78. package/dist/host-key-2LXQDSBO.js +9 -0
  79. package/dist/{import-capture-cmd-TK4XY7RD.js → import-capture-cmd-Q56DDZVO.js} +1 -1
  80. package/dist/index.js +5 -5
  81. package/dist/init-2CRAVIUU.js +52 -0
  82. package/dist/{init-V6FOMD2V.js → init-AHDZCMDC.js} +32 -33
  83. package/dist/{init-cmd-Z4O4PPLZ.js → init-cmd-IXDL2ZSL.js} +25 -23
  84. package/dist/{init-update-7DVAKWW3.js → init-update-YB3PODDH.js} +69 -24
  85. package/dist/{install-4SEFIIW2.js → install-CZUIW2AF.js} +5 -4
  86. package/dist/{install-cmd-QDOTR4OM.js → install-cmd-Q7RJGFUO.js} +6 -5
  87. package/dist/{login-browser-DX35MARZ.js → login-browser-BN5UKPHS.js} +3 -3
  88. package/dist/{logout-cmd-5V5MMBSY.js → logout-cmd-RZFWTNYD.js} +2 -2
  89. package/dist/{logs-AMLKC3VP.js → logs-RJPYTVQE.js} +3 -2
  90. package/dist/loop-ZDW6TRAA.js +75 -0
  91. package/dist/machine-JCOHLASP.js +47 -0
  92. package/dist/{mcp-install-cmd-GGWB3JJ2.js → mcp-install-cmd-GD4QUP7Z.js} +2 -2
  93. package/dist/{mcp-serve-cmd-N3UTY6EE.js → mcp-serve-cmd-IULQPVHL.js} +6 -5
  94. package/dist/{paths-7XP63OAX.js → paths-N3LU4O2Z.js} +3 -2
  95. package/dist/pending-GRCV3ZR4.js +9 -0
  96. package/dist/{pidfile-3DM4OBKO.js → pidfile-IF3TCL5A.js} +4 -3
  97. package/dist/receive-files-T2BIUBQL.js +254 -0
  98. package/dist/{record-3WP6V2K5.js → record-73PQE77B.js} +4 -3
  99. package/dist/relay-PSZ4LGMW.js +210 -0
  100. package/dist/relay-protocol-K7KP2SPI.js +6 -0
  101. package/dist/{runner-env-FRZFFHDF.js → runner-env-LDOBJESN.js} +6 -5
  102. package/dist/runner-identity-RWCBTY2A.js +14 -0
  103. package/dist/{runner-key-5FOWCW7J.js → runner-key-HMYLP6WN.js} +32 -33
  104. package/dist/{session-sender-U2BBUWNO.js → session-sender-2G25JYHI.js} +20 -19
  105. package/dist/{spec-cmd-FVLJOFGC.js → spec-cmd-LBVXM6XS.js} +13 -12
  106. package/dist/{starter-pack-6LQVLBIA.js → starter-pack-5EQYGSJF.js} +2 -2
  107. package/dist/{status-BINH7MBG.js → status-QZB2GWXJ.js} +36 -38
  108. package/dist/{statusline-fast-KN3BX67H.js → statusline-fast-2OK3DVAA.js} +2 -2
  109. package/dist/{sync-cmd-VXOUFS4I.js → sync-cmd-TQQIR4PN.js} +19 -18
  110. package/dist/{watch-OH645CV2.js → watch-4JES4PCS.js} +19 -18
  111. package/dist/{work-claim-cmd-ZRPSHMPT.js → work-claim-cmd-XG6O7B63.js} +17 -16
  112. package/dist/{work-cmd-5I3J2XQQ.js → work-cmd-L6WMPAA2.js} +13 -12
  113. package/dist/{work-comment-cmd-UCCPWUSR.js → work-comment-cmd-SNTDCPGH.js} +13 -12
  114. package/dist/{work-logs-cmd-7352CJPG.js → work-logs-cmd-3S7IAVII.js} +13 -12
  115. package/dist/{work-open-pr-cmd-LSH4VHJM.js → work-open-pr-cmd-E3WMO5XT.js} +15 -14
  116. package/dist/{work-pr-cmd-H4OQR26N.js → work-pr-cmd-22T6FG4T.js} +14 -13
  117. package/dist/work-stop-cmd-WR7ESS4Z.js +53 -0
  118. package/package.json +2 -2
  119. package/skill-pack/maintained/outerlayer-build/SKILL.md +347 -0
  120. package/skill-pack/{template/build → maintained/outerlayer-build}/references/evidence.md +2 -2
  121. package/skill-pack/{template/build → maintained/outerlayer-build}/references/release.md +4 -4
  122. package/skill-pack/{template/build → maintained/outerlayer-build}/references/review-loop.md +3 -1
  123. package/skill-pack/shipped.json +2 -0
  124. package/skill-pack/template/build/SKILL.md +4 -253
  125. package/skill-pack/validators/acceptance-criteria.yaml +1 -1
  126. package/dist/build-TQ6X5PYN.js +0 -12
  127. package/dist/chunk-3UZTIRLF.js +0 -320
  128. package/dist/chunk-CX22S5BA.js +0 -45
  129. package/dist/chunk-LLM3I5YU.js +0 -89
  130. package/dist/chunk-SADUQSO4.js +0 -50
  131. package/dist/chunk-VMJPFQNE.js +0 -261
  132. package/dist/claude-launcher-J5M44PFS.js +0 -115
  133. package/dist/host-key-U4B5QETR.js +0 -8
  134. package/dist/init-XG47KCI4.js +0 -53
  135. package/dist/loop-TPUYUMSY.js +0 -77
  136. package/dist/machine-TRHBT5NE.js +0 -48
  137. package/dist/pending-532ABZYC.js +0 -8
  138. package/dist/relay-L76HDX72.js +0 -46
  139. package/dist/{chunk-YVZJ6GKF.js → chunk-DIB2WLBL.js} +1 -1
  140. package/dist/{chunk-GOSFARMS.js → chunk-F35VMF5M.js} +1 -1
  141. package/dist/{chunk-DSF2FWAZ.js → chunk-IZSVXRDR.js} +1 -1
  142. /package/skill-pack/{template/build → maintained/outerlayer-build}/references/agent-briefs.md +0 -0
  143. /package/skill-pack/{template/build → maintained/outerlayer-build}/references/criteria-judge.md +0 -0
  144. /package/skill-pack/{template/build → maintained/outerlayer-build}/references/review-briefs.md +0 -0
  145. /package/skill-pack/{template/build → maintained/outerlayer-build}/scripts/criterion-citations.mjs +0 -0
  146. /package/skill-pack/{template/build → maintained/outerlayer-build}/scripts/record-criteria.mjs +0 -0
@@ -3,7 +3,7 @@ import { createRequire } from 'node:module';
3
3
  import { MAX_ALLOW_HOSTS, allowHostProblem } from './chunk-UXYLWVTQ.js';
4
4
  import { parseSize } from './chunk-7RQ73DLO.js';
5
5
  import { homeFromEnv } from './chunk-VNVZDWO3.js';
6
- import { isRefusedInConfig, resolveDestinations, isReservedVariable } from './chunk-BQXFBI7T.js';
6
+ import { isRefusedInConfig, resolveDestinations, isReservedVariable } from './chunk-V7MQKOZY.js';
7
7
  import { existsSync, statSync, accessSync, constants, readFileSync } from 'fs';
8
8
  import { hostname } from 'os';
9
9
  import { join } from 'path';
@@ -1,16 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { detectActiveSession, autoConnect } from './chunk-IF2OSI5T.js';
4
- import { workPageUrl } from './chunk-CG36IONK.js';
3
+ import { detectActiveSession, autoConnect } from './chunk-QOALB6ZD.js';
4
+ import { workPageUrl } from './chunk-JRCSET55.js';
5
5
  import { sanitizeTerminal } from './chunk-G3IJ3N6F.js';
6
- import { resolveRepoIdentity } from './chunk-QNLX477Q.js';
7
- import { C } from './chunk-ANPNT6PM.js';
8
- import { parseTrackerNumber, trackerNumberError } from './chunk-WZBHBH3J.js';
9
- import { defaultFetch } from './chunk-FVMYKL6L.js';
6
+ import { defaultFetch } from './chunk-VWLOQ6FI.js';
10
7
  import { resolveGatewayCredentials, unauthorizedMessage } from './chunk-NTRCK4NH.js';
11
8
  import { readRepoConnection } from './chunk-BJ3KTMDH.js';
9
+ import { resolveRepoIdentity } from './chunk-AEKSX4EY.js';
10
+ import { C } from './chunk-ANPNT6PM.js';
11
+ import { parseTrackerNumber, trackerNumberError } from './chunk-WZBHBH3J.js';
12
12
  import { homeFromEnv } from './chunk-VNVZDWO3.js';
13
- import { signRunnerRequest } from './chunk-M2ZWWTWZ.js';
13
+ import { signRunnerRequest } from './chunk-KDHYLBRR.js';
14
14
 
15
15
  createRequire(import.meta.url);
16
16
 
@@ -378,6 +378,11 @@ async function runWorkBuild(opts) {
378
378
  const cwd = opts.cwd ?? process.cwd();
379
379
  const env = opts.env ?? process.env;
380
380
  const home = opts.home ?? homeFromEnv(env);
381
+ if (opts.local && opts.instructions !== void 0) {
382
+ throw new WorkCommandError(
383
+ "--instructions applies to host builds: with --local you build the item yourself, so give your instructions in your own session"
384
+ );
385
+ }
381
386
  await connectIfOneFits(opts);
382
387
  const { url, apiKey, appId } = resolveCredentials(opts);
383
388
  const fetchImpl = opts.fetchImpl ?? defaultFetch;
@@ -404,9 +409,11 @@ async function runWorkBuild(opts) {
404
409
  if (!opts.quiet) process.stdout.write(output2 + "\n");
405
410
  return { data: data2, output: output2 };
406
411
  }
407
- const body = itemNumber !== void 0 ? { workItemId: String(itemNumber), note: opts.note, ...facts } : {
412
+ const instructions = opts.instructions !== void 0 ? { instructions: opts.instructions } : {};
413
+ const body = itemNumber !== void 0 ? { workItemId: String(itemNumber), note: opts.note, ...instructions, ...facts } : {
408
414
  subject: resolveWorkSubject({ issue: opts.issue, tracker: opts.tracker, repo: opts.repo, cwd }),
409
415
  note: opts.note,
416
+ ...instructions,
410
417
  ...facts
411
418
  };
412
419
  const { data } = await postJsonWithRetry(url, "/v1/work-items/build", apiKey, appId, body, fetchImpl, retries, sleep);
@@ -421,7 +428,7 @@ async function runWorkLinkSession(opts) {
421
428
  return await linkSession(opts);
422
429
  } catch (err) {
423
430
  if (opts.logFailures) {
424
- const { logHookError } = await import('./hook-fast-RL5E5OXE.js');
431
+ const { logHookError } = await import('./hook-fast-WFB2ZMRB.js');
425
432
  const reason = err instanceof Error ? err.message : String(err);
426
433
  logHookError(opts.home ?? homeFromEnv(opts.env ?? process.env), new Error(`work link-session #${opts.number} failed: ${reason}`));
427
434
  }
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { RUNNER_DIR_MODE, RUNNER_FILE_MODE } from './chunk-N2PXGQRL.js';
3
+ import { RUNNER_DIR_MODE, RUNNER_FILE_MODE } from './chunk-KIGSGZBB.js';
4
4
  import { readFileSync, mkdirSync, writeFileSync, renameSync } from 'fs';
5
5
  import { join } from 'path';
6
6
 
@@ -1,25 +1,25 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { uploadSpooledSteps } from './chunk-KYS3TQAG.js';
3
+ import { uploadSpooledSteps } from './chunk-G2WME4RG.js';
4
4
  import { LaunchFilter } from './chunk-ESVW4MJY.js';
5
5
  import { RepoFilter } from './chunk-TBT347UY.js';
6
6
  import { migrateLegacyArtifactSidecars, planArtifactUpload, artifactsStatePath, sanitizeTerminal, acquireArtifactSpoolLock, artifactBlobsDir, resolveArtifactTurnIndex, isArtifactTombstoned, ARTIFACT_RETRY_MAX_AGE_MS, writeArtifactSpoolState, reclaimUnneededArtifactBlobs, neededArtifactShas } from './chunk-G3IJ3N6F.js';
7
- import { writeSyncStatus, spoolDir } from './chunk-PSN33ERW.js';
8
- import { hookExecSpoolPath } from './chunk-F7CU5ABH.js';
9
- import { applyReportedCost } from './chunk-BKO6JEZI.js';
10
- import { setCustomScrubbers, setLocalIdentity, tailTranscript, enrichSessionRepo, scanAll, setRepoRoot, resolveRepoIdentity, sessionIdFromPath, scrubDeep, SOURCE_ADAPTERS } from './chunk-QNLX477Q.js';
11
- import { C } from './chunk-ANPNT6PM.js';
12
- import { readLaunchSpoolState, launchStatusIsDecisive, launchedItemsBySession, launchesPath } from './chunk-T2Q7ISPE.js';
13
- import { defaultFetch } from './chunk-FVMYKL6L.js';
7
+ import { defaultFetch } from './chunk-VWLOQ6FI.js';
14
8
  import { resolveGatewayCredentials, unauthorizedMessage } from './chunk-NTRCK4NH.js';
9
+ import { writeSyncStatus, spoolDir } from './chunk-6IO62VJS.js';
15
10
  import { readLatestProvenanceForSession, readContextProvenance } from './chunk-ZJSNLVCE.js';
11
+ import { hookExecSpoolPath } from './chunk-F7CU5ABH.js';
12
+ import { applyReportedCost } from './chunk-BKO6JEZI.js';
16
13
  import { readRepoConnection, findGitDirs } from './chunk-BJ3KTMDH.js';
14
+ import { setCustomScrubbers, setLocalIdentity, tailTranscript, enrichSessionRepo, scanAll, setRepoRoot, resolveRepoIdentity, sessionIdFromPath, scrubDeep, SOURCE_ADAPTERS } from './chunk-AEKSX4EY.js';
17
15
  import { readCloudConfig, cloudConfigPath, writeCloudConfig } from './chunk-EABW6AJQ.js';
16
+ import { C } from './chunk-ANPNT6PM.js';
17
+ import { readLaunchSpoolState, launchStatusIsDecisive, launchedItemsBySession, launchesPath } from './chunk-T2Q7ISPE.js';
18
18
  import { cliInvocation } from './chunk-CRB3POP4.js';
19
19
  import { removeJournalHooks } from './chunk-TUSYOL2O.js';
20
20
  import { CAPTURE_TIERS, inferArtifactKind, bannedPathsForTier, downconvertSession, isHumanUserTurn, turnCountBound, EVENT_TYPES } from './chunk-7VUK5RFS.js';
21
21
  import { homeFromEnv } from './chunk-VNVZDWO3.js';
22
- import { signerFor, signRunnerRequest } from './chunk-M2ZWWTWZ.js';
22
+ import { signerFor, signRunnerRequest } from './chunk-KDHYLBRR.js';
23
23
  import { dirname, basename, join } from 'path';
24
24
  import { statSync, readFileSync, readdirSync, mkdirSync, writeFileSync, renameSync, existsSync, rmSync } from 'fs';
25
25
  import { execFileSync } from 'child_process';
@@ -223,4 +223,43 @@ function writeSanitizedRecipe(checkoutDir, location, recipe) {
223
223
  }
224
224
  var SANITIZED_NAME = "outerlayer-recipe.json";
225
225
 
226
- export { RecipeError, SANITIZED_NAME, assertBuildable, classifyProperties, locateRecipe, readRecipe, writeSanitizedRecipe };
226
+ // src/runner/image/pins.ts
227
+ var CLAUDE_CODE_VERSION = "2.1.284";
228
+ var DEFAULT_BASE_IMAGE = "ubuntu:24.04@sha256:008173c23f95b170204355c12626cb5a965d779a7e1283b09e9cffbb1bf33ca3";
229
+ var NODE_IMAGE = "node:22-bookworm-slim@sha256:43ac6c60b8f89723f746e8a92ce91abd5017e627ce1ddfe4238355d3a30b772c";
230
+ var BUILDKIT_IMAGE = "moby/buildkit:v0.33.1@sha256:cec9f139f45e93c5c69c60f8b07cfad9f43f4ef6b6a6cd917527fea5ff2e3dea";
231
+ var GH_VERSION = "2.101.0";
232
+ var GH_SHA256 = {
233
+ amd64: "9bca2d1c16825f109907a23307628a2f0698fbf99662b73a5cf0b020293072b8",
234
+ arm64: "b57e8063f18862647c9d22727c32e9da1b963f8bf9db648fe123a6975695640f"
235
+ };
236
+ var TINI_VERSION = "0.19.0";
237
+ var TINI_SHA256 = {
238
+ amd64: "c5b0666b4cb676901f90dfcb37106783c5fe2077b04590973b885950611b30ee",
239
+ arm64: "eae1d3aa50c48fb23b8cbdf4e369d0910dfc538566bfd09df89a774aa84a48b9"
240
+ };
241
+ var MICROVM_ARCHES = ["x86_64"];
242
+ function firecrackerArch(nodeArch) {
243
+ return nodeArch === "x64" ? "x86_64" : nodeArch === "arm64" ? "aarch64" : nodeArch;
244
+ }
245
+ var FIRECRACKER_VERSION = "1.13.1";
246
+ var FIRECRACKER_SHA256 = {
247
+ x86_64: "59450b9171ff2ebdf2f9a25be3a248a7ba79fb6371aec51a9d6d8eefca7b4faf"
248
+ };
249
+ var FIRECRACKER_BINARY_SHA256 = {
250
+ x86_64: "7d3924e0c8761edafbf85cb2a94c268ffad249644a40fd02d4e15cde4c206f6e"
251
+ };
252
+ var GUEST_ASSETS_VERSION = "1";
253
+ var GUEST_ASSETS_BASE_URL = `https://github.com/outerlayerai/guest-assets/releases/download/guest-${GUEST_ASSETS_VERSION}`;
254
+ var GUEST_KERNEL_SHA256 = {
255
+ x86_64: "5a2d716d301615c69fefc2f9574954e838269f14d5e8b0d1bad88b680cd372ee"
256
+ };
257
+ var GUEST_HELPER_SHA256 = {
258
+ x86_64: "4175e89ae8cb633113b5f69ef8b6e206093954411fe53edf86357bc1b7e822f9"
259
+ };
260
+ function guestAssetsPinned(arch) {
261
+ const zero = "0".repeat(64);
262
+ return GUEST_KERNEL_SHA256[arch] !== zero && GUEST_HELPER_SHA256[arch] !== zero;
263
+ }
264
+
265
+ export { BUILDKIT_IMAGE, CLAUDE_CODE_VERSION, DEFAULT_BASE_IMAGE, FIRECRACKER_BINARY_SHA256, FIRECRACKER_SHA256, FIRECRACKER_VERSION, GH_SHA256, GH_VERSION, GUEST_ASSETS_BASE_URL, GUEST_ASSETS_VERSION, GUEST_HELPER_SHA256, GUEST_KERNEL_SHA256, MICROVM_ARCHES, NODE_IMAGE, RecipeError, SANITIZED_NAME, TINI_SHA256, TINI_VERSION, assertBuildable, classifyProperties, firecrackerArch, guestAssetsPinned, locateRecipe, readRecipe, writeSanitizedRecipe };
@@ -1,20 +1,20 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { checkStarterFiles, contextIsGoverned } from './chunk-TWF3RICI.js';
4
- import { resolveCredentials, getJson, WorkCommandError } from './chunk-FBTGMSQF.js';
5
- import { isLinkedRepository } from './chunk-CG36IONK.js';
3
+ import { checkStarterFiles, contextIsGoverned, checkBuildSkill } from './chunk-VSUXCMMH.js';
4
+ import { resolveCredentials, getJson, WorkCommandError } from './chunk-2HT2XGJX.js';
5
+ import { isLinkedRepository } from './chunk-JRCSET55.js';
6
6
  import { sanitizeTerminal } from './chunk-G3IJ3N6F.js';
7
- import { sanitizeForContext, spoolDir, assessSyncHealth, readSyncStatus, SYNC_STALE_AFTER_MS, formatAgo, checkInstalledCliStaleness, workspaceRootOf, hookFiredMarkerPath, refreshCommand } from './chunk-PSN33ERW.js';
8
- import { readStatuslineState, STATE_FRESH_MS } from './chunk-DSF2FWAZ.js';
9
- import { resolveRepoIdentity, compareVersions, SUPPORTED_VERSIONS } from './chunk-QNLX477Q.js';
10
- import { C } from './chunk-ANPNT6PM.js';
11
- import { readSettings, settingsPath, isOurStatuslineSlot, statuslineWrappedOriginal, REGISTERED_EVENTS, isOurHookCommand, ourCommandBins, cliBinResolvable, ourDirectScriptBins, wrappedOriginalCommand } from './chunk-5QRP3MVS.js';
12
- import { checkFormerSkillNames } from './chunk-7UWVLZXD.js';
13
- import { defaultFetch } from './chunk-FVMYKL6L.js';
7
+ import { checkFormerSkillNames } from './chunk-USWVXQIH.js';
8
+ import { defaultFetch } from './chunk-VWLOQ6FI.js';
14
9
  import { resolveGatewayCredentials } from './chunk-NTRCK4NH.js';
10
+ import { sanitizeForContext, spoolDir, assessSyncHealth, readSyncStatus, SYNC_STALE_AFTER_MS, formatAgo, checkInstalledCliStaleness, workspaceRootOf, hookFiredMarkerPath, refreshCommand } from './chunk-6IO62VJS.js';
11
+ import { readStatuslineState, STATE_FRESH_MS } from './chunk-IZSVXRDR.js';
12
+ import { hookCommandEscapesControlPlane, CONTROL_PLANE_DIR_VARIABLE } from './chunk-HCVLP7XA.js';
15
13
  import { findGitDirs } from './chunk-BJ3KTMDH.js';
16
- import { hookCommandEscapesControlPlane, CONTROL_PLANE_DIR_VARIABLE } from './chunk-G2YNJIGF.js';
14
+ import { resolveRepoIdentity, compareVersions, SUPPORTED_VERSIONS } from './chunk-AEKSX4EY.js';
15
+ import { C } from './chunk-ANPNT6PM.js';
17
16
  import { cliInvocation } from './chunk-CRB3POP4.js';
17
+ import { readSettings, settingsPath, isOurStatuslineSlot, statuslineWrappedOriginal, REGISTERED_EVENTS, isOurHookCommand, ourCommandBins, cliBinResolvable, ourDirectScriptBins, wrappedOriginalCommand } from './chunk-5QRP3MVS.js';
18
18
  import { readDeliveryRecord, readDegraded, readSourceCache } from './chunk-YQR6E6OV.js';
19
19
  import { deadHooksState, preparePackageManagerCommand } from './chunk-TUSYOL2O.js';
20
20
  import { homeFromEnv } from './chunk-VNVZDWO3.js';
@@ -192,6 +192,7 @@ function runDoctor(env = {}) {
192
192
  ...checkInstalls(env),
193
193
  ...starter?.checks ?? [],
194
194
  ...laptop ? checkRenamedSkills(env.cwd) : [],
195
+ ...checkBuildSkillState(env.cwd),
195
196
  ...starter !== void 0 && !starter.mcpOutdated ? checkMcpCommand(env.cwd, env.processEnv) : [],
196
197
  ...checkContextSource(env.cwd),
197
198
  ...checkGovernsList(env.cwd),
@@ -204,6 +205,11 @@ function checkRenamedSkills(cwd) {
204
205
  if (dirs === void 0 || contextIsGoverned(dirs.gitCommonDir)) return [];
205
206
  return checkFormerSkillNames(dirs.repoRoot);
206
207
  }
208
+ function checkBuildSkillState(cwd) {
209
+ const dirs = findGitDirs(cwd ?? process.cwd());
210
+ if (dirs === void 0 || contextIsGoverned(dirs.gitCommonDir)) return [];
211
+ return checkBuildSkill(dirs.repoRoot);
212
+ }
207
213
  function checkInstalledCli(home, cwd) {
208
214
  const name = "Installed CLI";
209
215
  const result = checkInstalledCliStaleness({ home, cwd });
@@ -773,7 +779,7 @@ function checkContextSource(cwd) {
773
779
  const governed = readSourceCache(gitCommonDir)?.status === "governed";
774
780
  if (!governed && delivery === void 0 && !degraded) return [];
775
781
  const checks = [];
776
- const name = "Context source";
782
+ const name = "Control plane";
777
783
  if (delivery !== void 0 && existsSync(delivery.dir)) {
778
784
  checks.push({ name, status: degraded ? "warn" : "pass", detail: `control plane delivered at ${delivery.sha.slice(0, 7)}` });
779
785
  } else if (governed) {
@@ -786,7 +792,7 @@ function checkContextSource(cwd) {
786
792
  }
787
793
  if (degraded) {
788
794
  checks.push({
789
- name: "Context source degradation",
795
+ name: "Control plane degradation",
790
796
  status: degraded.kind === "conflict" ? "fail" : "warn",
791
797
  detail: degraded.message,
792
798
  fix: contextDegradedFix(degraded.kind)
@@ -1169,7 +1175,7 @@ function doctorExitCode(checks) {
1169
1175
 
1170
1176
  // src/doctor-report.ts
1171
1177
  async function gatherDoctorChecks() {
1172
- const { defaultRunnerConfigPath, hasRunnerBlock, loadRunnerConfig, runnerVmOf } = await import('./config-CLSGABD5.js');
1178
+ const { defaultRunnerConfigPath, hasRunnerBlock, loadRunnerConfig, runnerVmOf } = await import('./config-7Q52COZ3.js');
1173
1179
  const configPath = defaultRunnerConfigPath();
1174
1180
  const checks = runDoctor({ runnerHost: hasRunnerBlock(configPath) });
1175
1181
  const credential = await credentialChecks();
@@ -1181,7 +1187,7 @@ async function gatherDoctorChecks() {
1181
1187
  const { runnerVmCheck } = await import('./doctor-53F2PYY7.js');
1182
1188
  checks.push(runnerVmCheck(configPath, { lima: realLima(), home: homeFromEnv(), instance: runnerVm.instance }));
1183
1189
  } else if (hasRunnerBlock(configPath)) {
1184
- const { runnerHostChecks } = await import('./doctor-DHUM5DBB.js');
1190
+ const { runnerHostChecks } = await import('./doctor-3SQGZVYP.js');
1185
1191
  const hooks = (() => {
1186
1192
  try {
1187
1193
  return loadRunnerConfig(configPath).hooks;
@@ -1216,7 +1222,7 @@ async function gatherDoctorChecks() {
1216
1222
  const { existsSync: existsSync3 } = await import('fs');
1217
1223
  if (process.platform !== "linux" || !existsSync3("/run/systemd/system")) return void 0;
1218
1224
  const { inspectService, realInspectProbes } = await import('./inspect-6UYAAXH7.js');
1219
- const { DEFAULT_UNIT_NAME } = await import('./install-4SEFIIW2.js');
1225
+ const { DEFAULT_UNIT_NAME } = await import('./install-CZUIW2AF.js');
1220
1226
  const { dirname: dirname2 } = await import('path');
1221
1227
  return inspectService(DEFAULT_UNIT_NAME, dirname2(configPath), realInspectProbes());
1222
1228
  })();
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { runnerDir, RUNNER_DIR_MODE, RUNNER_FILE_MODE } from './chunk-N2PXGQRL.js';
3
+ import { runnerDir, RUNNER_DIR_MODE, RUNNER_FILE_MODE } from './chunk-KIGSGZBB.js';
4
4
  import { readlinkSync, realpathSync, mkdirSync, unlinkSync, symlinkSync, renameSync, readFileSync, writeFileSync, rmSync, existsSync, readdirSync } from 'fs';
5
5
  import { join, basename, sep, resolve } from 'path';
6
6
 
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { hasStoredCredential, AGENT_COMMANDS, storeClaudeCredential, credentialFromStdin, isAgentName } from './chunk-7YP7T6GV.js';
4
- import { detectMachine, supportsContainerBuilds, reachDockerStep, describeMachineDocker, supportsMicroVmBuilds } from './chunk-LW7G5TJB.js';
5
- import { MIN_ENGINE_MAJOR } from './chunk-3ZR7Y23Y.js';
6
- import { runnerCredentialProblem } from './chunk-P53VEAOF.js';
7
- import { runnerDir, RUNNER_DIR_MODE, RUNNER_FILE_MODE } from './chunk-N2PXGQRL.js';
3
+ import { hasStoredCredential, AGENT_COMMANDS, storeClaudeCredential, credentialFromStdin, isAgentName } from './chunk-7V7KG3YM.js';
4
+ import { detectMachine, supportsContainerBuilds, reachDockerStep, describeMachineDocker, supportsMicroVmBuilds } from './chunk-EXV37PKS.js';
5
+ import { MIN_ENGINE_MAJOR } from './chunk-VX74ND77.js';
6
+ import { runnerCredentialProblem } from './chunk-2CMJLYV6.js';
7
+ import { runnerDir, RUNNER_DIR_MODE, RUNNER_FILE_MODE } from './chunk-KIGSGZBB.js';
8
8
  import { existsSync, readFileSync, mkdirSync, writeFileSync } from 'fs';
9
9
  import { dirname } from 'path';
10
10
 
@@ -8,8 +8,10 @@ import { fileURLToPath } from 'url';
8
8
 
9
9
  createRequire(import.meta.url);
10
10
  var TEMPLATE_SKILLS = ["spec", "writing-specs", "writing-tests", "build"];
11
- var MAINTAINED_SKILLS = ["outerlayer-evidence", "outerlayer-amend", "outerlayer-findings", "outerlayer-cli"];
12
- var TEMPLATE_CLASS_LINE = "<!-- yours to edit. Copied once from the default template by outerlayer init; never overwritten. -->";
11
+ var MAINTAINED_SKILLS = ["outerlayer-evidence", "outerlayer-amend", "outerlayer-findings", "outerlayer-cli", "outerlayer-build"];
12
+ function templateClassLine(version) {
13
+ return `<!-- yours to edit. Copied once from the default template by outerlayer init ${version}; never overwritten. -->`;
14
+ }
13
15
  function maintainedClassLine(version) {
14
16
  return `<!-- maintained by OuterLayer ${version}. Edits are overwritten on the next outerlayer context emit. -->`;
15
17
  }
@@ -20,7 +22,7 @@ function skillDir(skill) {
20
22
  return `.outerlayer/skills/${skill}`;
21
23
  }
22
24
  function renderSkillFile(skillClass, content, version) {
23
- const line = skillClass === "maintained" ? maintainedClassLine(version) : TEMPLATE_CLASS_LINE;
25
+ const line = skillClass === "maintained" ? maintainedClassLine(version) : templateClassLine(version);
24
26
  const { frontmatterInner, body } = splitRawFile(content);
25
27
  if (frontmatterInner === null) return `${line}
26
28
  ${content}`;
@@ -77,7 +79,29 @@ function writeMaintainedFiles(repoRoot, files) {
77
79
  return { created, rewritten };
78
80
  }
79
81
  function maintainedFilesForExistingSkills(repoRoot, files) {
80
- return files.filter((file) => existsSync(join(repoRoot, skillDir(file.skill))) || formerNameExists(repoRoot, file.skill));
82
+ return files.filter(
83
+ (file) => existsSync(join(repoRoot, skillDir(file.skill))) || formerNameExists(repoRoot, file.skill) || requiredByBuild(repoRoot, file.skill)
84
+ );
85
+ }
86
+ function namesCore(text) {
87
+ return text.includes("outerlayer-build");
88
+ }
89
+ function requiredByBuild(repoRoot, skill) {
90
+ if (skill !== "outerlayer-build") return false;
91
+ const named = (file) => {
92
+ try {
93
+ return namesCore(readFileSync(file, "utf8"));
94
+ } catch {
95
+ return false;
96
+ }
97
+ };
98
+ if (named(join(repoRoot, skillDir("build"), "SKILL.md"))) return true;
99
+ const dir = join(repoRoot, ".outerlayer", "validators");
100
+ try {
101
+ return readdirSync(dir).some((name) => name.endsWith(".yaml") && named(join(dir, name)));
102
+ } catch {
103
+ return false;
104
+ }
81
105
  }
82
106
  var FORMER_MAINTAINED_NAMES = {
83
107
  amend: "outerlayer-amend",
@@ -97,4 +121,4 @@ function formerNameExists(repoRoot, skill) {
97
121
  return Object.entries(FORMER_MAINTAINED_NAMES).some(([former, current]) => current === skill && isMaintainedCopy(repoRoot, former));
98
122
  }
99
123
 
100
- export { FORMER_MAINTAINED_NAMES, MAINTAINED_SKILLS, TEMPLATE_SKILLS, isMaintainedCopy, loadMaintainedFiles, loadTemplateFiles, maintainedFilesForExistingSkills, resolvePackRoot, skillDir, writeMaintainedFiles };
124
+ export { FORMER_MAINTAINED_NAMES, MAINTAINED_SKILLS, TEMPLATE_SKILLS, isMaintainedCopy, loadMaintainedFiles, loadTemplateFiles, maintainedFilesForExistingSkills, namesCore, resolvePackRoot, skillDir, writeMaintainedFiles };
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
3
  import { appendContextProvenance } from './chunk-ZJSNLVCE.js';
4
+ import { CONTROL_PLANE_DIR_VARIABLE } from './chunk-HCVLP7XA.js';
4
5
  import { readRepoConnection, findGitDirs } from './chunk-BJ3KTMDH.js';
5
- import { CONTROL_PLANE_DIR_VARIABLE } from './chunk-G2YNJIGF.js';
6
6
  import { cliInvocation } from './chunk-CRB3POP4.js';
7
7
  import { deadHooksState, huskyPrepareScript, preparePackageManagerCommand } from './chunk-TUSYOL2O.js';
8
8
  import { homeFromEnv } from './chunk-VNVZDWO3.js';
@@ -624,11 +624,11 @@ async function missingControlPlane(cwd, sessionId, home, env) {
624
624
  const dirs = findGitDirs(cwd);
625
625
  if (dirs === void 0) return void 0;
626
626
  if (existsSync(join(dirs.gitCommonDir, "outerlayer", "materialized.json")) || hasExcludeBlock(dirs.gitCommonDir)) {
627
- const { cleanupEarlierCopies } = await import('./context-cleanup-CHEWNYU6.js');
627
+ const { cleanupEarlierCopies } = await import('./context-cleanup-DSA3HGQU.js');
628
628
  cleanupEarlierCopies(dirs);
629
629
  }
630
630
  if (!contextPossiblyGoverned(cwd, home)) return void 0;
631
- const { governanceOf } = await import('./control-plane-launch-34LNRJWR.js');
631
+ const { governanceOf } = await import('./control-plane-launch-SZTE4TUS.js');
632
632
  if (await governanceOf({ cwd, env, home }) !== "governed") return void 0;
633
633
  recordMissingContext(dirs, sessionId, home);
634
634
  const launcher = `${cliInvocation()} claude`;
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { DEFAULT_UNIT_NAME } from './chunk-QEFKA2QD.js';
3
+ import { DEFAULT_UNIT_NAME } from './chunk-I66MQDXH.js';
4
4
  import { parseRunnerEnv } from './chunk-6MZSX4M7.js';
5
- import { RUNNER_FILE_MODE } from './chunk-N2PXGQRL.js';
5
+ import { RUNNER_FILE_MODE } from './chunk-KIGSGZBB.js';
6
6
  import { existsSync, readFileSync, writeFileSync, renameSync, rmSync } from 'fs';
7
7
  import { join, dirname } from 'path';
8
8