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,665 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.configCommand = configCommand;
4
+ /**
5
+ * steroids config - Manage configuration
6
+ */
7
+ const node_util_1 = require("node:util");
8
+ const node_fs_1 = require("node:fs");
9
+ const node_path_1 = require("node:path");
10
+ const node_child_process_1 = require("node:child_process");
11
+ const yaml_1 = require("yaml");
12
+ const loader_js_1 = require("../config/loader.js");
13
+ const validator_js_1 = require("../config/validator.js");
14
+ const json_schema_js_1 = require("../config/json-schema.js");
15
+ const browser_js_1 = require("../config/browser.js");
16
+ const ai_setup_js_1 = require("../config/ai-setup.js");
17
+ const api_models_js_1 = require("../providers/api-models.js");
18
+ const help_js_1 = require("../cli/help.js");
19
+ const HELP = (0, help_js_1.generateHelp)({
20
+ command: 'config',
21
+ description: 'Manage configuration',
22
+ details: 'Create, view, edit, and validate Steroids configuration files. Supports both global (~/.steroids/) and project-level (.steroids/) configs with hierarchical merging.',
23
+ usage: [
24
+ 'steroids config <subcommand> [options]',
25
+ ],
26
+ subcommands: [
27
+ { name: 'init', description: 'Create configuration file' },
28
+ { name: 'show', args: '[key]', description: 'Display merged configuration or specific nested value' },
29
+ { name: 'get', args: '<key>', description: 'Get a configuration value' },
30
+ { name: 'set', args: '<key> <value>', description: 'Set a configuration value' },
31
+ { name: 'schema', args: '[category]', description: 'Output configuration schema as JSON Schema' },
32
+ { name: 'validate', description: 'Validate configuration syntax' },
33
+ { name: 'path', description: 'Show configuration file paths' },
34
+ { name: 'edit', description: 'Open config in $EDITOR' },
35
+ { name: 'browse', description: 'Interactive configuration browser' },
36
+ { name: 'ai', args: '[role]', description: 'Interactive AI provider/model setup' },
37
+ { name: 'models', args: '<provider>', description: 'List available models for a provider' },
38
+ ],
39
+ options: [
40
+ { long: 'template', description: 'Config template (init)', values: 'minimal | standard | full', default: 'standard' },
41
+ { long: 'global', description: 'Use global config (~/.steroids/)' },
42
+ { long: 'local', description: 'Use project config (.steroids/)' },
43
+ { long: 'force', description: 'Overwrite existing config (init)' },
44
+ ],
45
+ examples: [
46
+ { command: 'steroids config init', description: 'Create standard config' },
47
+ { command: 'steroids config init --template minimal', description: 'Minimal config (AI only)' },
48
+ { command: 'steroids config init --global', description: 'Create global config' },
49
+ { command: 'steroids config show', description: 'Show merged config' },
50
+ { command: 'steroids config show quality.tests', description: 'Show specific nested value' },
51
+ { command: 'steroids config get ai.coder.model', description: 'Get value' },
52
+ { command: 'steroids config set ai.coder.model opus', description: 'Set value' },
53
+ { command: 'steroids config set output.colors false --global', description: 'Set in global config' },
54
+ { command: 'steroids config validate', description: 'Validate config' },
55
+ { command: 'steroids config path', description: 'Show file paths' },
56
+ { command: 'steroids config edit', description: 'Open in editor' },
57
+ { command: 'steroids config schema', description: 'Output full schema' },
58
+ { command: 'steroids config schema ai', description: 'Output AI category schema' },
59
+ { command: 'steroids config ai', description: 'Interactive AI setup wizard' },
60
+ { command: 'steroids config ai coder', description: 'Configure coder role' },
61
+ { command: 'steroids config models claude', description: 'List Claude models from API' },
62
+ ],
63
+ related: [
64
+ { command: 'steroids init', description: 'Initialize steroids in project' },
65
+ ],
66
+ });
67
+ async function configCommand(args, flags) {
68
+ // Check global help flag
69
+ if (flags.help || args.length === 0 || args[0] === '-h' || args[0] === '--help') {
70
+ console.log(HELP);
71
+ return;
72
+ }
73
+ const subcommand = args[0];
74
+ const subArgs = args.slice(1);
75
+ switch (subcommand) {
76
+ case 'init':
77
+ await runInit(subArgs);
78
+ break;
79
+ case 'show':
80
+ await runShow(subArgs);
81
+ break;
82
+ case 'get':
83
+ await runGet(subArgs);
84
+ break;
85
+ case 'set':
86
+ await runSet(subArgs);
87
+ break;
88
+ case 'schema':
89
+ await runSchema(subArgs);
90
+ break;
91
+ case 'validate':
92
+ await runValidate(subArgs);
93
+ break;
94
+ case 'path':
95
+ await runPath(subArgs);
96
+ break;
97
+ case 'edit':
98
+ await runEdit(subArgs);
99
+ break;
100
+ case 'browse':
101
+ await (0, browser_js_1.runBrowser)();
102
+ break;
103
+ case 'ai':
104
+ await runAI(subArgs, flags);
105
+ break;
106
+ case 'models':
107
+ await runModels(subArgs, flags);
108
+ break;
109
+ default:
110
+ console.error(`Unknown subcommand: ${subcommand}`);
111
+ console.log(HELP);
112
+ process.exit(1);
113
+ }
114
+ }
115
+ async function runInit(args) {
116
+ const { values } = (0, node_util_1.parseArgs)({
117
+ args,
118
+ options: {
119
+ help: { type: 'boolean', short: 'h', default: false },
120
+ json: { type: 'boolean', short: 'j', default: false },
121
+ template: { type: 'string', default: 'standard' },
122
+ global: { type: 'boolean', default: false },
123
+ force: { type: 'boolean', default: false },
124
+ },
125
+ allowPositionals: false,
126
+ });
127
+ if (values.help) {
128
+ console.log(`
129
+ steroids config init - Create configuration file
130
+
131
+ USAGE:
132
+ steroids config init [options]
133
+
134
+ OPTIONS:
135
+ --template <name> minimal | standard | full (default: standard)
136
+ --global Create in ~/.steroids/
137
+ --force Overwrite existing config
138
+ -j, --json Output as JSON
139
+ -h, --help Show help
140
+ `);
141
+ return;
142
+ }
143
+ const configPath = values.global ? (0, loader_js_1.getGlobalConfigPath)() : (0, loader_js_1.getProjectConfigPath)();
144
+ if ((0, node_fs_1.existsSync)(configPath) && !values.force) {
145
+ console.error(`Config already exists: ${configPath}`);
146
+ console.error('Use --force to overwrite.');
147
+ process.exit(1);
148
+ }
149
+ let config;
150
+ switch (values.template) {
151
+ case 'minimal':
152
+ config = {
153
+ ai: {
154
+ coder: { provider: 'claude', model: 'claude-sonnet-4' },
155
+ reviewer: { provider: 'claude', model: 'claude-sonnet-4' },
156
+ },
157
+ };
158
+ break;
159
+ case 'full':
160
+ config = loader_js_1.DEFAULT_CONFIG;
161
+ break;
162
+ case 'standard':
163
+ default:
164
+ config = {
165
+ ai: {
166
+ coder: { provider: 'claude', model: 'claude-sonnet-4' },
167
+ reviewer: { provider: 'claude', model: 'claude-sonnet-4' },
168
+ },
169
+ output: { format: 'table', colors: true },
170
+ git: { autoPush: true, remote: 'origin', branch: 'main' },
171
+ runners: { heartbeatInterval: '30s', staleTimeout: '5m' },
172
+ };
173
+ }
174
+ // Ensure directory exists
175
+ const dir = (0, node_path_1.dirname)(configPath);
176
+ if (!(0, node_fs_1.existsSync)(dir)) {
177
+ (0, node_fs_1.mkdirSync)(dir, { recursive: true });
178
+ }
179
+ (0, loader_js_1.saveConfig)(config, configPath);
180
+ if (values.json) {
181
+ console.log(JSON.stringify({ created: configPath, template: values.template }));
182
+ }
183
+ else {
184
+ console.log(`Created config: ${configPath}`);
185
+ console.log(`Template: ${values.template}`);
186
+ }
187
+ }
188
+ async function runShow(args) {
189
+ const { values, positionals } = (0, node_util_1.parseArgs)({
190
+ args,
191
+ options: {
192
+ help: { type: 'boolean', short: 'h', default: false },
193
+ json: { type: 'boolean', short: 'j', default: false },
194
+ global: { type: 'boolean', default: false },
195
+ local: { type: 'boolean', default: false },
196
+ },
197
+ allowPositionals: true,
198
+ });
199
+ if (values.help) {
200
+ console.log(`
201
+ steroids config show - Display configuration
202
+
203
+ USAGE:
204
+ steroids config show [key] [options]
205
+
206
+ ARGUMENTS:
207
+ [key] Optional nested path (e.g., quality.tests)
208
+
209
+ OPTIONS:
210
+ --global Show only global config
211
+ --local Show only project config
212
+ -j, --json Output as JSON
213
+ -h, --help Show help
214
+
215
+ EXAMPLES:
216
+ steroids config show # Show all config
217
+ steroids config show quality.tests # Show specific nested value
218
+ steroids config show --json # Show all as JSON
219
+ `);
220
+ return;
221
+ }
222
+ let config;
223
+ if (values.global) {
224
+ config = (0, loader_js_1.loadConfigFile)((0, loader_js_1.getGlobalConfigPath)());
225
+ }
226
+ else if (values.local) {
227
+ config = (0, loader_js_1.loadConfigFile)((0, loader_js_1.getProjectConfigPath)());
228
+ }
229
+ else {
230
+ config = (0, loader_js_1.loadConfig)();
231
+ }
232
+ // If a key path is provided, show only that nested value
233
+ let displayValue = config;
234
+ if (positionals.length > 0) {
235
+ const key = positionals[0];
236
+ displayValue = (0, loader_js_1.getConfigValue)(config, key);
237
+ if (displayValue === undefined) {
238
+ console.error(`Key not found: ${key}`);
239
+ process.exit(1);
240
+ }
241
+ }
242
+ if (values.json) {
243
+ console.log(JSON.stringify(displayValue, null, 2));
244
+ }
245
+ else {
246
+ if (typeof displayValue === 'object' && displayValue !== null) {
247
+ console.log((0, yaml_1.stringify)(displayValue, { indent: 2 }));
248
+ }
249
+ else {
250
+ console.log(String(displayValue));
251
+ }
252
+ }
253
+ }
254
+ async function runGet(args) {
255
+ const { values, positionals } = (0, node_util_1.parseArgs)({
256
+ args,
257
+ options: {
258
+ help: { type: 'boolean', short: 'h', default: false },
259
+ json: { type: 'boolean', short: 'j', default: false },
260
+ },
261
+ allowPositionals: true,
262
+ });
263
+ if (values.help || positionals.length === 0) {
264
+ console.log(`
265
+ steroids config get <key> - Get configuration value
266
+
267
+ USAGE:
268
+ steroids config get <key> [options]
269
+
270
+ EXAMPLES:
271
+ steroids config get ai.coder.model
272
+ steroids config get output.format
273
+ steroids config get runners.heartbeatInterval
274
+ `);
275
+ return;
276
+ }
277
+ const key = positionals[0];
278
+ const config = (0, loader_js_1.loadConfig)();
279
+ const value = (0, loader_js_1.getConfigValue)(config, key);
280
+ if (value === undefined) {
281
+ console.error(`Key not found: ${key}`);
282
+ process.exit(1);
283
+ }
284
+ if (values.json) {
285
+ console.log(JSON.stringify({ key, value }));
286
+ }
287
+ else {
288
+ if (typeof value === 'object') {
289
+ console.log((0, yaml_1.stringify)(value, { indent: 2 }));
290
+ }
291
+ else {
292
+ console.log(String(value));
293
+ }
294
+ }
295
+ }
296
+ async function runSet(args) {
297
+ const { values, positionals } = (0, node_util_1.parseArgs)({
298
+ args,
299
+ options: {
300
+ help: { type: 'boolean', short: 'h', default: false },
301
+ json: { type: 'boolean', short: 'j', default: false },
302
+ global: { type: 'boolean', default: false },
303
+ local: { type: 'boolean', default: false },
304
+ },
305
+ allowPositionals: true,
306
+ });
307
+ if (values.help || positionals.length < 2) {
308
+ console.log(`
309
+ steroids config set <key> <value> - Set configuration value
310
+
311
+ USAGE:
312
+ steroids config set <key> <value> [options]
313
+
314
+ OPTIONS:
315
+ --global Set in global config
316
+ --local Set in project config (default)
317
+
318
+ EXAMPLES:
319
+ steroids config set ai.coder.model claude-opus-4
320
+ steroids config set output.colors false
321
+ steroids config set webui.port 8080
322
+ `);
323
+ return;
324
+ }
325
+ const key = positionals[0];
326
+ const rawValue = positionals.slice(1).join(' ');
327
+ // Parse value to correct type
328
+ const value = (0, validator_js_1.parseValue)(key, rawValue);
329
+ // Validate value
330
+ const error = (0, validator_js_1.validateValue)(key, value);
331
+ if (error) {
332
+ console.error(`Invalid value: ${error.message}`);
333
+ if (error.suggestion) {
334
+ console.error(` → ${error.suggestion}`);
335
+ }
336
+ process.exit(1);
337
+ }
338
+ const configPath = values.global ? (0, loader_js_1.getGlobalConfigPath)() : (0, loader_js_1.getProjectConfigPath)();
339
+ const existingConfig = (0, loader_js_1.loadConfigFile)(configPath);
340
+ const newConfig = (0, loader_js_1.setConfigValue)(existingConfig, key, value);
341
+ (0, loader_js_1.saveConfig)(newConfig, configPath);
342
+ if (values.json) {
343
+ console.log(JSON.stringify({ key, value, path: configPath }));
344
+ }
345
+ else {
346
+ console.log(`Set ${key} = ${JSON.stringify(value)}`);
347
+ console.log(`Saved to: ${configPath}`);
348
+ }
349
+ }
350
+ async function runValidate(args) {
351
+ const { values } = (0, node_util_1.parseArgs)({
352
+ args,
353
+ options: {
354
+ help: { type: 'boolean', short: 'h', default: false },
355
+ json: { type: 'boolean', short: 'j', default: false },
356
+ },
357
+ allowPositionals: false,
358
+ });
359
+ if (values.help) {
360
+ console.log(`
361
+ steroids config validate - Validate configuration
362
+
363
+ USAGE:
364
+ steroids config validate [options]
365
+
366
+ OPTIONS:
367
+ -j, --json Output as JSON
368
+ -h, --help Show help
369
+ `);
370
+ return;
371
+ }
372
+ const config = (0, loader_js_1.loadConfig)();
373
+ const result = (0, validator_js_1.validateConfig)(config);
374
+ if (values.json) {
375
+ console.log(JSON.stringify(result, null, 2));
376
+ }
377
+ else {
378
+ console.log((0, validator_js_1.formatValidationResult)(result));
379
+ }
380
+ if (!result.valid) {
381
+ process.exit(1);
382
+ }
383
+ }
384
+ async function runPath(args) {
385
+ const { values } = (0, node_util_1.parseArgs)({
386
+ args,
387
+ options: {
388
+ help: { type: 'boolean', short: 'h', default: false },
389
+ json: { type: 'boolean', short: 'j', default: false },
390
+ },
391
+ allowPositionals: false,
392
+ });
393
+ if (values.help) {
394
+ console.log(`
395
+ steroids config path - Show configuration file paths
396
+
397
+ USAGE:
398
+ steroids config path [options]
399
+
400
+ OPTIONS:
401
+ -j, --json Output as JSON
402
+ -h, --help Show help
403
+ `);
404
+ return;
405
+ }
406
+ const globalPath = (0, loader_js_1.getGlobalConfigPath)();
407
+ const projectPath = (0, loader_js_1.getProjectConfigPath)();
408
+ const paths = {
409
+ global: {
410
+ path: globalPath,
411
+ exists: (0, node_fs_1.existsSync)(globalPath),
412
+ },
413
+ project: {
414
+ path: projectPath,
415
+ exists: (0, node_fs_1.existsSync)(projectPath),
416
+ },
417
+ };
418
+ if (values.json) {
419
+ console.log(JSON.stringify(paths, null, 2));
420
+ }
421
+ else {
422
+ console.log('Configuration Paths:');
423
+ console.log('');
424
+ console.log(` Global: ${globalPath}`);
425
+ console.log(` ${paths.global.exists ? '(exists)' : '(not found)'}`);
426
+ console.log('');
427
+ console.log(` Project: ${projectPath}`);
428
+ console.log(` ${paths.project.exists ? '(exists)' : '(not found)'}`);
429
+ }
430
+ }
431
+ async function runEdit(args) {
432
+ const { values } = (0, node_util_1.parseArgs)({
433
+ args,
434
+ options: {
435
+ help: { type: 'boolean', short: 'h', default: false },
436
+ global: { type: 'boolean', default: false },
437
+ local: { type: 'boolean', default: false },
438
+ },
439
+ allowPositionals: false,
440
+ });
441
+ if (values.help) {
442
+ console.log(`
443
+ steroids config edit - Open config in editor
444
+
445
+ USAGE:
446
+ steroids config edit [options]
447
+
448
+ OPTIONS:
449
+ --global Edit global config
450
+ --local Edit project config (default)
451
+ -h, --help Show help
452
+ `);
453
+ return;
454
+ }
455
+ const configPath = values.global ? (0, loader_js_1.getGlobalConfigPath)() : (0, loader_js_1.getProjectConfigPath)();
456
+ if (!(0, node_fs_1.existsSync)(configPath)) {
457
+ console.error(`Config file not found: ${configPath}`);
458
+ console.error('Run "steroids config init" first.');
459
+ process.exit(1);
460
+ }
461
+ const editor = process.env.EDITOR || process.env.VISUAL || 'vi';
462
+ try {
463
+ (0, node_child_process_1.execSync)(`${editor} "${configPath}"`, { stdio: 'inherit' });
464
+ }
465
+ catch (error) {
466
+ console.error(`Failed to open editor: ${editor}`);
467
+ process.exit(1);
468
+ }
469
+ }
470
+ async function runSchema(args) {
471
+ const { values, positionals } = (0, node_util_1.parseArgs)({
472
+ args,
473
+ options: {
474
+ help: { type: 'boolean', short: 'h', default: false },
475
+ },
476
+ allowPositionals: true,
477
+ });
478
+ if (values.help) {
479
+ console.log(`
480
+ steroids config schema - Output configuration schema
481
+
482
+ USAGE:
483
+ steroids config schema [category] [options]
484
+
485
+ ARGUMENTS:
486
+ [category] Optional category to show (ai, git, runners, etc.)
487
+
488
+ OPTIONS:
489
+ -h, --help Show help
490
+
491
+ EXAMPLES:
492
+ steroids config schema # Full schema as JSON
493
+ steroids config schema ai # AI category only
494
+ steroids config schema --help # Show available categories
495
+
496
+ CATEGORIES:
497
+ ${(0, json_schema_js_1.getSchemaCategories)().map(c => ` ${c}`).join('\n')}
498
+ `);
499
+ return;
500
+ }
501
+ // If a category is specified, show just that category
502
+ if (positionals.length > 0) {
503
+ const category = positionals[0];
504
+ const categorySchema = (0, json_schema_js_1.getCategoryJsonSchema)(category);
505
+ if (!categorySchema) {
506
+ console.error(`Unknown category: ${category}`);
507
+ console.error('');
508
+ console.error('Available categories:');
509
+ (0, json_schema_js_1.getSchemaCategories)().forEach(c => console.error(` ${c}`));
510
+ process.exit(1);
511
+ }
512
+ console.log(JSON.stringify(categorySchema, null, 2));
513
+ return;
514
+ }
515
+ // Output full schema
516
+ const schema = (0, json_schema_js_1.toJsonSchema)();
517
+ console.log(JSON.stringify(schema, null, 2));
518
+ }
519
+ async function runAI(args, flags) {
520
+ const { values, positionals } = (0, node_util_1.parseArgs)({
521
+ args,
522
+ options: {
523
+ help: { type: 'boolean', short: 'h', default: false },
524
+ global: { type: 'boolean', default: false },
525
+ provider: { type: 'string', short: 'p' },
526
+ model: { type: 'string', short: 'm' },
527
+ },
528
+ allowPositionals: true,
529
+ });
530
+ if (values.help || flags.help) {
531
+ console.log(`
532
+ steroids config ai - Interactive AI provider and model setup
533
+
534
+ USAGE:
535
+ steroids config ai [role] [options]
536
+
537
+ ARGUMENTS:
538
+ [role] Role to configure: coder | reviewer | orchestrator
539
+
540
+ OPTIONS:
541
+ -p, --provider Provider (claude | openai | gemini) - skip interactive selection
542
+ -m, --model Model ID - skip interactive selection
543
+ --global Save to global config
544
+ -h, --help Show help
545
+
546
+ EXAMPLES:
547
+ steroids config ai # Interactive setup wizard
548
+ steroids config ai coder # Configure coder role
549
+ steroids config ai coder -p claude -m sonnet # Non-interactive setup
550
+ steroids config ai reviewer --global # Configure reviewer in global config
551
+
552
+ ENVIRONMENT VARIABLES:
553
+ ANTHROPIC_API_KEY Required for Claude models
554
+ OPENAI_API_KEY Required for OpenAI models
555
+ GOOGLE_API_KEY Required for Gemini models (or GEMINI_API_KEY)
556
+ `);
557
+ return;
558
+ }
559
+ const role = positionals[0];
560
+ if (role && !['coder', 'reviewer', 'orchestrator'].includes(role)) {
561
+ console.error(`Invalid role: ${role}`);
562
+ console.error('Valid roles: coder, reviewer, orchestrator');
563
+ process.exit(1);
564
+ }
565
+ if (values.provider) {
566
+ const provider = values.provider;
567
+ if (!['claude', 'openai', 'gemini'].includes(provider)) {
568
+ console.error(`Invalid provider: ${provider}`);
569
+ console.error('Valid providers: claude, openai, gemini');
570
+ process.exit(1);
571
+ }
572
+ const result = await (0, ai_setup_js_1.quickAISetup)({
573
+ role: role ?? 'coder',
574
+ provider,
575
+ model: values.model,
576
+ global: values.global,
577
+ });
578
+ if (!result.success) {
579
+ console.error(`Error: ${result.error}`);
580
+ process.exit(1);
581
+ }
582
+ console.log('✓ Configuration saved');
583
+ return;
584
+ }
585
+ await (0, ai_setup_js_1.runAISetup)({ role, global: values.global });
586
+ }
587
+ async function runModels(args, flags) {
588
+ const { values, positionals } = (0, node_util_1.parseArgs)({
589
+ args,
590
+ options: {
591
+ help: { type: 'boolean', short: 'h', default: false },
592
+ json: { type: 'boolean', short: 'j', default: false },
593
+ },
594
+ allowPositionals: true,
595
+ });
596
+ if (values.help || flags.help) {
597
+ console.log(`
598
+ steroids config models - List available models from provider API
599
+
600
+ USAGE:
601
+ steroids config models <provider> [options]
602
+
603
+ ARGUMENTS:
604
+ <provider> Provider to query: claude | openai | gemini
605
+
606
+ OPTIONS:
607
+ -j, --json Output as JSON
608
+ -h, --help Show help
609
+
610
+ EXAMPLES:
611
+ steroids config models claude # List Claude models
612
+ steroids config models openai --json # List OpenAI models as JSON
613
+ steroids config models gemini # List Gemini models
614
+
615
+ ENVIRONMENT VARIABLES:
616
+ ANTHROPIC_API_KEY Required for Claude
617
+ OPENAI_API_KEY Required for OpenAI
618
+ GOOGLE_API_KEY Required for Gemini (or GEMINI_API_KEY)
619
+ `);
620
+ return;
621
+ }
622
+ if (positionals.length === 0) {
623
+ console.error('Provider is required');
624
+ console.error('Usage: steroids config models <claude|openai|gemini>');
625
+ process.exit(2);
626
+ }
627
+ const provider = positionals[0];
628
+ if (!['claude', 'openai', 'gemini'].includes(provider)) {
629
+ console.error(`Invalid provider: ${provider}`);
630
+ console.error('Valid providers: claude, openai, gemini');
631
+ process.exit(2);
632
+ }
633
+ if (!(0, api_models_js_1.hasApiKey)(provider)) {
634
+ console.error(`${(0, api_models_js_1.getApiKeyEnvVar)(provider)} environment variable not set`);
635
+ process.exit(1);
636
+ }
637
+ console.error(`Fetching models from ${provider}...`);
638
+ const result = await (0, api_models_js_1.fetchModelsForProvider)(provider);
639
+ if (!result.success) {
640
+ console.error(`Error: ${result.error}`);
641
+ process.exit(1);
642
+ }
643
+ if (result.models.length === 0) {
644
+ console.log('No models found');
645
+ return;
646
+ }
647
+ if (values.json) {
648
+ console.log(JSON.stringify(result.models, null, 2));
649
+ }
650
+ else {
651
+ console.log('');
652
+ console.log(`Available ${provider} models:`);
653
+ console.log('');
654
+ for (const model of result.models) {
655
+ const ctx = model.contextWindow
656
+ ? ` (${(model.contextWindow / 1000).toFixed(0)}k ctx)`
657
+ : '';
658
+ console.log(` ${model.id}`);
659
+ console.log(` ${model.name}${ctx}`);
660
+ }
661
+ console.log('');
662
+ console.log(`Total: ${result.models.length} models`);
663
+ }
664
+ }
665
+ //# sourceMappingURL=config.js.map