@ironbee-ai/cli 0.14.1 → 0.16.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 (500) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +2 -95
  3. package/dist/analytics/{emit.d.ts → claude/emit.d.ts} +1 -1
  4. package/dist/analytics/claude/emit.d.ts.map +1 -0
  5. package/dist/analytics/{emit.js → claude/emit.js} +34 -7
  6. package/dist/analytics/claude/emit.js.map +1 -0
  7. package/dist/analytics/{hook-trigger.d.ts → claude/hook-trigger.d.ts} +1 -1
  8. package/dist/analytics/claude/hook-trigger.d.ts.map +1 -0
  9. package/dist/analytics/{hook-trigger.js → claude/hook-trigger.js} +2 -2
  10. package/dist/analytics/claude/hook-trigger.js.map +1 -0
  11. package/dist/analytics/claude/log.d.ts.map +1 -0
  12. package/dist/analytics/{log.js → claude/log.js} +1 -1
  13. package/dist/analytics/claude/log.js.map +1 -0
  14. package/dist/analytics/{merge.d.ts → claude/merge.d.ts} +2 -1
  15. package/dist/analytics/claude/merge.d.ts.map +1 -0
  16. package/dist/analytics/{merge.js → claude/merge.js} +13 -1
  17. package/dist/analytics/claude/merge.js.map +1 -0
  18. package/dist/analytics/{pricing.d.ts → claude/pricing.d.ts} +1 -13
  19. package/dist/analytics/claude/pricing.d.ts.map +1 -0
  20. package/dist/analytics/{pricing.js → claude/pricing.js} +6 -14
  21. package/dist/analytics/claude/pricing.js.map +1 -0
  22. package/dist/analytics/{projection.d.ts → claude/projection.d.ts} +31 -7
  23. package/dist/analytics/claude/projection.d.ts.map +1 -0
  24. package/dist/analytics/{projection.js → claude/projection.js} +631 -327
  25. package/dist/analytics/claude/projection.js.map +1 -0
  26. package/dist/analytics/{spawn.d.ts → claude/spawn.d.ts} +4 -4
  27. package/dist/analytics/claude/spawn.d.ts.map +1 -0
  28. package/dist/analytics/{spawn.js → claude/spawn.js} +4 -3
  29. package/dist/analytics/claude/spawn.js.map +1 -0
  30. package/dist/analytics/{state.d.ts → claude/state.d.ts} +1 -1
  31. package/dist/analytics/claude/state.d.ts.map +1 -0
  32. package/dist/analytics/{state.js → claude/state.js} +2 -2
  33. package/dist/analytics/claude/state.js.map +1 -0
  34. package/dist/analytics/claude/transcript.d.ts.map +1 -0
  35. package/dist/analytics/{transcript.js → claude/transcript.js} +1 -1
  36. package/dist/analytics/claude/transcript.js.map +1 -0
  37. package/dist/analytics/codex/api-request.d.ts +108 -0
  38. package/dist/analytics/codex/api-request.d.ts.map +1 -0
  39. package/dist/analytics/codex/api-request.js +155 -0
  40. package/dist/analytics/codex/api-request.js.map +1 -0
  41. package/dist/analytics/codex/apply-patch.d.ts +21 -0
  42. package/dist/analytics/codex/apply-patch.d.ts.map +1 -0
  43. package/dist/analytics/codex/apply-patch.js +49 -0
  44. package/dist/analytics/codex/apply-patch.js.map +1 -0
  45. package/dist/analytics/codex/classifier.d.ts +28 -0
  46. package/dist/analytics/codex/classifier.d.ts.map +1 -0
  47. package/dist/analytics/codex/classifier.js +111 -0
  48. package/dist/analytics/codex/classifier.js.map +1 -0
  49. package/dist/analytics/codex/emit.d.ts +47 -0
  50. package/dist/analytics/codex/emit.d.ts.map +1 -0
  51. package/dist/analytics/codex/emit.js +158 -0
  52. package/dist/analytics/codex/emit.js.map +1 -0
  53. package/dist/analytics/codex/events-emit.d.ts +62 -0
  54. package/dist/analytics/codex/events-emit.d.ts.map +1 -0
  55. package/dist/analytics/codex/events-emit.js +555 -0
  56. package/dist/analytics/codex/events-emit.js.map +1 -0
  57. package/dist/analytics/codex/pricing.d.ts +57 -0
  58. package/dist/analytics/codex/pricing.d.ts.map +1 -0
  59. package/dist/analytics/codex/pricing.js +125 -0
  60. package/dist/analytics/codex/pricing.js.map +1 -0
  61. package/dist/analytics/codex/projection.d.ts +51 -0
  62. package/dist/analytics/codex/projection.d.ts.map +1 -0
  63. package/dist/analytics/codex/projection.js +1477 -0
  64. package/dist/analytics/codex/projection.js.map +1 -0
  65. package/dist/analytics/codex/spawn.d.ts +27 -0
  66. package/dist/analytics/codex/spawn.d.ts.map +1 -0
  67. package/dist/analytics/codex/spawn.js +64 -0
  68. package/dist/analytics/codex/spawn.js.map +1 -0
  69. package/dist/analytics/codex/status-snapshot.d.ts +80 -0
  70. package/dist/analytics/codex/status-snapshot.d.ts.map +1 -0
  71. package/dist/analytics/codex/status-snapshot.js +206 -0
  72. package/dist/analytics/codex/status-snapshot.js.map +1 -0
  73. package/dist/analytics/codex/transcript.d.ts +51 -0
  74. package/dist/analytics/codex/transcript.d.ts.map +1 -0
  75. package/dist/analytics/codex/transcript.js +134 -0
  76. package/dist/analytics/codex/transcript.js.map +1 -0
  77. package/dist/analytics/codex/types.d.ts +253 -0
  78. package/dist/analytics/codex/types.d.ts.map +1 -0
  79. package/dist/analytics/codex/types.js +29 -0
  80. package/dist/analytics/codex/types.js.map +1 -0
  81. package/dist/analytics/shared/classifier.d.ts.map +1 -0
  82. package/dist/analytics/{classifier.js → shared/classifier.js} +9 -0
  83. package/dist/analytics/shared/classifier.js.map +1 -0
  84. package/dist/analytics/shared/errors.d.ts.map +1 -0
  85. package/dist/analytics/shared/errors.js.map +1 -0
  86. package/dist/analytics/shared/tokens.d.ts +14 -0
  87. package/dist/analytics/shared/tokens.d.ts.map +1 -0
  88. package/dist/analytics/shared/tokens.js +17 -0
  89. package/dist/analytics/shared/tokens.js.map +1 -0
  90. package/dist/analytics/{types.d.ts → shared/types.d.ts} +42 -9
  91. package/dist/analytics/shared/types.d.ts.map +1 -0
  92. package/dist/analytics/shared/types.js.map +1 -0
  93. package/dist/clients/base.d.ts +9 -0
  94. package/dist/clients/base.d.ts.map +1 -1
  95. package/dist/clients/claude/hooks/activity-end.js +1 -1
  96. package/dist/clients/claude/hooks/activity-end.js.map +1 -1
  97. package/dist/clients/claude/hooks/activity-start.js +1 -1
  98. package/dist/clients/claude/hooks/activity-start.js.map +1 -1
  99. package/dist/clients/claude/hooks/clear-verdict.d.ts.map +1 -1
  100. package/dist/clients/claude/hooks/clear-verdict.js +14 -0
  101. package/dist/clients/claude/hooks/clear-verdict.js.map +1 -1
  102. package/dist/clients/claude/hooks/session-end.d.ts.map +1 -1
  103. package/dist/clients/claude/hooks/session-end.js +7 -1
  104. package/dist/clients/claude/hooks/session-end.js.map +1 -1
  105. package/dist/clients/claude/hooks/session-start.d.ts.map +1 -1
  106. package/dist/clients/claude/hooks/session-start.js +7 -1
  107. package/dist/clients/claude/hooks/session-start.js.map +1 -1
  108. package/dist/clients/claude/hooks/session-status.d.ts.map +1 -1
  109. package/dist/clients/claude/hooks/session-status.js +13 -9
  110. package/dist/clients/claude/hooks/session-status.js.map +1 -1
  111. package/dist/clients/claude/hooks/track-action.d.ts.map +1 -1
  112. package/dist/clients/claude/hooks/track-action.js +26 -1
  113. package/dist/clients/claude/hooks/track-action.js.map +1 -1
  114. package/dist/clients/claude/hooks/verify-gate.d.ts.map +1 -1
  115. package/dist/clients/claude/hooks/verify-gate.js +8 -1
  116. package/dist/clients/claude/hooks/verify-gate.js.map +1 -1
  117. package/dist/clients/claude/index.d.ts +1 -0
  118. package/dist/clients/claude/index.d.ts.map +1 -1
  119. package/dist/clients/claude/index.js +18 -14
  120. package/dist/clients/claude/index.js.map +1 -1
  121. package/dist/clients/claude/util.d.ts.map +1 -1
  122. package/dist/clients/claude/util.js +55 -0
  123. package/dist/clients/claude/util.js.map +1 -1
  124. package/dist/clients/codex/commands/ironbee-verify/SKILL.md +58 -0
  125. package/dist/clients/codex/hooks/activity-end.d.ts +9 -0
  126. package/dist/clients/codex/hooks/activity-end.d.ts.map +1 -0
  127. package/dist/clients/codex/hooks/activity-end.js +65 -0
  128. package/dist/clients/codex/hooks/activity-end.js.map +1 -0
  129. package/dist/clients/codex/hooks/activity-start.d.ts +17 -0
  130. package/dist/clients/codex/hooks/activity-start.d.ts.map +1 -0
  131. package/dist/clients/codex/hooks/activity-start.js +38 -0
  132. package/dist/clients/codex/hooks/activity-start.js.map +1 -0
  133. package/dist/clients/codex/hooks/clear-verdict.d.ts +55 -0
  134. package/dist/clients/codex/hooks/clear-verdict.d.ts.map +1 -0
  135. package/dist/clients/codex/hooks/clear-verdict.js +299 -0
  136. package/dist/clients/codex/hooks/clear-verdict.js.map +1 -0
  137. package/dist/clients/codex/hooks/require-verdict.d.ts +30 -0
  138. package/dist/clients/codex/hooks/require-verdict.d.ts.map +1 -0
  139. package/dist/clients/codex/hooks/require-verdict.js +109 -0
  140. package/dist/clients/codex/hooks/require-verdict.js.map +1 -0
  141. package/dist/clients/codex/hooks/require-verification.d.ts +12 -0
  142. package/dist/clients/codex/hooks/require-verification.d.ts.map +1 -0
  143. package/dist/clients/codex/hooks/require-verification.js +136 -0
  144. package/dist/clients/codex/hooks/require-verification.js.map +1 -0
  145. package/dist/clients/codex/hooks/session-start.d.ts +10 -0
  146. package/dist/clients/codex/hooks/session-start.d.ts.map +1 -0
  147. package/dist/clients/codex/hooks/session-start.js +94 -0
  148. package/dist/clients/codex/hooks/session-start.js.map +1 -0
  149. package/dist/clients/codex/hooks/track-action-monitor.d.ts +10 -0
  150. package/dist/clients/codex/hooks/track-action-monitor.d.ts.map +1 -0
  151. package/dist/clients/codex/hooks/track-action-monitor.js +168 -0
  152. package/dist/clients/codex/hooks/track-action-monitor.js.map +1 -0
  153. package/dist/clients/codex/hooks/track-action-pre.d.ts +18 -0
  154. package/dist/clients/codex/hooks/track-action-pre.d.ts.map +1 -0
  155. package/dist/clients/codex/hooks/track-action-pre.js +35 -0
  156. package/dist/clients/codex/hooks/track-action-pre.js.map +1 -0
  157. package/dist/clients/codex/hooks/track-action.d.ts +22 -0
  158. package/dist/clients/codex/hooks/track-action.d.ts.map +1 -0
  159. package/dist/clients/codex/hooks/track-action.js +350 -0
  160. package/dist/clients/codex/hooks/track-action.js.map +1 -0
  161. package/dist/clients/codex/hooks/verify-gate.d.ts +15 -0
  162. package/dist/clients/codex/hooks/verify-gate.d.ts.map +1 -0
  163. package/dist/clients/codex/hooks/verify-gate.js +105 -0
  164. package/dist/clients/codex/hooks/verify-gate.js.map +1 -0
  165. package/dist/clients/codex/index.d.ts +42 -0
  166. package/dist/clients/codex/index.d.ts.map +1 -0
  167. package/dist/clients/codex/index.js +427 -0
  168. package/dist/clients/codex/index.js.map +1 -0
  169. package/dist/clients/codex/platforms/command-verify.backend.md +108 -0
  170. package/dist/clients/codex/platforms/command-verify.browser.md +108 -0
  171. package/dist/clients/codex/platforms/command-verify.node.md +61 -0
  172. package/dist/clients/codex/platforms/rule.backend.md +32 -0
  173. package/dist/clients/codex/platforms/rule.browser.md +17 -0
  174. package/dist/clients/codex/platforms/rule.node.md +28 -0
  175. package/dist/clients/codex/platforms/skill.backend.md +95 -0
  176. package/dist/clients/codex/platforms/skill.browser.md +28 -0
  177. package/dist/clients/codex/platforms/skill.node.md +62 -0
  178. package/dist/clients/codex/rules/ironbee-verification.md +48 -0
  179. package/dist/clients/codex/skills/ironbee-verification.md +80 -0
  180. package/dist/clients/codex/util.d.ts +193 -0
  181. package/dist/clients/codex/util.d.ts.map +1 -0
  182. package/dist/clients/codex/util.js +784 -0
  183. package/dist/clients/codex/util.js.map +1 -0
  184. package/dist/clients/cursor/hooks/activity-end.js +1 -1
  185. package/dist/clients/cursor/hooks/activity-end.js.map +1 -1
  186. package/dist/clients/cursor/hooks/clear-verdict.d.ts +5 -2
  187. package/dist/clients/cursor/hooks/clear-verdict.d.ts.map +1 -1
  188. package/dist/clients/cursor/hooks/clear-verdict.js +12 -3
  189. package/dist/clients/cursor/hooks/clear-verdict.js.map +1 -1
  190. package/dist/clients/cursor/hooks/session-end.js +1 -1
  191. package/dist/clients/cursor/hooks/session-end.js.map +1 -1
  192. package/dist/clients/cursor/hooks/session-start.js +1 -1
  193. package/dist/clients/cursor/hooks/session-start.js.map +1 -1
  194. package/dist/clients/cursor/hooks/verify-gate.d.ts.map +1 -1
  195. package/dist/clients/cursor/hooks/verify-gate.js +6 -1
  196. package/dist/clients/cursor/hooks/verify-gate.js.map +1 -1
  197. package/dist/clients/cursor/index.d.ts +1 -0
  198. package/dist/clients/cursor/index.d.ts.map +1 -1
  199. package/dist/clients/cursor/index.js +22 -13
  200. package/dist/clients/cursor/index.js.map +1 -1
  201. package/dist/clients/registry.d.ts.map +1 -1
  202. package/dist/clients/registry.js +2 -1
  203. package/dist/clients/registry.js.map +1 -1
  204. package/dist/commands/{claude.d.ts → claude/index.d.ts} +1 -1
  205. package/dist/commands/claude/index.d.ts.map +1 -0
  206. package/dist/commands/{claude.js → claude/index.js} +12 -6
  207. package/dist/commands/claude/index.js.map +1 -0
  208. package/dist/commands/{otel.d.ts → claude/otel.d.ts} +5 -1
  209. package/dist/commands/claude/otel.d.ts.map +1 -0
  210. package/dist/commands/{otel.js → claude/otel.js} +9 -5
  211. package/dist/commands/claude/otel.js.map +1 -0
  212. package/dist/commands/claude/process-analytics.d.ts +19 -0
  213. package/dist/commands/claude/process-analytics.d.ts.map +1 -0
  214. package/dist/commands/{process-analytics.js → claude/process-analytics.js} +16 -15
  215. package/dist/commands/claude/process-analytics.js.map +1 -0
  216. package/dist/commands/{statusline-toggle.d.ts → claude/statusline-toggle.d.ts} +2 -2
  217. package/dist/commands/claude/statusline-toggle.d.ts.map +1 -0
  218. package/dist/commands/{statusline-toggle.js → claude/statusline-toggle.js} +8 -8
  219. package/dist/commands/claude/statusline-toggle.js.map +1 -0
  220. package/dist/commands/{statusline.d.ts → claude/statusline.d.ts} +1 -1
  221. package/dist/commands/claude/statusline.d.ts.map +1 -0
  222. package/dist/commands/{statusline.js → claude/statusline.js} +4 -4
  223. package/dist/commands/claude/statusline.js.map +1 -0
  224. package/dist/commands/codex/index.d.ts +11 -0
  225. package/dist/commands/codex/index.d.ts.map +1 -0
  226. package/dist/commands/codex/index.js +17 -0
  227. package/dist/commands/codex/index.js.map +1 -0
  228. package/dist/commands/codex/process-analytics.d.ts +14 -0
  229. package/dist/commands/codex/process-analytics.d.ts.map +1 -0
  230. package/dist/commands/codex/process-analytics.js +111 -0
  231. package/dist/commands/codex/process-analytics.js.map +1 -0
  232. package/dist/commands/hook.js +12 -0
  233. package/dist/commands/hook.js.map +1 -1
  234. package/dist/commands/import.js +3 -3
  235. package/dist/commands/import.js.map +1 -1
  236. package/dist/commands/queue.js +3 -1
  237. package/dist/commands/queue.js.map +1 -1
  238. package/dist/commands/status.js +1 -1
  239. package/dist/commands/verify.d.ts.map +1 -1
  240. package/dist/commands/verify.js +1 -2
  241. package/dist/commands/verify.js.map +1 -1
  242. package/dist/hooks/core/actions.d.ts +17 -1
  243. package/dist/hooks/core/actions.d.ts.map +1 -1
  244. package/dist/hooks/core/actions.js +13 -0
  245. package/dist/hooks/core/actions.js.map +1 -1
  246. package/dist/hooks/core/activity-end.d.ts.map +1 -1
  247. package/dist/hooks/core/activity-end.js +4 -0
  248. package/dist/hooks/core/activity-end.js.map +1 -1
  249. package/dist/hooks/core/session-state.d.ts +15 -1
  250. package/dist/hooks/core/session-state.d.ts.map +1 -1
  251. package/dist/hooks/core/session-state.js +102 -7
  252. package/dist/hooks/core/session-state.js.map +1 -1
  253. package/dist/import/claude/analytics-runner.d.ts +1 -1
  254. package/dist/import/claude/analytics-runner.d.ts.map +1 -1
  255. package/dist/import/claude/analytics-runner.js +5 -5
  256. package/dist/import/claude/analytics-runner.js.map +1 -1
  257. package/dist/import/claude/auth-mode.d.ts +1 -1
  258. package/dist/import/claude/auth-mode.d.ts.map +1 -1
  259. package/dist/import/claude/discovery.js +1 -1
  260. package/dist/import/claude/discovery.js.map +1 -1
  261. package/dist/import/claude/encoding.js +1 -1
  262. package/dist/import/claude/encoding.js.map +1 -1
  263. package/dist/import/claude/events/file-change.d.ts +10 -1
  264. package/dist/import/claude/events/file-change.d.ts.map +1 -1
  265. package/dist/import/claude/events/file-change.js +79 -5
  266. package/dist/import/claude/events/file-change.js.map +1 -1
  267. package/dist/import/claude/events/tool-call.d.ts +16 -1
  268. package/dist/import/claude/events/tool-call.d.ts.map +1 -1
  269. package/dist/import/claude/events/tool-call.js +122 -15
  270. package/dist/import/claude/events/tool-call.js.map +1 -1
  271. package/dist/import/claude/runner.d.ts.map +1 -1
  272. package/dist/import/claude/runner.js +45 -3
  273. package/dist/import/claude/runner.js.map +1 -1
  274. package/dist/import/claude/summary.js +1 -1
  275. package/dist/import/claude/summary.js.map +1 -1
  276. package/dist/import/claude/transcript-walk.d.ts +1 -1
  277. package/dist/import/claude/transcript-walk.d.ts.map +1 -1
  278. package/dist/import/claude/transcript-walk.js +11 -4
  279. package/dist/import/claude/transcript-walk.js.map +1 -1
  280. package/dist/import/codex/analytics-runner.d.ts +46 -0
  281. package/dist/import/codex/analytics-runner.d.ts.map +1 -0
  282. package/dist/import/codex/analytics-runner.js +116 -0
  283. package/dist/import/codex/analytics-runner.js.map +1 -0
  284. package/dist/import/codex/discovery.d.ts +33 -0
  285. package/dist/import/codex/discovery.d.ts.map +1 -0
  286. package/dist/import/codex/discovery.js +202 -0
  287. package/dist/import/codex/discovery.js.map +1 -0
  288. package/dist/import/codex/events/file-change.d.ts +42 -0
  289. package/dist/import/codex/events/file-change.d.ts.map +1 -0
  290. package/dist/import/codex/events/file-change.js +125 -0
  291. package/dist/import/codex/events/file-change.js.map +1 -0
  292. package/dist/import/codex/events/tool-call.d.ts +49 -0
  293. package/dist/import/codex/events/tool-call.d.ts.map +1 -0
  294. package/dist/import/codex/events/tool-call.js +151 -0
  295. package/dist/import/codex/events/tool-call.js.map +1 -0
  296. package/dist/import/codex/runner.d.ts +34 -0
  297. package/dist/import/codex/runner.d.ts.map +1 -0
  298. package/dist/import/codex/runner.js +456 -0
  299. package/dist/import/codex/runner.js.map +1 -0
  300. package/dist/import/codex/summary.d.ts +20 -0
  301. package/dist/import/codex/summary.d.ts.map +1 -0
  302. package/dist/import/codex/summary.js +206 -0
  303. package/dist/import/codex/summary.js.map +1 -0
  304. package/dist/import/events/activity.d.ts.map +1 -1
  305. package/dist/import/events/activity.js +17 -2
  306. package/dist/import/events/activity.js.map +1 -1
  307. package/dist/import/events/session.d.ts +11 -1
  308. package/dist/import/events/session.d.ts.map +1 -1
  309. package/dist/import/events/session.js +19 -1
  310. package/dist/import/events/session.js.map +1 -1
  311. package/dist/import/ids.js +3 -3
  312. package/dist/import/ids.js.map +1 -1
  313. package/dist/import/pipeline.d.ts +22 -15
  314. package/dist/import/pipeline.d.ts.map +1 -1
  315. package/dist/import/pipeline.js +99 -18
  316. package/dist/import/pipeline.js.map +1 -1
  317. package/dist/import/types.d.ts +4 -0
  318. package/dist/import/types.d.ts.map +1 -1
  319. package/dist/import/types.js.map +1 -1
  320. package/dist/index.js +9 -14
  321. package/dist/index.js.map +1 -1
  322. package/dist/lib/collector.d.ts +2 -1
  323. package/dist/lib/collector.d.ts.map +1 -1
  324. package/dist/lib/collector.js +28 -3
  325. package/dist/lib/collector.js.map +1 -1
  326. package/dist/lib/config.d.ts.map +1 -1
  327. package/dist/lib/config.js.map +1 -1
  328. package/dist/lib/event.d.ts +18 -1
  329. package/dist/lib/event.d.ts.map +1 -1
  330. package/dist/lib/event.js +25 -1
  331. package/dist/lib/event.js.map +1 -1
  332. package/dist/lib/fs-prune.d.ts +1 -1
  333. package/dist/lib/fs-prune.js +1 -1
  334. package/dist/lib/platform-section.d.ts.map +1 -1
  335. package/dist/lib/platform-section.js +8 -0
  336. package/dist/lib/platform-section.js.map +1 -1
  337. package/dist/otel/{context → claude/context}/build.d.ts +1 -1
  338. package/dist/otel/claude/context/build.d.ts.map +1 -0
  339. package/dist/otel/{context → claude/context}/build.js +3 -7
  340. package/dist/otel/claude/context/build.js.map +1 -0
  341. package/dist/otel/claude/context/classify.d.ts.map +1 -0
  342. package/dist/otel/claude/context/classify.js.map +1 -0
  343. package/dist/otel/{context → claude/context}/extract.d.ts +1 -1
  344. package/dist/otel/claude/context/extract.d.ts.map +1 -0
  345. package/dist/otel/claude/context/extract.js.map +1 -0
  346. package/dist/otel/claude/context/markers.d.ts.map +1 -0
  347. package/dist/otel/{context → claude/context}/markers.js +22 -3
  348. package/dist/otel/claude/context/markers.js.map +1 -0
  349. package/dist/otel/claude/context/util.d.ts.map +1 -0
  350. package/dist/otel/claude/context/util.js.map +1 -0
  351. package/dist/otel/{daemon → claude/daemon}/ensure.d.ts +1 -1
  352. package/dist/otel/claude/daemon/ensure.d.ts.map +1 -0
  353. package/dist/otel/{daemon → claude/daemon}/ensure.js +6 -6
  354. package/dist/otel/claude/daemon/ensure.js.map +1 -0
  355. package/dist/otel/{daemon → claude/daemon}/forward.d.ts +1 -1
  356. package/dist/otel/claude/daemon/forward.d.ts.map +1 -0
  357. package/dist/otel/{daemon → claude/daemon}/forward.js +0 -0
  358. package/dist/otel/claude/daemon/forward.js.map +1 -0
  359. package/dist/otel/claude/daemon/paths.d.ts.map +1 -0
  360. package/dist/otel/claude/daemon/paths.js.map +1 -0
  361. package/dist/otel/{daemon → claude/daemon}/process.d.ts +1 -1
  362. package/dist/otel/claude/daemon/process.d.ts.map +1 -0
  363. package/dist/otel/{daemon → claude/daemon}/process.js +1 -1
  364. package/dist/otel/claude/daemon/process.js.map +1 -0
  365. package/dist/otel/claude/daemon/reprocess.d.ts.map +1 -0
  366. package/dist/otel/{daemon → claude/daemon}/reprocess.js +2 -2
  367. package/dist/otel/claude/daemon/reprocess.js.map +1 -0
  368. package/dist/otel/claude/log-handler.d.ts.map +1 -0
  369. package/dist/otel/{log-handler.js → claude/log-handler.js} +1 -1
  370. package/dist/otel/claude/log-handler.js.map +1 -0
  371. package/dist/otel/collector.js +4 -4
  372. package/dist/otel/collector.js.map +1 -1
  373. package/dist/queue/flush.d.ts +23 -0
  374. package/dist/queue/flush.d.ts.map +1 -1
  375. package/dist/queue/flush.js +44 -0
  376. package/dist/queue/flush.js.map +1 -1
  377. package/dist/queue/handlers/send-event.d.ts.map +1 -1
  378. package/dist/queue/handlers/send-event.js +5 -4
  379. package/dist/queue/handlers/send-event.js.map +1 -1
  380. package/dist/queue/index.d.ts +2 -2
  381. package/dist/queue/index.d.ts.map +1 -1
  382. package/dist/queue/index.js +4 -1
  383. package/dist/queue/index.js.map +1 -1
  384. package/dist/queue/spawn.d.ts +20 -0
  385. package/dist/queue/spawn.d.ts.map +1 -1
  386. package/dist/queue/spawn.js +37 -0
  387. package/dist/queue/spawn.js.map +1 -1
  388. package/dist/tui/import/area.js +3 -3
  389. package/dist/tui/import/area.js.map +1 -1
  390. package/dist/tui/sessions/area.d.ts.map +1 -1
  391. package/dist/tui/sessions/area.js +2 -45
  392. package/dist/tui/sessions/area.js.map +1 -1
  393. package/package.json +2 -1
  394. package/dist/analysis/code-changes.d.ts +0 -22
  395. package/dist/analysis/code-changes.d.ts.map +0 -1
  396. package/dist/analysis/code-changes.js +0 -141
  397. package/dist/analysis/code-changes.js.map +0 -1
  398. package/dist/analysis/cross-session.d.ts +0 -34
  399. package/dist/analysis/cross-session.d.ts.map +0 -1
  400. package/dist/analysis/cross-session.js +0 -230
  401. package/dist/analysis/cross-session.js.map +0 -1
  402. package/dist/analysis/fix-effectiveness.d.ts +0 -16
  403. package/dist/analysis/fix-effectiveness.d.ts.map +0 -1
  404. package/dist/analysis/fix-effectiveness.js +0 -99
  405. package/dist/analysis/fix-effectiveness.js.map +0 -1
  406. package/dist/analysis/scoring.d.ts +0 -15
  407. package/dist/analysis/scoring.d.ts.map +0 -1
  408. package/dist/analysis/scoring.js +0 -59
  409. package/dist/analysis/scoring.js.map +0 -1
  410. package/dist/analysis/time-analysis.d.ts +0 -22
  411. package/dist/analysis/time-analysis.d.ts.map +0 -1
  412. package/dist/analysis/time-analysis.js +0 -174
  413. package/dist/analysis/time-analysis.js.map +0 -1
  414. package/dist/analysis/verdict-details.d.ts +0 -23
  415. package/dist/analysis/verdict-details.d.ts.map +0 -1
  416. package/dist/analysis/verdict-details.js +0 -59
  417. package/dist/analysis/verdict-details.js.map +0 -1
  418. package/dist/analysis/verification-quality.d.ts +0 -20
  419. package/dist/analysis/verification-quality.d.ts.map +0 -1
  420. package/dist/analysis/verification-quality.js +0 -145
  421. package/dist/analysis/verification-quality.js.map +0 -1
  422. package/dist/analytics/classifier.d.ts.map +0 -1
  423. package/dist/analytics/classifier.js.map +0 -1
  424. package/dist/analytics/emit.d.ts.map +0 -1
  425. package/dist/analytics/emit.js.map +0 -1
  426. package/dist/analytics/errors.d.ts.map +0 -1
  427. package/dist/analytics/errors.js.map +0 -1
  428. package/dist/analytics/hook-trigger.d.ts.map +0 -1
  429. package/dist/analytics/hook-trigger.js.map +0 -1
  430. package/dist/analytics/log.d.ts.map +0 -1
  431. package/dist/analytics/log.js.map +0 -1
  432. package/dist/analytics/merge.d.ts.map +0 -1
  433. package/dist/analytics/merge.js.map +0 -1
  434. package/dist/analytics/pricing.d.ts.map +0 -1
  435. package/dist/analytics/pricing.js.map +0 -1
  436. package/dist/analytics/projection.d.ts.map +0 -1
  437. package/dist/analytics/projection.js.map +0 -1
  438. package/dist/analytics/spawn.d.ts.map +0 -1
  439. package/dist/analytics/spawn.js.map +0 -1
  440. package/dist/analytics/state.d.ts.map +0 -1
  441. package/dist/analytics/state.js.map +0 -1
  442. package/dist/analytics/transcript.d.ts.map +0 -1
  443. package/dist/analytics/transcript.js.map +0 -1
  444. package/dist/analytics/types.d.ts.map +0 -1
  445. package/dist/analytics/types.js.map +0 -1
  446. package/dist/clients/claude/commands/ironbee-analyze.md +0 -42
  447. package/dist/clients/cursor/commands/ironbee-analyze/SKILL.md +0 -48
  448. package/dist/commands/analyze.d.ts +0 -3
  449. package/dist/commands/analyze.d.ts.map +0 -1
  450. package/dist/commands/analyze.js +0 -329
  451. package/dist/commands/analyze.js.map +0 -1
  452. package/dist/commands/claude.d.ts.map +0 -1
  453. package/dist/commands/claude.js.map +0 -1
  454. package/dist/commands/otel.d.ts.map +0 -1
  455. package/dist/commands/otel.js.map +0 -1
  456. package/dist/commands/process-analytics.d.ts +0 -18
  457. package/dist/commands/process-analytics.d.ts.map +0 -1
  458. package/dist/commands/process-analytics.js.map +0 -1
  459. package/dist/commands/statusline-toggle.d.ts.map +0 -1
  460. package/dist/commands/statusline-toggle.js.map +0 -1
  461. package/dist/commands/statusline.d.ts.map +0 -1
  462. package/dist/commands/statusline.js.map +0 -1
  463. package/dist/otel/context/build.d.ts.map +0 -1
  464. package/dist/otel/context/build.js.map +0 -1
  465. package/dist/otel/context/classify.d.ts.map +0 -1
  466. package/dist/otel/context/classify.js.map +0 -1
  467. package/dist/otel/context/extract.d.ts.map +0 -1
  468. package/dist/otel/context/extract.js.map +0 -1
  469. package/dist/otel/context/markers.d.ts.map +0 -1
  470. package/dist/otel/context/markers.js.map +0 -1
  471. package/dist/otel/context/util.d.ts.map +0 -1
  472. package/dist/otel/context/util.js.map +0 -1
  473. package/dist/otel/daemon/ensure.d.ts.map +0 -1
  474. package/dist/otel/daemon/ensure.js.map +0 -1
  475. package/dist/otel/daemon/forward.d.ts.map +0 -1
  476. package/dist/otel/daemon/forward.js.map +0 -1
  477. package/dist/otel/daemon/paths.d.ts.map +0 -1
  478. package/dist/otel/daemon/paths.js.map +0 -1
  479. package/dist/otel/daemon/process.d.ts.map +0 -1
  480. package/dist/otel/daemon/process.js.map +0 -1
  481. package/dist/otel/daemon/reprocess.d.ts.map +0 -1
  482. package/dist/otel/daemon/reprocess.js.map +0 -1
  483. package/dist/otel/log-handler.d.ts.map +0 -1
  484. package/dist/otel/log-handler.js.map +0 -1
  485. /package/dist/analytics/{log.d.ts → claude/log.d.ts} +0 -0
  486. /package/dist/analytics/{transcript.d.ts → claude/transcript.d.ts} +0 -0
  487. /package/dist/analytics/{classifier.d.ts → shared/classifier.d.ts} +0 -0
  488. /package/dist/analytics/{errors.d.ts → shared/errors.d.ts} +0 -0
  489. /package/dist/analytics/{errors.js → shared/errors.js} +0 -0
  490. /package/dist/analytics/{types.js → shared/types.js} +0 -0
  491. /package/dist/otel/{context → claude/context}/classify.d.ts +0 -0
  492. /package/dist/otel/{context → claude/context}/classify.js +0 -0
  493. /package/dist/otel/{context → claude/context}/extract.js +0 -0
  494. /package/dist/otel/{context → claude/context}/markers.d.ts +0 -0
  495. /package/dist/otel/{context → claude/context}/util.d.ts +0 -0
  496. /package/dist/otel/{context → claude/context}/util.js +0 -0
  497. /package/dist/otel/{daemon → claude/daemon}/paths.d.ts +0 -0
  498. /package/dist/otel/{daemon → claude/daemon}/paths.js +0 -0
  499. /package/dist/otel/{daemon → claude/daemon}/reprocess.d.ts +0 -0
  500. /package/dist/otel/{log-handler.d.ts → claude/log-handler.d.ts} +0 -0
@@ -0,0 +1,427 @@
1
+ "use strict";
2
+ /**
3
+ * Codex CLI client adapter.
4
+ *
5
+ * Targets interactive Codex TUI (the developer-workstation surface).
6
+ * `codex exec` non-interactive mode is OUT OF SCOPE — hooks don't fire there
7
+ * per regression #24211.
8
+ *
9
+ * Install writes USER-LEVEL artifacts (`~/.codex/hooks.json`,
10
+ * `~/.codex/config.toml`) to bypass Codex's project-trust gate, plus
11
+ * PROJECT-LEVEL guidance (`AGENTS.md` block, `.agents/skills/<name>/SKILL.md`).
12
+ * Uninstall is symmetric — strips IronBee blocks, preserves user content.
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.CodexClient = void 0;
16
+ const fs_1 = require("fs");
17
+ const os_1 = require("os");
18
+ const path_1 = require("path");
19
+ const gitignore_1 = require("../../lib/gitignore");
20
+ const logger_1 = require("../../lib/logger");
21
+ const output_1 = require("../../lib/output");
22
+ const fs_prune_1 = require("../../lib/fs-prune");
23
+ const config_1 = require("../../lib/config");
24
+ const platform_section_1 = require("../../lib/platform-section");
25
+ const util_1 = require("./util");
26
+ const verify_gate_1 = require("./hooks/verify-gate");
27
+ const activity_end_1 = require("./hooks/activity-end");
28
+ const session_start_1 = require("./hooks/session-start");
29
+ const activity_start_1 = require("./hooks/activity-start");
30
+ const require_verification_1 = require("./hooks/require-verification");
31
+ const require_verdict_1 = require("./hooks/require-verdict");
32
+ const clear_verdict_1 = require("./hooks/clear-verdict");
33
+ const track_action_1 = require("./hooks/track-action");
34
+ const track_action_monitor_1 = require("./hooks/track-action-monitor");
35
+ const track_action_pre_1 = require("./hooks/track-action-pre");
36
+ const BROWSER_SERVER = "browser-devtools";
37
+ const NODE_SERVER = "node-devtools";
38
+ const BACKEND_SERVER = "backend-devtools";
39
+ const IRONBEE_HOOK_MARKER = "ironbee";
40
+ /**
41
+ * Resolve the platforms-fragments dir at runtime. Mirrors the Cursor pattern.
42
+ * `__dirname` is `src/clients/codex/` (or `dist/clients/codex/` after build);
43
+ * `..` + `client` walks back up to allow sharing across clients if ever needed.
44
+ */
45
+ function platformsDirFor(client) {
46
+ return (0, path_1.join)(__dirname, "..", client, "platforms");
47
+ }
48
+ function codexColor(text) {
49
+ return output_1.pc.dim(text);
50
+ }
51
+ function isIronBeeHookGroup(group) {
52
+ return group.hooks.some((h) => h.command.includes(IRONBEE_HOOK_MARKER));
53
+ }
54
+ function isCodexHooksEmpty(config) {
55
+ const keys = Object.keys(config);
56
+ if (keys.length === 0) {
57
+ return true;
58
+ }
59
+ if (keys.length === 1 && keys[0] === "hooks") {
60
+ return Object.keys(config.hooks ?? {}).length === 0;
61
+ }
62
+ return false;
63
+ }
64
+ class CodexClient {
65
+ constructor() {
66
+ this.name = "codex";
67
+ }
68
+ detect(projectDir) {
69
+ // Pure project-presence signal — only IronBee creates this dir.
70
+ // Independent of `~/.codex/auth.json` so `codex logout` doesn't break detect.
71
+ return (0, fs_1.existsSync)((0, path_1.join)(projectDir, ".agents", "skills", "ironbee-verification"));
72
+ }
73
+ resolveProjectDir() {
74
+ return process.env.CODEX_PROJECT_DIR ?? process.env.IRONBEE_PROJECT_DIR ?? process.cwd();
75
+ }
76
+ install(projectDir, config) {
77
+ const cfg = config ?? (0, config_1.loadConfig)(projectDir);
78
+ const verificationEnabled = (0, config_1.getVerificationEnabled)(cfg);
79
+ // Clean up old artifacts first (re-install / mode-toggle safety).
80
+ this.cleanupArtifacts(projectDir);
81
+ // 1) hooks.json — user-level, merged with existing user hooks
82
+ const hooksPath = (0, util_1.codexHooksJsonPath)();
83
+ this.mergeHooksConfig(hooksPath, verificationEnabled);
84
+ // 2) config.toml — [features] hooks = true + [mcp_servers.*] per cycle
85
+ this.mergeConfigToml(projectDir, cfg, verificationEnabled);
86
+ // 3) Project-level guidance: AGENTS.md + skills
87
+ if (verificationEnabled) {
88
+ this.writeAgentsMdBlock(projectDir, cfg);
89
+ this.writeSkills(projectDir);
90
+ // Sync platform marker blocks in the standalone skill + command
91
+ // files (.agents/skills/ironbee-*/SKILL.md) to current config
92
+ // state. The AGENTS.md rule block is handled inline by
93
+ // writeAgentsMdBlock above (it lives embedded in a delimited
94
+ // block, not a standalone file, so PLATFORM_TARGETS doesn't
95
+ // cover it).
96
+ (0, platform_section_1.syncPlatformSectionsToConfig)(projectDir, platformsDirFor);
97
+ }
98
+ // 4) .gitignore safety — shared helper covers .ironbee/sessions/,
99
+ // .ironbee/otel/, .ironbee/config.local.json, .claude/settings.local.json.
100
+ // We deliberately do NOT gitignore .agents/skills/ironbee-* — the team
101
+ // should share those skills (same semantic as Claude's .claude/skills/*).
102
+ (0, gitignore_1.ensureIronBeeGitignored)(projectDir);
103
+ // 5) install-output checklist
104
+ console.log(` ${output_1.pc.dim("→")} ${codexColor("[codex]")} hooks ${output_1.pc.dim("→")} ${output_1.pc.dim(hooksPath)}`);
105
+ console.log(` ${output_1.pc.dim("→")} ${codexColor("[codex]")} config ${output_1.pc.dim("→")} ${output_1.pc.dim((0, util_1.codexConfigTomlPath)())}`);
106
+ if (verificationEnabled) {
107
+ console.log(` ${output_1.pc.dim("→")} ${codexColor("[codex]")} agents ${output_1.pc.dim("→")} ${output_1.pc.dim((0, path_1.join)(projectDir, "AGENTS.md"))}`);
108
+ console.log(` ${output_1.pc.dim("→")} ${codexColor("[codex]")} skill ${output_1.pc.dim("→")} ${output_1.pc.dim((0, path_1.join)(projectDir, ".agents", "skills", "ironbee-verification", "SKILL.md"))}`);
109
+ console.log(` ${output_1.pc.dim("→")} ${codexColor("[codex]")} command ${output_1.pc.dim("→")} ${output_1.pc.dim((0, path_1.join)(projectDir, ".agents", "skills", "ironbee-verify", "SKILL.md"))}`);
110
+ }
111
+ else {
112
+ console.log(` ${output_1.pc.dim("→")} ${codexColor("[codex]")} ${output_1.pc.yellow("monitoring-only mode")} (verification.enable: false)`);
113
+ }
114
+ console.log();
115
+ console.log(` ${output_1.pc.yellow("⚠")} ${output_1.pc.yellow("Codex requires one-time TUI setup:")}`);
116
+ console.log(` ${output_1.pc.yellow("1.")} Run ${output_1.pc.bold("/hooks")} in a fresh Codex session to review and trust IronBee hooks`);
117
+ console.log(` ${output_1.pc.yellow("2.")} Restart any open Codex sessions to pick up new hook config`);
118
+ }
119
+ uninstall(projectDir) {
120
+ this.cleanupArtifacts(projectDir);
121
+ console.log(` ${output_1.pc.dim("→")} ${codexColor("[codex]")} removed hooks, MCP entries, AGENTS.md block, and skills`);
122
+ }
123
+ cleanupArtifacts(projectDir) {
124
+ // 1) strip IronBee hook entries from ~/.codex/hooks.json
125
+ const hooksPath = (0, util_1.codexHooksJsonPath)();
126
+ this.removeIronBeeHooks(hooksPath);
127
+ this.maybeDeleteEmptyHooks(hooksPath);
128
+ // 2) strip [mcp_servers.<our-names>] from ~/.codex/config.toml.
129
+ // Leave [features] hooks = true untouched (generic flag).
130
+ this.removeIronBeeMcpServers();
131
+ // 3) strip AGENTS.md block; remove file if empty
132
+ const agentsPath = (0, path_1.join)(projectDir, "AGENTS.md");
133
+ if ((0, fs_1.existsSync)(agentsPath)) {
134
+ try {
135
+ const existing = (0, fs_1.readFileSync)(agentsPath, "utf-8");
136
+ const remaining = (0, util_1.stripAgentsMdBlock)(existing);
137
+ if (remaining === null) {
138
+ (0, fs_1.unlinkSync)(agentsPath);
139
+ }
140
+ else if (remaining !== existing) {
141
+ (0, fs_1.writeFileSync)(agentsPath, remaining);
142
+ }
143
+ }
144
+ catch (e) {
145
+ logger_1.logger.debug(`failed to strip AGENTS.md block: ${e}`);
146
+ }
147
+ }
148
+ // 4) remove skills + commands
149
+ const skillsDir = (0, path_1.join)(projectDir, ".agents", "skills");
150
+ this.removeDir((0, path_1.join)(skillsDir, "ironbee-verification"));
151
+ this.removeDir((0, path_1.join)(skillsDir, "ironbee-verify"));
152
+ (0, fs_prune_1.pruneEmptyDirs)((0, path_1.join)(projectDir, ".agents"));
153
+ }
154
+ async runVerifyGate(projectDir) {
155
+ await (0, verify_gate_1.run)(projectDir);
156
+ }
157
+ async runActivityEnd(projectDir) {
158
+ await (0, activity_end_1.run)(projectDir);
159
+ }
160
+ async runSessionStart(projectDir) {
161
+ await (0, session_start_1.run)(projectDir);
162
+ }
163
+ async runActivityStart(projectDir) {
164
+ await (0, activity_start_1.run)(projectDir);
165
+ }
166
+ async runRequireVerification(projectDir) {
167
+ await (0, require_verification_1.run)(projectDir);
168
+ }
169
+ async runRequireVerdict(projectDir) {
170
+ await (0, require_verdict_1.run)(projectDir);
171
+ }
172
+ async runClearVerdict(projectDir) {
173
+ await (0, clear_verdict_1.run)(projectDir);
174
+ }
175
+ async runTrackAction(projectDir) {
176
+ await (0, track_action_1.run)(projectDir);
177
+ }
178
+ async runTrackActionMonitor(projectDir) {
179
+ await (0, track_action_monitor_1.run)(projectDir);
180
+ }
181
+ async runTrackActionPre(projectDir) {
182
+ await (0, track_action_pre_1.run)(projectDir);
183
+ }
184
+ async runSessionEnd(_projectDir) {
185
+ // Codex has no SessionEnd hook event — `/quit` fires zero hooks.
186
+ // The Stop-as-checkpoint pattern in verify-gate.ts / activity-end.ts
187
+ // covers session_end synthesis instead. This method is a no-op
188
+ // because the IClient interface requires it; we never register a
189
+ // hook config entry for it on Codex.
190
+ logger_1.logger.debug(`session-end: no-op on Codex (no SessionEnd hook event)`);
191
+ }
192
+ mergeHooksConfig(hooksPath, verificationEnabled) {
193
+ (0, fs_1.mkdirSync)((0, path_1.join)((0, os_1.homedir)(), ".codex"), { recursive: true });
194
+ let config = { hooks: {} };
195
+ if ((0, fs_1.existsSync)(hooksPath)) {
196
+ try {
197
+ config = JSON.parse((0, fs_1.readFileSync)(hooksPath, "utf-8"));
198
+ if (!config.hooks) {
199
+ config.hooks = {};
200
+ }
201
+ }
202
+ catch (e) {
203
+ logger_1.logger.debug(`failed to parse ${hooksPath}: ${e}`);
204
+ config = { hooks: {} };
205
+ }
206
+ }
207
+ // Strip existing IronBee entries (re-install + mode-toggle safety)
208
+ for (const evt of Object.keys(config.hooks)) {
209
+ const filtered = config.hooks[evt].filter((g) => !isIronBeeHookGroup(g));
210
+ if (filtered.length === 0) {
211
+ delete config.hooks[evt];
212
+ }
213
+ else {
214
+ config.hooks[evt] = filtered;
215
+ }
216
+ }
217
+ const addGroup = (event, matcher, command) => {
218
+ if (!config.hooks[event]) {
219
+ config.hooks[event] = [];
220
+ }
221
+ config.hooks[event].push({
222
+ matcher,
223
+ hooks: [{ type: "command", command }],
224
+ });
225
+ };
226
+ // SessionStart (always)
227
+ addGroup("SessionStart", ".*", `ironbee hook session-start --client codex`);
228
+ // UserPromptSubmit (always) — start activity + UPS-reconcile for interrupt detection
229
+ addGroup("UserPromptSubmit", ".*", `ironbee hook activity-start --client codex`);
230
+ // PreToolUse — timestamp stash for duration derivation (always)
231
+ addGroup("PreToolUse", ".*", `ironbee hook track-action-pre --client codex`);
232
+ if (verificationEnabled) {
233
+ // PreToolUse — require-verification on devtools MCP tools.
234
+ // Codex flattens `-` → `_` in the server segment on hook dispatch
235
+ // (real wire shape: `mcp__browser_devtools__bdt_*`), so the
236
+ // matcher accepts BOTH forms: hyphenated (defensive / future
237
+ // Codex versions) AND underscored (current real wire shape).
238
+ // Without this, no devtools tool ever triggers the gate.
239
+ addGroup("PreToolUse", "^mcp__(browser|node|backend)[-_]devtools__.*", `ironbee hook require-verification --client codex`);
240
+ // PreToolUse — require-verdict on apply_patch
241
+ addGroup("PreToolUse", "^apply_patch$", `ironbee hook require-verdict --client codex`);
242
+ // PostToolUse — clear-verdict on apply_patch
243
+ addGroup("PostToolUse", "^apply_patch$", `ironbee hook clear-verdict --client codex`);
244
+ }
245
+ // PostToolUse — track every tool (mode-paired command)
246
+ const trackCmd = verificationEnabled
247
+ ? `ironbee hook track-action --client codex`
248
+ : `ironbee hook track-action-monitor --client codex`;
249
+ addGroup("PostToolUse", ".*", trackCmd);
250
+ // Stop — verify-gate (enabled) or activity-end (monitoring)
251
+ const stopCmd = verificationEnabled
252
+ ? `ironbee hook verify-gate --client codex`
253
+ : `ironbee hook activity-end --client codex`;
254
+ addGroup("Stop", ".*", stopCmd);
255
+ (0, fs_1.writeFileSync)(hooksPath, JSON.stringify(config, null, 2));
256
+ }
257
+ removeIronBeeHooks(hooksPath) {
258
+ if (!(0, fs_1.existsSync)(hooksPath)) {
259
+ return;
260
+ }
261
+ try {
262
+ const config = JSON.parse((0, fs_1.readFileSync)(hooksPath, "utf-8"));
263
+ if (!config.hooks) {
264
+ return;
265
+ }
266
+ for (const evt of Object.keys(config.hooks)) {
267
+ const filtered = config.hooks[evt].filter((g) => !isIronBeeHookGroup(g));
268
+ if (filtered.length === 0) {
269
+ delete config.hooks[evt];
270
+ }
271
+ else {
272
+ config.hooks[evt] = filtered;
273
+ }
274
+ }
275
+ (0, fs_1.writeFileSync)(hooksPath, JSON.stringify(config, null, 2));
276
+ }
277
+ catch (e) {
278
+ logger_1.logger.debug(`failed to strip IronBee hooks from ${hooksPath}: ${e}`);
279
+ }
280
+ }
281
+ maybeDeleteEmptyHooks(hooksPath) {
282
+ if (!(0, fs_1.existsSync)(hooksPath)) {
283
+ return;
284
+ }
285
+ try {
286
+ const config = JSON.parse((0, fs_1.readFileSync)(hooksPath, "utf-8"));
287
+ if (isCodexHooksEmpty(config)) {
288
+ (0, fs_1.unlinkSync)(hooksPath);
289
+ }
290
+ }
291
+ catch (e) {
292
+ logger_1.logger.debug(`failed to inspect ${hooksPath} for emptiness: ${e}`);
293
+ }
294
+ }
295
+ mergeConfigToml(projectDir, cfg, verificationEnabled) {
296
+ (0, fs_1.mkdirSync)((0, path_1.join)((0, os_1.homedir)(), ".codex"), { recursive: true });
297
+ let content = (0, util_1.readCodexConfigToml)();
298
+ // [features] hooks = true (idempotent merge)
299
+ content = (0, util_1.ensureFeaturesHooksTrue)(content);
300
+ // [mcp_servers.<name>] per cycle (verification-enabled only)
301
+ if (verificationEnabled) {
302
+ if ((0, config_1.isCycleEnabled)(cfg, "browser")) {
303
+ const entry = (0, config_1.getMcpServerEntry)(projectDir);
304
+ content = (0, util_1.upsertMcpServer)(content, BROWSER_SERVER, mcpEntryToTomlBody(entry));
305
+ }
306
+ else {
307
+ content = (0, util_1.removeMcpServer)(content, BROWSER_SERVER);
308
+ }
309
+ if ((0, config_1.isCycleEnabled)(cfg, "node")) {
310
+ const entry = (0, config_1.getNodeDevToolsMcpEntry)(projectDir);
311
+ content = (0, util_1.upsertMcpServer)(content, NODE_SERVER, mcpEntryToTomlBody(entry));
312
+ }
313
+ else {
314
+ content = (0, util_1.removeMcpServer)(content, NODE_SERVER);
315
+ }
316
+ if ((0, config_1.isCycleEnabled)(cfg, "backend")) {
317
+ const entry = (0, config_1.getBackendDevToolsMcpEntry)(projectDir);
318
+ content = (0, util_1.upsertMcpServer)(content, BACKEND_SERVER, mcpEntryToTomlBody(entry));
319
+ }
320
+ else {
321
+ content = (0, util_1.removeMcpServer)(content, BACKEND_SERVER);
322
+ }
323
+ }
324
+ else {
325
+ // Strip all 3 in monitoring mode
326
+ content = (0, util_1.removeMcpServer)(content, BROWSER_SERVER);
327
+ content = (0, util_1.removeMcpServer)(content, NODE_SERVER);
328
+ content = (0, util_1.removeMcpServer)(content, BACKEND_SERVER);
329
+ }
330
+ (0, util_1.writeCodexConfigToml)(content);
331
+ }
332
+ removeIronBeeMcpServers() {
333
+ let content = (0, util_1.readCodexConfigToml)();
334
+ if (!content) {
335
+ return;
336
+ }
337
+ content = (0, util_1.removeMcpServer)(content, BROWSER_SERVER);
338
+ content = (0, util_1.removeMcpServer)(content, NODE_SERVER);
339
+ content = (0, util_1.removeMcpServer)(content, BACKEND_SERVER);
340
+ (0, util_1.writeCodexConfigToml)(content);
341
+ }
342
+ writeAgentsMdBlock(projectDir, cfg) {
343
+ const agentsPath = (0, path_1.join)(projectDir, "AGENTS.md");
344
+ const ruleSourcePath = (0, path_1.join)(__dirname, "rules", "ironbee-verification.md");
345
+ let blockContent;
346
+ try {
347
+ blockContent = (0, fs_1.readFileSync)(ruleSourcePath, "utf-8");
348
+ }
349
+ catch (e) {
350
+ logger_1.logger.debug(`failed to read rule source ${ruleSourcePath}: ${e}`);
351
+ return;
352
+ }
353
+ // Splice platform fragments INLINE into the rule content (per enabled
354
+ // cycle) BEFORE wrapping it in the AGENTS.md ironbee block. The rule
355
+ // is embedded — not a standalone file — so PLATFORM_TARGETS /
356
+ // applyPlatformToProjectFiles can't reach it. We replicate the
357
+ // splice in memory: enabled cycle → load fragment; disabled cycle →
358
+ // replace with placeholder.
359
+ const platformsDir = platformsDirFor("codex");
360
+ for (const cycle of config_1.ALL_CYCLES) {
361
+ const enabled = (0, config_1.isCycleEnabled)(cfg, cycle);
362
+ const resolver = enabled
363
+ ? (key) => {
364
+ const fragPath = (0, path_1.join)(platformsDir, (0, platform_section_1.fragmentFilename)("rule", cycle, key));
365
+ if (!(0, fs_1.existsSync)(fragPath)) {
366
+ const keyDisplay = key.length > 0 ? `${cycle}:${key}` : cycle;
367
+ logger_1.logger.debug(`AGENTS.md platform-section ${keyDisplay}: missing fragment ${fragPath}, using placeholder`);
368
+ return null;
369
+ }
370
+ return (0, fs_1.readFileSync)(fragPath, "utf-8").trimEnd();
371
+ }
372
+ : null;
373
+ blockContent = (0, platform_section_1.applyPlatformSection)(blockContent, cycle, resolver, "AGENTS.md");
374
+ }
375
+ const existing = (0, fs_1.existsSync)(agentsPath) ? (0, fs_1.readFileSync)(agentsPath, "utf-8") : "";
376
+ const updated = (0, util_1.upsertAgentsMdBlock)(existing, blockContent);
377
+ (0, fs_1.writeFileSync)(agentsPath, updated);
378
+ }
379
+ writeSkills(projectDir) {
380
+ const skillsRoot = (0, path_1.join)(projectDir, ".agents", "skills");
381
+ const verificationSkillDir = (0, path_1.join)(skillsRoot, "ironbee-verification");
382
+ (0, fs_1.mkdirSync)(verificationSkillDir, { recursive: true });
383
+ const skillSrc = (0, path_1.join)(__dirname, "skills", "ironbee-verification.md");
384
+ try {
385
+ const content = (0, fs_1.readFileSync)(skillSrc, "utf-8");
386
+ (0, fs_1.writeFileSync)((0, path_1.join)(verificationSkillDir, "SKILL.md"), content);
387
+ }
388
+ catch (e) {
389
+ logger_1.logger.debug(`failed to copy skill ${skillSrc}: ${e}`);
390
+ }
391
+ const verifyDir = (0, path_1.join)(skillsRoot, "ironbee-verify");
392
+ (0, fs_1.mkdirSync)(verifyDir, { recursive: true });
393
+ const verifySrc = (0, path_1.join)(__dirname, "commands", "ironbee-verify", "SKILL.md");
394
+ try {
395
+ const content = (0, fs_1.readFileSync)(verifySrc, "utf-8");
396
+ (0, fs_1.writeFileSync)((0, path_1.join)(verifyDir, "SKILL.md"), content);
397
+ }
398
+ catch (e) {
399
+ logger_1.logger.debug(`failed to copy verify command ${verifySrc}: ${e}`);
400
+ }
401
+ }
402
+ removeDir(dir) {
403
+ if ((0, fs_1.existsSync)(dir)) {
404
+ try {
405
+ (0, fs_1.rmSync)(dir, { recursive: true, force: true });
406
+ }
407
+ catch (e) {
408
+ logger_1.logger.debug(`failed to remove ${dir}: ${e}`);
409
+ }
410
+ }
411
+ }
412
+ }
413
+ exports.CodexClient = CodexClient;
414
+ /**
415
+ * Convert an MCP entry (the JSON shape used in Claude/Cursor's .mcp.json)
416
+ * into per-line TOML body suitable for `[mcp_servers.<name>]`. Inline tables
417
+ * are used for env (matches Codex's documented format).
418
+ */
419
+ function mcpEntryToTomlBody(entry) {
420
+ const record = entry;
421
+ return (0, util_1.tomlBodyFromRecord)(record);
422
+ }
423
+ // Silence "unused import" linter — markers are exported from util but the
424
+ // install path references them indirectly via upsertAgentsMdBlock.
425
+ void util_1.AGENTS_MD_START_MARKER;
426
+ void util_1.AGENTS_MD_END_MARKER;
427
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/clients/codex/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,108 @@
1
+ <!-- Backend protocol verification is ENABLED for this project. -->
2
+
3
+ ## Backend Mode (when `backend.verifyPatterns` matches an edited file)
4
+
5
+ If the project has the backend protocol cycle enabled (`ironbee backend enable` once at setup) and your edits touch matching paths (e.g. `server/**`, `api/**`, `routes/**`, `controllers/**`), the Stop hook also enforces a Backend cycle. The same `verification-start` covers every active cycle; one platform-agnostic verdict covers them all.
6
+
7
+ This cycle is **runtime- and language-agnostic** — it works for Node, Java, Python, Go, Rust, Ruby, .NET, PHP, Elixir, Kotlin, Scala. The agent makes real protocol calls (HTTP / gRPC / GraphQL / WebSocket) against the running service, inspects logs, OR reads database state; it never attaches to a process.
8
+
9
+ ### Mode behavior (backend cycle)
10
+ - **default** (no arg or `default`): exercise the endpoints your diff touched via ONE of the three evidence paths (protocol-call, log evidence, or DB evidence — see below). Map each changed file → the route(s) / handler(s) / RPC method(s) / table(s) it exposes, then either call them yourself and chain follow-ups to verify side effects, OR set up log capture, OR inspect database state directly.
11
+ - **full**: cover every endpoint reachable from files matching `backend.verifyPatterns`, not just the changed files. Cover the success path, at least one error path, and any auth-gated variant for each. For schema / migration changes, verify every affected table.
12
+ - `visual` / `functional`: browser-only modes; this cycle behaves as `default` when they are passed.
13
+
14
+ ### Steps (additive to the browser flow above)
15
+
16
+ The cycle is satisfied by ANY ONE of three evidence paths: protocol-call (you drive the request), log-evidence (something else drives it; you read the logs), or DB-evidence (you inspect database state). Pick whichever fits the task — multiple can be combined.
17
+
18
+ 1. **Confirm the backend service is running** (the user's dev server / Docker compose / k8s port-forward / …). Don't start the service yourself — ask the user if it's not obvious.
19
+ 2. **Identify the affected layer** — wire endpoint, log output, and/or database state. Map your code change to its observable side(s).
20
+ 3. **Exercise ONE or more evidence paths**:
21
+
22
+ **Path A — Protocol-call (you drive the request):**
23
+ - `mcp__backend-devtools__bedt_request_http` — HTTP/1.1 + HTTP/2 (ALPN auto-negotiates).
24
+ - `mcp__backend-devtools__bedt_request_grpc` — unary + 3 streaming modes; `.proto` text or descriptor.
25
+ - `mcp__backend-devtools__bedt_request_graphql` — query/mutation/persisted query.
26
+ - `mcp__backend-devtools__bedt_request_websocket-open` then `bedt_request_websocket-send` / `bedt_request_websocket-receive` / `bedt_request_websocket-close` for stateful WS sessions.
27
+ - `mcp__backend-devtools__bedt_request_replay` — re-issue a captured curl command or HAR entry.
28
+ - **Inspect the response** — `status`, body, headers, `traceId`. **4xx/5xx and gRPC non-OK are normal results, not transport errors.** Decide PASS/FAIL based on what the test actually requires.
29
+
30
+ **Path B — Log evidence (an external driver hits the endpoint; you read the logs):**
31
+ - `mcp__backend-devtools__bedt_log_register-source` — register the running service's log destination (`type: "file"` + `path`, `type: "docker"` + `container`, or `type: "kubernetes"` + `pod`).
32
+ - `mcp__backend-devtools__bedt_log_read` / `bedt_log_read-multi` — point-in-time read with filters (`tail`, `since`/`until`, `pattern`, `level`, `parseJson` + `jsonFilter`, `contextBefore`/`contextAfter`, `select`, `coalesce`).
33
+ - `mcp__backend-devtools__bedt_log_follow` + `bedt_log_get-followed` (and `bedt_log_stop-follow`) — streaming follow when you need to capture lines that emit AFTER you trigger.
34
+ - **Verify the lines match the expectation** — error gone, expected line present, trace-id chained through, no unexpected ERROR-level entries.
35
+
36
+ **Path C — DB evidence (you inspect database state directly):**
37
+ - `mcp__backend-devtools__bedt_db_connect` — open a named connection (`type: "postgres" | "mysql" | "sqlite"`, prefer `connectionStringEnv` over inline `connectionString`, default `allowWrites: false`).
38
+ - `mcp__backend-devtools__bedt_db_list-tables` / `bedt_db_describe-table` — discover schema; great for migration verification.
39
+ - `mcp__backend-devtools__bedt_db_query` — run a read query (parametrized; readonly mode is enforced server-side).
40
+ - `mcp__backend-devtools__bedt_db_snapshot` (+ `bedt_db_diff`) — pre/post state diff so you can prove a code path changed exactly the rows it should have.
41
+ - `mcp__backend-devtools__bedt_db_watch-changes` + `bedt_db_get-changes` — streaming change capture for verifying writes triggered by a protocol call or external driver.
42
+ - `mcp__backend-devtools__bedt_db_transaction-begin/-commit/-rollback` — scope seed data to one test so it doesn't leak.
43
+ - `bedt_db_disconnect` to clean up (optional — session teardown handles it).
44
+ 4. **Chain follow-ups across paths** — protocol-call → DB read to verify writes landed, protocol-call → log read to verify trace-id chained, etc. Use `bedt_request_set-default-headers` for auth tokens (host-scoped), `bedt_request_set-cookies` for session state on Path A.
45
+ 5. **Trace correlation (optional, `o11y_*` primitives):** IronBee already pins the verification cycle's traceId on every backend tool call via `_metadata.traceId` (outranks any session pin), so the orchestrator's correlation root is authoritative. Use `bedt_o11y_get-trace-context` to read it, then pass it to `bedt_log_read { pattern: "<traceId>" }` to slice logs for one flow. `bedt_o11y_new-trace-id` / `bedt_o11y_set-trace-context` are available when you want to anchor a flow under an explicit id (e.g. integration-test runs).
46
+ 6. **Submit verdict** including the fields matching the path(s) you exercised. If browser and/or node cycles are also active, include their fields in the SAME verdict — do not submit two verdicts.
47
+
48
+ ### Verdict (platform-agnostic)
49
+
50
+ The verdict shape is the same regardless of which evidence path (protocol-call / log / db) you took — `status` + `checks` (+ `issues` / `fixes` as needed):
51
+
52
+ ```json
53
+ {
54
+ "session_id": "...",
55
+ "status": "pass",
56
+ "checks": ["POST /api/orders returned 201 with order id", "GET /api/orders/:id reflects new order"]
57
+ }
58
+ ```
59
+
60
+ The gate requires that AT LEAST one evidence path was actually exercised in your tool calls — `bedt_request_*` for protocol-call, `bedt_log_register-source` + `bedt_log_read*` / `_follow` for log-evidence, or `bedt_db_connect` + a read/diff/snapshot/get-changes for DB-evidence. If none were used, the gate will reject.
61
+
62
+ For a multi-cycle pass (browser + backend, or browser + node + backend), every active cycle's pass criteria must hold.
63
+
64
+ ---
65
+
66
+ ## Default Mode (backend cycle)
67
+
68
+ Focus on the endpoints you changed — not every endpoint in the service.
69
+
70
+ ### 1. Study the changes
71
+ 1. Run `git diff --name-only` and `git diff --name-only HEAD~1`
72
+ 2. **Ignore `.ironbee/`, `.claude/`, `.cursor/`** — tool config, not application code
73
+ 3. **Read the full diff** for route / handler / controller / service files in scope — note the wire-level address (HTTP method+path, gRPC service+method, GraphQL operation, WebSocket path), request shape, response shape, side effects (DB writes, downstream calls, queue puts)
74
+ 4. Before opening the request or log tools, you should be able to answer: what endpoints did I touch? What does each return on the happy path? What does each return on the error path? What side effects need verification? Which side (request or log) is easier to drive for this task?
75
+
76
+ ### 2. Verify against the running service
77
+ Pick the evidence path(s) that fit the task:
78
+
79
+ **Protocol-call path** (you drive the request):
80
+ - **Call each changed endpoint** with the matching tool — `mcp__backend-devtools__bedt_request_http` / `bedt_request_grpc` / `bedt_request_graphql` / `bedt_request_websocket-open`
81
+ - **Cross-reference the response against the diff** — status, body shape, headers, gRPC status code
82
+ - **Chain a follow-up call** to verify side effects (POST then GET, set then list, mutation then query, …)
83
+ - **Test one error path** per new branch — invalid body, missing field, missing auth, 404 path
84
+ - **Capture `traceId`** when available — useful for joining with downstream cycle evidence
85
+
86
+ **Log-evidence path** (an external driver hits it; you read the logs):
87
+ - **Register the service's log source** with `mcp__backend-devtools__bedt_log_register-source` (file / docker / kubernetes)
88
+ - **Read or follow** with `bedt_log_read` / `bedt_log_read-multi` (point-in-time, filter by `pattern` / `level` / `since-until` / `jsonFilter`) or `bedt_log_follow` (streaming for after-the-trigger capture)
89
+ - **Correlate with `traceId`** — use `pattern: "<traceId>"` to pull only the lines for one request
90
+ - **Verify the expected line is present** AND **no unexpected ERROR-level entries appeared** for the touched route(s)
91
+
92
+ **DB-evidence path** (you inspect database state directly):
93
+ - **Open a named, readonly connection** with `mcp__backend-devtools__bedt_db_connect` — prefer `connectionStringEnv` so the secret never flows through the agent context.
94
+ - **Discover schema** via `bedt_db_list-tables` + `bedt_db_describe-table` for migrations / column additions.
95
+ - **Run targeted reads** via `bedt_db_query` for row-count, content, and constraint checks; `bedt_db_snapshot` + `bedt_db_diff` for pre/post state proofs; `bedt_db_watch-changes` + `bedt_db_get-changes` for streaming change capture during a triggered call.
96
+ - **Disconnect** when done (`bedt_db_disconnect`) — optional; the session tears connections down at end.
97
+
98
+ ---
99
+
100
+ ## Full Mode (`/ironbee-verify full`, backend cycle)
101
+
102
+ Exercise every endpoint / log source / DB table reachable from files matching `backend.verifyPatterns`, not just the changed files. Do NOT run `git diff` or scope to recent changes.
103
+
104
+ - Hit every route / RPC method / GraphQL operation / WebSocket lifecycle in scope (protocol-call) OR cover them via the log feed when an external driver / test suite drives them (log evidence) OR via direct DB inspection for schema / migration coverage (DB evidence)
105
+ - Cover the success path AND at least one error path for each
106
+ - Cover any auth-gated variant (unauthenticated, wrong role) where authentication is present
107
+ - For migrations: verify every affected table's schema (`bedt_db_describe-table`) + sample row count before / after
108
+ - Any unexpected error response, unexpected ERROR-level log line, or unexpected schema drift during the run is a fail, regardless of when it was introduced