claudecode-omc 4.4.5 → 4.4.6

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 (839) hide show
  1. package/.mcp.json +2 -6
  2. package/README.es.md +64 -8
  3. package/README.ja.md +64 -8
  4. package/README.ko.md +64 -8
  5. package/README.pt.md +29 -0
  6. package/README.vi.md +29 -0
  7. package/README.zh.md +64 -8
  8. package/agents/architect.md +17 -7
  9. package/agents/code-reviewer.md +6 -7
  10. package/agents/critic.md +14 -1
  11. package/agents/deep-executor.md +6 -7
  12. package/agents/designer.md +6 -8
  13. package/agents/executor.md +6 -7
  14. package/agents/planner.md +21 -0
  15. package/agents/quality-reviewer.md +6 -7
  16. package/agents/security-reviewer.md +6 -7
  17. package/agents/test-engineer.md +6 -7
  18. package/bridge/mcp-server.cjs +517 -202
  19. package/bridge/runtime-cli.cjs +1547 -0
  20. package/bridge/team-bridge.cjs +348 -92
  21. package/bridge/{gemini-server.cjs → team-mcp.cjs} +10914 -10240
  22. package/dist/__tests__/auto-update.test.js +1 -1
  23. package/dist/__tests__/auto-update.test.js.map +1 -1
  24. package/dist/__tests__/cli-win32-warning.test.d.ts +2 -0
  25. package/dist/__tests__/cli-win32-warning.test.d.ts.map +1 -0
  26. package/dist/__tests__/cli-win32-warning.test.js +46 -0
  27. package/dist/__tests__/cli-win32-warning.test.js.map +1 -0
  28. package/dist/__tests__/codex-callsite-normalization.test.js +112 -0
  29. package/dist/__tests__/consensus-execution-handoff.test.d.ts +2 -0
  30. package/dist/__tests__/consensus-execution-handoff.test.d.ts.map +1 -1
  31. package/dist/__tests__/consensus-execution-handoff.test.js +48 -0
  32. package/dist/__tests__/consensus-execution-handoff.test.js.map +1 -1
  33. package/dist/__tests__/context-safety.test.d.ts +2 -0
  34. package/dist/__tests__/context-safety.test.d.ts.map +1 -0
  35. package/dist/__tests__/context-safety.test.js +59 -0
  36. package/dist/__tests__/context-safety.test.js.map +1 -0
  37. package/dist/__tests__/hooks.test.js +15 -0
  38. package/dist/__tests__/hooks.test.js.map +1 -1
  39. package/dist/__tests__/hud/call-counts.test.js +0 -3
  40. package/dist/__tests__/hud/call-counts.test.js.map +1 -1
  41. package/dist/__tests__/hud/defaults.test.js +3 -5
  42. package/dist/__tests__/hud/defaults.test.js.map +1 -1
  43. package/dist/__tests__/hud/prompt-time.test.d.ts +2 -0
  44. package/dist/__tests__/hud/prompt-time.test.d.ts.map +1 -0
  45. package/dist/__tests__/hud/prompt-time.test.js +24 -0
  46. package/dist/__tests__/hud/prompt-time.test.js.map +1 -0
  47. package/dist/__tests__/hud/render.test.js +0 -1
  48. package/dist/__tests__/hud/render.test.js.map +1 -1
  49. package/dist/__tests__/hud/version-display.test.js +1 -0
  50. package/dist/__tests__/hud/version-display.test.js.map +1 -1
  51. package/dist/__tests__/hud/windows-platform.test.js +0 -4
  52. package/dist/__tests__/hud/windows-platform.test.js.map +1 -1
  53. package/dist/__tests__/hud-windows.test.js +5 -3
  54. package/dist/__tests__/hud-windows.test.js.map +1 -1
  55. package/dist/__tests__/installer-hud-skip.test.js +12 -2
  56. package/dist/__tests__/installer-hud-skip.test.js.map +1 -1
  57. package/dist/__tests__/job-management-sqlite.test.js +0 -15
  58. package/dist/__tests__/job-management-sqlite.test.js.map +1 -1
  59. package/dist/__tests__/job-management.test.js +0 -16
  60. package/dist/__tests__/job-management.test.js.map +1 -1
  61. package/dist/__tests__/load-agent-prompt.test.js +0 -23
  62. package/dist/__tests__/load-agent-prompt.test.js.map +1 -1
  63. package/dist/__tests__/model-routing.test.js +3 -2
  64. package/dist/__tests__/model-routing.test.js.map +1 -1
  65. package/dist/__tests__/omc-tools-server-interop.test.js +1 -1
  66. package/dist/__tests__/omc-tools-server-interop.test.js.map +1 -1
  67. package/dist/__tests__/pre-tool-enforcer.test.d.ts +2 -0
  68. package/dist/__tests__/pre-tool-enforcer.test.d.ts.map +1 -0
  69. package/dist/__tests__/pre-tool-enforcer.test.js +194 -0
  70. package/dist/__tests__/pre-tool-enforcer.test.js.map +1 -0
  71. package/dist/__tests__/prompt-injection.test.js +0 -26
  72. package/dist/__tests__/prompt-injection.test.js.map +1 -1
  73. package/dist/__tests__/purge-stale-cache.test.js +3 -2
  74. package/dist/__tests__/purge-stale-cache.test.js.map +1 -1
  75. package/dist/__tests__/run-cjs-graceful-fallback.test.d.ts +2 -0
  76. package/dist/__tests__/run-cjs-graceful-fallback.test.d.ts.map +1 -0
  77. package/dist/__tests__/run-cjs-graceful-fallback.test.js +167 -0
  78. package/dist/__tests__/run-cjs-graceful-fallback.test.js.map +1 -0
  79. package/dist/__tests__/session-start-cache-cleanup.test.d.ts +2 -0
  80. package/dist/__tests__/session-start-cache-cleanup.test.d.ts.map +1 -0
  81. package/dist/__tests__/session-start-cache-cleanup.test.js +150 -0
  82. package/dist/__tests__/session-start-cache-cleanup.test.js.map +1 -0
  83. package/dist/__tests__/skills.test.js +10 -8
  84. package/dist/__tests__/skills.test.js.map +1 -1
  85. package/dist/__tests__/team-server-validation.test.d.ts +2 -0
  86. package/dist/__tests__/team-server-validation.test.d.ts.map +1 -0
  87. package/dist/__tests__/team-server-validation.test.js +122 -0
  88. package/dist/__tests__/team-server-validation.test.js.map +1 -0
  89. package/dist/agents/index.d.ts +0 -1
  90. package/dist/agents/index.d.ts.map +1 -1
  91. package/dist/agents/index.js +0 -2
  92. package/dist/agents/index.js.map +1 -1
  93. package/dist/agents/prompt-helpers.d.ts +74 -0
  94. package/dist/agents/prompt-helpers.d.ts.map +1 -0
  95. package/dist/agents/prompt-helpers.js +187 -0
  96. package/dist/agents/prompt-helpers.js.map +1 -0
  97. package/dist/agents/utils.d.ts +1 -5
  98. package/dist/agents/utils.d.ts.map +1 -1
  99. package/dist/agents/utils.js +1 -34
  100. package/dist/agents/utils.js.map +1 -1
  101. package/dist/cli/__tests__/launch.test.d.ts +1 -2
  102. package/dist/cli/__tests__/launch.test.d.ts.map +1 -1
  103. package/dist/cli/__tests__/launch.test.js +442 -48
  104. package/dist/cli/__tests__/launch.test.js.map +1 -1
  105. package/dist/cli/__tests__/teleport-help.test.d.ts +2 -0
  106. package/dist/cli/__tests__/teleport-help.test.d.ts.map +1 -0
  107. package/dist/cli/__tests__/teleport-help.test.js +17 -0
  108. package/dist/cli/__tests__/teleport-help.test.js.map +1 -0
  109. package/dist/cli/commands/teleport.d.ts +2 -1
  110. package/dist/cli/commands/teleport.d.ts.map +1 -1
  111. package/dist/cli/commands/teleport.js +6 -3
  112. package/dist/cli/commands/teleport.js.map +1 -1
  113. package/dist/cli/index.js +40 -290
  114. package/dist/cli/index.js.map +1 -1
  115. package/dist/cli/launch.d.ts +83 -3
  116. package/dist/cli/launch.d.ts.map +1 -1
  117. package/dist/cli/launch.js +213 -48
  118. package/dist/cli/launch.js.map +1 -1
  119. package/dist/cli/win32-warning.d.ts +6 -0
  120. package/dist/cli/win32-warning.d.ts.map +1 -0
  121. package/dist/cli/win32-warning.js +15 -0
  122. package/dist/cli/win32-warning.js.map +1 -0
  123. package/dist/config/loader.d.ts +9 -1
  124. package/dist/config/loader.d.ts.map +1 -1
  125. package/dist/config/loader.js +29 -19
  126. package/dist/config/loader.js.map +1 -1
  127. package/dist/config/models.d.ts +33 -0
  128. package/dist/config/models.d.ts.map +1 -0
  129. package/dist/config/models.js +49 -0
  130. package/dist/config/models.js.map +1 -0
  131. package/dist/constants/names.d.ts +2 -0
  132. package/dist/constants/names.d.ts.map +1 -1
  133. package/dist/constants/names.js +2 -0
  134. package/dist/constants/names.js.map +1 -1
  135. package/dist/features/auto-update.d.ts.map +1 -1
  136. package/dist/features/auto-update.js +21 -11
  137. package/dist/features/auto-update.js.map +1 -1
  138. package/dist/features/background-agent/manager.d.ts.map +1 -1
  139. package/dist/features/background-agent/manager.js +1 -2
  140. package/dist/features/background-agent/manager.js.map +1 -1
  141. package/dist/features/boulder-state/storage.d.ts.map +1 -1
  142. package/dist/features/boulder-state/storage.js +9 -5
  143. package/dist/features/boulder-state/storage.js.map +1 -1
  144. package/dist/features/boulder-state/types.d.ts +4 -0
  145. package/dist/features/boulder-state/types.d.ts.map +1 -1
  146. package/dist/features/builtin-skills/skills.d.ts.map +1 -1
  147. package/dist/features/builtin-skills/skills.js +25 -78
  148. package/dist/features/builtin-skills/skills.js.map +1 -1
  149. package/dist/features/delegation-enforcer.d.ts.map +1 -1
  150. package/dist/features/delegation-enforcer.js +4 -1
  151. package/dist/features/delegation-enforcer.js.map +1 -1
  152. package/dist/features/delegation-routing/__tests__/resolver.test.js +47 -122
  153. package/dist/features/delegation-routing/__tests__/resolver.test.js.map +1 -1
  154. package/dist/features/delegation-routing/resolver.d.ts.map +1 -1
  155. package/dist/features/delegation-routing/resolver.js +24 -47
  156. package/dist/features/delegation-routing/resolver.js.map +1 -1
  157. package/dist/features/delegation-routing/types.d.ts.map +1 -1
  158. package/dist/features/delegation-routing/types.js +2 -0
  159. package/dist/features/delegation-routing/types.js.map +1 -1
  160. package/dist/features/model-routing/external-model-policy.d.ts.map +1 -1
  161. package/dist/features/model-routing/external-model-policy.js.map +1 -1
  162. package/dist/features/model-routing/router.d.ts.map +1 -1
  163. package/dist/features/model-routing/router.js +12 -2
  164. package/dist/features/model-routing/router.js.map +1 -1
  165. package/dist/features/model-routing/types.d.ts +5 -1
  166. package/dist/features/model-routing/types.d.ts.map +1 -1
  167. package/dist/features/model-routing/types.js +7 -6
  168. package/dist/features/model-routing/types.js.map +1 -1
  169. package/dist/features/rate-limit-wait/daemon.d.ts.map +1 -1
  170. package/dist/features/rate-limit-wait/daemon.js +40 -4
  171. package/dist/features/rate-limit-wait/daemon.js.map +1 -1
  172. package/dist/features/task-decomposer/index.js +14 -4
  173. package/dist/features/task-decomposer/index.js.map +1 -1
  174. package/dist/hooks/__tests__/bridge-openclaw.test.d.ts +2 -0
  175. package/dist/hooks/__tests__/bridge-openclaw.test.d.ts.map +1 -0
  176. package/dist/hooks/__tests__/bridge-openclaw.test.js +124 -0
  177. package/dist/hooks/__tests__/bridge-openclaw.test.js.map +1 -0
  178. package/dist/hooks/__tests__/bridge-security.test.js +1 -1
  179. package/dist/hooks/__tests__/bridge-security.test.js.map +1 -1
  180. package/dist/hooks/auto-slash-command/executor.d.ts.map +1 -1
  181. package/dist/hooks/auto-slash-command/executor.js +38 -61
  182. package/dist/hooks/auto-slash-command/executor.js.map +1 -1
  183. package/dist/hooks/bridge.d.ts +11 -0
  184. package/dist/hooks/bridge.d.ts.map +1 -1
  185. package/dist/hooks/bridge.js +154 -82
  186. package/dist/hooks/bridge.js.map +1 -1
  187. package/dist/hooks/comment-checker/index.d.ts.map +1 -1
  188. package/dist/hooks/comment-checker/index.js +3 -1
  189. package/dist/hooks/comment-checker/index.js.map +1 -1
  190. package/dist/hooks/keyword-detector/__tests__/index.test.js +348 -1
  191. package/dist/hooks/keyword-detector/__tests__/index.test.js.map +1 -1
  192. package/dist/hooks/keyword-detector/index.d.ts +29 -0
  193. package/dist/hooks/keyword-detector/index.d.ts.map +1 -1
  194. package/dist/hooks/keyword-detector/index.js +123 -1
  195. package/dist/hooks/keyword-detector/index.js.map +1 -1
  196. package/dist/hooks/mode-registry/__tests__/session-isolation.test.js +40 -0
  197. package/dist/hooks/mode-registry/__tests__/session-isolation.test.js.map +1 -1
  198. package/dist/hooks/mode-registry/index.d.ts.map +1 -1
  199. package/dist/hooks/mode-registry/index.js +135 -52
  200. package/dist/hooks/mode-registry/index.js.map +1 -1
  201. package/dist/hooks/notepad/index.d.ts.map +1 -1
  202. package/dist/hooks/notepad/index.js +5 -3
  203. package/dist/hooks/notepad/index.js.map +1 -1
  204. package/dist/hooks/persistent-mode/__tests__/cancel-race.test.d.ts +2 -0
  205. package/dist/hooks/persistent-mode/__tests__/cancel-race.test.d.ts.map +1 -0
  206. package/dist/hooks/persistent-mode/__tests__/cancel-race.test.js +73 -0
  207. package/dist/hooks/persistent-mode/__tests__/cancel-race.test.js.map +1 -0
  208. package/dist/hooks/persistent-mode/__tests__/idle-cooldown.test.js +89 -13
  209. package/dist/hooks/persistent-mode/__tests__/idle-cooldown.test.js.map +1 -1
  210. package/dist/hooks/persistent-mode/__tests__/skill-state-stop.test.d.ts +2 -0
  211. package/dist/hooks/persistent-mode/__tests__/skill-state-stop.test.d.ts.map +1 -0
  212. package/dist/hooks/persistent-mode/__tests__/skill-state-stop.test.js +156 -0
  213. package/dist/hooks/persistent-mode/__tests__/skill-state-stop.test.js.map +1 -0
  214. package/dist/hooks/persistent-mode/idle-cooldown.test.d.ts +2 -3
  215. package/dist/hooks/persistent-mode/idle-cooldown.test.d.ts.map +1 -1
  216. package/dist/hooks/persistent-mode/idle-cooldown.test.js +19 -4
  217. package/dist/hooks/persistent-mode/idle-cooldown.test.js.map +1 -1
  218. package/dist/hooks/persistent-mode/index.d.ts +2 -2
  219. package/dist/hooks/persistent-mode/index.d.ts.map +1 -1
  220. package/dist/hooks/persistent-mode/index.js +144 -26
  221. package/dist/hooks/persistent-mode/index.js.map +1 -1
  222. package/dist/hooks/plugin-patterns/index.d.ts.map +1 -1
  223. package/dist/hooks/plugin-patterns/index.js +22 -31
  224. package/dist/hooks/plugin-patterns/index.js.map +1 -1
  225. package/dist/hooks/pre-compact/index.js +1 -1
  226. package/dist/hooks/preemptive-compaction/index.d.ts.map +1 -1
  227. package/dist/hooks/preemptive-compaction/index.js +3 -1
  228. package/dist/hooks/preemptive-compaction/index.js.map +1 -1
  229. package/dist/hooks/project-memory/index.d.ts.map +1 -1
  230. package/dist/hooks/project-memory/index.js +9 -0
  231. package/dist/hooks/project-memory/index.js.map +1 -1
  232. package/dist/hooks/project-memory/learner.d.ts.map +1 -1
  233. package/dist/hooks/project-memory/learner.js +107 -85
  234. package/dist/hooks/project-memory/learner.js.map +1 -1
  235. package/dist/hooks/project-memory/storage.d.ts.map +1 -1
  236. package/dist/hooks/project-memory/storage.js +3 -2
  237. package/dist/hooks/project-memory/storage.js.map +1 -1
  238. package/dist/hooks/recovery/context-window.d.ts +4 -0
  239. package/dist/hooks/recovery/context-window.d.ts.map +1 -1
  240. package/dist/hooks/recovery/context-window.js +22 -1
  241. package/dist/hooks/recovery/context-window.js.map +1 -1
  242. package/dist/hooks/recovery/session-recovery.js +1 -1
  243. package/dist/hooks/recovery/session-recovery.js.map +1 -1
  244. package/dist/hooks/session-end/index.d.ts.map +1 -1
  245. package/dist/hooks/session-end/index.js +13 -22
  246. package/dist/hooks/session-end/index.js.map +1 -1
  247. package/dist/hooks/setup/__tests__/windows-patch.test.d.ts +2 -0
  248. package/dist/hooks/setup/__tests__/windows-patch.test.d.ts.map +1 -0
  249. package/dist/hooks/setup/__tests__/windows-patch.test.js +110 -0
  250. package/dist/hooks/setup/__tests__/windows-patch.test.js.map +1 -0
  251. package/dist/hooks/setup/index.d.ts +18 -0
  252. package/dist/hooks/setup/index.d.ts.map +1 -1
  253. package/dist/hooks/setup/index.js +59 -1
  254. package/dist/hooks/setup/index.js.map +1 -1
  255. package/dist/hooks/skill-bridge.cjs +1 -0
  256. package/dist/hooks/skill-state/__tests__/skill-state.test.d.ts +2 -0
  257. package/dist/hooks/skill-state/__tests__/skill-state.test.d.ts.map +1 -0
  258. package/dist/hooks/skill-state/__tests__/skill-state.test.js +301 -0
  259. package/dist/hooks/skill-state/__tests__/skill-state.test.js.map +1 -0
  260. package/dist/hooks/skill-state/index.d.ts +79 -0
  261. package/dist/hooks/skill-state/index.d.ts.map +1 -0
  262. package/dist/hooks/skill-state/index.js +245 -0
  263. package/dist/hooks/skill-state/index.js.map +1 -0
  264. package/dist/hooks/team-pipeline/state.d.ts.map +1 -1
  265. package/dist/hooks/team-pipeline/state.js +5 -0
  266. package/dist/hooks/team-pipeline/state.js.map +1 -1
  267. package/dist/hooks/todo-continuation/index.d.ts +17 -0
  268. package/dist/hooks/todo-continuation/index.d.ts.map +1 -1
  269. package/dist/hooks/todo-continuation/index.js +44 -2
  270. package/dist/hooks/todo-continuation/index.js.map +1 -1
  271. package/dist/hud/elements/call-counts.d.ts.map +1 -1
  272. package/dist/hud/elements/call-counts.js +6 -4
  273. package/dist/hud/elements/call-counts.js.map +1 -1
  274. package/dist/hud/elements/index.d.ts +1 -0
  275. package/dist/hud/elements/index.d.ts.map +1 -1
  276. package/dist/hud/elements/index.js +1 -0
  277. package/dist/hud/elements/index.js.map +1 -1
  278. package/dist/hud/elements/prompt-time.d.ts +13 -0
  279. package/dist/hud/elements/prompt-time.d.ts.map +1 -0
  280. package/dist/hud/elements/prompt-time.js +21 -0
  281. package/dist/hud/elements/prompt-time.js.map +1 -0
  282. package/dist/hud/index.d.ts +2 -1
  283. package/dist/hud/index.d.ts.map +1 -1
  284. package/dist/hud/index.js +40 -215
  285. package/dist/hud/index.js.map +1 -1
  286. package/dist/hud/render.d.ts.map +1 -1
  287. package/dist/hud/render.js +7 -108
  288. package/dist/hud/render.js.map +1 -1
  289. package/dist/hud/state.d.ts.map +1 -1
  290. package/dist/hud/state.js +4 -3
  291. package/dist/hud/state.js.map +1 -1
  292. package/dist/hud/stdin.d.ts +10 -0
  293. package/dist/hud/stdin.d.ts.map +1 -1
  294. package/dist/hud/stdin.js +43 -0
  295. package/dist/hud/stdin.js.map +1 -1
  296. package/dist/hud/types.d.ts +6 -18
  297. package/dist/hud/types.d.ts.map +1 -1
  298. package/dist/hud/types.js +6 -46
  299. package/dist/hud/types.js.map +1 -1
  300. package/dist/index.d.ts +1 -1
  301. package/dist/index.d.ts.map +1 -1
  302. package/dist/index.js +2 -11
  303. package/dist/index.js.map +1 -1
  304. package/dist/installer/hooks.d.ts +5 -0
  305. package/dist/installer/hooks.d.ts.map +1 -1
  306. package/dist/installer/hooks.js +8 -0
  307. package/dist/installer/hooks.js.map +1 -1
  308. package/dist/installer/index.d.ts.map +1 -1
  309. package/dist/installer/index.js +26 -11
  310. package/dist/installer/index.js.map +1 -1
  311. package/dist/interop/omx-team-state.d.ts.map +1 -1
  312. package/dist/interop/omx-team-state.js +38 -6
  313. package/dist/interop/omx-team-state.js.map +1 -1
  314. package/dist/interop/shared-state.d.ts.map +1 -1
  315. package/dist/interop/shared-state.js +58 -7
  316. package/dist/interop/shared-state.js.map +1 -1
  317. package/dist/lib/__tests__/worktree-paths.test.js +250 -1
  318. package/dist/lib/__tests__/worktree-paths.test.js.map +1 -1
  319. package/dist/lib/job-state-db.d.ts +150 -0
  320. package/dist/lib/job-state-db.d.ts.map +1 -0
  321. package/dist/lib/job-state-db.js +650 -0
  322. package/dist/lib/job-state-db.js.map +1 -0
  323. package/dist/lib/mode-names.d.ts +46 -0
  324. package/dist/lib/mode-names.d.ts.map +1 -0
  325. package/dist/lib/mode-names.js +73 -0
  326. package/dist/lib/mode-names.js.map +1 -0
  327. package/dist/lib/session-isolation.d.ts +32 -0
  328. package/dist/lib/session-isolation.d.ts.map +1 -0
  329. package/dist/lib/session-isolation.js +39 -0
  330. package/dist/lib/session-isolation.js.map +1 -0
  331. package/dist/lib/worktree-paths.d.ts +38 -8
  332. package/dist/lib/worktree-paths.d.ts.map +1 -1
  333. package/dist/lib/worktree-paths.js +124 -56
  334. package/dist/lib/worktree-paths.js.map +1 -1
  335. package/dist/mcp/__tests__/team-cleanup.test.d.ts +11 -0
  336. package/dist/mcp/__tests__/team-cleanup.test.d.ts.map +1 -0
  337. package/dist/mcp/__tests__/team-cleanup.test.js +228 -0
  338. package/dist/mcp/__tests__/team-cleanup.test.js.map +1 -0
  339. package/dist/mcp/cli-detection.d.ts +4 -8
  340. package/dist/mcp/cli-detection.d.ts.map +1 -1
  341. package/dist/mcp/cli-detection.js +5 -8
  342. package/dist/mcp/cli-detection.js.map +1 -1
  343. package/dist/mcp/codex-request-normalizer.js +59 -0
  344. package/dist/mcp/codex-server.js +16 -4
  345. package/dist/mcp/codex-standalone-server.js +13 -4
  346. package/dist/mcp/index.d.ts +2 -4
  347. package/dist/mcp/index.d.ts.map +1 -1
  348. package/dist/mcp/index.js +1 -5
  349. package/dist/mcp/index.js.map +1 -1
  350. package/dist/mcp/job-management.d.ts.map +1 -1
  351. package/dist/mcp/job-management.js +11 -9
  352. package/dist/mcp/job-management.js.map +1 -1
  353. package/dist/mcp/job-state-db.d.ts +1 -149
  354. package/dist/mcp/job-state-db.d.ts.map +1 -1
  355. package/dist/mcp/job-state-db.js +2 -649
  356. package/dist/mcp/job-state-db.js.map +1 -1
  357. package/dist/mcp/mcp-config.d.ts +1 -1
  358. package/dist/mcp/mcp-config.js +1 -1
  359. package/dist/mcp/prompt-injection.d.ts +14 -76
  360. package/dist/mcp/prompt-injection.d.ts.map +1 -1
  361. package/dist/mcp/prompt-injection.js +34 -175
  362. package/dist/mcp/prompt-injection.js.map +1 -1
  363. package/dist/mcp/standalone-server.js +2 -0
  364. package/dist/mcp/standalone-server.js.map +1 -1
  365. package/dist/mcp/team-server.d.ts +16 -0
  366. package/dist/mcp/team-server.d.ts.map +1 -0
  367. package/dist/mcp/team-server.js +356 -0
  368. package/dist/mcp/team-server.js.map +1 -0
  369. package/dist/notifications/__tests__/formatter.test.js +62 -0
  370. package/dist/notifications/__tests__/formatter.test.js.map +1 -1
  371. package/dist/notifications/__tests__/hook-config.test.d.ts +14 -0
  372. package/dist/notifications/__tests__/hook-config.test.d.ts.map +1 -0
  373. package/dist/notifications/__tests__/hook-config.test.js +210 -0
  374. package/dist/notifications/__tests__/hook-config.test.js.map +1 -0
  375. package/dist/notifications/__tests__/platform-gating.test.d.ts +12 -0
  376. package/dist/notifications/__tests__/platform-gating.test.d.ts.map +1 -0
  377. package/dist/notifications/__tests__/platform-gating.test.js +140 -0
  378. package/dist/notifications/__tests__/platform-gating.test.js.map +1 -0
  379. package/dist/notifications/__tests__/template-engine.test.d.ts +13 -0
  380. package/dist/notifications/__tests__/template-engine.test.d.ts.map +1 -0
  381. package/dist/notifications/__tests__/template-engine.test.js +378 -0
  382. package/dist/notifications/__tests__/template-engine.test.js.map +1 -0
  383. package/dist/notifications/config.d.ts.map +1 -1
  384. package/dist/notifications/config.js +54 -18
  385. package/dist/notifications/config.js.map +1 -1
  386. package/dist/notifications/dispatcher.d.ts +2 -2
  387. package/dist/notifications/dispatcher.d.ts.map +1 -1
  388. package/dist/notifications/dispatcher.js +10 -6
  389. package/dist/notifications/dispatcher.js.map +1 -1
  390. package/dist/notifications/formatter.d.ts.map +1 -1
  391. package/dist/notifications/formatter.js +22 -0
  392. package/dist/notifications/formatter.js.map +1 -1
  393. package/dist/notifications/hook-config-types.d.ts +44 -0
  394. package/dist/notifications/hook-config-types.d.ts.map +1 -0
  395. package/dist/notifications/hook-config-types.js +8 -0
  396. package/dist/notifications/hook-config-types.js.map +1 -0
  397. package/dist/notifications/hook-config.d.ts +36 -0
  398. package/dist/notifications/hook-config.d.ts.map +1 -0
  399. package/dist/notifications/hook-config.js +95 -0
  400. package/dist/notifications/hook-config.js.map +1 -0
  401. package/dist/notifications/index.d.ts +3 -0
  402. package/dist/notifications/index.d.ts.map +1 -1
  403. package/dist/notifications/index.js +31 -3
  404. package/dist/notifications/index.js.map +1 -1
  405. package/dist/notifications/reply-listener.d.ts.map +1 -1
  406. package/dist/notifications/reply-listener.js +1 -0
  407. package/dist/notifications/reply-listener.js.map +1 -1
  408. package/dist/notifications/session-registry.d.ts.map +1 -1
  409. package/dist/notifications/session-registry.js +13 -5
  410. package/dist/notifications/session-registry.js.map +1 -1
  411. package/dist/notifications/template-engine.d.ts +34 -0
  412. package/dist/notifications/template-engine.d.ts.map +1 -0
  413. package/dist/notifications/template-engine.js +248 -0
  414. package/dist/notifications/template-engine.js.map +1 -0
  415. package/dist/notifications/types.d.ts +0 -2
  416. package/dist/notifications/types.d.ts.map +1 -1
  417. package/dist/openclaw/__tests__/config.test.d.ts +2 -0
  418. package/dist/openclaw/__tests__/config.test.d.ts.map +1 -0
  419. package/dist/openclaw/__tests__/config.test.js +200 -0
  420. package/dist/openclaw/__tests__/config.test.js.map +1 -0
  421. package/dist/openclaw/__tests__/dispatcher.test.d.ts +2 -0
  422. package/dist/openclaw/__tests__/dispatcher.test.d.ts.map +1 -0
  423. package/dist/openclaw/__tests__/dispatcher.test.js +348 -0
  424. package/dist/openclaw/__tests__/dispatcher.test.js.map +1 -0
  425. package/dist/openclaw/__tests__/index.test.d.ts +2 -0
  426. package/dist/openclaw/__tests__/index.test.d.ts.map +1 -0
  427. package/dist/openclaw/__tests__/index.test.js +235 -0
  428. package/dist/openclaw/__tests__/index.test.js.map +1 -0
  429. package/dist/openclaw/config.d.ts +33 -0
  430. package/dist/openclaw/config.d.ts.map +1 -0
  431. package/dist/openclaw/config.js +83 -0
  432. package/dist/openclaw/config.js.map +1 -0
  433. package/dist/openclaw/dispatcher.d.ts +47 -0
  434. package/dist/openclaw/dispatcher.d.ts.map +1 -0
  435. package/dist/openclaw/dispatcher.js +138 -0
  436. package/dist/openclaw/dispatcher.js.map +1 -0
  437. package/dist/openclaw/index.d.ts +25 -0
  438. package/dist/openclaw/index.d.ts.map +1 -0
  439. package/dist/openclaw/index.js +132 -0
  440. package/dist/openclaw/index.js.map +1 -0
  441. package/dist/openclaw/types.d.ts +102 -0
  442. package/dist/openclaw/types.d.ts.map +1 -0
  443. package/dist/openclaw/types.js +8 -0
  444. package/dist/openclaw/types.js.map +1 -0
  445. package/dist/platform/index.d.ts +5 -0
  446. package/dist/platform/index.d.ts.map +1 -1
  447. package/dist/platform/index.js +17 -0
  448. package/dist/platform/index.js.map +1 -1
  449. package/dist/platform/process-utils.d.ts.map +1 -1
  450. package/dist/platform/process-utils.js +55 -9
  451. package/dist/platform/process-utils.js.map +1 -1
  452. package/dist/shared/types.d.ts +7 -5
  453. package/dist/shared/types.d.ts.map +1 -1
  454. package/dist/team/__tests__/bridge-integration.test.js +10 -8
  455. package/dist/team/__tests__/bridge-integration.test.js.map +1 -1
  456. package/dist/team/__tests__/edge-cases.test.js +40 -29
  457. package/dist/team/__tests__/edge-cases.test.js.map +1 -1
  458. package/dist/team/__tests__/idle-nudge.test.d.ts +11 -0
  459. package/dist/team/__tests__/idle-nudge.test.d.ts.map +1 -0
  460. package/dist/team/__tests__/idle-nudge.test.js +282 -0
  461. package/dist/team/__tests__/idle-nudge.test.js.map +1 -0
  462. package/dist/team/__tests__/mcp-team-bridge.spawn-args.test.js +2 -2
  463. package/dist/team/__tests__/mcp-team-bridge.spawn-args.test.js.map +1 -1
  464. package/dist/team/__tests__/mcp-team-bridge.usage.test.d.ts +2 -0
  465. package/dist/team/__tests__/mcp-team-bridge.usage.test.d.ts.map +1 -0
  466. package/dist/team/__tests__/mcp-team-bridge.usage.test.js +49 -0
  467. package/dist/team/__tests__/mcp-team-bridge.usage.test.js.map +1 -0
  468. package/dist/team/__tests__/model-contract.test.d.ts +2 -0
  469. package/dist/team/__tests__/model-contract.test.d.ts.map +1 -0
  470. package/dist/team/__tests__/model-contract.test.js +121 -0
  471. package/dist/team/__tests__/model-contract.test.js.map +1 -0
  472. package/dist/team/__tests__/phase-controller.test.d.ts +2 -0
  473. package/dist/team/__tests__/phase-controller.test.d.ts.map +1 -0
  474. package/dist/team/__tests__/phase-controller.test.js +45 -0
  475. package/dist/team/__tests__/phase-controller.test.js.map +1 -0
  476. package/dist/team/__tests__/runtime-assign.test.d.ts +2 -0
  477. package/dist/team/__tests__/runtime-assign.test.d.ts.map +1 -0
  478. package/dist/team/__tests__/runtime-assign.test.js +43 -0
  479. package/dist/team/__tests__/runtime-assign.test.js.map +1 -0
  480. package/dist/team/__tests__/runtime-gemini-prompt.test.d.ts +2 -0
  481. package/dist/team/__tests__/runtime-gemini-prompt.test.d.ts.map +1 -0
  482. package/dist/team/__tests__/runtime-gemini-prompt.test.js +153 -0
  483. package/dist/team/__tests__/runtime-gemini-prompt.test.js.map +1 -0
  484. package/dist/team/__tests__/runtime-prompt-mode.test.d.ts +2 -0
  485. package/dist/team/__tests__/runtime-prompt-mode.test.d.ts.map +1 -0
  486. package/dist/team/__tests__/runtime-prompt-mode.test.js +162 -0
  487. package/dist/team/__tests__/runtime-prompt-mode.test.js.map +1 -0
  488. package/dist/team/__tests__/runtime.test.d.ts +2 -0
  489. package/dist/team/__tests__/runtime.test.d.ts.map +1 -0
  490. package/dist/team/__tests__/runtime.test.js +37 -0
  491. package/dist/team/__tests__/runtime.test.js.map +1 -0
  492. package/dist/team/__tests__/task-file-ops.test.js +63 -59
  493. package/dist/team/__tests__/task-file-ops.test.js.map +1 -1
  494. package/dist/team/__tests__/team-name.test.d.ts +2 -0
  495. package/dist/team/__tests__/team-name.test.d.ts.map +1 -0
  496. package/dist/team/__tests__/team-name.test.js +18 -0
  497. package/dist/team/__tests__/team-name.test.js.map +1 -0
  498. package/dist/team/__tests__/team-status.test.js +52 -6
  499. package/dist/team/__tests__/team-status.test.js.map +1 -1
  500. package/dist/team/__tests__/tmux-comm.test.d.ts +2 -0
  501. package/dist/team/__tests__/tmux-comm.test.d.ts.map +1 -0
  502. package/dist/team/__tests__/tmux-comm.test.js +26 -0
  503. package/dist/team/__tests__/tmux-comm.test.js.map +1 -0
  504. package/dist/team/__tests__/tmux-session.create-team.test.d.ts +2 -0
  505. package/dist/team/__tests__/tmux-session.create-team.test.d.ts.map +1 -0
  506. package/dist/team/__tests__/tmux-session.create-team.test.js +104 -0
  507. package/dist/team/__tests__/tmux-session.create-team.test.js.map +1 -0
  508. package/dist/team/__tests__/tmux-session.spawn.test.d.ts +2 -0
  509. package/dist/team/__tests__/tmux-session.spawn.test.d.ts.map +1 -0
  510. package/dist/team/__tests__/tmux-session.spawn.test.js +61 -0
  511. package/dist/team/__tests__/tmux-session.spawn.test.js.map +1 -0
  512. package/dist/team/__tests__/tmux-session.test.js +161 -2
  513. package/dist/team/__tests__/tmux-session.test.js.map +1 -1
  514. package/dist/team/__tests__/worker-bootstrap.test.d.ts +2 -0
  515. package/dist/team/__tests__/worker-bootstrap.test.d.ts.map +1 -0
  516. package/dist/team/__tests__/worker-bootstrap.test.js +58 -0
  517. package/dist/team/__tests__/worker-bootstrap.test.js.map +1 -0
  518. package/dist/team/bridge-entry.d.ts.map +1 -1
  519. package/dist/team/bridge-entry.js +4 -0
  520. package/dist/team/bridge-entry.js.map +1 -1
  521. package/dist/team/capabilities.d.ts.map +1 -1
  522. package/dist/team/capabilities.js +3 -0
  523. package/dist/team/capabilities.js.map +1 -1
  524. package/dist/team/cli-detection.d.ts +9 -0
  525. package/dist/team/cli-detection.d.ts.map +1 -0
  526. package/dist/team/cli-detection.js +29 -0
  527. package/dist/team/cli-detection.js.map +1 -0
  528. package/dist/team/idle-nudge.d.ts +53 -0
  529. package/dist/team/idle-nudge.d.ts.map +1 -0
  530. package/dist/team/idle-nudge.js +124 -0
  531. package/dist/team/idle-nudge.js.map +1 -0
  532. package/dist/team/inbox-outbox.d.ts.map +1 -1
  533. package/dist/team/inbox-outbox.js +7 -3
  534. package/dist/team/inbox-outbox.js.map +1 -1
  535. package/dist/team/index.d.ts +14 -1
  536. package/dist/team/index.d.ts.map +1 -1
  537. package/dist/team/index.js +12 -1
  538. package/dist/team/index.js.map +1 -1
  539. package/dist/team/mcp-team-bridge.d.ts +9 -0
  540. package/dist/team/mcp-team-bridge.d.ts.map +1 -1
  541. package/dist/team/mcp-team-bridge.js +82 -3
  542. package/dist/team/mcp-team-bridge.js.map +1 -1
  543. package/dist/team/model-contract.d.ts +37 -0
  544. package/dist/team/model-contract.d.ts.map +1 -0
  545. package/dist/team/model-contract.js +139 -0
  546. package/dist/team/model-contract.js.map +1 -0
  547. package/dist/team/phase-controller.d.ts +33 -0
  548. package/dist/team/phase-controller.d.ts.map +1 -0
  549. package/dist/team/phase-controller.js +79 -0
  550. package/dist/team/phase-controller.js.map +1 -0
  551. package/dist/team/runtime-cli.d.ts +9 -0
  552. package/dist/team/runtime-cli.d.ts.map +1 -0
  553. package/dist/team/runtime-cli.js +188 -0
  554. package/dist/team/runtime-cli.js.map +1 -0
  555. package/dist/team/runtime.d.ts +95 -0
  556. package/dist/team/runtime.d.ts.map +1 -0
  557. package/dist/team/runtime.js +692 -0
  558. package/dist/team/runtime.js.map +1 -0
  559. package/dist/team/state-paths.d.ts +72 -0
  560. package/dist/team/state-paths.d.ts.map +1 -0
  561. package/dist/team/state-paths.js +87 -0
  562. package/dist/team/state-paths.js.map +1 -0
  563. package/dist/team/task-file-ops.d.ts +27 -7
  564. package/dist/team/task-file-ops.d.ts.map +1 -1
  565. package/dist/team/task-file-ops.js +116 -55
  566. package/dist/team/task-file-ops.js.map +1 -1
  567. package/dist/team/team-name.d.ts +2 -0
  568. package/dist/team/team-name.d.ts.map +1 -0
  569. package/dist/team/team-name.js +8 -0
  570. package/dist/team/team-name.js.map +1 -0
  571. package/dist/team/team-registration.d.ts +1 -1
  572. package/dist/team/team-registration.d.ts.map +1 -1
  573. package/dist/team/team-registration.js.map +1 -1
  574. package/dist/team/team-status.d.ts +11 -1
  575. package/dist/team/team-status.d.ts.map +1 -1
  576. package/dist/team/team-status.js +32 -3
  577. package/dist/team/team-status.js.map +1 -1
  578. package/dist/team/tmux-comm.d.ts +36 -0
  579. package/dist/team/tmux-comm.d.ts.map +1 -0
  580. package/dist/team/tmux-comm.js +115 -0
  581. package/dist/team/tmux-comm.js.map +1 -0
  582. package/dist/team/tmux-session.d.ts +92 -0
  583. package/dist/team/tmux-session.d.ts.map +1 -1
  584. package/dist/team/tmux-session.js +533 -2
  585. package/dist/team/tmux-session.js.map +1 -1
  586. package/dist/team/types.d.ts +10 -3
  587. package/dist/team/types.d.ts.map +1 -1
  588. package/dist/team/unified-team.d.ts.map +1 -1
  589. package/dist/team/unified-team.js +13 -3
  590. package/dist/team/unified-team.js.map +1 -1
  591. package/dist/team/worker-bootstrap.d.ts +39 -0
  592. package/dist/team/worker-bootstrap.d.ts.map +1 -0
  593. package/dist/team/worker-bootstrap.js +117 -0
  594. package/dist/team/worker-bootstrap.js.map +1 -0
  595. package/dist/team/worker-health.d.ts.map +1 -1
  596. package/dist/team/worker-health.js +15 -3
  597. package/dist/team/worker-health.js.map +1 -1
  598. package/dist/tools/ast-tools.js +1 -1
  599. package/dist/tools/ast-tools.js.map +1 -1
  600. package/dist/tools/diagnostics/lsp-aggregator.d.ts.map +1 -1
  601. package/dist/tools/diagnostics/lsp-aggregator.js +4 -2
  602. package/dist/tools/diagnostics/lsp-aggregator.js.map +1 -1
  603. package/dist/tools/lsp/__tests__/client-handle-data.test.d.ts +2 -0
  604. package/dist/tools/lsp/__tests__/client-handle-data.test.d.ts.map +1 -0
  605. package/dist/tools/lsp/__tests__/client-handle-data.test.js +138 -0
  606. package/dist/tools/lsp/__tests__/client-handle-data.test.js.map +1 -0
  607. package/dist/tools/lsp/client.d.ts +13 -0
  608. package/dist/tools/lsp/client.d.ts.map +1 -1
  609. package/dist/tools/lsp/client.js +64 -8
  610. package/dist/tools/lsp/client.js.map +1 -1
  611. package/dist/tools/lsp/servers.d.ts.map +1 -1
  612. package/dist/tools/lsp/servers.js +4 -9
  613. package/dist/tools/lsp/servers.js.map +1 -1
  614. package/dist/tools/lsp-tools.d.ts.map +1 -1
  615. package/dist/tools/lsp-tools.js +4 -0
  616. package/dist/tools/lsp-tools.js.map +1 -1
  617. package/dist/tools/python-repl/bridge-manager.d.ts.map +1 -1
  618. package/dist/tools/python-repl/bridge-manager.js +15 -1
  619. package/dist/tools/python-repl/bridge-manager.js.map +1 -1
  620. package/dist/tools/python-repl/session-lock.d.ts.map +1 -1
  621. package/dist/tools/python-repl/session-lock.js +35 -15
  622. package/dist/tools/python-repl/session-lock.js.map +1 -1
  623. package/dist/tools/state-tools.d.ts.map +1 -1
  624. package/dist/tools/state-tools.js +10 -0
  625. package/dist/tools/state-tools.js.map +1 -1
  626. package/dist/utils/__tests__/frontmatter.test.d.ts +2 -0
  627. package/dist/utils/__tests__/frontmatter.test.d.ts.map +1 -0
  628. package/dist/utils/__tests__/frontmatter.test.js +147 -0
  629. package/dist/utils/__tests__/frontmatter.test.js.map +1 -0
  630. package/dist/utils/frontmatter.d.ts +24 -0
  631. package/dist/utils/frontmatter.d.ts.map +1 -0
  632. package/dist/utils/frontmatter.js +62 -0
  633. package/dist/utils/frontmatter.js.map +1 -0
  634. package/dist/utils/paths.d.ts.map +1 -1
  635. package/dist/utils/paths.js +4 -2
  636. package/dist/utils/paths.js.map +1 -1
  637. package/dist/utils/string-width.d.ts.map +1 -1
  638. package/dist/utils/string-width.js +15 -4
  639. package/dist/utils/string-width.js.map +1 -1
  640. package/dist/verification/tier-selector.js +1 -1
  641. package/dist/verification/tier-selector.js.map +1 -1
  642. package/docs/AGENTS.md +4 -2
  643. package/docs/CLAUDE.md +8 -48
  644. package/docs/MIGRATION.md +114 -0
  645. package/docs/REFERENCE.md +35 -102
  646. package/hooks/hooks.json +23 -23
  647. package/package.json +8 -8
  648. package/scripts/build-runtime-cli.mjs +24 -0
  649. package/scripts/build-team-server.mjs +28 -0
  650. package/scripts/cleanup-orphans.mjs +22 -5
  651. package/scripts/context-safety.mjs +5 -1
  652. package/scripts/demo-team.mjs +26 -0
  653. package/scripts/keyword-detector.mjs +6 -76
  654. package/scripts/openclaw-gateway-demo.mjs +168 -0
  655. package/scripts/persistent-mode.cjs +30 -4
  656. package/scripts/persistent-mode.mjs +48 -3
  657. package/scripts/plugin-setup.mjs +66 -3
  658. package/scripts/post-tool-use-failure.mjs +20 -2
  659. package/scripts/post-tool-verifier.mjs +57 -6
  660. package/scripts/pre-tool-enforcer.mjs +125 -5
  661. package/scripts/run.cjs +114 -0
  662. package/scripts/session-start.mjs +56 -7
  663. package/scripts/status.mjs +144 -0
  664. package/scripts/test-codex-gemini-team.mjs +78 -0
  665. package/skills/AGENTS.md +5 -2
  666. package/skills/analyze/SKILL.md +5 -11
  667. package/skills/autopilot/SKILL.md +5 -6
  668. package/skills/ccg/SKILL.md +88 -99
  669. package/skills/configure-notifications/SKILL.md +177 -0
  670. package/skills/configure-openclaw/SKILL.md +320 -0
  671. package/skills/external-context/SKILL.md +7 -83
  672. package/skills/hud/SKILL.md +68 -46
  673. package/skills/omc-setup/SKILL.md +58 -19
  674. package/skills/omc-teams/SKILL.md +178 -0
  675. package/skills/pipeline/SKILL.md +4 -4
  676. package/skills/plan/SKILL.md +28 -16
  677. package/skills/ralph/SKILL.md +3 -4
  678. package/skills/ralph-init/SKILL.md +3 -1
  679. package/skills/ralplan/SKILL.md +93 -8
  680. package/skills/security-review/SKILL.md +5 -6
  681. package/skills/tdd/SKILL.md +5 -6
  682. package/skills/team/SKILL.md +35 -34
  683. package/templates/hooks/keyword-detector.mjs +11 -82
  684. package/templates/hooks/persistent-mode.mjs +120 -3
  685. package/templates/hooks/post-tool-use-failure.mjs +20 -2
  686. package/templates/hooks/session-start.mjs +2 -16
  687. package/dist/__tests__/analytics/backfill-dedup.test.d.ts +0 -2
  688. package/dist/__tests__/analytics/backfill-dedup.test.d.ts.map +0 -1
  689. package/dist/__tests__/analytics/backfill-dedup.test.js +0 -179
  690. package/dist/__tests__/analytics/backfill-dedup.test.js.map +0 -1
  691. package/dist/__tests__/analytics/backfill-engine.test.d.ts +0 -2
  692. package/dist/__tests__/analytics/backfill-engine.test.d.ts.map +0 -1
  693. package/dist/__tests__/analytics/backfill-engine.test.js +0 -362
  694. package/dist/__tests__/analytics/backfill-engine.test.js.map +0 -1
  695. package/dist/__tests__/analytics/output-estimator.test.d.ts +0 -2
  696. package/dist/__tests__/analytics/output-estimator.test.d.ts.map +0 -1
  697. package/dist/__tests__/analytics/output-estimator.test.js +0 -124
  698. package/dist/__tests__/analytics/output-estimator.test.js.map +0 -1
  699. package/dist/__tests__/analytics/token-extractor.test.d.ts +0 -2
  700. package/dist/__tests__/analytics/token-extractor.test.d.ts.map +0 -1
  701. package/dist/__tests__/analytics/token-extractor.test.js +0 -165
  702. package/dist/__tests__/analytics/token-extractor.test.js.map +0 -1
  703. package/dist/__tests__/analytics/token-tracker.test.d.ts +0 -2
  704. package/dist/__tests__/analytics/token-tracker.test.d.ts.map +0 -1
  705. package/dist/__tests__/analytics/token-tracker.test.js +0 -189
  706. package/dist/__tests__/analytics/token-tracker.test.js.map +0 -1
  707. package/dist/__tests__/analytics/tokscale-adapter.test.d.ts +0 -2
  708. package/dist/__tests__/analytics/tokscale-adapter.test.d.ts.map +0 -1
  709. package/dist/__tests__/analytics/tokscale-adapter.test.js +0 -79
  710. package/dist/__tests__/analytics/tokscale-adapter.test.js.map +0 -1
  711. package/dist/__tests__/analytics/transcript-parser.test.d.ts +0 -2
  712. package/dist/__tests__/analytics/transcript-parser.test.d.ts.map +0 -1
  713. package/dist/__tests__/analytics/transcript-parser.test.js +0 -285
  714. package/dist/__tests__/analytics/transcript-parser.test.js.map +0 -1
  715. package/dist/__tests__/analytics/transcript-scanner.test.d.ts +0 -2
  716. package/dist/__tests__/analytics/transcript-scanner.test.d.ts.map +0 -1
  717. package/dist/__tests__/analytics/transcript-scanner.test.js +0 -443
  718. package/dist/__tests__/analytics/transcript-scanner.test.js.map +0 -1
  719. package/dist/__tests__/analytics/transcript-token-extractor.test.d.ts +0 -2
  720. package/dist/__tests__/analytics/transcript-token-extractor.test.d.ts.map +0 -1
  721. package/dist/__tests__/analytics/transcript-token-extractor.test.js +0 -177
  722. package/dist/__tests__/analytics/transcript-token-extractor.test.js.map +0 -1
  723. package/dist/analytics/analytics-summary.d.ts +0 -47
  724. package/dist/analytics/analytics-summary.d.ts.map +0 -1
  725. package/dist/analytics/analytics-summary.js +0 -171
  726. package/dist/analytics/analytics-summary.js.map +0 -1
  727. package/dist/analytics/backfill-dedup.d.ts +0 -49
  728. package/dist/analytics/backfill-dedup.d.ts.map +0 -1
  729. package/dist/analytics/backfill-dedup.js +0 -115
  730. package/dist/analytics/backfill-dedup.js.map +0 -1
  731. package/dist/analytics/backfill-engine.d.ts +0 -59
  732. package/dist/analytics/backfill-engine.d.ts.map +0 -1
  733. package/dist/analytics/backfill-engine.js +0 -172
  734. package/dist/analytics/backfill-engine.js.map +0 -1
  735. package/dist/analytics/cost-estimator.d.ts +0 -29
  736. package/dist/analytics/cost-estimator.d.ts.map +0 -1
  737. package/dist/analytics/cost-estimator.js +0 -135
  738. package/dist/analytics/cost-estimator.js.map +0 -1
  739. package/dist/analytics/export.d.ts +0 -7
  740. package/dist/analytics/export.d.ts.map +0 -1
  741. package/dist/analytics/export.js +0 -93
  742. package/dist/analytics/export.js.map +0 -1
  743. package/dist/analytics/index.d.ts +0 -24
  744. package/dist/analytics/index.d.ts.map +0 -1
  745. package/dist/analytics/index.js +0 -30
  746. package/dist/analytics/index.js.map +0 -1
  747. package/dist/analytics/metrics-collector.d.ts +0 -30
  748. package/dist/analytics/metrics-collector.d.ts.map +0 -1
  749. package/dist/analytics/metrics-collector.js +0 -96
  750. package/dist/analytics/metrics-collector.js.map +0 -1
  751. package/dist/analytics/output-estimator.d.ts +0 -26
  752. package/dist/analytics/output-estimator.d.ts.map +0 -1
  753. package/dist/analytics/output-estimator.js +0 -65
  754. package/dist/analytics/output-estimator.js.map +0 -1
  755. package/dist/analytics/query-engine.d.ts +0 -35
  756. package/dist/analytics/query-engine.d.ts.map +0 -1
  757. package/dist/analytics/query-engine.js +0 -239
  758. package/dist/analytics/query-engine.js.map +0 -1
  759. package/dist/analytics/session-catalog.d.ts +0 -45
  760. package/dist/analytics/session-catalog.d.ts.map +0 -1
  761. package/dist/analytics/session-catalog.js +0 -153
  762. package/dist/analytics/session-catalog.js.map +0 -1
  763. package/dist/analytics/session-manager.d.ts +0 -58
  764. package/dist/analytics/session-manager.d.ts.map +0 -1
  765. package/dist/analytics/session-manager.js +0 -396
  766. package/dist/analytics/session-manager.js.map +0 -1
  767. package/dist/analytics/session-types.d.ts +0 -37
  768. package/dist/analytics/session-types.d.ts.map +0 -1
  769. package/dist/analytics/session-types.js +0 -2
  770. package/dist/analytics/session-types.js.map +0 -1
  771. package/dist/analytics/token-extractor.d.ts +0 -31
  772. package/dist/analytics/token-extractor.d.ts.map +0 -1
  773. package/dist/analytics/token-extractor.js +0 -57
  774. package/dist/analytics/token-extractor.js.map +0 -1
  775. package/dist/analytics/token-tracker.d.ts +0 -33
  776. package/dist/analytics/token-tracker.d.ts.map +0 -1
  777. package/dist/analytics/token-tracker.js +0 -443
  778. package/dist/analytics/token-tracker.js.map +0 -1
  779. package/dist/analytics/tokscale-adapter.d.ts +0 -71
  780. package/dist/analytics/tokscale-adapter.d.ts.map +0 -1
  781. package/dist/analytics/tokscale-adapter.js +0 -223
  782. package/dist/analytics/tokscale-adapter.js.map +0 -1
  783. package/dist/analytics/transcript-parser.d.ts +0 -42
  784. package/dist/analytics/transcript-parser.d.ts.map +0 -1
  785. package/dist/analytics/transcript-parser.js +0 -90
  786. package/dist/analytics/transcript-parser.js.map +0 -1
  787. package/dist/analytics/transcript-scanner.d.ts +0 -51
  788. package/dist/analytics/transcript-scanner.d.ts.map +0 -1
  789. package/dist/analytics/transcript-scanner.js +0 -279
  790. package/dist/analytics/transcript-scanner.js.map +0 -1
  791. package/dist/analytics/transcript-token-extractor.d.ts +0 -35
  792. package/dist/analytics/transcript-token-extractor.d.ts.map +0 -1
  793. package/dist/analytics/transcript-token-extractor.js +0 -136
  794. package/dist/analytics/transcript-token-extractor.js.map +0 -1
  795. package/dist/analytics/types.d.ts +0 -119
  796. package/dist/analytics/types.d.ts.map +0 -1
  797. package/dist/analytics/types.js +0 -32
  798. package/dist/analytics/types.js.map +0 -1
  799. package/dist/cli/analytics.d.ts +0 -3
  800. package/dist/cli/analytics.d.ts.map +0 -1
  801. package/dist/cli/analytics.js +0 -105
  802. package/dist/cli/analytics.js.map +0 -1
  803. package/dist/cli/commands/agents.d.ts +0 -5
  804. package/dist/cli/commands/agents.d.ts.map +0 -1
  805. package/dist/cli/commands/agents.js +0 -31
  806. package/dist/cli/commands/agents.js.map +0 -1
  807. package/dist/cli/commands/backfill.d.ts +0 -15
  808. package/dist/cli/commands/backfill.d.ts.map +0 -1
  809. package/dist/cli/commands/backfill.js +0 -146
  810. package/dist/cli/commands/backfill.js.map +0 -1
  811. package/dist/cli/commands/cleanup.d.ts +0 -4
  812. package/dist/cli/commands/cleanup.d.ts.map +0 -1
  813. package/dist/cli/commands/cleanup.js +0 -31
  814. package/dist/cli/commands/cleanup.js.map +0 -1
  815. package/dist/cli/commands/cost.d.ts +0 -4
  816. package/dist/cli/commands/cost.d.ts.map +0 -1
  817. package/dist/cli/commands/cost.js +0 -53
  818. package/dist/cli/commands/cost.js.map +0 -1
  819. package/dist/cli/commands/export.d.ts +0 -5
  820. package/dist/cli/commands/export.d.ts.map +0 -1
  821. package/dist/cli/commands/export.js +0 -30
  822. package/dist/cli/commands/export.js.map +0 -1
  823. package/dist/cli/commands/sessions.d.ts +0 -5
  824. package/dist/cli/commands/sessions.d.ts.map +0 -1
  825. package/dist/cli/commands/sessions.js +0 -89
  826. package/dist/cli/commands/sessions.js.map +0 -1
  827. package/dist/cli/commands/stats.d.ts +0 -5
  828. package/dist/cli/commands/stats.d.ts.map +0 -1
  829. package/dist/cli/commands/stats.js +0 -84
  830. package/dist/cli/commands/stats.js.map +0 -1
  831. package/dist/cli/utils/tokscale-launcher.d.ts +0 -25
  832. package/dist/cli/utils/tokscale-launcher.d.ts.map +0 -1
  833. package/dist/cli/utils/tokscale-launcher.js +0 -70
  834. package/dist/cli/utils/tokscale-launcher.js.map +0 -1
  835. package/dist/hud/analytics-display.d.ts +0 -63
  836. package/dist/hud/analytics-display.d.ts.map +0 -1
  837. package/dist/hud/analytics-display.js +0 -190
  838. package/dist/hud/analytics-display.js.map +0 -1
  839. package/scripts/build-codex-server.mjs +0 -95
@@ -149,10 +149,28 @@ async function main() {
149
149
  // Write error state
150
150
  writeErrorState(stateDir, toolName, inputPreview, error, retryCount);
151
151
 
152
- console.log(JSON.stringify({ continue: true, suppressOutput: true }));
152
+ // Inject continuation guidance so the model analyzes the error instead of stopping.
153
+ // Without this, PostToolUseFailure returns silently and the model may end its turn.
154
+ // The PostToolUse hook (post-tool-verifier.mjs) provides similar guidance for
155
+ // successful Bash calls with error patterns, but PostToolUseFailure is a separate
156
+ // event that needs its own guidance injection.
157
+ let guidance;
158
+ if (retryCount >= 5) {
159
+ guidance = `Tool "${toolName}" has failed ${retryCount} times. Stop retrying the same approach — try a different command, check dependencies, or ask the user for guidance.`;
160
+ } else {
161
+ guidance = `Tool "${toolName}" failed. Analyze the error, fix the issue, and continue working.`;
162
+ }
163
+
164
+ console.log(JSON.stringify({
165
+ continue: true,
166
+ hookSpecificOutput: {
167
+ hookEventName: 'PostToolUseFailure',
168
+ additionalContext: guidance,
169
+ },
170
+ }));
153
171
  } catch (error) {
154
172
  // Never block on hook errors
155
- console.log(JSON.stringify({ continue: true, suppressOutput: true }));
173
+ console.log(JSON.stringify({ continue: true }));
156
174
  }
157
175
  }
158
176
 
@@ -134,6 +134,47 @@ function stripClaudeTempCwdErrors(output) {
134
134
  return output.replace(CLAUDE_TEMP_CWD_PATTERN, '');
135
135
  }
136
136
 
137
+ // Pattern matching Claude Code's "Error: Exit code N" prefix line
138
+ const CLAUDE_EXIT_CODE_PREFIX = /^Error: Exit code \d+\s*$/gm;
139
+
140
+ /**
141
+ * Detect non-zero exit code with valid stdout (issue #960).
142
+ * Returns true when output has Claude Code's "Error: Exit code N" prefix
143
+ * AND substantial content that doesn't itself indicate real errors.
144
+ * Example: `gh pr checks` exits 8 (pending) but outputs valid CI status.
145
+ */
146
+ export function isNonZeroExitWithOutput(output) {
147
+ if (!output) return false;
148
+ const cleaned = stripClaudeTempCwdErrors(output);
149
+
150
+ // Must contain Claude Code's exit code prefix
151
+ if (!CLAUDE_EXIT_CODE_PREFIX.test(cleaned)) return false;
152
+ // Reset regex state (global flag)
153
+ CLAUDE_EXIT_CODE_PREFIX.lastIndex = 0;
154
+
155
+ // Strip exit code prefix line(s) and check remaining content
156
+ const remaining = cleaned.replace(CLAUDE_EXIT_CODE_PREFIX, '').trim();
157
+ CLAUDE_EXIT_CODE_PREFIX.lastIndex = 0;
158
+
159
+ // Must have at least one non-empty line of real output
160
+ const contentLines = remaining.split('\n').filter(l => l.trim().length > 0);
161
+ if (contentLines.length === 0) return false;
162
+
163
+ // If remaining content has its own error indicators, it's a real failure
164
+ const contentErrorPatterns = [
165
+ /error:/i,
166
+ /failed/i,
167
+ /cannot/i,
168
+ /permission denied/i,
169
+ /command not found/i,
170
+ /no such file/i,
171
+ /fatal:/i,
172
+ /abort/i,
173
+ ];
174
+
175
+ return !contentErrorPatterns.some(p => p.test(remaining));
176
+ }
177
+
137
178
  // Detect failures in Bash output
138
179
  export function detectBashFailure(output) {
139
180
  const cleaned = stripClaudeTempCwdErrors(output);
@@ -206,14 +247,19 @@ function processRememberTags(output, directory) {
206
247
  }
207
248
 
208
249
  // Detect write failure
250
+ // Patterns are tightened to tool-level failure phrases to avoid false positives
251
+ // when edited file content contains error-handling code (issue #1005)
209
252
  export function detectWriteFailure(output) {
210
253
  const cleaned = stripClaudeTempCwdErrors(output);
211
254
  const errorPatterns = [
212
- /error/i,
213
- /failed/i,
214
- /permission denied/i,
215
- /read-only/i,
216
- /not found/i,
255
+ /\berror:/i, // "error:" with word boundary — avoids "setError", "console.error"
256
+ /\bfailed to\b/i, // "failed to write" — avoids "failedOidc", UI strings
257
+ /\bwrite failed\b/i, // explicit write failure
258
+ /\boperation failed\b/i, // explicit operation failure
259
+ /permission denied/i, // keep as-is (specific enough)
260
+ /read-only/i, // keep as-is
261
+ /\bno such file\b/i, // more specific than "not found"
262
+ /\bdirectory not found\b/i,
217
263
  ];
218
264
 
219
265
  return errorPatterns.some(pattern => pattern.test(cleaned));
@@ -251,7 +297,12 @@ function generateMessage(toolName, toolOutput, sessionId, toolCount, directory)
251
297
 
252
298
  switch (toolName) {
253
299
  case 'Bash':
254
- if (detectBashFailure(toolOutput)) {
300
+ if (isNonZeroExitWithOutput(toolOutput)) {
301
+ // Non-zero exit with valid output — warning, not error (issue #960)
302
+ const exitMatch = toolOutput.match(/Exit code (\d+)/);
303
+ const code = exitMatch ? exitMatch[1] : 'non-zero';
304
+ message = `Command exited with code ${code} but produced valid output. This may be expected behavior.`;
305
+ } else if (detectBashFailure(toolOutput)) {
255
306
  message = 'Command failed. Please investigate the error and fix before continuing.';
256
307
  } else if (detectBackgroundOperation(toolOutput)) {
257
308
  message = 'Background operation detected. Remember to verify results before proceeding.';
@@ -11,6 +11,17 @@ import { join } from 'path';
11
11
  import { pathToFileURL } from 'url';
12
12
  import { readStdin } from './lib/stdin.mjs';
13
13
 
14
+ const SESSION_ID_PATTERN = /^[a-zA-Z0-9][a-zA-Z0-9_-]{0,255}$/;
15
+ const MODE_STATE_FILES = [
16
+ 'autopilot-state.json',
17
+ 'ultrapilot-state.json',
18
+ 'ralph-state.json',
19
+ 'ultrawork-state.json',
20
+ 'ultraqa-state.json',
21
+ 'pipeline-state.json',
22
+ 'team-state.json',
23
+ ];
24
+
14
25
  // Simple JSON field extraction
15
26
  function extractJsonField(input, field, defaultValue = '') {
16
27
  try {
@@ -74,8 +85,88 @@ function getTodoStatus(directory) {
74
85
  return '';
75
86
  }
76
87
 
88
+ function isValidSessionId(sessionId) {
89
+ return typeof sessionId === 'string' && SESSION_ID_PATTERN.test(sessionId);
90
+ }
91
+
92
+ function readJsonFile(filePath) {
93
+ try {
94
+ if (!existsSync(filePath)) return null;
95
+ return JSON.parse(readFileSync(filePath, 'utf-8'));
96
+ } catch {
97
+ return null;
98
+ }
99
+ }
100
+
101
+ function hasActiveJsonMode(stateDir, { allowSessionTagged = false } = {}) {
102
+ for (const file of MODE_STATE_FILES) {
103
+ const state = readJsonFile(join(stateDir, file));
104
+ if (!state || state.active !== true) continue;
105
+ if (!allowSessionTagged && state.session_id) continue;
106
+ return true;
107
+ }
108
+ return false;
109
+ }
110
+
111
+ function hasActiveSwarmMode(stateDir, { allowSessionTagged = false } = {}) {
112
+ const markerFile = join(stateDir, 'swarm-active.marker');
113
+ if (!existsSync(markerFile)) return false;
114
+
115
+ const summary = readJsonFile(join(stateDir, 'swarm-summary.json'));
116
+ if (!summary || summary.active !== true) return false;
117
+ if (!allowSessionTagged && summary.session_id) return false;
118
+
119
+ return true;
120
+ }
121
+
122
+ function hasActiveMode(directory, sessionId) {
123
+ const stateDir = join(directory, '.omc', 'state');
124
+
125
+ if (isValidSessionId(sessionId)) {
126
+ const sessionStateDir = join(stateDir, 'sessions', sessionId);
127
+ return (
128
+ hasActiveJsonMode(sessionStateDir, { allowSessionTagged: true }) ||
129
+ hasActiveSwarmMode(sessionStateDir, { allowSessionTagged: true })
130
+ );
131
+ }
132
+
133
+ return (
134
+ hasActiveJsonMode(stateDir, { allowSessionTagged: false }) ||
135
+ hasActiveSwarmMode(stateDir, { allowSessionTagged: false })
136
+ );
137
+ }
138
+
139
+ /**
140
+ * Check if team mode is active for the given directory/session.
141
+ * Reads team-state.json from session-scoped or legacy paths.
142
+ * Returns the team state object if active, null otherwise.
143
+ */
144
+ function getActiveTeamState(directory, sessionId) {
145
+ const paths = [];
146
+
147
+ // Session-scoped path (preferred)
148
+ if (sessionId && SESSION_ID_PATTERN.test(sessionId)) {
149
+ paths.push(join(directory, '.omc', 'state', 'sessions', sessionId, 'team-state.json'));
150
+ }
151
+
152
+ // Legacy path
153
+ paths.push(join(directory, '.omc', 'state', 'team-state.json'));
154
+
155
+ for (const statePath of paths) {
156
+ const state = readJsonFile(statePath);
157
+ if (state && state.active === true) {
158
+ // Respect session isolation: skip state tagged to a different session
159
+ if (sessionId && state.session_id && state.session_id !== sessionId) {
160
+ continue;
161
+ }
162
+ return state;
163
+ }
164
+ }
165
+ return null;
166
+ }
167
+
77
168
  // Generate agent spawn message with metadata
78
- function generateAgentSpawnMessage(toolInput, directory, todoStatus) {
169
+ function generateAgentSpawnMessage(toolInput, directory, todoStatus, sessionId) {
79
170
  if (!toolInput || typeof toolInput !== 'object') {
80
171
  return `${todoStatus}Launch multiple agents in parallel when tasks are independent. Use run_in_background for long operations.`;
81
172
  }
@@ -86,6 +177,20 @@ function generateAgentSpawnMessage(toolInput, directory, todoStatus) {
86
177
  const bg = toolInput.run_in_background ? ' [BACKGROUND]' : '';
87
178
  const tracking = getAgentTrackingInfo(directory);
88
179
 
180
+ // Team-routing enforcement (issue #1006):
181
+ // When team state is active and Task is called WITHOUT team_name,
182
+ // inject a redirect message to use team agents instead of subagents.
183
+ const teamState = getActiveTeamState(directory, sessionId);
184
+ if (teamState && !toolInput.team_name) {
185
+ const teamName = teamState.team_name || teamState.teamName || 'team';
186
+ return `[TEAM ROUTING REQUIRED] Team "${teamName}" is active but you are spawning a regular subagent ` +
187
+ `without team_name. You MUST use TeamCreate first (if not already created), then spawn teammates with ` +
188
+ `Task(team_name="${teamName}", name="worker-N", subagent_type="${agentType}"). ` +
189
+ `Do NOT use Task without team_name during an active team session. ` +
190
+ `If TeamCreate is not available in your tools, tell the user to verify ` +
191
+ `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1 is set in ~/.claude/settings.json and restart Claude Code.`;
192
+ }
193
+
89
194
  const parts = [`${todoStatus}Spawning agent: ${agentType} (${model})${bg}`];
90
195
  if (desc) parts.push(`Task: ${desc}`);
91
196
  if (tracking.running > 0) parts.push(`Active agents: ${tracking.running}`);
@@ -94,7 +199,7 @@ function generateAgentSpawnMessage(toolInput, directory, todoStatus) {
94
199
  }
95
200
 
96
201
  // Generate contextual message based on tool type
97
- function generateMessage(toolName, todoStatus) {
202
+ function generateMessage(toolName, todoStatus, modeActive = false) {
98
203
  const messages = {
99
204
  TodoWrite: `${todoStatus}Mark todos in_progress BEFORE starting, completed IMMEDIATELY after finishing.`,
100
205
  Bash: `${todoStatus}Use parallel execution for independent tasks. Use run_in_background for long operations (npm install, builds, tests).`,
@@ -105,7 +210,9 @@ function generateMessage(toolName, todoStatus) {
105
210
  Glob: `${todoStatus}Combine searches in parallel when investigating multiple patterns.`,
106
211
  };
107
212
 
108
- return messages[toolName] || `${todoStatus}The boulder never stops. Continue until all tasks complete.`;
213
+ if (messages[toolName]) return messages[toolName];
214
+ if (modeActive) return `${todoStatus}The boulder never stops. Continue until all tasks complete.`;
215
+ return '';
109
216
  }
110
217
 
111
218
  // Record Skill/Task invocations to flow trace (best-effort)
@@ -144,6 +251,14 @@ async function main() {
144
251
  try { data = JSON.parse(input); } catch {}
145
252
  recordToolInvocation(data, directory);
146
253
 
254
+ const sessionId =
255
+ typeof data.session_id === 'string'
256
+ ? data.session_id
257
+ : typeof data.sessionId === 'string'
258
+ ? data.sessionId
259
+ : '';
260
+ const modeActive = hasActiveMode(directory, sessionId);
261
+
147
262
  // Send notification when AskUserQuestion is about to execute (user input needed)
148
263
  // Fires in PreToolUse so users get notified BEFORE the tool blocks for input (#597)
149
264
  if (toolName === 'AskUserQuestion') {
@@ -174,9 +289,14 @@ async function main() {
174
289
  let message;
175
290
  if (toolName === 'Task' || toolName === 'TaskCreate' || toolName === 'TaskUpdate') {
176
291
  const toolInput = data.toolInput || data.tool_input || null;
177
- message = generateAgentSpawnMessage(toolInput, directory, todoStatus);
292
+ message = generateAgentSpawnMessage(toolInput, directory, todoStatus, sessionId);
178
293
  } else {
179
- message = generateMessage(toolName, todoStatus);
294
+ message = generateMessage(toolName, todoStatus, modeActive);
295
+ }
296
+
297
+ if (!message) {
298
+ console.log(JSON.stringify({ continue: true, suppressOutput: true }));
299
+ return;
180
300
  }
181
301
 
182
302
  console.log(JSON.stringify({
@@ -0,0 +1,114 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+ /**
4
+ * OMC Cross-platform hook runner (run.cjs)
5
+ *
6
+ * Uses process.execPath (the Node binary already running this script) to spawn
7
+ * the target .mjs hook, bypassing PATH / shell discovery issues.
8
+ *
9
+ * Replaces the `sh + find-node.sh` chain that fails on Windows because
10
+ * /usr/bin/sh is a PE32+ binary the OS refuses to execute natively.
11
+ * Fixes issues #909, #899, #892, #869.
12
+ *
13
+ * Usage (from hooks.json, after setup patches the absolute node path in):
14
+ * /abs/path/to/node "${CLAUDE_PLUGIN_ROOT}/scripts/run.cjs" \
15
+ * "${CLAUDE_PLUGIN_ROOT}/scripts/<hook>.mjs" [args...]
16
+ *
17
+ * During post-install setup, the leading `node` token is replaced with
18
+ * process.execPath so nvm/fnm users and Windows users all get the right binary.
19
+ */
20
+
21
+ const { spawnSync } = require('child_process');
22
+ const { existsSync, realpathSync } = require('fs');
23
+ const { join, basename, dirname } = require('path');
24
+
25
+ const target = process.argv[2];
26
+ if (!target) {
27
+ // Nothing to run — exit cleanly so Claude Code hooks are never blocked.
28
+ process.exit(0);
29
+ }
30
+
31
+ /**
32
+ * Resolve the hook script target path, handling stale CLAUDE_PLUGIN_ROOT.
33
+ *
34
+ * When a plugin update replaces an old version directory with a symlink (or
35
+ * deletes it entirely), sessions that still reference the old version via
36
+ * CLAUDE_PLUGIN_ROOT will fail with MODULE_NOT_FOUND.
37
+ *
38
+ * Resolution strategy:
39
+ * 1. Use the target as-is if it exists.
40
+ * 2. Try resolving through realpathSync (follows symlinks).
41
+ * 3. Scan the plugin cache for the latest available version that has the
42
+ * same script name and use that instead.
43
+ * 4. If all else fails, return null (caller exits cleanly).
44
+ *
45
+ * See: https://github.com/Yeachan-Heo/oh-my-claudecode/issues/1007
46
+ */
47
+ function resolveTarget(targetPath) {
48
+ // Fast path: target exists (common case)
49
+ if (existsSync(targetPath)) return targetPath;
50
+
51
+ // Try realpath resolution (handles broken symlinks that resolve elsewhere)
52
+ try {
53
+ const resolved = realpathSync(targetPath);
54
+ if (existsSync(resolved)) return resolved;
55
+ } catch {
56
+ // realpathSync throws if the path doesn't exist at all — expected
57
+ }
58
+
59
+ // Fallback: scan plugin cache for the same script in the latest version.
60
+ // CLAUDE_PLUGIN_ROOT is e.g. ~/.claude/plugins/cache/omc/oh-my-claudecode/4.2.14
61
+ // We look one level up for sibling version directories.
62
+ try {
63
+ const pluginRoot = process.env.CLAUDE_PLUGIN_ROOT;
64
+ if (!pluginRoot) return null;
65
+
66
+ const cacheBase = dirname(pluginRoot); // .../oh-my-claudecode/
67
+ const scriptRelative = targetPath.slice(pluginRoot.length); // /scripts/persistent-mode.cjs
68
+
69
+ if (!scriptRelative || !existsSync(cacheBase)) return null;
70
+
71
+ // Find version directories (real dirs or valid symlinks), pick latest
72
+ const { readdirSync, lstatSync, readlinkSync } = require('fs');
73
+ const entries = readdirSync(cacheBase).filter(v => /^\d+\.\d+\.\d+/.test(v));
74
+
75
+ // Sort descending by semver
76
+ entries.sort((a, b) => {
77
+ const pa = a.split('.').map(Number);
78
+ const pb = b.split('.').map(Number);
79
+ for (let i = 0; i < 3; i++) {
80
+ if ((pa[i] || 0) !== (pb[i] || 0)) return (pb[i] || 0) - (pa[i] || 0);
81
+ }
82
+ return 0;
83
+ });
84
+
85
+ for (const version of entries) {
86
+ const candidate = join(cacheBase, version) + scriptRelative;
87
+ if (existsSync(candidate)) return candidate;
88
+ }
89
+ } catch {
90
+ // Any error in fallback scan — give up gracefully
91
+ }
92
+
93
+ return null;
94
+ }
95
+
96
+ const resolved = resolveTarget(target);
97
+ if (!resolved) {
98
+ // Target not found anywhere — exit cleanly so hooks are never blocked.
99
+ // This is the graceful fallback for stale CLAUDE_PLUGIN_ROOT paths.
100
+ process.exit(0);
101
+ }
102
+
103
+ const result = spawnSync(
104
+ process.execPath,
105
+ [resolved, ...process.argv.slice(3)],
106
+ {
107
+ stdio: 'inherit',
108
+ env: process.env,
109
+ windowsHide: true,
110
+ }
111
+ );
112
+
113
+ // Propagate the child exit code (null → 0 to avoid blocking hooks).
114
+ process.exit(result.status ?? 0);
@@ -6,7 +6,7 @@
6
6
  * Cross-platform: Windows, macOS, Linux
7
7
  */
8
8
 
9
- import { existsSync, readFileSync, readdirSync, rmSync, mkdirSync, writeFileSync } from 'fs';
9
+ import { existsSync, readFileSync, readdirSync, rmSync, mkdirSync, writeFileSync, symlinkSync, lstatSync, readlinkSync, unlinkSync, renameSync } from 'fs';
10
10
  import { join, dirname } from 'path';
11
11
  import { homedir } from 'os';
12
12
  import { fileURLToPath, pathToFileURL } from 'url';
@@ -414,7 +414,10 @@ ${cleanContent}
414
414
  }
415
415
  }
416
416
 
417
- // Cleanup old plugin cache versions (keep latest 2)
417
+ // Cleanup old plugin cache versions (keep latest 2, symlink the rest)
418
+ // Instead of deleting old versions, replace them with symlinks to the latest.
419
+ // This prevents "Cannot find module" errors for sessions started before a
420
+ // plugin update whose CLAUDE_PLUGIN_ROOT still points to the old version.
418
421
  try {
419
422
  const cacheBase = join(configDir, 'plugins', 'cache', 'omc', 'oh-my-claudecode');
420
423
  if (existsSync(cacheBase)) {
@@ -422,11 +425,57 @@ ${cleanContent}
422
425
  .filter(v => /^\d+\.\d+\.\d+/.test(v))
423
426
  .sort(semverCompare)
424
427
  .reverse();
425
- const toRemove = versions.slice(2);
426
- for (const version of toRemove) {
427
- try {
428
- rmSync(join(cacheBase, version), { recursive: true, force: true });
429
- } catch {}
428
+
429
+ if (versions.length > 2) {
430
+ const latest = versions[0];
431
+ const toSymlink = versions.slice(2);
432
+ for (const version of toSymlink) {
433
+ try {
434
+ const versionPath = join(cacheBase, version);
435
+ const stat = lstatSync(versionPath);
436
+
437
+ const isWin = process.platform === 'win32';
438
+ const symlinkTarget = isWin ? join(cacheBase, latest) : latest;
439
+
440
+ if (stat.isSymbolicLink()) {
441
+ // Already a symlink — update only if pointing to wrong target.
442
+ // Use atomic temp-symlink + rename to avoid a window where
443
+ // the path doesn't exist (fixes race in issue #1007).
444
+ const target = readlinkSync(versionPath);
445
+ if (target === latest || target === join(cacheBase, latest)) continue;
446
+ try {
447
+ const tmpLink = versionPath + '.tmp.' + process.pid;
448
+ symlinkSync(symlinkTarget, tmpLink, isWin ? 'junction' : undefined);
449
+ try {
450
+ renameSync(tmpLink, versionPath);
451
+ } catch {
452
+ // rename failed (e.g. cross-device) — fall back to unlink+symlink
453
+ try { unlinkSync(tmpLink); } catch {}
454
+ unlinkSync(versionPath);
455
+ symlinkSync(symlinkTarget, versionPath, isWin ? 'junction' : undefined);
456
+ }
457
+ } catch (swapErr) {
458
+ if (swapErr?.code !== 'EEXIST') {
459
+ // Leave as-is rather than losing it
460
+ }
461
+ }
462
+ } else if (stat.isDirectory()) {
463
+ // Directory → symlink: cannot be atomic, but run.cjs now
464
+ // handles missing targets gracefully (issue #1007).
465
+ rmSync(versionPath, { recursive: true, force: true });
466
+ try {
467
+ symlinkSync(symlinkTarget, versionPath, isWin ? 'junction' : undefined);
468
+ } catch (symlinkErr) {
469
+ // EEXIST: another session raced us — safe to ignore.
470
+ if (symlinkErr?.code !== 'EEXIST') {
471
+ // Symlink genuinely failed. Leave the path as-is.
472
+ }
473
+ }
474
+ }
475
+ } catch {
476
+ // lstatSync / rmSync / unlinkSync failure — leave old directory as-is.
477
+ }
478
+ }
430
479
  }
431
480
  }
432
481
  } catch {}
@@ -0,0 +1,144 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { spawnSync } from 'node:child_process';
4
+
5
+ const SESSION_PREFIX = 'omc-team-';
6
+
7
+ function runTmux(args) {
8
+ const result = spawnSync('tmux', args, {
9
+ encoding: 'utf8',
10
+ stdio: ['ignore', 'pipe', 'pipe'],
11
+ });
12
+
13
+ if (result.error) {
14
+ return {
15
+ ok: false,
16
+ code: 1,
17
+ stderr: result.error.message,
18
+ stdout: '',
19
+ };
20
+ }
21
+
22
+ return {
23
+ ok: result.status === 0,
24
+ code: result.status ?? 1,
25
+ stderr: (result.stderr || '').trim(),
26
+ stdout: (result.stdout || '').trimEnd(),
27
+ };
28
+ }
29
+
30
+ function printTable(rows) {
31
+ const headers = ['session', 'pane ID', 'command', 'status'];
32
+ const widths = [
33
+ headers[0].length,
34
+ headers[1].length,
35
+ headers[2].length,
36
+ headers[3].length,
37
+ ];
38
+
39
+ for (const row of rows) {
40
+ widths[0] = Math.max(widths[0], row.session.length);
41
+ widths[1] = Math.max(widths[1], row.paneId.length);
42
+ widths[2] = Math.max(widths[2], row.command.length);
43
+ widths[3] = Math.max(widths[3], row.status.length);
44
+ }
45
+
46
+ const format = (cols) =>
47
+ cols
48
+ .map((col, idx) => col.padEnd(widths[idx]))
49
+ .join(' ')
50
+ .trimEnd();
51
+
52
+ const separator = widths
53
+ .map((w) => '-'.repeat(w))
54
+ .join(' ')
55
+ .trimEnd();
56
+
57
+ console.log(format(headers));
58
+ console.log(separator);
59
+
60
+ for (const row of rows) {
61
+ console.log(format([row.session, row.paneId, row.command, row.status]));
62
+ }
63
+ }
64
+
65
+ function parsePaneLine(line, session) {
66
+ const trimmed = line.trim();
67
+ if (!trimmed) return null;
68
+
69
+ const parts = trimmed.split(/\s+/);
70
+ if (parts.length < 3) return null;
71
+
72
+ const paneId = parts[0];
73
+ const paneDead = parts[parts.length - 1];
74
+ const command = parts.slice(1, -1).join(' ');
75
+
76
+ return {
77
+ session,
78
+ paneId,
79
+ command,
80
+ status: paneDead === '1' ? 'dead' : 'alive',
81
+ };
82
+ }
83
+
84
+ function main() {
85
+ const sessionsResult = runTmux(['list-sessions', '-F', '#{session_name}']);
86
+
87
+ if (!sessionsResult.ok) {
88
+ const err = sessionsResult.stderr || 'tmux is unavailable or no server is running.';
89
+ console.error(`Failed to list tmux sessions: ${err}`);
90
+ process.exit(1);
91
+ }
92
+
93
+ const sessions = sessionsResult.stdout
94
+ .split('\n')
95
+ .map((s) => s.trim())
96
+ .filter((s) => s.startsWith(SESSION_PREFIX));
97
+
98
+ if (sessions.length === 0) {
99
+ console.error(`No tmux sessions found with prefix '${SESSION_PREFIX}'.`);
100
+ process.exit(0);
101
+ }
102
+
103
+ const rows = [];
104
+ let sawDeadPane = false;
105
+
106
+ for (const session of sessions) {
107
+ const panesResult = runTmux([
108
+ 'list-panes',
109
+ '-t',
110
+ session,
111
+ '-F',
112
+ '#{pane_id} #{pane_current_command} #{pane_dead}',
113
+ ]);
114
+
115
+ if (!panesResult.ok) {
116
+ const err = panesResult.stderr || `failed to list panes for session ${session}`;
117
+ console.error(`Failed to inspect panes for '${session}': ${err}`);
118
+ sawDeadPane = true;
119
+ continue;
120
+ }
121
+
122
+ const paneLines = panesResult.stdout
123
+ .split('\n')
124
+ .map((line) => parsePaneLine(line, session))
125
+ .filter(Boolean);
126
+
127
+ for (const pane of paneLines) {
128
+ if (pane.status === 'dead') {
129
+ sawDeadPane = true;
130
+ }
131
+ rows.push(pane);
132
+ }
133
+ }
134
+
135
+ if (rows.length === 0) {
136
+ console.error('No panes found for matching sessions.');
137
+ process.exit(sawDeadPane ? 1 : 0);
138
+ }
139
+
140
+ printTable(rows);
141
+ process.exit(sawDeadPane ? 1 : 0);
142
+ }
143
+
144
+ main();