oh-my-claude-sisyphus 3.7.0 → 3.7.3

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 (381) hide show
  1. package/README.md +24 -1
  2. package/commands/hud.md +37 -5
  3. package/commands/omc-setup.md +105 -0
  4. package/dist/__tests__/compatibility-security.test.d.ts +13 -0
  5. package/dist/__tests__/compatibility-security.test.d.ts.map +1 -0
  6. package/dist/__tests__/compatibility-security.test.js +403 -0
  7. package/dist/__tests__/compatibility-security.test.js.map +1 -0
  8. package/dist/__tests__/compatibility.test.d.ts +7 -0
  9. package/dist/__tests__/compatibility.test.d.ts.map +1 -0
  10. package/dist/__tests__/compatibility.test.js +484 -0
  11. package/dist/__tests__/compatibility.test.js.map +1 -0
  12. package/dist/__tests__/hud/analytics-display.test.js +141 -1
  13. package/dist/__tests__/hud/analytics-display.test.js.map +1 -1
  14. package/dist/__tests__/hud-windows.test.d.ts +2 -0
  15. package/dist/__tests__/hud-windows.test.d.ts.map +1 -0
  16. package/dist/__tests__/hud-windows.test.js +91 -0
  17. package/dist/__tests__/hud-windows.test.js.map +1 -0
  18. package/dist/cli/analytics.js +0 -0
  19. package/dist/cli/index.js +0 -0
  20. package/dist/compatibility/discovery.d.ts +58 -0
  21. package/dist/compatibility/discovery.d.ts.map +1 -0
  22. package/dist/compatibility/discovery.js +619 -0
  23. package/dist/compatibility/discovery.js.map +1 -0
  24. package/dist/compatibility/index.d.ts +51 -0
  25. package/dist/compatibility/index.d.ts.map +1 -0
  26. package/dist/compatibility/index.js +72 -0
  27. package/dist/compatibility/index.js.map +1 -0
  28. package/dist/compatibility/mcp-bridge.d.ts +138 -0
  29. package/dist/compatibility/mcp-bridge.d.ts.map +1 -0
  30. package/dist/compatibility/mcp-bridge.js +524 -0
  31. package/dist/compatibility/mcp-bridge.js.map +1 -0
  32. package/dist/compatibility/permission-adapter.d.ts +79 -0
  33. package/dist/compatibility/permission-adapter.d.ts.map +1 -0
  34. package/dist/compatibility/permission-adapter.js +369 -0
  35. package/dist/compatibility/permission-adapter.js.map +1 -0
  36. package/dist/compatibility/registry.d.ts +161 -0
  37. package/dist/compatibility/registry.d.ts.map +1 -0
  38. package/dist/compatibility/registry.js +389 -0
  39. package/dist/compatibility/registry.js.map +1 -0
  40. package/dist/compatibility/types.d.ts +249 -0
  41. package/dist/compatibility/types.d.ts.map +1 -0
  42. package/dist/compatibility/types.js +8 -0
  43. package/dist/compatibility/types.js.map +1 -0
  44. package/dist/features/rate-limit-wait/daemon.d.ts.map +1 -1
  45. package/dist/features/rate-limit-wait/daemon.js +44 -1
  46. package/dist/features/rate-limit-wait/daemon.js.map +1 -1
  47. package/dist/features/state-manager/index.d.ts.map +1 -1
  48. package/dist/features/state-manager/index.js +4 -1
  49. package/dist/features/state-manager/index.js.map +1 -1
  50. package/dist/hooks/permission-handler/__tests__/index.test.js +47 -0
  51. package/dist/hooks/permission-handler/__tests__/index.test.js.map +1 -1
  52. package/dist/hooks/permission-handler/index.d.ts +1 -1
  53. package/dist/hooks/permission-handler/index.d.ts.map +1 -1
  54. package/dist/hooks/permission-handler/index.js +11 -15
  55. package/dist/hooks/permission-handler/index.js.map +1 -1
  56. package/dist/hooks/plugin-patterns/index.d.ts +5 -0
  57. package/dist/hooks/plugin-patterns/index.d.ts.map +1 -1
  58. package/dist/hooks/plugin-patterns/index.js +26 -1
  59. package/dist/hooks/plugin-patterns/index.js.map +1 -1
  60. package/dist/hooks/session-end/index.d.ts +0 -8
  61. package/dist/hooks/session-end/index.d.ts.map +1 -1
  62. package/dist/hooks/session-end/index.js +5 -12
  63. package/dist/hooks/session-end/index.js.map +1 -1
  64. package/dist/hooks/subagent-tracker/index.d.ts.map +1 -1
  65. package/dist/hooks/subagent-tracker/index.js +32 -17
  66. package/dist/hooks/subagent-tracker/index.js.map +1 -1
  67. package/dist/hud/analytics-display.d.ts +17 -1
  68. package/dist/hud/analytics-display.d.ts.map +1 -1
  69. package/dist/hud/analytics-display.js +55 -12
  70. package/dist/hud/analytics-display.js.map +1 -1
  71. package/dist/hud/render.d.ts.map +1 -1
  72. package/dist/hud/render.js +49 -18
  73. package/dist/hud/render.js.map +1 -1
  74. package/dist/hud/types.d.ts +2 -0
  75. package/dist/hud/types.d.ts.map +1 -1
  76. package/dist/hud/types.js +14 -0
  77. package/dist/hud/types.js.map +1 -1
  78. package/dist/installer/index.d.ts.map +1 -1
  79. package/dist/installer/index.js +3 -2
  80. package/dist/installer/index.js.map +1 -1
  81. package/docs/COMPATIBILITY.md +1051 -0
  82. package/hooks/keyword-detector.sh +4 -4
  83. package/hooks/persistent-mode.sh +10 -10
  84. package/hooks/session-start.sh +4 -4
  85. package/package.json +3 -1
  86. package/scripts/keyword-detector.mjs +4 -4
  87. package/scripts/persistent-mode.mjs +6 -6
  88. package/scripts/persistent-mode.sh +10 -10
  89. package/scripts/session-start.mjs +4 -4
  90. package/skills/hud/SKILL.md +37 -5
  91. package/skills/omc-setup/SKILL.md +162 -4
  92. package/skills/writer-memory/SKILL.md +443 -0
  93. package/skills/writer-memory/lib/character-tracker.ts +338 -0
  94. package/skills/writer-memory/lib/memory-manager.ts +804 -0
  95. package/skills/writer-memory/lib/relationship-graph.ts +400 -0
  96. package/skills/writer-memory/lib/scene-organizer.ts +544 -0
  97. package/skills/writer-memory/lib/synopsis-builder.ts +339 -0
  98. package/skills/writer-memory/templates/synopsis-template.md +46 -0
  99. package/templates/hooks/keyword-detector.sh +4 -4
  100. package/templates/hooks/persistent-mode.sh +10 -10
  101. package/templates/hooks/session-start.sh +4 -4
  102. package/dist/__tests__/analytics/analytics-summary.test.d.ts +0 -2
  103. package/dist/__tests__/analytics/analytics-summary.test.d.ts.map +0 -1
  104. package/dist/__tests__/analytics/analytics-summary.test.js +0 -267
  105. package/dist/__tests__/analytics/analytics-summary.test.js.map +0 -1
  106. package/dist/__tests__/analytics/cost-estimator.test.d.ts +0 -2
  107. package/dist/__tests__/analytics/cost-estimator.test.d.ts.map +0 -1
  108. package/dist/__tests__/analytics/cost-estimator.test.js +0 -212
  109. package/dist/__tests__/analytics/cost-estimator.test.js.map +0 -1
  110. package/dist/__tests__/hooks/auto-slash-command/executor.test.d.ts +0 -7
  111. package/dist/__tests__/hooks/auto-slash-command/executor.test.d.ts.map +0 -1
  112. package/dist/__tests__/hooks/auto-slash-command/executor.test.js +0 -374
  113. package/dist/__tests__/hooks/auto-slash-command/executor.test.js.map +0 -1
  114. package/dist/__tests__/hud/auto-tracking.integration.test.d.ts +0 -2
  115. package/dist/__tests__/hud/auto-tracking.integration.test.d.ts.map +0 -1
  116. package/dist/__tests__/hud/auto-tracking.integration.test.js +0 -12
  117. package/dist/__tests__/hud/auto-tracking.integration.test.js.map +0 -1
  118. package/dist/__tests__/learned-skills/config.test.d.ts +0 -2
  119. package/dist/__tests__/learned-skills/config.test.d.ts.map +0 -1
  120. package/dist/__tests__/learned-skills/config.test.js +0 -37
  121. package/dist/__tests__/learned-skills/config.test.js.map +0 -1
  122. package/dist/__tests__/learned-skills/detector.test.d.ts +0 -2
  123. package/dist/__tests__/learned-skills/detector.test.d.ts.map +0 -1
  124. package/dist/__tests__/learned-skills/detector.test.js +0 -99
  125. package/dist/__tests__/learned-skills/detector.test.js.map +0 -1
  126. package/dist/__tests__/learned-skills/finder.test.d.ts +0 -2
  127. package/dist/__tests__/learned-skills/finder.test.d.ts.map +0 -1
  128. package/dist/__tests__/learned-skills/finder.test.js +0 -59
  129. package/dist/__tests__/learned-skills/finder.test.js.map +0 -1
  130. package/dist/__tests__/learned-skills/loader.test.d.ts +0 -2
  131. package/dist/__tests__/learned-skills/loader.test.d.ts.map +0 -1
  132. package/dist/__tests__/learned-skills/loader.test.js +0 -69
  133. package/dist/__tests__/learned-skills/loader.test.js.map +0 -1
  134. package/dist/__tests__/learned-skills/parser.test.d.ts +0 -2
  135. package/dist/__tests__/learned-skills/parser.test.d.ts.map +0 -1
  136. package/dist/__tests__/learned-skills/parser.test.js +0 -81
  137. package/dist/__tests__/learned-skills/parser.test.js.map +0 -1
  138. package/dist/__tests__/learned-skills/validator.test.d.ts +0 -2
  139. package/dist/__tests__/learned-skills/validator.test.d.ts.map +0 -1
  140. package/dist/__tests__/learned-skills/validator.test.js +0 -85
  141. package/dist/__tests__/learned-skills/validator.test.js.map +0 -1
  142. package/dist/agents/codex-agents.d.ts +0 -20
  143. package/dist/agents/codex-agents.d.ts.map +0 -1
  144. package/dist/agents/codex-agents.js +0 -36
  145. package/dist/agents/codex-agents.js.map +0 -1
  146. package/dist/agents/document-writer.d.ts +0 -11
  147. package/dist/agents/document-writer.d.ts.map +0 -1
  148. package/dist/agents/document-writer.js +0 -209
  149. package/dist/agents/document-writer.js.map +0 -1
  150. package/dist/agents/frontend-engineer.d.ts +0 -11
  151. package/dist/agents/frontend-engineer.d.ts.map +0 -1
  152. package/dist/agents/frontend-engineer.js +0 -115
  153. package/dist/agents/frontend-engineer.js.map +0 -1
  154. package/dist/agents/librarian.d.ts +0 -12
  155. package/dist/agents/librarian.d.ts.map +0 -1
  156. package/dist/agents/librarian.js +0 -103
  157. package/dist/agents/librarian.js.map +0 -1
  158. package/dist/agents/metis.d.ts +0 -12
  159. package/dist/agents/metis.d.ts.map +0 -1
  160. package/dist/agents/metis.js +0 -117
  161. package/dist/agents/metis.js.map +0 -1
  162. package/dist/agents/momus.d.ts +0 -12
  163. package/dist/agents/momus.d.ts.map +0 -1
  164. package/dist/agents/momus.js +0 -128
  165. package/dist/agents/momus.js.map +0 -1
  166. package/dist/agents/multimodal-looker.d.ts +0 -11
  167. package/dist/agents/multimodal-looker.d.ts.map +0 -1
  168. package/dist/agents/multimodal-looker.js +0 -70
  169. package/dist/agents/multimodal-looker.js.map +0 -1
  170. package/dist/agents/oracle.d.ts +0 -13
  171. package/dist/agents/oracle.d.ts.map +0 -1
  172. package/dist/agents/oracle.js +0 -191
  173. package/dist/agents/oracle.js.map +0 -1
  174. package/dist/agents/orchestrator-sisyphus.d.ts +0 -11
  175. package/dist/agents/orchestrator-sisyphus.d.ts.map +0 -1
  176. package/dist/agents/orchestrator-sisyphus.js +0 -115
  177. package/dist/agents/orchestrator-sisyphus.js.map +0 -1
  178. package/dist/agents/prometheus.d.ts +0 -12
  179. package/dist/agents/prometheus.d.ts.map +0 -1
  180. package/dist/agents/prometheus.js +0 -195
  181. package/dist/agents/prometheus.js.map +0 -1
  182. package/dist/agents/sisyphus-junior.d.ts +0 -12
  183. package/dist/agents/sisyphus-junior.d.ts.map +0 -1
  184. package/dist/agents/sisyphus-junior.js +0 -93
  185. package/dist/agents/sisyphus-junior.js.map +0 -1
  186. package/dist/cli/components/CostDashboard.d.ts +0 -15
  187. package/dist/cli/components/CostDashboard.d.ts.map +0 -1
  188. package/dist/cli/components/CostDashboard.js +0 -15
  189. package/dist/cli/components/CostDashboard.js.map +0 -1
  190. package/dist/cli/components/LiveStats.d.ts +0 -16
  191. package/dist/cli/components/LiveStats.d.ts.map +0 -1
  192. package/dist/cli/components/LiveStats.js +0 -16
  193. package/dist/cli/components/LiveStats.js.map +0 -1
  194. package/dist/cli/components/SessionBrowser.d.ts +0 -14
  195. package/dist/cli/components/SessionBrowser.d.ts.map +0 -1
  196. package/dist/cli/components/SessionBrowser.js +0 -14
  197. package/dist/cli/components/SessionBrowser.js.map +0 -1
  198. package/dist/cli/tui.d.ts +0 -21
  199. package/dist/cli/tui.d.ts.map +0 -1
  200. package/dist/cli/tui.js +0 -21
  201. package/dist/cli/tui.js.map +0 -1
  202. package/dist/hooks/autopilot/signals.d.ts +0 -20
  203. package/dist/hooks/autopilot/signals.d.ts.map +0 -1
  204. package/dist/hooks/autopilot/signals.js +0 -75
  205. package/dist/hooks/autopilot/signals.js.map +0 -1
  206. package/dist/hooks/autopilot/summary.d.ts +0 -27
  207. package/dist/hooks/autopilot/summary.d.ts.map +0 -1
  208. package/dist/hooks/autopilot/summary.js +0 -160
  209. package/dist/hooks/autopilot/summary.js.map +0 -1
  210. package/dist/hooks/autopilot/transition.d.ts +0 -39
  211. package/dist/hooks/autopilot/transition.d.ts.map +0 -1
  212. package/dist/hooks/autopilot/transition.js +0 -216
  213. package/dist/hooks/autopilot/transition.js.map +0 -1
  214. package/dist/hooks/context-window-limit-recovery/constants.d.ts +0 -28
  215. package/dist/hooks/context-window-limit-recovery/constants.d.ts.map +0 -1
  216. package/dist/hooks/context-window-limit-recovery/constants.js +0 -85
  217. package/dist/hooks/context-window-limit-recovery/constants.js.map +0 -1
  218. package/dist/hooks/context-window-limit-recovery/index.d.ts +0 -62
  219. package/dist/hooks/context-window-limit-recovery/index.d.ts.map +0 -1
  220. package/dist/hooks/context-window-limit-recovery/index.js +0 -201
  221. package/dist/hooks/context-window-limit-recovery/index.js.map +0 -1
  222. package/dist/hooks/context-window-limit-recovery/parser.d.ts +0 -31
  223. package/dist/hooks/context-window-limit-recovery/parser.d.ts.map +0 -1
  224. package/dist/hooks/context-window-limit-recovery/parser.js +0 -241
  225. package/dist/hooks/context-window-limit-recovery/parser.js.map +0 -1
  226. package/dist/hooks/context-window-limit-recovery/types.d.ts +0 -84
  227. package/dist/hooks/context-window-limit-recovery/types.d.ts.map +0 -1
  228. package/dist/hooks/context-window-limit-recovery/types.js +0 -34
  229. package/dist/hooks/context-window-limit-recovery/types.js.map +0 -1
  230. package/dist/hooks/edit-error-recovery/index.d.ts +0 -62
  231. package/dist/hooks/edit-error-recovery/index.d.ts.map +0 -1
  232. package/dist/hooks/edit-error-recovery/index.js +0 -89
  233. package/dist/hooks/edit-error-recovery/index.js.map +0 -1
  234. package/dist/hooks/learned-skills/config.d.ts +0 -53
  235. package/dist/hooks/learned-skills/config.d.ts.map +0 -1
  236. package/dist/hooks/learned-skills/config.js +0 -103
  237. package/dist/hooks/learned-skills/config.js.map +0 -1
  238. package/dist/hooks/learned-skills/constants.d.ts +0 -24
  239. package/dist/hooks/learned-skills/constants.d.ts.map +0 -1
  240. package/dist/hooks/learned-skills/constants.js +0 -26
  241. package/dist/hooks/learned-skills/constants.js.map +0 -1
  242. package/dist/hooks/learned-skills/detection-hook.d.ts +0 -39
  243. package/dist/hooks/learned-skills/detection-hook.d.ts.map +0 -1
  244. package/dist/hooks/learned-skills/detection-hook.js +0 -83
  245. package/dist/hooks/learned-skills/detection-hook.js.map +0 -1
  246. package/dist/hooks/learned-skills/detector.d.ts +0 -30
  247. package/dist/hooks/learned-skills/detector.d.ts.map +0 -1
  248. package/dist/hooks/learned-skills/detector.js +0 -150
  249. package/dist/hooks/learned-skills/detector.js.map +0 -1
  250. package/dist/hooks/learned-skills/finder.d.ts +0 -21
  251. package/dist/hooks/learned-skills/finder.d.ts.map +0 -1
  252. package/dist/hooks/learned-skills/finder.js +0 -117
  253. package/dist/hooks/learned-skills/finder.js.map +0 -1
  254. package/dist/hooks/learned-skills/index.d.ts +0 -62
  255. package/dist/hooks/learned-skills/index.d.ts.map +0 -1
  256. package/dist/hooks/learned-skills/index.js +0 -137
  257. package/dist/hooks/learned-skills/index.js.map +0 -1
  258. package/dist/hooks/learned-skills/loader.d.ts +0 -20
  259. package/dist/hooks/learned-skills/loader.d.ts.map +0 -1
  260. package/dist/hooks/learned-skills/loader.js +0 -107
  261. package/dist/hooks/learned-skills/loader.js.map +0 -1
  262. package/dist/hooks/learned-skills/parser.d.ts +0 -21
  263. package/dist/hooks/learned-skills/parser.d.ts.map +0 -1
  264. package/dist/hooks/learned-skills/parser.js +0 -190
  265. package/dist/hooks/learned-skills/parser.js.map +0 -1
  266. package/dist/hooks/learned-skills/promotion.d.ts +0 -29
  267. package/dist/hooks/learned-skills/promotion.d.ts.map +0 -1
  268. package/dist/hooks/learned-skills/promotion.js +0 -87
  269. package/dist/hooks/learned-skills/promotion.js.map +0 -1
  270. package/dist/hooks/learned-skills/types.d.ts +0 -109
  271. package/dist/hooks/learned-skills/types.d.ts.map +0 -1
  272. package/dist/hooks/learned-skills/types.js +0 -8
  273. package/dist/hooks/learned-skills/types.js.map +0 -1
  274. package/dist/hooks/learned-skills/validator.d.ts +0 -15
  275. package/dist/hooks/learned-skills/validator.d.ts.map +0 -1
  276. package/dist/hooks/learned-skills/validator.js +0 -87
  277. package/dist/hooks/learned-skills/validator.js.map +0 -1
  278. package/dist/hooks/learned-skills/writer.d.ts +0 -27
  279. package/dist/hooks/learned-skills/writer.d.ts.map +0 -1
  280. package/dist/hooks/learned-skills/writer.js +0 -126
  281. package/dist/hooks/learned-skills/writer.js.map +0 -1
  282. package/dist/hooks/mnemosyne/config.d.ts +0 -53
  283. package/dist/hooks/mnemosyne/config.d.ts.map +0 -1
  284. package/dist/hooks/mnemosyne/config.js +0 -103
  285. package/dist/hooks/mnemosyne/config.js.map +0 -1
  286. package/dist/hooks/mnemosyne/constants.d.ts +0 -24
  287. package/dist/hooks/mnemosyne/constants.d.ts.map +0 -1
  288. package/dist/hooks/mnemosyne/constants.js +0 -26
  289. package/dist/hooks/mnemosyne/constants.js.map +0 -1
  290. package/dist/hooks/mnemosyne/detection-hook.d.ts +0 -39
  291. package/dist/hooks/mnemosyne/detection-hook.d.ts.map +0 -1
  292. package/dist/hooks/mnemosyne/detection-hook.js +0 -83
  293. package/dist/hooks/mnemosyne/detection-hook.js.map +0 -1
  294. package/dist/hooks/mnemosyne/detector.d.ts +0 -30
  295. package/dist/hooks/mnemosyne/detector.d.ts.map +0 -1
  296. package/dist/hooks/mnemosyne/detector.js +0 -150
  297. package/dist/hooks/mnemosyne/detector.js.map +0 -1
  298. package/dist/hooks/mnemosyne/finder.d.ts +0 -21
  299. package/dist/hooks/mnemosyne/finder.d.ts.map +0 -1
  300. package/dist/hooks/mnemosyne/finder.js +0 -117
  301. package/dist/hooks/mnemosyne/finder.js.map +0 -1
  302. package/dist/hooks/mnemosyne/index.d.ts +0 -62
  303. package/dist/hooks/mnemosyne/index.d.ts.map +0 -1
  304. package/dist/hooks/mnemosyne/index.js +0 -137
  305. package/dist/hooks/mnemosyne/index.js.map +0 -1
  306. package/dist/hooks/mnemosyne/loader.d.ts +0 -20
  307. package/dist/hooks/mnemosyne/loader.d.ts.map +0 -1
  308. package/dist/hooks/mnemosyne/loader.js +0 -113
  309. package/dist/hooks/mnemosyne/loader.js.map +0 -1
  310. package/dist/hooks/mnemosyne/parser.d.ts +0 -21
  311. package/dist/hooks/mnemosyne/parser.d.ts.map +0 -1
  312. package/dist/hooks/mnemosyne/parser.js +0 -190
  313. package/dist/hooks/mnemosyne/parser.js.map +0 -1
  314. package/dist/hooks/mnemosyne/promotion.d.ts +0 -29
  315. package/dist/hooks/mnemosyne/promotion.d.ts.map +0 -1
  316. package/dist/hooks/mnemosyne/promotion.js +0 -87
  317. package/dist/hooks/mnemosyne/promotion.js.map +0 -1
  318. package/dist/hooks/mnemosyne/types.d.ts +0 -109
  319. package/dist/hooks/mnemosyne/types.d.ts.map +0 -1
  320. package/dist/hooks/mnemosyne/types.js +0 -8
  321. package/dist/hooks/mnemosyne/types.js.map +0 -1
  322. package/dist/hooks/mnemosyne/validator.d.ts +0 -15
  323. package/dist/hooks/mnemosyne/validator.d.ts.map +0 -1
  324. package/dist/hooks/mnemosyne/validator.js +0 -87
  325. package/dist/hooks/mnemosyne/validator.js.map +0 -1
  326. package/dist/hooks/mnemosyne/writer.d.ts +0 -27
  327. package/dist/hooks/mnemosyne/writer.d.ts.map +0 -1
  328. package/dist/hooks/mnemosyne/writer.js +0 -126
  329. package/dist/hooks/mnemosyne/writer.js.map +0 -1
  330. package/dist/hooks/ralph-loop/index.d.ts +0 -116
  331. package/dist/hooks/ralph-loop/index.d.ts.map +0 -1
  332. package/dist/hooks/ralph-loop/index.js +0 -322
  333. package/dist/hooks/ralph-loop/index.js.map +0 -1
  334. package/dist/hooks/ralph-prd/index.d.ts +0 -130
  335. package/dist/hooks/ralph-prd/index.d.ts.map +0 -1
  336. package/dist/hooks/ralph-prd/index.js +0 -310
  337. package/dist/hooks/ralph-prd/index.js.map +0 -1
  338. package/dist/hooks/ralph-progress/index.d.ts +0 -102
  339. package/dist/hooks/ralph-progress/index.d.ts.map +0 -1
  340. package/dist/hooks/ralph-progress/index.js +0 -408
  341. package/dist/hooks/ralph-progress/index.js.map +0 -1
  342. package/dist/hooks/ralph-verifier/index.d.ts +0 -72
  343. package/dist/hooks/ralph-verifier/index.d.ts.map +0 -1
  344. package/dist/hooks/ralph-verifier/index.js +0 -223
  345. package/dist/hooks/ralph-verifier/index.js.map +0 -1
  346. package/dist/hooks/session-recovery/constants.d.ts +0 -56
  347. package/dist/hooks/session-recovery/constants.d.ts.map +0 -1
  348. package/dist/hooks/session-recovery/constants.js +0 -78
  349. package/dist/hooks/session-recovery/constants.js.map +0 -1
  350. package/dist/hooks/session-recovery/index.d.ts +0 -53
  351. package/dist/hooks/session-recovery/index.d.ts.map +0 -1
  352. package/dist/hooks/session-recovery/index.js +0 -321
  353. package/dist/hooks/session-recovery/index.js.map +0 -1
  354. package/dist/hooks/session-recovery/storage.d.ts +0 -76
  355. package/dist/hooks/session-recovery/storage.d.ts.map +0 -1
  356. package/dist/hooks/session-recovery/storage.js +0 -383
  357. package/dist/hooks/session-recovery/storage.js.map +0 -1
  358. package/dist/hooks/session-recovery/types.d.ts +0 -145
  359. package/dist/hooks/session-recovery/types.d.ts.map +0 -1
  360. package/dist/hooks/session-recovery/types.js +0 -8
  361. package/dist/hooks/session-recovery/types.js.map +0 -1
  362. package/dist/hooks/sisyphus-orchestrator/constants.d.ts +0 -23
  363. package/dist/hooks/sisyphus-orchestrator/constants.d.ts.map +0 -1
  364. package/dist/hooks/sisyphus-orchestrator/constants.js +0 -142
  365. package/dist/hooks/sisyphus-orchestrator/constants.js.map +0 -1
  366. package/dist/hooks/sisyphus-orchestrator/index.d.ts +0 -113
  367. package/dist/hooks/sisyphus-orchestrator/index.d.ts.map +0 -1
  368. package/dist/hooks/sisyphus-orchestrator/index.js +0 -309
  369. package/dist/hooks/sisyphus-orchestrator/index.js.map +0 -1
  370. package/dist/hooks/ultraqa-loop/index.d.ts +0 -94
  371. package/dist/hooks/ultraqa-loop/index.d.ts.map +0 -1
  372. package/dist/hooks/ultraqa-loop/index.js +0 -216
  373. package/dist/hooks/ultraqa-loop/index.js.map +0 -1
  374. package/dist/hooks/ultrawork-state/index.d.ts +0 -62
  375. package/dist/hooks/ultrawork-state/index.d.ts.map +0 -1
  376. package/dist/hooks/ultrawork-state/index.js +0 -208
  377. package/dist/hooks/ultrawork-state/index.js.map +0 -1
  378. package/dist/hud/sisyphus-state.d.ts +0 -31
  379. package/dist/hud/sisyphus-state.d.ts.map +0 -1
  380. package/dist/hud/sisyphus-state.js +0 -163
  381. package/dist/hud/sisyphus-state.js.map +0 -1
@@ -48,8 +48,8 @@ PROMPT_LOWER=$(echo "$PROMPT_NO_CODE" | tr '[:upper:]' '[:lower:]')
48
48
  # Check for ultrawork keywords (highest priority)
49
49
  if echo "$PROMPT_LOWER" | grep -qE '\b(ultrawork|ulw|uw)\b'; then
50
50
  # Create persistent ultrawork state
51
- mkdir -p "$DIRECTORY/.sisyphus" 2>/dev/null
52
- mkdir -p "$HOME/.claude" 2>/dev/null
51
+ mkdir -p "$DIRECTORY/.omc/state" 2>/dev/null
52
+ mkdir -p "$HOME/.omc/state" 2>/dev/null
53
53
 
54
54
  # Escape prompt for JSON
55
55
  PROMPT_ESCAPED=$(echo "$PROMPT" | sed 's/\\/\\\\/g' | sed 's/"/\\"/g' | tr '\n' ' ')
@@ -63,8 +63,8 @@ if echo "$PROMPT_LOWER" | grep -qE '\b(ultrawork|ulw|uw)\b'; then
63
63
  }"
64
64
 
65
65
  # Write state to both local and global locations
66
- echo "$STATE_JSON" > "$DIRECTORY/.omc/ultrawork-state.json" 2>/dev/null
67
- echo "$STATE_JSON" > "$HOME/.claude/ultrawork-state.json" 2>/dev/null
66
+ echo "$STATE_JSON" > "$DIRECTORY/.omc/state/ultrawork-state.json" 2>/dev/null
67
+ echo "$STATE_JSON" > "$HOME/.omc/state/ultrawork-state.json" 2>/dev/null
68
68
 
69
69
  # Return ultrawork mode injection
70
70
  cat << 'EOF'
@@ -21,22 +21,22 @@ fi
21
21
 
22
22
  # Check for active ultrawork state
23
23
  ULTRAWORK_STATE=""
24
- if [ -f "$DIRECTORY/.omc/ultrawork-state.json" ]; then
25
- ULTRAWORK_STATE=$(cat "$DIRECTORY/.omc/ultrawork-state.json" 2>/dev/null)
26
- elif [ -f "$HOME/.claude/ultrawork-state.json" ]; then
27
- ULTRAWORK_STATE=$(cat "$HOME/.claude/ultrawork-state.json" 2>/dev/null)
24
+ if [ -f "$DIRECTORY/.omc/state/ultrawork-state.json" ]; then
25
+ ULTRAWORK_STATE=$(cat "$DIRECTORY/.omc/state/ultrawork-state.json" 2>/dev/null)
26
+ elif [ -f "$HOME/.omc/state/ultrawork-state.json" ]; then
27
+ ULTRAWORK_STATE=$(cat "$HOME/.omc/state/ultrawork-state.json" 2>/dev/null)
28
28
  fi
29
29
 
30
30
  # Check for active ralph loop
31
31
  RALPH_STATE=""
32
- if [ -f "$DIRECTORY/.omc/ralph-state.json" ]; then
33
- RALPH_STATE=$(cat "$DIRECTORY/.omc/ralph-state.json" 2>/dev/null)
32
+ if [ -f "$DIRECTORY/.omc/state/ralph-state.json" ]; then
33
+ RALPH_STATE=$(cat "$DIRECTORY/.omc/state/ralph-state.json" 2>/dev/null)
34
34
  fi
35
35
 
36
36
  # Check for verification state (oracle verification)
37
37
  VERIFICATION_STATE=""
38
- if [ -f "$DIRECTORY/.omc/ralph-verification.json" ]; then
39
- VERIFICATION_STATE=$(cat "$DIRECTORY/.omc/ralph-verification.json" 2>/dev/null)
38
+ if [ -f "$DIRECTORY/.omc/state/ralph-verification.json" ]; then
39
+ VERIFICATION_STATE=$(cat "$DIRECTORY/.omc/state/ralph-verification.json" 2>/dev/null)
40
40
  fi
41
41
 
42
42
  # Check for incomplete todos
@@ -106,7 +106,7 @@ EOF
106
106
  if [ "$ITERATION" -lt "$MAX_ITER" ]; then
107
107
  # Increment iteration
108
108
  NEW_ITER=$((ITERATION + 1))
109
- echo "$RALPH_STATE" | jq ".iteration = $NEW_ITER" > "$DIRECTORY/.omc/ralph-state.json" 2>/dev/null
109
+ echo "$RALPH_STATE" | jq ".iteration = $NEW_ITER" > "$DIRECTORY/.omc/state/ralph-state.json" 2>/dev/null
110
110
 
111
111
  cat << EOF
112
112
  {"continue": false, "reason": "<ralph-loop-continuation>\n\n[RALPH LOOP - ITERATION $NEW_ITER/$MAX_ITER]\n\nYour previous attempt did not output the completion promise. The work is NOT done yet.\n\nCRITICAL INSTRUCTIONS:\n1. Review your progress and the original task\n2. Check your todo list - are ALL items marked complete?\n3. Continue from where you left off\n4. When FULLY complete, output: <promise>$PROMISE</promise>\n5. Do NOT stop until the task is truly done\n\nOriginal task: $PROMPT\n\n</ralph-loop-continuation>\n\n---\n"}
@@ -149,7 +149,7 @@ if [ -n "$ULTRAWORK_STATE" ] && [ "$INCOMPLETE_COUNT" -gt 0 ]; then
149
149
 
150
150
  # Update state file (best effort)
151
151
  if command -v jq &> /dev/null; then
152
- echo "$ULTRAWORK_STATE" | jq ".reinforcement_count = $NEW_COUNT | .last_checked_at = \"$(date -Iseconds)\"" > "$DIRECTORY/.omc/ultrawork-state.json" 2>/dev/null
152
+ echo "$ULTRAWORK_STATE" | jq ".reinforcement_count = $NEW_COUNT | .last_checked_at = \"$(date -Iseconds)\"" > "$DIRECTORY/.omc/state/ultrawork-state.json" 2>/dev/null
153
153
  fi
154
154
 
155
155
  cat << EOF
@@ -18,11 +18,11 @@ fi
18
18
  MESSAGES=""
19
19
 
20
20
  # Check for active ultrawork state
21
- if [ -f "$DIRECTORY/.omc/ultrawork-state.json" ] || [ -f "$HOME/.claude/ultrawork-state.json" ]; then
22
- if [ -f "$DIRECTORY/.omc/ultrawork-state.json" ]; then
23
- ULTRAWORK_STATE=$(cat "$DIRECTORY/.omc/ultrawork-state.json" 2>/dev/null)
21
+ if [ -f "$DIRECTORY/.omc/state/ultrawork-state.json" ] || [ -f "$HOME/.omc/state/ultrawork-state.json" ]; then
22
+ if [ -f "$DIRECTORY/.omc/state/ultrawork-state.json" ]; then
23
+ ULTRAWORK_STATE=$(cat "$DIRECTORY/.omc/state/ultrawork-state.json" 2>/dev/null)
24
24
  else
25
- ULTRAWORK_STATE=$(cat "$HOME/.claude/ultrawork-state.json" 2>/dev/null)
25
+ ULTRAWORK_STATE=$(cat "$HOME/.omc/state/ultrawork-state.json" 2>/dev/null)
26
26
  fi
27
27
 
28
28
  IS_ACTIVE=$(echo "$ULTRAWORK_STATE" | jq -r '.active // false' 2>/dev/null)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-claude-sisyphus",
3
- "version": "3.7.0",
3
+ "version": "3.7.3",
4
4
  "description": "Multi-agent orchestration system for Claude Code - Inspired by oh-my-opencode",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -53,10 +53,12 @@
53
53
  "@ast-grep/napi": "^0.31.0",
54
54
  "@tokscale/core": "^1.0.25",
55
55
  "@types/better-sqlite3": "^7.6.13",
56
+ "ajv": "^8.17.1",
56
57
  "better-sqlite3": "^12.6.2",
57
58
  "chalk": "^5.3.0",
58
59
  "commander": "^12.1.0",
59
60
  "jsonc-parser": "^3.3.1",
61
+ "safe-regex": "^2.1.1",
60
62
  "vscode-languageserver-protocol": "^3.17.5",
61
63
  "zod": "^3.23.8"
62
64
  },
@@ -137,15 +137,15 @@ function activateUltraworkState(directory, prompt) {
137
137
  last_checked_at: new Date().toISOString()
138
138
  };
139
139
 
140
- // Write to local .sisyphus directory
141
- const localDir = join(directory, '.omc');
140
+ // Write to local .omc/state directory
141
+ const localDir = join(directory, '.omc', 'state');
142
142
  if (!existsSync(localDir)) {
143
143
  try { mkdirSync(localDir, { recursive: true }); } catch {}
144
144
  }
145
145
  try { writeFileSync(join(localDir, 'ultrawork-state.json'), JSON.stringify(state, null, 2)); } catch {}
146
146
 
147
- // Write to global .claude directory
148
- const globalDir = join(homedir(), '.claude');
147
+ // Write to global .omc/state directory
148
+ const globalDir = join(homedir(), '.omc', 'state');
149
149
  if (!existsSync(globalDir)) {
150
150
  try { mkdirSync(globalDir, { recursive: true }); } catch {}
151
151
  }
@@ -166,14 +166,14 @@ async function main() {
166
166
  const todosDir = join(homedir(), '.claude', 'todos');
167
167
 
168
168
  // Check for ultrawork state
169
- let ultraworkState = readJsonFile(join(directory, '.omc', 'ultrawork-state.json'))
170
- || readJsonFile(join(homedir(), '.claude', 'ultrawork-state.json'));
169
+ let ultraworkState = readJsonFile(join(directory, '.omc', 'state', 'ultrawork-state.json'))
170
+ || readJsonFile(join(homedir(), '.omc', 'state', 'ultrawork-state.json'));
171
171
 
172
172
  // Check for ralph loop state
173
- const ralphState = readJsonFile(join(directory, '.omc', 'ralph-state.json'));
173
+ const ralphState = readJsonFile(join(directory, '.omc', 'state', 'ralph-state.json'));
174
174
 
175
175
  // Check for verification state
176
- const verificationState = readJsonFile(join(directory, '.omc', 'ralph-verification.json'));
176
+ const verificationState = readJsonFile(join(directory, '.omc', 'state', 'ralph-verification.json'));
177
177
 
178
178
  // Count incomplete todos
179
179
  const incompleteCount = countIncompleteTodos(todosDir, directory);
@@ -256,7 +256,7 @@ ${verificationState.oracle_feedback}
256
256
  if (iteration < maxIter) {
257
257
  const newIter = iteration + 1;
258
258
  ralphState.iteration = newIter;
259
- writeJsonFile(join(directory, '.omc', 'ralph-state.json'), ralphState);
259
+ writeJsonFile(join(directory, '.omc', 'state', 'ralph-state.json'), ralphState);
260
260
 
261
261
  // Build continuation message with PRD context if available
262
262
  let prdContext = '';
@@ -349,7 +349,7 @@ ${ralphState.prompt ? `Original task: ${ralphState.prompt}` : ''}
349
349
  ultraworkState.reinforcement_count = newCount;
350
350
  ultraworkState.last_checked_at = new Date().toISOString();
351
351
 
352
- writeJsonFile(join(directory, '.omc', 'ultrawork-state.json'), ultraworkState);
352
+ writeJsonFile(join(directory, '.omc', 'state', 'ultrawork-state.json'), ultraworkState);
353
353
 
354
354
  console.log(JSON.stringify({
355
355
  continue: false,
@@ -21,22 +21,22 @@ fi
21
21
 
22
22
  # Check for active ultrawork state
23
23
  ULTRAWORK_STATE=""
24
- if [ -f "$DIRECTORY/.omc/ultrawork-state.json" ]; then
25
- ULTRAWORK_STATE=$(cat "$DIRECTORY/.omc/ultrawork-state.json" 2>/dev/null)
26
- elif [ -f "$HOME/.claude/ultrawork-state.json" ]; then
27
- ULTRAWORK_STATE=$(cat "$HOME/.claude/ultrawork-state.json" 2>/dev/null)
24
+ if [ -f "$DIRECTORY/.omc/state/ultrawork-state.json" ]; then
25
+ ULTRAWORK_STATE=$(cat "$DIRECTORY/.omc/state/ultrawork-state.json" 2>/dev/null)
26
+ elif [ -f "$HOME/.omc/state/ultrawork-state.json" ]; then
27
+ ULTRAWORK_STATE=$(cat "$HOME/.omc/state/ultrawork-state.json" 2>/dev/null)
28
28
  fi
29
29
 
30
30
  # Check for active ralph loop
31
31
  RALPH_STATE=""
32
- if [ -f "$DIRECTORY/.omc/ralph-state.json" ]; then
33
- RALPH_STATE=$(cat "$DIRECTORY/.omc/ralph-state.json" 2>/dev/null)
32
+ if [ -f "$DIRECTORY/.omc/state/ralph-state.json" ]; then
33
+ RALPH_STATE=$(cat "$DIRECTORY/.omc/state/ralph-state.json" 2>/dev/null)
34
34
  fi
35
35
 
36
36
  # Check for verification state (oracle verification)
37
37
  VERIFICATION_STATE=""
38
- if [ -f "$DIRECTORY/.omc/ralph-verification.json" ]; then
39
- VERIFICATION_STATE=$(cat "$DIRECTORY/.omc/ralph-verification.json" 2>/dev/null)
38
+ if [ -f "$DIRECTORY/.omc/state/ralph-verification.json" ]; then
39
+ VERIFICATION_STATE=$(cat "$DIRECTORY/.omc/state/ralph-verification.json" 2>/dev/null)
40
40
  fi
41
41
 
42
42
  # Check for incomplete todos
@@ -106,7 +106,7 @@ EOF
106
106
  if [ "$ITERATION" -lt "$MAX_ITER" ]; then
107
107
  # Increment iteration
108
108
  NEW_ITER=$((ITERATION + 1))
109
- echo "$RALPH_STATE" | jq ".iteration = $NEW_ITER" > "$DIRECTORY/.omc/ralph-state.json" 2>/dev/null
109
+ echo "$RALPH_STATE" | jq ".iteration = $NEW_ITER" > "$DIRECTORY/.omc/state/ralph-state.json" 2>/dev/null
110
110
 
111
111
  # Check if ultrawork is linked (auto-activated with ralph)
112
112
  LINKED_ULTRAWORK=$(echo "$RALPH_STATE" | jq -r '.linked_ultrawork // false' 2>/dev/null)
@@ -288,7 +288,7 @@ if [ -n "$ULTRAWORK_STATE" ] && [ "$INCOMPLETE_COUNT" -gt 0 ]; then
288
288
 
289
289
  # Update state file (best effort)
290
290
  if command -v jq &> /dev/null; then
291
- echo "$ULTRAWORK_STATE" | jq ".reinforcement_count = $NEW_COUNT | .last_checked_at = \"$(date -Iseconds)\"" > "$DIRECTORY/.omc/ultrawork-state.json" 2>/dev/null
291
+ echo "$ULTRAWORK_STATE" | jq ".reinforcement_count = $NEW_COUNT | .last_checked_at = \"$(date -Iseconds)\"" > "$DIRECTORY/.omc/state/ultrawork-state.json" 2>/dev/null
292
292
  fi
293
293
 
294
294
  cat << EOF
@@ -48,7 +48,7 @@ function countIncompleteTodos(todosDir) {
48
48
 
49
49
  // Check if HUD is properly installed
50
50
  function checkHudInstallation() {
51
- const hudScript = join(homedir(), '.claude', 'hud', 'sisyphus-hud.mjs');
51
+ const hudScript = join(homedir(), '.claude', 'hud', 'omc-hud.mjs');
52
52
  const settingsFile = join(homedir(), '.claude', 'settings.json');
53
53
 
54
54
  // Check if HUD script exists
@@ -92,8 +92,8 @@ async function main() {
92
92
  }
93
93
 
94
94
  // Check for ultrawork state
95
- const ultraworkState = readJsonFile(join(directory, '.omc', 'ultrawork-state.json'))
96
- || readJsonFile(join(homedir(), '.claude', 'ultrawork-state.json'));
95
+ const ultraworkState = readJsonFile(join(directory, '.omc', 'state', 'ultrawork-state.json'))
96
+ || readJsonFile(join(homedir(), '.omc', 'state', 'ultrawork-state.json'));
97
97
 
98
98
  if (ultraworkState?.active) {
99
99
  messages.push(`<session-restore>
@@ -112,7 +112,7 @@ Continue working in ultrawork mode until all tasks are complete.
112
112
  }
113
113
 
114
114
  // Check for ralph loop state
115
- const ralphState = readJsonFile(join(directory, '.omc', 'ralph-state.json'));
115
+ const ralphState = readJsonFile(join(directory, '.omc', 'state', 'ralph-state.json'));
116
116
  if (ralphState?.active) {
117
117
  messages.push(`<session-restore>
118
118
 
@@ -81,6 +81,19 @@ Then, use the Write tool to create `~/.claude/hud/omc-hud.mjs` with this exact c
81
81
  import { existsSync, readdirSync } from "node:fs";
82
82
  import { homedir } from "node:os";
83
83
  import { join } from "node:path";
84
+ import { pathToFileURL } from "node:url";
85
+
86
+ // Semantic version comparison: returns negative if a < b, positive if a > b, 0 if equal
87
+ function semverCompare(a, b) {
88
+ const pa = a.replace(/^v/, "").split(".").map(Number);
89
+ const pb = b.replace(/^v/, "").split(".").map(Number);
90
+ for (let i = 0; i < Math.max(pa.length, pb.length); i++) {
91
+ const na = pa[i] || 0;
92
+ const nb = pb[i] || 0;
93
+ if (na !== nb) return na - nb;
94
+ }
95
+ return 0;
96
+ }
84
97
 
85
98
  async function main() {
86
99
  const home = homedir();
@@ -92,11 +105,11 @@ async function main() {
92
105
  try {
93
106
  const versions = readdirSync(pluginCacheBase);
94
107
  if (versions.length > 0) {
95
- const latestVersion = versions.sort().reverse()[0];
108
+ const latestVersion = versions.sort(semverCompare).reverse()[0];
96
109
  pluginCacheDir = join(pluginCacheBase, latestVersion);
97
110
  const pluginPath = join(pluginCacheDir, "dist/hud/index.js");
98
111
  if (existsSync(pluginPath)) {
99
- await import(pluginPath);
112
+ await import(pathToFileURL(pluginPath).href);
100
113
  return;
101
114
  }
102
115
  }
@@ -114,7 +127,7 @@ async function main() {
114
127
  for (const devPath of devPaths) {
115
128
  if (existsSync(devPath)) {
116
129
  try {
117
- await import(devPath);
130
+ await import(pathToFileURL(devPath).href);
118
131
  return;
119
132
  } catch { /* continue */ }
120
133
  }
@@ -138,12 +151,31 @@ chmod +x ~/.claude/hud/omc-hud.mjs
138
151
 
139
152
  **Step 4:** Update settings.json to use the HUD:
140
153
 
141
- Read `~/.claude/settings.json`, then update/add the `statusLine` field:
154
+ Read `~/.claude/settings.json`, then update/add the `statusLine` field.
155
+
156
+ **IMPORTANT:** The command must use an absolute path, not `~`, because Windows does not expand `~` in shell commands.
157
+
158
+ First, determine the correct path:
159
+ ```bash
160
+ node -e "const p=require('path').join(require('os').homedir(),'.claude','hud','omc-hud.mjs');console.log(JSON.stringify(p))"
161
+ ```
162
+
163
+ Then set the `statusLine` field using the resolved path. On Unix it will look like:
164
+ ```json
165
+ {
166
+ "statusLine": {
167
+ "type": "command",
168
+ "command": "node /home/username/.claude/hud/omc-hud.mjs"
169
+ }
170
+ }
171
+ ```
172
+
173
+ On Windows it will look like:
142
174
  ```json
143
175
  {
144
176
  "statusLine": {
145
177
  "type": "command",
146
- "command": "node ~/.claude/hud/omc-hud.mjs"
178
+ "command": "node C:\\Users\\username\\.claude\\hud\\omc-hud.mjs"
147
179
  }
148
180
  }
149
181
  ```
@@ -7,6 +7,104 @@ description: Setup and configure oh-my-claudecode (the ONLY command you need to
7
7
 
8
8
  This is the **only command you need to learn**. After running this, everything else is automatic.
9
9
 
10
+ ## Graceful Interrupt Handling
11
+
12
+ **IMPORTANT**: This setup process saves progress after each step. If interrupted (Ctrl+C or connection loss), the setup can resume from where it left off.
13
+
14
+ ### State File Location
15
+ - `.omc/state/setup-state.json` - Tracks completed steps
16
+
17
+ ### Resume Detection (Step 0)
18
+
19
+ Before starting any step, check for existing state:
20
+
21
+ ```bash
22
+ # Check for existing setup state
23
+ STATE_FILE=".omc/state/setup-state.json"
24
+
25
+ # Cross-platform ISO date to epoch conversion
26
+ iso_to_epoch() {
27
+ local iso_date="$1"
28
+ local epoch=""
29
+ # Try GNU date first (Linux)
30
+ epoch=$(date -d "$iso_date" +%s 2>/dev/null)
31
+ if [ $? -eq 0 ] && [ -n "$epoch" ]; then
32
+ echo "$epoch"
33
+ return 0
34
+ fi
35
+ # Try BSD/macOS date
36
+ local clean_date=$(echo "$iso_date" | sed 's/[+-][0-9][0-9]:[0-9][0-9]$//' | sed 's/Z$//' | sed 's/T/ /')
37
+ epoch=$(date -j -f "%Y-%m-%d %H:%M:%S" "$clean_date" +%s 2>/dev/null)
38
+ if [ $? -eq 0 ] && [ -n "$epoch" ]; then
39
+ echo "$epoch"
40
+ return 0
41
+ fi
42
+ echo "0"
43
+ }
44
+
45
+ if [ -f "$STATE_FILE" ]; then
46
+ # Check if state is stale (older than 24 hours)
47
+ TIMESTAMP_RAW=$(jq -r '.timestamp // empty' "$STATE_FILE" 2>/dev/null)
48
+ if [ -n "$TIMESTAMP_RAW" ]; then
49
+ TIMESTAMP_EPOCH=$(iso_to_epoch "$TIMESTAMP_RAW")
50
+ NOW_EPOCH=$(date +%s)
51
+ STATE_AGE=$((NOW_EPOCH - TIMESTAMP_EPOCH))
52
+ else
53
+ STATE_AGE=999999 # Force fresh start if no timestamp
54
+ fi
55
+ if [ "$STATE_AGE" -gt 86400 ]; then
56
+ echo "Previous setup state is more than 24 hours old. Starting fresh."
57
+ rm -f "$STATE_FILE"
58
+ else
59
+ LAST_STEP=$(jq -r ".lastCompletedStep // 0" "$STATE_FILE" 2>/dev/null || echo "0")
60
+ TIMESTAMP=$(jq -r .timestamp "$STATE_FILE" 2>/dev/null || echo "unknown")
61
+ echo "Found previous setup session (Step $LAST_STEP completed at $TIMESTAMP)"
62
+ fi
63
+ fi
64
+ ```
65
+
66
+ If state exists, use AskUserQuestion to prompt:
67
+
68
+ **Question:** "Found a previous setup session. Would you like to resume or start fresh?"
69
+
70
+ **Options:**
71
+ 1. **Resume from step $LAST_STEP** - Continue where you left off
72
+ 2. **Start fresh** - Begin from the beginning (clears saved state)
73
+
74
+ If user chooses "Start fresh":
75
+ ```bash
76
+ rm -f ".omc/state/setup-state.json"
77
+ echo "Previous state cleared. Starting fresh setup."
78
+ ```
79
+
80
+ ### Save Progress Helper
81
+
82
+ After completing each major step, save progress:
83
+
84
+ ```bash
85
+ # Save setup progress (call after each step)
86
+ # Usage: save_setup_progress STEP_NUMBER
87
+ save_setup_progress() {
88
+ mkdir -p .omc/state
89
+ cat > ".omc/state/setup-state.json" << EOF
90
+ {
91
+ "lastCompletedStep": $1,
92
+ "timestamp": "$(date -Iseconds)",
93
+ "configType": "${CONFIG_TYPE:-unknown}"
94
+ }
95
+ EOF
96
+ }
97
+ ```
98
+
99
+ ### Clear State on Completion
100
+
101
+ After successful setup completion (Step 7/8), remove the state file:
102
+
103
+ ```bash
104
+ rm -f ".omc/state/setup-state.json"
105
+ echo "Setup completed successfully. State cleared."
106
+ ```
107
+
10
108
  ## Usage Modes
11
109
 
12
110
  This skill handles three scenarios:
@@ -24,6 +122,8 @@ Check for flags in the user's invocation:
24
122
 
25
123
  ## Step 1: Initial Setup Wizard (Default Behavior)
26
124
 
125
+ **Note**: If resuming and lastCompletedStep >= 1, skip to the appropriate step based on configType.
126
+
27
127
  Use the AskUserQuestion tool to prompt the user:
28
128
 
29
129
  **Question:** "Where should I configure oh-my-claudecode?"
@@ -90,7 +190,19 @@ grep -q "oh-my-claudecode" ~/.claude/settings.json && echo "Plugin verified" ||
90
190
 
91
191
  ### Confirm Local Configuration Success
92
192
 
93
- After completing local configuration, report:
193
+ After completing local configuration, save progress and report:
194
+
195
+ ```bash
196
+ # Save progress - Step 2 complete (Local config)
197
+ mkdir -p .omc/state
198
+ cat > ".omc/state/setup-state.json" << EOF
199
+ {
200
+ "lastCompletedStep": 2,
201
+ "timestamp": "$(date -Iseconds)",
202
+ "configType": "local"
203
+ }
204
+ EOF
205
+ ```
94
206
 
95
207
  **OMC Project Configuration Complete**
96
208
  - CLAUDE.md: Updated with latest configuration from GitHub at ./.claude/CLAUDE.md
@@ -102,7 +214,11 @@ After completing local configuration, report:
102
214
 
103
215
  **Note**: This configuration is project-specific and won't affect other projects or global settings.
104
216
 
105
- If `--local` flag was used, **STOP HERE**. Do not continue to HUD setup or other steps.
217
+ If `--local` flag was used, clear state and **STOP HERE**:
218
+ ```bash
219
+ rm -f ".omc/state/setup-state.json"
220
+ ```
221
+ Do not continue to HUD setup or other steps.
106
222
 
107
223
  ## Step 2B: Global Configuration (--global flag or user chose GLOBAL)
108
224
 
@@ -164,7 +280,19 @@ grep -q "oh-my-claudecode" ~/.claude/settings.json && echo "Plugin verified" ||
164
280
 
165
281
  ### Confirm Global Configuration Success
166
282
 
167
- After completing global configuration, report:
283
+ After completing global configuration, save progress and report:
284
+
285
+ ```bash
286
+ # Save progress - Step 2 complete (Global config)
287
+ mkdir -p .omc/state
288
+ cat > ".omc/state/setup-state.json" << EOF
289
+ {
290
+ "lastCompletedStep": 2,
291
+ "timestamp": "$(date -Iseconds)",
292
+ "configType": "global"
293
+ }
294
+ EOF
295
+ ```
168
296
 
169
297
  **OMC Global Configuration Complete**
170
298
  - CLAUDE.md: Updated with latest configuration from GitHub at ~/.claude/CLAUDE.md
@@ -176,10 +304,16 @@ After completing global configuration, report:
176
304
 
177
305
  **Note**: Hooks are now managed by the plugin system automatically. No manual hook installation required.
178
306
 
179
- If `--global` flag was used, **STOP HERE**. Do not continue to HUD setup or other steps.
307
+ If `--global` flag was used, clear state and **STOP HERE**:
308
+ ```bash
309
+ rm -f ".omc/state/setup-state.json"
310
+ ```
311
+ Do not continue to HUD setup or other steps.
180
312
 
181
313
  ## Step 3: Setup HUD Statusline
182
314
 
315
+ **Note**: If resuming and lastCompletedStep >= 3, skip to Step 3.5.
316
+
183
317
  The HUD shows real-time status in Claude Code's status bar. **Invoke the hud skill** to set up and configure:
184
318
 
185
319
  Use the Skill tool to invoke: `hud` with args: `setup`
@@ -189,6 +323,20 @@ This will:
189
323
  2. Configure `statusLine` in `~/.claude/settings.json`
190
324
  3. Report status and prompt to restart if needed
191
325
 
326
+ After HUD setup completes, save progress:
327
+ ```bash
328
+ # Save progress - Step 3 complete (HUD setup)
329
+ mkdir -p .omc/state
330
+ CONFIG_TYPE=$(cat ".omc/state/setup-state.json" 2>/dev/null | grep -oE '"configType":\s*"[^"]+"' | cut -d'"' -f4 || echo "unknown")
331
+ cat > ".omc/state/setup-state.json" << EOF
332
+ {
333
+ "lastCompletedStep": 3,
334
+ "timestamp": "$(date -Iseconds)",
335
+ "configType": "$CONFIG_TYPE"
336
+ }
337
+ EOF
338
+ ```
339
+
192
340
  ## Step 3.5: Clear Stale Plugin Cache
193
341
 
194
342
  Clear old cached plugin versions to avoid conflicts:
@@ -471,6 +619,16 @@ echo " https://github.com/Yeachan-Heo/oh-my-claudecode"
471
619
  echo ""
472
620
  ```
473
621
 
622
+ ### Clear Setup State on Completion
623
+
624
+ After Step 8 completes (regardless of star choice), clear the setup state:
625
+
626
+ ```bash
627
+ # Setup complete - clear state file
628
+ rm -f ".omc/state/setup-state.json"
629
+ echo "Setup completed successfully!"
630
+ ```
631
+
474
632
  ## Keeping Up to Date
475
633
 
476
634
  After installing oh-my-claudecode updates (via npm or plugin update), run: