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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 UnlikeOther.ai
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,640 @@
1
+ <p align="center">
2
+ <img src="Assets/logo.png" alt="Steroids Logo" width="200">
3
+ </p>
4
+
5
+ # Steroids
6
+
7
+ **Spec-driven, autonomous software development — with a built-in coder/reviewer loop.**
8
+
9
+ Steroids is an AI-powered task orchestration system that automates software development through a strict *implement → review → fix* workflow. You define work in markdown specification files, group them into sections (features/phases), and Steroids runs the loop until tasks are done — or a dispute is raised.
10
+
11
+ > **A developer command center for managing multiple software projects with confidence.**
12
+
13
+ <table align="center" border="0" cellspacing="0" cellpadding="4">
14
+ <tr>
15
+ <td valign="top" style="border: none;"><a href="Assets/Screenshots/Steroids Dashboard.png"><img src="Assets/Screenshots/Steroids Dashboard.png" alt="Dashboard" width="100%"></a></td>
16
+ <td valign="top" style="border: none;"><a href="Assets/Screenshots/Steroids Projects.png"><img src="Assets/Screenshots/Steroids Projects.png" alt="Projects" width="100%"></a></td>
17
+ </tr>
18
+ <tr>
19
+ <td valign="top" style="border: none;"><a href="Assets/Screenshots/Steroids Config.png"><img src="Assets/Screenshots/Steroids Config.png" alt="Config" width="100%"></a></td>
20
+ <td valign="top" style="border: none;"><a href="Assets/Screenshots/Steroids Settings.png"><img src="Assets/Screenshots/Steroids Settings.png" alt="Settings" width="100%"></a></td>
21
+ </tr>
22
+ </table>
23
+
24
+ ---
25
+
26
+ ## Table of Contents
27
+
28
+ * [Why Steroids](#why-steroids)
29
+ * [Who It's For](#who-its-for)
30
+ * [How It Works](#how-it-works)
31
+ * [Key Features](#key-features)
32
+ * [Project Structure](#project-structure)
33
+ * [Quickstart](#quickstart)
34
+ * [CLI Commands](#cli-commands)
35
+ * [Runner Daemon](#runner-daemon)
36
+ * [Coordinator System](#coordinator-system)
37
+ * [Disputes](#disputes)
38
+ * [Hooks](#hooks)
39
+ * [Web Dashboard](#web-dashboard)
40
+ * [Configuration](#configuration)
41
+ * [Quality & Safety](#quality--safety)
42
+ * [The Suite](#the-suite)
43
+ * [Roadmap](#roadmap)
44
+ * [Contributing](#contributing)
45
+ * [License](#license)
46
+ * [Credits](#credits)
47
+
48
+ ---
49
+
50
+ ## Why Steroids
51
+
52
+ Most AI coding tools optimize for speed. Steroids optimizes for **repeatable delivery**:
53
+
54
+ * **Specs are the source of truth** — not chat vibes.
55
+ * **Coder and reviewer are separated** by design.
56
+ * **Nothing progresses without review approval.**
57
+ * **Endless loops are prevented** via coordinator intervention and dispute escalation.
58
+ * Built for **hands-off runs** — overnight or while you focus elsewhere.
59
+
60
+ Steroids is for power developers who refuse to let their projects become unmaintainable slop.
61
+
62
+ ---
63
+
64
+ ## Who It's For
65
+
66
+ Steroids is for software teams and solo developers who want to delegate routine development work to AI while maintaining quality control.
67
+
68
+ It's especially useful for:
69
+
70
+ 1. Breaking down large projects into small, spec-driven tasks that AI can execute reliably
71
+ 2. Enforcing consistent code review standards through an automated reviewer
72
+ 3. Running development work in the background while you focus on higher-level decisions
73
+
74
+ The coder/reviewer separation ensures work is checked before being accepted, and the dispute mechanism escalates genuinely hard problems to humans rather than spinning endlessly.
75
+
76
+ ---
77
+
78
+ ## How It Works
79
+
80
+ Steroids runs an autonomous loop per task:
81
+
82
+ 1. **You write specs** in markdown files (tasks grouped into sections/phases).
83
+ 2. A **coder AI** implements the task strictly according to the spec.
84
+ 3. A **reviewer AI** evaluates: does it match the spec? Do builds/tests pass? Is the code secure?
85
+ 4. If **rejected**, feedback is appended and the task goes back to the coder.
86
+ 5. If **approved**, Steroids commits, pushes, and moves to the next task.
87
+ 6. A **coordinator AI** intervenes at rejection thresholds (2, 5, 9) to break deadlocks.
88
+ 7. After **15 rejections**, Steroids raises a **dispute** (human attention required).
89
+
90
+ ```
91
+ pending → in_progress → review → completed
92
+ ↑ │
93
+ │ ↓ (rejected)
94
+ └───────────┘
95
+
96
+ ↓ (15 rejections)
97
+ disputed/failed
98
+ ```
99
+
100
+ **External Setup:** Some tasks require human action (Cloud SQL, account creation, etc.). When the spec says SKIP or MANUAL, the coder can mark it as `skipped` (fully external) or `partial` (some coded, rest external). The runner moves on, and you'll see what needs manual action in `steroids llm --context`.
101
+
102
+ **Feedback Tasks:** Both coder and reviewer can create feedback tasks for advisory items (pre-existing concerns, minor disputes, things needing human review). These go to a special skipped section called "Needs User Input" and never block the pipeline.
103
+
104
+ ---
105
+
106
+ ## Key Features
107
+
108
+ * **Markdown specs** as the contract (task definitions, acceptance criteria, constraints)
109
+ * **Sections/phases** to organize features with priorities and dependencies
110
+ * **Coder/Reviewer loop** with strict approval gating
111
+ * **Coordinator intervention** at rejection thresholds to break deadlocks
112
+ * **Dispute escalation** after 15 rejections to avoid infinite churn
113
+ * **Security review** built into the reviewer (injection, shell safety, secrets, permissions)
114
+ * **File anchoring** — pin tasks to specific file:line locations with auto-captured commit SHA
115
+ * **Feedback tasks** — advisory items in a skipped section for human review
116
+ * **Multi-provider support** — Claude, OpenAI, Codex, Gemini
117
+ * **CLI-first workflow** for power users and automation
118
+ * **Background runner daemon** to process tasks without babysitting
119
+ * **Event hooks** — trigger scripts/webhooks on task completion, project events
120
+ * **Multi-project support** with global project registry
121
+ * **Web dashboard** for monitoring progress across projects
122
+ * **Shell completion** for bash, zsh, and fish
123
+ * **Backup & restore** for Steroids data
124
+ * **Health checks** with weighted scoring for project fitness
125
+ * *(Planned)* **Mac menu bar companion** for real-time status at a glance
126
+
127
+ ---
128
+
129
+ ## Project Structure
130
+
131
+ A typical repo using Steroids:
132
+
133
+ ```
134
+ my-project/
135
+ ├── .steroids/
136
+ │ ├── steroids.db # Task state, sections, audit logs
137
+ │ └── config.yaml # Project configuration
138
+ ├── specs/
139
+ │ ├── auth.md # Specification files
140
+ │ ├── billing.md
141
+ │ └── dashboard.md
142
+ ├── AGENTS.md # Guidelines for AI agents
143
+ └── src/ # Your code
144
+ ```
145
+
146
+ > **Specs are stable, state is generated.** The `.steroids/` directory contains the SQLite database tracking all task state.
147
+
148
+ ---
149
+
150
+ ## Quickstart
151
+
152
+ ### 1. Install
153
+
154
+ ```bash
155
+ # Option A: Install from npm
156
+ npm install -g steroids-cli
157
+
158
+ # Option B: Install from source
159
+ git clone https://github.com/UnlikeOtherAI/steroids-cli.git
160
+ cd steroids-cli
161
+ npm install && npm run build && npm link
162
+ ```
163
+
164
+ ### 2. Initialize in a project
165
+
166
+ ```bash
167
+ cd ~/Projects/my-app
168
+ steroids init
169
+ ```
170
+
171
+ This creates `.steroids/` with the database and default config.
172
+
173
+ ### 3. Create sections and tasks
174
+
175
+ ```bash
176
+ # Add a section (feature/phase)
177
+ steroids sections add "Phase 1: User Authentication"
178
+
179
+ # Add tasks with specs
180
+ steroids tasks add "Implement login endpoint" \
181
+ --section <section-id> \
182
+ --source specs/auth.md
183
+
184
+ # Anchor a task to a specific file and line
185
+ steroids tasks add "Fix null check in utils" \
186
+ --section <section-id> \
187
+ --source specs/fix.md \
188
+ --file src/utils.ts --line 42
189
+
190
+ # Create a feedback task for human review
191
+ steroids tasks add "Should we use Redis or in-memory cache?" --feedback
192
+ ```
193
+
194
+ ### 4. Run the loop
195
+
196
+ ```bash
197
+ # Interactive loop (foreground)
198
+ steroids loop
199
+
200
+ # Or start background daemon
201
+ steroids runners start --detach
202
+ ```
203
+
204
+ Steroids processes tasks in order, looping coder/reviewer until completion or dispute.
205
+
206
+ ---
207
+
208
+ ## CLI Commands
209
+
210
+ ### Core Commands
211
+
212
+ | Command | Description |
213
+ |---------|-------------|
214
+ | `steroids init` | Initialize Steroids in current directory |
215
+ | `steroids about` | Explain what Steroids is (for LLMs discovering the tool) |
216
+ | `steroids llm` | Compact instructions for LLM agents (call when context lost) |
217
+ | `steroids llm --context` | Include current project context (active tasks, runners) |
218
+ | `steroids loop` | Run the coder/reviewer loop interactively |
219
+ | `steroids loop --once` | Run one iteration only |
220
+
221
+ ### Task Management
222
+
223
+ | Command | Description |
224
+ |---------|-------------|
225
+ | `steroids tasks stats` | Show task counts by status |
226
+ | `steroids tasks list` | List pending tasks |
227
+ | `steroids tasks list --status all` | List all tasks with status |
228
+ | `steroids tasks list --status active` | Show in_progress + review tasks |
229
+ | `steroids tasks show <id>` | Show task details with invocation logs |
230
+ | `steroids tasks add <title> --section <id> --source <file>` | Add a new task |
231
+ | `steroids tasks add <title> ... --file <path> --line <n>` | Add task anchored to a committed file |
232
+ | `steroids tasks add <title> --feedback` | Add feedback task (skipped section, no --section/--source needed) |
233
+ | `steroids tasks update <id> --status review` | Submit task for review |
234
+ | `steroids tasks approve <id> --model <model>` | Approve a task |
235
+ | `steroids tasks reject <id> --model <model> --notes "..."` | Reject with feedback |
236
+ | `steroids tasks skip <id> --notes "..."` | Skip external setup task |
237
+ | `steroids tasks skip <id> --partial --notes "..."` | Partial skip (coded some, rest external) |
238
+ | `steroids tasks audit <id>` | View task audit trail |
239
+
240
+ ### Section Management
241
+
242
+ | Command | Description |
243
+ |---------|-------------|
244
+ | `steroids sections list` | List all sections |
245
+ | `steroids sections add <name>` | Create a new section |
246
+ | `steroids sections skip <id>` | Exclude section from runner |
247
+ | `steroids sections unskip <id>` | Include section in runner |
248
+ | `steroids sections priority <id> <value>` | Set section priority (0-100 or high/medium/low) |
249
+ | `steroids sections depends-on <id> <dep-id>` | Add section dependency |
250
+ | `steroids sections no-depends-on <id> <dep-id>` | Remove section dependency |
251
+ | `steroids sections graph` | Show dependency graph (ASCII, `--mermaid`, or `--output png`) |
252
+
253
+ ### Runner Management
254
+
255
+ | Command | Description |
256
+ |---------|-------------|
257
+ | `steroids runners list` | List active runners |
258
+ | `steroids runners start` | Start runner in foreground |
259
+ | `steroids runners start --detach` | Start runner in background |
260
+ | `steroids runners start --section <name>` | Focus on a specific section |
261
+ | `steroids runners stop --all` | Stop all runners |
262
+ | `steroids runners status` | Current runner state |
263
+ | `steroids runners logs [pid]` | View daemon output (`--tail`, `--follow`) |
264
+ | `steroids runners wakeup` | Check and start runners for projects with pending work |
265
+ | `steroids runners cron install` | Install cron job for auto-wakeup |
266
+ | `steroids runners cron uninstall` | Remove cron job |
267
+
268
+ ### Dispute Management
269
+
270
+ | Command | Description |
271
+ |---------|-------------|
272
+ | `steroids dispute list` | List open disputes |
273
+ | `steroids dispute show <id>` | Show dispute details |
274
+ | `steroids dispute create <task-id> --reason "..." --type <type>` | Create a dispute (types: major, minor, coder, reviewer) |
275
+ | `steroids dispute resolve <id> --decision <coder\|reviewer\|custom>` | Resolve a dispute |
276
+ | `steroids dispute log <task-id> --notes "..."` | Log minor disagreement without blocking |
277
+
278
+ ### AI Providers
279
+
280
+ | Command | Description |
281
+ |---------|-------------|
282
+ | `steroids ai providers` | List detected AI providers |
283
+ | `steroids ai models <provider>` | List available models for a provider |
284
+ | `steroids ai test` | Test AI configuration (coder/reviewer connectivity) |
285
+ | `steroids ai setup` | Interactive provider setup |
286
+
287
+ ### Project Registry
288
+
289
+ | Command | Description |
290
+ |---------|-------------|
291
+ | `steroids projects list` | List registered projects |
292
+ | `steroids projects add <path>` | Register a project |
293
+ | `steroids projects remove <path>` | Unregister a project |
294
+ | `steroids projects prune` | Remove stale project entries |
295
+
296
+ ### Configuration
297
+
298
+ | Command | Description |
299
+ |---------|-------------|
300
+ | `steroids config show [key]` | Display configuration (supports nested paths like `quality.tests`) |
301
+ | `steroids config set <key> <value>` | Set configuration value (supports nested paths) |
302
+ | `steroids config init` | Initialize config with defaults |
303
+ | `steroids config validate` | Validate configuration syntax |
304
+ | `steroids config edit` | Open config in $EDITOR |
305
+
306
+ ### Maintenance & Utilities
307
+
308
+ | Command | Description |
309
+ |---------|-------------|
310
+ | `steroids health` | Project health check with weighted scoring |
311
+ | `steroids scan` | Scan directory for projects (auto-detects language/framework) |
312
+ | `steroids backup create` | Backup Steroids data |
313
+ | `steroids backup restore <file>` | Restore from backup |
314
+ | `steroids gc` | Garbage collection (orphaned IDs, stale runners, DB optimization) |
315
+ | `steroids purge tasks --older-than 30d` | Purge old data |
316
+ | `steroids locks list` | View active task/section locks |
317
+ | `steroids locks release <id>` | Release a stuck lock |
318
+ | `steroids stats` | Global activity statistics |
319
+ | `steroids stats 7d` | Activity stats for last 7 days |
320
+ | `steroids git status` | Git status with task context |
321
+ | `steroids git push` | Push with retry logic |
322
+ | `steroids logs list` | List invocation log files |
323
+ | `steroids completion bash` | Generate shell completion script |
324
+ | `steroids completion install` | Auto-install completion for your shell |
325
+ | `steroids hooks list` | List configured event hooks |
326
+ | `steroids hooks add` | Add an event hook |
327
+ | `steroids hooks test <event>` | Test a hook |
328
+
329
+ ---
330
+
331
+ ## Runner Daemon
332
+
333
+ Steroids includes a runner daemon for background processing:
334
+
335
+ ```bash
336
+ # Start in background
337
+ steroids runners start --detach
338
+
339
+ # Check status
340
+ steroids runners list
341
+
342
+ # View logs
343
+ steroids runners logs <pid> --follow
344
+
345
+ # Stop all runners
346
+ steroids runners stop --all
347
+
348
+ # Auto-restart via cron
349
+ steroids runners cron install
350
+ ```
351
+
352
+ The daemon:
353
+ - Picks up pending tasks automatically
354
+ - Updates heartbeat for health monitoring
355
+ - Pushes approved work to git
356
+ - Continues until all tasks complete or shutdown signal received
357
+ - Skips sections marked as skipped (e.g., "Needs User Input")
358
+
359
+ ---
360
+
361
+ ## Coordinator System
362
+
363
+ When the coder and reviewer get stuck in a rejection loop, the **coordinator** intervenes automatically at rejection thresholds (2, 5, and 9 rejections):
364
+
365
+ The coordinator analyzes the rejection history and makes one of three decisions:
366
+
367
+ | Decision | Effect |
368
+ |----------|--------|
369
+ | **guide_coder** | Reviewer feedback is valid — gives the coder clearer direction |
370
+ | **override_reviewer** | Some reviewer demands are out of scope — tells the reviewer to stop raising them |
371
+ | **narrow_scope** | Reduces the task scope to an achievable subset |
372
+
373
+ The coordinator's guidance flows to **both** the coder and the reviewer on subsequent iterations, ensuring alignment. This prevents death spirals where the coder and reviewer talk past each other.
374
+
375
+ Configure the coordinator in `.steroids/config.yaml`:
376
+
377
+ ```yaml
378
+ ai:
379
+ orchestrator:
380
+ provider: claude
381
+ model: claude-sonnet-4
382
+ ```
383
+
384
+ ---
385
+
386
+ ## Disputes
387
+
388
+ When a task hits 15 rejections, or when a coder/reviewer raises one manually, Steroids creates a **dispute**:
389
+
390
+ ```bash
391
+ # View open disputes
392
+ steroids dispute list
393
+
394
+ # Resolve a dispute
395
+ steroids dispute resolve <id> --decision coder --notes "Coder's approach is correct"
396
+ ```
397
+
398
+ Dispute types:
399
+ - **major** — Fundamental disagreement blocking progress
400
+ - **minor** — Logged for record, doesn't block
401
+ - **coder** — Raised by the coder against reviewer feedback
402
+ - **reviewer** — Raised by the reviewer against coder's implementation
403
+
404
+ ---
405
+
406
+ ## Hooks
407
+
408
+ Steroids supports event hooks that trigger shell commands or webhooks:
409
+
410
+ ```bash
411
+ # List configured hooks
412
+ steroids hooks list
413
+
414
+ # Add a hook
415
+ steroids hooks add
416
+
417
+ # Test a hook
418
+ steroids hooks test task.completed
419
+ ```
420
+
421
+ Events: `task.created`, `task.completed`, `task.failed`, `section.completed`, `project.completed`
422
+
423
+ Configure hooks in `.steroids/config.yaml` or manage via CLI.
424
+
425
+ ---
426
+
427
+ ## Web Dashboard
428
+
429
+ Steroids includes a web dashboard for visual monitoring. It auto-clones on first run:
430
+
431
+ ```bash
432
+ # Launch the dashboard (clones repo to ~/.steroids/webui/ on first run)
433
+ steroids web
434
+
435
+ # Check status
436
+ steroids web status
437
+
438
+ # Pull latest changes and reinstall
439
+ steroids web update
440
+
441
+ # Stop the dashboard
442
+ steroids web stop
443
+
444
+ # Access at
445
+ # Web UI: http://localhost:3500
446
+ # API: http://localhost:3501
447
+ ```
448
+
449
+ | Command | Description |
450
+ |---------|-------------|
451
+ | `steroids web` | Clone (if needed) and launch WebUI + API |
452
+ | `steroids web update` | Pull latest code and reinstall dependencies |
453
+ | `steroids web stop` | Stop running WebUI and API processes |
454
+ | `steroids web status` | Check if dashboard is running |
455
+
456
+ ### Features
457
+
458
+ - **Multi-project view** — See all registered projects
459
+ - **Task queues** — Pending, in-progress, review, completed
460
+ - **Runner status** — Active daemons with heartbeat
461
+ - **Audit trails** — Full history of task state changes
462
+ - **Configuration** — Edit project settings from the browser
463
+
464
+ ---
465
+
466
+ ## Configuration
467
+
468
+ ### Project Config (`.steroids/config.yaml`)
469
+
470
+ ```yaml
471
+ ai:
472
+ coder:
473
+ provider: claude # claude, openai, codex, gemini
474
+ model: claude-sonnet-4
475
+ reviewer:
476
+ provider: claude
477
+ model: claude-sonnet-4
478
+ orchestrator: # Coordinator for breaking rejection loops
479
+ provider: claude
480
+ model: claude-sonnet-4
481
+
482
+ output:
483
+ format: table
484
+ colors: true
485
+
486
+ quality:
487
+ tests:
488
+ required: true
489
+ minCoverage: 80 # Per-task modified files, not global
490
+
491
+ sections:
492
+ batchMode: false # Process all section tasks at once
493
+ maxBatchSize: 10 # Max tasks per batch
494
+
495
+ disputes:
496
+ timeoutDays: 7
497
+ autoCreateOnMaxRejections: true
498
+
499
+ runners:
500
+ heartbeatInterval: 30s
501
+ staleTimeout: 5m
502
+ maxConcurrent: 1
503
+
504
+ locking:
505
+ taskTimeout: 60m
506
+ sectionTimeout: 120m
507
+
508
+ database:
509
+ autoMigrate: true
510
+ backupBeforeMigrate: true
511
+
512
+ build:
513
+ timeout: 5m
514
+
515
+ test:
516
+ timeout: 10m
517
+
518
+ logs:
519
+ retention: 30d
520
+ level: info # debug, info, warn, error
521
+
522
+ backup:
523
+ enabled: true
524
+ retention: 7d
525
+ ```
526
+
527
+ ### Global Config (`~/.steroids/config.yaml`)
528
+
529
+ Same schema — acts as default, overridden by project config.
530
+
531
+ ### Environment Variables
532
+
533
+ ```bash
534
+ ANTHROPIC_API_KEY=... # For Claude models
535
+ OPENAI_API_KEY=... # For OpenAI models
536
+ GOOGLE_API_KEY=... # For Gemini models
537
+
538
+ STEROIDS_JSON=1 # Output as JSON
539
+ STEROIDS_QUIET=1 # Minimal output
540
+ STEROIDS_VERBOSE=1 # Detailed output
541
+ STEROIDS_NO_COLOR=1 # Disable colors
542
+ ```
543
+
544
+ ---
545
+
546
+ ## Quality & Safety
547
+
548
+ Steroids is built for developers who believe in:
549
+
550
+ * **Testable code** over "it works on my machine"
551
+ * **Clean architecture** over vibe coding
552
+ * **Maintainable structures** over quick hacks
553
+ * **Developer experience** over feature bloat
554
+
555
+ The coder is required to:
556
+ - Run build before submitting for review
557
+ - Run tests before submitting for review
558
+ - Fix errors until both pass
559
+ - Use secure patterns (array-based shell APIs, parameterized queries)
560
+ - Create feedback tasks for pre-existing concerns
561
+
562
+ The reviewer verifies:
563
+ - Implementation matches the spec
564
+ - Build and tests pass
565
+ - Code follows project conventions
566
+ - **Security review** of new/changed code (injection, shell safety, secrets, permissions, unsafe execution)
567
+ - Test coverage for modified files (when configured)
568
+ - Creates feedback tasks for advisory items that don't block approval
569
+
570
+ ---
571
+
572
+ ## The Suite
573
+
574
+ ### Steroids CLI
575
+ The main task orchestration CLI. Manages tasks, sections, runners, and the coder/reviewer loop.
576
+
577
+ ### Monitor *(Planned)*
578
+ Mac menu bar companion app for real-time status at a glance across multiple projects.
579
+
580
+ ### Pump *(Planned)*
581
+ Data gathering CLI using Google APIs (Gemini, Search). Grounds LLM responses with real-time data.
582
+
583
+ ### Iron *(Planned)*
584
+ Documentation scaffolding wizard. Interactive CLI for setting up CLAUDE.md, AGENTS.md, and architecture docs.
585
+
586
+ ---
587
+
588
+ ## Roadmap
589
+
590
+ - [x] Core CLI with task/section management
591
+ - [x] Coder/Reviewer loop with dispute escalation
592
+ - [x] Background runner daemon
593
+ - [x] Multi-project registry
594
+ - [x] Web dashboard (basic)
595
+ - [x] Section priorities and dependencies
596
+ - [x] Section batch mode (process all tasks at once)
597
+ - [x] Multi-provider support (Claude, OpenAI, Codex, Gemini)
598
+ - [x] Coordinator system for breaking rejection loops
599
+ - [x] Event hooks (shell commands, webhooks)
600
+ - [x] Security review in reviewer prompt
601
+ - [x] File anchoring for tasks
602
+ - [x] Feedback tasks (skipped "Needs User Input" section)
603
+ - [x] Shell completion (bash, zsh, fish)
604
+ - [x] Backup & restore
605
+ - [x] Health checks and project scanning
606
+ - [ ] Mac menu bar app
607
+ - [ ] Token accounting and budgets
608
+ - [ ] Jira integration (sync tasks, update tickets)
609
+
610
+ ---
611
+
612
+ ## Contributing
613
+
614
+ We welcome contributions that improve code quality and developer experience.
615
+
616
+ 1. Fork the repository
617
+ 2. Create a feature branch (`git checkout -b feature/amazing-feature`)
618
+ 3. Commit your changes (`git commit -m 'feat: add amazing feature'`)
619
+ 4. Push to the branch (`git push origin feature/amazing-feature`)
620
+ 5. Open a Pull Request
621
+
622
+ See [CONTRIBUTING.md](./Docs/CONTRIBUTING.md) for detailed guidelines.
623
+
624
+ ---
625
+
626
+ ## License
627
+
628
+ MIT License — see [LICENSE](./LICENSE) for details.
629
+
630
+ ---
631
+
632
+ ## Credits
633
+
634
+ Created by [UnlikeOther.ai](https://unlikeother.ai)
635
+
636
+ **Author:** Ondrej Rafaj ([@rafiki270](https://github.com/rafiki270))
637
+
638
+ <p align="center">
639
+ <em>Made with love in Scotland.</em>
640
+ </p>