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.
- package/LICENSE +21 -0
- package/README.md +640 -0
- package/dist/cli/colors.d.ts +110 -0
- package/dist/cli/colors.d.ts.map +1 -0
- package/dist/cli/colors.js +228 -0
- package/dist/cli/colors.js.map +1 -0
- package/dist/cli/env.d.ts +159 -0
- package/dist/cli/env.d.ts.map +1 -0
- package/dist/cli/env.js +227 -0
- package/dist/cli/env.js.map +1 -0
- package/dist/cli/errors.d.ts +166 -0
- package/dist/cli/errors.d.ts.map +1 -0
- package/dist/cli/errors.js +244 -0
- package/dist/cli/errors.js.map +1 -0
- package/dist/cli/flags.d.ts +75 -0
- package/dist/cli/flags.d.ts.map +1 -0
- package/dist/cli/flags.js +232 -0
- package/dist/cli/flags.js.map +1 -0
- package/dist/cli/help.d.ts +97 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/help.js +275 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/index.d.ts +13 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +29 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/interactive.d.ts +58 -0
- package/dist/cli/interactive.d.ts.map +1 -0
- package/dist/cli/interactive.js +127 -0
- package/dist/cli/interactive.js.map +1 -0
- package/dist/cli/output.d.ts +116 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +178 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/commands/about.d.ts +7 -0
- package/dist/commands/about.d.ts.map +1 -0
- package/dist/commands/about.js +259 -0
- package/dist/commands/about.js.map +1 -0
- package/dist/commands/ai.d.ts +6 -0
- package/dist/commands/ai.d.ts.map +1 -0
- package/dist/commands/ai.js +382 -0
- package/dist/commands/ai.js.map +1 -0
- package/dist/commands/backup.d.ts +3 -0
- package/dist/commands/backup.d.ts.map +1 -0
- package/dist/commands/backup.js +528 -0
- package/dist/commands/backup.js.map +1 -0
- package/dist/commands/completion.d.ts +3 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +405 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +665 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/disputes.d.ts +3 -0
- package/dist/commands/disputes.d.ts.map +1 -0
- package/dist/commands/disputes.js +499 -0
- package/dist/commands/disputes.js.map +1 -0
- package/dist/commands/gc.d.ts +3 -0
- package/dist/commands/gc.d.ts.map +1 -0
- package/dist/commands/gc.js +300 -0
- package/dist/commands/gc.js.map +1 -0
- package/dist/commands/git.d.ts +3 -0
- package/dist/commands/git.d.ts.map +1 -0
- package/dist/commands/git.js +458 -0
- package/dist/commands/git.js.map +1 -0
- package/dist/commands/health.d.ts +3 -0
- package/dist/commands/health.d.ts.map +1 -0
- package/dist/commands/health.js +604 -0
- package/dist/commands/health.js.map +1 -0
- package/dist/commands/hooks.d.ts +6 -0
- package/dist/commands/hooks.d.ts.map +1 -0
- package/dist/commands/hooks.js +529 -0
- package/dist/commands/hooks.js.map +1 -0
- package/dist/commands/init.d.ts +6 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +200 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/llm.d.ts +7 -0
- package/dist/commands/llm.d.ts.map +1 -0
- package/dist/commands/llm.js +285 -0
- package/dist/commands/llm.js.map +1 -0
- package/dist/commands/locks.d.ts +3 -0
- package/dist/commands/locks.d.ts.map +1 -0
- package/dist/commands/locks.js +431 -0
- package/dist/commands/locks.js.map +1 -0
- package/dist/commands/logs.d.ts +3 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +487 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/loop-phases.d.ts +11 -0
- package/dist/commands/loop-phases.d.ts.map +1 -0
- package/dist/commands/loop-phases.js +204 -0
- package/dist/commands/loop-phases.js.map +1 -0
- package/dist/commands/loop.d.ts +3 -0
- package/dist/commands/loop.d.ts.map +1 -0
- package/dist/commands/loop.js +396 -0
- package/dist/commands/loop.js.map +1 -0
- package/dist/commands/projects.d.ts +6 -0
- package/dist/commands/projects.d.ts.map +1 -0
- package/dist/commands/projects.js +362 -0
- package/dist/commands/projects.js.map +1 -0
- package/dist/commands/purge.d.ts +3 -0
- package/dist/commands/purge.d.ts.map +1 -0
- package/dist/commands/purge.js +516 -0
- package/dist/commands/purge.js.map +1 -0
- package/dist/commands/runners.d.ts +3 -0
- package/dist/commands/runners.d.ts.map +1 -0
- package/dist/commands/runners.js +1076 -0
- package/dist/commands/runners.js.map +1 -0
- package/dist/commands/scan.d.ts +3 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +291 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/sections-commands.d.ts +9 -0
- package/dist/commands/sections-commands.d.ts.map +1 -0
- package/dist/commands/sections-commands.js +282 -0
- package/dist/commands/sections-commands.js.map +1 -0
- package/dist/commands/sections-graph.d.ts +25 -0
- package/dist/commands/sections-graph.d.ts.map +1 -0
- package/dist/commands/sections-graph.js +180 -0
- package/dist/commands/sections-graph.js.map +1 -0
- package/dist/commands/sections.d.ts +3 -0
- package/dist/commands/sections.d.ts.map +1 -0
- package/dist/commands/sections.js +376 -0
- package/dist/commands/sections.js.map +1 -0
- package/dist/commands/stats.d.ts +6 -0
- package/dist/commands/stats.d.ts.map +1 -0
- package/dist/commands/stats.js +324 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/commands/tasks.d.ts +3 -0
- package/dist/commands/tasks.d.ts.map +1 -0
- package/dist/commands/tasks.js +1115 -0
- package/dist/commands/tasks.js.map +1 -0
- package/dist/commands/web.d.ts +7 -0
- package/dist/commands/web.d.ts.map +1 -0
- package/dist/commands/web.js +204 -0
- package/dist/commands/web.js.map +1 -0
- package/dist/config/ai-setup.d.ts +27 -0
- package/dist/config/ai-setup.d.ts.map +1 -0
- package/dist/config/ai-setup.js +432 -0
- package/dist/config/ai-setup.js.map +1 -0
- package/dist/config/browser.d.ts +9 -0
- package/dist/config/browser.d.ts.map +1 -0
- package/dist/config/browser.js +200 -0
- package/dist/config/browser.js.map +1 -0
- package/dist/config/json-schema.d.ts +28 -0
- package/dist/config/json-schema.d.ts.map +1 -0
- package/dist/config/json-schema.js +84 -0
- package/dist/config/json-schema.js.map +1 -0
- package/dist/config/loader.d.ts +152 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +270 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +34 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +437 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/validator.d.ts +32 -0
- package/dist/config/validator.d.ts.map +1 -0
- package/dist/config/validator.js +187 -0
- package/dist/config/validator.js.map +1 -0
- package/dist/database/connection.d.ts +35 -0
- package/dist/database/connection.d.ts.map +1 -0
- package/dist/database/connection.js +208 -0
- package/dist/database/connection.js.map +1 -0
- package/dist/database/queries.d.ts +218 -0
- package/dist/database/queries.d.ts.map +1 -0
- package/dist/database/queries.js +613 -0
- package/dist/database/queries.js.map +1 -0
- package/dist/database/schema.d.ts +8 -0
- package/dist/database/schema.d.ts.map +1 -0
- package/dist/database/schema.js +160 -0
- package/dist/database/schema.js.map +1 -0
- package/dist/disputes/behavior.d.ts +106 -0
- package/dist/disputes/behavior.d.ts.map +1 -0
- package/dist/disputes/behavior.js +150 -0
- package/dist/disputes/behavior.js.map +1 -0
- package/dist/disputes/create.d.ts +59 -0
- package/dist/disputes/create.d.ts.map +1 -0
- package/dist/disputes/create.js +222 -0
- package/dist/disputes/create.js.map +1 -0
- package/dist/disputes/index.d.ts +21 -0
- package/dist/disputes/index.d.ts.map +1 -0
- package/dist/disputes/index.js +76 -0
- package/dist/disputes/index.js.map +1 -0
- package/dist/disputes/markdown.d.ts +41 -0
- package/dist/disputes/markdown.d.ts.map +1 -0
- package/dist/disputes/markdown.js +261 -0
- package/dist/disputes/markdown.js.map +1 -0
- package/dist/disputes/queries.d.ts +83 -0
- package/dist/disputes/queries.d.ts.map +1 -0
- package/dist/disputes/queries.js +180 -0
- package/dist/disputes/queries.js.map +1 -0
- package/dist/disputes/resolve.d.ts +57 -0
- package/dist/disputes/resolve.d.ts.map +1 -0
- package/dist/disputes/resolve.js +171 -0
- package/dist/disputes/resolve.js.map +1 -0
- package/dist/disputes/stale.d.ts +98 -0
- package/dist/disputes/stale.d.ts.map +1 -0
- package/dist/disputes/stale.js +205 -0
- package/dist/disputes/stale.js.map +1 -0
- package/dist/disputes/types.d.ts +92 -0
- package/dist/disputes/types.d.ts.map +1 -0
- package/dist/disputes/types.js +100 -0
- package/dist/disputes/types.js.map +1 -0
- package/dist/git/push.d.ts +26 -0
- package/dist/git/push.d.ts.map +1 -0
- package/dist/git/push.js +97 -0
- package/dist/git/push.js.map +1 -0
- package/dist/git/status.d.ts +61 -0
- package/dist/git/status.d.ts.map +1 -0
- package/dist/git/status.js +251 -0
- package/dist/git/status.js.map +1 -0
- package/dist/hooks/events.d.ts +72 -0
- package/dist/hooks/events.d.ts.map +1 -0
- package/dist/hooks/events.js +120 -0
- package/dist/hooks/events.js.map +1 -0
- package/dist/hooks/index.d.ts +19 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +48 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/integration.d.ts +69 -0
- package/dist/hooks/integration.d.ts.map +1 -0
- package/dist/hooks/integration.js +179 -0
- package/dist/hooks/integration.js.map +1 -0
- package/dist/hooks/merge.d.ts +115 -0
- package/dist/hooks/merge.d.ts.map +1 -0
- package/dist/hooks/merge.js +161 -0
- package/dist/hooks/merge.js.map +1 -0
- package/dist/hooks/orchestrator.d.ts +115 -0
- package/dist/hooks/orchestrator.d.ts.map +1 -0
- package/dist/hooks/orchestrator.js +226 -0
- package/dist/hooks/orchestrator.js.map +1 -0
- package/dist/hooks/payload.d.ts +294 -0
- package/dist/hooks/payload.d.ts.map +1 -0
- package/dist/hooks/payload.js +267 -0
- package/dist/hooks/payload.js.map +1 -0
- package/dist/hooks/script-runner.d.ts +63 -0
- package/dist/hooks/script-runner.d.ts.map +1 -0
- package/dist/hooks/script-runner.js +221 -0
- package/dist/hooks/script-runner.js.map +1 -0
- package/dist/hooks/templates.d.ts +104 -0
- package/dist/hooks/templates.d.ts.map +1 -0
- package/dist/hooks/templates.js +327 -0
- package/dist/hooks/templates.js.map +1 -0
- package/dist/hooks/webhook-runner.d.ts +69 -0
- package/dist/hooks/webhook-runner.d.ts.map +1 -0
- package/dist/hooks/webhook-runner.js +208 -0
- package/dist/hooks/webhook-runner.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +281 -0
- package/dist/index.js.map +1 -0
- package/dist/locking/cleanup.d.ts +70 -0
- package/dist/locking/cleanup.d.ts.map +1 -0
- package/dist/locking/cleanup.js +157 -0
- package/dist/locking/cleanup.js.map +1 -0
- package/dist/locking/queries.d.ts +116 -0
- package/dist/locking/queries.d.ts.map +1 -0
- package/dist/locking/queries.js +255 -0
- package/dist/locking/queries.js.map +1 -0
- package/dist/locking/section-lock.d.ts +74 -0
- package/dist/locking/section-lock.d.ts.map +1 -0
- package/dist/locking/section-lock.js +207 -0
- package/dist/locking/section-lock.js.map +1 -0
- package/dist/locking/task-lock.d.ts +92 -0
- package/dist/locking/task-lock.d.ts.map +1 -0
- package/dist/locking/task-lock.js +246 -0
- package/dist/locking/task-lock.js.map +1 -0
- package/dist/migrations/index.d.ts +7 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +37 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/migrations/manifest.d.ts +92 -0
- package/dist/migrations/manifest.d.ts.map +1 -0
- package/dist/migrations/manifest.js +270 -0
- package/dist/migrations/manifest.js.map +1 -0
- package/dist/migrations/runner.d.ts +84 -0
- package/dist/migrations/runner.d.ts.map +1 -0
- package/dist/migrations/runner.js +351 -0
- package/dist/migrations/runner.js.map +1 -0
- package/dist/orchestrator/coder.d.ts +32 -0
- package/dist/orchestrator/coder.d.ts.map +1 -0
- package/dist/orchestrator/coder.js +174 -0
- package/dist/orchestrator/coder.js.map +1 -0
- package/dist/orchestrator/coordinator.d.ts +28 -0
- package/dist/orchestrator/coordinator.d.ts.map +1 -0
- package/dist/orchestrator/coordinator.js +256 -0
- package/dist/orchestrator/coordinator.js.map +1 -0
- package/dist/orchestrator/reviewer.d.ts +35 -0
- package/dist/orchestrator/reviewer.d.ts.map +1 -0
- package/dist/orchestrator/reviewer.js +241 -0
- package/dist/orchestrator/reviewer.js.map +1 -0
- package/dist/orchestrator/task-selector.d.ts +102 -0
- package/dist/orchestrator/task-selector.d.ts.map +1 -0
- package/dist/orchestrator/task-selector.js +341 -0
- package/dist/orchestrator/task-selector.js.map +1 -0
- package/dist/prompts/coder.d.ts +36 -0
- package/dist/prompts/coder.d.ts.map +1 -0
- package/dist/prompts/coder.js +315 -0
- package/dist/prompts/coder.js.map +1 -0
- package/dist/prompts/prompt-helpers.d.ts +51 -0
- package/dist/prompts/prompt-helpers.d.ts.map +1 -0
- package/dist/prompts/prompt-helpers.js +312 -0
- package/dist/prompts/prompt-helpers.js.map +1 -0
- package/dist/prompts/reviewer.d.ts +40 -0
- package/dist/prompts/reviewer.d.ts.map +1 -0
- package/dist/prompts/reviewer.js +438 -0
- package/dist/prompts/reviewer.js.map +1 -0
- package/dist/providers/api-models.d.ts +65 -0
- package/dist/providers/api-models.d.ts.map +1 -0
- package/dist/providers/api-models.js +323 -0
- package/dist/providers/api-models.js.map +1 -0
- package/dist/providers/claude.d.ts +53 -0
- package/dist/providers/claude.d.ts.map +1 -0
- package/dist/providers/claude.js +229 -0
- package/dist/providers/claude.js.map +1 -0
- package/dist/providers/codex.d.ts +53 -0
- package/dist/providers/codex.d.ts.map +1 -0
- package/dist/providers/codex.js +214 -0
- package/dist/providers/codex.js.map +1 -0
- package/dist/providers/gemini.d.ts +58 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +242 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/index.d.ts +13 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +49 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/interface.d.ts +173 -0
- package/dist/providers/interface.d.ts.map +1 -0
- package/dist/providers/interface.js +96 -0
- package/dist/providers/interface.js.map +1 -0
- package/dist/providers/invocation-logger.d.ts +114 -0
- package/dist/providers/invocation-logger.d.ts.map +1 -0
- package/dist/providers/invocation-logger.js +298 -0
- package/dist/providers/invocation-logger.js.map +1 -0
- package/dist/providers/openai.d.ts +53 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +232 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/registry.d.ts +100 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +178 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/runners/activity-log.d.ts +65 -0
- package/dist/runners/activity-log.d.ts.map +1 -0
- package/dist/runners/activity-log.js +148 -0
- package/dist/runners/activity-log.js.map +1 -0
- package/dist/runners/cron.d.ts +26 -0
- package/dist/runners/cron.d.ts.map +1 -0
- package/dist/runners/cron.js +176 -0
- package/dist/runners/cron.js.map +1 -0
- package/dist/runners/daemon.d.ts +71 -0
- package/dist/runners/daemon.d.ts.map +1 -0
- package/dist/runners/daemon.js +245 -0
- package/dist/runners/daemon.js.map +1 -0
- package/dist/runners/global-db.d.ts +31 -0
- package/dist/runners/global-db.d.ts.map +1 -0
- package/dist/runners/global-db.js +230 -0
- package/dist/runners/global-db.js.map +1 -0
- package/dist/runners/hang-detector.d.ts +38 -0
- package/dist/runners/hang-detector.d.ts.map +1 -0
- package/dist/runners/hang-detector.js +136 -0
- package/dist/runners/hang-detector.js.map +1 -0
- package/dist/runners/heartbeat.d.ts +39 -0
- package/dist/runners/heartbeat.d.ts.map +1 -0
- package/dist/runners/heartbeat.js +79 -0
- package/dist/runners/heartbeat.js.map +1 -0
- package/dist/runners/lock.d.ts +47 -0
- package/dist/runners/lock.d.ts.map +1 -0
- package/dist/runners/lock.js +150 -0
- package/dist/runners/lock.js.map +1 -0
- package/dist/runners/orchestrator-loop.d.ts +20 -0
- package/dist/runners/orchestrator-loop.d.ts.map +1 -0
- package/dist/runners/orchestrator-loop.js +285 -0
- package/dist/runners/orchestrator-loop.js.map +1 -0
- package/dist/runners/projects.d.ts +96 -0
- package/dist/runners/projects.d.ts.map +1 -0
- package/dist/runners/projects.js +255 -0
- package/dist/runners/projects.js.map +1 -0
- package/dist/runners/wakeup.d.ts +34 -0
- package/dist/runners/wakeup.d.ts.map +1 -0
- package/dist/runners/wakeup.js +291 -0
- package/dist/runners/wakeup.js.map +1 -0
- package/migrations/001_initial_schema.sql +106 -0
- package/migrations/002_add_commit_sha.sql +12 -0
- package/migrations/003_add_section_priority.sql +13 -0
- package/migrations/004_add_section_dependencies.sql +18 -0
- package/migrations/005_add_audit_actor_model.sql +10 -0
- package/migrations/006_add_task_invocations.sql +33 -0
- package/migrations/007_add_file_anchor.sql +14 -0
- package/migrations/manifest.json +62 -0
- 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>
|