@lannguyensi/harness 0.63.0 → 1.0.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 (702) hide show
  1. package/CHANGELOG.md +90 -0
  2. package/README.md +46 -42
  3. package/dist/cli/add/index.js +17 -21
  4. package/dist/cli/add/index.js.map +1 -1
  5. package/dist/cli/adopt/derive.d.ts +2 -2
  6. package/dist/cli/adopt/derive.js +2 -19
  7. package/dist/cli/adopt/derive.js.map +1 -1
  8. package/dist/cli/adopt/index.d.ts +1 -1
  9. package/dist/cli/adopt/index.js +1 -12
  10. package/dist/cli/adopt/index.js.map +1 -1
  11. package/dist/cli/apply/apply.d.ts +20 -35
  12. package/dist/cli/apply/apply.js +61 -136
  13. package/dist/cli/apply/apply.js.map +1 -1
  14. package/dist/cli/apply/generate-codex-config.js +10 -58
  15. package/dist/cli/apply/generate-codex-config.js.map +1 -1
  16. package/dist/cli/apply/generate-memory-index.js +1 -2
  17. package/dist/cli/apply/generate-memory-index.js.map +1 -1
  18. package/dist/cli/apply/generate-opencode-config.d.ts +2 -10
  19. package/dist/cli/apply/generate-opencode-config.js +74 -113
  20. package/dist/cli/apply/generate-opencode-config.js.map +1 -1
  21. package/dist/cli/apply/generate-settings.d.ts +11 -64
  22. package/dist/cli/apply/generate-settings.js +27 -132
  23. package/dist/cli/apply/generate-settings.js.map +1 -1
  24. package/dist/cli/apply/index.d.ts +1 -1
  25. package/dist/cli/apply/index.js +1 -1
  26. package/dist/cli/apply/index.js.map +1 -1
  27. package/dist/cli/apply/install-codex-config.d.ts +153 -1
  28. package/dist/cli/apply/install-codex-config.js +445 -70
  29. package/dist/cli/apply/install-codex-config.js.map +1 -1
  30. package/dist/cli/apply/next-steps.d.ts +7 -0
  31. package/dist/cli/apply/next-steps.js +13 -1
  32. package/dist/cli/apply/next-steps.js.map +1 -1
  33. package/dist/cli/bounded-stdin.d.ts +0 -23
  34. package/dist/cli/bounded-stdin.js +2 -49
  35. package/dist/cli/bounded-stdin.js.map +1 -1
  36. package/dist/cli/describe.d.ts +1 -1
  37. package/dist/cli/describe.js +0 -3
  38. package/dist/cli/describe.js.map +1 -1
  39. package/dist/cli/diff/engine.d.ts +0 -11
  40. package/dist/cli/diff/engine.js +1 -17
  41. package/dist/cli/diff/engine.js.map +1 -1
  42. package/dist/cli/diff/index.js +14 -25
  43. package/dist/cli/diff/index.js.map +1 -1
  44. package/dist/cli/doctor/claude-mcp.d.ts +4 -19
  45. package/dist/cli/doctor/claude-mcp.js +11 -22
  46. package/dist/cli/doctor/claude-mcp.js.map +1 -1
  47. package/dist/cli/doctor/codex.d.ts +12 -14
  48. package/dist/cli/doctor/codex.js +31 -144
  49. package/dist/cli/doctor/codex.js.map +1 -1
  50. package/dist/cli/doctor/format.js +23 -338
  51. package/dist/cli/doctor/format.js.map +1 -1
  52. package/dist/cli/doctor/hook-liveness.d.ts +56 -0
  53. package/dist/cli/doctor/hook-liveness.js +455 -0
  54. package/dist/cli/doctor/hook-liveness.js.map +1 -0
  55. package/dist/cli/doctor/index.d.ts +13 -87
  56. package/dist/cli/doctor/index.js +57 -705
  57. package/dist/cli/doctor/index.js.map +1 -1
  58. package/dist/cli/doctor/opencode.d.ts +2 -1
  59. package/dist/cli/doctor/opencode.js.map +1 -1
  60. package/dist/cli/doctor/types.d.ts +21 -378
  61. package/dist/cli/doctor/types.js.map +1 -1
  62. package/dist/cli/drain-stdio.d.ts +31 -0
  63. package/dist/cli/drain-stdio.js +76 -0
  64. package/dist/cli/drain-stdio.js.map +1 -0
  65. package/dist/cli/export.d.ts +3 -1
  66. package/dist/cli/export.js +7 -16
  67. package/dist/cli/export.js.map +1 -1
  68. package/dist/cli/gate/codex-disable.d.ts +29 -0
  69. package/dist/cli/gate/codex-disable.js +195 -0
  70. package/dist/cli/gate/codex-disable.js.map +1 -0
  71. package/dist/cli/gate/codex-enable.d.ts +41 -0
  72. package/dist/cli/gate/codex-enable.js +127 -0
  73. package/dist/cli/gate/codex-enable.js.map +1 -0
  74. package/dist/cli/gate/codex-snapshot.d.ts +208 -0
  75. package/dist/cli/gate/codex-snapshot.js +402 -0
  76. package/dist/cli/gate/codex-snapshot.js.map +1 -0
  77. package/dist/cli/gate/disable.d.ts +9 -0
  78. package/dist/cli/gate/disable.js +263 -28
  79. package/dist/cli/gate/disable.js.map +1 -1
  80. package/dist/cli/gate/enable.d.ts +26 -6
  81. package/dist/cli/gate/enable.js +152 -80
  82. package/dist/cli/gate/enable.js.map +1 -1
  83. package/dist/cli/gate/link-chain.d.ts +53 -0
  84. package/dist/cli/gate/link-chain.js +122 -0
  85. package/dist/cli/gate/link-chain.js.map +1 -0
  86. package/dist/cli/gate/snapshot.d.ts +289 -12
  87. package/dist/cli/gate/snapshot.js +481 -22
  88. package/dist/cli/gate/snapshot.js.map +1 -1
  89. package/dist/cli/index.d.ts +0 -9
  90. package/dist/cli/index.js +15 -2607
  91. package/dist/cli/index.js.map +1 -1
  92. package/dist/cli/init/composer.d.ts +3 -6
  93. package/dist/cli/init/composer.js +6 -370
  94. package/dist/cli/init/composer.js.map +1 -1
  95. package/dist/cli/init/dependencies.d.ts +1 -2
  96. package/dist/cli/init/dependencies.js +4 -80
  97. package/dist/cli/init/dependencies.js.map +1 -1
  98. package/dist/cli/init/detect.js +5 -4
  99. package/dist/cli/init/detect.js.map +1 -1
  100. package/dist/cli/init/interactive.d.ts +1 -23
  101. package/dist/cli/init/interactive.js +33 -247
  102. package/dist/cli/init/interactive.js.map +1 -1
  103. package/dist/cli/init/profiles.d.ts +2 -2
  104. package/dist/cli/init/profiles.js +51 -243
  105. package/dist/cli/init/profiles.js.map +1 -1
  106. package/dist/cli/init/templates.d.ts +2 -37
  107. package/dist/cli/init/templates.js +25 -1237
  108. package/dist/cli/init/templates.js.map +1 -1
  109. package/dist/cli/list.d.ts +1 -1
  110. package/dist/cli/list.js +1 -38
  111. package/dist/cli/list.js.map +1 -1
  112. package/dist/cli/loader.d.ts +15 -1
  113. package/dist/cli/loader.js +56 -39
  114. package/dist/cli/loader.js.map +1 -1
  115. package/dist/cli/main.js +7 -2
  116. package/dist/cli/main.js.map +1 -1
  117. package/dist/cli/migrate-home/index.js +2 -2
  118. package/dist/cli/migrate-home/index.js.map +1 -1
  119. package/dist/cli/pack/add.js +1 -1
  120. package/dist/cli/pack/add.js.map +1 -1
  121. package/dist/cli/pack/hook-bootstrap.d.ts +5 -164
  122. package/dist/cli/pack/hook-bootstrap.js +15 -291
  123. package/dist/cli/pack/hook-bootstrap.js.map +1 -1
  124. package/dist/cli/pack/hook-branch-protection.d.ts +28 -21
  125. package/dist/cli/pack/hook-branch-protection.js +365 -340
  126. package/dist/cli/pack/hook-branch-protection.js.map +1 -1
  127. package/dist/cli/pack/index.d.ts +0 -1
  128. package/dist/cli/pack/index.js +0 -1
  129. package/dist/cli/pack/index.js.map +1 -1
  130. package/dist/cli/pack/list.js +1 -6
  131. package/dist/cli/pack/list.js.map +1 -1
  132. package/dist/cli/pack/mutate.d.ts +7 -9
  133. package/dist/cli/pack/mutate.js +6 -9
  134. package/dist/cli/pack/mutate.js.map +1 -1
  135. package/dist/cli/pack/reseed.d.ts +2 -2
  136. package/dist/cli/pack/reseed.js +16 -22
  137. package/dist/cli/pack/reseed.js.map +1 -1
  138. package/dist/cli/register-gate-group.d.ts +5 -0
  139. package/dist/cli/register-gate-group.js +348 -0
  140. package/dist/cli/register-gate-group.js.map +1 -0
  141. package/dist/cli/register-inspect-group.d.ts +6 -0
  142. package/dist/cli/register-inspect-group.js +189 -0
  143. package/dist/cli/register-inspect-group.js.map +1 -0
  144. package/dist/cli/register-operator-lifecycle.d.ts +5 -0
  145. package/dist/cli/register-operator-lifecycle.js +20 -0
  146. package/dist/cli/register-operator-lifecycle.js.map +1 -0
  147. package/dist/cli/register-pack-group.d.ts +5 -0
  148. package/dist/cli/register-pack-group.js +134 -0
  149. package/dist/cli/register-pack-group.js.map +1 -0
  150. package/dist/cli/register-setup-group.d.ts +5 -0
  151. package/dist/cli/register-setup-group.js +495 -0
  152. package/dist/cli/register-setup-group.js.map +1 -0
  153. package/dist/cli/remove/index.d.ts +0 -14
  154. package/dist/cli/remove/index.js +2 -115
  155. package/dist/cli/remove/index.js.map +1 -1
  156. package/dist/cli/remove/mutate.d.ts +0 -2
  157. package/dist/cli/remove/mutate.js +1 -19
  158. package/dist/cli/remove/mutate.js.map +1 -1
  159. package/dist/cli/remove/register.d.ts +5 -0
  160. package/dist/cli/remove/register.js +25 -0
  161. package/dist/cli/remove/register.js.map +1 -0
  162. package/dist/cli/shell-quote.d.ts +7 -0
  163. package/dist/cli/shell-quote.js +17 -0
  164. package/dist/cli/shell-quote.js.map +1 -0
  165. package/dist/cli/uninstall/index.d.ts +4 -2
  166. package/dist/cli/uninstall/index.js +15 -7
  167. package/dist/cli/uninstall/index.js.map +1 -1
  168. package/dist/cli/uninstall/register.d.ts +5 -0
  169. package/dist/cli/uninstall/register.js +171 -0
  170. package/dist/cli/uninstall/register.js.map +1 -0
  171. package/dist/cli/uninstall/snapshot.d.ts +15 -0
  172. package/dist/cli/uninstall/snapshot.js +38 -0
  173. package/dist/cli/uninstall/snapshot.js.map +1 -1
  174. package/dist/cli/validate/checks.d.ts +0 -77
  175. package/dist/cli/validate/checks.js +3 -1049
  176. package/dist/cli/validate/checks.js.map +1 -1
  177. package/dist/cli/validate/index.js +19 -15
  178. package/dist/cli/validate/index.js.map +1 -1
  179. package/dist/index.d.ts +0 -3
  180. package/dist/index.js +0 -3
  181. package/dist/index.js.map +1 -1
  182. package/dist/io/claude-mcp.d.ts +1 -1
  183. package/dist/io/claude-mcp.js +27 -14
  184. package/dist/io/claude-mcp.js.map +1 -1
  185. package/dist/io/harness-lock.js +2 -2
  186. package/dist/io/harness-lock.js.map +1 -1
  187. package/dist/io/lock.d.ts +0 -26
  188. package/dist/io/lock.js +10 -27
  189. package/dist/io/lock.js.map +1 -1
  190. package/dist/io/merge-settings.js +6 -4
  191. package/dist/io/merge-settings.js.map +1 -1
  192. package/dist/io/project-name.d.ts +22 -39
  193. package/dist/io/project-name.js +25 -42
  194. package/dist/io/project-name.js.map +1 -1
  195. package/dist/io/read-regular-file.d.ts +103 -40
  196. package/dist/io/read-regular-file.js +196 -35
  197. package/dist/io/read-regular-file.js.map +1 -1
  198. package/dist/io/restart-hints.js +3 -6
  199. package/dist/io/restart-hints.js.map +1 -1
  200. package/dist/io/version-compare.d.ts +1 -3
  201. package/dist/io/version-compare.js +1 -3
  202. package/dist/io/version-compare.js.map +1 -1
  203. package/dist/io/write-regular-file.d.ts +30 -0
  204. package/dist/io/write-regular-file.js +85 -0
  205. package/dist/io/write-regular-file.js.map +1 -0
  206. package/dist/overrides/index.d.ts +1 -0
  207. package/dist/overrides/index.js +1 -0
  208. package/dist/overrides/index.js.map +1 -1
  209. package/dist/overrides/merge-layers.d.ts +43 -0
  210. package/dist/overrides/merge-layers.js +76 -0
  211. package/dist/overrides/merge-layers.js.map +1 -0
  212. package/dist/overrides/merge.d.ts +16 -0
  213. package/dist/overrides/merge.js +21 -8
  214. package/dist/overrides/merge.js.map +1 -1
  215. package/dist/policy-packs/builtin/branch-protection-runtime.d.ts +4 -69
  216. package/dist/policy-packs/builtin/branch-protection-runtime.js +12 -84
  217. package/dist/policy-packs/builtin/branch-protection-runtime.js.map +1 -1
  218. package/dist/policy-packs/builtin/branch-protection.d.ts +7 -30
  219. package/dist/policy-packs/builtin/branch-protection.js +56 -89
  220. package/dist/policy-packs/builtin/branch-protection.js.map +1 -1
  221. package/dist/policy-packs/config-check.d.ts +7 -5
  222. package/dist/policy-packs/config-check.js +2 -2
  223. package/dist/policy-packs/config-check.js.map +1 -1
  224. package/dist/policy-packs/expand.d.ts +1 -3
  225. package/dist/policy-packs/expand.js +5 -42
  226. package/dist/policy-packs/expand.js.map +1 -1
  227. package/dist/policy-packs/index.d.ts +3 -3
  228. package/dist/policy-packs/index.js +2 -2
  229. package/dist/policy-packs/index.js.map +1 -1
  230. package/dist/policy-packs/registry.d.ts +9 -38
  231. package/dist/policy-packs/registry.js +5 -65
  232. package/dist/policy-packs/registry.js.map +1 -1
  233. package/dist/policy-packs/runtime.d.ts +0 -4
  234. package/dist/policy-packs/runtime.js +9 -22
  235. package/dist/policy-packs/runtime.js.map +1 -1
  236. package/dist/policy-packs/types.d.ts +0 -19
  237. package/dist/policy-packs/ux-compare.d.ts +1 -11
  238. package/dist/policy-packs/ux-compare.js +6 -42
  239. package/dist/policy-packs/ux-compare.js.map +1 -1
  240. package/dist/policy-packs/ux-drift-check.d.ts +5 -5
  241. package/dist/policy-packs/ux-drift-check.js +17 -22
  242. package/dist/policy-packs/ux-drift-check.js.map +1 -1
  243. package/dist/policy-packs/version-check.d.ts +5 -26
  244. package/dist/policy-packs/version-check.js +19 -74
  245. package/dist/policy-packs/version-check.js.map +1 -1
  246. package/dist/probes/memory.d.ts +1 -1
  247. package/dist/probes/memory.js +1 -1
  248. package/dist/probes/memory.js.map +1 -1
  249. package/dist/runtime/agent-facing.d.ts +9 -0
  250. package/dist/runtime/agent-facing.js +28 -14
  251. package/dist/runtime/agent-facing.js.map +1 -1
  252. package/dist/runtime/bounded-text.d.ts +15 -0
  253. package/dist/runtime/bounded-text.js +27 -0
  254. package/dist/runtime/bounded-text.js.map +1 -0
  255. package/dist/runtime/git-branch.d.ts +125 -0
  256. package/dist/runtime/git-branch.js +381 -0
  257. package/dist/runtime/git-branch.js.map +1 -0
  258. package/dist/runtime/hermetic-spawn-guard.d.ts +2 -2
  259. package/dist/runtime/hermetic-spawn-guard.js +24 -34
  260. package/dist/runtime/hermetic-spawn-guard.js.map +1 -1
  261. package/dist/runtime/home-dir.js +3 -2
  262. package/dist/runtime/home-dir.js.map +1 -1
  263. package/dist/runtime/tool-name-aliases.d.ts +0 -6
  264. package/dist/runtime/tool-name-aliases.js +5 -18
  265. package/dist/runtime/tool-name-aliases.js.map +1 -1
  266. package/dist/schema/grounding.d.ts +7 -54
  267. package/dist/schema/grounding.js +10 -12
  268. package/dist/schema/grounding.js.map +1 -1
  269. package/dist/schema/hooks.d.ts +39 -136
  270. package/dist/schema/hooks.js +3 -6
  271. package/dist/schema/hooks.js.map +1 -1
  272. package/dist/schema/index.d.ts +114 -3828
  273. package/dist/schema/index.js +41 -80
  274. package/dist/schema/index.js.map +1 -1
  275. package/dist/schema/memory.d.ts +54 -131
  276. package/dist/schema/memory.js +2 -2
  277. package/dist/schema/memory.js.map +1 -1
  278. package/dist/schema/policy-packs.d.ts +3 -45
  279. package/dist/schema/policy-packs.js +7 -13
  280. package/dist/schema/policy-packs.js.map +1 -1
  281. package/dist/schema/policy-ux.d.ts +7 -0
  282. package/dist/schema/policy-ux.js +18 -0
  283. package/dist/schema/policy-ux.js.map +1 -0
  284. package/dist/schema/removed-keys.d.ts +185 -0
  285. package/dist/schema/removed-keys.js +531 -0
  286. package/dist/schema/removed-keys.js.map +1 -0
  287. package/dist/schema/tools.d.ts +30 -268
  288. package/dist/schema/tools.js +4 -4
  289. package/dist/schema/tools.js.map +1 -1
  290. package/package.json +5 -16
  291. package/dist/cli/approve/branch-protection.d.ts +0 -69
  292. package/dist/cli/approve/branch-protection.js +0 -144
  293. package/dist/cli/approve/branch-protection.js.map +0 -1
  294. package/dist/cli/approve/risk.d.ts +0 -112
  295. package/dist/cli/approve/risk.js +0 -197
  296. package/dist/cli/approve/risk.js.map +0 -1
  297. package/dist/cli/approve/stdin-report.d.ts +0 -57
  298. package/dist/cli/approve/stdin-report.js +0 -145
  299. package/dist/cli/approve/stdin-report.js.map +0 -1
  300. package/dist/cli/approve/understanding.d.ts +0 -410
  301. package/dist/cli/approve/understanding.js +0 -996
  302. package/dist/cli/approve/understanding.js.map +0 -1
  303. package/dist/cli/audit.d.ts +0 -80
  304. package/dist/cli/audit.js +0 -252
  305. package/dist/cli/audit.js.map +0 -1
  306. package/dist/cli/delegate/index.d.ts +0 -76
  307. package/dist/cli/delegate/index.js +0 -443
  308. package/dist/cli/delegate/index.js.map +0 -1
  309. package/dist/cli/doctor/auto-approve-mode.d.ts +0 -37
  310. package/dist/cli/doctor/auto-approve-mode.js +0 -80
  311. package/dist/cli/doctor/auto-approve-mode.js.map +0 -1
  312. package/dist/cli/doctor/bypass-without-auto-approve.d.ts +0 -38
  313. package/dist/cli/doctor/bypass-without-auto-approve.js +0 -95
  314. package/dist/cli/doctor/bypass-without-auto-approve.js.map +0 -1
  315. package/dist/cli/doctor/codex-config-drift.d.ts +0 -28
  316. package/dist/cli/doctor/codex-config-drift.js +0 -240
  317. package/dist/cli/doctor/codex-config-drift.js.map +0 -1
  318. package/dist/cli/doctor/rogue-ledger.d.ts +0 -53
  319. package/dist/cli/doctor/rogue-ledger.js +0 -153
  320. package/dist/cli/doctor/rogue-ledger.js.map +0 -1
  321. package/dist/cli/doctor/session-start-preflight-setup-version.d.ts +0 -83
  322. package/dist/cli/doctor/session-start-preflight-setup-version.js +0 -114
  323. package/dist/cli/doctor/session-start-preflight-setup-version.js.map +0 -1
  324. package/dist/cli/doctor/settings-drift.d.ts +0 -25
  325. package/dist/cli/doctor/settings-drift.js +0 -213
  326. package/dist/cli/doctor/settings-drift.js.map +0 -1
  327. package/dist/cli/doctor/toolchain-parity.d.ts +0 -63
  328. package/dist/cli/doctor/toolchain-parity.js +0 -154
  329. package/dist/cli/doctor/toolchain-parity.js.map +0 -1
  330. package/dist/cli/doctor/ug-auto-approvals.d.ts +0 -40
  331. package/dist/cli/doctor/ug-auto-approvals.js +0 -91
  332. package/dist/cli/doctor/ug-auto-approvals.js.map +0 -1
  333. package/dist/cli/doctor/ug-delegations.d.ts +0 -26
  334. package/dist/cli/doctor/ug-delegations.js +0 -121
  335. package/dist/cli/doctor/ug-delegations.js.map +0 -1
  336. package/dist/cli/doctor/ug-inflight.d.ts +0 -35
  337. package/dist/cli/doctor/ug-inflight.js +0 -57
  338. package/dist/cli/doctor/ug-inflight.js.map +0 -1
  339. package/dist/cli/doctor/understanding-mode-env.d.ts +0 -51
  340. package/dist/cli/doctor/understanding-mode-env.js +0 -98
  341. package/dist/cli/doctor/understanding-mode-env.js.map +0 -1
  342. package/dist/cli/dry-run.d.ts +0 -46
  343. package/dist/cli/dry-run.js +0 -250
  344. package/dist/cli/dry-run.js.map +0 -1
  345. package/dist/cli/event-input.d.ts +0 -28
  346. package/dist/cli/event-input.js +0 -73
  347. package/dist/cli/event-input.js.map +0 -1
  348. package/dist/cli/explain-action.d.ts +0 -20
  349. package/dist/cli/explain-action.js +0 -27
  350. package/dist/cli/explain-action.js.map +0 -1
  351. package/dist/cli/explain-policy.d.ts +0 -135
  352. package/dist/cli/explain-policy.js +0 -266
  353. package/dist/cli/explain-policy.js.map +0 -1
  354. package/dist/cli/explain.d.ts +0 -31
  355. package/dist/cli/explain.js +0 -159
  356. package/dist/cli/explain.js.map +0 -1
  357. package/dist/cli/gc/index.d.ts +0 -63
  358. package/dist/cli/gc/index.js +0 -566
  359. package/dist/cli/gc/index.js.map +0 -1
  360. package/dist/cli/pack/approve-escape.d.ts +0 -19
  361. package/dist/cli/pack/approve-escape.js +0 -190
  362. package/dist/cli/pack/approve-escape.js.map +0 -1
  363. package/dist/cli/pack/auto-approve-path.d.ts +0 -146
  364. package/dist/cli/pack/auto-approve-path.js +0 -462
  365. package/dist/cli/pack/auto-approve-path.js.map +0 -1
  366. package/dist/cli/pack/hook-codex-post-tool-use.d.ts +0 -25
  367. package/dist/cli/pack/hook-codex-post-tool-use.js +0 -160
  368. package/dist/cli/pack/hook-codex-post-tool-use.js.map +0 -1
  369. package/dist/cli/pack/hook-codex-pre-tool-use.d.ts +0 -48
  370. package/dist/cli/pack/hook-codex-pre-tool-use.js +0 -474
  371. package/dist/cli/pack/hook-codex-pre-tool-use.js.map +0 -1
  372. package/dist/cli/pack/hook-codex-stop.d.ts +0 -35
  373. package/dist/cli/pack/hook-codex-stop.js +0 -329
  374. package/dist/cli/pack/hook-codex-stop.js.map +0 -1
  375. package/dist/cli/pack/hook-codex-user-prompt-submit.d.ts +0 -24
  376. package/dist/cli/pack/hook-codex-user-prompt-submit.js +0 -93
  377. package/dist/cli/pack/hook-codex-user-prompt-submit.js.map +0 -1
  378. package/dist/cli/pack/hook-post-merge-gate-record.d.ts +0 -37
  379. package/dist/cli/pack/hook-post-merge-gate-record.js +0 -190
  380. package/dist/cli/pack/hook-post-merge-gate-record.js.map +0 -1
  381. package/dist/cli/pack/hook-post-merge-gate.d.ts +0 -34
  382. package/dist/cli/pack/hook-post-merge-gate.js +0 -277
  383. package/dist/cli/pack/hook-post-merge-gate.js.map +0 -1
  384. package/dist/cli/pack/hook-post-tool-use.d.ts +0 -45
  385. package/dist/cli/pack/hook-post-tool-use.js +0 -137
  386. package/dist/cli/pack/hook-post-tool-use.js.map +0 -1
  387. package/dist/cli/pack/hook-pre-tool-use.d.ts +0 -92
  388. package/dist/cli/pack/hook-pre-tool-use.js +0 -1328
  389. package/dist/cli/pack/hook-pre-tool-use.js.map +0 -1
  390. package/dist/cli/pack/hook-runtime-reality.d.ts +0 -63
  391. package/dist/cli/pack/hook-runtime-reality.js +0 -210
  392. package/dist/cli/pack/hook-runtime-reality.js.map +0 -1
  393. package/dist/cli/pack/hook-solution-acceptance-writeguard.d.ts +0 -32
  394. package/dist/cli/pack/hook-solution-acceptance-writeguard.js +0 -337
  395. package/dist/cli/pack/hook-solution-acceptance-writeguard.js.map +0 -1
  396. package/dist/cli/pack/hook-solution-acceptance.d.ts +0 -157
  397. package/dist/cli/pack/hook-solution-acceptance.js +0 -530
  398. package/dist/cli/pack/hook-solution-acceptance.js.map +0 -1
  399. package/dist/cli/pack/hook-stay-in-scope.d.ts +0 -37
  400. package/dist/cli/pack/hook-stay-in-scope.js +0 -128
  401. package/dist/cli/pack/hook-stay-in-scope.js.map +0 -1
  402. package/dist/cli/pack/hook-subagent-start.d.ts +0 -23
  403. package/dist/cli/pack/hook-subagent-start.js +0 -88
  404. package/dist/cli/pack/hook-subagent-start.js.map +0 -1
  405. package/dist/cli/pack/hook-subagent-stop.d.ts +0 -19
  406. package/dist/cli/pack/hook-subagent-stop.js +0 -41
  407. package/dist/cli/pack/hook-subagent-stop.js.map +0 -1
  408. package/dist/cli/pack/hook-track-active-claim.d.ts +0 -27
  409. package/dist/cli/pack/hook-track-active-claim.js +0 -275
  410. package/dist/cli/pack/hook-track-active-claim.js.map +0 -1
  411. package/dist/cli/pack/transcript-report-scan.d.ts +0 -71
  412. package/dist/cli/pack/transcript-report-scan.js +0 -359
  413. package/dist/cli/pack/transcript-report-scan.js.map +0 -1
  414. package/dist/cli/pack/understanding-report-schema-hint.d.ts +0 -26
  415. package/dist/cli/pack/understanding-report-schema-hint.js +0 -120
  416. package/dist/cli/pack/understanding-report-schema-hint.js.map +0 -1
  417. package/dist/cli/pack/upgrade.d.ts +0 -32
  418. package/dist/cli/pack/upgrade.js +0 -273
  419. package/dist/cli/pack/upgrade.js.map +0 -1
  420. package/dist/cli/pause/index.d.ts +0 -113
  421. package/dist/cli/pause/index.js +0 -251
  422. package/dist/cli/pause/index.js.map +0 -1
  423. package/dist/cli/pause-check.d.ts +0 -22
  424. package/dist/cli/pause-check.js +0 -54
  425. package/dist/cli/pause-check.js.map +0 -1
  426. package/dist/cli/policy/intercept.d.ts +0 -233
  427. package/dist/cli/policy/intercept.js +0 -1020
  428. package/dist/cli/policy/intercept.js.map +0 -1
  429. package/dist/cli/policy/risk-envelope-enrichment.d.ts +0 -40
  430. package/dist/cli/policy/risk-envelope-enrichment.js +0 -108
  431. package/dist/cli/policy/risk-envelope-enrichment.js.map +0 -1
  432. package/dist/cli/record/index.d.ts +0 -81
  433. package/dist/cli/record/index.js +0 -348
  434. package/dist/cli/record/index.js.map +0 -1
  435. package/dist/cli/resolve-env.d.ts +0 -32
  436. package/dist/cli/resolve-env.js +0 -47
  437. package/dist/cli/resolve-env.js.map +0 -1
  438. package/dist/cli/session-export/index.d.ts +0 -46
  439. package/dist/cli/session-export/index.js +0 -169
  440. package/dist/cli/session-export/index.js.map +0 -1
  441. package/dist/cli/session-export/redact.d.ts +0 -22
  442. package/dist/cli/session-export/redact.js +0 -47
  443. package/dist/cli/session-export/redact.js.map +0 -1
  444. package/dist/cli/session-export/transcript.d.ts +0 -24
  445. package/dist/cli/session-export/transcript.js +0 -164
  446. package/dist/cli/session-export/transcript.js.map +0 -1
  447. package/dist/cli/session-start/branch-check.d.ts +0 -18
  448. package/dist/cli/session-start/branch-check.js +0 -140
  449. package/dist/cli/session-start/branch-check.js.map +0 -1
  450. package/dist/cli/session-start/index.d.ts +0 -121
  451. package/dist/cli/session-start/index.js +0 -591
  452. package/dist/cli/session-start/index.js.map +0 -1
  453. package/dist/cli/session-start/shared-options.d.ts +0 -103
  454. package/dist/cli/session-start/shared-options.js +0 -107
  455. package/dist/cli/session-start/shared-options.js.map +0 -1
  456. package/dist/cli/session-start/stale-base-check.d.ts +0 -46
  457. package/dist/cli/session-start/stale-base-check.js +0 -352
  458. package/dist/cli/session-start/stale-base-check.js.map +0 -1
  459. package/dist/cli/session-start/toolchain-parity.d.ts +0 -267
  460. package/dist/cli/session-start/toolchain-parity.js +0 -797
  461. package/dist/cli/session-start/toolchain-parity.js.map +0 -1
  462. package/dist/cli/smoke/assertions.d.ts +0 -46
  463. package/dist/cli/smoke/assertions.js +0 -170
  464. package/dist/cli/smoke/assertions.js.map +0 -1
  465. package/dist/cli/smoke/index.d.ts +0 -76
  466. package/dist/cli/smoke/index.js +0 -245
  467. package/dist/cli/smoke/index.js.map +0 -1
  468. package/dist/cli/smoke/runner.d.ts +0 -55
  469. package/dist/cli/smoke/runner.js +0 -134
  470. package/dist/cli/smoke/runner.js.map +0 -1
  471. package/dist/cli/smoke/stream-parser.d.ts +0 -65
  472. package/dist/cli/smoke/stream-parser.js +0 -115
  473. package/dist/cli/smoke/stream-parser.js.map +0 -1
  474. package/dist/cli/test-risk.d.ts +0 -26
  475. package/dist/cli/test-risk.js +0 -34
  476. package/dist/cli/test-risk.js.map +0 -1
  477. package/dist/io/display-path.d.ts +0 -11
  478. package/dist/io/display-path.js +0 -29
  479. package/dist/io/display-path.js.map +0 -1
  480. package/dist/io/duration.d.ts +0 -5
  481. package/dist/io/duration.js +0 -50
  482. package/dist/io/duration.js.map +0 -1
  483. package/dist/io/extract.d.ts +0 -79
  484. package/dist/io/extract.js +0 -226
  485. package/dist/io/extract.js.map +0 -1
  486. package/dist/io/ledger-record.d.ts +0 -83
  487. package/dist/io/ledger-record.js +0 -301
  488. package/dist/io/ledger-record.js.map +0 -1
  489. package/dist/io/read-json-dir-entries.d.ts +0 -36
  490. package/dist/io/read-json-dir-entries.js +0 -48
  491. package/dist/io/read-json-dir-entries.js.map +0 -1
  492. package/dist/io/safe-json-parse.d.ts +0 -5
  493. package/dist/io/safe-json-parse.js +0 -21
  494. package/dist/io/safe-json-parse.js.map +0 -1
  495. package/dist/policies/index.d.ts +0 -5
  496. package/dist/policies/index.js +0 -6
  497. package/dist/policies/index.js.map +0 -1
  498. package/dist/policies/ledger-client.d.ts +0 -113
  499. package/dist/policies/ledger-client.js +0 -500
  500. package/dist/policies/ledger-client.js.map +0 -1
  501. package/dist/policies/producers.d.ts +0 -12
  502. package/dist/policies/producers.js +0 -61
  503. package/dist/policies/producers.js.map +0 -1
  504. package/dist/policies/requires.d.ts +0 -75
  505. package/dist/policies/requires.js +0 -240
  506. package/dist/policies/requires.js.map +0 -1
  507. package/dist/policies/timestamp.d.ts +0 -14
  508. package/dist/policies/timestamp.js +0 -36
  509. package/dist/policies/timestamp.js.map +0 -1
  510. package/dist/policy-packs/builtin/permission-profiles.d.ts +0 -11
  511. package/dist/policy-packs/builtin/permission-profiles.js +0 -74
  512. package/dist/policy-packs/builtin/permission-profiles.js.map +0 -1
  513. package/dist/policy-packs/builtin/post-merge-gate-runtime.d.ts +0 -286
  514. package/dist/policy-packs/builtin/post-merge-gate-runtime.js +0 -397
  515. package/dist/policy-packs/builtin/post-merge-gate-runtime.js.map +0 -1
  516. package/dist/policy-packs/builtin/post-merge-gate.d.ts +0 -56
  517. package/dist/policy-packs/builtin/post-merge-gate.js +0 -347
  518. package/dist/policy-packs/builtin/post-merge-gate.js.map +0 -1
  519. package/dist/policy-packs/builtin/solution-acceptance-reconnect.d.ts +0 -50
  520. package/dist/policy-packs/builtin/solution-acceptance-reconnect.js +0 -151
  521. package/dist/policy-packs/builtin/solution-acceptance-reconnect.js.map +0 -1
  522. package/dist/policy-packs/builtin/solution-acceptance-runtime.d.ts +0 -323
  523. package/dist/policy-packs/builtin/solution-acceptance-runtime.js +0 -672
  524. package/dist/policy-packs/builtin/solution-acceptance-runtime.js.map +0 -1
  525. package/dist/policy-packs/builtin/solution-acceptance.d.ts +0 -45
  526. package/dist/policy-packs/builtin/solution-acceptance.js +0 -226
  527. package/dist/policy-packs/builtin/solution-acceptance.js.map +0 -1
  528. package/dist/policy-packs/builtin/understanding-before-execution/active-claim.d.ts +0 -25
  529. package/dist/policy-packs/builtin/understanding-before-execution/active-claim.js +0 -94
  530. package/dist/policy-packs/builtin/understanding-before-execution/active-claim.js.map +0 -1
  531. package/dist/policy-packs/builtin/understanding-before-execution/auto-approve-default.d.ts +0 -35
  532. package/dist/policy-packs/builtin/understanding-before-execution/auto-approve-default.js +0 -86
  533. package/dist/policy-packs/builtin/understanding-before-execution/auto-approve-default.js.map +0 -1
  534. package/dist/policy-packs/builtin/understanding-before-execution/auto-approve.d.ts +0 -210
  535. package/dist/policy-packs/builtin/understanding-before-execution/auto-approve.js +0 -361
  536. package/dist/policy-packs/builtin/understanding-before-execution/auto-approve.js.map +0 -1
  537. package/dist/policy-packs/builtin/understanding-before-execution/delegation-markers.d.ts +0 -304
  538. package/dist/policy-packs/builtin/understanding-before-execution/delegation-markers.js +0 -734
  539. package/dist/policy-packs/builtin/understanding-before-execution/delegation-markers.js.map +0 -1
  540. package/dist/policy-packs/builtin/understanding-before-execution/expiry-reason.d.ts +0 -36
  541. package/dist/policy-packs/builtin/understanding-before-execution/expiry-reason.js +0 -73
  542. package/dist/policy-packs/builtin/understanding-before-execution/expiry-reason.js.map +0 -1
  543. package/dist/policy-packs/builtin/understanding-before-execution/index.d.ts +0 -19
  544. package/dist/policy-packs/builtin/understanding-before-execution/index.js +0 -83
  545. package/dist/policy-packs/builtin/understanding-before-execution/index.js.map +0 -1
  546. package/dist/policy-packs/builtin/understanding-before-execution/inflight-records.d.ts +0 -135
  547. package/dist/policy-packs/builtin/understanding-before-execution/inflight-records.js +0 -618
  548. package/dist/policy-packs/builtin/understanding-before-execution/inflight-records.js.map +0 -1
  549. package/dist/policy-packs/builtin/understanding-before-execution/ledger.d.ts +0 -25
  550. package/dist/policy-packs/builtin/understanding-before-execution/ledger.js +0 -56
  551. package/dist/policy-packs/builtin/understanding-before-execution/ledger.js.map +0 -1
  552. package/dist/policy-packs/builtin/understanding-before-execution/lifecycle.d.ts +0 -20
  553. package/dist/policy-packs/builtin/understanding-before-execution/lifecycle.js +0 -93
  554. package/dist/policy-packs/builtin/understanding-before-execution/lifecycle.js.map +0 -1
  555. package/dist/policy-packs/builtin/understanding-before-execution/markers.d.ts +0 -126
  556. package/dist/policy-packs/builtin/understanding-before-execution/markers.js +0 -245
  557. package/dist/policy-packs/builtin/understanding-before-execution/markers.js.map +0 -1
  558. package/dist/policy-packs/builtin/understanding-before-execution/measured-permission-modes.d.ts +0 -29
  559. package/dist/policy-packs/builtin/understanding-before-execution/measured-permission-modes.js +0 -82
  560. package/dist/policy-packs/builtin/understanding-before-execution/measured-permission-modes.js.map +0 -1
  561. package/dist/policy-packs/builtin/understanding-before-execution/permission-mode-observations.d.ts +0 -71
  562. package/dist/policy-packs/builtin/understanding-before-execution/permission-mode-observations.js +0 -175
  563. package/dist/policy-packs/builtin/understanding-before-execution/permission-mode-observations.js.map +0 -1
  564. package/dist/policy-packs/builtin/understanding-before-execution/persisted-reports.d.ts +0 -620
  565. package/dist/policy-packs/builtin/understanding-before-execution/persisted-reports.js +0 -1047
  566. package/dist/policy-packs/builtin/understanding-before-execution/persisted-reports.js.map +0 -1
  567. package/dist/policy-packs/builtin/understanding-before-execution/post-tool-use-boundary.d.ts +0 -128
  568. package/dist/policy-packs/builtin/understanding-before-execution/post-tool-use-boundary.js +0 -213
  569. package/dist/policy-packs/builtin/understanding-before-execution/post-tool-use-boundary.js.map +0 -1
  570. package/dist/policy-packs/builtin/understanding-before-execution/stay-in-scope-config.d.ts +0 -129
  571. package/dist/policy-packs/builtin/understanding-before-execution/stay-in-scope-config.js +0 -166
  572. package/dist/policy-packs/builtin/understanding-before-execution/stay-in-scope-config.js.map +0 -1
  573. package/dist/policy-packs/builtin/understanding-before-execution/task-markers.d.ts +0 -164
  574. package/dist/policy-packs/builtin/understanding-before-execution/task-markers.js +0 -275
  575. package/dist/policy-packs/builtin/understanding-before-execution/task-markers.js.map +0 -1
  576. package/dist/policy-packs/builtin/understanding-before-execution-runtime.d.ts +0 -1
  577. package/dist/policy-packs/builtin/understanding-before-execution-runtime.js +0 -10
  578. package/dist/policy-packs/builtin/understanding-before-execution-runtime.js.map +0 -1
  579. package/dist/policy-packs/builtin/understanding-before-execution.d.ts +0 -526
  580. package/dist/policy-packs/builtin/understanding-before-execution.js +0 -1074
  581. package/dist/policy-packs/builtin/understanding-before-execution.js.map +0 -1
  582. package/dist/policy-packs/permission-translator.d.ts +0 -9
  583. package/dist/policy-packs/permission-translator.js +0 -76
  584. package/dist/policy-packs/permission-translator.js.map +0 -1
  585. package/dist/runtime/action-envelope.d.ts +0 -64
  586. package/dist/runtime/action-envelope.js +0 -46
  587. package/dist/runtime/action-envelope.js.map +0 -1
  588. package/dist/runtime/approval-signing.d.ts +0 -111
  589. package/dist/runtime/approval-signing.js +0 -384
  590. package/dist/runtime/approval-signing.js.map +0 -1
  591. package/dist/runtime/bash-match-facts.d.ts +0 -60
  592. package/dist/runtime/bash-match-facts.js +0 -196
  593. package/dist/runtime/bash-match-facts.js.map +0 -1
  594. package/dist/runtime/bash-match-registry.d.ts +0 -112
  595. package/dist/runtime/bash-match-registry.js +0 -406
  596. package/dist/runtime/bash-match-registry.js.map +0 -1
  597. package/dist/runtime/bash-prefix-parse.d.ts +0 -31
  598. package/dist/runtime/bash-prefix-parse.js +0 -576
  599. package/dist/runtime/bash-prefix-parse.js.map +0 -1
  600. package/dist/runtime/command-normalize.d.ts +0 -658
  601. package/dist/runtime/command-normalize.js +0 -2410
  602. package/dist/runtime/command-normalize.js.map +0 -1
  603. package/dist/runtime/deletion-target-resolve.d.ts +0 -28
  604. package/dist/runtime/deletion-target-resolve.js +0 -1078
  605. package/dist/runtime/deletion-target-resolve.js.map +0 -1
  606. package/dist/runtime/destructive-shell-floor.d.ts +0 -19
  607. package/dist/runtime/destructive-shell-floor.js +0 -611
  608. package/dist/runtime/destructive-shell-floor.js.map +0 -1
  609. package/dist/runtime/environment-resolver.d.ts +0 -36
  610. package/dist/runtime/environment-resolver.js +0 -138
  611. package/dist/runtime/environment-resolver.js.map +0 -1
  612. package/dist/runtime/git-context.d.ts +0 -201
  613. package/dist/runtime/git-context.js +0 -422
  614. package/dist/runtime/git-context.js.map +0 -1
  615. package/dist/runtime/index.d.ts +0 -12
  616. package/dist/runtime/index.js +0 -13
  617. package/dist/runtime/index.js.map +0 -1
  618. package/dist/runtime/intercept.d.ts +0 -494
  619. package/dist/runtime/intercept.js +0 -1313
  620. package/dist/runtime/intercept.js.map +0 -1
  621. package/dist/runtime/kube-context.d.ts +0 -16
  622. package/dist/runtime/kube-context.js +0 -63
  623. package/dist/runtime/kube-context.js.map +0 -1
  624. package/dist/runtime/kubectl-target-parse.d.ts +0 -31
  625. package/dist/runtime/kubectl-target-parse.js +0 -249
  626. package/dist/runtime/kubectl-target-parse.js.map +0 -1
  627. package/dist/runtime/ledger-add.d.ts +0 -16
  628. package/dist/runtime/ledger-add.js +0 -150
  629. package/dist/runtime/ledger-add.js.map +0 -1
  630. package/dist/runtime/ledger-writer.d.ts +0 -27
  631. package/dist/runtime/ledger-writer.js +0 -46
  632. package/dist/runtime/ledger-writer.js.map +0 -1
  633. package/dist/runtime/pause-sentinel.d.ts +0 -60
  634. package/dist/runtime/pause-sentinel.js +0 -156
  635. package/dist/runtime/pause-sentinel.js.map +0 -1
  636. package/dist/runtime/pending-approval.d.ts +0 -23
  637. package/dist/runtime/pending-approval.js +0 -67
  638. package/dist/runtime/pending-approval.js.map +0 -1
  639. package/dist/runtime/read-only-bash.d.ts +0 -141
  640. package/dist/runtime/read-only-bash.js +0 -2204
  641. package/dist/runtime/read-only-bash.js.map +0 -1
  642. package/dist/runtime/recovery-git-commit.d.ts +0 -22
  643. package/dist/runtime/recovery-git-commit.js +0 -284
  644. package/dist/runtime/recovery-git-commit.js.map +0 -1
  645. package/dist/runtime/reject-malformed-session-id.d.ts +0 -8
  646. package/dist/runtime/reject-malformed-session-id.js +0 -16
  647. package/dist/runtime/reject-malformed-session-id.js.map +0 -1
  648. package/dist/runtime/risk-classifier.d.ts +0 -38
  649. package/dist/runtime/risk-classifier.js +0 -311
  650. package/dist/runtime/risk-classifier.js.map +0 -1
  651. package/dist/runtime/session-id.d.ts +0 -113
  652. package/dist/runtime/session-id.js +0 -193
  653. package/dist/runtime/session-id.js.map +0 -1
  654. package/dist/runtime/shell-word.d.ts +0 -62
  655. package/dist/runtime/shell-word.js +0 -410
  656. package/dist/runtime/shell-word.js.map +0 -1
  657. package/dist/runtime/task-providers/agent-tasks.d.ts +0 -103
  658. package/dist/runtime/task-providers/agent-tasks.js +0 -245
  659. package/dist/runtime/task-providers/agent-tasks.js.map +0 -1
  660. package/dist/runtime/when-eval.d.ts +0 -62
  661. package/dist/runtime/when-eval.js +0 -212
  662. package/dist/runtime/when-eval.js.map +0 -1
  663. package/dist/runtime/workflow-policies.d.ts +0 -207
  664. package/dist/runtime/workflow-policies.js +0 -596
  665. package/dist/runtime/workflow-policies.js.map +0 -1
  666. package/dist/schema/audit.d.ts +0 -71
  667. package/dist/schema/audit.js +0 -32
  668. package/dist/schema/audit.js.map +0 -1
  669. package/dist/schema/doctor.d.ts +0 -25
  670. package/dist/schema/doctor.js +0 -23
  671. package/dist/schema/doctor.js.map +0 -1
  672. package/dist/schema/environments.d.ts +0 -215
  673. package/dist/schema/environments.js +0 -101
  674. package/dist/schema/environments.js.map +0 -1
  675. package/dist/schema/extract.d.ts +0 -9
  676. package/dist/schema/extract.js +0 -86
  677. package/dist/schema/extract.js.map +0 -1
  678. package/dist/schema/permission-profiles.d.ts +0 -2292
  679. package/dist/schema/permission-profiles.js +0 -60
  680. package/dist/schema/permission-profiles.js.map +0 -1
  681. package/dist/schema/policies.d.ts +0 -974
  682. package/dist/schema/policies.js +0 -298
  683. package/dist/schema/policies.js.map +0 -1
  684. package/dist/schema/requires.d.ts +0 -131
  685. package/dist/schema/requires.js +0 -88
  686. package/dist/schema/requires.js.map +0 -1
  687. package/dist/schema/risk.d.ts +0 -144
  688. package/dist/schema/risk.js +0 -194
  689. package/dist/schema/risk.js.map +0 -1
  690. package/dist/schema/session-start-preflight.d.ts +0 -10
  691. package/dist/schema/session-start-preflight.js +0 -106
  692. package/dist/schema/session-start-preflight.js.map +0 -1
  693. package/dist/schema/stale-base-check.d.ts +0 -18
  694. package/dist/schema/stale-base-check.js +0 -37
  695. package/dist/schema/stale-base-check.js.map +0 -1
  696. package/dist/schema/toolchain-parity.d.ts +0 -21
  697. package/dist/schema/toolchain-parity.js +0 -48
  698. package/dist/schema/toolchain-parity.js.map +0 -1
  699. package/dist/schema/workflows.d.ts +0 -519
  700. package/dist/schema/workflows.js +0 -81
  701. package/dist/schema/workflows.js.map +0 -1
  702. package/scripts/runtime-reality-docker-probe.mjs +0 -71
@@ -0,0 +1,134 @@
1
+ import { packAdd, packList, packRemove, packReseed } from "./pack/index.js";
2
+ import { runPackHookBranchProtectionCli } from "./pack/hook-branch-protection.js";
3
+ import { HarnessExitError } from "./exit-codes.js";
4
+ export function registerPackGroup(program, io) {
5
+ const { stdout, stderr } = io;
6
+ // `harness pack` subtree (Phase 6 #3): managed CRUD over policy_packs[].
7
+ const packCmd = program
8
+ .command("pack")
9
+ .description("Manage policy_packs[] entries (add / remove / list / reseed)");
10
+ packCmd
11
+ .command("add <name>")
12
+ .description("Insert a new policy_packs entry. <name> must be a known builtin (see docs/policy-packs/).")
13
+ .option("--config <path>", "manifest path (default: ~/.harness/harness.yaml; legacy fallback ~/.claude/harness.yaml)")
14
+ .option("--source <src>", "pack source (default: builtin)")
15
+ .option("--description <text>", "operator-facing description")
16
+ .option("--disabled", "register as enabled: false")
17
+ .option("--dry-run", "print the unified diff and exit without writing")
18
+ .action(async (name, options) => {
19
+ const entry = { name };
20
+ if (options.source !== undefined)
21
+ entry.source = options.source;
22
+ if (options.disabled === true)
23
+ entry.enabled = false;
24
+ if (options.description !== undefined)
25
+ entry.description = options.description;
26
+ const result = await packAdd(entry, {
27
+ configPath: options.config,
28
+ dryRun: options.dryRun,
29
+ });
30
+ if (options.dryRun) {
31
+ stdout(result.diff);
32
+ return;
33
+ }
34
+ stdout(`added policy_packs entry ${JSON.stringify(result.name)} to ${result.path}\n`);
35
+ });
36
+ packCmd
37
+ .command("remove <name>")
38
+ .description("Remove a policy_packs entry. Refuses without --force when applied state " +
39
+ "is recorded in .last-apply.")
40
+ .option("--config <path>", "manifest path (default: ~/.harness/harness.yaml; legacy fallback ~/.claude/harness.yaml)")
41
+ .option("--dry-run", "print the unified diff and exit without writing")
42
+ .option("--force", "remove the manifest entry AND clean up the on-disk pack files + .last-apply state")
43
+ .action(async (name, options) => {
44
+ const result = await packRemove(name, {
45
+ configPath: options.config,
46
+ dryRun: options.dryRun,
47
+ force: options.force,
48
+ });
49
+ if (result.cleanedFiles.length > 0) {
50
+ stderr(`(forced cleanup — removed ${result.cleanedFiles.length} pack file(s) and pruned .last-apply)\n`);
51
+ }
52
+ if (options.dryRun) {
53
+ stdout(result.diff);
54
+ return;
55
+ }
56
+ stdout(`removed policy_packs entry ${JSON.stringify(result.name)} from ${result.path}\n`);
57
+ });
58
+ // `harness pack reseed <name>` (task 68b9ad9c): pull the shipped
59
+ // builtin template's config.ux into an already-
60
+ // installed manifest. Explicit-only, mirroring add/remove — never
61
+ // invoked by `apply`, so an upgrade never silently rewrites an
62
+ // operator's deliberate ux customisation. Paired with the `harness
63
+ // doctor` divergence warning (src/policy-packs/ux-drift-check.ts).
64
+ packCmd
65
+ .command("reseed <name>")
66
+ .description("Pull the shipped builtin template's config.ux for <name> into " +
67
+ "the manifest, preserving other config keys (protected_branches, ...). No-op if " +
68
+ "already up to date. See `harness doctor` for a divergence warning.")
69
+ .option("--config <path>", "manifest path (default: ~/.harness/harness.yaml; legacy fallback ~/.claude/harness.yaml)")
70
+ .option("--dry-run", "print the unified diff and exit without writing")
71
+ .action(async (name, options) => {
72
+ const result = await packReseed(name, {
73
+ configPath: options.config,
74
+ dryRun: options.dryRun,
75
+ });
76
+ if (result.fieldsChanged.length === 0) {
77
+ stdout(`policy_packs entry ${JSON.stringify(result.name)} already matches the shipped template; nothing to reseed.\n`);
78
+ return;
79
+ }
80
+ if (options.dryRun) {
81
+ stdout(result.diff);
82
+ return;
83
+ }
84
+ stdout(`reseeded ${result.fieldsChanged.map((f) => `config.${f}`).join(", ")} for policy_packs entry ${JSON.stringify(result.name)} in ${result.path}\n`);
85
+ });
86
+ // `harness pack hook` runtime sub-tree (Phase 6 #4): wired by pack hook
87
+ // contributions in settings.json; reads tool-event JSON from stdin and
88
+ // emits Claude Code deny JSON on block.
89
+ const packHookCmd = packCmd
90
+ .command("hook")
91
+ .description("Pack runtime hook entrypoints (called by Claude Code via settings.json)");
92
+ packHookCmd
93
+ .command("branch-protection")
94
+ .description("PreToolUse blocker for the branch-protection pack: read tool-event JSON from stdin, ask git " +
95
+ "(`git -C <dir> symbolic-ref -q HEAD`) for the branch of every directory the call writes into, " +
96
+ "and refuse when git names a protected branch or cannot answer. Claude Code gets a JSON deny " +
97
+ "envelope on stdout; `--runtime codex` exits 2 with the reason on stderr.")
98
+ .option("--config <path>", "manifest path (default: ~/.harness/harness.yaml; legacy fallback ~/.claude/harness.yaml)")
99
+ .option("--project <name>", "apply per-project overrides")
100
+ .option("--cwd <path>", "override cwd resolution (default: stdin event.cwd then process.cwd())")
101
+ .option("--runtime <name>", "block contract: claude-code (default) or codex")
102
+ .action(async (options) => {
103
+ const cliOpts = {};
104
+ if (options.config)
105
+ cliOpts.configPath = options.config;
106
+ if (options.project)
107
+ cliOpts.project = options.project;
108
+ if (options.cwd)
109
+ cliOpts.cwd = options.cwd;
110
+ if (options.runtime !== undefined)
111
+ cliOpts.runtime = options.runtime;
112
+ const result = await runPackHookBranchProtectionCli(cliOpts);
113
+ if (result.exitCode !== 0) {
114
+ throw new HarnessExitError("", result.exitCode);
115
+ }
116
+ });
117
+ packCmd
118
+ .command("list")
119
+ .description("Print policy_packs entries as a flat table or JSON.")
120
+ .option("--config <path>", "manifest path (default: ~/.harness/harness.yaml; legacy fallback ~/.claude/harness.yaml)")
121
+ .option("--project <name>", "apply per-project overrides")
122
+ .option("--enabled-only", "skip entries with enabled: false")
123
+ .option("--json", "emit JSON array instead of an aligned text table")
124
+ .action((options) => {
125
+ const result = packList({
126
+ ...(options.config !== undefined ? { configPath: options.config } : {}),
127
+ ...(options.project !== undefined ? { project: options.project } : {}),
128
+ ...(options.enabledOnly === true ? { enabledOnly: true } : {}),
129
+ ...(options.json === true ? { json: true } : {}),
130
+ });
131
+ stdout(result.output);
132
+ });
133
+ }
134
+ //# sourceMappingURL=register-pack-group.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-pack-group.js","sourceRoot":"","sources":["../../src/cli/register-pack-group.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC5E,OAAO,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AAClF,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,UAAU,iBAAiB,CAC/B,OAAgB,EAChB,EAAgE;IAEhE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IAC9B,yEAAyE;IACzE,MAAM,OAAO,GAAG,OAAO;SACpB,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,8DAA8D,CAAC,CAAC;IAE/E,OAAO;SACJ,OAAO,CAAC,YAAY,CAAC;SACrB,WAAW,CACV,2FAA2F,CAC5F;SACA,MAAM,CAAC,iBAAiB,EAAE,0FAA0F,CAAC;SACrH,MAAM,CAAC,gBAAgB,EAAE,gCAAgC,CAAC;SAC1D,MAAM,CAAC,sBAAsB,EAAE,6BAA6B,CAAC;SAC7D,MAAM,CAAC,YAAY,EAAE,4BAA4B,CAAC;SAClD,MAAM,CAAC,WAAW,EAAE,iDAAiD,CAAC;SACtE,MAAM,CACL,KAAK,EACH,IAAY,EACZ,OAMC,EACD,EAAE;QACF,MAAM,KAAK,GAAkC,EAAE,IAAI,EAAE,CAAC;QACtD,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;YAAE,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAChE,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI;YAAE,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;QACrD,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS;YAAE,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QAC/E,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE;YAClC,UAAU,EAAE,OAAO,CAAC,MAAM;YAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QACH,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACpB,OAAO;QACT,CAAC;QACD,MAAM,CAAC,4BAA4B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;IACxF,CAAC,CACF,CAAC;IAEJ,OAAO;SACJ,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CACV,0EAA0E;QACxE,6BAA6B,CAChC;SACA,MAAM,CAAC,iBAAiB,EAAE,0FAA0F,CAAC;SACrH,MAAM,CAAC,WAAW,EAAE,iDAAiD,CAAC;SACtE,MAAM,CACL,SAAS,EACT,mFAAmF,CACpF;SACA,MAAM,CACL,KAAK,EACH,IAAY,EACZ,OAA+D,EAC/D,EAAE;QACF,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE;YACpC,UAAU,EAAE,OAAO,CAAC,MAAM;YAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnC,MAAM,CACJ,6BAA6B,MAAM,CAAC,YAAY,CAAC,MAAM,yCAAyC,CACjG,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACpB,OAAO;QACT,CAAC;QACD,MAAM,CAAC,8BAA8B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;IAC5F,CAAC,CACF,CAAC;IAEJ,iEAAiE;IACjE,gDAAgD;IAChD,kEAAkE;IAClE,+DAA+D;IAC/D,mEAAmE;IACnE,mEAAmE;IACnE,OAAO;SACJ,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CACV,gEAAgE;QAC9D,iFAAiF;QACjF,oEAAoE,CACvE;SACA,MAAM,CAAC,iBAAiB,EAAE,0FAA0F,CAAC;SACrH,MAAM,CAAC,WAAW,EAAE,iDAAiD,CAAC;SACtE,MAAM,CACL,KAAK,EAAE,IAAY,EAAE,OAA8C,EAAE,EAAE;QACrE,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE;YACpC,UAAU,EAAE,OAAO,CAAC,MAAM;YAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtC,MAAM,CACJ,sBAAsB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,6DAA6D,CAC/G,CAAC;YACF,OAAO;QACT,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACpB,OAAO;QACT,CAAC;QACD,MAAM,CACJ,YAAY,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,2BAA2B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,IAAI,IAAI,CAClJ,CAAC;IACJ,CAAC,CACF,CAAC;IAEJ,wEAAwE;IACxE,uEAAuE;IACvE,wCAAwC;IACxC,MAAM,WAAW,GAAG,OAAO;SACxB,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,yEAAyE,CAAC,CAAC;IAE1F,WAAW;SACR,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CACV,8FAA8F;QAC5F,gGAAgG;QAChG,8FAA8F;QAC9F,0EAA0E,CAC7E;SACA,MAAM,CAAC,iBAAiB,EAAE,0FAA0F,CAAC;SACrH,MAAM,CAAC,kBAAkB,EAAE,6BAA6B,CAAC;SACzD,MAAM,CAAC,cAAc,EAAE,uEAAuE,CAAC;SAC/F,MAAM,CAAC,kBAAkB,EAAE,gDAAgD,CAAC;SAC5E,MAAM,CAAC,KAAK,EAAE,OAKd,EAAE,EAAE;QACH,MAAM,OAAO,GAAyD,EAAE,CAAC;QACzE,IAAI,OAAO,CAAC,MAAM;YAAE,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;QACxD,IAAI,OAAO,CAAC,OAAO;YAAE,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QACvD,IAAI,OAAO,CAAC,GAAG;YAAE,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;QAC3C,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS;YAAE,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QACrE,MAAM,MAAM,GAAG,MAAM,8BAA8B,CAAC,OAAO,CAAC,CAAC;QAC7D,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,gBAAgB,CAAC,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,qDAAqD,CAAC;SAClE,MAAM,CAAC,iBAAiB,EAAE,0FAA0F,CAAC;SACrH,MAAM,CAAC,kBAAkB,EAAE,6BAA6B,CAAC;SACzD,MAAM,CAAC,gBAAgB,EAAE,kCAAkC,CAAC;SAC5D,MAAM,CAAC,QAAQ,EAAE,kDAAkD,CAAC;SACpE,MAAM,CACL,CAAC,OAKA,EAAE,EAAE;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC;YACtB,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvE,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtE,GAAG,CAAC,OAAO,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACjD,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC,CACF,CAAC;AACN,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerSetupGroup(program: Command, io: {
3
+ stdout: (s: string) => void;
4
+ stderr: (s: string) => void;
5
+ }): void;
@@ -0,0 +1,495 @@
1
+ import * as path from "node:path";
2
+ import { add } from "./add/index.js";
3
+ import { adopt } from "./adopt/index.js";
4
+ import { apply, CODEX_CONFIG_BASENAME, CodexInstallRefusalError, DRIFT_HINT_MESSAGE, formatNextSteps, formatRuntimeLine, OPENCODE_CONFIG_BASENAME, SETTINGS_BASENAME, } from "./apply/index.js";
5
+ import { isRuntime, KNOWN_RUNTIMES } from "../policy-packs/index.js";
6
+ import { exportManifest } from "./export.js";
7
+ import { EX_FAIL, EX_USAGE, HarnessExitError } from "./exit-codes.js";
8
+ import { detect as detectInit } from "./init/detect.js";
9
+ import { init, isTemplate, KNOWN_TEMPLATES } from "./init/index.js";
10
+ import { runInteractive } from "./init/interactive.js";
11
+ export function registerSetupGroup(program, io) {
12
+ const { stdout, stderr } = io;
13
+ program
14
+ .command("init")
15
+ .description("Bootstrap a starter harness.yaml from a template")
16
+ .option("--template <name>", `template to instantiate: ${KNOWN_TEMPLATES.join(" | ")} (default: minimal)`)
17
+ .option("--force", "overwrite an existing manifest")
18
+ .option("--config <path>", "manifest path to write (default: ~/.harness/harness.yaml; legacy fallback ~/.claude/harness.yaml)")
19
+ .option("--probe", "skip writing, print a JSON snapshot of detected runtimes (Claude Code, Codex), the existing ~/.harness/harness.yaml (or legacy ~/.claude/harness.yaml), and MCP servers registered in the Claude Code user-scope registry (~/.claude.json, or $CLAUDE_CONFIG_DIR/.claude.json). Read-only.")
20
+ .option("--interactive", "run the guided wizard (detect environment, pick profile, preview + write). Mutually exclusive with --probe / --template.")
21
+ .action(async (options) => {
22
+ if (options.probe && options.interactive) {
23
+ throw new HarnessExitError("--probe and --interactive are mutually exclusive", EX_USAGE);
24
+ }
25
+ if (options.probe) {
26
+ if (options.template !== undefined || options.force || options.config !== undefined) {
27
+ throw new HarnessExitError("--probe is read-only; pass it without --template / --force / --config", EX_USAGE);
28
+ }
29
+ const result = await detectInit();
30
+ stdout(`${JSON.stringify(result, null, 2)}\n`);
31
+ return;
32
+ }
33
+ if (options.interactive) {
34
+ if (options.template !== undefined || options.config !== undefined) {
35
+ throw new HarnessExitError("--interactive owns its own template + path choices; do not combine with --template / --config", EX_USAGE);
36
+ }
37
+ // Thread --force into the wizard's forceOverwrite: without it
38
+ // an existing manifest makes the wizard re-prompt, and
39
+ // `harness init --interactive --force` looked like it should
40
+ // overwrite non-interactively but the flag never reached
41
+ // runInteractive (harness/418cebd4).
42
+ const r = await runInteractive({
43
+ stdout,
44
+ stderr,
45
+ ...(options.force ? { forceOverwrite: true } : {}),
46
+ });
47
+ if (r.aborted) {
48
+ return;
49
+ }
50
+ if (r.validateClean === false) {
51
+ throw new HarnessExitError(`manifest written but failed harness validate; see stderr for diagnostics`, EX_FAIL);
52
+ }
53
+ if (r.binResolutionClean === false) {
54
+ throw new HarnessExitError(`manifest written but one or more declared MCP/CLI binaries do not resolve on PATH; see stderr for diagnostics and remediation hints`, EX_FAIL);
55
+ }
56
+ return;
57
+ }
58
+ if (options.template !== undefined && !isTemplate(options.template)) {
59
+ throw new HarnessExitError(`unknown template "${options.template}"; expected one of ${KNOWN_TEMPLATES.join(", ")}`, EX_USAGE);
60
+ }
61
+ const result = await init({
62
+ template: options.template,
63
+ force: options.force,
64
+ configPath: options.config,
65
+ });
66
+ if (result.stderr)
67
+ stderr(result.stderr);
68
+ stdout(result.stdout);
69
+ });
70
+ const addCmd = program
71
+ .command("add")
72
+ .description("Insert a new entry into harness.yaml (managed mutation)");
73
+ function addCommonOptions(c) {
74
+ return c
75
+ .option("--config <path>", "manifest path (default: ~/.harness/harness.yaml; legacy fallback ~/.claude/harness.yaml)")
76
+ .option("--dry-run", "print the unified diff and exit without writing");
77
+ }
78
+ function parseBlocking(s) {
79
+ if (s === "false")
80
+ return false;
81
+ if (s === "soft" || s === "hard")
82
+ return s;
83
+ throw new HarnessExitError(`invalid --blocking value "${s}"; expected one of false, soft, hard`, EX_USAGE);
84
+ }
85
+ function parseIntFlag(s, label) {
86
+ const n = Number.parseInt(s, 10);
87
+ if (!Number.isFinite(n) || String(n) !== s.trim()) {
88
+ throw new HarnessExitError(`invalid ${label} value "${s}"; expected an integer`, EX_USAGE);
89
+ }
90
+ return n;
91
+ }
92
+ async function runAdd(action, opts) {
93
+ const result = await add(action, { configPath: opts.config, dryRun: opts.dryRun });
94
+ for (const w of result.warnings) {
95
+ stderr(`warning: ${w}\n`);
96
+ }
97
+ if (opts.dryRun) {
98
+ stdout(result.diff);
99
+ return;
100
+ }
101
+ stdout(`added ${result.type} ${JSON.stringify(result.name)} to ${result.path}\n`);
102
+ }
103
+ addCommonOptions(addCmd
104
+ .command("mcp <name>")
105
+ .description("Add an MCP server entry under tools.mcp[]")
106
+ .option("--command <cmd>", "argv-style command; comma-separated for multi-token")
107
+ .option("--health-verb <v>", "MCP verb to invoke for liveness")
108
+ .option("--health-timeout-ms <n>", "verb timeout in ms (default 5000 when --health-verb is set)")
109
+ .option("--enabled <bool>", "true|false (default true)")).action(async (name, options) => {
110
+ const command = options.command
111
+ ? options.command.includes(",")
112
+ ? options.command.split(",").map((s) => s.trim())
113
+ : options.command
114
+ : "";
115
+ if (!command) {
116
+ throw new HarnessExitError("harness add mcp: --command is required", EX_USAGE);
117
+ }
118
+ const entry = {
119
+ name,
120
+ command,
121
+ };
122
+ if (options.healthVerb !== undefined) {
123
+ const timeoutMs = options.healthTimeoutMs
124
+ ? parseIntFlag(options.healthTimeoutMs, "--health-timeout-ms")
125
+ : 5000;
126
+ entry.health = {
127
+ verb: options.healthVerb,
128
+ timeout_ms: timeoutMs,
129
+ };
130
+ }
131
+ if (options.enabled !== undefined) {
132
+ if (options.enabled !== "true" && options.enabled !== "false") {
133
+ throw new HarnessExitError(`invalid --enabled value "${options.enabled}"; expected true or false`, EX_USAGE);
134
+ }
135
+ entry.enabled = options.enabled === "true";
136
+ }
137
+ await runAdd({ type: "mcp", entry: entry }, { config: options.config, dryRun: options.dryRun });
138
+ });
139
+ addCommonOptions(addCmd
140
+ .command("cli <name>")
141
+ .description("Add a CLI tool entry under tools.cli[]")
142
+ .requiredOption("--binary <b>", "binary name on PATH or absolute path")
143
+ .option("--required", "validate fails if the binary is missing")
144
+ .option("--min-version <v>", "minimum semver")).action(async (name, options) => {
145
+ const entry = {
146
+ name,
147
+ binary: options.binary,
148
+ };
149
+ if (options.required)
150
+ entry.required = true;
151
+ if (options.minVersion !== undefined)
152
+ entry.min_version = options.minVersion;
153
+ await runAdd({ type: "cli", entry }, { config: options.config, dryRun: options.dryRun });
154
+ });
155
+ addCommonOptions(addCmd
156
+ .command("skill <name>")
157
+ .description("Enable a skill by name under tools.skills.enabled[]")).action(async (name, options) => {
158
+ await runAdd({ type: "skill", entry: name }, { config: options.config, dryRun: options.dryRun });
159
+ });
160
+ addCommonOptions(addCmd
161
+ .command("hook <name>")
162
+ .description("Add a hook entry under hooks[]")
163
+ .requiredOption("--event <e>", "runtime event (e.g. SessionStart, PreToolUse)")
164
+ .requiredOption("--command <c>", "shell command (executable path or script with args)")
165
+ .option("--match <r>", "tool-name regex filter (PreToolUse / PostToolUse only)")
166
+ .option("--blocking <m>", "false | soft | hard (default false)")
167
+ .option("--budget-ms <n>", "timeout in ms (default 30000)")).action(async (name, options) => {
168
+ const entry = {
169
+ name,
170
+ event: options.event,
171
+ command: options.command,
172
+ blocking: options.blocking !== undefined ? parseBlocking(options.blocking) : false,
173
+ };
174
+ if (options.match !== undefined)
175
+ entry.match = options.match;
176
+ if (options.budgetMs !== undefined) {
177
+ entry.budget_ms = parseIntFlag(options.budgetMs, "--budget-ms");
178
+ }
179
+ await runAdd({ type: "hook", entry }, { config: options.config, dryRun: options.dryRun });
180
+ });
181
+ program
182
+ .command("export")
183
+ .description("Emit the effective merged manifest as a single self-contained YAML " +
184
+ "(or JSON). --sanitize redacts /home/<user>/ paths and env values whose " +
185
+ "key looks credential-shaped.")
186
+ .option("--config <path>", "manifest path (default: ~/.harness/harness.yaml; legacy fallback ~/.claude/harness.yaml)")
187
+ .option("--project <name>", "apply per-project overrides for this project name")
188
+ .option("--sanitize", "redact /home/<user>/ paths and credential-shaped env values")
189
+ .option("--json", "emit JSON instead of YAML")
190
+ .option("-o, --output <file>", "write to <file> atomically instead of stdout")
191
+ .action((options) => {
192
+ const result = exportManifest({
193
+ configPath: options.config,
194
+ project: options.project,
195
+ sanitize: options.sanitize,
196
+ json: options.json,
197
+ outputPath: options.output,
198
+ });
199
+ for (const w of result.warnings) {
200
+ stderr(`warning: ${w}\n`);
201
+ }
202
+ if (result.wroteTo === null) {
203
+ stdout(result.output);
204
+ if (!result.output.endsWith("\n"))
205
+ stdout("\n");
206
+ }
207
+ else {
208
+ stderr(`wrote ${result.wroteTo}\n`);
209
+ }
210
+ });
211
+ program
212
+ .command("adopt <file>")
213
+ .description("Capture hand-edits into the manifest. Hooks are diffed against <file> " +
214
+ "(today: ~/.claude/settings.json). MCP servers are ALWAYS diffed " +
215
+ "against the effective Claude Code registry (top-level mcpServers in " +
216
+ "~/.claude.json, respecting CLAUDE_CONFIG_DIR) regardless of <file> — " +
217
+ "Claude Code does not read <file>'s mcpServers block at runtime. " +
218
+ "Prompts y/N before writing.")
219
+ .option("--config <path>", "manifest path (default: ~/.harness/harness.yaml; legacy fallback ~/.claude/harness.yaml)")
220
+ .option("--yes", "skip the confirmation prompt (for non-interactive use)")
221
+ .action(async (file, options) => {
222
+ const result = await adopt(file, { configPath: options.config, yes: options.yes });
223
+ if (result.deadSettingsMcpNames.length > 0) {
224
+ stderr(`⚠ ${file} has a dead \`mcpServers\` block (${result.deadSettingsMcpNames.join(", ")}); ` +
225
+ "Claude Code does not read this file for MCP registration — adopt diffed against the " +
226
+ "effective registry instead. Safe to remove by hand.\n");
227
+ }
228
+ if (result.registryReadError !== undefined) {
229
+ stderr(`⚠ could not read the Claude Code MCP registry: ${result.registryReadError}; ` +
230
+ "treated as empty for MCP drift purposes.\n");
231
+ }
232
+ if (result.outcome === "no-drift") {
233
+ stdout(`nothing to adopt (no drift between ${file} and ${result.manifestPath})\n`);
234
+ return;
235
+ }
236
+ if (result.outcome === "declined") {
237
+ stdout(`adoption declined; ${result.manifestPath} unchanged\n`);
238
+ return;
239
+ }
240
+ const parts = [];
241
+ if (result.hookDriftCount > 0) {
242
+ parts.push(`${result.hookDriftCount} hook${result.hookDriftCount === 1 ? "" : "s"}` +
243
+ ` (${result.adoptedNames.join(", ")})`);
244
+ }
245
+ if (result.mcpDriftCount > 0) {
246
+ const mcpFrag = `${result.mcpDriftCount} MCP server${result.mcpDriftCount === 1 ? "" : "s"}` +
247
+ ` (${result.adoptedMcpNames.join(", ")})`;
248
+ parts.push(result.replacedMcpNames.length > 0
249
+ ? `${mcpFrag}; replaced existing manifest entry for: ${result.replacedMcpNames.join(", ")}`
250
+ : mcpFrag);
251
+ }
252
+ stdout(`adopted ${parts.join(" + ")} from ${result.settingsPath} into ${result.manifestPath}\n`);
253
+ });
254
+ program
255
+ .command("apply")
256
+ .description("Regenerate harness.generated/ outputs (settings.json + MEMORY.md index) " +
257
+ "from the manifest. Refuses to overwrite hand-edits without --overwrite-drift; " +
258
+ "use `harness adopt <file>` to capture them back into the manifest instead.")
259
+ .option("--config <path>", "manifest path (default: ~/.harness/harness.yaml; legacy fallback ~/.claude/harness.yaml)")
260
+ .option("--project <name>", "apply per-project overrides for this project name")
261
+ .option("--dry-run", "print the would-be diff + restart hints; do not write")
262
+ .option("--overwrite-drift", "discard any on-disk hand-edits to harness.generated/ files (prompts for `yes`; pair with --yes for non-interactive runs)")
263
+ .option("--yes", "with --overwrite-drift, skip the confirmation prompt (for non-interactive use)")
264
+ .option("--strict-lock", "refuse with exit 1 (no write) when harness.lock asset drift is detected; dry-run wins")
265
+ .option("--target <path>", "additionally write the generated settings.json to <path> (e.g. .claude/settings.local.json); " +
266
+ "claude-code only: without --runtime it implies claude-code, with --runtime codex or opencode it is refused")
267
+ .option("--merge", "with --target, merge into an existing target file: replaces its `hooks` key, drops `mcpServers` entries an earlier apply wrote, preserves every other key")
268
+ .option("--force", "with --target, overwrite an existing target file (no merge)")
269
+ .option("--runtime <runtime>", `policy-pack adapter runtime (${KNOWN_RUNTIMES.join(" | ")}; default: claude-code with --target, ` +
270
+ "otherwise the runtime of the last apply (inferred from its files for an older record), " +
271
+ "or claude-code when there is none; --install follows the same default). " +
272
+ "Selects which adapter shape policy-pack hooks expand into and which artefacts apply writes. " +
273
+ "`codex` emits harness.generated/codex/config.toml in place of settings.json. " +
274
+ "`opencode` emits harness.generated/opencode/opencode.json (MCP servers only; not auto-installed).")
275
+ .option("--install", "with --runtime codex, merge the generated hook block into ~/.codex/config.toml")
276
+ .option("--codex-config <path>", "with --runtime codex --install, override the Codex config path (default ~/.codex/config.toml)")
277
+ .option("--quiet", "suppress the post-apply Next-steps hint")
278
+ .option("--json", "emit a structured JSON summary instead of prose (implies --quiet)")
279
+ .action(async (options) => {
280
+ let runtime;
281
+ if (options.runtime !== undefined) {
282
+ if (!isRuntime(options.runtime)) {
283
+ stderr(`unknown --runtime ${JSON.stringify(options.runtime)}; expected one of ${KNOWN_RUNTIMES.join(", ")}\n`);
284
+ throw new HarnessExitError("", EX_USAGE);
285
+ }
286
+ runtime = options.runtime;
287
+ }
288
+ // --json is documented as implying --quiet. Normalize early so any
289
+ // future fall-through path (or new prose branch) honors it without
290
+ // depending on the JSON early-return below as the only chokepoint.
291
+ if (options.json)
292
+ options.quiet = true;
293
+ // `apply()` throws `CodexInstallRefusalError` (rather than
294
+ // returning a refuse `outcome`, the way `target-exists-refuse` /
295
+ // `drift-refuse` do) for a codex-install refusal, because the
296
+ // refusal is detected deep inside `planCodexConfigInstall`, before
297
+ // an `ApplyResult` can be assembled. Catch it here so `--json`
298
+ // still gets a structured error on stdout the same way every
299
+ // other refusal does, instead of only the plain-text message
300
+ // `run()`'s top-level catch would otherwise print.
301
+ let result;
302
+ try {
303
+ result = await apply({
304
+ ...(options.config !== undefined ? { configPath: options.config } : {}),
305
+ ...(options.project !== undefined ? { project: options.project } : {}),
306
+ ...(options.dryRun ? { dryRun: true } : {}),
307
+ ...(options.overwriteDrift ? { overwriteDrift: true } : {}),
308
+ ...(options.yes ? { yes: true } : {}),
309
+ ...(options.strictLock ? { strictLock: true } : {}),
310
+ ...(options.target !== undefined ? { target: options.target } : {}),
311
+ ...(options.merge ? { merge: true } : {}),
312
+ ...(options.force ? { force: true } : {}),
313
+ ...(runtime !== undefined ? { runtime } : {}),
314
+ ...(options.install ? { installCodex: true } : {}),
315
+ ...(options.codexConfig !== undefined
316
+ ? { codexConfigPath: options.codexConfig }
317
+ : {}),
318
+ });
319
+ }
320
+ catch (err) {
321
+ if (err instanceof CodexInstallRefusalError && options.json) {
322
+ stdout(`${JSON.stringify({ outcome: "codex-install-refuse", configPath: err.configPath, error: err.message }, null, 2)}\n`);
323
+ throw new HarnessExitError("", EX_FAIL);
324
+ }
325
+ throw err;
326
+ }
327
+ if (options.json) {
328
+ // Machine-readable: one JSON object on stdout regardless of
329
+ // outcome. Refusals still set the non-zero exit below; consumers
330
+ // should check both `outcome` in the JSON and the process exit.
331
+ stdout(`${JSON.stringify(result, null, 2)}\n`);
332
+ if (result.outcome === "target-exists-refuse" ||
333
+ result.outcome === "lock-drift-refuse" ||
334
+ result.outcome === "drift-refuse") {
335
+ throw new HarnessExitError("", EX_FAIL);
336
+ }
337
+ return;
338
+ }
339
+ if (result.outcome === "target-exists-refuse") {
340
+ stderr(`target ${result.targetPath} exists; pass --merge to merge into it, or --force to overwrite\n`);
341
+ throw new HarnessExitError("", EX_FAIL);
342
+ }
343
+ if (result.outcome === "lock-drift-refuse") {
344
+ for (const d of result.lockDrift) {
345
+ if (d.reason === "missing") {
346
+ stderr(`asset drift detected: ${d.entry.path} missing since last apply\n`);
347
+ }
348
+ else {
349
+ stderr(`asset drift detected: ${d.entry.path} changed since last apply\n`);
350
+ }
351
+ }
352
+ stderr("--strict-lock: refusing to overwrite the lock; re-run without --strict-lock to acknowledge, or revert the upstream asset edit\n");
353
+ throw new HarnessExitError("", EX_FAIL);
354
+ }
355
+ if (result.outcome === "drift-refuse") {
356
+ for (const f of result.files) {
357
+ if (f.diff) {
358
+ stderr(`drift detected in ${f.path}:\n`);
359
+ stderr(f.diff);
360
+ if (!f.diff.endsWith("\n"))
361
+ stderr("\n");
362
+ }
363
+ }
364
+ stderr(`${DRIFT_HINT_MESSAGE}\n`);
365
+ throw new HarnessExitError("", EX_FAIL);
366
+ }
367
+ if (result.outcome === "drift-discarded") {
368
+ stdout("overwrite-drift declined; nothing written\n");
369
+ return;
370
+ }
371
+ const changedFiles = result.files.filter((f) => f.changed);
372
+ // Name a reused or switched runtime before the file list, in the
373
+ // dry-run and the real apply alike (agent-tasks b9e6d63c).
374
+ const runtimeLine = formatRuntimeLine(result);
375
+ if (runtimeLine !== null)
376
+ stdout(`${runtimeLine}\n`);
377
+ if (result.outcome === "no-changes") {
378
+ stdout("no changes\n");
379
+ }
380
+ else if (result.outcome === "would-apply") {
381
+ stdout(`would apply ${changedFiles.length} file(s):\n`);
382
+ for (const f of changedFiles) {
383
+ stdout(` ${f.path}\n`);
384
+ }
385
+ if (result.codexConfigInstall?.changed) {
386
+ stdout(` ${result.codexConfigInstall.configPath} (Codex install)\n`);
387
+ for (const id of result.codexConfigInstall.removedHookIds) {
388
+ stdout(` removing hook block: ${id}\n`);
389
+ }
390
+ for (const section of result.codexConfigInstall.foreignSectionsPreserved) {
391
+ stdout(` preserving foreign section: ${section}\n`);
392
+ }
393
+ }
394
+ }
395
+ else {
396
+ stdout(`applied ${changedFiles.length} file(s):\n`);
397
+ for (const f of changedFiles) {
398
+ stdout(` ${f.path}\n`);
399
+ }
400
+ if (result.targetPath && (result.targetWritten || result.targetInSync)) {
401
+ if (result.targetWritten) {
402
+ if (result.targetMergeSummary) {
403
+ stdout(`${result.targetMergeSummary}\n`);
404
+ }
405
+ else {
406
+ stdout(`wrote target: ${result.targetPath}\n`);
407
+ }
408
+ }
409
+ else {
410
+ // Idempotent re-apply: the merge was a no-op because the
411
+ // target already held the merged content. Report it as
412
+ // success, not silence.
413
+ stdout(`target already in sync: ${result.targetPath}\n`);
414
+ }
415
+ }
416
+ if (result.codexConfigInstall?.written) {
417
+ stdout(`${result.codexConfigInstall.summary}\n`);
418
+ for (const id of result.codexConfigInstall.removedHookIds) {
419
+ stdout(` removed hook block: ${id}\n`);
420
+ }
421
+ for (const section of result.codexConfigInstall.foreignSectionsPreserved) {
422
+ stdout(` preserved foreign section: ${section}\n`);
423
+ }
424
+ if (result.codexConfigInstall.backupPath) {
425
+ stdout(`backup written to ${result.codexConfigInstall.backupPath}\n`);
426
+ }
427
+ for (const retired of result.codexConfigInstall.supersededSnapshots ?? []) {
428
+ stdout(`retired gate snapshot as ${retired}: the install replaced the hooks block it was taken from\n`);
429
+ }
430
+ }
431
+ stdout(`harness.lock written to ${result.lockPath}\n`);
432
+ if (!options.quiet) {
433
+ // `formatNextSteps` collapses to the single "wired into ..."
434
+ // line when it receives `targetPath`. Pass it whenever the
435
+ // target ended this run in sync — written this run, OR
436
+ // already byte-identical (`targetInSync`). Gating on
437
+ // `targetWritten` alone misclassified an idempotent
438
+ // re-apply as "nothing is wired" and looped the operator
439
+ // through redundant apply commands.
440
+ // `anyChanged` softens the no-target lede when the generated
441
+ // manifest is already up to date (avoids over-claiming
442
+ // "nothing is wired" against operators who wired a target
443
+ // on a previous run).
444
+ const generatedSettingsPath = path.join(result.generatedDir, SETTINGS_BASENAME);
445
+ const codexConfigPath = path.join(result.generatedDir, CODEX_CONFIG_BASENAME);
446
+ const opencodeConfigPath = path.join(result.generatedDir, OPENCODE_CONFIG_BASENAME);
447
+ const anyChanged = result.files.some((f) => f.changed);
448
+ stdout(formatNextSteps({
449
+ generatedSettingsPath,
450
+ codexConfigPath,
451
+ opencodeConfigPath,
452
+ anyChanged,
453
+ runtime: result.runtime,
454
+ ...(options.codexConfig !== undefined ? { codexInstallTarget: options.codexConfig } : {}),
455
+ ...((result.targetWritten || result.targetInSync) && result.targetPath
456
+ ? { targetPath: result.targetPath }
457
+ : {}),
458
+ // Pass the --install outcome through whenever one was
459
+ // requested this run (written or a no-op), so the codex
460
+ // lede reflects reality instead of always claiming
461
+ // "nothing is installed yet".
462
+ ...(result.codexConfigInstall !== undefined
463
+ ? {
464
+ codexInstall: {
465
+ configPath: result.codexConfigInstall.configPath,
466
+ written: result.codexConfigInstall.written,
467
+ ...(result.codexConfigInstall.backupPath !== undefined
468
+ ? { backupPath: result.codexConfigInstall.backupPath }
469
+ : {}),
470
+ },
471
+ }
472
+ : {}),
473
+ }));
474
+ }
475
+ }
476
+ for (const d of result.lockDrift) {
477
+ if (d.reason === "missing") {
478
+ stderr(`asset drift detected: ${d.entry.path} missing since last apply\n`);
479
+ }
480
+ else {
481
+ stderr(`asset drift detected: ${d.entry.path} changed since last apply\n`);
482
+ }
483
+ }
484
+ for (const w of result.warnings) {
485
+ stderr(`warning: ${w}\n`);
486
+ }
487
+ for (const w of result.codexConfigInstall?.snapshotWarnings ?? []) {
488
+ stderr(`warning: ${w}\n`);
489
+ }
490
+ for (const h of result.restartHints) {
491
+ stderr(`restart hint: ${h}\n`);
492
+ }
493
+ });
494
+ }
495
+ //# sourceMappingURL=register-setup-group.js.map