oh-my-claude-sisyphus 3.8.8 → 3.8.10

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 (460) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/README.md +1 -1
  4. package/agents/architect.md +78 -0
  5. package/agents/explore.md +15 -0
  6. package/agents/qa-tester.md +159 -1
  7. package/agents/writer.md +20 -0
  8. package/commands/help.md +1 -1
  9. package/commands/omc-setup.md +1 -1
  10. package/dist/__tests__/agent-registry.test.d.ts +2 -0
  11. package/dist/__tests__/agent-registry.test.d.ts.map +1 -0
  12. package/dist/__tests__/agent-registry.test.js +39 -0
  13. package/dist/__tests__/agent-registry.test.js.map +1 -0
  14. package/dist/__tests__/hooks.test.js +6 -6
  15. package/dist/__tests__/hooks.test.js.map +1 -1
  16. package/dist/__tests__/load-agent-prompt.test.d.ts +2 -0
  17. package/dist/__tests__/load-agent-prompt.test.d.ts.map +1 -0
  18. package/dist/__tests__/load-agent-prompt.test.js +68 -0
  19. package/dist/__tests__/load-agent-prompt.test.js.map +1 -0
  20. package/dist/__tests__/model-routing.test.js +5 -34
  21. package/dist/__tests__/model-routing.test.js.map +1 -1
  22. package/dist/agents/analyst.d.ts.map +1 -1
  23. package/dist/agents/analyst.js +2 -77
  24. package/dist/agents/analyst.js.map +1 -1
  25. package/dist/agents/architect.d.ts.map +1 -1
  26. package/dist/agents/architect.js +3 -148
  27. package/dist/agents/architect.js.map +1 -1
  28. package/dist/agents/coordinator-deprecated.d.ts +18 -0
  29. package/dist/agents/coordinator-deprecated.d.ts.map +1 -0
  30. package/dist/agents/coordinator-deprecated.js +34 -0
  31. package/dist/agents/coordinator-deprecated.js.map +1 -0
  32. package/dist/agents/critic.d.ts.map +1 -1
  33. package/dist/agents/critic.js +2 -90
  34. package/dist/agents/critic.js.map +1 -1
  35. package/dist/agents/definitions.d.ts +2 -0
  36. package/dist/agents/definitions.d.ts.map +1 -1
  37. package/dist/agents/definitions.js +3 -32
  38. package/dist/agents/definitions.js.map +1 -1
  39. package/dist/agents/designer.d.ts.map +1 -1
  40. package/dist/agents/designer.js +2 -73
  41. package/dist/agents/designer.js.map +1 -1
  42. package/dist/agents/executor.d.ts +1 -0
  43. package/dist/agents/executor.d.ts.map +1 -1
  44. package/dist/agents/executor.js +3 -56
  45. package/dist/agents/executor.js.map +1 -1
  46. package/dist/agents/explore.d.ts.map +1 -1
  47. package/dist/agents/explore.js +2 -64
  48. package/dist/agents/explore.js.map +1 -1
  49. package/dist/agents/index.d.ts +4 -3
  50. package/dist/agents/index.d.ts.map +1 -1
  51. package/dist/agents/index.js +6 -3
  52. package/dist/agents/index.js.map +1 -1
  53. package/dist/agents/planner.d.ts.map +1 -1
  54. package/dist/agents/planner.js +2 -157
  55. package/dist/agents/planner.js.map +1 -1
  56. package/dist/agents/qa-tester.d.ts.map +1 -1
  57. package/dist/agents/qa-tester.js +2 -324
  58. package/dist/agents/qa-tester.js.map +1 -1
  59. package/dist/agents/researcher.d.ts.map +1 -1
  60. package/dist/agents/researcher.js +2 -65
  61. package/dist/agents/researcher.js.map +1 -1
  62. package/dist/agents/scientist.d.ts.map +1 -1
  63. package/dist/agents/scientist.js +2 -293
  64. package/dist/agents/scientist.js.map +1 -1
  65. package/dist/agents/utils.d.ts +7 -0
  66. package/dist/agents/utils.d.ts.map +1 -1
  67. package/dist/agents/utils.js +50 -0
  68. package/dist/agents/utils.js.map +1 -1
  69. package/dist/agents/vision.d.ts.map +1 -1
  70. package/dist/agents/vision.js +2 -32
  71. package/dist/agents/vision.js.map +1 -1
  72. package/dist/agents/writer.d.ts.map +1 -1
  73. package/dist/agents/writer.js +2 -171
  74. package/dist/agents/writer.js.map +1 -1
  75. package/dist/cli/analytics.js +0 -0
  76. package/dist/cli/index.js +0 -0
  77. package/dist/features/model-routing/index.d.ts +1 -1
  78. package/dist/features/model-routing/index.d.ts.map +1 -1
  79. package/dist/features/model-routing/index.js +1 -1
  80. package/dist/features/model-routing/index.js.map +1 -1
  81. package/dist/features/model-routing/router.d.ts +1 -15
  82. package/dist/features/model-routing/router.d.ts.map +1 -1
  83. package/dist/features/model-routing/router.js +2 -33
  84. package/dist/features/model-routing/router.js.map +1 -1
  85. package/dist/features/model-routing/rules.d.ts.map +1 -1
  86. package/dist/features/model-routing/rules.js +0 -8
  87. package/dist/features/model-routing/rules.js.map +1 -1
  88. package/dist/features/model-routing/types.d.ts +1 -2
  89. package/dist/features/model-routing/types.d.ts.map +1 -1
  90. package/dist/features/model-routing/types.js +2 -6
  91. package/dist/features/model-routing/types.js.map +1 -1
  92. package/dist/features/task-decomposer/index.d.ts +1 -1
  93. package/dist/features/task-decomposer/index.d.ts.map +1 -1
  94. package/dist/features/task-decomposer/index.js +5 -8
  95. package/dist/features/task-decomposer/index.js.map +1 -1
  96. package/dist/features/task-decomposer/types.d.ts +4 -4
  97. package/dist/features/task-decomposer/types.d.ts.map +1 -1
  98. package/dist/hooks/bridge.d.ts.map +1 -1
  99. package/dist/hooks/bridge.js +10 -2
  100. package/dist/hooks/bridge.js.map +1 -1
  101. package/dist/hooks/persistent-mode/index.d.ts.map +1 -1
  102. package/dist/hooks/persistent-mode/index.js +14 -12
  103. package/dist/hooks/persistent-mode/index.js.map +1 -1
  104. package/dist/hooks/todo-continuation/index.d.ts +9 -0
  105. package/dist/hooks/todo-continuation/index.d.ts.map +1 -1
  106. package/dist/hooks/todo-continuation/index.js +19 -0
  107. package/dist/hooks/todo-continuation/index.js.map +1 -1
  108. package/dist/hooks/ultrapilot/decomposer.d.ts +1 -1
  109. package/dist/hooks/ultrapilot/decomposer.js +2 -2
  110. package/dist/index.d.ts +1 -1
  111. package/dist/index.d.ts.map +1 -1
  112. package/dist/index.js +4 -2
  113. package/dist/index.js.map +1 -1
  114. package/docs/CLAUDE.md +44 -4
  115. package/docs/FEATURES.md +1 -1
  116. package/docs/MIGRATION.md +5 -5
  117. package/docs/REFERENCE.md +6 -2
  118. package/package.json +1 -1
  119. package/scripts/persistent-mode.mjs +27 -12
  120. package/skills/help/SKILL.md +1 -1
  121. package/skills/omc-setup/SKILL.md +1 -1
  122. package/templates/hooks/persistent-mode.mjs +26 -12
  123. package/templates/hooks/stop-continuation.mjs +30 -0
  124. package/dist/__tests__/analytics/analytics-summary.test.d.ts +0 -2
  125. package/dist/__tests__/analytics/analytics-summary.test.d.ts.map +0 -1
  126. package/dist/__tests__/analytics/analytics-summary.test.js +0 -267
  127. package/dist/__tests__/analytics/analytics-summary.test.js.map +0 -1
  128. package/dist/__tests__/analytics/cost-estimator.test.d.ts +0 -2
  129. package/dist/__tests__/analytics/cost-estimator.test.d.ts.map +0 -1
  130. package/dist/__tests__/analytics/cost-estimator.test.js +0 -212
  131. package/dist/__tests__/analytics/cost-estimator.test.js.map +0 -1
  132. package/dist/__tests__/hooks/auto-slash-command/executor.test.d.ts +0 -7
  133. package/dist/__tests__/hooks/auto-slash-command/executor.test.d.ts.map +0 -1
  134. package/dist/__tests__/hooks/auto-slash-command/executor.test.js +0 -374
  135. package/dist/__tests__/hooks/auto-slash-command/executor.test.js.map +0 -1
  136. package/dist/__tests__/hud/auto-tracking.integration.test.d.ts +0 -2
  137. package/dist/__tests__/hud/auto-tracking.integration.test.d.ts.map +0 -1
  138. package/dist/__tests__/hud/auto-tracking.integration.test.js +0 -12
  139. package/dist/__tests__/hud/auto-tracking.integration.test.js.map +0 -1
  140. package/dist/__tests__/learned-skills/config.test.d.ts +0 -2
  141. package/dist/__tests__/learned-skills/config.test.d.ts.map +0 -1
  142. package/dist/__tests__/learned-skills/config.test.js +0 -37
  143. package/dist/__tests__/learned-skills/config.test.js.map +0 -1
  144. package/dist/__tests__/learned-skills/detector.test.d.ts +0 -2
  145. package/dist/__tests__/learned-skills/detector.test.d.ts.map +0 -1
  146. package/dist/__tests__/learned-skills/detector.test.js +0 -99
  147. package/dist/__tests__/learned-skills/detector.test.js.map +0 -1
  148. package/dist/__tests__/learned-skills/finder.test.d.ts +0 -2
  149. package/dist/__tests__/learned-skills/finder.test.d.ts.map +0 -1
  150. package/dist/__tests__/learned-skills/finder.test.js +0 -59
  151. package/dist/__tests__/learned-skills/finder.test.js.map +0 -1
  152. package/dist/__tests__/learned-skills/loader.test.d.ts +0 -2
  153. package/dist/__tests__/learned-skills/loader.test.d.ts.map +0 -1
  154. package/dist/__tests__/learned-skills/loader.test.js +0 -69
  155. package/dist/__tests__/learned-skills/loader.test.js.map +0 -1
  156. package/dist/__tests__/learned-skills/parser.test.d.ts +0 -2
  157. package/dist/__tests__/learned-skills/parser.test.d.ts.map +0 -1
  158. package/dist/__tests__/learned-skills/parser.test.js +0 -81
  159. package/dist/__tests__/learned-skills/parser.test.js.map +0 -1
  160. package/dist/__tests__/learned-skills/validator.test.d.ts +0 -2
  161. package/dist/__tests__/learned-skills/validator.test.d.ts.map +0 -1
  162. package/dist/__tests__/learned-skills/validator.test.js +0 -85
  163. package/dist/__tests__/learned-skills/validator.test.js.map +0 -1
  164. package/dist/agents/codex-agents.d.ts +0 -20
  165. package/dist/agents/codex-agents.d.ts.map +0 -1
  166. package/dist/agents/codex-agents.js +0 -36
  167. package/dist/agents/codex-agents.js.map +0 -1
  168. package/dist/agents/coordinator.d.ts +0 -11
  169. package/dist/agents/coordinator.d.ts.map +0 -1
  170. package/dist/agents/coordinator.js +0 -115
  171. package/dist/agents/coordinator.js.map +0 -1
  172. package/dist/agents/document-writer.d.ts +0 -11
  173. package/dist/agents/document-writer.d.ts.map +0 -1
  174. package/dist/agents/document-writer.js +0 -209
  175. package/dist/agents/document-writer.js.map +0 -1
  176. package/dist/agents/frontend-engineer.d.ts +0 -11
  177. package/dist/agents/frontend-engineer.d.ts.map +0 -1
  178. package/dist/agents/frontend-engineer.js +0 -115
  179. package/dist/agents/frontend-engineer.js.map +0 -1
  180. package/dist/agents/librarian.d.ts +0 -12
  181. package/dist/agents/librarian.d.ts.map +0 -1
  182. package/dist/agents/librarian.js +0 -103
  183. package/dist/agents/librarian.js.map +0 -1
  184. package/dist/agents/metis.d.ts +0 -12
  185. package/dist/agents/metis.d.ts.map +0 -1
  186. package/dist/agents/metis.js +0 -117
  187. package/dist/agents/metis.js.map +0 -1
  188. package/dist/agents/momus.d.ts +0 -12
  189. package/dist/agents/momus.d.ts.map +0 -1
  190. package/dist/agents/momus.js +0 -128
  191. package/dist/agents/momus.js.map +0 -1
  192. package/dist/agents/multimodal-looker.d.ts +0 -11
  193. package/dist/agents/multimodal-looker.d.ts.map +0 -1
  194. package/dist/agents/multimodal-looker.js +0 -70
  195. package/dist/agents/multimodal-looker.js.map +0 -1
  196. package/dist/agents/oracle.d.ts +0 -13
  197. package/dist/agents/oracle.d.ts.map +0 -1
  198. package/dist/agents/oracle.js +0 -191
  199. package/dist/agents/oracle.js.map +0 -1
  200. package/dist/agents/orchestrator-sisyphus.d.ts +0 -11
  201. package/dist/agents/orchestrator-sisyphus.d.ts.map +0 -1
  202. package/dist/agents/orchestrator-sisyphus.js +0 -115
  203. package/dist/agents/orchestrator-sisyphus.js.map +0 -1
  204. package/dist/agents/prometheus.d.ts +0 -12
  205. package/dist/agents/prometheus.d.ts.map +0 -1
  206. package/dist/agents/prometheus.js +0 -195
  207. package/dist/agents/prometheus.js.map +0 -1
  208. package/dist/agents/sisyphus-junior.d.ts +0 -12
  209. package/dist/agents/sisyphus-junior.d.ts.map +0 -1
  210. package/dist/agents/sisyphus-junior.js +0 -93
  211. package/dist/agents/sisyphus-junior.js.map +0 -1
  212. package/dist/cli/components/CostDashboard.d.ts +0 -15
  213. package/dist/cli/components/CostDashboard.d.ts.map +0 -1
  214. package/dist/cli/components/CostDashboard.js +0 -15
  215. package/dist/cli/components/CostDashboard.js.map +0 -1
  216. package/dist/cli/components/LiveStats.d.ts +0 -16
  217. package/dist/cli/components/LiveStats.d.ts.map +0 -1
  218. package/dist/cli/components/LiveStats.js +0 -16
  219. package/dist/cli/components/LiveStats.js.map +0 -1
  220. package/dist/cli/components/SessionBrowser.d.ts +0 -14
  221. package/dist/cli/components/SessionBrowser.d.ts.map +0 -1
  222. package/dist/cli/components/SessionBrowser.js +0 -14
  223. package/dist/cli/components/SessionBrowser.js.map +0 -1
  224. package/dist/cli/tui.d.ts +0 -21
  225. package/dist/cli/tui.d.ts.map +0 -1
  226. package/dist/cli/tui.js +0 -21
  227. package/dist/cli/tui.js.map +0 -1
  228. package/dist/hooks/autopilot/signals.d.ts +0 -20
  229. package/dist/hooks/autopilot/signals.d.ts.map +0 -1
  230. package/dist/hooks/autopilot/signals.js +0 -75
  231. package/dist/hooks/autopilot/signals.js.map +0 -1
  232. package/dist/hooks/autopilot/summary.d.ts +0 -27
  233. package/dist/hooks/autopilot/summary.d.ts.map +0 -1
  234. package/dist/hooks/autopilot/summary.js +0 -160
  235. package/dist/hooks/autopilot/summary.js.map +0 -1
  236. package/dist/hooks/autopilot/transition.d.ts +0 -39
  237. package/dist/hooks/autopilot/transition.d.ts.map +0 -1
  238. package/dist/hooks/autopilot/transition.js +0 -216
  239. package/dist/hooks/autopilot/transition.js.map +0 -1
  240. package/dist/hooks/context-window-limit-recovery/constants.d.ts +0 -28
  241. package/dist/hooks/context-window-limit-recovery/constants.d.ts.map +0 -1
  242. package/dist/hooks/context-window-limit-recovery/constants.js +0 -85
  243. package/dist/hooks/context-window-limit-recovery/constants.js.map +0 -1
  244. package/dist/hooks/context-window-limit-recovery/index.d.ts +0 -62
  245. package/dist/hooks/context-window-limit-recovery/index.d.ts.map +0 -1
  246. package/dist/hooks/context-window-limit-recovery/index.js +0 -201
  247. package/dist/hooks/context-window-limit-recovery/index.js.map +0 -1
  248. package/dist/hooks/context-window-limit-recovery/parser.d.ts +0 -31
  249. package/dist/hooks/context-window-limit-recovery/parser.d.ts.map +0 -1
  250. package/dist/hooks/context-window-limit-recovery/parser.js +0 -241
  251. package/dist/hooks/context-window-limit-recovery/parser.js.map +0 -1
  252. package/dist/hooks/context-window-limit-recovery/types.d.ts +0 -84
  253. package/dist/hooks/context-window-limit-recovery/types.d.ts.map +0 -1
  254. package/dist/hooks/context-window-limit-recovery/types.js +0 -34
  255. package/dist/hooks/context-window-limit-recovery/types.js.map +0 -1
  256. package/dist/hooks/edit-error-recovery/index.d.ts +0 -62
  257. package/dist/hooks/edit-error-recovery/index.d.ts.map +0 -1
  258. package/dist/hooks/edit-error-recovery/index.js +0 -89
  259. package/dist/hooks/edit-error-recovery/index.js.map +0 -1
  260. package/dist/hooks/github-auto-responder/classifier.d.ts +0 -43
  261. package/dist/hooks/github-auto-responder/classifier.d.ts.map +0 -1
  262. package/dist/hooks/github-auto-responder/classifier.js +0 -150
  263. package/dist/hooks/github-auto-responder/classifier.js.map +0 -1
  264. package/dist/hooks/github-auto-responder/config.d.ts +0 -109
  265. package/dist/hooks/github-auto-responder/config.d.ts.map +0 -1
  266. package/dist/hooks/github-auto-responder/config.js +0 -69
  267. package/dist/hooks/github-auto-responder/config.js.map +0 -1
  268. package/dist/hooks/github-auto-responder/constants.d.ts +0 -45
  269. package/dist/hooks/github-auto-responder/constants.d.ts.map +0 -1
  270. package/dist/hooks/github-auto-responder/constants.js +0 -60
  271. package/dist/hooks/github-auto-responder/constants.js.map +0 -1
  272. package/dist/hooks/github-auto-responder/filters.d.ts +0 -95
  273. package/dist/hooks/github-auto-responder/filters.d.ts.map +0 -1
  274. package/dist/hooks/github-auto-responder/filters.js +0 -174
  275. package/dist/hooks/github-auto-responder/filters.js.map +0 -1
  276. package/dist/hooks/github-auto-responder/github-client.d.ts +0 -65
  277. package/dist/hooks/github-auto-responder/github-client.d.ts.map +0 -1
  278. package/dist/hooks/github-auto-responder/github-client.js +0 -128
  279. package/dist/hooks/github-auto-responder/github-client.js.map +0 -1
  280. package/dist/hooks/github-auto-responder/idempotency.d.ts +0 -68
  281. package/dist/hooks/github-auto-responder/idempotency.d.ts.map +0 -1
  282. package/dist/hooks/github-auto-responder/idempotency.js +0 -147
  283. package/dist/hooks/github-auto-responder/idempotency.js.map +0 -1
  284. package/dist/hooks/github-auto-responder/index.d.ts +0 -140
  285. package/dist/hooks/github-auto-responder/index.d.ts.map +0 -1
  286. package/dist/hooks/github-auto-responder/index.js +0 -145
  287. package/dist/hooks/github-auto-responder/index.js.map +0 -1
  288. package/dist/hooks/github-auto-responder/persona.d.ts +0 -40
  289. package/dist/hooks/github-auto-responder/persona.d.ts.map +0 -1
  290. package/dist/hooks/github-auto-responder/persona.js +0 -99
  291. package/dist/hooks/github-auto-responder/persona.js.map +0 -1
  292. package/dist/hooks/github-auto-responder/responder.d.ts +0 -122
  293. package/dist/hooks/github-auto-responder/responder.d.ts.map +0 -1
  294. package/dist/hooks/github-auto-responder/responder.js +0 -264
  295. package/dist/hooks/github-auto-responder/responder.js.map +0 -1
  296. package/dist/hooks/github-auto-responder/server.d.ts +0 -140
  297. package/dist/hooks/github-auto-responder/server.d.ts.map +0 -1
  298. package/dist/hooks/github-auto-responder/server.js +0 -301
  299. package/dist/hooks/github-auto-responder/server.js.map +0 -1
  300. package/dist/hooks/github-auto-responder/signature.d.ts +0 -34
  301. package/dist/hooks/github-auto-responder/signature.d.ts.map +0 -1
  302. package/dist/hooks/github-auto-responder/signature.js +0 -79
  303. package/dist/hooks/github-auto-responder/signature.js.map +0 -1
  304. package/dist/hooks/github-auto-responder/templates.d.ts +0 -16
  305. package/dist/hooks/github-auto-responder/templates.d.ts.map +0 -1
  306. package/dist/hooks/github-auto-responder/templates.js +0 -93
  307. package/dist/hooks/github-auto-responder/templates.js.map +0 -1
  308. package/dist/hooks/github-auto-responder/types.d.ts +0 -246
  309. package/dist/hooks/github-auto-responder/types.d.ts.map +0 -1
  310. package/dist/hooks/github-auto-responder/types.js +0 -7
  311. package/dist/hooks/github-auto-responder/types.js.map +0 -1
  312. package/dist/hooks/learned-skills/config.d.ts +0 -53
  313. package/dist/hooks/learned-skills/config.d.ts.map +0 -1
  314. package/dist/hooks/learned-skills/config.js +0 -103
  315. package/dist/hooks/learned-skills/config.js.map +0 -1
  316. package/dist/hooks/learned-skills/constants.d.ts +0 -24
  317. package/dist/hooks/learned-skills/constants.d.ts.map +0 -1
  318. package/dist/hooks/learned-skills/constants.js +0 -26
  319. package/dist/hooks/learned-skills/constants.js.map +0 -1
  320. package/dist/hooks/learned-skills/detection-hook.d.ts +0 -39
  321. package/dist/hooks/learned-skills/detection-hook.d.ts.map +0 -1
  322. package/dist/hooks/learned-skills/detection-hook.js +0 -83
  323. package/dist/hooks/learned-skills/detection-hook.js.map +0 -1
  324. package/dist/hooks/learned-skills/detector.d.ts +0 -30
  325. package/dist/hooks/learned-skills/detector.d.ts.map +0 -1
  326. package/dist/hooks/learned-skills/detector.js +0 -150
  327. package/dist/hooks/learned-skills/detector.js.map +0 -1
  328. package/dist/hooks/learned-skills/finder.d.ts +0 -21
  329. package/dist/hooks/learned-skills/finder.d.ts.map +0 -1
  330. package/dist/hooks/learned-skills/finder.js +0 -117
  331. package/dist/hooks/learned-skills/finder.js.map +0 -1
  332. package/dist/hooks/learned-skills/index.d.ts +0 -62
  333. package/dist/hooks/learned-skills/index.d.ts.map +0 -1
  334. package/dist/hooks/learned-skills/index.js +0 -137
  335. package/dist/hooks/learned-skills/index.js.map +0 -1
  336. package/dist/hooks/learned-skills/loader.d.ts +0 -20
  337. package/dist/hooks/learned-skills/loader.d.ts.map +0 -1
  338. package/dist/hooks/learned-skills/loader.js +0 -107
  339. package/dist/hooks/learned-skills/loader.js.map +0 -1
  340. package/dist/hooks/learned-skills/parser.d.ts +0 -21
  341. package/dist/hooks/learned-skills/parser.d.ts.map +0 -1
  342. package/dist/hooks/learned-skills/parser.js +0 -190
  343. package/dist/hooks/learned-skills/parser.js.map +0 -1
  344. package/dist/hooks/learned-skills/promotion.d.ts +0 -29
  345. package/dist/hooks/learned-skills/promotion.d.ts.map +0 -1
  346. package/dist/hooks/learned-skills/promotion.js +0 -87
  347. package/dist/hooks/learned-skills/promotion.js.map +0 -1
  348. package/dist/hooks/learned-skills/types.d.ts +0 -109
  349. package/dist/hooks/learned-skills/types.d.ts.map +0 -1
  350. package/dist/hooks/learned-skills/types.js +0 -8
  351. package/dist/hooks/learned-skills/types.js.map +0 -1
  352. package/dist/hooks/learned-skills/validator.d.ts +0 -15
  353. package/dist/hooks/learned-skills/validator.d.ts.map +0 -1
  354. package/dist/hooks/learned-skills/validator.js +0 -87
  355. package/dist/hooks/learned-skills/validator.js.map +0 -1
  356. package/dist/hooks/learned-skills/writer.d.ts +0 -27
  357. package/dist/hooks/learned-skills/writer.d.ts.map +0 -1
  358. package/dist/hooks/learned-skills/writer.js +0 -126
  359. package/dist/hooks/learned-skills/writer.js.map +0 -1
  360. package/dist/hooks/mnemosyne/config.d.ts +0 -53
  361. package/dist/hooks/mnemosyne/config.d.ts.map +0 -1
  362. package/dist/hooks/mnemosyne/config.js +0 -103
  363. package/dist/hooks/mnemosyne/config.js.map +0 -1
  364. package/dist/hooks/mnemosyne/constants.d.ts +0 -24
  365. package/dist/hooks/mnemosyne/constants.d.ts.map +0 -1
  366. package/dist/hooks/mnemosyne/constants.js +0 -26
  367. package/dist/hooks/mnemosyne/constants.js.map +0 -1
  368. package/dist/hooks/mnemosyne/detection-hook.d.ts +0 -39
  369. package/dist/hooks/mnemosyne/detection-hook.d.ts.map +0 -1
  370. package/dist/hooks/mnemosyne/detection-hook.js +0 -83
  371. package/dist/hooks/mnemosyne/detection-hook.js.map +0 -1
  372. package/dist/hooks/mnemosyne/detector.d.ts +0 -30
  373. package/dist/hooks/mnemosyne/detector.d.ts.map +0 -1
  374. package/dist/hooks/mnemosyne/detector.js +0 -150
  375. package/dist/hooks/mnemosyne/detector.js.map +0 -1
  376. package/dist/hooks/mnemosyne/finder.d.ts +0 -21
  377. package/dist/hooks/mnemosyne/finder.d.ts.map +0 -1
  378. package/dist/hooks/mnemosyne/finder.js +0 -117
  379. package/dist/hooks/mnemosyne/finder.js.map +0 -1
  380. package/dist/hooks/mnemosyne/index.d.ts +0 -62
  381. package/dist/hooks/mnemosyne/index.d.ts.map +0 -1
  382. package/dist/hooks/mnemosyne/index.js +0 -137
  383. package/dist/hooks/mnemosyne/index.js.map +0 -1
  384. package/dist/hooks/mnemosyne/loader.d.ts +0 -20
  385. package/dist/hooks/mnemosyne/loader.d.ts.map +0 -1
  386. package/dist/hooks/mnemosyne/loader.js +0 -113
  387. package/dist/hooks/mnemosyne/loader.js.map +0 -1
  388. package/dist/hooks/mnemosyne/parser.d.ts +0 -21
  389. package/dist/hooks/mnemosyne/parser.d.ts.map +0 -1
  390. package/dist/hooks/mnemosyne/parser.js +0 -190
  391. package/dist/hooks/mnemosyne/parser.js.map +0 -1
  392. package/dist/hooks/mnemosyne/promotion.d.ts +0 -29
  393. package/dist/hooks/mnemosyne/promotion.d.ts.map +0 -1
  394. package/dist/hooks/mnemosyne/promotion.js +0 -87
  395. package/dist/hooks/mnemosyne/promotion.js.map +0 -1
  396. package/dist/hooks/mnemosyne/types.d.ts +0 -109
  397. package/dist/hooks/mnemosyne/types.d.ts.map +0 -1
  398. package/dist/hooks/mnemosyne/types.js +0 -8
  399. package/dist/hooks/mnemosyne/types.js.map +0 -1
  400. package/dist/hooks/mnemosyne/validator.d.ts +0 -15
  401. package/dist/hooks/mnemosyne/validator.d.ts.map +0 -1
  402. package/dist/hooks/mnemosyne/validator.js +0 -87
  403. package/dist/hooks/mnemosyne/validator.js.map +0 -1
  404. package/dist/hooks/mnemosyne/writer.d.ts +0 -27
  405. package/dist/hooks/mnemosyne/writer.d.ts.map +0 -1
  406. package/dist/hooks/mnemosyne/writer.js +0 -126
  407. package/dist/hooks/mnemosyne/writer.js.map +0 -1
  408. package/dist/hooks/ralph-loop/index.d.ts +0 -116
  409. package/dist/hooks/ralph-loop/index.d.ts.map +0 -1
  410. package/dist/hooks/ralph-loop/index.js +0 -322
  411. package/dist/hooks/ralph-loop/index.js.map +0 -1
  412. package/dist/hooks/ralph-prd/index.d.ts +0 -130
  413. package/dist/hooks/ralph-prd/index.d.ts.map +0 -1
  414. package/dist/hooks/ralph-prd/index.js +0 -310
  415. package/dist/hooks/ralph-prd/index.js.map +0 -1
  416. package/dist/hooks/ralph-progress/index.d.ts +0 -102
  417. package/dist/hooks/ralph-progress/index.d.ts.map +0 -1
  418. package/dist/hooks/ralph-progress/index.js +0 -408
  419. package/dist/hooks/ralph-progress/index.js.map +0 -1
  420. package/dist/hooks/ralph-verifier/index.d.ts +0 -72
  421. package/dist/hooks/ralph-verifier/index.d.ts.map +0 -1
  422. package/dist/hooks/ralph-verifier/index.js +0 -223
  423. package/dist/hooks/ralph-verifier/index.js.map +0 -1
  424. package/dist/hooks/session-recovery/constants.d.ts +0 -56
  425. package/dist/hooks/session-recovery/constants.d.ts.map +0 -1
  426. package/dist/hooks/session-recovery/constants.js +0 -78
  427. package/dist/hooks/session-recovery/constants.js.map +0 -1
  428. package/dist/hooks/session-recovery/index.d.ts +0 -53
  429. package/dist/hooks/session-recovery/index.d.ts.map +0 -1
  430. package/dist/hooks/session-recovery/index.js +0 -321
  431. package/dist/hooks/session-recovery/index.js.map +0 -1
  432. package/dist/hooks/session-recovery/storage.d.ts +0 -76
  433. package/dist/hooks/session-recovery/storage.d.ts.map +0 -1
  434. package/dist/hooks/session-recovery/storage.js +0 -383
  435. package/dist/hooks/session-recovery/storage.js.map +0 -1
  436. package/dist/hooks/session-recovery/types.d.ts +0 -145
  437. package/dist/hooks/session-recovery/types.d.ts.map +0 -1
  438. package/dist/hooks/session-recovery/types.js +0 -8
  439. package/dist/hooks/session-recovery/types.js.map +0 -1
  440. package/dist/hooks/sisyphus-orchestrator/constants.d.ts +0 -23
  441. package/dist/hooks/sisyphus-orchestrator/constants.d.ts.map +0 -1
  442. package/dist/hooks/sisyphus-orchestrator/constants.js +0 -142
  443. package/dist/hooks/sisyphus-orchestrator/constants.js.map +0 -1
  444. package/dist/hooks/sisyphus-orchestrator/index.d.ts +0 -113
  445. package/dist/hooks/sisyphus-orchestrator/index.d.ts.map +0 -1
  446. package/dist/hooks/sisyphus-orchestrator/index.js +0 -309
  447. package/dist/hooks/sisyphus-orchestrator/index.js.map +0 -1
  448. package/dist/hooks/ultraqa-loop/index.d.ts +0 -94
  449. package/dist/hooks/ultraqa-loop/index.d.ts.map +0 -1
  450. package/dist/hooks/ultraqa-loop/index.js +0 -216
  451. package/dist/hooks/ultraqa-loop/index.js.map +0 -1
  452. package/dist/hooks/ultrawork-state/index.d.ts +0 -62
  453. package/dist/hooks/ultrawork-state/index.d.ts.map +0 -1
  454. package/dist/hooks/ultrawork-state/index.js +0 -208
  455. package/dist/hooks/ultrawork-state/index.js.map +0 -1
  456. package/dist/hud/sisyphus-state.d.ts +0 -31
  457. package/dist/hud/sisyphus-state.d.ts.map +0 -1
  458. package/dist/hud/sisyphus-state.js +0 -163
  459. package/dist/hud/sisyphus-state.js.map +0 -1
  460. package/dist/mcp/standalone-server.cjs +0 -19135
@@ -28,7 +28,7 @@ You can include these words naturally in your request for explicit control:
28
28
  | **ulw** | Max parallelism | "ulw refactor the API" |
29
29
  | **plan** | Planning interview | "plan the new endpoints" |
30
30
 
31
- **Combine them:** "ralph ulw: migrate the database"
31
+ **ralph includes ultrawork:** When you activate ralph mode, it automatically includes ultrawork's parallel execution. No need to combine keywords.
32
32
 
33
33
  ## Stopping Things
34
34
 
@@ -511,7 +511,7 @@ Just include these words naturally in your request:
511
511
  | eco | Token-efficient mode | "eco refactor the API" |
512
512
  | plan | Planning interview | "plan the new endpoints" |
513
513
 
514
- Combine them: "ralph ulw: migrate the database"
514
+ **ralph includes ultrawork:** When you activate ralph mode, it automatically includes ultrawork's parallel execution. No need to combine keywords.
515
515
 
516
516
  MCP SERVERS:
517
517
  Run /oh-my-claudecode:mcp-setup to add tools like web search, GitHub, etc.
@@ -314,15 +314,16 @@ async function main() {
314
314
  }
315
315
  }
316
316
 
317
- // Priority 7: Ultrawork with incomplete todos/tasks
318
- if (ultrawork.state?.active && totalIncomplete > 0) {
317
+ // Priority 7: Ultrawork - ALWAYS continue while active (not just when tasks exist)
318
+ // This prevents false stops from bash errors, transient failures, etc.
319
+ if (ultrawork.state?.active) {
319
320
  const newCount = (ultrawork.state.reinforcement_count || 0) + 1;
320
- const maxReinforcements = ultrawork.state.max_reinforcements || 15;
321
+ const maxReinforcements = ultrawork.state.max_reinforcements || 50;
321
322
 
322
323
  if (newCount > maxReinforcements) {
323
324
  console.log(JSON.stringify({
324
325
  continue: true,
325
- reason: `[ULTRAWORK ESCAPE] Max reinforcements reached. Allowing stop.`
326
+ reason: `[ULTRAWORK ESCAPE] Max reinforcements (${maxReinforcements}) reached. Allowing stop.`
326
327
  }));
327
328
  return;
328
329
  }
@@ -331,23 +332,31 @@ async function main() {
331
332
  ultrawork.state.last_checked_at = new Date().toISOString();
332
333
  writeJsonFile(ultrawork.path, ultrawork.state);
333
334
 
334
- const itemType = taskCount > 0 ? 'Tasks' : 'todos';
335
+ let reason = `[ULTRAWORK #${newCount}] Mode active - continue working.`;
336
+ if (totalIncomplete > 0) {
337
+ const itemType = taskCount > 0 ? 'Tasks' : 'todos';
338
+ reason = `[ULTRAWORK #${newCount}] ${totalIncomplete} incomplete ${itemType}. Continue working.`;
339
+ }
340
+ if (ultrawork.state.original_prompt) {
341
+ reason += `\nTask: ${ultrawork.state.original_prompt}`;
342
+ }
343
+
335
344
  console.log(JSON.stringify({
336
345
  continue: false,
337
- reason: `[ULTRAWORK #${newCount}] ${totalIncomplete} incomplete ${itemType}. Continue working.\n${ultrawork.state.original_prompt ? `Task: ${ultrawork.state.original_prompt}` : ''}`
346
+ reason
338
347
  }));
339
348
  return;
340
349
  }
341
350
 
342
- // Priority 8: Ecomode with incomplete todos/tasks
343
- if (ecomode.state?.active && totalIncomplete > 0) {
351
+ // Priority 8: Ecomode - ALWAYS continue while active
352
+ if (ecomode.state?.active) {
344
353
  const newCount = (ecomode.state.reinforcement_count || 0) + 1;
345
- const maxReinforcements = ecomode.state.max_reinforcements || 15;
354
+ const maxReinforcements = ecomode.state.max_reinforcements || 50;
346
355
 
347
356
  if (newCount > maxReinforcements) {
348
357
  console.log(JSON.stringify({
349
358
  continue: true,
350
- reason: `[ECOMODE ESCAPE] Max reinforcements reached. Allowing stop.`
359
+ reason: `[ECOMODE ESCAPE] Max reinforcements (${maxReinforcements}) reached. Allowing stop.`
351
360
  }));
352
361
  return;
353
362
  }
@@ -355,10 +364,15 @@ async function main() {
355
364
  ecomode.state.reinforcement_count = newCount;
356
365
  writeJsonFile(ecomode.path, ecomode.state);
357
366
 
358
- const itemType = taskCount > 0 ? 'Tasks' : 'todos';
367
+ let reason = `[ECOMODE #${newCount}] Mode active - continue working.`;
368
+ if (totalIncomplete > 0) {
369
+ const itemType = taskCount > 0 ? 'Tasks' : 'todos';
370
+ reason = `[ECOMODE #${newCount}] ${totalIncomplete} incomplete ${itemType}. Continue working.`;
371
+ }
372
+
359
373
  console.log(JSON.stringify({
360
374
  continue: false,
361
- reason: `[ECOMODE #${newCount}] ${totalIncomplete} incomplete ${itemType}. Continue working.`
375
+ reason
362
376
  }));
363
377
  return;
364
378
  }
@@ -58,6 +58,30 @@ async function readStdin() {
58
58
  return Buffer.concat(chunks).toString('utf-8');
59
59
  }
60
60
 
61
+ /**
62
+ * Detect if stop was triggered by context-limit related reasons.
63
+ * See: https://github.com/Yeachan-Heo/oh-my-claudecode/issues/213
64
+ */
65
+ function isContextLimitStop(data) {
66
+ const reason = (data.stop_reason || data.stopReason || '').toLowerCase();
67
+ const endTurnReason = (data.end_turn_reason || data.endTurnReason || '').toLowerCase();
68
+ const contextPatterns = [
69
+ 'context_limit', 'context_window', 'context_exceeded', 'context_full',
70
+ 'max_context', 'token_limit', 'max_tokens', 'conversation_too_long', 'input_too_long',
71
+ ];
72
+ return contextPatterns.some(p => reason.includes(p) || endTurnReason.includes(p));
73
+ }
74
+
75
+ function isUserAbort(data) {
76
+ if (data.user_requested || data.userRequested) return true;
77
+ const reason = (data.stop_reason || data.stopReason || '').toLowerCase();
78
+ const abortPatterns = [
79
+ 'user_cancel', 'user_interrupt', 'ctrl_c', 'manual_stop',
80
+ 'aborted', 'abort', 'cancel', 'interrupt',
81
+ ];
82
+ return abortPatterns.some(p => reason.includes(p));
83
+ }
84
+
61
85
  // Main
62
86
  async function main() {
63
87
  try {
@@ -70,6 +94,12 @@ async function main() {
70
94
  data = JSON.parse(input);
71
95
  } catch { /* invalid JSON - continue with empty data */ }
72
96
 
97
+ // Never block context-limit or user-abort stops
98
+ if (isContextLimitStop(data) || isUserAbort(data)) {
99
+ console.log(JSON.stringify({ continue: true }));
100
+ return;
101
+ }
102
+
73
103
  const sessionId = data.sessionId || data.session_id || '';
74
104
 
75
105
  // Count incomplete Task system tasks
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=analytics-summary.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"analytics-summary.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/analytics/analytics-summary.test.ts"],"names":[],"mappings":""}
@@ -1,267 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
- import * as fs from 'fs/promises';
3
- import * as path from 'path';
4
- import { getSummaryPath, createEmptySummary, loadAnalyticsFast, rebuildAnalyticsSummary } from '../../analytics/analytics-summary.js';
5
- describe('AnalyticsSummary', () => {
6
- const testSessionId = 'test-session-1';
7
- const testDir = path.resolve(process.cwd(), '.omc/state');
8
- beforeEach(async () => {
9
- // Clean up test files before each test
10
- try {
11
- const summaryPath = path.resolve(process.cwd(), getSummaryPath(testSessionId));
12
- await fs.unlink(summaryPath);
13
- }
14
- catch {
15
- // File doesn't exist, that's fine
16
- }
17
- });
18
- afterEach(async () => {
19
- // Clean up test files after each test
20
- try {
21
- const summaryPath = path.resolve(process.cwd(), getSummaryPath(testSessionId));
22
- await fs.unlink(summaryPath);
23
- }
24
- catch {
25
- // File doesn't exist, that's fine
26
- }
27
- });
28
- describe('getSummaryPath', () => {
29
- it('should return correct path for session ID', () => {
30
- const path = getSummaryPath('test-session-123');
31
- expect(path).toBe('.omc/state/analytics-summary-test-session-123.json');
32
- });
33
- it('should handle different session IDs', () => {
34
- const path1 = getSummaryPath('session-1');
35
- const path2 = getSummaryPath('session-2');
36
- expect(path1).not.toBe(path2);
37
- });
38
- });
39
- describe('createEmptySummary', () => {
40
- it('should create empty summary with correct structure', () => {
41
- const summary = createEmptySummary(testSessionId);
42
- expect(summary.sessionId).toBe(testSessionId);
43
- expect(summary.lastUpdated).toBeDefined();
44
- expect(summary.lastLogOffset).toBe(0);
45
- expect(summary.totals).toEqual({
46
- inputTokens: 0,
47
- outputTokens: 0,
48
- cacheCreationTokens: 0,
49
- cacheReadTokens: 0,
50
- estimatedCost: 0
51
- });
52
- expect(summary.topAgents).toEqual([]);
53
- expect(summary.cacheHitRate).toBe(0);
54
- });
55
- it('should set valid ISO timestamp', () => {
56
- const summary = createEmptySummary(testSessionId);
57
- const timestamp = new Date(summary.lastUpdated);
58
- expect(timestamp).toBeInstanceOf(Date);
59
- expect(timestamp.getTime()).toBeGreaterThan(0);
60
- });
61
- });
62
- describe('loadAnalyticsFast', () => {
63
- it('should return null when no summary exists', async () => {
64
- const summary = await loadAnalyticsFast(testSessionId);
65
- expect(summary).toBeNull();
66
- });
67
- it('should load existing summary from cache', async () => {
68
- // Create a summary file
69
- const summaryPath = path.resolve(process.cwd(), getSummaryPath(testSessionId));
70
- const testSummary = {
71
- sessionId: testSessionId,
72
- lastUpdated: new Date().toISOString(),
73
- lastLogOffset: 5,
74
- totals: {
75
- inputTokens: 1000,
76
- outputTokens: 400,
77
- cacheCreationTokens: 500,
78
- cacheReadTokens: 2000,
79
- estimatedCost: 0.05
80
- },
81
- topAgents: [
82
- { agent: 'executor', cost: 0.03, tokens: 500 }
83
- ],
84
- cacheHitRate: 75.5
85
- };
86
- await fs.mkdir(path.dirname(summaryPath), { recursive: true });
87
- await fs.writeFile(summaryPath, JSON.stringify(testSummary, null, 2));
88
- const loaded = await loadAnalyticsFast(testSessionId);
89
- expect(loaded).toEqual(testSummary);
90
- });
91
- it('should handle corrupted summary file gracefully', async () => {
92
- const summaryPath = path.resolve(process.cwd(), getSummaryPath(testSessionId));
93
- await fs.mkdir(path.dirname(summaryPath), { recursive: true });
94
- await fs.writeFile(summaryPath, 'invalid json {');
95
- const result = await loadAnalyticsFast(testSessionId);
96
- // Should return null on parse error
97
- expect(result).toBeNull();
98
- });
99
- });
100
- describe('rebuildAnalyticsSummary', () => {
101
- it('should create summary for session with JSONL data', async () => {
102
- // Create test JSONL file with sample data
103
- const logPath = path.resolve(process.cwd(), '.omc/state/token-tracking.jsonl');
104
- const testRecords = [
105
- {
106
- timestamp: new Date().toISOString(),
107
- sessionId: testSessionId,
108
- modelName: 'claude-sonnet-4-5-20250929',
109
- inputTokens: 100,
110
- outputTokens: 40,
111
- cacheCreationTokens: 50,
112
- cacheReadTokens: 200,
113
- agentName: 'executor'
114
- },
115
- {
116
- timestamp: new Date().toISOString(),
117
- sessionId: testSessionId,
118
- modelName: 'claude-haiku-4-5-20251001',
119
- inputTokens: 200,
120
- outputTokens: 60,
121
- cacheCreationTokens: 100,
122
- cacheReadTokens: 400,
123
- agentName: 'architect'
124
- }
125
- ];
126
- await fs.mkdir(path.dirname(logPath), { recursive: true });
127
- const jsonl = testRecords.map(r => JSON.stringify(r)).join('\n');
128
- await fs.writeFile(logPath, jsonl);
129
- try {
130
- const summary = await rebuildAnalyticsSummary(testSessionId);
131
- expect(summary.sessionId).toBe(testSessionId);
132
- expect(summary.totals.inputTokens).toBe(300); // 100 + 200
133
- expect(summary.totals.outputTokens).toBe(100); // 40 + 60
134
- expect(summary.totals.cacheCreationTokens).toBe(150); // 50 + 100
135
- expect(summary.totals.cacheReadTokens).toBe(600); // 200 + 400
136
- expect(summary.topAgents.length).toBeGreaterThan(0);
137
- }
138
- finally {
139
- await fs.unlink(logPath).catch(() => { });
140
- }
141
- });
142
- it('should filter by session ID', async () => {
143
- // Create test JSONL with multiple sessions
144
- const logPath = path.resolve(process.cwd(), '.omc/state/token-tracking.jsonl');
145
- const records = [
146
- {
147
- timestamp: new Date().toISOString(),
148
- sessionId: testSessionId,
149
- modelName: 'claude-sonnet-4-5-20250929',
150
- inputTokens: 100,
151
- outputTokens: 40,
152
- cacheCreationTokens: 0,
153
- cacheReadTokens: 0
154
- },
155
- {
156
- timestamp: new Date().toISOString(),
157
- sessionId: 'other-session',
158
- modelName: 'claude-sonnet-4-5-20250929',
159
- inputTokens: 1000,
160
- outputTokens: 400,
161
- cacheCreationTokens: 0,
162
- cacheReadTokens: 0
163
- }
164
- ];
165
- await fs.mkdir(path.dirname(logPath), { recursive: true });
166
- const jsonl = records.map(r => JSON.stringify(r)).join('\n');
167
- await fs.writeFile(logPath, jsonl);
168
- try {
169
- const summary = await rebuildAnalyticsSummary(testSessionId);
170
- // Should only include test-session-1 data
171
- expect(summary.totals.inputTokens).toBe(100);
172
- expect(summary.totals.outputTokens).toBe(40);
173
- }
174
- finally {
175
- await fs.unlink(logPath).catch(() => { });
176
- }
177
- });
178
- it('should calculate cache hit rate correctly', async () => {
179
- const logPath = path.resolve(process.cwd(), '.omc/state/token-tracking.jsonl');
180
- const record = {
181
- timestamp: new Date().toISOString(),
182
- sessionId: testSessionId,
183
- modelName: 'claude-sonnet-4-5-20250929',
184
- inputTokens: 100,
185
- outputTokens: 40,
186
- cacheCreationTokens: 100,
187
- cacheReadTokens: 100
188
- };
189
- await fs.mkdir(path.dirname(logPath), { recursive: true });
190
- await fs.writeFile(logPath, JSON.stringify(record) + '\n');
191
- try {
192
- const summary = await rebuildAnalyticsSummary(testSessionId);
193
- // Cache hit rate = cacheReadTokens / (inputTokens + cacheCreationTokens) * 100
194
- // = 100 / (100 + 100) * 100 = 50%
195
- expect(summary.cacheHitRate).toBe(50);
196
- }
197
- finally {
198
- await fs.unlink(logPath).catch(() => { });
199
- }
200
- });
201
- it('should accumulate agent costs into topAgents', async () => {
202
- const logPath = path.resolve(process.cwd(), '.omc/state/token-tracking.jsonl');
203
- const records = [
204
- {
205
- timestamp: new Date().toISOString(),
206
- sessionId: testSessionId,
207
- modelName: 'claude-sonnet-4-5-20250929',
208
- inputTokens: 100,
209
- outputTokens: 40,
210
- cacheCreationTokens: 0,
211
- cacheReadTokens: 0,
212
- agentName: 'executor'
213
- },
214
- {
215
- timestamp: new Date().toISOString(),
216
- sessionId: testSessionId,
217
- modelName: 'claude-sonnet-4-5-20250929',
218
- inputTokens: 50,
219
- outputTokens: 20,
220
- cacheCreationTokens: 0,
221
- cacheReadTokens: 0,
222
- agentName: 'executor'
223
- }
224
- ];
225
- await fs.mkdir(path.dirname(logPath), { recursive: true });
226
- const jsonl = records.map(r => JSON.stringify(r)).join('\n');
227
- await fs.writeFile(logPath, jsonl);
228
- try {
229
- const summary = await rebuildAnalyticsSummary(testSessionId);
230
- // Should have executor in topAgents
231
- const executor = summary.topAgents.find(a => a.agent === 'executor');
232
- expect(executor).toBeDefined();
233
- expect(executor?.tokens).toBe(210); // (100 + 40) + (50 + 20)
234
- }
235
- finally {
236
- await fs.unlink(logPath).catch(() => { });
237
- }
238
- });
239
- it('should save summary to disk', async () => {
240
- const logPath = path.resolve(process.cwd(), '.omc/state/token-tracking.jsonl');
241
- const summaryPath = path.resolve(process.cwd(), getSummaryPath(testSessionId));
242
- const record = {
243
- timestamp: new Date().toISOString(),
244
- sessionId: testSessionId,
245
- modelName: 'claude-sonnet-4-5-20250929',
246
- inputTokens: 100,
247
- outputTokens: 40,
248
- cacheCreationTokens: 0,
249
- cacheReadTokens: 0
250
- };
251
- await fs.mkdir(path.dirname(logPath), { recursive: true });
252
- await fs.writeFile(logPath, JSON.stringify(record) + '\n');
253
- try {
254
- await rebuildAnalyticsSummary(testSessionId);
255
- // Summary should be saved
256
- const saved = await fs.readFile(summaryPath, 'utf-8');
257
- const parsed = JSON.parse(saved);
258
- expect(parsed.sessionId).toBe(testSessionId);
259
- expect(parsed.totals.inputTokens).toBe(100);
260
- }
261
- finally {
262
- await fs.unlink(logPath).catch(() => { });
263
- }
264
- });
265
- });
266
- });
267
- //# sourceMappingURL=analytics-summary.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"analytics-summary.test.js","sourceRoot":"","sources":["../../../src/__tests__/analytics/analytics-summary.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=cost-estimator.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cost-estimator.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/analytics/cost-estimator.test.ts"],"names":[],"mappings":""}
@@ -1,212 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { calculateCost, formatCost, getCostColor, estimateDailyCost, estimateMonthlyCost } from '../../analytics/cost-estimator.js';
3
- describe('CostEstimator', () => {
4
- describe('calculateCost', () => {
5
- it('should calculate cost for Sonnet model', () => {
6
- const input = {
7
- modelName: 'claude-sonnet-4-5-20250929',
8
- inputTokens: 1_000_000,
9
- outputTokens: 1_000_000,
10
- cacheCreationTokens: 0,
11
- cacheReadTokens: 0
12
- };
13
- const cost = calculateCost(input);
14
- // Sonnet: input $3/M, output $15/M
15
- expect(cost.inputCost).toBe(3.0); // 1M * $3/M
16
- expect(cost.outputCost).toBe(15.0); // 1M * $15/M
17
- expect(cost.totalCost).toBe(18.0);
18
- });
19
- it('should calculate cost for Haiku model', () => {
20
- const input = {
21
- modelName: 'claude-haiku-4-5-20251001',
22
- inputTokens: 1_000_000,
23
- outputTokens: 1_000_000,
24
- cacheCreationTokens: 0,
25
- cacheReadTokens: 0
26
- };
27
- const cost = calculateCost(input);
28
- // Haiku: input $0.80/M, output $4.00/M
29
- expect(cost.inputCost).toBe(0.80);
30
- expect(cost.outputCost).toBe(4.0);
31
- expect(cost.totalCost).toBe(4.80);
32
- });
33
- it('should calculate cost for Opus model', () => {
34
- const input = {
35
- modelName: 'claude-opus-4-5-20251101',
36
- inputTokens: 1_000_000,
37
- outputTokens: 1_000_000,
38
- cacheCreationTokens: 0,
39
- cacheReadTokens: 0
40
- };
41
- const cost = calculateCost(input);
42
- // Opus: input $15/M, output $75/M
43
- expect(cost.inputCost).toBe(15.0);
44
- expect(cost.outputCost).toBe(75.0);
45
- expect(cost.totalCost).toBe(90.0);
46
- });
47
- it('should apply cache write markup (25%)', () => {
48
- const input = {
49
- modelName: 'claude-sonnet-4-5-20250929',
50
- inputTokens: 0,
51
- outputTokens: 0,
52
- cacheCreationTokens: 1_000_000,
53
- cacheReadTokens: 0
54
- };
55
- const cost = calculateCost(input);
56
- // Sonnet input: $3/M, cache write markup 25%
57
- // Cost = 1M * $3/M * (1 + 0.25) = $3.75
58
- expect(cost.cacheWriteCost).toBe(3.75);
59
- expect(cost.totalCost).toBe(3.75);
60
- });
61
- it('should apply cache read discount (90%)', () => {
62
- const input = {
63
- modelName: 'claude-sonnet-4-5-20250929',
64
- inputTokens: 0,
65
- outputTokens: 0,
66
- cacheCreationTokens: 0,
67
- cacheReadTokens: 1_000_000
68
- };
69
- const cost = calculateCost(input);
70
- // Sonnet input: $3/M, cache read discount 90%
71
- // Cost = 1M * $3/M * (1 - 0.90) = $0.30
72
- expect(cost.cacheReadCost).toBe(0.30);
73
- expect(cost.totalCost).toBe(0.30);
74
- });
75
- it('should sum all cost components', () => {
76
- const input = {
77
- modelName: 'claude-sonnet-4-5-20250929',
78
- inputTokens: 1_000_000,
79
- outputTokens: 1_000_000,
80
- cacheCreationTokens: 1_000_000,
81
- cacheReadTokens: 1_000_000
82
- };
83
- const cost = calculateCost(input);
84
- // Input: $3
85
- // Output: $15
86
- // Cache write: 1M * $3 * 1.25 = $3.75
87
- // Cache read: 1M * $3 * 0.10 = $0.30
88
- // Total: $3 + $15 + $3.75 + $0.30 = $22.05
89
- expect(cost.totalCost).toBeCloseTo(22.05, 2);
90
- });
91
- it('should handle partial token counts', () => {
92
- const input = {
93
- modelName: 'claude-sonnet-4-5-20250929',
94
- inputTokens: 100,
95
- outputTokens: 50,
96
- cacheCreationTokens: 0,
97
- cacheReadTokens: 0
98
- };
99
- const cost = calculateCost(input);
100
- // Input: 100/1M * $3 = $0.0003
101
- // Output: 50/1M * $15 = $0.00075
102
- const expected = (100 / 1_000_000) * 3 + (50 / 1_000_000) * 15;
103
- expect(cost.totalCost).toBeCloseTo(expected, 6);
104
- });
105
- it('should handle model name variations', () => {
106
- const inputs = [
107
- { modelName: 'claude-sonnet-4.5', inputTokens: 1_000_000, outputTokens: 0, cacheCreationTokens: 0, cacheReadTokens: 0 },
108
- { modelName: 'Claude-Sonnet-4.5', inputTokens: 1_000_000, outputTokens: 0, cacheCreationTokens: 0, cacheReadTokens: 0 },
109
- { modelName: 'claude-sonnet-4-5-20250929', inputTokens: 1_000_000, outputTokens: 0, cacheCreationTokens: 0, cacheReadTokens: 0 }
110
- ];
111
- const costs = inputs.map(calculateCost);
112
- // All should recognize as Sonnet
113
- costs.forEach(cost => {
114
- expect(cost.inputCost).toBe(3.0);
115
- });
116
- });
117
- it('should default to Sonnet for unknown models', () => {
118
- const input = {
119
- modelName: 'claude-unknown-future-model',
120
- inputTokens: 1_000_000,
121
- outputTokens: 0,
122
- cacheCreationTokens: 0,
123
- cacheReadTokens: 0
124
- };
125
- const cost = calculateCost(input);
126
- // Should use Sonnet pricing
127
- expect(cost.inputCost).toBe(3.0);
128
- });
129
- it('should handle zero tokens', () => {
130
- const input = {
131
- modelName: 'claude-sonnet-4-5-20250929',
132
- inputTokens: 0,
133
- outputTokens: 0,
134
- cacheCreationTokens: 0,
135
- cacheReadTokens: 0
136
- };
137
- const cost = calculateCost(input);
138
- expect(cost.totalCost).toBe(0);
139
- });
140
- });
141
- describe('formatCost', () => {
142
- it('should format costs under $0.01 in cents', () => {
143
- expect(formatCost(0.005)).toBe('$0.5000¢');
144
- expect(formatCost(0.0001)).toBe('$0.0100¢');
145
- });
146
- it('should format costs over $0.01 in dollars', () => {
147
- expect(formatCost(1.0)).toBe('$1.0000');
148
- expect(formatCost(0.5432)).toBe('$0.5432');
149
- });
150
- it('should handle zero', () => {
151
- expect(formatCost(0)).toBe('$0.0000¢');
152
- });
153
- it('should round to 4 decimal places', () => {
154
- expect(formatCost(1.23456)).toBe('$1.2346');
155
- expect(formatCost(0.005678)).toBe('$0.5678¢');
156
- });
157
- });
158
- describe('getCostColor', () => {
159
- it('should return green for low costs', () => {
160
- expect(getCostColor(0.50)).toBe('green');
161
- expect(getCostColor(0.99)).toBe('green');
162
- });
163
- it('should return yellow for medium costs', () => {
164
- expect(getCostColor(1.0)).toBe('yellow');
165
- expect(getCostColor(2.5)).toBe('yellow');
166
- expect(getCostColor(4.99)).toBe('yellow');
167
- });
168
- it('should return red for high costs', () => {
169
- expect(getCostColor(5.0)).toBe('red');
170
- expect(getCostColor(10.0)).toBe('red');
171
- });
172
- it('should handle boundary values', () => {
173
- expect(getCostColor(1.0)).toBe('yellow');
174
- expect(getCostColor(5.0)).toBe('red');
175
- });
176
- });
177
- describe('estimateDailyCost', () => {
178
- it('should estimate daily cost for Sonnet', () => {
179
- const dailyCost = estimateDailyCost(1000, 'claude-sonnet-4-5-20250929');
180
- // 1000 tokens/hour * 24 hours = 24000 tokens/day
181
- // 24000 * $3/M = $0.072
182
- expect(dailyCost).toBeCloseTo(0.072, 4);
183
- });
184
- it('should estimate daily cost for Haiku', () => {
185
- const dailyCost = estimateDailyCost(1000, 'claude-haiku-4-5-20251001');
186
- // 1000 tokens/hour * 24 hours = 24000 tokens/day
187
- // 24000 * $0.80/M = $0.0192
188
- expect(dailyCost).toBeCloseTo(0.0192, 4);
189
- });
190
- it('should scale with token rate', () => {
191
- const daily1000 = estimateDailyCost(1000, 'claude-sonnet-4-5-20250929');
192
- const daily2000 = estimateDailyCost(2000, 'claude-sonnet-4-5-20250929');
193
- expect(daily2000).toBeCloseTo(daily1000 * 2, 4);
194
- });
195
- });
196
- describe('estimateMonthlyCost', () => {
197
- it('should estimate monthly cost as 30x daily', () => {
198
- const dailyCost = estimateDailyCost(1000, 'claude-sonnet-4-5-20250929');
199
- const monthlyCost = estimateMonthlyCost(1000, 'claude-sonnet-4-5-20250929');
200
- expect(monthlyCost).toBeCloseTo(dailyCost * 30, 4);
201
- });
202
- it('should handle different models', () => {
203
- const monthlyHaiku = estimateMonthlyCost(1000, 'claude-haiku-4-5-20251001');
204
- const monthlySonnet = estimateMonthlyCost(1000, 'claude-sonnet-4-5-20250929');
205
- const monthlyOpus = estimateMonthlyCost(1000, 'claude-opus-4-5-20251101');
206
- // Haiku should be cheapest
207
- expect(monthlyHaiku).toBeLessThan(monthlySonnet);
208
- expect(monthlySonnet).toBeLessThan(monthlyOpus);
209
- });
210
- });
211
- });
212
- //# sourceMappingURL=cost-estimator.test.js.map