humanish 0.107.0 → 0.109.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 (671) hide show
  1. package/ARCHITECTURE.md +73 -69
  2. package/CHANGELOG.md +27 -0
  3. package/CONTEXT.md +51 -44
  4. package/README.md +148 -175
  5. package/SECURITY.md +16 -26
  6. package/TELEMETRY.md +8 -6
  7. package/dist/actors/affordance.d.ts +4 -4
  8. package/dist/actors/affordance.js +12 -12
  9. package/dist/actors/agent-session.d.ts +2 -2
  10. package/dist/actors/agent-session.js +7 -7
  11. package/dist/actors/codex/app-server-actor-trace.d.ts +1 -1
  12. package/dist/actors/codex/app-server-actor-trace.js +1 -1
  13. package/dist/actors/codex/app-server-trace.js +2 -1
  14. package/dist/actors/codex/app-server-ui.js +1 -1
  15. package/dist/actors/codex/codex-admission.d.ts +91 -0
  16. package/dist/actors/codex/codex-admission.js +150 -0
  17. package/dist/actors/codex/restricted-executable.d.ts +4 -4
  18. package/dist/actors/codex/restricted-executable.js +8 -8
  19. package/dist/actors/codex/restricted-launch.d.ts +2 -1
  20. package/dist/actors/codex/restricted-launch.js +1 -1
  21. package/dist/actors/codex/restricted-participant.js +20 -18
  22. package/dist/actors/codex/restricted-policy.d.ts +2 -2
  23. package/dist/actors/codex/restricted-policy.js +2 -2
  24. package/dist/actors/codex/restricted-session.d.ts +3 -3
  25. package/dist/actors/codex/restricted-session.js +10 -5
  26. package/dist/actors/computer-use/actor.d.ts +18 -18
  27. package/dist/actors/computer-use/actor.js +4 -4
  28. package/dist/actors/computer-use/admission-limit.d.ts +3 -3
  29. package/dist/actors/computer-use/admission-limit.js +4 -4
  30. package/dist/actors/computer-use/executor-error.d.ts +2 -2
  31. package/dist/actors/computer-use/executor-error.js +3 -3
  32. package/dist/actors/computer-use/loop/actions.d.ts +3 -3
  33. package/dist/actors/computer-use/loop/actions.js +15 -15
  34. package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
  35. package/dist/actors/computer-use/loop/backstop.js +14 -12
  36. package/dist/actors/computer-use/loop/debrief.js +2 -2
  37. package/dist/actors/computer-use/loop/ending.d.ts +6 -6
  38. package/dist/actors/computer-use/loop/ending.js +18 -17
  39. package/dist/actors/computer-use/loop/observation.d.ts +2 -2
  40. package/dist/actors/computer-use/loop/observation.js +15 -14
  41. package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
  42. package/dist/actors/computer-use/loop/provider-call.js +12 -12
  43. package/dist/actors/computer-use/loop/session.d.ts +4 -4
  44. package/dist/actors/computer-use/loop/session.js +4 -4
  45. package/dist/actors/computer-use/loop/spend.d.ts +1 -1
  46. package/dist/actors/computer-use/loop/spend.js +1 -1
  47. package/dist/actors/computer-use/loop/trace.js +11 -9
  48. package/dist/actors/computer-use/loop/types.d.ts +47 -45
  49. package/dist/actors/computer-use/loop/usage.d.ts +2 -2
  50. package/dist/actors/computer-use/loop/usage.js +2 -2
  51. package/dist/actors/computer-use/loop.d.ts +6 -1
  52. package/dist/actors/computer-use/loop.js +26 -4
  53. package/dist/actors/computer-use/openai-context.d.ts +37 -0
  54. package/dist/actors/computer-use/openai-context.js +214 -0
  55. package/dist/actors/computer-use/openai-provider.d.ts +13 -10
  56. package/dist/actors/computer-use/openai-provider.js +52 -41
  57. package/dist/actors/computer-use/openai-requests.d.ts +36 -10
  58. package/dist/actors/computer-use/openai-requests.js +82 -15
  59. package/dist/actors/computer-use/openai-wire.d.ts +19 -7
  60. package/dist/actors/computer-use/openai-wire.js +36 -34
  61. package/dist/actors/computer-use/provider-error.d.ts +4 -4
  62. package/dist/actors/computer-use/provider-error.js +6 -6
  63. package/dist/actors/contract.d.ts +82 -47
  64. package/dist/actors/contract.js +30 -24
  65. package/dist/actors/local-agent/claude-session.d.ts +1 -1
  66. package/dist/actors/local-agent/claude-session.js +13 -12
  67. package/dist/actors/local-agent/cli.d.ts +9 -7
  68. package/dist/actors/local-agent/cli.js +24 -28
  69. package/dist/actors/local-agent/readiness.d.ts +2 -2
  70. package/dist/actors/local-agent/readiness.js +4 -4
  71. package/dist/actors/reasoning-effort.js +8 -8
  72. package/dist/actors/registry.d.ts +12 -12
  73. package/dist/actors/registry.js +21 -20
  74. package/dist/actors/scripted-browser/actor.d.ts +10 -10
  75. package/dist/actors/scripted-browser/actor.js +17 -17
  76. package/dist/actors/scripted-browser/browser-command.js +1 -1
  77. package/dist/actors/scripted-browser/steps.js +1 -1
  78. package/dist/actors/scripted-browser/types.d.ts +1 -1
  79. package/dist/actors/stop-conditions.d.ts +1 -1
  80. package/dist/analysis/automatic-completion.d.ts +7 -7
  81. package/dist/analysis/automatic-completion.js +1 -1
  82. package/dist/analysis/automatic-config.d.ts +6 -6
  83. package/dist/analysis/automatic-config.js +1 -1
  84. package/dist/analysis/codex-config.d.ts +6 -2
  85. package/dist/analysis/codex-config.js +22 -14
  86. package/dist/analysis/execute.d.ts +1 -1
  87. package/dist/analysis/execute.js +1 -1
  88. package/dist/analysis/service.js +5 -5
  89. package/dist/analysis/types.d.ts +6 -0
  90. package/dist/browser-control/client.js +16 -16
  91. package/dist/browser-control/dispatcher.js +4 -4
  92. package/dist/browser-control/protocol.js +14 -14
  93. package/dist/browser-control/recording-transfer.js +4 -4
  94. package/dist/browser-control/transport.js +7 -7
  95. package/dist/cli/commands/analysis-signals.d.ts +2 -2
  96. package/dist/cli/commands/analyze.js +19 -16
  97. package/dist/cli/commands/codex.js +9 -9
  98. package/dist/cli/commands/comms.js +48 -35
  99. package/dist/cli/commands/feedback.js +20 -21
  100. package/dist/cli/commands/migrate.d.ts +4 -0
  101. package/dist/cli/commands/migrate.js +65 -0
  102. package/dist/cli/commands/observe.d.ts +0 -1
  103. package/dist/cli/commands/observe.js +136 -112
  104. package/dist/cli/commands/run-command.d.ts +10 -0
  105. package/dist/cli/commands/run-command.js +85 -0
  106. package/dist/cli/commands/runs.js +136 -139
  107. package/dist/cli/commands/setup.d.ts +2 -2
  108. package/dist/cli/commands/setup.js +27 -24
  109. package/dist/cli/commands/study-format.d.ts +9 -0
  110. package/dist/cli/commands/{lab-format.js → study-format.js} +39 -27
  111. package/dist/cli/commands/{lab-route-computer-use.d.ts → study-route-computer-use.d.ts} +6 -6
  112. package/dist/cli/commands/{lab-route-computer-use.js → study-route-computer-use.js} +17 -18
  113. package/dist/cli/commands/{lab-route-open.d.ts → study-route-open.d.ts} +4 -4
  114. package/dist/cli/commands/{lab-route-open.js → study-route-open.js} +2 -2
  115. package/dist/cli/commands/{lab-route-preview.d.ts → study-route-preview.d.ts} +7 -7
  116. package/dist/cli/commands/{lab-route-preview.js → study-route-preview.js} +7 -6
  117. package/dist/cli/commands/study-route-run.d.ts +19 -0
  118. package/dist/cli/commands/{lab-route-run.js → study-route-run.js} +6 -6
  119. package/dist/cli/commands/study-route-scripted.d.ts +17 -0
  120. package/dist/cli/commands/{lab-route-scripted.js → study-route-scripted.js} +4 -4
  121. package/dist/cli/commands/{lab-route-shared-world.d.ts → study-route-shared-world.d.ts} +5 -5
  122. package/dist/cli/commands/{lab-route-shared-world.js → study-route-shared-world.js} +10 -10
  123. package/dist/cli/commands/study-route-terminal.d.ts +17 -0
  124. package/dist/cli/commands/{lab-route-terminal.js → study-route-terminal.js} +4 -4
  125. package/dist/cli/commands/study-run.d.ts +9 -0
  126. package/dist/cli/commands/{lab-run.js → study-run.js} +44 -45
  127. package/dist/cli/commands/{lab-scorer.d.ts → study-scorer.d.ts} +7 -7
  128. package/dist/cli/commands/{lab-scorer.js → study-scorer.js} +2 -2
  129. package/dist/cli/commands/study.d.ts +3 -0
  130. package/dist/cli/commands/study.js +146 -0
  131. package/dist/cli/commands/tui.d.ts +4 -4
  132. package/dist/cli/commands/tui.js +31 -31
  133. package/dist/cli/commands/watch.js +71 -121
  134. package/dist/cli/deprecations.d.ts +6 -0
  135. package/dist/cli/deprecations.js +18 -0
  136. package/dist/cli/doctor.d.ts +18 -8
  137. package/dist/cli/doctor.js +114 -59
  138. package/dist/cli/first-run-path.d.ts +15 -13
  139. package/dist/cli/first-run-path.js +35 -33
  140. package/dist/cli/io.d.ts +44 -9
  141. package/dist/cli/io.js +98 -23
  142. package/dist/cli/observer-follow.d.ts +3 -3
  143. package/dist/cli/observer-follow.js +6 -7
  144. package/dist/cli/orientation.d.ts +10 -7
  145. package/dist/cli/orientation.js +89 -47
  146. package/dist/cli/product-sentence.d.ts +6 -0
  147. package/dist/cli/product-sentence.js +6 -0
  148. package/dist/cli/program.d.ts +6 -1
  149. package/dist/cli/program.js +111 -43
  150. package/dist/cli/telemetry.d.ts +16 -16
  151. package/dist/cli/telemetry.js +46 -44
  152. package/dist/cli.js +1 -1
  153. package/dist/comms/capture-surface.d.ts +13 -12
  154. package/dist/comms/capture-surface.js +23 -22
  155. package/dist/comms/catch-host.d.ts +7 -7
  156. package/dist/comms/catch-host.js +17 -17
  157. package/dist/comms/connections.d.ts +1 -1
  158. package/dist/comms/connections.js +2 -2
  159. package/dist/comms/email-catch.d.ts +3 -3
  160. package/dist/comms/email-catch.js +8 -8
  161. package/dist/comms/external-evidence.d.ts +5 -5
  162. package/dist/comms/external-evidence.js +5 -4
  163. package/dist/comms/extract.js +2 -2
  164. package/dist/comms/fake-inbox.d.ts +3 -3
  165. package/dist/comms/fake-inbox.js +3 -3
  166. package/dist/comms/receiving-render.d.ts +1 -1
  167. package/dist/comms/receiving-render.js +2 -2
  168. package/dist/comms/receiving-runtime.d.ts +4 -4
  169. package/dist/comms/sandbox-catch-script.d.ts +6 -6
  170. package/dist/comms/sandbox-catch-script.js +6 -6
  171. package/dist/comms/sandbox-catch.d.ts +38 -39
  172. package/dist/comms/sandbox-catch.js +36 -37
  173. package/dist/comms/setup.d.ts +2 -2
  174. package/dist/comms/setup.js +56 -25
  175. package/dist/comms/thread-evidence.d.ts +1 -1
  176. package/dist/comms/thread-evidence.js +6 -6
  177. package/dist/comms/types.d.ts +6 -6
  178. package/dist/comms/types.js +3 -3
  179. package/dist/evidence/frame-signature.d.ts +1 -1
  180. package/dist/evidence/frame-signature.js +4 -4
  181. package/dist/evidence/redaction.d.ts +3 -3
  182. package/dist/evidence/redaction.js +4 -4
  183. package/dist/feedback/draft.js +38 -80
  184. package/dist/feedback/export-bundle.js +1 -1
  185. package/dist/feedback/export.d.ts +5 -1
  186. package/dist/feedback/export.js +10 -10
  187. package/dist/feedback/feedback.d.ts +2 -2
  188. package/dist/feedback/feedback.js +21 -3
  189. package/dist/feedback/proof.d.ts +1 -1
  190. package/dist/feedback/proof.js +2 -2
  191. package/dist/guest/bootstrap.js +6 -6
  192. package/dist/guest/browser-tools.js +8 -8
  193. package/dist/guest/chromium-text.js +19 -19
  194. package/dist/guest/desktop-executor.d.ts +2 -2
  195. package/dist/guest/desktop-executor.js +20 -20
  196. package/dist/guest/desktop-keys.js +4 -4
  197. package/dist/guest/desktop-media.d.ts +2 -2
  198. package/dist/guest/desktop-media.js +16 -16
  199. package/dist/guest/desktop-native.d.ts +1 -1
  200. package/dist/guest/desktop-native.js +10 -10
  201. package/dist/guest/runtime-desktop.js +2 -2
  202. package/dist/guest/runtime-processes.d.ts +2 -2
  203. package/dist/guest/runtime-processes.js +2 -2
  204. package/dist/guest/runtime.js +6 -6
  205. package/dist/index.d.ts +14 -14
  206. package/dist/index.js +8 -8
  207. package/dist/keys/key-resolution.d.ts +5 -5
  208. package/dist/keys/key-resolution.js +23 -23
  209. package/dist/observer/artifact.d.ts +2 -2
  210. package/dist/observer/artifact.js +7 -7
  211. package/dist/observer/data.d.ts +6 -6
  212. package/dist/observer/data.js +5 -4
  213. package/dist/observer/exposure.d.ts +1 -1
  214. package/dist/observer/exposure.js +11 -11
  215. package/dist/observer/http.js +1 -1
  216. package/dist/observer/library.d.ts +3 -1
  217. package/dist/observer/library.js +8 -3
  218. package/dist/observer/listen.js +5 -4
  219. package/dist/observer/render.d.ts +1 -1
  220. package/dist/observer/render.js +17 -6
  221. package/dist/observer/run-routes.d.ts +4 -3
  222. package/dist/observer/run-routes.js +38 -13
  223. package/dist/observer/serve.d.ts +1 -1
  224. package/dist/observer/serve.js +7 -3
  225. package/dist/observer/tunnel.js +1 -1
  226. package/dist/observer-app.html +4 -4
  227. package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
  228. package/dist/routes/computer-use/bundle-parts.js +18 -17
  229. package/dist/routes/computer-use/bundle.d.ts +2 -2
  230. package/dist/routes/computer-use/bundle.js +10 -9
  231. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +6 -6
  232. package/dist/routes/computer-use/e2b-desktop/comms.js +18 -17
  233. package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
  234. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +5 -4
  235. package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
  236. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +1 -1
  237. package/dist/routes/computer-use/e2b-desktop/prepare.js +10 -10
  238. package/dist/routes/computer-use/e2b-desktop/start.js +7 -7
  239. package/dist/routes/computer-use/e2b-desktop/state.d.ts +2 -2
  240. package/dist/routes/computer-use/e2b-desktop/teardown.js +2 -2
  241. package/dist/routes/computer-use/external-comms.d.ts +4 -4
  242. package/dist/routes/computer-use/external-comms.js +1 -1
  243. package/dist/routes/computer-use/fanout-bundle.js +27 -26
  244. package/dist/routes/computer-use/fanout-records.js +12 -13
  245. package/dist/routes/computer-use/live-flush.d.ts +4 -4
  246. package/dist/routes/computer-use/live-flush.js +6 -6
  247. package/dist/routes/computer-use/live-phase.d.ts +5 -4
  248. package/dist/routes/computer-use/live-phase.js +8 -8
  249. package/dist/routes/computer-use/local-tree-pack.d.ts +5 -5
  250. package/dist/routes/computer-use/local-tree-pack.js +1 -1
  251. package/dist/routes/computer-use/local-vm.d.ts +8 -8
  252. package/dist/routes/computer-use/local-vm.js +3 -3
  253. package/dist/routes/computer-use/participant-desktop.d.ts +7 -7
  254. package/dist/routes/computer-use/participant-desktop.js +5 -5
  255. package/dist/routes/computer-use/participant-execution.d.ts +4 -4
  256. package/dist/routes/computer-use/participant-execution.js +10 -10
  257. package/dist/routes/computer-use/participant-model.d.ts +6 -0
  258. package/dist/routes/computer-use/participant-model.js +33 -15
  259. package/dist/routes/computer-use/participant-prompt.d.ts +15 -15
  260. package/dist/routes/computer-use/participant-prompt.js +9 -9
  261. package/dist/routes/computer-use/participant-runs.d.ts +16 -16
  262. package/dist/routes/computer-use/participant-runs.js +26 -25
  263. package/dist/routes/computer-use/plan.d.ts +12 -12
  264. package/dist/routes/computer-use/plan.js +42 -42
  265. package/dist/routes/computer-use/preflight.d.ts +5 -5
  266. package/dist/routes/computer-use/preflight.js +25 -25
  267. package/dist/routes/computer-use/rerun-selection.d.ts +1 -1
  268. package/dist/routes/computer-use/rerun-selection.js +4 -3
  269. package/dist/routes/computer-use/result.d.ts +4 -4
  270. package/dist/routes/computer-use/result.js +22 -21
  271. package/dist/routes/computer-use/route.d.ts +12 -11
  272. package/dist/routes/computer-use/route.js +31 -30
  273. package/dist/routes/computer-use/self-report.d.ts +7 -7
  274. package/dist/routes/computer-use/self-report.js +32 -32
  275. package/dist/routes/computer-use/setup.d.ts +23 -23
  276. package/dist/routes/computer-use/setup.js +28 -29
  277. package/dist/routes/computer-use/single-bundle.d.ts +11 -11
  278. package/dist/routes/computer-use/single-bundle.js +40 -41
  279. package/dist/routes/computer-use/subject-projection.d.ts +4 -4
  280. package/dist/routes/computer-use/subject-projection.js +6 -6
  281. package/dist/routes/computer-use/types.d.ts +71 -73
  282. package/dist/routes/computer-use/types.js +12 -12
  283. package/dist/routes/preview.d.ts +13 -7
  284. package/dist/routes/preview.js +11 -7
  285. package/dist/routes/scripted/bundle.d.ts +7 -7
  286. package/dist/routes/scripted/bundle.js +20 -18
  287. package/dist/routes/scripted/plan.d.ts +8 -8
  288. package/dist/routes/scripted/plan.js +13 -13
  289. package/dist/routes/scripted/result.d.ts +3 -3
  290. package/dist/routes/scripted/result.js +13 -13
  291. package/dist/routes/scripted/route.d.ts +9 -9
  292. package/dist/routes/scripted/route.js +15 -16
  293. package/dist/routes/scripted/scenario.d.ts +1 -1
  294. package/dist/routes/scripted/scenario.js +5 -5
  295. package/dist/routes/scripted/setup.d.ts +6 -6
  296. package/dist/routes/scripted/setup.js +8 -8
  297. package/dist/routes/scripted/subject.d.ts +5 -5
  298. package/dist/routes/scripted/subject.js +4 -4
  299. package/dist/routes/scripted/surface-records.d.ts +1 -1
  300. package/dist/routes/scripted/surface-records.js +4 -4
  301. package/dist/routes/scripted/surface-sessions.d.ts +3 -3
  302. package/dist/routes/scripted/types.d.ts +18 -20
  303. package/dist/routes/scripted/types.js +2 -2
  304. package/dist/routes/shared-world/bundle-records.js +11 -10
  305. package/dist/routes/shared-world/bundle.d.ts +5 -5
  306. package/dist/routes/shared-world/bundle.js +46 -43
  307. package/dist/routes/shared-world/checkpoints.d.ts +4 -4
  308. package/dist/routes/shared-world/checkpoints.js +2 -2
  309. package/dist/routes/shared-world/comms.d.ts +14 -14
  310. package/dist/routes/shared-world/comms.js +19 -18
  311. package/dist/routes/shared-world/external-public.d.ts +4 -3
  312. package/dist/routes/shared-world/external-public.js +16 -12
  313. package/dist/routes/shared-world/handoff.d.ts +7 -6
  314. package/dist/routes/shared-world/handoff.js +65 -57
  315. package/dist/routes/shared-world/lobby-code.d.ts +2 -2
  316. package/dist/routes/shared-world/lobby-code.js +9 -9
  317. package/dist/routes/shared-world/participant-specs.d.ts +10 -9
  318. package/dist/routes/shared-world/participant-specs.js +38 -31
  319. package/dist/routes/shared-world/plan.d.ts +9 -9
  320. package/dist/routes/shared-world/plan.js +16 -16
  321. package/dist/routes/shared-world/provenance.d.ts +2 -2
  322. package/dist/routes/shared-world/provenance.js +2 -2
  323. package/dist/routes/shared-world/provisioned.d.ts +8 -8
  324. package/dist/routes/shared-world/provisioned.js +18 -17
  325. package/dist/routes/shared-world/result.d.ts +6 -6
  326. package/dist/routes/shared-world/result.js +29 -29
  327. package/dist/routes/shared-world/route.d.ts +11 -11
  328. package/dist/routes/shared-world/route.js +40 -39
  329. package/dist/routes/shared-world/setup.d.ts +16 -16
  330. package/dist/routes/shared-world/setup.js +23 -23
  331. package/dist/routes/shared-world/types.d.ts +55 -53
  332. package/dist/routes/shared-world/types.js +4 -4
  333. package/dist/routes/terminal/adapter.d.ts +5 -5
  334. package/dist/routes/terminal/adapter.js +9 -9
  335. package/dist/routes/terminal/bundle.d.ts +13 -13
  336. package/dist/routes/terminal/bundle.js +28 -27
  337. package/dist/routes/terminal/credentials.d.ts +8 -8
  338. package/dist/routes/terminal/credentials.js +12 -12
  339. package/dist/routes/terminal/dry-run.d.ts +4 -4
  340. package/dist/routes/terminal/dry-run.js +12 -12
  341. package/dist/routes/terminal/encoding.js +2 -2
  342. package/dist/routes/terminal/ledger.d.ts +5 -5
  343. package/dist/routes/terminal/ledger.js +14 -14
  344. package/dist/routes/terminal/lifetime.d.ts +1 -1
  345. package/dist/routes/terminal/lifetime.js +1 -1
  346. package/dist/routes/terminal/live-finish.d.ts +2 -2
  347. package/dist/routes/terminal/live-finish.js +10 -10
  348. package/dist/routes/terminal/live-sandbox.d.ts +2 -2
  349. package/dist/routes/terminal/live-sandbox.js +15 -15
  350. package/dist/routes/terminal/participant-text.js +2 -1
  351. package/dist/routes/terminal/persona.d.ts +2 -2
  352. package/dist/routes/terminal/persona.js +3 -3
  353. package/dist/routes/terminal/plan.d.ts +7 -7
  354. package/dist/routes/terminal/plan.js +15 -15
  355. package/dist/routes/terminal/recorder.js +2 -2
  356. package/dist/routes/terminal/result.d.ts +5 -5
  357. package/dist/routes/terminal/result.js +14 -14
  358. package/dist/routes/terminal/route.d.ts +9 -9
  359. package/dist/routes/terminal/route.js +19 -20
  360. package/dist/routes/terminal/sandbox.d.ts +1 -1
  361. package/dist/routes/terminal/sandbox.js +1 -1
  362. package/dist/routes/terminal/session.d.ts +5 -5
  363. package/dist/routes/terminal/session.js +14 -13
  364. package/dist/routes/terminal/token-usage.d.ts +1 -1
  365. package/dist/routes/terminal/token-usage.js +7 -8
  366. package/dist/routes/terminal/trace.d.ts +4 -4
  367. package/dist/routes/terminal/trace.js +2 -2
  368. package/dist/routes/terminal/types.d.ts +48 -50
  369. package/dist/routes/terminal/types.js +5 -5
  370. package/dist/run/bundle-shape.js +3 -3
  371. package/dist/run/bundle.d.ts +49 -49
  372. package/dist/run/bundle.js +3 -2
  373. package/dist/run/cost-summary.js +3 -3
  374. package/dist/run/costs.d.ts +23 -0
  375. package/dist/run/costs.js +79 -44
  376. package/dist/run/detail.d.ts +6 -6
  377. package/dist/run/detail.js +4 -4
  378. package/dist/run/dry-run-inputs.d.ts +1 -1
  379. package/dist/run/dry-run-inputs.js +2 -2
  380. package/dist/run/dry-run.js +20 -20
  381. package/dist/run/judge.d.ts +19 -13
  382. package/dist/run/judge.js +18 -8
  383. package/dist/run/outcomes.d.ts +1 -1
  384. package/dist/run/participant.d.ts +1 -1
  385. package/dist/run/paths.d.ts +1 -1
  386. package/dist/run/paths.js +1 -1
  387. package/dist/run/preflight-receipts.js +1 -1
  388. package/dist/run/pricing.d.ts +11 -6
  389. package/dist/run/pricing.js +22 -15
  390. package/dist/run/projection.d.ts +46 -46
  391. package/dist/run/projection.js +57 -57
  392. package/dist/run/reclaim.d.ts +1 -1
  393. package/dist/run/reclaim.js +3 -3
  394. package/dist/run/results.d.ts +5 -5
  395. package/dist/run/run-cost.d.ts +53 -0
  396. package/dist/run/run-cost.js +105 -0
  397. package/dist/run/run-index-analysis.d.ts +15 -0
  398. package/dist/run/run-index-analysis.js +77 -0
  399. package/dist/run/run-index.d.ts +19 -7
  400. package/dist/run/run-index.js +77 -64
  401. package/dist/run/run-not-found.d.ts +5 -0
  402. package/dist/run/run-not-found.js +15 -0
  403. package/dist/run/run.d.ts +6 -5
  404. package/dist/run/run.js +3 -3
  405. package/dist/run/sandbox-receipts.d.ts +2 -2
  406. package/dist/run/sandbox-receipts.js +3 -3
  407. package/dist/run/shared-world-evidence.d.ts +37 -36
  408. package/dist/run/shared-world-evidence.js +4 -4
  409. package/dist/run/shared-world-shape.d.ts +1 -1
  410. package/dist/run/shared-world-shape.js +7 -7
  411. package/dist/run/stats.d.ts +14 -8
  412. package/dist/run/stats.js +121 -63
  413. package/dist/run/status.d.ts +16 -29
  414. package/dist/run/status.js +10 -29
  415. package/dist/run/stored-runs.js +2 -1
  416. package/dist/run/stream-shape.js +1 -1
  417. package/dist/run/streams.d.ts +7 -7
  418. package/dist/run/study-provenance.d.ts +49 -0
  419. package/dist/run/study-provenance.js +66 -0
  420. package/dist/run/study-result.d.ts +11 -0
  421. package/dist/run/study-result.js +9 -0
  422. package/dist/run/text.d.ts +2 -0
  423. package/dist/run/text.js +4 -0
  424. package/dist/run-study.d.ts +112 -0
  425. package/dist/{run-lab.js → run-study.js} +52 -47
  426. package/dist/{lab → study}/adapter-extension.d.ts +15 -27
  427. package/dist/{lab → study}/adapter-extension.js +10 -45
  428. package/dist/{lab → study}/adapter-scorer-loader.d.ts +17 -17
  429. package/dist/{lab → study}/adapter-scorer-loader.js +34 -34
  430. package/dist/study/composition-rules.d.ts +7 -0
  431. package/dist/{lab → study}/composition-rules.js +53 -53
  432. package/dist/study/config.d.ts +15 -0
  433. package/dist/{lab → study}/config.js +98 -41
  434. package/dist/study/convert.d.ts +33 -0
  435. package/dist/study/convert.js +432 -0
  436. package/dist/{lab → study}/device-presets.d.ts +10 -10
  437. package/dist/{lab → study}/device-presets.js +11 -11
  438. package/dist/study/discover.d.ts +75 -0
  439. package/dist/{lab → study}/discover.js +134 -95
  440. package/dist/{lab → study}/doctor.d.ts +19 -12
  441. package/dist/{lab → study}/doctor.js +58 -20
  442. package/dist/study/field-paths.d.ts +12 -0
  443. package/dist/study/field-paths.js +126 -0
  444. package/dist/study/files.d.ts +26 -0
  445. package/dist/study/files.js +44 -0
  446. package/dist/{lab → study}/init-templates.d.ts +2 -2
  447. package/dist/study/init-templates.js +421 -0
  448. package/dist/{lab → study}/init.d.ts +2 -2
  449. package/dist/{lab → study}/init.js +46 -11
  450. package/dist/study/keys.d.ts +4 -0
  451. package/dist/{lab → study}/keys.js +46 -12
  452. package/dist/study/migrate.d.ts +48 -0
  453. package/dist/study/migrate.js +408 -0
  454. package/dist/study/owned-files.d.ts +38 -0
  455. package/dist/study/owned-files.js +182 -0
  456. package/dist/{lab → study}/parse/actors.d.ts +5 -5
  457. package/dist/{lab → study}/parse/actors.js +14 -14
  458. package/dist/study/parse/comms.d.ts +12 -0
  459. package/dist/{lab → study}/parse/comms.js +5 -5
  460. package/dist/study/parse/execution.d.ts +19 -0
  461. package/dist/{lab → study}/parse/execution.js +13 -13
  462. package/dist/study/parse/study-v3.d.ts +21 -0
  463. package/dist/study/parse/study-v3.js +259 -0
  464. package/dist/study/parse/subject-state.d.ts +30 -0
  465. package/dist/{lab → study}/parse/subject-state.js +19 -19
  466. package/dist/{lab → study}/parse/subject.d.ts +3 -3
  467. package/dist/{lab → study}/parse/subject.js +34 -34
  468. package/dist/{lab → study}/parse/values.d.ts +3 -3
  469. package/dist/{lab → study}/parse/values.js +3 -3
  470. package/dist/{lab → study}/persona-resolve.d.ts +8 -8
  471. package/dist/{lab → study}/persona-resolve.js +6 -6
  472. package/dist/{lab → study}/plan-base.d.ts +7 -7
  473. package/dist/{lab → study}/plan-base.js +1 -1
  474. package/dist/{lab → study}/plan-participants.d.ts +12 -12
  475. package/dist/{lab → study}/plan-participants.js +4 -4
  476. package/dist/{lab → study}/plan-types.d.ts +31 -31
  477. package/dist/{lab → study}/plan-types.js +2 -2
  478. package/dist/study/plan.d.ts +13 -0
  479. package/dist/study/plan.js +101 -0
  480. package/dist/study/preflight-probes.d.ts +3 -0
  481. package/dist/{lab → study}/preflight-probes.js +20 -19
  482. package/dist/study/preflight-result.d.ts +8 -0
  483. package/dist/{lab → study}/preflight-result.js +5 -4
  484. package/dist/study/preflight.d.ts +94 -0
  485. package/dist/{lab → study}/preflight.js +12 -12
  486. package/dist/{lab → study}/requirements.d.ts +3 -3
  487. package/dist/{lab → study}/requirements.js +1 -1
  488. package/dist/study/route-inputs.d.ts +28 -0
  489. package/dist/{lab → study}/route-inputs.js +1 -1
  490. package/dist/{lab → study}/routing.d.ts +39 -33
  491. package/dist/{lab → study}/routing.js +60 -29
  492. package/dist/{lab/run-lab-events.d.ts → study/run-study-events.d.ts} +10 -13
  493. package/dist/{lab/run-lab-events.js → study/run-study-events.js} +3 -9
  494. package/dist/{lab/run-lab-homes.d.ts → study/run-study-homes.d.ts} +21 -18
  495. package/dist/{lab/run-lab-homes.js → study/run-study-homes.js} +1 -1
  496. package/dist/study/run-study-options.d.ts +28 -0
  497. package/dist/{lab/run-lab-options.js → study/run-study-options.js} +29 -25
  498. package/dist/{lab/lab-deps.d.ts → study/study-deps.d.ts} +8 -13
  499. package/dist/{lab/lab-deps.js → study/study-deps.js} +2 -2
  500. package/dist/{lab → study}/summary.d.ts +16 -15
  501. package/dist/{lab → study}/summary.js +21 -21
  502. package/dist/{lab → study}/tasks.d.ts +18 -18
  503. package/dist/{lab → study}/tasks.js +14 -14
  504. package/dist/{lab → study}/types.d.ts +202 -196
  505. package/dist/{lab → study}/types.js +3 -1
  506. package/dist/{lab → study}/validation.d.ts +27 -27
  507. package/dist/{lab → study}/validation.js +53 -51
  508. package/dist/study/warnings.d.ts +12 -0
  509. package/dist/{lab → study}/warnings.js +62 -34
  510. package/dist/subject/clone.d.ts +7 -7
  511. package/dist/subject/clone.js +2 -2
  512. package/dist/subject/desktop-cli.d.ts +1 -1
  513. package/dist/subject/desktop-cli.js +2 -2
  514. package/dist/subject/local-tree-archive.d.ts +2 -2
  515. package/dist/subject/local-tree-archive.js +4 -4
  516. package/dist/subject/local-tree.d.ts +4 -4
  517. package/dist/subject/node-bootstrap.js +1 -1
  518. package/dist/subject/runtime.js +9 -10
  519. package/dist/subject/serve.d.ts +5 -5
  520. package/dist/subject/serve.js +3 -3
  521. package/dist/subject/state.d.ts +4 -4
  522. package/dist/subject/state.js +1 -1
  523. package/dist/subject/steps.d.ts +6 -6
  524. package/dist/subject/steps.js +5 -5
  525. package/dist/substrates/command-failure.d.ts +3 -3
  526. package/dist/substrates/command-failure.js +3 -3
  527. package/dist/substrates/desktop-session.js +2 -2
  528. package/dist/substrates/detached.d.ts +6 -6
  529. package/dist/substrates/detached.js +7 -7
  530. package/dist/substrates/e2b/cdp-probe.d.ts +9 -9
  531. package/dist/substrates/e2b/cdp-probe.js +14 -17
  532. package/dist/substrates/e2b/desktop-browser.d.ts +6 -6
  533. package/dist/substrates/e2b/desktop-browser.js +9 -9
  534. package/dist/substrates/e2b/desktop-cdp.d.ts +10 -10
  535. package/dist/substrates/e2b/desktop-cdp.js +9 -9
  536. package/dist/substrates/e2b/desktop-executor.d.ts +2 -2
  537. package/dist/substrates/e2b/desktop-executor.js +13 -13
  538. package/dist/substrates/e2b/desktop-geometry.d.ts +4 -4
  539. package/dist/substrates/e2b/desktop-geometry.js +8 -8
  540. package/dist/substrates/e2b/desktop-media.d.ts +4 -4
  541. package/dist/substrates/e2b/desktop-media.js +1 -1
  542. package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
  543. package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
  544. package/dist/substrates/e2b/lifetime.js +1 -1
  545. package/dist/substrates/e2b/sandbox.d.ts +4 -4
  546. package/dist/substrates/e2b/sandbox.js +2 -2
  547. package/dist/substrates/e2b/sdk.d.ts +12 -12
  548. package/dist/substrates/e2b/sdk.js +7 -7
  549. package/dist/substrates/local/runtime-config.d.ts +4 -4
  550. package/dist/substrates/local/runtime-config.js +4 -4
  551. package/dist/tui/actions.d.ts +1 -1
  552. package/dist/tui/actions.js +13 -13
  553. package/dist/tui/contract.d.ts +23 -23
  554. package/dist/tui/contract.js +11 -11
  555. package/dist/tui/launch.d.ts +7 -7
  556. package/dist/tui/launch.js +36 -31
  557. package/dist/tui/project.js +5 -5
  558. package/dist/tui-app.js +139 -139
  559. package/dist/verify/actor.d.ts +8 -8
  560. package/dist/verify/actor.js +36 -36
  561. package/dist/verify/artifacts.d.ts +2 -2
  562. package/dist/verify/artifacts.js +3 -3
  563. package/dist/verify/context-growth.d.ts +9 -0
  564. package/dist/verify/context-growth.js +62 -0
  565. package/dist/verify/costs.d.ts +6 -6
  566. package/dist/verify/costs.js +8 -8
  567. package/dist/verify/shared-world-concurrent.d.ts +2 -2
  568. package/dist/verify/shared-world-concurrent.js +79 -76
  569. package/dist/verify/shared-world.d.ts +2 -2
  570. package/dist/verify/shared-world.js +16 -16
  571. package/dist/verify/subject.d.ts +5 -5
  572. package/dist/verify/subject.js +19 -19
  573. package/dist/verify/verify.js +94 -44
  574. package/docs/README.md +25 -32
  575. package/docs/architecture/actor-contract.md +60 -91
  576. package/docs/architecture/browser-control.md +1 -1
  577. package/docs/architecture/desktop-sessions.md +7 -7
  578. package/docs/architecture/external-public-shared-world.md +68 -65
  579. package/docs/architecture/github-feedback-loop.md +2 -5
  580. package/docs/architecture/guest-desktop.md +2 -2
  581. package/docs/architecture/observer.md +34 -34
  582. package/docs/architecture/restricted-codex-analysis.md +34 -28
  583. package/docs/architecture/serve.md +34 -37
  584. package/docs/architecture/state-driven-executor.md +55 -58
  585. package/docs/architecture/task-protocol-support.md +6 -6
  586. package/docs/architecture/terminal-product-route.md +70 -110
  587. package/docs/contracts/README.md +24 -0
  588. package/docs/contracts/adapter-admission.md +3 -3
  589. package/docs/contracts/adapter-fixtures.md +4 -7
  590. package/docs/contracts/core.md +1 -3
  591. package/docs/contracts/errors.md +62 -0
  592. package/docs/contracts/feedback.md +8 -9
  593. package/docs/contracts/policy.md +7 -12
  594. package/docs/contracts/run-bundle.md +42 -44
  595. package/docs/contracts/schemas.md +446 -368
  596. package/docs/contracts/study-analysis.md +7 -4
  597. package/docs/contracts/study-costs.md +28 -9
  598. package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
  599. package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
  600. package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
  601. package/docs/principles/actor-fidelity.md +4 -4
  602. package/docs/principles/engineering.md +3 -3
  603. package/docs/principles/invariants-and-defaults.md +38 -38
  604. package/docs/principles/self-driving-harness.md +1 -5
  605. package/docs/principles/three-roles.md +1 -1
  606. package/docs/product/automatic-analysis.md +7 -7
  607. package/examples/README.md +1 -1
  608. package/examples/participant/README.md +5 -5
  609. package/examples/participant/run.mjs +11 -10
  610. package/examples/scorer/README.md +3 -3
  611. package/examples/scorer/run.mjs +11 -12
  612. package/examples/scorer/scorer.mjs +3 -3
  613. package/package.json +16 -17
  614. package/skills/humanish/SKILL.md +64 -60
  615. package/skills/humanish/agents/openai.yaml +1 -1
  616. package/AGENTS.md +0 -99
  617. package/CONTRIBUTING.md +0 -148
  618. package/dist/actors/codex/qualified-versions.d.ts +0 -72
  619. package/dist/actors/codex/qualified-versions.js +0 -132
  620. package/dist/cli/commands/lab-format.d.ts +0 -8
  621. package/dist/cli/commands/lab-route-run.d.ts +0 -19
  622. package/dist/cli/commands/lab-route-scripted.d.ts +0 -17
  623. package/dist/cli/commands/lab-route-terminal.d.ts +0 -17
  624. package/dist/cli/commands/lab-run.d.ts +0 -9
  625. package/dist/cli/commands/lab.d.ts +0 -3
  626. package/dist/cli/commands/lab.js +0 -199
  627. package/dist/cli/renamed-options.d.ts +0 -11
  628. package/dist/cli/renamed-options.js +0 -18
  629. package/dist/lab/composition-rules.d.ts +0 -7
  630. package/dist/lab/config.d.ts +0 -7
  631. package/dist/lab/discover.d.ts +0 -65
  632. package/dist/lab/init-templates.js +0 -416
  633. package/dist/lab/keys.d.ts +0 -2
  634. package/dist/lab/parse/comms.d.ts +0 -12
  635. package/dist/lab/parse/execution.d.ts +0 -19
  636. package/dist/lab/parse/subject-state.d.ts +0 -30
  637. package/dist/lab/plan.d.ts +0 -19
  638. package/dist/lab/plan.js +0 -132
  639. package/dist/lab/preflight-probes.d.ts +0 -3
  640. package/dist/lab/preflight-result.d.ts +0 -7
  641. package/dist/lab/preflight.d.ts +0 -92
  642. package/dist/lab/route-inputs.d.ts +0 -28
  643. package/dist/lab/run-lab-options.d.ts +0 -28
  644. package/dist/lab/warnings.d.ts +0 -2
  645. package/dist/observer/static.d.ts +0 -39
  646. package/dist/observer/static.js +0 -369
  647. package/dist/run-lab.d.ts +0 -112
  648. package/docs/architecture/comms-inbox.md +0 -122
  649. package/docs/architecture/desktop-recording.md +0 -80
  650. package/docs/architecture/local-browser-runtime.md +0 -178
  651. package/docs/architecture/observer-review.md +0 -144
  652. package/docs/architecture/participant-media.md +0 -90
  653. package/docs/architecture/project-layout.md +0 -62
  654. package/docs/architecture/real-email-receiving.md +0 -136
  655. package/docs/assets/humanish-drawdb-hero.png +0 -0
  656. package/docs/assets/humanish-observer-hero.png +0 -0
  657. package/docs/goals/current.md +0 -207
  658. package/docs/product/lobby-trivia-3player-external-public.md +0 -77
  659. package/docs/product/open-source-install-experience.md +0 -240
  660. package/docs/ramp/README.md +0 -295
  661. package/docs/release/open-source-readiness.md +0 -222
  662. package/docs/release/public-readiness-standard.md +0 -210
  663. package/docs/roadmap/world-class-open-source-v0.md +0 -311
  664. /package/dist/{lab → study}/init-paths.d.ts +0 -0
  665. /package/dist/{lab → study}/init-paths.js +0 -0
  666. /package/dist/{lab → study}/init-plan.d.ts +0 -0
  667. /package/dist/{lab → study}/init-plan.js +0 -0
  668. /package/dist/{lab → study}/participant-assignment.d.ts +0 -0
  669. /package/dist/{lab → study}/participant-assignment.js +0 -0
  670. /package/dist/{lab → study}/persona.d.ts +0 -0
  671. /package/dist/{lab → study}/persona.js +0 -0
@@ -5,7 +5,7 @@ import { analyzeRun, correctAnalysis, dryRunBundleRefusal, showAnalysis, } from
5
5
  import { listAnalyses } from "../../analysis/store.js";
6
6
  import { listAnalysisExecutions } from "../../analysis/store-executions.js";
7
7
  import { resolveRunPath } from "../../run/locate.js";
8
- import { discoverCliKeys, JSON_OPTION_DESCRIPTION, writeResult } from "../io.js";
8
+ import { CWD_OPTION_DESCRIPTION, discoverCliKeys, JSON_OPTION_DESCRIPTION, RUN_OPTION_DESCRIPTION, writeResult, humanError, } from "../io.js";
9
9
  import { resolvePhysicalCwd } from "../../run/paths.js";
10
10
  /** Commander may collect a shared flag on the parent; only explicit values override leaf defaults. */
11
11
  function analysisSelection(options, command) {
@@ -24,11 +24,11 @@ export function registerAnalyzeCommand(parent, io) {
24
24
  .command("analyze")
25
25
  .enablePositionalOptions()
26
26
  .description("Analyze retained participant evidence into versioned findings. Selected text and captures go to the chosen remote analyst. Opening Observer never starts analysis.")
27
- .summary("Generate evidence-linked study findings.")
28
- .option("--run <id>", "Completed run id or latest pointer.", "latest")
29
- .option("--cwd <path>", "Target project directory.", ".")
27
+ .summary("Analyze a live run into evidence-linked findings.")
28
+ .option("--run <id>", RUN_OPTION_DESCRIPTION, "latest")
29
+ .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
30
30
  .option("--provider <name>", "Analyst: openai (default) or restricted codex account. No provider fallback.")
31
- .option("--max-cost <usd>", "Required for OpenAI, including dry-run: USD admission estimate ceiling, not a billing cap. Unsupported for Codex.")
31
+ .option("--max-cost <usd>", "Required for OpenAI, also with --dry-run: send nothing when the estimated cost in USD is above this. The estimate is not a billing cap. Unsupported for Codex.")
32
32
  .option("--model <id>", "Supported vision model. OpenAI uses high effort; qualified Codex account analysis uses low effort.", DEFAULT_ANALYSIS_MODEL)
33
33
  .option("--question <text>", "Additional reviewer question; does not change participant instructions.")
34
34
  .option("--timeout-ms <ms>", "Request timeout, at most 600000 ms.", String(DEFAULT_ANALYSIS_TIMEOUT_MS))
@@ -40,23 +40,23 @@ export function registerAnalyzeCommand(parent, io) {
40
40
  analyze
41
41
  .command("list")
42
42
  .description("List immutable analysis versions, including failed attempts.")
43
- .option("--run <id>", "Run id or latest pointer.", "latest")
44
- .option("--cwd <path>", "Target project directory.", ".")
43
+ .option("--run <id>", RUN_OPTION_DESCRIPTION, "latest")
44
+ .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
45
45
  .option("--json", JSON_OPTION_DESCRIPTION)
46
46
  .action((options, command) => handleAnalyzeList(io, options, command));
47
47
  analyze
48
48
  .command("show")
49
49
  .description("Read validated analysis and correction history. Defaults to the latest usable version.")
50
- .option("--run <id>", "Run id or latest pointer.", "latest")
50
+ .option("--run <id>", RUN_OPTION_DESCRIPTION, "latest")
51
51
  .option("--id <id>", "Exact analysis version.")
52
- .option("--cwd <path>", "Target project directory.", ".")
52
+ .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
53
53
  .option("--json", JSON_OPTION_DESCRIPTION)
54
54
  .action((options, command) => handleAnalyzeShow(io, options, command));
55
55
  analyze
56
56
  .command("correct")
57
57
  .description("Append a human review note bound to one exact finding version; original claims remain intact.")
58
- .option("--run <id>", "Run id or latest pointer.", "latest")
59
- .option("--cwd <path>", "Target project directory.", ".")
58
+ .option("--run <id>", RUN_OPTION_DESCRIPTION, "latest")
59
+ .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
60
60
  .requiredOption("--analysis <id>", "Analysis version to review.")
61
61
  .requiredOption("--finding <id>", "Finding to review.")
62
62
  .addOption(new Option("--status <status>", "Review disposition.")
@@ -83,7 +83,7 @@ async function handleAnalyze(io, options, command) {
83
83
  if (!selected.ok || !selected.config) {
84
84
  const refusal = await dryRunBundleRefusal(await resolvePhysicalCwd(options.cwd), options.run, options.dryRun === true);
85
85
  if (refusal) {
86
- writeResult(command, io, refusal, (value) => forTerminal(`${value.error?.message ?? ""}\n${value.error?.code ?? ""}\n`));
86
+ writeResult(command, io, refusal, (value) => humanError(value.error));
87
87
  io.setExitCode(2);
88
88
  return;
89
89
  }
@@ -99,7 +99,7 @@ async function handleAnalyze(io, options, command) {
99
99
  message: selected.ok ? "Analysis is disabled." : selected.message,
100
100
  },
101
101
  };
102
- writeResult(command, io, result, (value) => `${value.error.message}\n`);
102
+ writeResult(command, io, result, (value) => humanError(value.error));
103
103
  io.setExitCode(2);
104
104
  return;
105
105
  }
@@ -126,8 +126,6 @@ async function handleAnalyze(io, options, command) {
126
126
  if (value.ok && value.dryRun)
127
127
  return `Admission estimate: $${value.admission?.estimatedCostUsd ?? "unknown"}; output allowance: ${value.admission?.outputTokenAllowance ?? "unknown"} tokens including reasoning. No request sent.\n`;
128
128
  const lines = [];
129
- if (!value.ok)
130
- lines.push(value.error?.message ?? "Analysis unavailable.", value.error?.code ?? "");
131
129
  if (value.artifactPath)
132
130
  lines.push(`${value.reused ? "Reused" : "Saved"} ${value.status} analysis: ${value.artifactPath}`);
133
131
  if (value.executionReceiptPath)
@@ -141,7 +139,12 @@ async function handleAnalyze(io, options, command) {
141
139
  if (value.reused)
142
140
  lines.push("No new request sent.");
143
141
  lines.push(...value.warnings);
144
- return forTerminal(lines.filter(Boolean).join("\n") + "\n");
142
+ const stdout = lines.length === 0 ? "" : forTerminal(lines.join("\n") + "\n");
143
+ // A failed analysis keeps its artifact and usage lines on stdout; the error goes to stderr.
144
+ if (value.ok)
145
+ return stdout;
146
+ const error = value.error ?? { message: "Analysis unavailable." };
147
+ return { ...(stdout ? { stdout } : {}), error };
145
148
  });
146
149
  io.setExitCode(result.ok ? 0 : 2);
147
150
  }
@@ -3,22 +3,23 @@ import { resolve } from "node:path";
3
3
  import { Command, Option } from "commander";
4
4
  import { startCodexAppServerUi } from "../../actors/codex/app-server-ui.js";
5
5
  import { redactText } from "../../evidence/redaction.js";
6
- import { JSON_OPTION_DESCRIPTION, parseObserverPort, parseTimeoutMs, writeResult, } from "../io.js";
6
+ import { CWD_OPTION_DESCRIPTION, freePortOption, JSON_OPTION_DESCRIPTION, parseObserverPort, parseTimeoutMs, writeResult, humanError, } from "../io.js";
7
7
  export function registerCodexCommands(parent, io) {
8
+ // Hidden from --help and the CLI reference: it drives a Codex app-server session directly and
9
+ // is not a step in running or reviewing a study.
8
10
  const codex = parent
9
- .command("codex")
10
- .description("Run Codex-native humanish integration surfaces.")
11
- .summary("Run Codex-native humanish integration surfaces.");
11
+ .command("codex", { hidden: true })
12
+ .description("Run Codex-native humanish integration surfaces.");
12
13
  codex
13
14
  .command("app-server")
14
15
  .description("Run a browser-visible Codex app-server actor surface and write redacted protocol artifacts.")
15
- .option("--cwd <path>", "Target project directory.", ".")
16
+ .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
16
17
  .option("--prompt <text>", "Prompt to submit to Codex app-server.")
17
18
  .option("--prompt-file <path>", "Read the Codex app-server prompt from a file.")
18
19
  .option("--run-root <path>", "Artifact directory for redacted app-server evidence.")
19
20
  .option("--state-file <path>", "State JSON file for external observers.")
20
21
  .option("--timeout-ms <ms>", "Actor timeout in milliseconds.", String(900_000))
21
- .option("--port <port>", "Local browser UI port.", "0")
22
+ .addOption(freePortOption())
22
23
  .option("--model <model>", "Optional Codex model override.")
23
24
  .addOption(new Option("--sandbox <mode>", "Turn sandbox policy.")
24
25
  .choices(["read-only", "workspace-write", "danger-full-access"])
@@ -101,9 +102,8 @@ export function registerCodexCommands(parent, io) {
101
102
  });
102
103
  }
103
104
  function formatCodexAppServerUiHuman(result) {
104
- if (!result.ok) {
105
- return `${result.error?.code}: ${result.error?.message}\n`;
106
- }
105
+ if (!result.ok)
106
+ return humanError(result.error);
107
107
  return ([
108
108
  "humanish codex app-server",
109
109
  `url: ${result.url ?? "not-started"}`,
@@ -3,18 +3,18 @@ import { Command } from "commander";
3
3
  import { COMMS_PROVIDERS, saveCommsConnection } from "../../comms/connections.js";
4
4
  import { catchTokenRefusal } from "../../comms/external-evidence.js";
5
5
  import { readCommsSetup } from "../../comms/setup.js";
6
- import { checkCommsConnection, configureCommsLab } from "../../comms/setup.js";
6
+ import { checkCommsConnection, configureCommsStudy } from "../../comms/setup.js";
7
7
  import { inspectCommsRecovery, recoverCommsReceiving } from "../../comms/receiving-recovery.js";
8
8
  import { resolveReceivingConnection } from "../../comms/receiving-runtime.js";
9
- import { resolveLabManifest } from "../../lab/discover.js";
9
+ import { resolveStudyManifest } from "../../study/discover.js";
10
10
  import { runCommsCatchHost } from "../../comms/catch-host.js";
11
11
  import { DEFAULT_SANDBOX_CATCH_PORT } from "../../comms/sandbox-catch.js";
12
- import { applyEnvFileOption, JSON_OPTION_DESCRIPTION, writeResult } from "../io.js";
12
+ import { applyEnvFileOption, CWD_OPTION_DESCRIPTION, ENV_FILE_OPTION_DESCRIPTION, JSON_OPTION_DESCRIPTION, PORT_OPTION_DESCRIPTION, writeResult, messageOutput, } from "../io.js";
13
13
  export function registerCommsCommands(parent, io) {
14
14
  const comms = parent
15
15
  .command("comms")
16
16
  .description("Local email capture, real receiving connections, checks and cleanup recovery.")
17
- .summary("Off-app comms surfaces.");
17
+ .summary("Catch the email an app sends, for email-gated flows.");
18
18
  comms
19
19
  .command("providers")
20
20
  .description("List installed communication provider capabilities. No network requests.")
@@ -22,61 +22,61 @@ export function registerCommsCommands(parent, io) {
22
22
  .action((_options, command) => handleCommsProviders(io, _options, command));
23
23
  const connections = comms
24
24
  .command("connections")
25
- .description("Manage project-local non-secret connection profiles. A lab explicitly selects its receiving connection.");
25
+ .description("Manage project-local non-secret connection profiles. A study explicitly selects its receiving connection.");
26
26
  connections
27
27
  .command("list")
28
28
  .description("Show saved connections and local credential status; does not authenticate with a provider.")
29
- .option("--cwd <path>", "Target project directory.", ".")
30
- .option("--env-file <path>", "Load credentials for local status without printing values.")
29
+ .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
30
+ .option("--env-file <path>", ENV_FILE_OPTION_DESCRIPTION)
31
31
  .option("--json", JSON_OPTION_DESCRIPTION)
32
32
  .action((options, command) => handleCommsList(io, options, command));
33
33
  connections
34
34
  .command("add")
35
35
  .argument("[name]", "Project connection name.", "agentmail")
36
- .description("Save an AgentMail connection profile. Does not write a key, alter a lab or contact the provider.")
37
- .option("--cwd <path>", "Target project directory.", ".")
36
+ .description("Save an AgentMail connection profile. Does not write a key, alter a study or contact the provider.")
37
+ .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
38
38
  .option("--provider <id>", "Installed provider id.", "agentmail")
39
- .option("--api-key-env <name>", "Environment variable NAME, never its value.", "AGENTMAIL_API_KEY")
39
+ .option("--api-key-env <name>", "The name of an environment variable, never its value.", "AGENTMAIL_API_KEY")
40
40
  .option("--json", JSON_OPTION_DESCRIPTION)
41
41
  .action((name, options, command) => handleCommsAdd(io, name, options, command));
42
42
  comms
43
43
  .command("check")
44
44
  .description("Check connection and credential presence; --online authenticates without creating inboxes.")
45
- .option("--cwd <path>", "Target project directory.", ".")
45
+ .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
46
46
  .option("--connection <name>", "Saved connection name.", "agentmail")
47
- .option("--lab <path>", "Check the connection selected by this exact lab.")
47
+ .option("--study <path>", "Check the connection this study selects.")
48
48
  .option("--online", "Make a read-only provider authentication request.")
49
- .option("--env-file <path>", "Load credentials without printing values.")
49
+ .option("--env-file <path>", ENV_FILE_OPTION_DESCRIPTION)
50
50
  .option("--json", JSON_OPTION_DESCRIPTION)
51
51
  .action((options, command) => handleCommsCheck(io, options, command));
52
52
  comms
53
53
  .command("configure")
54
- .description("Preview or save a local receiving-enabled copy of a supported lab. No provider requests.")
55
- .requiredOption("--lab <path>", "Exact source lab path or handle.")
56
- .option("--cwd <path>", "Target project directory.", ".")
54
+ .description("Preview or save a local receiving-enabled copy of a supported study. No provider requests.")
55
+ .requiredOption("--study <path>", "Source study path or name. Required.")
56
+ .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
57
57
  .option("--connection <name>", "Saved connection name.", "agentmail")
58
- .option("--apply", "Save the local copy; original lab remains unchanged.")
58
+ .option("--apply", "Save the local copy; the source study stays unchanged.")
59
59
  .option("--plan-token <digest>", "Require the source and destination to match a previous preview.")
60
60
  .option("--json", JSON_OPTION_DESCRIPTION)
61
61
  .action((options, command) => handleCommsConfigure(io, options, command));
62
62
  comms
63
63
  .command("recover")
64
64
  .description("Inspect interrupted email leases; --apply deletes only privately recorded resources owned by this project and account.")
65
- .option("--cwd <path>", "Target project directory.", ".")
65
+ .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
66
66
  .option("--run <id>", "One run to inspect or recover.")
67
67
  .option("--apply", "Recover the selected inactive run and verify mailbox deletion.")
68
- .option("--env-file <path>", "Load credentials without printing values.")
68
+ .option("--env-file <path>", ENV_FILE_OPTION_DESCRIPTION)
69
69
  .option("--json", JSON_OPTION_DESCRIPTION)
70
70
  .action((options, command) => handleCommsRecover(io, options, command));
71
71
  comms
72
72
  .command("catch")
73
- .description("Run the email catch on this host so humanish can study an app it does not provision. Your app posts its email sends here; the persona opens /inbox; humanish drains GET /deliveries and writes digest-only evidence. Point your lab's comms.email.external.catchBaseUrl at this server.")
74
- .summary("Run the adopter-hosted email catch.")
75
- .option("--port <port>", "Port for capture + inbox (default 8025).", String(DEFAULT_SANDBOX_CATCH_PORT))
73
+ .description("Run the email catch on this host so humanish can study an app it does not provision. Your app posts its email sends here; the persona opens /inbox; humanish drains GET /deliveries and writes digest-only evidence. Point your study's comms.email.external.catchBaseUrl at this server.")
74
+ .summary("Run the email catch on this host.")
75
+ .option("--port <port>", PORT_OPTION_DESCRIPTION, String(DEFAULT_SANDBOX_CATCH_PORT))
76
76
  .option("--dir <path>", "Directory for the deliveries log and rendered inbox.", ".humanish/comms-catch")
77
77
  .option("--token <value>", "Require this bearer token, at least 16 characters, on GET /deliveries (recommended when reachable off-host).")
78
78
  .option("--smtp-port <port>", "Also capture SMTP mail on 127.0.0.1:<port>. Point your app's SMTP transport here.")
79
- .option("--inbox-port <port>", "Also serve a READ-ONLY inbox listener on 0.0.0.0:<port>, so a persona on another machine can open /inbox. Without it the catch stays loopback-only.")
79
+ .option("--inbox-port <port>", "Also serve a read-only inbox listener on 0.0.0.0:<port>, so a persona on another machine can open /inbox. Without it the catch stays loopback-only.")
80
80
  .option("--recipient <address>", "Only render mail sent to this address (repeatable). Default: render whatever the app actually mailed.", (value, previous) => [...(previous ?? []), value])
81
81
  .action((options) => handleCommsCatch(io, options));
82
82
  }
@@ -102,25 +102,32 @@ async function handleCommsAdd(io, name, options, command) {
102
102
  ? await saveCommsConnection(resolve(options.cwd), name, options.apiKeyEnv)
103
103
  : { ok: false, message: "Only AgentMail connection setup is currently available." }),
104
104
  };
105
- writeResult(command, io, result, (value) => `${value.message}\n`);
105
+ writeResult(command, io, result, messageOutput);
106
106
  io.setExitCode(result.ok ? 0 : 2);
107
107
  }
108
108
  async function handleCommsCheck(io, options, command) {
109
109
  if (!(await applyEnvFileOption({ command, cwd: options.cwd, envFile: options.envFile, io })))
110
110
  return;
111
111
  let connection = options.connection;
112
- if (options.lab) {
113
- const lab = await resolveLabManifest(options.cwd, options.lab);
114
- if (!lab.ok || lab.config.comms?.email?.kind !== "real") {
112
+ const study = options.study;
113
+ if (study) {
114
+ const resolved = await resolveStudyManifest(options.cwd, study);
115
+ if (!resolved.ok || resolved.config.comms?.email?.kind !== "real") {
116
+ // A file humanish no longer reads gets discovery's message, which names the fix.
117
+ const named = !resolved.ok &&
118
+ (resolved.error.code === "HUMANISH_STUDY_V2_UNSUPPORTED" ||
119
+ resolved.error.code === "HUMANISH_STUDY_RETIRED_DIRECTORY");
115
120
  const result = {
116
121
  ok: false,
117
- message: "This lab does not select a real email connection.",
122
+ message: named
123
+ ? resolved.error.message
124
+ : "This study does not select a real email connection.",
118
125
  };
119
- writeResult(command, io, result, (value) => `${value.message}\n`);
126
+ writeResult(command, io, result, messageOutput);
120
127
  io.setExitCode(2);
121
128
  return;
122
129
  }
123
- connection = lab.config.comms.email.connection;
130
+ connection = resolved.config.comms.email.connection;
124
131
  }
125
132
  const result = await checkCommsConnection({
126
133
  cwd: resolve(options.cwd),
@@ -128,12 +135,18 @@ async function handleCommsCheck(io, options, command) {
128
135
  env: process.env,
129
136
  online: options.online === true,
130
137
  });
131
- writeResult(command, io, result, (value) => `${value.message}\n`);
138
+ writeResult(command, io, result, messageOutput);
132
139
  io.setExitCode(result.ok ? 0 : 2);
133
140
  }
134
141
  async function handleCommsConfigure(io, options, command) {
135
- const result = await configureCommsLab({ ...options, cwd: resolve(options.cwd) });
136
- writeResult(command, io, result, (value) => `${value.message}\n`);
142
+ const result = await configureCommsStudy({
143
+ cwd: resolve(options.cwd),
144
+ study: options.study,
145
+ connection: options.connection,
146
+ ...(options.apply === undefined ? {} : { apply: options.apply }),
147
+ ...(options.planToken === undefined ? {} : { planToken: options.planToken }),
148
+ });
149
+ writeResult(command, io, result, messageOutput);
137
150
  io.setExitCode(result.ok ? 0 : 2);
138
151
  }
139
152
  async function handleCommsRecover(io, options, command) {
@@ -165,7 +178,7 @@ async function handleCommsRecover(io, options, command) {
165
178
  adapter,
166
179
  })),
167
180
  };
168
- writeResult(command, io, result, (value) => `${value.message}\n`);
181
+ writeResult(command, io, result, messageOutput);
169
182
  io.setExitCode(result.ok ? 0 : 2);
170
183
  }
171
184
  catch {
@@ -174,7 +187,7 @@ async function handleCommsRecover(io, options, command) {
174
187
  ok: false,
175
188
  message: "Recovery could not complete. Select one recorded run with --run, check its connection, and retry. No unrecorded resources are eligible.",
176
189
  };
177
- writeResult(command, io, result, (value) => `${value.message}\n`);
190
+ writeResult(command, io, result, messageOutput);
178
191
  io.setExitCode(2);
179
192
  }
180
193
  }
@@ -1,24 +1,24 @@
1
1
  import { Command } from "commander";
2
2
  import { draftFeedback, listFeedback, renderIssueMarkdown, renderIssueUrl, verifyFeedback, } from "../../feedback/feedback.js";
3
- import { candidateOption, JSON_OPTION_DESCRIPTION, wantsJson, writeResult, } from "../io.js";
3
+ import { candidateOption, CWD_OPTION_DESCRIPTION, JSON_OPTION_DESCRIPTION, RUN_OPTION_DESCRIPTION, wantsJson, writeResult, humanError, writeHuman, } from "../io.js";
4
4
  export function registerFeedbackCommands(parent, io) {
5
5
  const feedback = parent
6
6
  .command("feedback")
7
- .description("Create public-safe feedback drafts without GitHub API mutation.")
8
- .summary("Create public-safe feedback drafts, no GitHub API.");
7
+ .description("Draft public-safe feedback issues from a run. humanish never calls the GitHub API.")
8
+ .summary("Draft public-safe feedback issues from a run.");
9
9
  feedback
10
10
  .command("list")
11
11
  .description("List recorded feedback candidates and any saved draft.")
12
- .addHelpText("after", "\nWith no candidates, feedback draft and feedback issue can generate a run-summary follow-up. Public drafting still requires share_ready verification.\n")
13
- .option("--run <id>", "Run id or latest pointer.", "latest")
14
- .option("--cwd <path>", "Target project directory.", ".")
12
+ .addHelpText("after", "\nWith no candidates, feedback draft and feedback issue write a run-summary follow-up for a live run that verifies share_ready. A dry run gets no draft.\n")
13
+ .option("--run <id>", RUN_OPTION_DESCRIPTION, "latest")
14
+ .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
15
15
  .option("--json", JSON_OPTION_DESCRIPTION)
16
16
  .action((options, command) => handleFeedbackList(io, options, command));
17
17
  feedback
18
18
  .command("draft")
19
19
  .description("Generate a public-safe feedback draft from verified evidence.")
20
- .option("--run <id>", "Run id or latest pointer.", "latest")
21
- .option("--cwd <path>", "Target project directory.", ".")
20
+ .option("--run <id>", RUN_OPTION_DESCRIPTION, "latest")
21
+ .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
22
22
  .option("--analysis <id>", "Independent analysis version; use with --finding.")
23
23
  .option("--finding <id>", "Finding within --analysis, separate from participant candidates.")
24
24
  .option("--candidate <id>", "Which finding to draft (ids from `feedback list`); default: the first.")
@@ -27,8 +27,8 @@ export function registerFeedbackCommands(parent, io) {
27
27
  feedback
28
28
  .command("verify")
29
29
  .description("Verify the feedback draft for public issue eligibility.")
30
- .option("--run <id>", "Run id or latest pointer.", "latest")
31
- .option("--cwd <path>", "Target project directory.", ".")
30
+ .option("--run <id>", RUN_OPTION_DESCRIPTION, "latest")
31
+ .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
32
32
  .option("--analysis <id>", "Independent analysis version; use with --finding.")
33
33
  .option("--finding <id>", "Finding within --analysis, separate from participant candidates.")
34
34
  .option("--candidate <id>", "Which finding to verify (ids from `feedback list`); default: the first.")
@@ -37,8 +37,8 @@ export function registerFeedbackCommands(parent, io) {
37
37
  feedback
38
38
  .command("issue")
39
39
  .description("Print Markdown for a public GitHub issue. Does not mutate GitHub.")
40
- .option("--run <id>", "Run id or latest pointer.", "latest")
41
- .option("--cwd <path>", "Target project directory.", ".")
40
+ .option("--run <id>", RUN_OPTION_DESCRIPTION, "latest")
41
+ .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
42
42
  .requiredOption("--repo <owner/repo>", "Repository slug used in rendered filing instructions.")
43
43
  .option("--format <format>", "Output format.", "markdown")
44
44
  .option("--analysis <id>", "Independent analysis version; use with --finding.")
@@ -49,8 +49,8 @@ export function registerFeedbackCommands(parent, io) {
49
49
  feedback
50
50
  .command("issue-url")
51
51
  .description("Print a prefilled public issue URL. Does not mutate GitHub.")
52
- .option("--run <id>", "Run id or latest pointer.", "latest")
53
- .option("--cwd <path>", "Target project directory.", ".")
52
+ .option("--run <id>", RUN_OPTION_DESCRIPTION, "latest")
53
+ .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
54
54
  .requiredOption("--repo <owner/repo>", "Repository slug used in the generated URL.")
55
55
  .option("--analysis <id>", "Independent analysis version; use with --finding.")
56
56
  .option("--finding <id>", "Finding within --analysis, separate from participant candidates.")
@@ -87,7 +87,7 @@ async function handleFeedbackIssue(io, options, command) {
87
87
  io.writeOut(result.issueMarkdown);
88
88
  }
89
89
  else {
90
- io.writeErr(formatFeedbackHuman(result));
90
+ writeHuman(command, io, formatFeedbackHuman(result));
91
91
  }
92
92
  io.setExitCode(result.ok ? 0 : 2);
93
93
  }
@@ -100,14 +100,13 @@ async function handleFeedbackIssueUrl(io, options, command) {
100
100
  io.writeOut(`${result.issueUrl}\n`);
101
101
  }
102
102
  else {
103
- io.writeErr(formatFeedbackHuman(result));
103
+ writeHuman(command, io, formatFeedbackHuman(result));
104
104
  }
105
105
  io.setExitCode(result.ok ? 0 : 2);
106
106
  }
107
107
  function formatFeedbackHuman(result) {
108
- if (!result.ok) {
109
- return `${result.error?.code}: ${result.error?.message}\n`;
110
- }
108
+ if (!result.ok)
109
+ return humanError(result.error);
111
110
  const candidates = result.candidates ?? [];
112
111
  const noCandidates = result.candidates !== undefined && candidates.length === 0;
113
112
  return ([
@@ -123,11 +122,11 @@ function formatFeedbackHuman(result) {
123
122
  ...(noCandidates
124
123
  ? [
125
124
  "candidates: none recorded",
126
- "With no candidates, feedback draft and feedback issue can generate a run-summary follow-up after share_ready verification.",
125
+ "With no candidates, feedback draft and feedback issue write a run-summary follow-up for a live run that verifies share_ready.",
127
126
  ...(result.draft ? [`summary: ${result.draft.summary}`] : []),
128
127
  ]
129
128
  : []),
130
- // Every finding the run produced, so the second and third are one flag away (#609).
129
+ // Every finding the run produced, so the second and third are one flag away.
131
130
  ...(candidates.length > 1 || (candidates.length === 1 && result.draft === undefined)
132
131
  ? [
133
132
  `candidates (${candidates.length}; choose one with --candidate <id>):`,
@@ -0,0 +1,4 @@
1
+ import type { Command } from "commander";
2
+ import { type CliIo } from "../io.js";
3
+ /** `humanish migrate`. */
4
+ export declare function registerMigrateCommand(parent: Command, io: CliIo): void;
@@ -0,0 +1,65 @@
1
+ import { migrateStudies } from "../../study/migrate.js";
2
+ import { CWD_OPTION_DESCRIPTION, JSON_OPTION_DESCRIPTION, wantsJson, writeResult, } from "../io.js";
3
+ function formatValue(value) {
4
+ const text = JSON.stringify(value);
5
+ return text.length > 80 ? `${text.slice(0, 77)}...` : text;
6
+ }
7
+ /** Each file's source, destination, moved keys and dropped keys, printed before any write. */
8
+ function formatMigratePlan(files) {
9
+ const lines = [];
10
+ for (const file of files) {
11
+ if (file.action === "skip") {
12
+ lines.push(`${file.source}: already humanish.study.v3, skipped`);
13
+ continue;
14
+ }
15
+ const where = file.action === "move" ? `-> ${file.destination}` : "(rewritten in place)";
16
+ lines.push(`${file.source} ${where} (route: ${file.route})`);
17
+ if (file.moved.length > 0)
18
+ lines.push(` moved: ${file.moved.map((key) => `${key.from} -> ${key.to}`).join(", ")}`);
19
+ for (const key of file.dropped) {
20
+ lines.push(` dropped ${key.path}: ${formatValue(key.value)} (the ${file.route} route never reads it)`);
21
+ if (key.comments)
22
+ lines.push(` its comment: ${key.comments.replace(/\n/g, " ")}`);
23
+ }
24
+ }
25
+ return lines.length > 0 ? `${lines.join("\n")}\n` : "No study files to convert.\n";
26
+ }
27
+ function formatMigrateOutcome(result) {
28
+ if (result.error) {
29
+ const where = result.error.file ? ` ${result.error.file}` : "";
30
+ return `${result.error.code} (${result.error.phase})${where}: ${result.error.message}\n`;
31
+ }
32
+ const written = result.files.filter((file) => file.action !== "skip").length;
33
+ const files = written === 1 ? "1 study file" : `${written} study files`;
34
+ if (result.dryRun)
35
+ return `Dry run: nothing was written. ${files} would change.\n`;
36
+ return written === 0 ? "No v2 study files to convert.\n" : `Converted ${files}.\n`;
37
+ }
38
+ /** `humanish migrate`. */
39
+ export function registerMigrateCommand(parent, io) {
40
+ parent
41
+ .command("migrate")
42
+ .description("Convert humanish.lab.v2 study files to humanish.study.v3. A file under a labs/ directory moves to the matching studies/ directory; any other file is rewritten in place. An original that a failure leaves out of place is kept as <name>.v2.bak. Pass the files to convert; without any, the six study directories are scanned. Every destination, moved key and dropped key is printed before anything is written. A file that changes during the run is kept and listed.")
43
+ .summary("Convert v2 study files to v3.")
44
+ // The paths are read from the command's arguments without a declared argument, so the root
45
+ // --help row stays `migrate [options]` and fits its column; this command's own help shows them.
46
+ .usage("[options] [path...]")
47
+ .allowExcessArguments(true)
48
+ .option("--dry-run", "Print what would change and write nothing.")
49
+ .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
50
+ .option("--json", JSON_OPTION_DESCRIPTION)
51
+ .action(async (options, command) => {
52
+ const paths = command.args;
53
+ const json = wantsJson(command);
54
+ const result = await migrateStudies({
55
+ cwd: options.cwd,
56
+ paths,
57
+ dryRun: options.dryRun === true,
58
+ // The plan is printed before anything is written; with --json it goes to stderr, so stdout
59
+ // stays one JSON document.
60
+ onPlan: (files) => (json ? io.writeErr : io.writeOut)(formatMigratePlan(files)),
61
+ });
62
+ writeResult(command, io, result, formatMigrateOutcome);
63
+ io.setExitCode(result.ok ? 0 : 2);
64
+ });
65
+ }
@@ -1,4 +1,3 @@
1
1
  import { Command } from "commander";
2
2
  import { type CliIo } from "../io.js";
3
3
  export declare function registerObserveCommand(parent: Command, io: CliIo): void;
4
- export declare function registerServeCommand(parent: Command, io: CliIo): void;