steroids-cli 0.4.47

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 (395) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +640 -0
  3. package/dist/cli/colors.d.ts +110 -0
  4. package/dist/cli/colors.d.ts.map +1 -0
  5. package/dist/cli/colors.js +228 -0
  6. package/dist/cli/colors.js.map +1 -0
  7. package/dist/cli/env.d.ts +159 -0
  8. package/dist/cli/env.d.ts.map +1 -0
  9. package/dist/cli/env.js +227 -0
  10. package/dist/cli/env.js.map +1 -0
  11. package/dist/cli/errors.d.ts +166 -0
  12. package/dist/cli/errors.d.ts.map +1 -0
  13. package/dist/cli/errors.js +244 -0
  14. package/dist/cli/errors.js.map +1 -0
  15. package/dist/cli/flags.d.ts +75 -0
  16. package/dist/cli/flags.d.ts.map +1 -0
  17. package/dist/cli/flags.js +232 -0
  18. package/dist/cli/flags.js.map +1 -0
  19. package/dist/cli/help.d.ts +97 -0
  20. package/dist/cli/help.d.ts.map +1 -0
  21. package/dist/cli/help.js +275 -0
  22. package/dist/cli/help.js.map +1 -0
  23. package/dist/cli/index.d.ts +13 -0
  24. package/dist/cli/index.d.ts.map +1 -0
  25. package/dist/cli/index.js +29 -0
  26. package/dist/cli/index.js.map +1 -0
  27. package/dist/cli/interactive.d.ts +58 -0
  28. package/dist/cli/interactive.d.ts.map +1 -0
  29. package/dist/cli/interactive.js +127 -0
  30. package/dist/cli/interactive.js.map +1 -0
  31. package/dist/cli/output.d.ts +116 -0
  32. package/dist/cli/output.d.ts.map +1 -0
  33. package/dist/cli/output.js +178 -0
  34. package/dist/cli/output.js.map +1 -0
  35. package/dist/commands/about.d.ts +7 -0
  36. package/dist/commands/about.d.ts.map +1 -0
  37. package/dist/commands/about.js +259 -0
  38. package/dist/commands/about.js.map +1 -0
  39. package/dist/commands/ai.d.ts +6 -0
  40. package/dist/commands/ai.d.ts.map +1 -0
  41. package/dist/commands/ai.js +382 -0
  42. package/dist/commands/ai.js.map +1 -0
  43. package/dist/commands/backup.d.ts +3 -0
  44. package/dist/commands/backup.d.ts.map +1 -0
  45. package/dist/commands/backup.js +528 -0
  46. package/dist/commands/backup.js.map +1 -0
  47. package/dist/commands/completion.d.ts +3 -0
  48. package/dist/commands/completion.d.ts.map +1 -0
  49. package/dist/commands/completion.js +405 -0
  50. package/dist/commands/completion.js.map +1 -0
  51. package/dist/commands/config.d.ts +3 -0
  52. package/dist/commands/config.d.ts.map +1 -0
  53. package/dist/commands/config.js +665 -0
  54. package/dist/commands/config.js.map +1 -0
  55. package/dist/commands/disputes.d.ts +3 -0
  56. package/dist/commands/disputes.d.ts.map +1 -0
  57. package/dist/commands/disputes.js +499 -0
  58. package/dist/commands/disputes.js.map +1 -0
  59. package/dist/commands/gc.d.ts +3 -0
  60. package/dist/commands/gc.d.ts.map +1 -0
  61. package/dist/commands/gc.js +300 -0
  62. package/dist/commands/gc.js.map +1 -0
  63. package/dist/commands/git.d.ts +3 -0
  64. package/dist/commands/git.d.ts.map +1 -0
  65. package/dist/commands/git.js +458 -0
  66. package/dist/commands/git.js.map +1 -0
  67. package/dist/commands/health.d.ts +3 -0
  68. package/dist/commands/health.d.ts.map +1 -0
  69. package/dist/commands/health.js +604 -0
  70. package/dist/commands/health.js.map +1 -0
  71. package/dist/commands/hooks.d.ts +6 -0
  72. package/dist/commands/hooks.d.ts.map +1 -0
  73. package/dist/commands/hooks.js +529 -0
  74. package/dist/commands/hooks.js.map +1 -0
  75. package/dist/commands/init.d.ts +6 -0
  76. package/dist/commands/init.d.ts.map +1 -0
  77. package/dist/commands/init.js +200 -0
  78. package/dist/commands/init.js.map +1 -0
  79. package/dist/commands/llm.d.ts +7 -0
  80. package/dist/commands/llm.d.ts.map +1 -0
  81. package/dist/commands/llm.js +285 -0
  82. package/dist/commands/llm.js.map +1 -0
  83. package/dist/commands/locks.d.ts +3 -0
  84. package/dist/commands/locks.d.ts.map +1 -0
  85. package/dist/commands/locks.js +431 -0
  86. package/dist/commands/locks.js.map +1 -0
  87. package/dist/commands/logs.d.ts +3 -0
  88. package/dist/commands/logs.d.ts.map +1 -0
  89. package/dist/commands/logs.js +487 -0
  90. package/dist/commands/logs.js.map +1 -0
  91. package/dist/commands/loop-phases.d.ts +11 -0
  92. package/dist/commands/loop-phases.d.ts.map +1 -0
  93. package/dist/commands/loop-phases.js +204 -0
  94. package/dist/commands/loop-phases.js.map +1 -0
  95. package/dist/commands/loop.d.ts +3 -0
  96. package/dist/commands/loop.d.ts.map +1 -0
  97. package/dist/commands/loop.js +396 -0
  98. package/dist/commands/loop.js.map +1 -0
  99. package/dist/commands/projects.d.ts +6 -0
  100. package/dist/commands/projects.d.ts.map +1 -0
  101. package/dist/commands/projects.js +362 -0
  102. package/dist/commands/projects.js.map +1 -0
  103. package/dist/commands/purge.d.ts +3 -0
  104. package/dist/commands/purge.d.ts.map +1 -0
  105. package/dist/commands/purge.js +516 -0
  106. package/dist/commands/purge.js.map +1 -0
  107. package/dist/commands/runners.d.ts +3 -0
  108. package/dist/commands/runners.d.ts.map +1 -0
  109. package/dist/commands/runners.js +1076 -0
  110. package/dist/commands/runners.js.map +1 -0
  111. package/dist/commands/scan.d.ts +3 -0
  112. package/dist/commands/scan.d.ts.map +1 -0
  113. package/dist/commands/scan.js +291 -0
  114. package/dist/commands/scan.js.map +1 -0
  115. package/dist/commands/sections-commands.d.ts +9 -0
  116. package/dist/commands/sections-commands.d.ts.map +1 -0
  117. package/dist/commands/sections-commands.js +282 -0
  118. package/dist/commands/sections-commands.js.map +1 -0
  119. package/dist/commands/sections-graph.d.ts +25 -0
  120. package/dist/commands/sections-graph.d.ts.map +1 -0
  121. package/dist/commands/sections-graph.js +180 -0
  122. package/dist/commands/sections-graph.js.map +1 -0
  123. package/dist/commands/sections.d.ts +3 -0
  124. package/dist/commands/sections.d.ts.map +1 -0
  125. package/dist/commands/sections.js +376 -0
  126. package/dist/commands/sections.js.map +1 -0
  127. package/dist/commands/stats.d.ts +6 -0
  128. package/dist/commands/stats.d.ts.map +1 -0
  129. package/dist/commands/stats.js +324 -0
  130. package/dist/commands/stats.js.map +1 -0
  131. package/dist/commands/tasks.d.ts +3 -0
  132. package/dist/commands/tasks.d.ts.map +1 -0
  133. package/dist/commands/tasks.js +1115 -0
  134. package/dist/commands/tasks.js.map +1 -0
  135. package/dist/commands/web.d.ts +7 -0
  136. package/dist/commands/web.d.ts.map +1 -0
  137. package/dist/commands/web.js +204 -0
  138. package/dist/commands/web.js.map +1 -0
  139. package/dist/config/ai-setup.d.ts +27 -0
  140. package/dist/config/ai-setup.d.ts.map +1 -0
  141. package/dist/config/ai-setup.js +432 -0
  142. package/dist/config/ai-setup.js.map +1 -0
  143. package/dist/config/browser.d.ts +9 -0
  144. package/dist/config/browser.d.ts.map +1 -0
  145. package/dist/config/browser.js +200 -0
  146. package/dist/config/browser.js.map +1 -0
  147. package/dist/config/json-schema.d.ts +28 -0
  148. package/dist/config/json-schema.d.ts.map +1 -0
  149. package/dist/config/json-schema.js +84 -0
  150. package/dist/config/json-schema.js.map +1 -0
  151. package/dist/config/loader.d.ts +152 -0
  152. package/dist/config/loader.d.ts.map +1 -0
  153. package/dist/config/loader.js +270 -0
  154. package/dist/config/loader.js.map +1 -0
  155. package/dist/config/schema.d.ts +34 -0
  156. package/dist/config/schema.d.ts.map +1 -0
  157. package/dist/config/schema.js +437 -0
  158. package/dist/config/schema.js.map +1 -0
  159. package/dist/config/validator.d.ts +32 -0
  160. package/dist/config/validator.d.ts.map +1 -0
  161. package/dist/config/validator.js +187 -0
  162. package/dist/config/validator.js.map +1 -0
  163. package/dist/database/connection.d.ts +35 -0
  164. package/dist/database/connection.d.ts.map +1 -0
  165. package/dist/database/connection.js +208 -0
  166. package/dist/database/connection.js.map +1 -0
  167. package/dist/database/queries.d.ts +218 -0
  168. package/dist/database/queries.d.ts.map +1 -0
  169. package/dist/database/queries.js +613 -0
  170. package/dist/database/queries.js.map +1 -0
  171. package/dist/database/schema.d.ts +8 -0
  172. package/dist/database/schema.d.ts.map +1 -0
  173. package/dist/database/schema.js +160 -0
  174. package/dist/database/schema.js.map +1 -0
  175. package/dist/disputes/behavior.d.ts +106 -0
  176. package/dist/disputes/behavior.d.ts.map +1 -0
  177. package/dist/disputes/behavior.js +150 -0
  178. package/dist/disputes/behavior.js.map +1 -0
  179. package/dist/disputes/create.d.ts +59 -0
  180. package/dist/disputes/create.d.ts.map +1 -0
  181. package/dist/disputes/create.js +222 -0
  182. package/dist/disputes/create.js.map +1 -0
  183. package/dist/disputes/index.d.ts +21 -0
  184. package/dist/disputes/index.d.ts.map +1 -0
  185. package/dist/disputes/index.js +76 -0
  186. package/dist/disputes/index.js.map +1 -0
  187. package/dist/disputes/markdown.d.ts +41 -0
  188. package/dist/disputes/markdown.d.ts.map +1 -0
  189. package/dist/disputes/markdown.js +261 -0
  190. package/dist/disputes/markdown.js.map +1 -0
  191. package/dist/disputes/queries.d.ts +83 -0
  192. package/dist/disputes/queries.d.ts.map +1 -0
  193. package/dist/disputes/queries.js +180 -0
  194. package/dist/disputes/queries.js.map +1 -0
  195. package/dist/disputes/resolve.d.ts +57 -0
  196. package/dist/disputes/resolve.d.ts.map +1 -0
  197. package/dist/disputes/resolve.js +171 -0
  198. package/dist/disputes/resolve.js.map +1 -0
  199. package/dist/disputes/stale.d.ts +98 -0
  200. package/dist/disputes/stale.d.ts.map +1 -0
  201. package/dist/disputes/stale.js +205 -0
  202. package/dist/disputes/stale.js.map +1 -0
  203. package/dist/disputes/types.d.ts +92 -0
  204. package/dist/disputes/types.d.ts.map +1 -0
  205. package/dist/disputes/types.js +100 -0
  206. package/dist/disputes/types.js.map +1 -0
  207. package/dist/git/push.d.ts +26 -0
  208. package/dist/git/push.d.ts.map +1 -0
  209. package/dist/git/push.js +97 -0
  210. package/dist/git/push.js.map +1 -0
  211. package/dist/git/status.d.ts +61 -0
  212. package/dist/git/status.d.ts.map +1 -0
  213. package/dist/git/status.js +251 -0
  214. package/dist/git/status.js.map +1 -0
  215. package/dist/hooks/events.d.ts +72 -0
  216. package/dist/hooks/events.d.ts.map +1 -0
  217. package/dist/hooks/events.js +120 -0
  218. package/dist/hooks/events.js.map +1 -0
  219. package/dist/hooks/index.d.ts +19 -0
  220. package/dist/hooks/index.d.ts.map +1 -0
  221. package/dist/hooks/index.js +48 -0
  222. package/dist/hooks/index.js.map +1 -0
  223. package/dist/hooks/integration.d.ts +69 -0
  224. package/dist/hooks/integration.d.ts.map +1 -0
  225. package/dist/hooks/integration.js +179 -0
  226. package/dist/hooks/integration.js.map +1 -0
  227. package/dist/hooks/merge.d.ts +115 -0
  228. package/dist/hooks/merge.d.ts.map +1 -0
  229. package/dist/hooks/merge.js +161 -0
  230. package/dist/hooks/merge.js.map +1 -0
  231. package/dist/hooks/orchestrator.d.ts +115 -0
  232. package/dist/hooks/orchestrator.d.ts.map +1 -0
  233. package/dist/hooks/orchestrator.js +226 -0
  234. package/dist/hooks/orchestrator.js.map +1 -0
  235. package/dist/hooks/payload.d.ts +294 -0
  236. package/dist/hooks/payload.d.ts.map +1 -0
  237. package/dist/hooks/payload.js +267 -0
  238. package/dist/hooks/payload.js.map +1 -0
  239. package/dist/hooks/script-runner.d.ts +63 -0
  240. package/dist/hooks/script-runner.d.ts.map +1 -0
  241. package/dist/hooks/script-runner.js +221 -0
  242. package/dist/hooks/script-runner.js.map +1 -0
  243. package/dist/hooks/templates.d.ts +104 -0
  244. package/dist/hooks/templates.d.ts.map +1 -0
  245. package/dist/hooks/templates.js +327 -0
  246. package/dist/hooks/templates.js.map +1 -0
  247. package/dist/hooks/webhook-runner.d.ts +69 -0
  248. package/dist/hooks/webhook-runner.d.ts.map +1 -0
  249. package/dist/hooks/webhook-runner.js +208 -0
  250. package/dist/hooks/webhook-runner.js.map +1 -0
  251. package/dist/index.d.ts +7 -0
  252. package/dist/index.d.ts.map +1 -0
  253. package/dist/index.js +281 -0
  254. package/dist/index.js.map +1 -0
  255. package/dist/locking/cleanup.d.ts +70 -0
  256. package/dist/locking/cleanup.d.ts.map +1 -0
  257. package/dist/locking/cleanup.js +157 -0
  258. package/dist/locking/cleanup.js.map +1 -0
  259. package/dist/locking/queries.d.ts +116 -0
  260. package/dist/locking/queries.d.ts.map +1 -0
  261. package/dist/locking/queries.js +255 -0
  262. package/dist/locking/queries.js.map +1 -0
  263. package/dist/locking/section-lock.d.ts +74 -0
  264. package/dist/locking/section-lock.d.ts.map +1 -0
  265. package/dist/locking/section-lock.js +207 -0
  266. package/dist/locking/section-lock.js.map +1 -0
  267. package/dist/locking/task-lock.d.ts +92 -0
  268. package/dist/locking/task-lock.d.ts.map +1 -0
  269. package/dist/locking/task-lock.js +246 -0
  270. package/dist/locking/task-lock.js.map +1 -0
  271. package/dist/migrations/index.d.ts +7 -0
  272. package/dist/migrations/index.d.ts.map +1 -0
  273. package/dist/migrations/index.js +37 -0
  274. package/dist/migrations/index.js.map +1 -0
  275. package/dist/migrations/manifest.d.ts +92 -0
  276. package/dist/migrations/manifest.d.ts.map +1 -0
  277. package/dist/migrations/manifest.js +270 -0
  278. package/dist/migrations/manifest.js.map +1 -0
  279. package/dist/migrations/runner.d.ts +84 -0
  280. package/dist/migrations/runner.d.ts.map +1 -0
  281. package/dist/migrations/runner.js +351 -0
  282. package/dist/migrations/runner.js.map +1 -0
  283. package/dist/orchestrator/coder.d.ts +32 -0
  284. package/dist/orchestrator/coder.d.ts.map +1 -0
  285. package/dist/orchestrator/coder.js +174 -0
  286. package/dist/orchestrator/coder.js.map +1 -0
  287. package/dist/orchestrator/coordinator.d.ts +28 -0
  288. package/dist/orchestrator/coordinator.d.ts.map +1 -0
  289. package/dist/orchestrator/coordinator.js +256 -0
  290. package/dist/orchestrator/coordinator.js.map +1 -0
  291. package/dist/orchestrator/reviewer.d.ts +35 -0
  292. package/dist/orchestrator/reviewer.d.ts.map +1 -0
  293. package/dist/orchestrator/reviewer.js +241 -0
  294. package/dist/orchestrator/reviewer.js.map +1 -0
  295. package/dist/orchestrator/task-selector.d.ts +102 -0
  296. package/dist/orchestrator/task-selector.d.ts.map +1 -0
  297. package/dist/orchestrator/task-selector.js +341 -0
  298. package/dist/orchestrator/task-selector.js.map +1 -0
  299. package/dist/prompts/coder.d.ts +36 -0
  300. package/dist/prompts/coder.d.ts.map +1 -0
  301. package/dist/prompts/coder.js +315 -0
  302. package/dist/prompts/coder.js.map +1 -0
  303. package/dist/prompts/prompt-helpers.d.ts +51 -0
  304. package/dist/prompts/prompt-helpers.d.ts.map +1 -0
  305. package/dist/prompts/prompt-helpers.js +312 -0
  306. package/dist/prompts/prompt-helpers.js.map +1 -0
  307. package/dist/prompts/reviewer.d.ts +40 -0
  308. package/dist/prompts/reviewer.d.ts.map +1 -0
  309. package/dist/prompts/reviewer.js +438 -0
  310. package/dist/prompts/reviewer.js.map +1 -0
  311. package/dist/providers/api-models.d.ts +65 -0
  312. package/dist/providers/api-models.d.ts.map +1 -0
  313. package/dist/providers/api-models.js +323 -0
  314. package/dist/providers/api-models.js.map +1 -0
  315. package/dist/providers/claude.d.ts +53 -0
  316. package/dist/providers/claude.d.ts.map +1 -0
  317. package/dist/providers/claude.js +229 -0
  318. package/dist/providers/claude.js.map +1 -0
  319. package/dist/providers/codex.d.ts +53 -0
  320. package/dist/providers/codex.d.ts.map +1 -0
  321. package/dist/providers/codex.js +214 -0
  322. package/dist/providers/codex.js.map +1 -0
  323. package/dist/providers/gemini.d.ts +58 -0
  324. package/dist/providers/gemini.d.ts.map +1 -0
  325. package/dist/providers/gemini.js +242 -0
  326. package/dist/providers/gemini.js.map +1 -0
  327. package/dist/providers/index.d.ts +13 -0
  328. package/dist/providers/index.d.ts.map +1 -0
  329. package/dist/providers/index.js +49 -0
  330. package/dist/providers/index.js.map +1 -0
  331. package/dist/providers/interface.d.ts +173 -0
  332. package/dist/providers/interface.d.ts.map +1 -0
  333. package/dist/providers/interface.js +96 -0
  334. package/dist/providers/interface.js.map +1 -0
  335. package/dist/providers/invocation-logger.d.ts +114 -0
  336. package/dist/providers/invocation-logger.d.ts.map +1 -0
  337. package/dist/providers/invocation-logger.js +298 -0
  338. package/dist/providers/invocation-logger.js.map +1 -0
  339. package/dist/providers/openai.d.ts +53 -0
  340. package/dist/providers/openai.d.ts.map +1 -0
  341. package/dist/providers/openai.js +232 -0
  342. package/dist/providers/openai.js.map +1 -0
  343. package/dist/providers/registry.d.ts +100 -0
  344. package/dist/providers/registry.d.ts.map +1 -0
  345. package/dist/providers/registry.js +178 -0
  346. package/dist/providers/registry.js.map +1 -0
  347. package/dist/runners/activity-log.d.ts +65 -0
  348. package/dist/runners/activity-log.d.ts.map +1 -0
  349. package/dist/runners/activity-log.js +148 -0
  350. package/dist/runners/activity-log.js.map +1 -0
  351. package/dist/runners/cron.d.ts +26 -0
  352. package/dist/runners/cron.d.ts.map +1 -0
  353. package/dist/runners/cron.js +176 -0
  354. package/dist/runners/cron.js.map +1 -0
  355. package/dist/runners/daemon.d.ts +71 -0
  356. package/dist/runners/daemon.d.ts.map +1 -0
  357. package/dist/runners/daemon.js +245 -0
  358. package/dist/runners/daemon.js.map +1 -0
  359. package/dist/runners/global-db.d.ts +31 -0
  360. package/dist/runners/global-db.d.ts.map +1 -0
  361. package/dist/runners/global-db.js +230 -0
  362. package/dist/runners/global-db.js.map +1 -0
  363. package/dist/runners/hang-detector.d.ts +38 -0
  364. package/dist/runners/hang-detector.d.ts.map +1 -0
  365. package/dist/runners/hang-detector.js +136 -0
  366. package/dist/runners/hang-detector.js.map +1 -0
  367. package/dist/runners/heartbeat.d.ts +39 -0
  368. package/dist/runners/heartbeat.d.ts.map +1 -0
  369. package/dist/runners/heartbeat.js +79 -0
  370. package/dist/runners/heartbeat.js.map +1 -0
  371. package/dist/runners/lock.d.ts +47 -0
  372. package/dist/runners/lock.d.ts.map +1 -0
  373. package/dist/runners/lock.js +150 -0
  374. package/dist/runners/lock.js.map +1 -0
  375. package/dist/runners/orchestrator-loop.d.ts +20 -0
  376. package/dist/runners/orchestrator-loop.d.ts.map +1 -0
  377. package/dist/runners/orchestrator-loop.js +285 -0
  378. package/dist/runners/orchestrator-loop.js.map +1 -0
  379. package/dist/runners/projects.d.ts +96 -0
  380. package/dist/runners/projects.d.ts.map +1 -0
  381. package/dist/runners/projects.js +255 -0
  382. package/dist/runners/projects.js.map +1 -0
  383. package/dist/runners/wakeup.d.ts +34 -0
  384. package/dist/runners/wakeup.d.ts.map +1 -0
  385. package/dist/runners/wakeup.js +291 -0
  386. package/dist/runners/wakeup.js.map +1 -0
  387. package/migrations/001_initial_schema.sql +106 -0
  388. package/migrations/002_add_commit_sha.sql +12 -0
  389. package/migrations/003_add_section_priority.sql +13 -0
  390. package/migrations/004_add_section_dependencies.sql +18 -0
  391. package/migrations/005_add_audit_actor_model.sql +10 -0
  392. package/migrations/006_add_task_invocations.sql +33 -0
  393. package/migrations/007_add_file_anchor.sql +14 -0
  394. package/migrations/manifest.json +62 -0
  395. package/package.json +49 -0
@@ -0,0 +1,205 @@
1
+ "use strict";
2
+ /**
3
+ * Stale dispute handling
4
+ *
5
+ * Tracks disputes that have been open longer than the configured timeout
6
+ * and provides alerting and listing functionality.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.DEFAULT_TIMEOUT_DAYS = void 0;
10
+ exports.checkStaleDisputes = checkStaleDisputes;
11
+ exports.getStaleDisputeSummary = getStaleDisputeSummary;
12
+ exports.alertStaleDisputes = alertStaleDisputes;
13
+ exports.performStaleCheck = performStaleCheck;
14
+ exports.listOpenDisputesByAge = listOpenDisputesByAge;
15
+ exports.formatDisputeAge = formatDisputeAge;
16
+ const queries_js_1 = require("./queries.js");
17
+ // ============ Configuration ============
18
+ /**
19
+ * Default timeout in days before a dispute is considered stale
20
+ */
21
+ exports.DEFAULT_TIMEOUT_DAYS = 7;
22
+ /**
23
+ * Check for stale disputes
24
+ */
25
+ function checkStaleDisputes(db, timeoutDays = exports.DEFAULT_TIMEOUT_DAYS) {
26
+ const staleDisputes = (0, queries_js_1.listDisputesWithTasks)(db, {
27
+ stale: true,
28
+ timeoutDays,
29
+ });
30
+ const disputes = staleDisputes.map((dispute) => {
31
+ const daysOpen = (0, queries_js_1.calculateDaysOpen)(dispute.created_at);
32
+ return {
33
+ dispute,
34
+ daysOpen,
35
+ daysPastThreshold: daysOpen - timeoutDays,
36
+ };
37
+ });
38
+ return {
39
+ count: disputes.length,
40
+ disputes,
41
+ timeoutDays,
42
+ };
43
+ }
44
+ /**
45
+ * Get stale dispute summary for display
46
+ */
47
+ function getStaleDisputeSummary(db, timeoutDays = exports.DEFAULT_TIMEOUT_DAYS) {
48
+ const result = checkStaleDisputes(db, timeoutDays);
49
+ if (result.count === 0) {
50
+ return `No disputes have been open longer than ${timeoutDays} days.`;
51
+ }
52
+ const lines = [];
53
+ lines.push(`WARNING: ${result.count} dispute(s) have been open for > ${timeoutDays} days\n`);
54
+ lines.push('ID TASK DAYS OPEN');
55
+ lines.push('-'.repeat(60));
56
+ for (const item of result.disputes) {
57
+ const shortId = item.dispute.id.substring(0, 8);
58
+ const taskTitle = item.dispute.task_title.length > 30
59
+ ? item.dispute.task_title.substring(0, 27) + '...'
60
+ : item.dispute.task_title.padEnd(30);
61
+ lines.push(`${shortId} ${taskTitle} ${item.daysOpen}`);
62
+ }
63
+ lines.push('');
64
+ lines.push('Run `steroids dispute show <id>` for details.');
65
+ return lines.join('\n');
66
+ }
67
+ /**
68
+ * Send alert for stale disputes
69
+ */
70
+ async function alertStaleDisputes(db, config, timeoutDays = exports.DEFAULT_TIMEOUT_DAYS) {
71
+ const result = checkStaleDisputes(db, timeoutDays);
72
+ if (result.count === 0) {
73
+ return {
74
+ success: true,
75
+ alertType: config.type,
76
+ message: 'No stale disputes found',
77
+ };
78
+ }
79
+ const prefix = config.messagePrefix ?? 'Steroids';
80
+ const message = `${prefix}: ${result.count} dispute(s) open > ${timeoutDays} days`;
81
+ switch (config.type) {
82
+ case 'log':
83
+ console.warn(message);
84
+ console.warn(getStaleDisputeSummary(db, timeoutDays));
85
+ return {
86
+ success: true,
87
+ alertType: 'log',
88
+ message,
89
+ };
90
+ case 'webhook':
91
+ if (!config.webhookUrl) {
92
+ return {
93
+ success: false,
94
+ alertType: 'webhook',
95
+ error: 'Webhook URL not configured',
96
+ };
97
+ }
98
+ try {
99
+ await sendWebhookAlert(config.webhookUrl, result);
100
+ return {
101
+ success: true,
102
+ alertType: 'webhook',
103
+ message,
104
+ };
105
+ }
106
+ catch (error) {
107
+ return {
108
+ success: false,
109
+ alertType: 'webhook',
110
+ error: error instanceof Error ? error.message : 'Webhook failed',
111
+ };
112
+ }
113
+ case 'none':
114
+ return {
115
+ success: true,
116
+ alertType: 'none',
117
+ message: 'Alerting disabled',
118
+ };
119
+ }
120
+ }
121
+ /**
122
+ * Send webhook alert for stale disputes
123
+ */
124
+ async function sendWebhookAlert(url, result) {
125
+ const payload = {
126
+ type: 'stale_disputes',
127
+ count: result.count,
128
+ timeoutDays: result.timeoutDays,
129
+ disputes: result.disputes.map((item) => ({
130
+ id: item.dispute.id,
131
+ taskId: item.dispute.task_id,
132
+ taskTitle: item.dispute.task_title,
133
+ type: item.dispute.type,
134
+ reason: item.dispute.reason,
135
+ daysOpen: item.daysOpen,
136
+ createdAt: item.dispute.created_at,
137
+ })),
138
+ timestamp: new Date().toISOString(),
139
+ };
140
+ const response = await fetch(url, {
141
+ method: 'POST',
142
+ headers: {
143
+ 'Content-Type': 'application/json',
144
+ },
145
+ body: JSON.stringify(payload),
146
+ });
147
+ if (!response.ok) {
148
+ throw new Error(`Webhook failed with status ${response.status}`);
149
+ }
150
+ }
151
+ /**
152
+ * Perform a stale check and alert if needed
153
+ * Called from daemon or cron job
154
+ */
155
+ async function performStaleCheck(db, options) {
156
+ const result = checkStaleDisputes(db, options.timeoutDays);
157
+ if (result.count === 0) {
158
+ return {
159
+ staleCount: 0,
160
+ alertSent: false,
161
+ };
162
+ }
163
+ const alertResult = await alertStaleDisputes(db, options.alert, options.timeoutDays);
164
+ return {
165
+ staleCount: result.count,
166
+ alertSent: true,
167
+ alertResult,
168
+ };
169
+ }
170
+ // ============ List Helpers ============
171
+ /**
172
+ * List all open disputes sorted by age (oldest first)
173
+ */
174
+ function listOpenDisputesByAge(db) {
175
+ return (0, queries_js_1.listDisputesWithTasks)(db, { status: 'open' }).sort((a, b) => {
176
+ return new Date(a.created_at).getTime() - new Date(b.created_at).getTime();
177
+ });
178
+ }
179
+ /**
180
+ * Get dispute age in human-readable format
181
+ */
182
+ function formatDisputeAge(dispute) {
183
+ const days = (0, queries_js_1.calculateDaysOpen)(dispute.created_at);
184
+ if (days === 0) {
185
+ return 'Today';
186
+ }
187
+ else if (days === 1) {
188
+ return '1 day ago';
189
+ }
190
+ else if (days < 7) {
191
+ return `${days} days ago`;
192
+ }
193
+ else if (days < 14) {
194
+ return '1 week ago';
195
+ }
196
+ else if (days < 30) {
197
+ const weeks = Math.floor(days / 7);
198
+ return `${weeks} weeks ago`;
199
+ }
200
+ else {
201
+ const months = Math.floor(days / 30);
202
+ return months === 1 ? '1 month ago' : `${months} months ago`;
203
+ }
204
+ }
205
+ //# sourceMappingURL=stale.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stale.js","sourceRoot":"","sources":["../../src/disputes/stale.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Dispute types and interfaces
3
+ *
4
+ * Disputes occur when coder and reviewer fundamentally disagree about
5
+ * implementation. The dispute system treats tasks as effectively complete
6
+ * and records both positions for optional human review.
7
+ */
8
+ /**
9
+ * Type of dispute
10
+ * - major: Blocks task, requires human resolution
11
+ * - minor: Logged only, continues with coder's implementation
12
+ * - coder: Coder disputes reviewer's rejection
13
+ * - reviewer: Reviewer raises concern
14
+ * - system: Auto-created after 15 rejections
15
+ */
16
+ export type DisputeType = 'major' | 'minor' | 'coder' | 'reviewer' | 'system';
17
+ export declare const DISPUTE_TYPES: readonly DisputeType[];
18
+ /**
19
+ * Standard reasons for disputes
20
+ */
21
+ export type DisputeReason = 'architecture' | 'specification' | 'approach' | 'requirements' | 'style' | 'security' | 'scope' | 'other';
22
+ export declare const DISPUTE_REASONS: readonly DisputeReason[];
23
+ /**
24
+ * Human-readable descriptions for dispute reasons
25
+ */
26
+ export declare const DISPUTE_REASON_DESCRIPTIONS: Record<DisputeReason, string>;
27
+ /**
28
+ * Status of a dispute
29
+ */
30
+ export type DisputeStatus = 'open' | 'resolved';
31
+ /**
32
+ * Resolution decision for a dispute
33
+ */
34
+ export type ResolutionDecision = 'coder' | 'reviewer' | 'custom';
35
+ /**
36
+ * Full dispute record from database
37
+ */
38
+ export interface Dispute {
39
+ id: string;
40
+ task_id: string;
41
+ type: DisputeType;
42
+ status: DisputeStatus;
43
+ reason: DisputeReason | string;
44
+ coder_position: string | null;
45
+ reviewer_position: string | null;
46
+ resolution: ResolutionDecision | null;
47
+ resolution_notes: string | null;
48
+ created_by: string;
49
+ resolved_by: string | null;
50
+ created_at: string;
51
+ resolved_at: string | null;
52
+ }
53
+ /**
54
+ * Input for creating a new dispute
55
+ */
56
+ export interface CreateDisputeInput {
57
+ taskId: string;
58
+ type: DisputeType;
59
+ reason: DisputeReason | string;
60
+ position: string;
61
+ createdBy: string;
62
+ }
63
+ /**
64
+ * Input for resolving a dispute
65
+ */
66
+ export interface ResolveDisputeInput {
67
+ disputeId: string;
68
+ decision: ResolutionDecision;
69
+ notes?: string;
70
+ resolvedBy: string;
71
+ }
72
+ /**
73
+ * Check if a string is a valid dispute type
74
+ */
75
+ export declare function isDisputeType(value: string): value is DisputeType;
76
+ /**
77
+ * Check if a string is a valid dispute reason
78
+ */
79
+ export declare function isDisputeReason(value: string): value is DisputeReason;
80
+ /**
81
+ * Check if a string is a valid resolution decision
82
+ */
83
+ export declare function isResolutionDecision(value: string): value is ResolutionDecision;
84
+ /**
85
+ * Get display marker for dispute type
86
+ */
87
+ export declare function getDisputeTypeMarker(type: DisputeType): string;
88
+ /**
89
+ * Get human-readable description for dispute type
90
+ */
91
+ export declare function getDisputeTypeDescription(type: DisputeType): string;
92
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/disputes/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH;;;;;;;GAOG;AACH,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,QAAQ,CAAC;AAE9E,eAAO,MAAM,aAAa,EAAE,SAAS,WAAW,EAMtC,CAAC;AAIX;;GAEG;AACH,MAAM,MAAM,aAAa,GACrB,cAAc,GACd,eAAe,GACf,UAAU,GACV,cAAc,GACd,OAAO,GACP,UAAU,GACV,OAAO,GACP,OAAO,CAAC;AAEZ,eAAO,MAAM,eAAe,EAAE,SAAS,aAAa,EAS1C,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,2BAA2B,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CASrE,CAAC;AAIF;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,UAAU,CAAC;AAIhD;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,UAAU,GAAG,QAAQ,CAAC;AAIjE;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,aAAa,GAAG,MAAM,CAAC;IAC/B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,UAAU,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACtC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAID;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,aAAa,GAAG,MAAM,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAID;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAID;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,WAAW,CAEjE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,aAAa,CAErE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,kBAAkB,CAE/E;AAID;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAa9D;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAanE"}
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ /**
3
+ * Dispute types and interfaces
4
+ *
5
+ * Disputes occur when coder and reviewer fundamentally disagree about
6
+ * implementation. The dispute system treats tasks as effectively complete
7
+ * and records both positions for optional human review.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.DISPUTE_REASON_DESCRIPTIONS = exports.DISPUTE_REASONS = exports.DISPUTE_TYPES = void 0;
11
+ exports.isDisputeType = isDisputeType;
12
+ exports.isDisputeReason = isDisputeReason;
13
+ exports.isResolutionDecision = isResolutionDecision;
14
+ exports.getDisputeTypeMarker = getDisputeTypeMarker;
15
+ exports.getDisputeTypeDescription = getDisputeTypeDescription;
16
+ exports.DISPUTE_TYPES = [
17
+ 'major',
18
+ 'minor',
19
+ 'coder',
20
+ 'reviewer',
21
+ 'system',
22
+ ];
23
+ exports.DISPUTE_REASONS = [
24
+ 'architecture',
25
+ 'specification',
26
+ 'approach',
27
+ 'requirements',
28
+ 'style',
29
+ 'security',
30
+ 'scope',
31
+ 'other',
32
+ ];
33
+ /**
34
+ * Human-readable descriptions for dispute reasons
35
+ */
36
+ exports.DISPUTE_REASON_DESCRIPTIONS = {
37
+ architecture: 'Architectural disagreement - different technical approaches',
38
+ specification: 'Specification ambiguity - unclear requirements',
39
+ approach: 'Different valid approaches to implementation',
40
+ requirements: 'Unclear or conflicting requirements',
41
+ style: 'Style/convention disagreement',
42
+ security: 'Security concern or vulnerability',
43
+ scope: 'Scope disagreement - what is in/out of scope',
44
+ other: 'Other reason (custom explanation)',
45
+ };
46
+ // ============ Type Guards ============
47
+ /**
48
+ * Check if a string is a valid dispute type
49
+ */
50
+ function isDisputeType(value) {
51
+ return exports.DISPUTE_TYPES.includes(value);
52
+ }
53
+ /**
54
+ * Check if a string is a valid dispute reason
55
+ */
56
+ function isDisputeReason(value) {
57
+ return exports.DISPUTE_REASONS.includes(value);
58
+ }
59
+ /**
60
+ * Check if a string is a valid resolution decision
61
+ */
62
+ function isResolutionDecision(value) {
63
+ return ['coder', 'reviewer', 'custom'].includes(value);
64
+ }
65
+ // ============ Display Helpers ============
66
+ /**
67
+ * Get display marker for dispute type
68
+ */
69
+ function getDisputeTypeMarker(type) {
70
+ switch (type) {
71
+ case 'major':
72
+ return '[!!]';
73
+ case 'minor':
74
+ return '[~]';
75
+ case 'coder':
76
+ return '[C]';
77
+ case 'reviewer':
78
+ return '[R]';
79
+ case 'system':
80
+ return '[S]';
81
+ }
82
+ }
83
+ /**
84
+ * Get human-readable description for dispute type
85
+ */
86
+ function getDisputeTypeDescription(type) {
87
+ switch (type) {
88
+ case 'major':
89
+ return 'Major dispute - blocks task, requires human resolution';
90
+ case 'minor':
91
+ return 'Minor dispute - logged only, continues with coder implementation';
92
+ case 'coder':
93
+ return 'Coder disputes reviewer rejection';
94
+ case 'reviewer':
95
+ return 'Reviewer raises concern';
96
+ case 'system':
97
+ return 'System-created after 15 rejections';
98
+ }
99
+ }
100
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/disputes/types.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AA+HH,sCAEC;AAKD,0CAEC;AAKD,oDAEC;AAOD,oDAaC;AAKD,8DAaC;AAvKY,QAAA,aAAa,GAA2B;IACnD,OAAO;IACP,OAAO;IACP,OAAO;IACP,UAAU;IACV,QAAQ;CACA,CAAC;AAiBE,QAAA,eAAe,GAA6B;IACvD,cAAc;IACd,eAAe;IACf,UAAU;IACV,cAAc;IACd,OAAO;IACP,UAAU;IACV,OAAO;IACP,OAAO;CACC,CAAC;AAEX;;GAEG;AACU,QAAA,2BAA2B,GAAkC;IACxE,YAAY,EAAE,6DAA6D;IAC3E,aAAa,EAAE,gDAAgD;IAC/D,QAAQ,EAAE,8CAA8C;IACxD,YAAY,EAAE,qCAAqC;IACnD,KAAK,EAAE,+BAA+B;IACtC,QAAQ,EAAE,mCAAmC;IAC7C,KAAK,EAAE,8CAA8C;IACrD,KAAK,EAAE,mCAAmC;CAC3C,CAAC;AA8DF,wCAAwC;AAExC;;GAEG;AACH,SAAgB,aAAa,CAAC,KAAa;IACzC,OAAQ,qBAAmC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC9D,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,KAAa;IAC3C,OAAQ,uBAAqC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC;AAED;;GAEG;AACH,SAAgB,oBAAoB,CAAC,KAAa;IAChD,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACzD,CAAC;AAED,4CAA4C;AAE5C;;GAEG;AACH,SAAgB,oBAAoB,CAAC,IAAiB;IACpD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,OAAO;YACV,OAAO,MAAM,CAAC;QAChB,KAAK,OAAO;YACV,OAAO,KAAK,CAAC;QACf,KAAK,OAAO;YACV,OAAO,KAAK,CAAC;QACf,KAAK,UAAU;YACb,OAAO,KAAK,CAAC;QACf,KAAK,QAAQ;YACX,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,yBAAyB,CAAC,IAAiB;IACzD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,OAAO;YACV,OAAO,wDAAwD,CAAC;QAClE,KAAK,OAAO;YACV,OAAO,kEAAkE,CAAC;QAC5E,KAAK,OAAO;YACV,OAAO,mCAAmC,CAAC;QAC7C,KAAK,UAAU;YACb,OAAO,yBAAyB,CAAC;QACnC,KAAK,QAAQ;YACX,OAAO,oCAAoC,CAAC;IAChD,CAAC;AACH,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Git push operations
3
+ * Handles pushing completed work with resilience
4
+ */
5
+ export interface PushResult {
6
+ success: boolean;
7
+ error?: string;
8
+ commitHash?: string;
9
+ }
10
+ /**
11
+ * Get the current commit hash
12
+ */
13
+ export declare function getCurrentCommitHash(projectPath?: string): string | null;
14
+ /**
15
+ * Push to remote repository
16
+ */
17
+ export declare function pushToRemote(projectPath?: string, remote?: string, branch?: string): PushResult;
18
+ /**
19
+ * Get remote URL for logging
20
+ */
21
+ export declare function getRemoteUrl(projectPath?: string, remote?: string): string | null;
22
+ /**
23
+ * Check if we're on a branch that tracks a remote
24
+ */
25
+ export declare function hasRemoteTracking(projectPath?: string): boolean;
26
+ //# sourceMappingURL=push.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../src/git/push.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,GAAE,MAAsB,GAClC,MAAM,GAAG,IAAI,CAUf;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,WAAW,GAAE,MAAsB,EACnC,MAAM,GAAE,MAAiB,EACzB,MAAM,GAAE,MAAe,GACtB,UAAU,CAqCZ;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,WAAW,GAAE,MAAsB,EACnC,MAAM,GAAE,MAAiB,GACxB,MAAM,GAAG,IAAI,CAUf;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,GAAE,MAAsB,GAClC,OAAO,CAWT"}
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ /**
3
+ * Git push operations
4
+ * Handles pushing completed work with resilience
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.getCurrentCommitHash = getCurrentCommitHash;
8
+ exports.pushToRemote = pushToRemote;
9
+ exports.getRemoteUrl = getRemoteUrl;
10
+ exports.hasRemoteTracking = hasRemoteTracking;
11
+ const node_child_process_1 = require("node:child_process");
12
+ /**
13
+ * Get the current commit hash
14
+ */
15
+ function getCurrentCommitHash(projectPath = process.cwd()) {
16
+ try {
17
+ return (0, node_child_process_1.execSync)('git rev-parse HEAD', {
18
+ cwd: projectPath,
19
+ encoding: 'utf-8',
20
+ stdio: ['pipe', 'pipe', 'pipe'],
21
+ }).trim();
22
+ }
23
+ catch {
24
+ return null;
25
+ }
26
+ }
27
+ /**
28
+ * Push to remote repository
29
+ */
30
+ function pushToRemote(projectPath = process.cwd(), remote = 'origin', branch = 'main') {
31
+ try {
32
+ (0, node_child_process_1.execSync)(`git push ${remote} ${branch}`, {
33
+ cwd: projectPath,
34
+ encoding: 'utf-8',
35
+ stdio: ['pipe', 'pipe', 'pipe'],
36
+ timeout: 120_000, // 2 minute timeout
37
+ });
38
+ const commitHash = getCurrentCommitHash(projectPath);
39
+ console.log(`Successfully pushed to ${remote}/${branch}`);
40
+ return {
41
+ success: true,
42
+ commitHash: commitHash ?? undefined,
43
+ };
44
+ }
45
+ catch (error) {
46
+ const err = error;
47
+ const errorMsg = err.stderr ?? err.message ?? 'Unknown push error';
48
+ console.error(`Push failed: ${errorMsg}`);
49
+ // Classify the error
50
+ const lowerError = errorMsg.toLowerCase();
51
+ if (lowerError.includes('non-fast-forward') || lowerError.includes('rejected')) {
52
+ console.warn('Push rejected due to conflict. Human intervention required.');
53
+ }
54
+ else if (lowerError.includes('connection') || lowerError.includes('timeout')) {
55
+ console.warn('Network error. Will retry on next task completion.');
56
+ }
57
+ else if (lowerError.includes('auth')) {
58
+ console.warn('Authentication error. Check git credentials.');
59
+ }
60
+ return {
61
+ success: false,
62
+ error: errorMsg,
63
+ };
64
+ }
65
+ }
66
+ /**
67
+ * Get remote URL for logging
68
+ */
69
+ function getRemoteUrl(projectPath = process.cwd(), remote = 'origin') {
70
+ try {
71
+ return (0, node_child_process_1.execSync)(`git remote get-url ${remote}`, {
72
+ cwd: projectPath,
73
+ encoding: 'utf-8',
74
+ stdio: ['pipe', 'pipe', 'pipe'],
75
+ }).trim();
76
+ }
77
+ catch {
78
+ return null;
79
+ }
80
+ }
81
+ /**
82
+ * Check if we're on a branch that tracks a remote
83
+ */
84
+ function hasRemoteTracking(projectPath = process.cwd()) {
85
+ try {
86
+ (0, node_child_process_1.execSync)('git rev-parse --abbrev-ref --symbolic-full-name @{u}', {
87
+ cwd: projectPath,
88
+ encoding: 'utf-8',
89
+ stdio: ['pipe', 'pipe', 'pipe'],
90
+ });
91
+ return true;
92
+ }
93
+ catch {
94
+ return false;
95
+ }
96
+ }
97
+ //# sourceMappingURL=push.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push.js","sourceRoot":"","sources":["../../src/git/push.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Git status and diff utilities
3
+ */
4
+ /**
5
+ * Get the current HEAD commit SHA
6
+ */
7
+ export declare function getCurrentCommitSha(projectPath?: string): string | null;
8
+ /**
9
+ * Get short (7 char) commit SHA
10
+ */
11
+ export declare function getShortCommitSha(projectPath?: string): string | null;
12
+ /**
13
+ * Get git status output
14
+ */
15
+ export declare function getGitStatus(projectPath?: string): string;
16
+ /**
17
+ * Get git diff output
18
+ */
19
+ export declare function getGitDiff(projectPath?: string, ref?: string): string;
20
+ /**
21
+ * Get list of modified files
22
+ */
23
+ export declare function getModifiedFiles(projectPath?: string, ref?: string): string[];
24
+ /**
25
+ * Check if there are uncommitted changes
26
+ */
27
+ export declare function hasUncommittedChanges(projectPath?: string): boolean;
28
+ /**
29
+ * Check if we're in a git repository
30
+ */
31
+ export declare function isGitRepo(projectPath?: string): boolean;
32
+ /**
33
+ * Find the commit hash for a task by searching commit messages
34
+ * Returns the most recent commit that mentions the task title
35
+ */
36
+ export declare function findTaskCommit(projectPath: string, taskTitle: string): string | null;
37
+ /**
38
+ * Get the diff of a specific commit
39
+ */
40
+ export declare function getCommitDiff(projectPath: string, commitHash: string): string;
41
+ /**
42
+ * Get files changed in a specific commit
43
+ */
44
+ export declare function getCommitFiles(projectPath: string, commitHash: string): string[];
45
+ /**
46
+ * Check if a specific file is tracked by git
47
+ */
48
+ export declare function isFileTracked(filePath: string, projectPath?: string): boolean;
49
+ /**
50
+ * Check if a specific file has uncommitted changes (staged or unstaged)
51
+ */
52
+ export declare function isFileDirty(filePath: string, projectPath?: string): boolean;
53
+ /**
54
+ * Get the SHA of the most recent commit that modified a file
55
+ */
56
+ export declare function getFileLastCommit(filePath: string, projectPath?: string): string | null;
57
+ /**
58
+ * Get the git blob hash of a file at HEAD (content-addressable hash)
59
+ */
60
+ export declare function getFileContentHash(filePath: string, projectPath?: string): string | null;
61
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/git/status.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CAUtF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CAUpF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,WAAW,GAAE,MAAsB,GAAG,MAAM,CAUxE;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,WAAW,GAAE,MAAsB,EACnC,GAAG,CAAC,EAAE,MAAM,GACX,MAAM,CAYR;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,GAAE,MAAsB,EACnC,GAAG,CAAC,EAAE,MAAM,GACX,MAAM,EAAE,CAYV;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,GAAE,MAAsB,GAClC,OAAO,CAGT;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,WAAW,GAAE,MAAsB,GAAG,OAAO,CAWtE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,MAAM,GAAG,IAAI,CA+Bf;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,MAAM,CAWR;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,MAAM,EAAE,CAWV;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,WAAW,GAAE,MAAsB,GAClC,OAAO,CAWT;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,EAChB,WAAW,GAAE,MAAsB,GAClC,OAAO,CAWT;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,WAAW,GAAE,MAAsB,GAClC,MAAM,GAAG,IAAI,CAUf;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,WAAW,GAAE,MAAsB,GAClC,MAAM,GAAG,IAAI,CAUf"}