oh-my-claude-sisyphus 3.7.3 → 3.7.4

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 (357) hide show
  1. package/agents/build-fixer-low.md +2 -2
  2. package/agents/build-fixer.md +74 -19
  3. package/agents/code-reviewer.md +7 -7
  4. package/agents/designer-high.md +2 -2
  5. package/agents/designer-low.md +1 -1
  6. package/agents/designer.md +17 -2
  7. package/agents/security-reviewer.md +86 -17
  8. package/agents/tdd-guide.md +151 -12
  9. package/dist/__tests__/analytics/analytics-summary.test.d.ts +2 -0
  10. package/dist/__tests__/analytics/analytics-summary.test.d.ts.map +1 -0
  11. package/dist/__tests__/analytics/analytics-summary.test.js +267 -0
  12. package/dist/__tests__/analytics/analytics-summary.test.js.map +1 -0
  13. package/dist/__tests__/analytics/cost-estimator.test.d.ts +2 -0
  14. package/dist/__tests__/analytics/cost-estimator.test.d.ts.map +1 -0
  15. package/dist/__tests__/analytics/cost-estimator.test.js +212 -0
  16. package/dist/__tests__/analytics/cost-estimator.test.js.map +1 -0
  17. package/dist/__tests__/hooks/auto-slash-command/executor.test.d.ts +7 -0
  18. package/dist/__tests__/hooks/auto-slash-command/executor.test.d.ts.map +1 -0
  19. package/dist/__tests__/hooks/auto-slash-command/executor.test.js +374 -0
  20. package/dist/__tests__/hooks/auto-slash-command/executor.test.js.map +1 -0
  21. package/dist/__tests__/hud/auto-tracking.integration.test.d.ts +2 -0
  22. package/dist/__tests__/hud/auto-tracking.integration.test.d.ts.map +1 -0
  23. package/dist/__tests__/hud/auto-tracking.integration.test.js +12 -0
  24. package/dist/__tests__/hud/auto-tracking.integration.test.js.map +1 -0
  25. package/dist/__tests__/installer.test.js +1 -1
  26. package/dist/__tests__/learned-skills/config.test.d.ts +2 -0
  27. package/dist/__tests__/learned-skills/config.test.d.ts.map +1 -0
  28. package/dist/__tests__/learned-skills/config.test.js +37 -0
  29. package/dist/__tests__/learned-skills/config.test.js.map +1 -0
  30. package/dist/__tests__/learned-skills/detector.test.d.ts +2 -0
  31. package/dist/__tests__/learned-skills/detector.test.d.ts.map +1 -0
  32. package/dist/__tests__/learned-skills/detector.test.js +99 -0
  33. package/dist/__tests__/learned-skills/detector.test.js.map +1 -0
  34. package/dist/__tests__/learned-skills/finder.test.d.ts +2 -0
  35. package/dist/__tests__/learned-skills/finder.test.d.ts.map +1 -0
  36. package/dist/__tests__/learned-skills/finder.test.js +59 -0
  37. package/dist/__tests__/learned-skills/finder.test.js.map +1 -0
  38. package/dist/__tests__/learned-skills/loader.test.d.ts +2 -0
  39. package/dist/__tests__/learned-skills/loader.test.d.ts.map +1 -0
  40. package/dist/__tests__/learned-skills/loader.test.js +69 -0
  41. package/dist/__tests__/learned-skills/loader.test.js.map +1 -0
  42. package/dist/__tests__/learned-skills/parser.test.d.ts +2 -0
  43. package/dist/__tests__/learned-skills/parser.test.d.ts.map +1 -0
  44. package/dist/__tests__/learned-skills/parser.test.js +81 -0
  45. package/dist/__tests__/learned-skills/parser.test.js.map +1 -0
  46. package/dist/__tests__/learned-skills/validator.test.d.ts +2 -0
  47. package/dist/__tests__/learned-skills/validator.test.d.ts.map +1 -0
  48. package/dist/__tests__/learned-skills/validator.test.js +85 -0
  49. package/dist/__tests__/learned-skills/validator.test.js.map +1 -0
  50. package/dist/__tests__/skills.test.js +6 -5
  51. package/dist/__tests__/skills.test.js.map +1 -1
  52. package/dist/agents/codex-agents.d.ts +20 -0
  53. package/dist/agents/codex-agents.d.ts.map +1 -0
  54. package/dist/agents/codex-agents.js +36 -0
  55. package/dist/agents/codex-agents.js.map +1 -0
  56. package/dist/agents/definitions.js +1 -1
  57. package/dist/agents/definitions.js.map +1 -1
  58. package/dist/agents/document-writer.d.ts +11 -0
  59. package/dist/agents/document-writer.d.ts.map +1 -0
  60. package/dist/agents/document-writer.js +209 -0
  61. package/dist/agents/document-writer.js.map +1 -0
  62. package/dist/agents/frontend-engineer.d.ts +11 -0
  63. package/dist/agents/frontend-engineer.d.ts.map +1 -0
  64. package/dist/agents/frontend-engineer.js +115 -0
  65. package/dist/agents/frontend-engineer.js.map +1 -0
  66. package/dist/agents/librarian.d.ts +12 -0
  67. package/dist/agents/librarian.d.ts.map +1 -0
  68. package/dist/agents/librarian.js +103 -0
  69. package/dist/agents/librarian.js.map +1 -0
  70. package/dist/agents/metis.d.ts +12 -0
  71. package/dist/agents/metis.d.ts.map +1 -0
  72. package/dist/agents/metis.js +117 -0
  73. package/dist/agents/metis.js.map +1 -0
  74. package/dist/agents/momus.d.ts +12 -0
  75. package/dist/agents/momus.d.ts.map +1 -0
  76. package/dist/agents/momus.js +128 -0
  77. package/dist/agents/momus.js.map +1 -0
  78. package/dist/agents/multimodal-looker.d.ts +11 -0
  79. package/dist/agents/multimodal-looker.d.ts.map +1 -0
  80. package/dist/agents/multimodal-looker.js +70 -0
  81. package/dist/agents/multimodal-looker.js.map +1 -0
  82. package/dist/agents/oracle.d.ts +13 -0
  83. package/dist/agents/oracle.d.ts.map +1 -0
  84. package/dist/agents/oracle.js +191 -0
  85. package/dist/agents/oracle.js.map +1 -0
  86. package/dist/agents/orchestrator-sisyphus.d.ts +11 -0
  87. package/dist/agents/orchestrator-sisyphus.d.ts.map +1 -0
  88. package/dist/agents/orchestrator-sisyphus.js +115 -0
  89. package/dist/agents/orchestrator-sisyphus.js.map +1 -0
  90. package/dist/agents/prometheus.d.ts +12 -0
  91. package/dist/agents/prometheus.d.ts.map +1 -0
  92. package/dist/agents/prometheus.js +195 -0
  93. package/dist/agents/prometheus.js.map +1 -0
  94. package/dist/agents/sisyphus-junior.d.ts +12 -0
  95. package/dist/agents/sisyphus-junior.d.ts.map +1 -0
  96. package/dist/agents/sisyphus-junior.js +93 -0
  97. package/dist/agents/sisyphus-junior.js.map +1 -0
  98. package/dist/cli/analytics.js +0 -0
  99. package/dist/cli/components/CostDashboard.d.ts +15 -0
  100. package/dist/cli/components/CostDashboard.d.ts.map +1 -0
  101. package/dist/cli/components/CostDashboard.js +15 -0
  102. package/dist/cli/components/CostDashboard.js.map +1 -0
  103. package/dist/cli/components/LiveStats.d.ts +16 -0
  104. package/dist/cli/components/LiveStats.d.ts.map +1 -0
  105. package/dist/cli/components/LiveStats.js +16 -0
  106. package/dist/cli/components/LiveStats.js.map +1 -0
  107. package/dist/cli/components/SessionBrowser.d.ts +14 -0
  108. package/dist/cli/components/SessionBrowser.d.ts.map +1 -0
  109. package/dist/cli/components/SessionBrowser.js +14 -0
  110. package/dist/cli/components/SessionBrowser.js.map +1 -0
  111. package/dist/cli/index.js +0 -0
  112. package/dist/cli/tui.d.ts +21 -0
  113. package/dist/cli/tui.d.ts.map +1 -0
  114. package/dist/cli/tui.js +21 -0
  115. package/dist/cli/tui.js.map +1 -0
  116. package/dist/compatibility/discovery.d.ts.map +1 -1
  117. package/dist/compatibility/discovery.js +3 -1
  118. package/dist/compatibility/discovery.js.map +1 -1
  119. package/dist/hooks/autopilot/prompts.d.ts.map +1 -1
  120. package/dist/hooks/autopilot/prompts.js +17 -3
  121. package/dist/hooks/autopilot/prompts.js.map +1 -1
  122. package/dist/hooks/autopilot/signals.d.ts +20 -0
  123. package/dist/hooks/autopilot/signals.d.ts.map +1 -0
  124. package/dist/hooks/autopilot/signals.js +75 -0
  125. package/dist/hooks/autopilot/signals.js.map +1 -0
  126. package/dist/hooks/autopilot/summary.d.ts +27 -0
  127. package/dist/hooks/autopilot/summary.d.ts.map +1 -0
  128. package/dist/hooks/autopilot/summary.js +160 -0
  129. package/dist/hooks/autopilot/summary.js.map +1 -0
  130. package/dist/hooks/autopilot/transition.d.ts +39 -0
  131. package/dist/hooks/autopilot/transition.d.ts.map +1 -0
  132. package/dist/hooks/autopilot/transition.js +216 -0
  133. package/dist/hooks/autopilot/transition.js.map +1 -0
  134. package/dist/hooks/context-window-limit-recovery/constants.d.ts +28 -0
  135. package/dist/hooks/context-window-limit-recovery/constants.d.ts.map +1 -0
  136. package/dist/hooks/context-window-limit-recovery/constants.js +85 -0
  137. package/dist/hooks/context-window-limit-recovery/constants.js.map +1 -0
  138. package/dist/hooks/context-window-limit-recovery/index.d.ts +62 -0
  139. package/dist/hooks/context-window-limit-recovery/index.d.ts.map +1 -0
  140. package/dist/hooks/context-window-limit-recovery/index.js +201 -0
  141. package/dist/hooks/context-window-limit-recovery/index.js.map +1 -0
  142. package/dist/hooks/context-window-limit-recovery/parser.d.ts +31 -0
  143. package/dist/hooks/context-window-limit-recovery/parser.d.ts.map +1 -0
  144. package/dist/hooks/context-window-limit-recovery/parser.js +241 -0
  145. package/dist/hooks/context-window-limit-recovery/parser.js.map +1 -0
  146. package/dist/hooks/context-window-limit-recovery/types.d.ts +84 -0
  147. package/dist/hooks/context-window-limit-recovery/types.d.ts.map +1 -0
  148. package/dist/hooks/context-window-limit-recovery/types.js +34 -0
  149. package/dist/hooks/context-window-limit-recovery/types.js.map +1 -0
  150. package/dist/hooks/edit-error-recovery/index.d.ts +62 -0
  151. package/dist/hooks/edit-error-recovery/index.d.ts.map +1 -0
  152. package/dist/hooks/edit-error-recovery/index.js +89 -0
  153. package/dist/hooks/edit-error-recovery/index.js.map +1 -0
  154. package/dist/hooks/github-auto-responder/classifier.d.ts +43 -0
  155. package/dist/hooks/github-auto-responder/classifier.d.ts.map +1 -0
  156. package/dist/hooks/github-auto-responder/classifier.js +150 -0
  157. package/dist/hooks/github-auto-responder/classifier.js.map +1 -0
  158. package/dist/hooks/github-auto-responder/config.d.ts +109 -0
  159. package/dist/hooks/github-auto-responder/config.d.ts.map +1 -0
  160. package/dist/hooks/github-auto-responder/config.js +69 -0
  161. package/dist/hooks/github-auto-responder/config.js.map +1 -0
  162. package/dist/hooks/github-auto-responder/constants.d.ts +45 -0
  163. package/dist/hooks/github-auto-responder/constants.d.ts.map +1 -0
  164. package/dist/hooks/github-auto-responder/constants.js +60 -0
  165. package/dist/hooks/github-auto-responder/constants.js.map +1 -0
  166. package/dist/hooks/github-auto-responder/filters.d.ts +95 -0
  167. package/dist/hooks/github-auto-responder/filters.d.ts.map +1 -0
  168. package/dist/hooks/github-auto-responder/filters.js +174 -0
  169. package/dist/hooks/github-auto-responder/filters.js.map +1 -0
  170. package/dist/hooks/github-auto-responder/github-client.d.ts +65 -0
  171. package/dist/hooks/github-auto-responder/github-client.d.ts.map +1 -0
  172. package/dist/hooks/github-auto-responder/github-client.js +128 -0
  173. package/dist/hooks/github-auto-responder/github-client.js.map +1 -0
  174. package/dist/hooks/github-auto-responder/idempotency.d.ts +68 -0
  175. package/dist/hooks/github-auto-responder/idempotency.d.ts.map +1 -0
  176. package/dist/hooks/github-auto-responder/idempotency.js +147 -0
  177. package/dist/hooks/github-auto-responder/idempotency.js.map +1 -0
  178. package/dist/hooks/github-auto-responder/index.d.ts +140 -0
  179. package/dist/hooks/github-auto-responder/index.d.ts.map +1 -0
  180. package/dist/hooks/github-auto-responder/index.js +145 -0
  181. package/dist/hooks/github-auto-responder/index.js.map +1 -0
  182. package/dist/hooks/github-auto-responder/persona.d.ts +40 -0
  183. package/dist/hooks/github-auto-responder/persona.d.ts.map +1 -0
  184. package/dist/hooks/github-auto-responder/persona.js +99 -0
  185. package/dist/hooks/github-auto-responder/persona.js.map +1 -0
  186. package/dist/hooks/github-auto-responder/responder.d.ts +122 -0
  187. package/dist/hooks/github-auto-responder/responder.d.ts.map +1 -0
  188. package/dist/hooks/github-auto-responder/responder.js +264 -0
  189. package/dist/hooks/github-auto-responder/responder.js.map +1 -0
  190. package/dist/hooks/github-auto-responder/server.d.ts +140 -0
  191. package/dist/hooks/github-auto-responder/server.d.ts.map +1 -0
  192. package/dist/hooks/github-auto-responder/server.js +301 -0
  193. package/dist/hooks/github-auto-responder/server.js.map +1 -0
  194. package/dist/hooks/github-auto-responder/signature.d.ts +34 -0
  195. package/dist/hooks/github-auto-responder/signature.d.ts.map +1 -0
  196. package/dist/hooks/github-auto-responder/signature.js +79 -0
  197. package/dist/hooks/github-auto-responder/signature.js.map +1 -0
  198. package/dist/hooks/github-auto-responder/templates.d.ts +16 -0
  199. package/dist/hooks/github-auto-responder/templates.d.ts.map +1 -0
  200. package/dist/hooks/github-auto-responder/templates.js +93 -0
  201. package/dist/hooks/github-auto-responder/templates.js.map +1 -0
  202. package/dist/hooks/github-auto-responder/types.d.ts +246 -0
  203. package/dist/hooks/github-auto-responder/types.d.ts.map +1 -0
  204. package/dist/hooks/github-auto-responder/types.js +7 -0
  205. package/dist/hooks/github-auto-responder/types.js.map +1 -0
  206. package/dist/hooks/learned-skills/config.d.ts +53 -0
  207. package/dist/hooks/learned-skills/config.d.ts.map +1 -0
  208. package/dist/hooks/learned-skills/config.js +103 -0
  209. package/dist/hooks/learned-skills/config.js.map +1 -0
  210. package/dist/hooks/learned-skills/constants.d.ts +24 -0
  211. package/dist/hooks/learned-skills/constants.d.ts.map +1 -0
  212. package/dist/hooks/learned-skills/constants.js +26 -0
  213. package/dist/hooks/learned-skills/constants.js.map +1 -0
  214. package/dist/hooks/learned-skills/detection-hook.d.ts +39 -0
  215. package/dist/hooks/learned-skills/detection-hook.d.ts.map +1 -0
  216. package/dist/hooks/learned-skills/detection-hook.js +83 -0
  217. package/dist/hooks/learned-skills/detection-hook.js.map +1 -0
  218. package/dist/hooks/learned-skills/detector.d.ts +30 -0
  219. package/dist/hooks/learned-skills/detector.d.ts.map +1 -0
  220. package/dist/hooks/learned-skills/detector.js +150 -0
  221. package/dist/hooks/learned-skills/detector.js.map +1 -0
  222. package/dist/hooks/learned-skills/finder.d.ts +21 -0
  223. package/dist/hooks/learned-skills/finder.d.ts.map +1 -0
  224. package/dist/hooks/learned-skills/finder.js +117 -0
  225. package/dist/hooks/learned-skills/finder.js.map +1 -0
  226. package/dist/hooks/learned-skills/index.d.ts +62 -0
  227. package/dist/hooks/learned-skills/index.d.ts.map +1 -0
  228. package/dist/hooks/learned-skills/index.js +137 -0
  229. package/dist/hooks/learned-skills/index.js.map +1 -0
  230. package/dist/hooks/learned-skills/loader.d.ts +20 -0
  231. package/dist/hooks/learned-skills/loader.d.ts.map +1 -0
  232. package/dist/hooks/learned-skills/loader.js +107 -0
  233. package/dist/hooks/learned-skills/loader.js.map +1 -0
  234. package/dist/hooks/learned-skills/parser.d.ts +21 -0
  235. package/dist/hooks/learned-skills/parser.d.ts.map +1 -0
  236. package/dist/hooks/learned-skills/parser.js +190 -0
  237. package/dist/hooks/learned-skills/parser.js.map +1 -0
  238. package/dist/hooks/learned-skills/promotion.d.ts +29 -0
  239. package/dist/hooks/learned-skills/promotion.d.ts.map +1 -0
  240. package/dist/hooks/learned-skills/promotion.js +87 -0
  241. package/dist/hooks/learned-skills/promotion.js.map +1 -0
  242. package/dist/hooks/learned-skills/types.d.ts +109 -0
  243. package/dist/hooks/learned-skills/types.d.ts.map +1 -0
  244. package/dist/hooks/learned-skills/types.js +8 -0
  245. package/dist/hooks/learned-skills/types.js.map +1 -0
  246. package/dist/hooks/learned-skills/validator.d.ts +15 -0
  247. package/dist/hooks/learned-skills/validator.d.ts.map +1 -0
  248. package/dist/hooks/learned-skills/validator.js +87 -0
  249. package/dist/hooks/learned-skills/validator.js.map +1 -0
  250. package/dist/hooks/learned-skills/writer.d.ts +27 -0
  251. package/dist/hooks/learned-skills/writer.d.ts.map +1 -0
  252. package/dist/hooks/learned-skills/writer.js +126 -0
  253. package/dist/hooks/learned-skills/writer.js.map +1 -0
  254. package/dist/hooks/mnemosyne/config.d.ts +53 -0
  255. package/dist/hooks/mnemosyne/config.d.ts.map +1 -0
  256. package/dist/hooks/mnemosyne/config.js +103 -0
  257. package/dist/hooks/mnemosyne/config.js.map +1 -0
  258. package/dist/hooks/mnemosyne/constants.d.ts +24 -0
  259. package/dist/hooks/mnemosyne/constants.d.ts.map +1 -0
  260. package/dist/hooks/mnemosyne/constants.js +26 -0
  261. package/dist/hooks/mnemosyne/constants.js.map +1 -0
  262. package/dist/hooks/mnemosyne/detection-hook.d.ts +39 -0
  263. package/dist/hooks/mnemosyne/detection-hook.d.ts.map +1 -0
  264. package/dist/hooks/mnemosyne/detection-hook.js +83 -0
  265. package/dist/hooks/mnemosyne/detection-hook.js.map +1 -0
  266. package/dist/hooks/mnemosyne/detector.d.ts +30 -0
  267. package/dist/hooks/mnemosyne/detector.d.ts.map +1 -0
  268. package/dist/hooks/mnemosyne/detector.js +150 -0
  269. package/dist/hooks/mnemosyne/detector.js.map +1 -0
  270. package/dist/hooks/mnemosyne/finder.d.ts +21 -0
  271. package/dist/hooks/mnemosyne/finder.d.ts.map +1 -0
  272. package/dist/hooks/mnemosyne/finder.js +117 -0
  273. package/dist/hooks/mnemosyne/finder.js.map +1 -0
  274. package/dist/hooks/mnemosyne/index.d.ts +62 -0
  275. package/dist/hooks/mnemosyne/index.d.ts.map +1 -0
  276. package/dist/hooks/mnemosyne/index.js +137 -0
  277. package/dist/hooks/mnemosyne/index.js.map +1 -0
  278. package/dist/hooks/mnemosyne/loader.d.ts +20 -0
  279. package/dist/hooks/mnemosyne/loader.d.ts.map +1 -0
  280. package/dist/hooks/mnemosyne/loader.js +113 -0
  281. package/dist/hooks/mnemosyne/loader.js.map +1 -0
  282. package/dist/hooks/mnemosyne/parser.d.ts +21 -0
  283. package/dist/hooks/mnemosyne/parser.d.ts.map +1 -0
  284. package/dist/hooks/mnemosyne/parser.js +190 -0
  285. package/dist/hooks/mnemosyne/parser.js.map +1 -0
  286. package/dist/hooks/mnemosyne/promotion.d.ts +29 -0
  287. package/dist/hooks/mnemosyne/promotion.d.ts.map +1 -0
  288. package/dist/hooks/mnemosyne/promotion.js +87 -0
  289. package/dist/hooks/mnemosyne/promotion.js.map +1 -0
  290. package/dist/hooks/mnemosyne/types.d.ts +109 -0
  291. package/dist/hooks/mnemosyne/types.d.ts.map +1 -0
  292. package/dist/hooks/mnemosyne/types.js +8 -0
  293. package/dist/hooks/mnemosyne/types.js.map +1 -0
  294. package/dist/hooks/mnemosyne/validator.d.ts +15 -0
  295. package/dist/hooks/mnemosyne/validator.d.ts.map +1 -0
  296. package/dist/hooks/mnemosyne/validator.js +87 -0
  297. package/dist/hooks/mnemosyne/validator.js.map +1 -0
  298. package/dist/hooks/mnemosyne/writer.d.ts +27 -0
  299. package/dist/hooks/mnemosyne/writer.d.ts.map +1 -0
  300. package/dist/hooks/mnemosyne/writer.js +126 -0
  301. package/dist/hooks/mnemosyne/writer.js.map +1 -0
  302. package/dist/hooks/ralph-loop/index.d.ts +116 -0
  303. package/dist/hooks/ralph-loop/index.d.ts.map +1 -0
  304. package/dist/hooks/ralph-loop/index.js +322 -0
  305. package/dist/hooks/ralph-loop/index.js.map +1 -0
  306. package/dist/hooks/ralph-prd/index.d.ts +130 -0
  307. package/dist/hooks/ralph-prd/index.d.ts.map +1 -0
  308. package/dist/hooks/ralph-prd/index.js +310 -0
  309. package/dist/hooks/ralph-prd/index.js.map +1 -0
  310. package/dist/hooks/ralph-progress/index.d.ts +102 -0
  311. package/dist/hooks/ralph-progress/index.d.ts.map +1 -0
  312. package/dist/hooks/ralph-progress/index.js +408 -0
  313. package/dist/hooks/ralph-progress/index.js.map +1 -0
  314. package/dist/hooks/ralph-verifier/index.d.ts +72 -0
  315. package/dist/hooks/ralph-verifier/index.d.ts.map +1 -0
  316. package/dist/hooks/ralph-verifier/index.js +223 -0
  317. package/dist/hooks/ralph-verifier/index.js.map +1 -0
  318. package/dist/hooks/session-recovery/constants.d.ts +56 -0
  319. package/dist/hooks/session-recovery/constants.d.ts.map +1 -0
  320. package/dist/hooks/session-recovery/constants.js +78 -0
  321. package/dist/hooks/session-recovery/constants.js.map +1 -0
  322. package/dist/hooks/session-recovery/index.d.ts +53 -0
  323. package/dist/hooks/session-recovery/index.d.ts.map +1 -0
  324. package/dist/hooks/session-recovery/index.js +321 -0
  325. package/dist/hooks/session-recovery/index.js.map +1 -0
  326. package/dist/hooks/session-recovery/storage.d.ts +76 -0
  327. package/dist/hooks/session-recovery/storage.d.ts.map +1 -0
  328. package/dist/hooks/session-recovery/storage.js +383 -0
  329. package/dist/hooks/session-recovery/storage.js.map +1 -0
  330. package/dist/hooks/session-recovery/types.d.ts +145 -0
  331. package/dist/hooks/session-recovery/types.d.ts.map +1 -0
  332. package/dist/hooks/session-recovery/types.js +8 -0
  333. package/dist/hooks/session-recovery/types.js.map +1 -0
  334. package/dist/hooks/sisyphus-orchestrator/constants.d.ts +23 -0
  335. package/dist/hooks/sisyphus-orchestrator/constants.d.ts.map +1 -0
  336. package/dist/hooks/sisyphus-orchestrator/constants.js +142 -0
  337. package/dist/hooks/sisyphus-orchestrator/constants.js.map +1 -0
  338. package/dist/hooks/sisyphus-orchestrator/index.d.ts +113 -0
  339. package/dist/hooks/sisyphus-orchestrator/index.d.ts.map +1 -0
  340. package/dist/hooks/sisyphus-orchestrator/index.js +309 -0
  341. package/dist/hooks/sisyphus-orchestrator/index.js.map +1 -0
  342. package/dist/hooks/ultraqa-loop/index.d.ts +94 -0
  343. package/dist/hooks/ultraqa-loop/index.d.ts.map +1 -0
  344. package/dist/hooks/ultraqa-loop/index.js +216 -0
  345. package/dist/hooks/ultraqa-loop/index.js.map +1 -0
  346. package/dist/hooks/ultrawork-state/index.d.ts +62 -0
  347. package/dist/hooks/ultrawork-state/index.d.ts.map +1 -0
  348. package/dist/hooks/ultrawork-state/index.js +208 -0
  349. package/dist/hooks/ultrawork-state/index.js.map +1 -0
  350. package/dist/hud/sisyphus-state.d.ts +31 -0
  351. package/dist/hud/sisyphus-state.d.ts.map +1 -0
  352. package/dist/hud/sisyphus-state.js +163 -0
  353. package/dist/hud/sisyphus-state.js.map +1 -0
  354. package/dist/installer/index.d.ts +1 -1
  355. package/dist/installer/index.js +1 -1
  356. package/package.json +1 -1
  357. package/scripts/github-webhook-server.ts +141 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/hooks/github-auto-responder/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Constants for GitHub Auto-Responder
3
+ */
4
+ import type { PersonaConfig } from './types.js';
5
+ /**
6
+ * Default persona configuration for auto-responses
7
+ */
8
+ export declare const DEFAULT_PERSONA: PersonaConfig;
9
+ /**
10
+ * Labels that prevent auto-reply
11
+ */
12
+ export declare const DEFAULT_SKIP_LABELS: string[];
13
+ /**
14
+ * Patterns for spam detection
15
+ */
16
+ export declare const DEFAULT_SPAM_PATTERNS: RegExp[];
17
+ /**
18
+ * GitHub API base URL
19
+ */
20
+ export declare const GITHUB_API_BASE = "https://api.github.com";
21
+ /**
22
+ * Anthropic API endpoint
23
+ */
24
+ export declare const ANTHROPIC_API_URL = "https://api.anthropic.com/v1/messages";
25
+ /**
26
+ * Default server port
27
+ */
28
+ export declare const DEFAULT_PORT = 3000;
29
+ /**
30
+ * Default LLM model for responses
31
+ */
32
+ export declare const DEFAULT_LLM_MODEL = "claude-sonnet-4-20250514";
33
+ /**
34
+ * Maximum tokens for LLM response
35
+ */
36
+ export declare const DEFAULT_MAX_RESPONSE_TOKENS = 500;
37
+ /**
38
+ * Response timeout in milliseconds
39
+ */
40
+ export declare const RESPONSE_TIMEOUT_MS = 8000;
41
+ /**
42
+ * Idempotency key TTL (24 hours)
43
+ */
44
+ export declare const IDEMPOTENCY_TTL_MS: number;
45
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/hooks/github-auto-responder/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,aAM7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,UAAkC,CAAC;AAEnE;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,EAYzC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,2BAA2B,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,iBAAiB,0CAA0C,CAAC;AAEzE;;GAEG;AACH,eAAO,MAAM,YAAY,OAAO,CAAC;AAEjC;;GAEG;AACH,eAAO,MAAM,iBAAiB,6BAA6B,CAAC;AAE5D;;GAEG;AACH,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAE/C;;GAEG;AACH,eAAO,MAAM,mBAAmB,OAAO,CAAC;AAExC;;GAEG;AACH,eAAO,MAAM,kBAAkB,QAAsB,CAAC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Constants for GitHub Auto-Responder
3
+ */
4
+ /**
5
+ * Default persona configuration for auto-responses
6
+ */
7
+ export const DEFAULT_PERSONA = {
8
+ tone: 'direct',
9
+ technicalDepth: 'high',
10
+ language: 'ko-mix', // Korean/English blend
11
+ signatureEmoji: '🦞',
12
+ maintainerName: 'Yeachan Heo',
13
+ };
14
+ /**
15
+ * Labels that prevent auto-reply
16
+ */
17
+ export const DEFAULT_SKIP_LABELS = ['no-auto-reply', 'bot-ignore'];
18
+ /**
19
+ * Patterns for spam detection
20
+ */
21
+ export const DEFAULT_SPAM_PATTERNS = [
22
+ // ALL CAPS patterns (ignoring short acronyms)
23
+ /\b[A-Z]{10,}\b/,
24
+ /^[A-Z\s!?]{50,}$/,
25
+ // Excessive links (5+ URLs in a comment)
26
+ /(?:https?:\/\/[^\s]+.*?){5,}/,
27
+ // Known spam phrases
28
+ /\b(?:click here now|buy now|limited time offer|act now|free money|winner|congratulations you won)\b/i,
29
+ /\b(?:earn \$\d+|make money fast|work from home|100% free|risk free)\b/i,
30
+ /\b(?:casino|viagra|cialis|lottery|pills)\b/i,
31
+ ];
32
+ /**
33
+ * GitHub API base URL
34
+ */
35
+ export const GITHUB_API_BASE = 'https://api.github.com';
36
+ /**
37
+ * Anthropic API endpoint
38
+ */
39
+ export const ANTHROPIC_API_URL = 'https://api.anthropic.com/v1/messages';
40
+ /**
41
+ * Default server port
42
+ */
43
+ export const DEFAULT_PORT = 3000;
44
+ /**
45
+ * Default LLM model for responses
46
+ */
47
+ export const DEFAULT_LLM_MODEL = 'claude-sonnet-4-20250514';
48
+ /**
49
+ * Maximum tokens for LLM response
50
+ */
51
+ export const DEFAULT_MAX_RESPONSE_TOKENS = 500;
52
+ /**
53
+ * Response timeout in milliseconds
54
+ */
55
+ export const RESPONSE_TIMEOUT_MS = 8000;
56
+ /**
57
+ * Idempotency key TTL (24 hours)
58
+ */
59
+ export const IDEMPOTENCY_TTL_MS = 24 * 60 * 60 * 1000;
60
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/hooks/github-auto-responder/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAkB;IAC5C,IAAI,EAAE,QAAQ;IACd,cAAc,EAAE,MAAM;IACtB,QAAQ,EAAE,QAAQ,EAAE,uBAAuB;IAC3C,cAAc,EAAE,IAAI;IACpB,cAAc,EAAE,aAAa;CAC9B,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;AAEnE;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAa;IAC7C,8CAA8C;IAC9C,gBAAgB;IAChB,kBAAkB;IAElB,yCAAyC;IACzC,8BAA8B;IAE9B,qBAAqB;IACrB,sGAAsG;IACtG,wEAAwE;IACxE,6CAA6C;CAC9C,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,wBAAwB,CAAC;AAExD;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,uCAAuC,CAAC;AAEzE;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC;AAEjC;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,0BAA0B,CAAC;AAE5D;;GAEG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,GAAG,CAAC;AAE/C;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAExC;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Filter pipeline for GitHub webhook payloads
3
+ *
4
+ * Filters determine whether to skip responding to an issue or PR based on:
5
+ * - Bot detection
6
+ * - Self-response prevention
7
+ * - Label-based skipping
8
+ * - Spam detection
9
+ * - Action filtering (only 'opened' events)
10
+ */
11
+ import type { WebhookPayload, FilterResult, GitHubIssuePayload, GitHubPRPayload } from './types.js';
12
+ /**
13
+ * Type guard: Check if payload is an issue payload
14
+ *
15
+ * @param payload - Webhook payload
16
+ * @returns True if payload contains an issue
17
+ */
18
+ export declare function isIssuePayload(payload: WebhookPayload): payload is GitHubIssuePayload;
19
+ /**
20
+ * Type guard: Check if payload is a pull request payload
21
+ *
22
+ * @param payload - Webhook payload
23
+ * @returns True if payload contains a pull request
24
+ */
25
+ export declare function isPRPayload(payload: WebhookPayload): payload is GitHubPRPayload;
26
+ /**
27
+ * Filter: Skip bot-generated events
28
+ *
29
+ * @param payload - Webhook payload
30
+ * @returns Filter result (skip if sender is a bot)
31
+ */
32
+ export declare function filterBot(payload: WebhookPayload): FilterResult;
33
+ /**
34
+ * Filter: Skip self-generated events
35
+ *
36
+ * @param payload - Webhook payload
37
+ * @param selfLogin - Bot's own GitHub username
38
+ * @returns Filter result (skip if sender is self)
39
+ */
40
+ export declare function filterSelf(payload: WebhookPayload, selfLogin: string): FilterResult;
41
+ /**
42
+ * Filter: Skip issues/PRs with excluded labels
43
+ *
44
+ * @param payload - Webhook payload
45
+ * @param skipLabels - Labels that prevent auto-response
46
+ * @returns Filter result (skip if any skip label is present)
47
+ */
48
+ export declare function filterLabel(payload: WebhookPayload, skipLabels: string[]): FilterResult;
49
+ /**
50
+ * Filter: Skip spam-like content
51
+ *
52
+ * @param payload - Webhook payload
53
+ * @param spamPatterns - Regex patterns to detect spam
54
+ * @returns Filter result (skip if title or body matches spam pattern)
55
+ */
56
+ export declare function filterSpam(payload: WebhookPayload, spamPatterns: RegExp[]): FilterResult;
57
+ /**
58
+ * Filter: Skip non-opened actions
59
+ *
60
+ * Only respond to newly opened issues and PRs.
61
+ *
62
+ * @param payload - Webhook payload
63
+ * @returns Filter result (skip if action is not 'opened')
64
+ */
65
+ export declare function filterAction(payload: WebhookPayload): FilterResult;
66
+ /**
67
+ * Create a filter pipeline that runs all filters in sequence
68
+ *
69
+ * Filters are run in order:
70
+ * 1. Bot check
71
+ * 2. Self check
72
+ * 3. Action check (only 'opened')
73
+ * 4. Label check
74
+ * 5. Spam check
75
+ *
76
+ * Pipeline short-circuits on first skip (returns immediately).
77
+ *
78
+ * @param selfLogin - Bot's own GitHub username
79
+ * @param skipLabels - Labels that prevent auto-response
80
+ * @param spamPatterns - Spam detection patterns (defaults to DEFAULT_SPAM_PATTERNS)
81
+ * @returns Filter function that returns skip decision
82
+ *
83
+ * @example
84
+ * ```typescript
85
+ * const filter = createFilterPipeline('my-bot', ['no-auto-reply']);
86
+ * const result = await filter(payload);
87
+ * if (result.skip) {
88
+ * console.log('Skipping:', result.reason);
89
+ * return;
90
+ * }
91
+ * // Process payload...
92
+ * ```
93
+ */
94
+ export declare function createFilterPipeline(selfLogin: string, skipLabels: string[], spamPatterns?: RegExp[]): (payload: WebhookPayload) => Promise<FilterResult>;
95
+ //# sourceMappingURL=filters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../../src/hooks/github-auto-responder/filters.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,YAAY,EACZ,kBAAkB,EAClB,eAAe,EAChB,MAAM,YAAY,CAAC;AAGpB;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,cAAc,GACtB,OAAO,IAAI,kBAAkB,CAE/B;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,cAAc,GACtB,OAAO,IAAI,eAAe,CAE5B;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,YAAY,CAS/D;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,MAAM,GAChB,YAAY,CASd;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,cAAc,EACvB,UAAU,EAAE,MAAM,EAAE,GACnB,YAAY,CAed;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,cAAc,EACvB,YAAY,EAAE,MAAM,EAAE,GACrB,YAAY,CAsBd;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,YAAY,CASlE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAAE,EACpB,YAAY,GAAE,MAAM,EAA0B,GAC7C,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,YAAY,CAAC,CAqBpD"}
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Filter pipeline for GitHub webhook payloads
3
+ *
4
+ * Filters determine whether to skip responding to an issue or PR based on:
5
+ * - Bot detection
6
+ * - Self-response prevention
7
+ * - Label-based skipping
8
+ * - Spam detection
9
+ * - Action filtering (only 'opened' events)
10
+ */
11
+ import { DEFAULT_SPAM_PATTERNS } from './constants.js';
12
+ /**
13
+ * Type guard: Check if payload is an issue payload
14
+ *
15
+ * @param payload - Webhook payload
16
+ * @returns True if payload contains an issue
17
+ */
18
+ export function isIssuePayload(payload) {
19
+ return 'issue' in payload;
20
+ }
21
+ /**
22
+ * Type guard: Check if payload is a pull request payload
23
+ *
24
+ * @param payload - Webhook payload
25
+ * @returns True if payload contains a pull request
26
+ */
27
+ export function isPRPayload(payload) {
28
+ return 'pull_request' in payload;
29
+ }
30
+ /**
31
+ * Filter: Skip bot-generated events
32
+ *
33
+ * @param payload - Webhook payload
34
+ * @returns Filter result (skip if sender is a bot)
35
+ */
36
+ export function filterBot(payload) {
37
+ if (payload.sender.type === 'Bot') {
38
+ return {
39
+ skip: true,
40
+ reason: `Sender is a bot (${payload.sender.login})`,
41
+ };
42
+ }
43
+ return { skip: false, reason: '' };
44
+ }
45
+ /**
46
+ * Filter: Skip self-generated events
47
+ *
48
+ * @param payload - Webhook payload
49
+ * @param selfLogin - Bot's own GitHub username
50
+ * @returns Filter result (skip if sender is self)
51
+ */
52
+ export function filterSelf(payload, selfLogin) {
53
+ if (payload.sender.login === selfLogin) {
54
+ return {
55
+ skip: true,
56
+ reason: `Sender is self (${selfLogin})`,
57
+ };
58
+ }
59
+ return { skip: false, reason: '' };
60
+ }
61
+ /**
62
+ * Filter: Skip issues/PRs with excluded labels
63
+ *
64
+ * @param payload - Webhook payload
65
+ * @param skipLabels - Labels that prevent auto-response
66
+ * @returns Filter result (skip if any skip label is present)
67
+ */
68
+ export function filterLabel(payload, skipLabels) {
69
+ const labels = isIssuePayload(payload)
70
+ ? payload.issue.labels
71
+ : payload.pull_request.labels;
72
+ for (const label of labels) {
73
+ if (skipLabels.includes(label.name)) {
74
+ return {
75
+ skip: true,
76
+ reason: `Has skip label: ${label.name}`,
77
+ };
78
+ }
79
+ }
80
+ return { skip: false, reason: '' };
81
+ }
82
+ /**
83
+ * Filter: Skip spam-like content
84
+ *
85
+ * @param payload - Webhook payload
86
+ * @param spamPatterns - Regex patterns to detect spam
87
+ * @returns Filter result (skip if title or body matches spam pattern)
88
+ */
89
+ export function filterSpam(payload, spamPatterns) {
90
+ const item = isIssuePayload(payload) ? payload.issue : payload.pull_request;
91
+ const title = item.title;
92
+ const body = item.body ?? '';
93
+ for (const pattern of spamPatterns) {
94
+ if (pattern.test(title)) {
95
+ return {
96
+ skip: true,
97
+ reason: `Title matches spam pattern: ${pattern}`,
98
+ };
99
+ }
100
+ if (pattern.test(body)) {
101
+ return {
102
+ skip: true,
103
+ reason: `Body matches spam pattern: ${pattern}`,
104
+ };
105
+ }
106
+ }
107
+ return { skip: false, reason: '' };
108
+ }
109
+ /**
110
+ * Filter: Skip non-opened actions
111
+ *
112
+ * Only respond to newly opened issues and PRs.
113
+ *
114
+ * @param payload - Webhook payload
115
+ * @returns Filter result (skip if action is not 'opened')
116
+ */
117
+ export function filterAction(payload) {
118
+ if (payload.action !== 'opened') {
119
+ return {
120
+ skip: true,
121
+ reason: `Action is not 'opened': ${payload.action}`,
122
+ };
123
+ }
124
+ return { skip: false, reason: '' };
125
+ }
126
+ /**
127
+ * Create a filter pipeline that runs all filters in sequence
128
+ *
129
+ * Filters are run in order:
130
+ * 1. Bot check
131
+ * 2. Self check
132
+ * 3. Action check (only 'opened')
133
+ * 4. Label check
134
+ * 5. Spam check
135
+ *
136
+ * Pipeline short-circuits on first skip (returns immediately).
137
+ *
138
+ * @param selfLogin - Bot's own GitHub username
139
+ * @param skipLabels - Labels that prevent auto-response
140
+ * @param spamPatterns - Spam detection patterns (defaults to DEFAULT_SPAM_PATTERNS)
141
+ * @returns Filter function that returns skip decision
142
+ *
143
+ * @example
144
+ * ```typescript
145
+ * const filter = createFilterPipeline('my-bot', ['no-auto-reply']);
146
+ * const result = await filter(payload);
147
+ * if (result.skip) {
148
+ * console.log('Skipping:', result.reason);
149
+ * return;
150
+ * }
151
+ * // Process payload...
152
+ * ```
153
+ */
154
+ export function createFilterPipeline(selfLogin, skipLabels, spamPatterns = DEFAULT_SPAM_PATTERNS) {
155
+ return async (payload) => {
156
+ // Run filters in sequence, short-circuit on first skip
157
+ const filters = [
158
+ () => filterBot(payload),
159
+ () => filterSelf(payload, selfLogin),
160
+ () => filterAction(payload),
161
+ () => filterLabel(payload, skipLabels),
162
+ () => filterSpam(payload, spamPatterns),
163
+ ];
164
+ for (const filter of filters) {
165
+ const result = filter();
166
+ if (result.skip) {
167
+ return result;
168
+ }
169
+ }
170
+ // All filters passed
171
+ return { skip: false, reason: '' };
172
+ };
173
+ }
174
+ //# sourceMappingURL=filters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.js","sourceRoot":"","sources":["../../../src/hooks/github-auto-responder/filters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * GitHub REST API Client
3
+ *
4
+ * Client for making authenticated GitHub API calls with rate limiting support.
5
+ */
6
+ import type { CommentResult } from './types.js';
7
+ /**
8
+ * GitHub REST API client with authentication and rate limiting
9
+ */
10
+ export declare class GitHubClient {
11
+ private token;
12
+ /**
13
+ * Create a new GitHub API client
14
+ * @param token - GitHub personal access token
15
+ */
16
+ constructor(token: string);
17
+ /**
18
+ * Make an authenticated GitHub API request
19
+ * @param method - HTTP method
20
+ * @param path - API endpoint path (e.g., '/repos/owner/repo/issues')
21
+ * @param body - Request body (for POST/PATCH)
22
+ * @returns Response JSON
23
+ */
24
+ private request;
25
+ /**
26
+ * Post a comment on a GitHub issue
27
+ * @param repo - Repository in format 'owner/name'
28
+ * @param issueNumber - Issue number
29
+ * @param body - Comment body (markdown supported)
30
+ * @returns Result with success status and comment URL
31
+ */
32
+ postIssueComment(repo: string, issueNumber: number, body: string): Promise<CommentResult>;
33
+ /**
34
+ * Post a comment on a GitHub pull request
35
+ * (Uses same endpoint as issues since PRs are issues)
36
+ * @param repo - Repository in format 'owner/name'
37
+ * @param prNumber - Pull request number
38
+ * @param body - Comment body (markdown supported)
39
+ * @returns Result with success status and comment URL
40
+ */
41
+ postPRComment(repo: string, prNumber: number, body: string): Promise<CommentResult>;
42
+ /**
43
+ * Add a label to a GitHub issue or pull request
44
+ * @param repo - Repository in format 'owner/name'
45
+ * @param issueNumber - Issue or PR number
46
+ * @param label - Label name to add
47
+ * @returns Success status
48
+ */
49
+ addLabel(repo: string, issueNumber: number, label: string): Promise<boolean>;
50
+ /**
51
+ * Get a GitHub issue or pull request
52
+ * @param repo - Repository in format 'owner/name'
53
+ * @param issueNumber - Issue or PR number
54
+ * @returns Issue/PR data
55
+ */
56
+ getIssue(repo: string, issueNumber: number): Promise<any>;
57
+ /**
58
+ * List comments on a GitHub issue or pull request
59
+ * @param repo - Repository in format 'owner/name'
60
+ * @param issueNumber - Issue or PR number
61
+ * @returns Array of comments
62
+ */
63
+ listComments(repo: string, issueNumber: number): Promise<any[]>;
64
+ }
65
+ //# sourceMappingURL=github-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-client.d.ts","sourceRoot":"","sources":["../../../src/hooks/github-auto-responder/github-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAS;IAEtB;;;OAGG;gBACS,KAAK,EAAE,MAAM;IAIzB;;;;;;OAMG;YACW,OAAO;IAiDrB;;;;;;OAMG;IACG,gBAAgB,CACpB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,aAAa,CAAC;IAoBzB;;;;;;;OAOG;IACG,aAAa,CACjB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,aAAa,CAAC;IAIzB;;;;;;OAMG;IACG,QAAQ,CACZ,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,CAAC;IAcnB;;;;;OAKG;IACG,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAI/D;;;;;OAKG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;CAGtE"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * GitHub REST API Client
3
+ *
4
+ * Client for making authenticated GitHub API calls with rate limiting support.
5
+ */
6
+ import { GITHUB_API_BASE } from './constants.js';
7
+ /**
8
+ * GitHub REST API client with authentication and rate limiting
9
+ */
10
+ export class GitHubClient {
11
+ token;
12
+ /**
13
+ * Create a new GitHub API client
14
+ * @param token - GitHub personal access token
15
+ */
16
+ constructor(token) {
17
+ this.token = token;
18
+ }
19
+ /**
20
+ * Make an authenticated GitHub API request
21
+ * @param method - HTTP method
22
+ * @param path - API endpoint path (e.g., '/repos/owner/repo/issues')
23
+ * @param body - Request body (for POST/PATCH)
24
+ * @returns Response JSON
25
+ */
26
+ async request(method, path, body) {
27
+ const url = `${GITHUB_API_BASE}${path}`;
28
+ const headers = {
29
+ Authorization: `Bearer ${this.token}`,
30
+ Accept: 'application/vnd.github+json',
31
+ 'X-GitHub-Api-Version': '2022-11-28',
32
+ 'User-Agent': 'omc-github-auto-responder',
33
+ };
34
+ if (body) {
35
+ headers['Content-Type'] = 'application/json';
36
+ }
37
+ const response = await fetch(url, {
38
+ method,
39
+ headers,
40
+ body: body ? JSON.stringify(body) : undefined,
41
+ });
42
+ // Handle rate limiting
43
+ if (response.status === 429) {
44
+ const retryAfter = response.headers.get('Retry-After');
45
+ const waitSeconds = retryAfter ? parseInt(retryAfter, 10) : 60;
46
+ throw new Error(`GitHub API rate limit exceeded. Retry after ${waitSeconds} seconds.`);
47
+ }
48
+ // Handle other errors
49
+ if (!response.ok) {
50
+ const errorText = await response.text();
51
+ throw new Error(`GitHub API error (${response.status}): ${errorText || response.statusText}`);
52
+ }
53
+ // Handle 204 No Content
54
+ if (response.status === 204) {
55
+ return null;
56
+ }
57
+ return await response.json();
58
+ }
59
+ /**
60
+ * Post a comment on a GitHub issue
61
+ * @param repo - Repository in format 'owner/name'
62
+ * @param issueNumber - Issue number
63
+ * @param body - Comment body (markdown supported)
64
+ * @returns Result with success status and comment URL
65
+ */
66
+ async postIssueComment(repo, issueNumber, body) {
67
+ try {
68
+ const data = await this.request('POST', `/repos/${repo}/issues/${issueNumber}/comments`, { body });
69
+ return {
70
+ success: true,
71
+ url: data.html_url,
72
+ };
73
+ }
74
+ catch (error) {
75
+ return {
76
+ success: false,
77
+ error: error instanceof Error ? error.message : String(error),
78
+ };
79
+ }
80
+ }
81
+ /**
82
+ * Post a comment on a GitHub pull request
83
+ * (Uses same endpoint as issues since PRs are issues)
84
+ * @param repo - Repository in format 'owner/name'
85
+ * @param prNumber - Pull request number
86
+ * @param body - Comment body (markdown supported)
87
+ * @returns Result with success status and comment URL
88
+ */
89
+ async postPRComment(repo, prNumber, body) {
90
+ return this.postIssueComment(repo, prNumber, body);
91
+ }
92
+ /**
93
+ * Add a label to a GitHub issue or pull request
94
+ * @param repo - Repository in format 'owner/name'
95
+ * @param issueNumber - Issue or PR number
96
+ * @param label - Label name to add
97
+ * @returns Success status
98
+ */
99
+ async addLabel(repo, issueNumber, label) {
100
+ try {
101
+ await this.request('POST', `/repos/${repo}/issues/${issueNumber}/labels`, { labels: [label] });
102
+ return true;
103
+ }
104
+ catch (error) {
105
+ console.error('Failed to add label:', error);
106
+ return false;
107
+ }
108
+ }
109
+ /**
110
+ * Get a GitHub issue or pull request
111
+ * @param repo - Repository in format 'owner/name'
112
+ * @param issueNumber - Issue or PR number
113
+ * @returns Issue/PR data
114
+ */
115
+ async getIssue(repo, issueNumber) {
116
+ return this.request('GET', `/repos/${repo}/issues/${issueNumber}`);
117
+ }
118
+ /**
119
+ * List comments on a GitHub issue or pull request
120
+ * @param repo - Repository in format 'owner/name'
121
+ * @param issueNumber - Issue or PR number
122
+ * @returns Array of comments
123
+ */
124
+ async listComments(repo, issueNumber) {
125
+ return this.request('GET', `/repos/${repo}/issues/${issueNumber}/comments`);
126
+ }
127
+ }
128
+ //# sourceMappingURL=github-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-client.js","sourceRoot":"","sources":["../../../src/hooks/github-auto-responder/github-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGjD;;GAEG;AACH,MAAM,OAAO,YAAY;IACf,KAAK,CAAS;IAEtB;;;OAGG;IACH,YAAY,KAAa;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,OAAO,CACnB,MAAc,EACd,IAAY,EACZ,IAAU;QAEV,MAAM,GAAG,GAAG,GAAG,eAAe,GAAG,IAAI,EAAE,CAAC;QAExC,MAAM,OAAO,GAA2B;YACtC,aAAa,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;YACrC,MAAM,EAAE,6BAA6B;YACrC,sBAAsB,EAAE,YAAY;YACpC,YAAY,EAAE,2BAA2B;SAC1C,CAAC;QAEF,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;QAC/C,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM;YACN,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SAC9C,CAAC,CAAC;QAEH,uBAAuB;QACvB,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YACvD,MAAM,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,MAAM,IAAI,KAAK,CACb,+CAA+C,WAAW,WAAW,CACtE,CAAC;QACJ,CAAC;QAED,sBAAsB;QACtB,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CACb,qBAAqB,QAAQ,CAAC,MAAM,MAAM,SAAS,IAAI,QAAQ,CAAC,UAAU,EAAE,CAC7E,CAAC;QACJ,CAAC;QAED,wBAAwB;QACxB,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC/B,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,gBAAgB,CACpB,IAAY,EACZ,WAAmB,EACnB,IAAY;QAEZ,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAC7B,MAAM,EACN,UAAU,IAAI,WAAW,WAAW,WAAW,EAC/C,EAAE,IAAI,EAAE,CACT,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,GAAG,EAAE,IAAI,CAAC,QAAQ;aACnB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,aAAa,CACjB,IAAY,EACZ,QAAgB,EAChB,IAAY;QAEZ,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IACrD,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,QAAQ,CACZ,IAAY,EACZ,WAAmB,EACnB,KAAa;QAEb,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAChB,MAAM,EACN,UAAU,IAAI,WAAW,WAAW,SAAS,EAC7C,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,CACpB,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;YAC7C,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,WAAmB;QAC9C,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,UAAU,IAAI,WAAW,WAAW,EAAE,CAAC,CAAC;IACrE,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,YAAY,CAAC,IAAY,EAAE,WAAmB;QAClD,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,UAAU,IAAI,WAAW,WAAW,WAAW,CAAC,CAAC;IAC9E,CAAC;CACF"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Idempotency Store for GitHub Auto-Responder
3
+ *
4
+ * SQLite-based deduplication using GitHub delivery IDs.
5
+ * Prevents duplicate webhook processing with automatic cleanup of old records.
6
+ */
7
+ import type { IdempotencyRecord } from './types.js';
8
+ /**
9
+ * SQLite-backed idempotency store for webhook deduplication.
10
+ * Uses GitHub delivery IDs to track processed events.
11
+ */
12
+ export declare class IdempotencyStore {
13
+ private readonly dbPath;
14
+ private db;
15
+ private initialized;
16
+ /**
17
+ * Create a new idempotency store.
18
+ * @param dbPath - Path to SQLite database file
19
+ */
20
+ constructor(dbPath: string);
21
+ /**
22
+ * Initialize the database connection and schema.
23
+ * Dynamically imports better-sqlite3 and creates tables.
24
+ */
25
+ init(): Promise<void>;
26
+ /**
27
+ * Ensure database is initialized before use.
28
+ * @throws {Error} If database is not initialized
29
+ */
30
+ private ensureDb;
31
+ /**
32
+ * Check if a delivery ID has already been processed.
33
+ * @param deliveryId - GitHub webhook delivery ID
34
+ * @returns True if already processed, false otherwise
35
+ */
36
+ isProcessed(deliveryId: string): boolean;
37
+ /**
38
+ * Mark a delivery ID as processed.
39
+ * @param deliveryId - GitHub webhook delivery ID
40
+ */
41
+ markProcessed(deliveryId: string): void;
42
+ /**
43
+ * Remove records older than the TTL.
44
+ * @returns Number of records deleted
45
+ */
46
+ cleanup(): number;
47
+ /**
48
+ * Close the database connection.
49
+ * Safe to call multiple times.
50
+ */
51
+ close(): void;
52
+ /**
53
+ * Get all processed records (for debugging/testing).
54
+ * @returns Array of idempotency records
55
+ */
56
+ getAllRecords(): IdempotencyRecord[];
57
+ /**
58
+ * Get count of processed records.
59
+ * @returns Total number of records in store
60
+ */
61
+ getRecordCount(): number;
62
+ /**
63
+ * Clear all records (for testing/reset).
64
+ * @returns Number of records deleted
65
+ */
66
+ clearAll(): number;
67
+ }
68
+ //# sourceMappingURL=idempotency.d.ts.map