@outerlayer/cli 0.28.3 → 0.29.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 (127) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/{agent-setup-IDF3EXM4.js → agent-setup-S3KI7TER.js} +14 -14
  3. package/dist/{artifact-link-cmd-LEI6EOZE.js → artifact-link-cmd-LIJEXVN5.js} +2 -2
  4. package/dist/{bridge-JN3VJ23L.js → bridge-CP25XV3W.js} +2 -2
  5. package/dist/{build-JCYOHPLL.js → build-ZS4Y5MJU.js} +4 -4
  6. package/dist/build-info.json +1 -1
  7. package/dist/{builder-HCTVP2O7.js → builder-FDUOMHY3.js} +6 -6
  8. package/dist/{check-F2TJCQ7S.js → check-5XB22HKS.js} +42 -41
  9. package/dist/{chunk-6NFXOQKZ.js → chunk-23PFIW35.js} +1 -1
  10. package/dist/{chunk-SATUCMAJ.js → chunk-25Z6SBMQ.js} +2 -2
  11. package/dist/{chunk-W7BH5YN6.js → chunk-2KOXAMMB.js} +39 -28
  12. package/dist/{chunk-EPGMCEVP.js → chunk-2YLKMVFV.js} +2 -2
  13. package/dist/{chunk-QBF462QH.js → chunk-3KMYWLMK.js} +1 -1
  14. package/dist/{chunk-5B7BEQPR.js → chunk-427AVP6J.js} +2 -2
  15. package/dist/{chunk-VWFOKRYS.js → chunk-42TFWHFF.js} +1 -1
  16. package/dist/{chunk-X7SFJZIG.js → chunk-6AG2XW5S.js} +29 -10
  17. package/dist/{chunk-BUP5N3X6.js → chunk-6XQPCQBW.js} +1 -1
  18. package/dist/{chunk-WL3QF3QF.js → chunk-77YT7YC4.js} +18 -16
  19. package/dist/{chunk-EZ3DZXUH.js → chunk-7H7RUQCZ.js} +3 -3
  20. package/dist/{chunk-LRFU6RPD.js → chunk-A2E7MU2H.js} +55 -47
  21. package/dist/{chunk-MFI55TNI.js → chunk-BFA2LNJG.js} +22 -6
  22. package/dist/{chunk-N5EEEKT6.js → chunk-C7F6U2YZ.js} +3 -2
  23. package/dist/{chunk-M6NNXKRM.js → chunk-CU7TJL6S.js} +1 -1
  24. package/dist/{chunk-T7LJ6AIC.js → chunk-D3D2CERC.js} +5 -5
  25. package/dist/{chunk-RKOTJQVG.js → chunk-DXI6A6JN.js} +10 -4
  26. package/dist/{chunk-KJIUFOC4.js → chunk-F72ABZRD.js} +1 -1
  27. package/dist/{chunk-UXLLWIA2.js → chunk-FA6XWYRH.js} +7 -7
  28. package/dist/{chunk-P2RWZCV7.js → chunk-FUGRIAG7.js} +2 -2
  29. package/dist/{chunk-JYVBEWBC.js → chunk-GG3WS4C5.js} +3 -3
  30. package/dist/{chunk-O47BTZSN.js → chunk-GI73HOI2.js} +1 -1
  31. package/dist/{chunk-2BZTGJII.js → chunk-GJJDPZS2.js} +7 -7
  32. package/dist/{chunk-QKXF7CLR.js → chunk-GJOF6357.js} +4 -4
  33. package/dist/{chunk-TG7FAHRP.js → chunk-H6DGJBXG.js} +5 -5
  34. package/dist/{chunk-QFNFBQCG.js → chunk-HRWL7NSJ.js} +5 -5
  35. package/dist/chunk-I3LTIAOR.js +11 -0
  36. package/dist/{chunk-OOUHNKKX.js → chunk-IG45QISA.js} +2 -2
  37. package/dist/{chunk-AV5MJY45.js → chunk-IGEJUPDE.js} +3 -3
  38. package/dist/{chunk-QZBXLLTV.js → chunk-JL6VZHAJ.js} +38 -1
  39. package/dist/{chunk-RXFKXZJS.js → chunk-KBIJZAH4.js} +1 -1
  40. package/dist/{chunk-UHU7H57K.js → chunk-LKN4J37L.js} +151 -34
  41. package/dist/{chunk-ILU6664L.js → chunk-M4QY7YZ5.js} +360 -74
  42. package/dist/{chunk-4SJ57DH7.js → chunk-MO2NI6W6.js} +35 -27
  43. package/dist/{chunk-HWOU2HDH.js → chunk-MX3PPJNS.js} +1 -1
  44. package/dist/{chunk-ITAIEJ2T.js → chunk-MZJAIRXM.js} +4 -4
  45. package/dist/{chunk-YYGXCRIW.js → chunk-NAHTO4XM.js} +1 -1
  46. package/dist/{chunk-JGML2VUN.js → chunk-NX2G6PH6.js} +1 -1
  47. package/dist/{chunk-OO6OADZN.js → chunk-OD6WUNKZ.js} +3 -3
  48. package/dist/{chunk-DSKOHPXN.js → chunk-OKAJSYZ2.js} +1 -1
  49. package/dist/{chunk-DWVAG73B.js → chunk-PAHZQQB3.js} +1 -1
  50. package/dist/{chunk-NMIYK2G2.js → chunk-PGA5BVHQ.js} +3 -3
  51. package/dist/{chunk-YTR435DO.js → chunk-PP7C7JQO.js} +3 -3
  52. package/dist/{chunk-DQYMQ47E.js → chunk-S2Q65ZOT.js} +1 -1
  53. package/dist/{chunk-R7TMTFJP.js → chunk-SHVE5JZO.js} +1 -1
  54. package/dist/{chunk-JZJLKTZT.js → chunk-SN3C57RV.js} +5 -5
  55. package/dist/{chunk-TOHKSZKI.js → chunk-TZGQQY7Y.js} +7 -7
  56. package/dist/{chunk-VM6BX2WJ.js → chunk-UPKFSNSU.js} +5 -5
  57. package/dist/{chunk-TCBVV2JK.js → chunk-V47KJGNE.js} +3 -3
  58. package/dist/{chunk-NKD5BNRX.js → chunk-VT3BKV5D.js} +3 -3
  59. package/dist/{chunk-HOU33DW5.js → chunk-VY4YVFL5.js} +1 -1
  60. package/dist/{chunk-SVODOMYC.js → chunk-WEMNLTWB.js} +7 -7
  61. package/dist/{chunk-DIQN5SEL.js → chunk-YSH4KCUJ.js} +1 -1
  62. package/dist/{claude-launcher-LVYZ4YJI.js → claude-launcher-SHIQTBS6.js} +5 -5
  63. package/dist/{cli-5LLFR2SX.js → cli-EN2WGVM6.js} +126 -120
  64. package/dist/{command-YXOMIXOJ.js → command-2VFWA2RF.js} +30 -30
  65. package/dist/{config-TNV5HHLO.js → config-HJQ4YE57.js} +2 -2
  66. package/dist/{connect-cmd-43IWARIV.js → connect-cmd-T6IAT5FT.js} +12 -12
  67. package/dist/{container-start-YG45GLFE.js → container-start-C5ZCXXMF.js} +29 -29
  68. package/dist/{context-cleanup-LTH77FC3.js → context-cleanup-MV3X6NSF.js} +3 -3
  69. package/dist/{control-plane-launch-TIK265OT.js → control-plane-launch-5FZ6LJOC.js} +10 -10
  70. package/dist/{dist-JFVKLUHL.js → dist-H5IYGH3T.js} +2 -2
  71. package/dist/{docker-2IIRBQAB.js → docker-RFN6UWTT.js} +6 -6
  72. package/dist/{doctor-3SRHLRF5.js → doctor-VXDBXKSL.js} +32 -32
  73. package/dist/{emit-artifact-cmd-RM2X3PBJ.js → emit-artifact-cmd-M52RLUBU.js} +16 -16
  74. package/dist/{emit-cmd-QUABLVO6.js → emit-cmd-HTNETHAE.js} +6 -6
  75. package/dist/{emit-criteria-cmd-ZUI7DFND.js → emit-criteria-cmd-APDCA6FK.js} +13 -13
  76. package/dist/{emit-finding-cmd-W2FU4CCF.js → emit-finding-cmd-XEX5XVVI.js} +13 -13
  77. package/dist/{emit-result-cmd-JINMQ7QG.js → emit-result-cmd-HFC3WDWB.js} +52 -25
  78. package/dist/{emit-step-cmd-7FZWQTV3.js → emit-step-cmd-LTRPF2YX.js} +14 -14
  79. package/dist/{exec-client-6ZJJ4KVH.js → exec-client-GHFNXOY6.js} +3 -3
  80. package/dist/{fleet-readiness-3A67MUAU.js → fleet-readiness-SJA7NFR2.js} +12 -12
  81. package/dist/{governing-source-KQMKM5CI.js → governing-source-PBYOKKAJ.js} +17 -17
  82. package/dist/{guest-init-A4HHI2UR.js → guest-init-MQRIALWR.js} +4 -4
  83. package/dist/{hook-fast-UJPAWDAO.js → hook-fast-JKYCVO4R.js} +1 -1
  84. package/dist/{host-key-NGRCMJZ7.js → host-key-DBYH3RTZ.js} +3 -3
  85. package/dist/{image-tag-TEOKZVD5.js → image-tag-XNODAHAW.js} +3 -3
  86. package/dist/index.js +4 -4
  87. package/dist/{init-XP55Q4ZT.js → init-JJPJ2XLL.js} +29 -29
  88. package/dist/{init-HQW3LHIF.js → init-ZUMSDYMW.js} +29 -29
  89. package/dist/{init-cmd-XSOVMNNE.js → init-cmd-342RW7DZ.js} +22 -22
  90. package/dist/{init-update-MZ4IRFC7.js → init-update-4MCW5W72.js} +21 -21
  91. package/dist/{install-NPTR35MG.js → install-GODA5G7U.js} +4 -4
  92. package/dist/{install-cmd-4PXPAFQX.js → install-cmd-YNQ5DCZP.js} +5 -5
  93. package/dist/{layout-BBTQPS6V.js → layout-DBAL2HTQ.js} +4 -4
  94. package/dist/{login-browser-WSOSQH2T.js → login-browser-B6E4GNIF.js} +2 -2
  95. package/dist/{logs-Z4L4I3OR.js → logs-KAG3MAUO.js} +2 -2
  96. package/dist/loop-ZXJFOVCS.js +81 -0
  97. package/dist/{machine-ATDPHWL5.js → machine-F3TVUBZY.js} +25 -25
  98. package/dist/{machine-skills-O7W6NMWB.js → machine-skills-6MLTVBCF.js} +4 -4
  99. package/dist/{mcp-serve-cmd-NQM2WDYI.js → mcp-serve-cmd-SGISNCB3.js} +4 -4
  100. package/dist/{paths-2VSGK6E2.js → paths-PG4JNLZG.js} +2 -2
  101. package/dist/{pending-SFZ2AYSK.js → pending-GG252ERT.js} +3 -3
  102. package/dist/{pidfile-3FT5OLUE.js → pidfile-7SYDMT2O.js} +3 -3
  103. package/dist/{record-7SSRLSI2.js → record-ZGUOOYJH.js} +3 -3
  104. package/dist/{runner-env-2Z2DVSUJ.js → runner-env-WI6LKWIU.js} +5 -5
  105. package/dist/{runner-identity-B37HHOZR.js → runner-identity-JIC54L5Q.js} +6 -6
  106. package/dist/{runner-key-SICUOQY5.js → runner-key-RXCKMQRL.js} +29 -29
  107. package/dist/{session-sender-7MSVJZ6Q.js → session-sender-JAAMA5E6.js} +17 -17
  108. package/dist/{spec-cmd-KAQ7MX4O.js → spec-cmd-BUFLEQ6L.js} +14 -14
  109. package/dist/{starter-pack-5SOT5V4I.js → starter-pack-I5W5JAYT.js} +5 -5
  110. package/dist/{status-AI22UPKC.js → status-E7V365CD.js} +33 -32
  111. package/dist/{sync-cmd-7K3WVQKO.js → sync-cmd-U5FUBXJY.js} +16 -16
  112. package/dist/{watch-NCYESLO2.js → watch-AOPZJOUM.js} +16 -16
  113. package/dist/{work-claim-cmd-IOUEHYIY.js → work-claim-cmd-Z2UZD37I.js} +17 -17
  114. package/dist/{work-cmd-FOI74X5B.js → work-cmd-XLVQDNTC.js} +14 -14
  115. package/dist/{work-comment-cmd-3C44H4CG.js → work-comment-cmd-THLQUSMH.js} +14 -14
  116. package/dist/{work-logs-cmd-YGAWCX3X.js → work-logs-cmd-2NFG6ZY6.js} +14 -14
  117. package/dist/{work-open-pr-cmd-HUG5HAVC.js → work-open-pr-cmd-J22A2YCD.js} +15 -15
  118. package/dist/{work-pr-cmd-L2EDOYXH.js → work-pr-cmd-SYAENEH4.js} +14 -14
  119. package/dist/{work-stop-cmd-GGDVKC67.js → work-stop-cmd-FP453YCB.js} +14 -14
  120. package/package.json +1 -1
  121. package/skill-pack/maintained/outerlayer-amend/SKILL.md +40 -39
  122. package/skill-pack/maintained/outerlayer-build/SKILL.md +5 -9
  123. package/skill-pack/maintained/outerlayer-build/references/criteria-judge.md +15 -12
  124. package/skill-pack/maintained/outerlayer-build/references/release.md +11 -6
  125. package/skill-pack/shipped.json +1 -0
  126. package/skill-pack/validators/acceptance-criteria.yaml +7 -2
  127. package/dist/loop-QQBLJ7GN.js +0 -80
package/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # @outerlayer/cli
2
2
 
3
+ ## 0.29.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 8ed2acc: The host's criteria judge records one check item per criterion, with its result and reason, and judges again only the criteria whose tests changed. `outerlayer emit <name> --items <file>` sends check items from CI, a host command writes them to the file `OUTERLAYER_CHECK_ITEMS` names, and `outerlayer work status` lists the failing ones. A judge check can set `subjects: none` to judge the change with no criteria.
8
+
9
+ ### Patch Changes
10
+
11
+ - 3a2c7ea: A command in a microVM build that finishes at once no longer fails now and then with `write EPIPE` from the exec agent. The runner sends a command's request and its known input to the guest in one write.
12
+ - c6533fc: A runner reads past the first page of startable work, so a runner limited to some repositories finds their work however long the queue is. It takes work in the order the gateway lists it, which is now the order each build was asked for.
13
+ - 86d956d: The tracker adapters name an issue's labels `labels` instead of `tags`. The label names they read from GitHub, Linear and Jira are unchanged.
14
+
15
+ ## 0.28.4
16
+
17
+ ### Patch Changes
18
+
19
+ - eabcfe6: `outerlayer doctor` passes on a runner that uses a Runner key. It leaves out the Claude Code version and last-sync checks for builds in containers or microVMs. The runner no longer logs a failed relay join while the build's relay is still starting.
20
+ - 1cde310: A container build's finished connections free their place at once, so a large package install no longer runs out of connections and fails partway through.
21
+
3
22
  ## 0.28.3
4
23
 
5
24
  ### Patch Changes
@@ -1,30 +1,30 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { keepHandWritten, runAgentSetup } from './chunk-UXLLWIA2.js';
4
- import './chunk-QKXF7CLR.js';
3
+ export { keepHandWritten, runAgentSetup } from './chunk-FA6XWYRH.js';
4
+ import './chunk-GJOF6357.js';
5
5
  import './chunk-KT4CN6OU.js';
6
- import './chunk-SATUCMAJ.js';
7
- import './chunk-5B7BEQPR.js';
6
+ import './chunk-25Z6SBMQ.js';
7
+ import './chunk-427AVP6J.js';
8
8
  import './chunk-ANPNT6PM.js';
9
- import './chunk-TG7FAHRP.js';
10
- import './chunk-P2RWZCV7.js';
11
- import './chunk-KJIUFOC4.js';
9
+ import './chunk-H6DGJBXG.js';
10
+ import './chunk-FUGRIAG7.js';
11
+ import './chunk-F72ABZRD.js';
12
12
  import './chunk-PJDQPF5N.js';
13
- import './chunk-R7TMTFJP.js';
14
- import './chunk-DWVAG73B.js';
15
- import './chunk-N5EEEKT6.js';
13
+ import './chunk-SHVE5JZO.js';
14
+ import './chunk-PAHZQQB3.js';
15
+ import './chunk-C7F6U2YZ.js';
16
16
  import './chunk-ZJSNLVCE.js';
17
17
  import './chunk-BJ3KTMDH.js';
18
- import './chunk-JGML2VUN.js';
18
+ import './chunk-NX2G6PH6.js';
19
19
  import './chunk-5BHIBJDA.js';
20
20
  import './chunk-CDDED64E.js';
21
21
  import './chunk-RA3O54FC.js';
22
22
  import './chunk-CRB3POP4.js';
23
- import './chunk-VWFOKRYS.js';
23
+ import './chunk-42TFWHFF.js';
24
24
  import './chunk-YQR6E6OV.js';
25
25
  import './chunk-TUSYOL2O.js';
26
- import './chunk-RKOTJQVG.js';
27
- import './chunk-QZBXLLTV.js';
26
+ import './chunk-DXI6A6JN.js';
27
+ import './chunk-JL6VZHAJ.js';
28
28
  import './chunk-VNVZDWO3.js';
29
29
  import './chunk-XD4ZCMA4.js';
30
30
  import './chunk-MESOOLF4.js';
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { sanitizeTerminal, readEffectiveArtifactSpoolState } from './chunk-BUP5N3X6.js';
3
+ import { sanitizeTerminal, readEffectiveArtifactSpoolState } from './chunk-6XQPCQBW.js';
4
4
  import { cliInvocation } from './chunk-CRB3POP4.js';
5
- import './chunk-QZBXLLTV.js';
5
+ import './chunk-JL6VZHAJ.js';
6
6
  import { homeFromEnv } from './chunk-VNVZDWO3.js';
7
7
  import './chunk-Z5GEFMRW.js';
8
8
 
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { BRIDGE_ADDRESS, BRIDGE_CIDR, CONTAINER_NO_PROXY, CONTAINER_PROXY, TUNNEL_PORT, dockerClientConfig, startBridgeForward, writeDockerClientConfig } from './chunk-RXFKXZJS.js';
4
- import './chunk-N5EEEKT6.js';
3
+ export { BRIDGE_ADDRESS, BRIDGE_CIDR, CONTAINER_NO_PROXY, CONTAINER_PROXY, TUNNEL_PORT, dockerClientConfig, startBridgeForward, writeDockerClientConfig } from './chunk-KBIJZAH4.js';
4
+ import './chunk-C7F6U2YZ.js';
5
5
  import './chunk-XD4ZCMA4.js';
6
6
  import './chunk-MESOOLF4.js';
7
7
  import './chunk-Z5GEFMRW.js';
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { buildRepositoryImage } from './chunk-TCBVV2JK.js';
4
- import './chunk-M6NNXKRM.js';
3
+ export { buildRepositoryImage } from './chunk-V47KJGNE.js';
4
+ import './chunk-CU7TJL6S.js';
5
5
  import './chunk-JBJTC3UU.js';
6
6
  export { RecipeError } from './chunk-SJZL5F3F.js';
7
- import './chunk-DWVAG73B.js';
8
- import './chunk-N5EEEKT6.js';
7
+ import './chunk-PAHZQQB3.js';
8
+ import './chunk-C7F6U2YZ.js';
9
9
  import './chunk-XD4ZCMA4.js';
10
10
  import './chunk-MESOOLF4.js';
11
11
  import './chunk-Z5GEFMRW.js';
@@ -1 +1 @@
1
- {"id":"2026-10-17T16:34:27.736Z+686145e","root":"/home/runner/_work/outerlayer/outerlayer","pkg":"outerlayer"}
1
+ {"id":"2026-10-19T13:07:50.023Z+2340eef","root":"/home/runner/_work/outerlayer/outerlayer","pkg":"outerlayer"}
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { MIN_BUILDX_VERSION, builderName, builderSpec, buildxState, ensureBuilder, ensureFailureCount, isOutOfMemory, proxyEnvironment, trackImageBuild } from './chunk-MFI55TNI.js';
3
+ export { MIN_BUILDX_VERSION, builderName, builderSpec, buildxState, ensureBuilder, ensureFailureCount, isOutOfMemory, proxyEnvironment, trackImageBuild } from './chunk-BFA2LNJG.js';
4
4
  import './chunk-YJLHUKYS.js';
5
5
  import './chunk-SJZL5F3F.js';
6
- import './chunk-UHU7H57K.js';
7
- import './chunk-R7TMTFJP.js';
8
- import './chunk-DWVAG73B.js';
9
- import './chunk-N5EEEKT6.js';
10
- import './chunk-QZBXLLTV.js';
6
+ import './chunk-LKN4J37L.js';
7
+ import './chunk-SHVE5JZO.js';
8
+ import './chunk-PAHZQQB3.js';
9
+ import './chunk-C7F6U2YZ.js';
10
+ import './chunk-JL6VZHAJ.js';
11
11
  import './chunk-XD4ZCMA4.js';
12
12
  import './chunk-MESOOLF4.js';
13
13
  import './chunk-Z5GEFMRW.js';
@@ -1,66 +1,67 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { probeCredentials } from './chunk-LRFU6RPD.js';
4
- import './chunk-ILU6664L.js';
3
+ import { probeCredentials } from './chunk-A2E7MU2H.js';
4
+ import './chunk-M4QY7YZ5.js';
5
5
  import './chunk-3JVYMD4G.js';
6
6
  import './chunk-E7R2GIAW.js';
7
7
  import './chunk-TPKYTORP.js';
8
- import './chunk-HWOU2HDH.js';
8
+ import './chunk-MX3PPJNS.js';
9
9
  import './chunk-ZVB57WI6.js';
10
- import './chunk-QBF462QH.js';
11
- import './chunk-OO6OADZN.js';
12
- import './chunk-YTR435DO.js';
13
- import './chunk-2BZTGJII.js';
14
- import './chunk-VM6BX2WJ.js';
10
+ import './chunk-3KMYWLMK.js';
11
+ import './chunk-OD6WUNKZ.js';
12
+ import './chunk-I3LTIAOR.js';
13
+ import './chunk-PP7C7JQO.js';
14
+ import './chunk-GJJDPZS2.js';
15
+ import './chunk-UPKFSNSU.js';
15
16
  import './chunk-ESVW4MJY.js';
16
- import './chunk-RXFKXZJS.js';
17
- import { placeholderQueues, placeholderProblem, permissionModeProblems, permissionModeProblem, needsClaudeCredential, claudeCredentialCheck, claimPermissionProblem, formerSkillQueues, formerSkillProblem } from './chunk-SVODOMYC.js';
17
+ import './chunk-KBIJZAH4.js';
18
+ import { placeholderQueues, placeholderProblem, permissionModeProblems, permissionModeProblem, needsClaudeCredential, claudeCredentialCheck, claimPermissionProblem, formerSkillQueues, formerSkillProblem } from './chunk-WEMNLTWB.js';
18
19
  import './chunk-YYYRBYWG.js';
19
- import './chunk-6NFXOQKZ.js';
20
+ import './chunk-23PFIW35.js';
20
21
  import './chunk-TBT347UY.js';
21
- import './chunk-T7LJ6AIC.js';
22
- import './chunk-EPGMCEVP.js';
23
- import './chunk-4SJ57DH7.js';
24
- import './chunk-WL3QF3QF.js';
25
- import './chunk-DIQN5SEL.js';
26
- import './chunk-JZJLKTZT.js';
27
- import './chunk-O47BTZSN.js';
22
+ import './chunk-D3D2CERC.js';
23
+ import './chunk-2YLKMVFV.js';
24
+ import './chunk-MO2NI6W6.js';
25
+ import './chunk-77YT7YC4.js';
26
+ import './chunk-YSH4KCUJ.js';
27
+ import './chunk-SN3C57RV.js';
28
+ import './chunk-GI73HOI2.js';
28
29
  import './chunk-TQMI335S.js';
29
- import './chunk-AV5MJY45.js';
30
- import './chunk-JYVBEWBC.js';
31
- import { loadRunnerConfig, RunnerConfigError, checkHooks } from './chunk-YYGXCRIW.js';
30
+ import './chunk-IGEJUPDE.js';
31
+ import './chunk-GG3WS4C5.js';
32
+ import { loadRunnerConfig, RunnerConfigError, checkHooks } from './chunk-NAHTO4XM.js';
32
33
  import './chunk-UXYLWVTQ.js';
33
- import './chunk-TCBVV2JK.js';
34
- import './chunk-M6NNXKRM.js';
34
+ import './chunk-V47KJGNE.js';
35
+ import './chunk-CU7TJL6S.js';
35
36
  import './chunk-JBJTC3UU.js';
36
37
  import './chunk-OGFGZQA3.js';
37
- import './chunk-MFI55TNI.js';
38
+ import './chunk-BFA2LNJG.js';
38
39
  import './chunk-YJLHUKYS.js';
39
40
  import './chunk-SJZL5F3F.js';
40
- import './chunk-X7SFJZIG.js';
41
- import './chunk-NMIYK2G2.js';
42
- import './chunk-QFNFBQCG.js';
43
- import './chunk-BUP5N3X6.js';
44
- import './chunk-UHU7H57K.js';
45
- import './chunk-5B7BEQPR.js';
46
- import './chunk-HOU33DW5.js';
41
+ import './chunk-6AG2XW5S.js';
42
+ import './chunk-PGA5BVHQ.js';
43
+ import './chunk-HRWL7NSJ.js';
44
+ import './chunk-6XQPCQBW.js';
45
+ import './chunk-LKN4J37L.js';
46
+ import './chunk-427AVP6J.js';
47
+ import './chunk-VY4YVFL5.js';
47
48
  import './chunk-G2JWZDFA.js';
48
49
  import './chunk-ANPNT6PM.js';
49
- import './chunk-TG7FAHRP.js';
50
- import './chunk-P2RWZCV7.js';
51
- import './chunk-KJIUFOC4.js';
50
+ import './chunk-H6DGJBXG.js';
51
+ import './chunk-FUGRIAG7.js';
52
+ import './chunk-F72ABZRD.js';
52
53
  import './chunk-PJDQPF5N.js';
53
- import './chunk-R7TMTFJP.js';
54
- import './chunk-DWVAG73B.js';
55
- import { claudeEnvPath } from './chunk-N5EEEKT6.js';
56
- import './chunk-OOUHNKKX.js';
54
+ import './chunk-SHVE5JZO.js';
55
+ import './chunk-PAHZQQB3.js';
56
+ import { claudeEnvPath } from './chunk-C7F6U2YZ.js';
57
+ import './chunk-IG45QISA.js';
57
58
  import './chunk-ZJSNLVCE.js';
58
59
  import './chunk-2O5KA67H.js';
59
60
  import './chunk-BKO6JEZI.js';
60
61
  import './chunk-FGF52V4V.js';
61
62
  import './chunk-HCVLP7XA.js';
62
63
  import './chunk-BJ3KTMDH.js';
63
- import './chunk-JGML2VUN.js';
64
+ import './chunk-NX2G6PH6.js';
64
65
  import './chunk-5BHIBJDA.js';
65
66
  import './chunk-CDDED64E.js';
66
67
  import './chunk-RA3O54FC.js';
@@ -70,8 +71,8 @@ import './chunk-CRB3POP4.js';
70
71
  import './chunk-URIZRCRY.js';
71
72
  import './chunk-YQR6E6OV.js';
72
73
  import './chunk-TUSYOL2O.js';
73
- import './chunk-RKOTJQVG.js';
74
- import './chunk-QZBXLLTV.js';
74
+ import './chunk-DXI6A6JN.js';
75
+ import './chunk-JL6VZHAJ.js';
75
76
  import './chunk-VNVZDWO3.js';
76
77
  import { parseRunnerEnv } from './chunk-XD4ZCMA4.js';
77
78
  import './chunk-MESOOLF4.js';
@@ -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-DWVAG73B.js';
3
+ import { runnerDir, RUNNER_DIR_MODE, RUNNER_FILE_MODE } from './chunk-PAHZQQB3.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,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
3
  import { C } from './chunk-ANPNT6PM.js';
4
- import { resolvePackRoot, OUTERLAYER_SKILLS_BASE, loadTemplateFiles, AGENTS_SKILLS_BASE, loadMaintainedFiles, rewriteSkillPaths, TEMPLATE_SKILLS, skillDir, writeMaintainedFiles, MACHINE_SKILL_PATH } from './chunk-JGML2VUN.js';
4
+ import { resolvePackRoot, OUTERLAYER_SKILLS_BASE, loadTemplateFiles, AGENTS_SKILLS_BASE, loadMaintainedFiles, rewriteSkillPaths, TEMPLATE_SKILLS, skillDir, writeMaintainedFiles, MACHINE_SKILL_PATH } from './chunk-NX2G6PH6.js';
5
5
  import { MAINTAINED_SKILLS } from './chunk-CDDED64E.js';
6
6
  import { resolvePackageVersion } from './chunk-RA3O54FC.js';
7
7
  import { cliInvocation } from './chunk-CRB3POP4.js';
8
- import { linkedAgentsPath } from './chunk-VWFOKRYS.js';
8
+ import { linkedAgentsPath } from './chunk-42TFWHFF.js';
9
9
  import { readFileSync, existsSync, mkdirSync, writeFileSync } from 'fs';
10
10
  import { join, dirname } from 'path';
11
11
 
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { checkStarterFiles, contextIsGoverned } from './chunk-ITAIEJ2T.js';
4
- import { fleetCheck, checkBuildSkill, checkMachineSkills, checkCommittedMaintainedSkills, checkMaintainedReferences } from './chunk-TOHKSZKI.js';
5
- import { resolveCredentials, getJson, WorkCommandError } from './chunk-X7SFJZIG.js';
6
- import { isLinkedRepository } from './chunk-QFNFBQCG.js';
7
- import { sanitizeTerminal } from './chunk-BUP5N3X6.js';
8
- import { resolveRepoIdentity, compareVersions, SUPPORTED_VERSIONS } from './chunk-UHU7H57K.js';
3
+ import { checkStarterFiles, contextIsGoverned } from './chunk-MZJAIRXM.js';
4
+ import { fleetCheck, checkBuildSkill, checkMachineSkills, checkCommittedMaintainedSkills, checkMaintainedReferences } from './chunk-TZGQQY7Y.js';
5
+ import { resolveCredentials, getJson, WorkCommandError } from './chunk-6AG2XW5S.js';
6
+ import { isLinkedRepository } from './chunk-HRWL7NSJ.js';
7
+ import { sanitizeTerminal } from './chunk-6XQPCQBW.js';
8
+ import { resolveRepoIdentity, compareVersions, SUPPORTED_VERSIONS } from './chunk-LKN4J37L.js';
9
9
  import { C } from './chunk-ANPNT6PM.js';
10
- import { checkFormerSkillNames } from './chunk-P2RWZCV7.js';
11
- import { resolveGatewayCredentials, defaultFetch } from './chunk-KJIUFOC4.js';
12
- import { sanitizeForContext, spoolDir, assessSyncHealth, readSyncStatus, SYNC_STALE_AFTER_MS, formatAgo, checkInstalledCliStaleness, workspaceRootOf, hookFiredMarkerPath, refreshCommand } from './chunk-OOUHNKKX.js';
10
+ import { checkFormerSkillNames } from './chunk-FUGRIAG7.js';
11
+ import { resolveGatewayCredentials, defaultFetch } from './chunk-F72ABZRD.js';
12
+ import { sanitizeForContext, spoolDir, assessSyncHealth, readSyncStatus, SYNC_STALE_AFTER_MS, formatAgo, checkInstalledCliStaleness, workspaceRootOf, hookFiredMarkerPath, refreshCommand } from './chunk-IG45QISA.js';
13
13
  import { readStatuslineState, STATE_FRESH_MS } from './chunk-I7RZHMXW.js';
14
14
  import { hookCommandEscapesControlPlane, CONTROL_PLANE_DIR_VARIABLE } from './chunk-HCVLP7XA.js';
15
15
  import { findGitDirs } from './chunk-BJ3KTMDH.js';
@@ -176,17 +176,18 @@ function runDoctor(env = {}) {
176
176
  const home = env.home ?? homeFromEnv();
177
177
  const now = env.now ?? Date.now;
178
178
  const laptop = env.runnerHost !== true;
179
+ const buildsInOwnImages = env.runnerHost === true && (env.runnerHooks === "builtin:container" || env.runnerHooks === "builtin:vm");
179
180
  const transcripts = laptop ? scanTranscripts(home) : void 0;
180
181
  const starter = laptop ? checkStarterFiles(env.cwd) : void 0;
181
182
  return [
182
183
  ...laptop ? [checkClaudeDir(home), checkTranscripts(transcripts, now), ...checkHooks(home, env.cwd, transcripts, now)] : [LAPTOP_CHECKS_NOT_APPLICABLE],
183
184
  ...checkDeadHooksState(env.cwd),
184
185
  ...laptop ? [checkSpoolWritable(home)] : [],
185
- checkLastSync(home, now),
186
+ ...buildsInOwnImages ? [] : [checkLastSync(home, now)],
186
187
  ...laptop ? [checkDaemon(home)] : [],
187
188
  checkCleanupPeriod(home),
188
189
  checkDiskHeadroom(home),
189
- checkClaudeVersion(env),
190
+ ...buildsInOwnImages ? [] : [checkClaudeVersion(env)],
190
191
  checkSettingsValid(home, env.cwd),
191
192
  ...laptop ? checkStatusline(home, now, env.cwd) : [],
192
193
  ...checkInstalls(env),
@@ -920,6 +921,7 @@ var CREDENTIAL_CHECK_TIMEOUT_MS = 15e3;
920
921
  var LOGIN_FIX = `Run \`${cliInvocation()} login\` to sign in again.`;
921
922
  var CONNECT_FIX = `Run \`${cliInvocation()} connect\` to choose a factory for this repository.`;
922
923
  var SETUP_PANEL_FIX = "Link the repository on the factory's setup panel in the dashboard.";
924
+ var RUNNER_KEY_PATH = "/v1/runner/host-key";
923
925
  var MINT_KEY_FIX = "Mint a key for a factory that exists: dashboard \u2192 Settings \u2192 API keys.";
924
926
  async function askGateway(fetchImpl, url, path, credential, appId) {
925
927
  const headers = { authorization: `Bearer ${credential}` };
@@ -1019,7 +1021,7 @@ async function loginChecks(fetchImpl, url, token, appId, local, inRepository) {
1019
1021
  const fix = elsewhere === void 0 ? SETUP_PANEL_FIX : `Run \`${cliInvocation()} connect --factory ${factorySlug(elsewhere)}\` to use the factory this repository is linked to.`;
1020
1022
  return [login, factoryCheck, { name: "Repository", status: "warn", detail: `${shown} is not linked to ${factorySlug(factory)}`, fix }];
1021
1023
  }
1022
- async function factoryKeyChecks(fetchImpl, url, key, appId, source, local) {
1024
+ async function factoryKeyChecks(fetchImpl, url, key, appId, source, local, runnerHost) {
1023
1025
  const name = "Factory key";
1024
1026
  if (appId === void 0) {
1025
1027
  return withSkippedRest(
@@ -1028,7 +1030,7 @@ async function factoryKeyChecks(fetchImpl, url, key, appId, source, local) {
1028
1030
  );
1029
1031
  }
1030
1032
  const factoryPath = `/v1/apps/${encodeURIComponent(appId)}`;
1031
- const reply = await askGateway(fetchImpl, url, factoryPath, key, appId);
1033
+ const reply = await askGateway(fetchImpl, url, runnerHost ? RUNNER_KEY_PATH : factoryPath, key, appId);
1032
1034
  const unanswered = unansweredDetail(reply);
1033
1035
  if (unanswered !== void 0) {
1034
1036
  return withSkippedRest({ name, status: "warn", detail: unanswered, fix: NETWORK_FIX }, "the factory key check did not finish");
@@ -1051,10 +1053,11 @@ async function factoryKeyChecks(fetchImpl, url, key, appId, source, local) {
1051
1053
  const accepted = { name, status: "pass", detail: `the gateway accepts the key from ${source}` };
1052
1054
  const shownAppId = sanitizeTerminal(appId);
1053
1055
  if (status === 403 && /missing required permission/i.test(message)) {
1054
- const permission = /'([^']+)'/.exec(message)?.[1] ?? "factory.read";
1056
+ const permission = /'([^']+)'/.exec(message)?.[1] ?? (runnerHost ? "work.claim" : "factory.read");
1057
+ const cannot = runnerHost ? `the key lacks a permission that a runner needs for the factory ${shownAppId}` : `the key cannot read the factory ${shownAppId}`;
1055
1058
  return [
1056
1059
  accepted,
1057
- { name: "Factory", status: "fail", detail: `the key cannot read the factory ${shownAppId}: ${message}`, fix: `Use a key that holds ${permission}.` },
1060
+ { name: "Factory", status: "fail", detail: `${cannot}: ${message}`, fix: `Use a key that holds ${permission}.` },
1058
1061
  skippedCheck("Repository", "the factory check failed")
1059
1062
  ];
1060
1063
  }
@@ -1082,6 +1085,10 @@ async function factoryKeyChecks(fetchImpl, url, key, appId, source, local) {
1082
1085
  "the factory key check did not finish"
1083
1086
  );
1084
1087
  }
1088
+ if (runnerHost) {
1089
+ const factory2 = { name: "Factory", status: "pass", detail: `the factory ${shownAppId} accepts this runner key` };
1090
+ return withRepository(fetchImpl, url, key, appId, factoryPath, local, accepted, factory2);
1091
+ }
1085
1092
  const row = body?.data;
1086
1093
  if (typeof row?.id !== "string") {
1087
1094
  return withSkippedRest(
@@ -1091,6 +1098,9 @@ async function factoryKeyChecks(fetchImpl, url, key, appId, source, local) {
1091
1098
  }
1092
1099
  const label = [row.display_name, row.name].find((v) => typeof v === "string") ?? appId;
1093
1100
  const factory = { name: "Factory", status: "pass", detail: `${sanitizeTerminal(label)} (${shownAppId}) is readable with this key` };
1101
+ return withRepository(fetchImpl, url, key, appId, factoryPath, local, accepted, factory);
1102
+ }
1103
+ async function withRepository(fetchImpl, url, key, appId, factoryPath, local, accepted, factory) {
1094
1104
  if (local === void 0) return [accepted, factory, skippedCheck("Repository", "not inside a git repository with a remote")];
1095
1105
  const links = await askGateway(fetchImpl, url, `${factoryPath}/git/links`, key, appId);
1096
1106
  const shown = sanitizeTerminal(local);
@@ -1122,7 +1132,7 @@ async function credentialChecks(options = {}) {
1122
1132
  return loginChecks(fetchImpl, resolved.url, resolved.credential, resolved.appId, local, findGitDirs(cwd) !== void 0);
1123
1133
  }
1124
1134
  const source = env.OUTERLAYER_API_KEY ? "OUTERLAYER_API_KEY" : "~/.outerlayer/config.json";
1125
- return factoryKeyChecks(fetchImpl, resolved.url, resolved.credential, resolved.appId, source, local);
1135
+ return factoryKeyChecks(fetchImpl, resolved.url, resolved.credential, resolved.appId, source, local, options.runnerHost === true);
1126
1136
  }
1127
1137
  function governedDetail(source) {
1128
1138
  return `governed by ${sanitizeTerminal(source.repository)} (ref ${sanitizeTerminal(source.ref)}, stored commit ${sanitizeTerminal(source.sha.slice(0, 7))})`;
@@ -1180,10 +1190,18 @@ function doctorExitCode(checks) {
1180
1190
 
1181
1191
  // src/doctor-report.ts
1182
1192
  async function gatherDoctorChecks() {
1183
- const { defaultRunnerConfigPath, hasRunnerBlock, loadRunnerConfig, runnerVmOf } = await import('./config-TNV5HHLO.js');
1193
+ const { defaultRunnerConfigPath, hasRunnerBlock, loadRunnerConfig, runnerVmOf } = await import('./config-HJQ4YE57.js');
1184
1194
  const configPath = defaultRunnerConfigPath();
1185
- const checks = runDoctor({ runnerHost: hasRunnerBlock(configPath) });
1186
- const credential = await credentialChecks();
1195
+ const runnerHost = hasRunnerBlock(configPath);
1196
+ const hooks = (() => {
1197
+ try {
1198
+ return runnerHost ? loadRunnerConfig(configPath).hooks : void 0;
1199
+ } catch {
1200
+ return void 0;
1201
+ }
1202
+ })();
1203
+ const checks = runDoctor({ runnerHost, ...hooks === void 0 ? {} : { runnerHooks: hooks.provision } });
1204
+ const credential = await credentialChecks({ runnerHost });
1187
1205
  checks.push(...credential);
1188
1206
  if (credential[0]?.status === "pass") checks.push(...await githubAppChecks(), ...await governanceChecks());
1189
1207
  if (credential[0]?.status === "pass") checks.push(...await fleetCheck());
@@ -1193,14 +1211,7 @@ async function gatherDoctorChecks() {
1193
1211
  const { runnerVmCheck } = await import('./doctor-53F2PYY7.js');
1194
1212
  checks.push(runnerVmCheck(configPath, { lima: realLima(), home: homeFromEnv(), instance: runnerVm.instance }));
1195
1213
  } else if (hasRunnerBlock(configPath)) {
1196
- const { runnerHostChecks } = await import('./doctor-3SRHLRF5.js');
1197
- const hooks = (() => {
1198
- try {
1199
- return loadRunnerConfig(configPath).hooks;
1200
- } catch {
1201
- return void 0;
1202
- }
1203
- })();
1214
+ const { runnerHostChecks } = await import('./doctor-VXDBXKSL.js');
1204
1215
  const gateway = (() => {
1205
1216
  try {
1206
1217
  const { url, apiKey, appId } = loadRunnerConfig(configPath);
@@ -1228,7 +1239,7 @@ async function gatherDoctorChecks() {
1228
1239
  const { existsSync: existsSync3 } = await import('fs');
1229
1240
  if (process.platform !== "linux" || !existsSync3("/run/systemd/system")) return void 0;
1230
1241
  const { inspectService, realInspectProbes } = await import('./inspect-L7JIBK3Y.js');
1231
- const { DEFAULT_UNIT_NAME } = await import('./install-NPTR35MG.js');
1242
+ const { DEFAULT_UNIT_NAME } = await import('./install-GODA5G7U.js');
1232
1243
  const { dirname: dirname2 } = await import('path');
1233
1244
  return inspectService(DEFAULT_UNIT_NAME, dirname2(configPath), realInspectProbes());
1234
1245
  })();
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { MIN_ENGINE_MAJOR } from './chunk-4SJ57DH7.js';
4
- import { runnerImageVersion } from './chunk-O47BTZSN.js';
3
+ import { MIN_ENGINE_MAJOR } from './chunk-MO2NI6W6.js';
4
+ import { runnerImageVersion } from './chunk-GI73HOI2.js';
5
5
  import { firecrackerArch, MICROVM_ARCHES, guestAssetsPinned } from './chunk-SJZL5F3F.js';
6
6
  import { spawnSync } from 'child_process';
7
7
  import { existsSync, accessSync, constants, statSync, readFileSync } from 'fs';
@@ -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-DWVAG73B.js';
3
+ import { RUNNER_DIR_MODE, RUNNER_FILE_MODE } from './chunk-PAHZQQB3.js';
4
4
  import { readFileSync, mkdirSync, writeFileSync, renameSync } from 'fs';
5
5
  import { join } from 'path';
6
6
 
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { AGENTS_SKILLS_BASE, OUTERLAYER_SKILLS_BASE } from './chunk-JGML2VUN.js';
4
- import { normalizePath, CONTEXT_PIN_FILENAME } from './chunk-RKOTJQVG.js';
3
+ import { AGENTS_SKILLS_BASE, OUTERLAYER_SKILLS_BASE } from './chunk-NX2G6PH6.js';
4
+ import { normalizePath, CONTEXT_PIN_FILENAME } from './chunk-DXI6A6JN.js';
5
5
  import { existsSync, readdirSync, readFileSync, mkdirSync, writeFileSync, lstatSync, readlinkSync, symlinkSync, rmdirSync } from 'fs';
6
6
  import { relative, sep, join } from 'path';
7
7
 
@@ -2,7 +2,7 @@
2
2
  import { createRequire } from 'node:module';
3
3
  import { readContextManifest, removeContextManifest } from './chunk-YQR6E6OV.js';
4
4
  import { removePreCommitGuardHook } from './chunk-TUSYOL2O.js';
5
- import { CONTEXT_PIN_FILENAME } from './chunk-RKOTJQVG.js';
5
+ import { CONTEXT_PIN_FILENAME } from './chunk-DXI6A6JN.js';
6
6
  import { execFileSync } from 'child_process';
7
7
  import { lstatSync, existsSync, unlinkSync, readdirSync, rmdirSync, readFileSync, mkdirSync, writeFileSync } from 'fs';
8
8
  import { join, dirname, isAbsolute } from 'path';
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { detectActiveSession, autoConnect } from './chunk-NMIYK2G2.js';
4
- import { workPageUrl } from './chunk-QFNFBQCG.js';
5
- import { sanitizeTerminal } from './chunk-BUP5N3X6.js';
6
- import { resolveRepoIdentity } from './chunk-UHU7H57K.js';
3
+ import { detectActiveSession, autoConnect } from './chunk-PGA5BVHQ.js';
4
+ import { workPageUrl } from './chunk-HRWL7NSJ.js';
5
+ import { sanitizeTerminal } from './chunk-6XQPCQBW.js';
6
+ import { resolveRepoIdentity } from './chunk-LKN4J37L.js';
7
7
  import { C } from './chunk-ANPNT6PM.js';
8
- import { resolveGatewayCredentials, unauthorizedMessage, defaultFetch } from './chunk-KJIUFOC4.js';
9
- import { signRunnerRequest } from './chunk-R7TMTFJP.js';
8
+ import { resolveGatewayCredentials, unauthorizedMessage, defaultFetch } from './chunk-F72ABZRD.js';
9
+ import { signRunnerRequest } from './chunk-SHVE5JZO.js';
10
10
  import { readRepoConnection } from './chunk-BJ3KTMDH.js';
11
11
  import { parseTrackerNumber, trackerNumberError } from './chunk-WZBHBH3J.js';
12
12
  import { homeFromEnv } from './chunk-VNVZDWO3.js';
@@ -428,7 +428,7 @@ async function runWorkLinkSession(opts) {
428
428
  return await linkSession(opts);
429
429
  } catch (err) {
430
430
  if (opts.logFailures) {
431
- const { logHookError } = await import('./hook-fast-UJPAWDAO.js');
431
+ const { logHookError } = await import('./hook-fast-JKYCVO4R.js');
432
432
  const reason = err instanceof Error ? err.message : String(err);
433
433
  logHookError(opts.home ?? homeFromEnv(opts.env ?? process.env), new Error(`work link-session #${opts.number} failed: ${reason}`));
434
434
  }
@@ -534,14 +534,33 @@ function repositoryDisconnectedLine(data) {
534
534
 
535
535
  `;
536
536
  }
537
+ function failingChecksSection(data) {
538
+ const checks = data.checks;
539
+ if (!Array.isArray(checks)) return "";
540
+ const failing = checks.filter((check) => check.result === "fail");
541
+ if (failing.length === 0) return "";
542
+ const lines = failing.flatMap((check) => {
543
+ const body = typeof check.body === "string" && check.body !== "" ? `: ${sanitizeTerminal(check.body)}` : "";
544
+ const items = Array.isArray(check.items) ? check.items : [];
545
+ return [
546
+ ` ${sanitizeTerminal(String(check.name))}${body}`,
547
+ ...items.filter((item) => item.result === "fail").map((item) => ` ${sanitizeTerminal(String(item.id))}${typeof item.reason === "string" ? ` ${C.dim}${sanitizeTerminal(item.reason)}${C.reset}` : ""}`)
548
+ ];
549
+ });
550
+ return `
551
+
552
+ Failing checks
553
+ ${lines.join("\n")}`;
554
+ }
537
555
  function statusOutput(data, json) {
538
556
  if (json) return JSON.stringify(data);
539
557
  const document = mergedUnverifiedLine(data) + repositoryDisconnectedLine(data) + JSON.stringify(data, null, 2);
558
+ const checks = failingChecksSection(data);
540
559
  const criteria = data.criteria;
541
- if (criteria === void 0) return document;
560
+ if (criteria === void 0) return `${document}${checks}`;
542
561
  if (criteria === null || !Array.isArray(criteria.items)) return `${document}
543
562
 
544
- Criteria: none recorded`;
563
+ Criteria: none recorded${checks}`;
545
564
  const mark = criteria.drafted === true ? ` ${C.dim}(drafted by the build)${C.reset}` : "";
546
565
  const lines = criteria.items.map((item) => {
547
566
  const proof = typeof item.proof === "string" ? ` ${C.dim}[proof: ${sanitizeTerminal(item.proof)}]${C.reset}` : "";
@@ -550,7 +569,7 @@ Criteria: none recorded`;
550
569
  return `${document}
551
570
 
552
571
  Criteria${mark}
553
- ${lines.join("\n")}`;
572
+ ${lines.join("\n")}${checks}`;
554
573
  }
555
574
  async function runWorkStatus(opts) {
556
575
  const cwd = opts.cwd ?? process.cwd();
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { ArtifactTombstoneRecordSchema, ArtifactSpoolRecordSchema } from './chunk-QZBXLLTV.js';
3
+ import { ArtifactTombstoneRecordSchema, ArtifactSpoolRecordSchema } from './chunk-JL6VZHAJ.js';
4
4
  import { homeFromEnv } from './chunk-VNVZDWO3.js';
5
5
  import { mkdirSync, appendFileSync, writeFileSync, renameSync, unlinkSync, existsSync, readdirSync, readFileSync, statSync } from 'fs';
6
6
  import { join, dirname } from 'path';
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { EXEC_PORT } from './chunk-DIQN5SEL.js';
3
+ import { EXEC_PORT } from './chunk-YSH4KCUJ.js';
4
4
  import { createConnection } from 'net';
5
5
 
6
6
  createRequire(import.meta.url);
@@ -81,21 +81,24 @@ function runExec(socketPath, request, io = {}) {
81
81
  killed = true;
82
82
  send(FRAME.kill, Buffer.alloc(0));
83
83
  }
84
- const pumpStdin = async () => {
84
+ const chunks = (buffer) => Array.from({ length: Math.ceil(buffer.length / CHUNK_BYTES) }, (_unused, i) => buffer.subarray(i * CHUNK_BYTES, (i + 1) * CHUNK_BYTES));
85
+ const sendRequest = () => {
85
86
  const stdin = io.stdin;
86
- const chunks = (buffer) => Array.from({ length: Math.ceil(buffer.length / CHUNK_BYTES) }, (_unused, i) => buffer.subarray(i * CHUNK_BYTES, (i + 1) * CHUNK_BYTES));
87
+ if (stdin !== void 0 && typeof stdin !== "string" && !Buffer.isBuffer(stdin)) {
88
+ send(FRAME.request, encodeRequest(request));
89
+ void pumpStdin(stdin);
90
+ return;
91
+ }
92
+ const input = stdin === void 0 ? [] : chunks(Buffer.from(stdin)).map((chunk) => encodeFrame(FRAME.stdin, chunk));
93
+ socket.write(Buffer.concat([encodeFrame(FRAME.request, encodeRequest(request)), ...input, encodeFrame(FRAME.stdin, Buffer.alloc(0))]));
94
+ };
95
+ const pumpStdin = async (stdin) => {
87
96
  try {
88
- if (stdin === void 0) {
89
- } else if (typeof stdin === "string" || Buffer.isBuffer(stdin)) {
90
- for (const chunk of chunks(Buffer.from(stdin))) send(FRAME.stdin, chunk);
91
- } else {
92
- stdinIterator = stdin.iterator({ destroyOnReturn: false });
93
- for (; ; ) {
94
- const next = await stdinIterator.next();
95
- if (next.done === true || settled) break;
96
- for (const chunk of chunks(Buffer.from(next.value))) {
97
- if (!send(FRAME.stdin, chunk)) await new Promise((done) => socket.once("drain", () => done()));
98
- }
97
+ const iterator = stdin.iterator({ destroyOnReturn: false });
98
+ stdinIterator = iterator;
99
+ for await (const value of iterator) {
100
+ for (const chunk of chunks(Buffer.from(value))) {
101
+ if (!send(FRAME.stdin, chunk)) await new Promise((done) => socket.once("drain", () => done()));
99
102
  }
100
103
  }
101
104
  } catch {
@@ -143,9 +146,8 @@ function runExec(socketPath, request, io = {}) {
143
146
  }
144
147
  greeted = true;
145
148
  clearTimeout(handshakeTimer);
146
- send(FRAME.request, encodeRequest(request));
149
+ sendRequest();
147
150
  if (io.signal?.aborted === true) kill();
148
- void pumpStdin();
149
151
  const rest = greeting.subarray(newline + 1);
150
152
  if (rest.length > 0) onFrames(rest);
151
153
  });