@outerlayer/cli 0.20.0 → 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 +26 -0
  2. package/README.md +15 -5
  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-BR5D27CX.js → check-3YHMJQ3P.js} +48 -50
  9. package/dist/{chunk-AD3EYI7P.js → chunk-22DYXLU7.js} +259 -56
  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-ZX4I2MEK.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-MKF7TU7X.js → cli-NMGVZQPB.js} +161 -120
  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-UNMWHOUY.js → emit-criteria-cmd-MQZE7W4Y.js} +13 -12
  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-DRQCHCOK.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-CRDHXQVW.js → work-stop-cmd-WR7ESS4Z.js} +13 -12
  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-EAZQMAE2.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
@@ -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