@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
@@ -1,19 +1,30 @@
1
- // `harness gate enable` — restore the most recent `gate disable` snapshot.
1
+ // `harness gate enable`: restore the live `gate disable` snapshot.
2
2
  //
3
- // Reads the newest `harness.gate-disable.*.json` next to settings.json,
4
- // merges its `removed[]` groups back into `hooks[event][]` at their
5
- // original indices, and atomically rewrites settings.json. Refuses if
6
- // settings.json has been edited since the snapshot was taken (the
7
- // recorded `settingsAfterSha256` no longer matches the on-disk content)
8
- // unless `--force` is passed, so a hand-edit between disable and enable
9
- // is not silently overwritten. Idempotent on an already-restored file
10
- // (the snapshot's `settingsBeforeSha256` matches the current sha →
11
- // nothing to do).
3
+ // There is one live `harness.gate-disable.*.json` per settings.json (a
4
+ // second disable merges into it). Enable puts every removed group back at
5
+ // its recorded index and atomically rewrites settings.json, then retires the
6
+ // snapshot (renamed to `*.restored.json`, kept for audit, never applied
7
+ // again). A group the file already holds unchanged is never spliced in a
8
+ // second time. A group with the same event and matcher but other content may
9
+ // be another hook that shares the matcher, so enable refuses while there is
10
+ // one and names both groups' commands; `--force` takes it as back. When
11
+ // settings.json has been edited since the snapshot was taken (the recorded
12
+ // `settingsAfterSha256` no longer matches the on-disk content), the groups
13
+ // that are still missing are put back only if that gives exactly the
14
+ // pre-disable file (what a crash between the two disable writes leaves
15
+ // behind); otherwise enable refuses, and `--force` puts them back into the
16
+ // file as it is and keeps the edits. A file that already matches the
17
+ // pre-disable state, or already holds every group unchanged, has nothing to
18
+ // restore: the snapshot is retired. A directory holding several live
19
+ // snapshots (version 1 releases left one per disable) is handled one
20
+ // snapshot per call, newest first; the result names the ones still live, and
21
+ // the live snapshots of other settings files beside it, so the caller can
22
+ // refuse an all-clear.
12
23
  import * as fs from "node:fs";
13
24
  import * as os from "node:os";
14
25
  import * as path from "node:path";
15
26
  import { atomicWriteFile } from "../../io/atomic-write.js";
16
- import { listSnapshots, readSnapshot, sha256Hex, } from "./snapshot.js";
27
+ import { changedLabel, claudeEnableRefusal, groupLabel, isReadOnlyWriteError, listLiveSnapshots, missingLabel, nextEnableSnapshots, parseSettingsHooks, planRestore, readOnlyLinkTargetText, readOnlyWritablePlace, resolveSettingsEntry, restoredSettingsText, retireSnapshot, settingsFlag, settingsOwnEntry, sha256Hex, } from "./snapshot.js";
17
28
  const DEFAULT_SETTINGS_REL = path.join(".claude", "settings.json");
18
29
  export class GateEnableError extends Error {
19
30
  constructor(message) {
@@ -28,14 +39,15 @@ function resolveSettingsPath(opts) {
28
39
  const home = opts.homeDir ?? os.homedir();
29
40
  return path.join(home, DEFAULT_SETTINGS_REL);
30
41
  }
31
- function readCurrentSettings(settingsPath) {
42
+ /** `missingWayOut` ends the message when the file is not there: what to do with the live snapshot waiting for it. */
43
+ function readCurrentSettings(settingsPath, missingWayOut) {
32
44
  let raw;
33
45
  try {
34
46
  raw = fs.readFileSync(settingsPath, "utf8");
35
47
  }
36
48
  catch (err) {
37
49
  if (err.code === "ENOENT") {
38
- throw new GateEnableError(`settings file not found: ${settingsPath} — cannot restore into a missing target`);
50
+ throw new GateEnableError(`settings file not found: ${settingsPath}; cannot restore into a missing target. ${missingWayOut}`);
39
51
  }
40
52
  throw new GateEnableError(`cannot read ${settingsPath}: ${err.message}`);
41
53
  }
@@ -50,78 +62,138 @@ function readCurrentSettings(settingsPath) {
50
62
  throw new GateEnableError(`${settingsPath} is not a JSON object; refusing to operate.`);
51
63
  }
52
64
  const obj = parsed;
53
- const rawHooks = obj["hooks"];
54
- let hooks = {};
55
- if (rawHooks !== undefined) {
56
- if (rawHooks === null || typeof rawHooks !== "object" || Array.isArray(rawHooks)) {
57
- throw new GateEnableError(`${settingsPath} \`hooks\` field is not an object.`);
58
- }
59
- for (const [event, groups] of Object.entries(rawHooks)) {
60
- if (!Array.isArray(groups)) {
61
- throw new GateEnableError(`${settingsPath} \`hooks.${event}\` is not an array; refusing to operate.`);
62
- }
63
- hooks[event] = groups.slice();
64
- }
65
+ // One shared walk of the `hooks` field (the doctor reads the same shape
66
+ // through it); the two failure reasons keep their exact messages here.
67
+ const parsedHooks = parseSettingsHooks(obj);
68
+ if (!parsedHooks.ok) {
69
+ const event = parsedHooks.reason === "event-not-array" ? parsedHooks.event : "";
70
+ throw new GateEnableError(parsedHooks.reason === "hooks-not-object"
71
+ ? `${settingsPath} \`hooks\` field is not an object.`
72
+ : `${settingsPath} \`hooks.${event}\` is not an array; refusing to operate.`);
65
73
  }
66
- return { raw, obj, hooks };
67
- }
68
- function reinsertRemoved(hooks, snapshot) {
69
- // Sort removed entries by event, then by ascending index, so we splice
70
- // them back in growing order — that way an earlier insertion never
71
- // shifts a later insertion's target index past the array end.
72
- const sorted = [...snapshot.removed].sort((a, b) => {
73
- if (a.event !== b.event)
74
- return a.event < b.event ? -1 : 1;
75
- return a.index - b.index;
76
- });
77
- let inserted = 0;
78
- for (const entry of sorted) {
79
- const arr = hooks[entry.event] ?? [];
80
- const idx = Math.min(entry.index, arr.length);
81
- arr.splice(idx, 0, entry.group);
82
- hooks[entry.event] = arr;
83
- inserted += 1;
84
- }
85
- return inserted;
74
+ return { raw, obj, hooks: parsedHooks.hooks };
86
75
  }
87
76
  export function gateEnable(opts = {}) {
88
77
  const settingsPath = resolveSettingsPath(opts);
89
- const settingsDir = path.dirname(settingsPath);
90
- const snapshotPaths = listSnapshots(settingsDir);
91
- if (snapshotPaths.length === 0) {
92
- return { mode: "no-snapshots", settingsPath };
93
- }
94
- const latest = snapshotPaths[0];
95
- const readResult = readSnapshot(latest);
96
- if (!readResult.ok) {
97
- throw new GateEnableError(readResult.reason);
98
- }
99
- const snapshot = readResult.snapshot;
100
- const current = readCurrentSettings(settingsPath);
78
+ // Reads and writes go to the file itself, so a settings.json that is a
79
+ // symlink stays one; the snapshots of either spelling are found by the listing.
80
+ const entry = resolveSettingsEntry(settingsPath);
81
+ const found = listLiveSnapshots(settingsPath);
82
+ if (!found.ok) {
83
+ throw new GateEnableError(`${found.reason}. Nothing was restored: a live snapshot that cannot be read, or that records no target, may ` +
84
+ `name groups still removed from ${settingsPath}. Move ${found.path} aside (or rename it to ` +
85
+ `*.restored.json once its groups are back; if it names groups that are still removed, put them back by ` +
86
+ `hand first, the snapshot's settingsBackupPath names the file as it was before the disable) and run ` +
87
+ `\`harness gate enable ${settingsFlag(settingsPath)}\` again.`);
88
+ }
89
+ const foreign = found.skippedForeign;
90
+ const [newest] = nextEnableSnapshots(found.live);
91
+ const older = found.live.filter((l) => l !== newest);
92
+ if (newest === undefined) {
93
+ return { mode: "no-snapshots", settingsPath, foreign };
94
+ }
95
+ const snapshot = newest.snapshot;
96
+ const remaining = older.map((l) => l.path);
97
+ const current = readCurrentSettings(entry, `The snapshot ${newest.path} stays live. Restore the file from ${snapshot.settingsBackupPath} (the file as it ` +
98
+ `was before the disable), then run \`harness gate enable ${settingsFlag(settingsPath)}\` again.`);
101
99
  const currentSha = sha256Hex(current.raw);
102
100
  if (currentSha === snapshot.settingsBeforeSha256) {
103
- // The current file already matches the pre-disable state: nothing
104
- // to restore. Idempotent return.
105
- return { mode: "already-restored", settingsPath, snapshotPath: latest };
106
- }
107
- if (currentSha !== snapshot.settingsAfterSha256 && !opts.force) {
108
- throw new GateEnableError(`settings.json has been edited since the snapshot was taken (current sha ${currentSha.slice(0, 12)}…, ` +
109
- `snapshot's post-disable sha ${snapshot.settingsAfterSha256.slice(0, 12)}…). ` +
110
- `Re-running would overwrite those edits. Inspect the diff against ` +
111
- `${snapshot.settingsBackupPath}, then pass --force to restore anyway.`);
112
- }
113
- const restoredCount = reinsertRemoved(current.hooks, snapshot);
114
- const newObj = { ...current.obj };
115
- if (Object.keys(current.hooks).length === 0) {
116
- delete newObj["hooks"];
117
- }
118
- else {
119
- newObj["hooks"] = current.hooks;
120
- }
121
- const newSettings = `${JSON.stringify(newObj, null, 2)}\n`;
122
- atomicWriteFile(settingsPath, newSettings);
123
- return { mode: "restored", settingsPath, snapshotPath: latest, restoredCount };
101
+ // The current file already matches the pre-disable state: nothing to
102
+ // restore. The snapshot is spent, so retire it and never offer it again.
103
+ return {
104
+ mode: "already-restored",
105
+ settingsPath,
106
+ snapshotPath: retireApplied(newest.path, settingsPath, 0),
107
+ remaining,
108
+ foreign,
109
+ alreadyBack: [],
110
+ accepted: [],
111
+ };
112
+ }
113
+ const plan = planRestore(current.hooks, snapshot);
114
+ const alreadyBack = plan.alreadyBack.map((r) => groupLabel(r.event, r.group));
115
+ const accepted = plan.changed.map(changedLabel);
116
+ const refusal = claudeEnableRefusal(currentSha, current.obj, plan, snapshot);
117
+ if (refusal === "changed-group" && !opts.force) {
118
+ // A group with the matcher of the gate's but other content may be another
119
+ // hook entirely: taking it for the gate's would leave the gate off.
120
+ throw new GateEnableError(`${settingsPath} holds ${accepted.length} hook group(s) with the event and matcher of a group the snapshot ` +
121
+ `${newest.path} removed but with other content (${accepted.join("; ")}). Such a group may be another hook ` +
122
+ `that shares the matcher, so it does not count as back.` +
123
+ (plan.restored.length > 0
124
+ ? ` ${plan.restored.length} more hook group(s) it removed are missing ` +
125
+ `(${plan.restored.map(missingLabel).join("; ")}).`
126
+ : "") +
127
+ ` Nothing was changed and the snapshot stays live. If the file's group stands in for the snapshot's, run ` +
128
+ `\`harness gate enable --force ${settingsFlag(settingsPath)}\`: it takes it as back (the snapshot's group is not put back), puts the ` +
129
+ `missing groups back and keeps every other edit. Otherwise make the file hold the snapshot's group ` +
130
+ `(${snapshot.settingsBackupPath} has it) and run \`harness gate enable ${settingsFlag(settingsPath)}\` again.`);
131
+ }
132
+ if (plan.restored.length === 0) {
133
+ // Every group the snapshot names is back in the file (by hand, or an
134
+ // apply re-rendered it): the snapshot is spent whatever else was edited.
135
+ return {
136
+ mode: "already-restored",
137
+ settingsPath,
138
+ snapshotPath: retireApplied(newest.path, settingsPath, 0),
139
+ remaining,
140
+ foreign,
141
+ alreadyBack,
142
+ accepted,
143
+ };
144
+ }
145
+ const newSettings = restoredSettingsText(current.obj, plan.hooks);
146
+ // The file is not the state the snapshot left, and the groups still missing
147
+ // do not add up to the pre-disable file: an edit would be written over
148
+ // without the operator having seen it.
149
+ if (refusal === "edited-settings" && !opts.force) {
150
+ throw new GateEnableError(`settings.json has been edited since the snapshot was taken (current sha ${currentSha.slice(0, 12)}..., ` +
151
+ `snapshot's post-disable sha ${snapshot.settingsAfterSha256.slice(0, 12)}...), and ` +
152
+ `${plan.restored.length} hook group(s) it removed are still missing ` +
153
+ `(${plan.restored.map(missingLabel).join("; ")}). Nothing was changed and the ` +
154
+ `snapshot ${newest.path} stays live. Inspect the diff against ${snapshot.settingsBackupPath}, then run ` +
155
+ `\`harness gate enable --force ${settingsFlag(settingsPath)}\`: it puts the missing groups back, leaves a group that is already ` +
156
+ `there alone and keeps every other edit.`);
157
+ }
158
+ try {
159
+ atomicWriteFile(entry, newSettings);
160
+ }
161
+ catch (err) {
162
+ if (entry === settingsOwnEntry(settingsPath) || !isReadOnlyWriteError(err))
163
+ throw err;
164
+ // A copy in place of the link would not find the snapshot, which sits beside the file. Moving the snapshot
165
+ // aside needs the directory writable too, so the by-hand way defers that step.
166
+ throw new GateEnableError(`${readOnlyLinkTargetText(settingsPath, entry, err)} Nothing was changed and the snapshot ${newest.path} stays ` +
167
+ `live. Make ${readOnlyWritablePlace(entry, err)} writable and run \`harness gate enable${opts.force ? " --force" : ""} ` +
168
+ `${settingsFlag(settingsPath)}\` again; or by hand: put the groups back (the snapshot lists them; ` +
169
+ `${snapshot.settingsBackupPath} is the file as it was before the disable), then move the snapshot aside ` +
170
+ `(rename it to *.restored.json) once you can write its directory.`);
171
+ }
172
+ return {
173
+ mode: "restored",
174
+ settingsPath,
175
+ snapshotPath: retireApplied(newest.path, settingsPath, plan.restored.length),
176
+ restoredCount: plan.restored.length,
177
+ remaining,
178
+ foreign,
179
+ alreadyBack,
180
+ accepted,
181
+ };
182
+ }
183
+ /**
184
+ * Retires the snapshot this call applied (or found applied). A failed rename
185
+ * is reported with what was done and the way out instead of a bare errno: a
186
+ * snapshot left live is harmless (the next enable finds its groups back and
187
+ * retires it), but the operator must know it is still there.
188
+ */
189
+ function retireApplied(snapPath, settingsPath, restoredCount) {
190
+ try {
191
+ return retireSnapshot(snapPath);
192
+ }
193
+ catch (err) {
194
+ throw new GateEnableError(`${restoredCount > 0 ? `restored ${restoredCount} hook group(s) into ${settingsPath}` : `${settingsPath} needed no write`}, ` +
195
+ `but cannot retire the snapshot ${snapPath} (${err.message}). Move it out of the directory by ` +
196
+ `hand (or rename it to *.restored.json) so it is never applied again.`);
197
+ }
124
198
  }
125
- /** Test-helper: re-export for the test suite to inspect snapshot pickup. */
126
- export { listSnapshots };
127
199
  //# sourceMappingURL=enable.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"enable.js","sourceRoot":"","sources":["../../../src/cli/gate/enable.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"enable.js","sourceRoot":"","sources":["../../../src/cli/gate/enable.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /** Why a link chain stops where it does. */
2
+ export type LinkChainEnd =
3
+ /** The last path exists and is not a symlink. */
4
+ "target"
5
+ /** The last path does not exist: a symlink leads to a file that is gone, or to a directory that is gone, or the path itself is absent. */
6
+ | "dangling"
7
+ /** The hop budget ran out while every hop was still a symlink. */
8
+ | "loop"
9
+ /** A hop could not be read (no permission, a directory on the way that is a file). */
10
+ | "unreadable";
11
+ export interface LinkChain {
12
+ /**
13
+ * The path itself, then each path its symlink text leads to, ending at the
14
+ * first path that is not a symlink or at the point where the chain cannot
15
+ * be walked.
16
+ */
17
+ chain: string[];
18
+ end: LinkChainEnd;
19
+ }
20
+ /**
21
+ * Walks the symlink chain of `start` one hop at a time, resolving each hop
22
+ * the way the kernel does. A relative link text is appended, as written, to
23
+ * the physical directory that holds the link (an absolute text is taken as
24
+ * written), and everything but the last name of that path is then resolved by
25
+ * the native `realpath`, which walks `..`, `.` and empty segments through the
26
+ * real directories one step at a time. Nothing is folded lexically: `d/..` is
27
+ * the parent of the directory `d` leads to, not the directory holding `d`,
28
+ * whether the text is relative or absolute (the JavaScript `realpath` and
29
+ * `path.resolve` fold `d/..` away before they look at `d`). The last name is
30
+ * kept as written, since it may be the next link. When the directory part
31
+ * leads nowhere (a directory on the way is gone), the chain ends dangling at
32
+ * that path as the link wrote it, never at a lexical guess of where it might
33
+ * have led. A trailing separator asks the kernel for a directory: over a real
34
+ * directory it walks to it, over a link it hops on and carries the directory
35
+ * requirement to where the chain lands (a chain ending at a file then ends
36
+ * unreadable, the kernel's `ENOTDIR`), and a same-named file ends unreadable
37
+ * at the text as written.
38
+ */
39
+ export declare function walkLinkChain(start: string): LinkChain;
40
+ /** The hops of `walkLinkChain`, for a caller that only looks beside each of them. */
41
+ export declare function linkChain(start: string): string[];
42
+ /**
43
+ * A path spelled with a `..` segment, replaced by its directory as the kernel
44
+ * resolves it plus the same last name. Joining a name to a directory (and
45
+ * `path.resolve`, `path.normalize`) folds `..` lexically, which leads
46
+ * elsewhere when the name before it is a directory link (`via/..` is the
47
+ * parent of where `via` leads, not the directory that holds `via`). `..` is
48
+ * the only segment such a fold moves (`.` and empty segments fold to the same
49
+ * directory), so every other spelling is kept as given. A directory that
50
+ * cannot be resolved leaves the spelling as given: nothing can be read or
51
+ * written through it.
52
+ */
53
+ export declare function kernelEntry(spelled: string): string;
@@ -0,0 +1,122 @@
1
+ // One walker for the chain of symlinks a gate path leads through, shared by the
2
+ // Claude and the Codex gate. A snapshot or an installer backup sits beside the
3
+ // spelling the gate was run through, which may be any hop of the chain or its
4
+ // target, so both gates have to find the same hops from the same path.
5
+ import * as fs from "node:fs";
6
+ import * as path from "node:path";
7
+ /** More hops than any real dotfiles setup, so a loop ends quickly. */
8
+ const MAX_HOPS = 40;
9
+ /** How a failed step of the walk ends the chain: nothing at the path, or a path that cannot be read. */
10
+ function endOf(err) {
11
+ return err.code === "ENOENT" ? "dangling" : "unreadable";
12
+ }
13
+ /**
14
+ * Walks the symlink chain of `start` one hop at a time, resolving each hop
15
+ * the way the kernel does. A relative link text is appended, as written, to
16
+ * the physical directory that holds the link (an absolute text is taken as
17
+ * written), and everything but the last name of that path is then resolved by
18
+ * the native `realpath`, which walks `..`, `.` and empty segments through the
19
+ * real directories one step at a time. Nothing is folded lexically: `d/..` is
20
+ * the parent of the directory `d` leads to, not the directory holding `d`,
21
+ * whether the text is relative or absolute (the JavaScript `realpath` and
22
+ * `path.resolve` fold `d/..` away before they look at `d`). The last name is
23
+ * kept as written, since it may be the next link. When the directory part
24
+ * leads nowhere (a directory on the way is gone), the chain ends dangling at
25
+ * that path as the link wrote it, never at a lexical guess of where it might
26
+ * have led. A trailing separator asks the kernel for a directory: over a real
27
+ * directory it walks to it, over a link it hops on and carries the directory
28
+ * requirement to where the chain lands (a chain ending at a file then ends
29
+ * unreadable, the kernel's `ENOTDIR`), and a same-named file ends unreadable
30
+ * at the text as written.
31
+ */
32
+ export function walkLinkChain(start) {
33
+ const chain = [start];
34
+ let current = start;
35
+ let requireDir = false;
36
+ for (let hop = 0; hop < MAX_HOPS; hop++) {
37
+ let raw;
38
+ try {
39
+ const text = fs.readlinkSync(current);
40
+ const linkDir = fs.realpathSync.native(path.dirname(current));
41
+ // Appended as written: `path.join` would fold `d/..` before the kernel's walk below.
42
+ raw = path.isAbsolute(text) ? text : `${linkDir}${path.sep}${text}`;
43
+ }
44
+ catch (err) {
45
+ // `readlink` answers EINVAL for anything that exists and is not a symlink.
46
+ if (err.code !== "EINVAL")
47
+ return { chain, end: endOf(err) };
48
+ if (requireDir) {
49
+ // A trailing separator earlier in the chain asked for a directory and
50
+ // the chain landed on a non-link: a same-named file answers that
51
+ // lookup ENOTDIR, unreadable, as reading through the link does.
52
+ try {
53
+ if (!fs.statSync(current).isDirectory())
54
+ return { chain, end: "unreadable" };
55
+ }
56
+ catch (statErr) {
57
+ return { chain, end: endOf(statErr) };
58
+ }
59
+ }
60
+ return { chain, end: "target" };
61
+ }
62
+ let next;
63
+ try {
64
+ // The kernel's own lookup first: the native `realpath` of macOS walks
65
+ // `file/..` back to the file's directory, where the kernel answers ENOTDIR.
66
+ fs.statSync(path.dirname(raw));
67
+ if (raw.endsWith(path.sep)) {
68
+ // A trailing separator asks the kernel for a directory: strip every
69
+ // trailing separator (an all-separator text is the root). A link hops
70
+ // on and carries the directory requirement to where the chain lands
71
+ // (a loop still ends loop, a dangling link is followed to its missing
72
+ // target, a link to a file ends unreadable above), while a same-named
73
+ // file answers ENOTDIR, unreadable.
74
+ const stripped = raw.replace(/\/+$/, "") || path.sep;
75
+ if (fs.lstatSync(stripped).isSymbolicLink()) {
76
+ requireDir = true;
77
+ raw = stripped;
78
+ }
79
+ else {
80
+ fs.statSync(raw);
81
+ }
82
+ }
83
+ next = path.join(fs.realpathSync.native(path.dirname(raw)), path.basename(raw));
84
+ }
85
+ catch (err) {
86
+ chain.push(raw);
87
+ return { chain, end: endOf(err) };
88
+ }
89
+ chain.push(next);
90
+ current = next;
91
+ }
92
+ return { chain, end: "loop" };
93
+ }
94
+ /** The hops of `walkLinkChain`, for a caller that only looks beside each of them. */
95
+ export function linkChain(start) {
96
+ return walkLinkChain(start).chain;
97
+ }
98
+ /**
99
+ * A path spelled with a `..` segment, replaced by its directory as the kernel
100
+ * resolves it plus the same last name. Joining a name to a directory (and
101
+ * `path.resolve`, `path.normalize`) folds `..` lexically, which leads
102
+ * elsewhere when the name before it is a directory link (`via/..` is the
103
+ * parent of where `via` leads, not the directory that holds `via`). `..` is
104
+ * the only segment such a fold moves (`.` and empty segments fold to the same
105
+ * directory), so every other spelling is kept as given. A directory that
106
+ * cannot be resolved leaves the spelling as given: nothing can be read or
107
+ * written through it.
108
+ */
109
+ export function kernelEntry(spelled) {
110
+ if (!spelled.split(path.sep).includes(".."))
111
+ return spelled;
112
+ const dir = path.dirname(spelled);
113
+ try {
114
+ // The kernel's own lookup first: the native `realpath` of macOS walks `file/..` back to the file's directory.
115
+ fs.statSync(dir);
116
+ return path.join(fs.realpathSync.native(dir), path.basename(spelled));
117
+ }
118
+ catch {
119
+ return spelled;
120
+ }
121
+ }
122
+ //# sourceMappingURL=link-chain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link-chain.js","sourceRoot":"","sources":["../../../src/cli/gate/link-chain.ts"],"names":[],"mappings":"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"}