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
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* About Command
|
|
4
|
+
* Explains what Steroids is for LLMs discovering the tool
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.aboutCommand = aboutCommand;
|
|
8
|
+
const output_js_1 = require("../cli/output.js");
|
|
9
|
+
const help_js_1 = require("../cli/help.js");
|
|
10
|
+
const ABOUT_TEXT = `
|
|
11
|
+
STEROIDS - Automated Task Execution System
|
|
12
|
+
===========================================
|
|
13
|
+
|
|
14
|
+
Steroids is an AI-powered task orchestration system that manages software
|
|
15
|
+
development tasks through a coder/reviewer loop. It enables LLMs to work
|
|
16
|
+
autonomously on codebases while maintaining quality through automated review.
|
|
17
|
+
|
|
18
|
+
CORE CONCEPT
|
|
19
|
+
------------
|
|
20
|
+
Tasks are organized into sections and processed by two AI roles:
|
|
21
|
+
|
|
22
|
+
1. CODER: Implements tasks by writing code, running builds, and tests
|
|
23
|
+
2. REVIEWER: Reviews completed work, approves or rejects with feedback
|
|
24
|
+
|
|
25
|
+
When rejected, tasks return to the coder with notes. This loop continues
|
|
26
|
+
until approval or a dispute is raised (after 15 rejections).
|
|
27
|
+
|
|
28
|
+
HOW IT WORKS
|
|
29
|
+
------------
|
|
30
|
+
1. Human creates tasks with specifications in markdown files
|
|
31
|
+
2. Runner daemon picks up pending tasks in priority order
|
|
32
|
+
3. Coder AI implements the task following the specification
|
|
33
|
+
4. Reviewer AI evaluates the implementation
|
|
34
|
+
5. On approval: task marked complete, next task starts
|
|
35
|
+
6. On rejection: task returns to coder with feedback
|
|
36
|
+
7. After 15 rejections: dispute raised for human resolution
|
|
37
|
+
|
|
38
|
+
KEY COMMANDS FOR LLMs
|
|
39
|
+
---------------------
|
|
40
|
+
steroids tasks list List pending tasks
|
|
41
|
+
steroids tasks list --status all Show all tasks with status
|
|
42
|
+
steroids sections list Show task sections
|
|
43
|
+
steroids tasks update <id> --status review Submit work for review
|
|
44
|
+
steroids tasks approve <id> Approve as reviewer
|
|
45
|
+
steroids tasks reject <id> --notes "..." Reject with feedback
|
|
46
|
+
steroids dispute create Raise a dispute
|
|
47
|
+
|
|
48
|
+
TASK LIFECYCLE
|
|
49
|
+
--------------
|
|
50
|
+
pending -> in_progress -> review -> completed
|
|
51
|
+
^ |
|
|
52
|
+
| v (rejected)
|
|
53
|
+
+----------+
|
|
54
|
+
|
|
55
|
+
SPECIFICATIONS
|
|
56
|
+
--------------
|
|
57
|
+
Each task has a sourceFile pointing to a markdown specification.
|
|
58
|
+
The coder MUST follow this specification exactly.
|
|
59
|
+
The reviewer MUST verify the implementation matches the spec.
|
|
60
|
+
|
|
61
|
+
PROJECT SETUP - HOW TO STRUCTURE WORK
|
|
62
|
+
-------------------------------------
|
|
63
|
+
Steroids works best when projects are structured correctly. Think of it like
|
|
64
|
+
building a house: sections are rooms, tasks are individual construction steps.
|
|
65
|
+
|
|
66
|
+
SECTIONS = Features or Functional Areas
|
|
67
|
+
- Each section represents ONE cohesive piece of functionality
|
|
68
|
+
- Sections should be independent enough to be worked on in isolation
|
|
69
|
+
- Name sections clearly: "Phase 1: User Authentication", "Phase 2: Dashboard"
|
|
70
|
+
- Sections have priorities and can depend on other sections
|
|
71
|
+
|
|
72
|
+
TASKS = Small, Atomic Implementation Steps
|
|
73
|
+
- Each task should be completable in ONE focused session (15-60 min of AI work)
|
|
74
|
+
- Tasks should do ONE thing well - if you say "and" you might need two tasks
|
|
75
|
+
- Tasks must have a clear specification file explaining exactly what to build
|
|
76
|
+
- Tasks are ordered within sections - earlier tasks may set up later ones
|
|
77
|
+
|
|
78
|
+
EXAMPLE FROM THIS PROJECT (steroids-cli):
|
|
79
|
+
Section: "Phase 0.7: Section Focus"
|
|
80
|
+
Tasks:
|
|
81
|
+
1. Add --section flag to loop command
|
|
82
|
+
2. Add sectionId parameter to TaskSelectionOptions
|
|
83
|
+
3. Update task selection queries to filter by section
|
|
84
|
+
4. Update loop display to show focused section
|
|
85
|
+
5. Add section validation
|
|
86
|
+
|
|
87
|
+
Each task is small and specific. Together they implement "section focus."
|
|
88
|
+
|
|
89
|
+
WRITING GOOD SPECIFICATIONS:
|
|
90
|
+
- Create a specs/ directory with markdown files
|
|
91
|
+
- Each spec should include: purpose, requirements, examples, edge cases
|
|
92
|
+
- Reference existing code patterns the implementation should follow
|
|
93
|
+
- Include acceptance criteria - how do we know it's done?
|
|
94
|
+
|
|
95
|
+
EXAMPLE SPEC STRUCTURE (specs/feature-name.md):
|
|
96
|
+
# Feature Name
|
|
97
|
+
|
|
98
|
+
## Overview
|
|
99
|
+
What this feature does and why.
|
|
100
|
+
|
|
101
|
+
## Requirements
|
|
102
|
+
- Specific requirement 1
|
|
103
|
+
- Specific requirement 2
|
|
104
|
+
|
|
105
|
+
## Implementation Notes
|
|
106
|
+
- Follow pattern in src/existing/similar.ts
|
|
107
|
+
- Use existing utility from src/utils/helper.ts
|
|
108
|
+
|
|
109
|
+
## Examples
|
|
110
|
+
\`\`\`bash
|
|
111
|
+
steroids command --flag value
|
|
112
|
+
# Expected output...
|
|
113
|
+
\`\`\`
|
|
114
|
+
|
|
115
|
+
## Acceptance Criteria
|
|
116
|
+
- [ ] Command works as shown in examples
|
|
117
|
+
- [ ] Tests pass
|
|
118
|
+
- [ ] Documentation updated
|
|
119
|
+
|
|
120
|
+
ADDING TASKS
|
|
121
|
+
-----------
|
|
122
|
+
steroids tasks add <title> --section <id> --source <spec-file> [options]
|
|
123
|
+
|
|
124
|
+
Required:
|
|
125
|
+
--section <id> Section the task belongs to
|
|
126
|
+
--source <file> Specification markdown file for the coder/reviewer
|
|
127
|
+
|
|
128
|
+
Optional:
|
|
129
|
+
--file <path> Anchor task to a specific file (must be committed in git)
|
|
130
|
+
--line <number> Line number in the anchored file (requires --file)
|
|
131
|
+
--feedback Add to "Needs User Input" section (skips --section/--source)
|
|
132
|
+
|
|
133
|
+
When --file is used, Steroids validates the file is tracked and clean in git,
|
|
134
|
+
then auto-captures the commit SHA and content hash. The coder/reviewer prompts
|
|
135
|
+
will reference this exact file location.
|
|
136
|
+
|
|
137
|
+
When --feedback is used, the task goes to a special skipped section called
|
|
138
|
+
"Needs User Input" that the runner ignores. Use for advisory items, disputes,
|
|
139
|
+
or anything needing human review.
|
|
140
|
+
|
|
141
|
+
Examples:
|
|
142
|
+
steroids tasks add "Implement login" --section abc123 --source specs/login.md
|
|
143
|
+
steroids tasks add "Fix null check" --section abc123 --source spec.md --file src/utils.ts --line 42
|
|
144
|
+
steroids tasks add "Review execSync usage" --feedback
|
|
145
|
+
|
|
146
|
+
INITIALIZING A PROJECT:
|
|
147
|
+
1. steroids init # Creates .steroids/ directory
|
|
148
|
+
2. Create specs/ with your specifications
|
|
149
|
+
3. steroids sections add "Phase 1: Feature Name"
|
|
150
|
+
4. steroids tasks add "Task title" --section <id> --source specs/spec.md
|
|
151
|
+
5. steroids loop # Start processing
|
|
152
|
+
|
|
153
|
+
IMPORTANT RULES
|
|
154
|
+
---------------
|
|
155
|
+
- Always run build AND tests before submitting for review
|
|
156
|
+
- Read the task specification thoroughly before implementing
|
|
157
|
+
- Make small, focused commits
|
|
158
|
+
- Never modify code outside the task scope
|
|
159
|
+
- If stuck, create a dispute rather than guessing
|
|
160
|
+
|
|
161
|
+
For full documentation:
|
|
162
|
+
- CLI: steroids --help
|
|
163
|
+
- Tasks: steroids tasks --help
|
|
164
|
+
- Config: steroids config show
|
|
165
|
+
`;
|
|
166
|
+
const HELP = (0, help_js_1.generateHelp)({
|
|
167
|
+
command: 'about',
|
|
168
|
+
description: 'Explains what Steroids is and how it works',
|
|
169
|
+
details: `Designed for LLMs discovering this tool for the first time.
|
|
170
|
+
Provides comprehensive overview of architecture, workflow, and best practices.
|
|
171
|
+
Use --json for structured output optimized for LLM parsing.`,
|
|
172
|
+
usage: ['steroids about [options]'],
|
|
173
|
+
examples: [
|
|
174
|
+
{ command: 'steroids about', description: 'Human-readable explanation' },
|
|
175
|
+
{ command: 'steroids about --json', description: 'Structured JSON for LLM parsing' },
|
|
176
|
+
],
|
|
177
|
+
related: [
|
|
178
|
+
{ command: 'steroids llm', description: 'Compact quick reference when context is lost' },
|
|
179
|
+
{ command: 'steroids --help', description: 'CLI help with all commands' },
|
|
180
|
+
],
|
|
181
|
+
showGlobalOptions: true,
|
|
182
|
+
showExitCodes: false,
|
|
183
|
+
showEnvVars: false,
|
|
184
|
+
});
|
|
185
|
+
async function aboutCommand(args, flags) {
|
|
186
|
+
const out = (0, output_js_1.createOutput)({ command: 'about', flags });
|
|
187
|
+
if (flags.help) {
|
|
188
|
+
out.log(HELP);
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
const data = {
|
|
192
|
+
name: 'Steroids',
|
|
193
|
+
description: 'AI-powered task orchestration with coder/reviewer loop',
|
|
194
|
+
version: process.env.npm_package_version ?? '0.0.0',
|
|
195
|
+
concept: {
|
|
196
|
+
roles: [
|
|
197
|
+
{ name: 'coder', purpose: 'Implements tasks by writing code, running builds and tests' },
|
|
198
|
+
{ name: 'reviewer', purpose: 'Reviews completed work, approves or rejects with feedback' },
|
|
199
|
+
],
|
|
200
|
+
workflow: [
|
|
201
|
+
'Human creates tasks with specifications',
|
|
202
|
+
'Runner picks up pending tasks',
|
|
203
|
+
'Coder implements following specification',
|
|
204
|
+
'Reviewer evaluates implementation',
|
|
205
|
+
'Approved: task complete, next starts',
|
|
206
|
+
'Rejected: returns to coder with notes',
|
|
207
|
+
'After 15 rejections: dispute raised',
|
|
208
|
+
],
|
|
209
|
+
lifecycle: ['pending', 'in_progress', 'review', 'completed'],
|
|
210
|
+
},
|
|
211
|
+
projectSetup: {
|
|
212
|
+
sections: 'Features or functional areas - each represents ONE cohesive piece of functionality',
|
|
213
|
+
tasks: 'Small, atomic implementation steps - completable in 15-60 min, does ONE thing well',
|
|
214
|
+
specifications: 'Markdown files in specs/ with purpose, requirements, examples, acceptance criteria',
|
|
215
|
+
example: {
|
|
216
|
+
section: 'Phase 0.7: Section Focus',
|
|
217
|
+
tasks: [
|
|
218
|
+
'Add --section flag to loop command',
|
|
219
|
+
'Add sectionId parameter to TaskSelectionOptions',
|
|
220
|
+
'Update task selection queries to filter by section',
|
|
221
|
+
'Update loop display to show focused section',
|
|
222
|
+
'Add section validation',
|
|
223
|
+
],
|
|
224
|
+
},
|
|
225
|
+
steps: [
|
|
226
|
+
'steroids init - creates .steroids/ directory',
|
|
227
|
+
'Create specs/ with your specifications',
|
|
228
|
+
'steroids sections add "Phase 1: Feature Name"',
|
|
229
|
+
'steroids tasks add "Task title" --section <id> --source specs/spec.md',
|
|
230
|
+
'steroids tasks add "Task title" --section <id> --source spec.md --file src/foo.ts --line 42 (anchor to file)',
|
|
231
|
+
'steroids tasks add "Advisory note" --feedback (skipped section for human review)',
|
|
232
|
+
'steroids loop - start processing',
|
|
233
|
+
],
|
|
234
|
+
},
|
|
235
|
+
commands: [
|
|
236
|
+
{ command: 'steroids tasks list', description: 'List pending tasks' },
|
|
237
|
+
{ command: 'steroids tasks list --status all', description: 'Show all tasks' },
|
|
238
|
+
{ command: 'steroids sections list', description: 'Show task sections' },
|
|
239
|
+
{ command: 'steroids tasks update <id> --status review', description: 'Submit for review' },
|
|
240
|
+
{ command: 'steroids tasks approve <id>', description: 'Approve as reviewer' },
|
|
241
|
+
{ command: 'steroids tasks reject <id> --notes "..."', description: 'Reject with feedback' },
|
|
242
|
+
{ command: 'steroids dispute create', description: 'Raise a dispute' },
|
|
243
|
+
],
|
|
244
|
+
rules: [
|
|
245
|
+
'Always run build AND tests before submitting for review',
|
|
246
|
+
'Read the task specification thoroughly before implementing',
|
|
247
|
+
'Make small, focused commits',
|
|
248
|
+
'Never modify code outside the task scope',
|
|
249
|
+
'If stuck, create a dispute rather than guessing',
|
|
250
|
+
],
|
|
251
|
+
};
|
|
252
|
+
if (flags.json) {
|
|
253
|
+
out.success(data);
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
out.log(ABOUT_TEXT);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=about.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"about.js","sourceRoot":"","sources":["../../src/commands/about.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../src/commands/ai.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AA4CnD,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BjF"}
|
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* steroids ai - AI provider management and testing
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.aiCommand = aiCommand;
|
|
7
|
+
const node_util_1 = require("node:util");
|
|
8
|
+
const output_js_1 = require("../cli/output.js");
|
|
9
|
+
const colors_js_1 = require("../cli/colors.js");
|
|
10
|
+
const help_js_1 = require("../cli/help.js");
|
|
11
|
+
const registry_js_1 = require("../providers/registry.js");
|
|
12
|
+
const ai_setup_js_1 = require("../config/ai-setup.js");
|
|
13
|
+
const api_models_js_1 = require("../providers/api-models.js");
|
|
14
|
+
const loader_js_1 = require("../config/loader.js");
|
|
15
|
+
const HELP = (0, help_js_1.generateHelp)({
|
|
16
|
+
command: 'ai',
|
|
17
|
+
description: 'AI provider management and testing',
|
|
18
|
+
details: `Manage AI providers, detect installed CLIs, list available models, and test configurations.`,
|
|
19
|
+
usage: ['steroids ai <subcommand> [options]'],
|
|
20
|
+
subcommands: [
|
|
21
|
+
{ name: 'providers', description: 'List all detected AI providers' },
|
|
22
|
+
{ name: 'models', args: '<provider>', description: 'List available models for a provider' },
|
|
23
|
+
{ name: 'test', args: '<role>', description: 'Test provider configuration for a role' },
|
|
24
|
+
{ name: 'setup', args: '[role]', description: 'Run interactive setup wizard' },
|
|
25
|
+
],
|
|
26
|
+
options: [
|
|
27
|
+
{ long: 'api', description: 'Fetch models from API (requires API key) (models)' },
|
|
28
|
+
{ long: 'global', description: 'Use global config (setup)' },
|
|
29
|
+
],
|
|
30
|
+
examples: [
|
|
31
|
+
{ command: 'steroids ai providers', description: 'List all detected providers' },
|
|
32
|
+
{ command: 'steroids ai models claude', description: 'List Claude models from CLI' },
|
|
33
|
+
{ command: 'steroids ai models openai --api', description: 'Fetch OpenAI models from API' },
|
|
34
|
+
{ command: 'steroids ai test coder', description: 'Test coder provider configuration' },
|
|
35
|
+
{ command: 'steroids ai setup', description: 'Interactive setup wizard' },
|
|
36
|
+
{ command: 'steroids ai setup reviewer', description: 'Configure reviewer role' },
|
|
37
|
+
],
|
|
38
|
+
related: [
|
|
39
|
+
{ command: 'steroids config ai', description: 'Alternative setup command' },
|
|
40
|
+
{ command: 'steroids config show ai', description: 'Show current AI config' },
|
|
41
|
+
],
|
|
42
|
+
});
|
|
43
|
+
async function aiCommand(args, flags) {
|
|
44
|
+
const out = (0, output_js_1.createOutput)({ command: 'ai', flags });
|
|
45
|
+
if (flags.help || args.length === 0 || args[0] === '-h' || args[0] === '--help') {
|
|
46
|
+
out.log(HELP);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const subcommand = args[0];
|
|
50
|
+
const subArgs = args.slice(1);
|
|
51
|
+
switch (subcommand) {
|
|
52
|
+
case 'providers':
|
|
53
|
+
await providersSubcommand(subArgs, flags);
|
|
54
|
+
break;
|
|
55
|
+
case 'models':
|
|
56
|
+
await modelsSubcommand(subArgs, flags);
|
|
57
|
+
break;
|
|
58
|
+
case 'test':
|
|
59
|
+
await testSubcommand(subArgs, flags);
|
|
60
|
+
break;
|
|
61
|
+
case 'setup':
|
|
62
|
+
await setupSubcommand(subArgs, flags);
|
|
63
|
+
break;
|
|
64
|
+
default:
|
|
65
|
+
out.error('INVALID_ARGUMENTS', `Unknown subcommand: ${subcommand}`);
|
|
66
|
+
out.log(HELP);
|
|
67
|
+
process.exit(1);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* steroids ai providers - List detected providers
|
|
72
|
+
*/
|
|
73
|
+
async function providersSubcommand(args, flags) {
|
|
74
|
+
const out = (0, output_js_1.createOutput)({ command: 'ai providers', flags });
|
|
75
|
+
const { values } = (0, node_util_1.parseArgs)({
|
|
76
|
+
args,
|
|
77
|
+
options: {
|
|
78
|
+
help: { type: 'boolean', short: 'h', default: false },
|
|
79
|
+
},
|
|
80
|
+
allowPositionals: false,
|
|
81
|
+
});
|
|
82
|
+
if (values.help || flags.help) {
|
|
83
|
+
out.log(`
|
|
84
|
+
steroids ai providers - List detected AI providers
|
|
85
|
+
|
|
86
|
+
USAGE:
|
|
87
|
+
steroids ai providers [options]
|
|
88
|
+
|
|
89
|
+
OPTIONS:
|
|
90
|
+
-j, --json Output as JSON
|
|
91
|
+
-h, --help Show help
|
|
92
|
+
|
|
93
|
+
DESCRIPTION:
|
|
94
|
+
Detects which AI provider CLIs are installed and available.
|
|
95
|
+
Shows CLI path and available models for each provider.
|
|
96
|
+
`);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const registry = (0, registry_js_1.getProviderRegistry)();
|
|
100
|
+
const statuses = await registry.getStatus();
|
|
101
|
+
if (flags.json) {
|
|
102
|
+
out.success({ providers: statuses });
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
out.log('');
|
|
106
|
+
out.log(colors_js_1.colors.bold('Detected AI Providers:'));
|
|
107
|
+
out.log('');
|
|
108
|
+
for (const status of statuses) {
|
|
109
|
+
const icon = status.available ? colors_js_1.markers.success('') : colors_js_1.markers.error('');
|
|
110
|
+
const availText = status.available ? colors_js_1.colors.green('available') : colors_js_1.colors.red('not installed');
|
|
111
|
+
out.log(` ${icon} ${colors_js_1.colors.bold(status.displayName)} (${status.name})`);
|
|
112
|
+
out.log(` Status: ${availText}`);
|
|
113
|
+
if (status.cliPath) {
|
|
114
|
+
out.log(` CLI: ${colors_js_1.colors.cyan(status.cliPath)}`);
|
|
115
|
+
}
|
|
116
|
+
if (status.models.length > 0) {
|
|
117
|
+
out.log(` Models: ${status.models.join(', ')}`);
|
|
118
|
+
}
|
|
119
|
+
out.log('');
|
|
120
|
+
}
|
|
121
|
+
const availableCount = statuses.filter((s) => s.available).length;
|
|
122
|
+
out.log(`${availableCount} of ${statuses.length} providers available`);
|
|
123
|
+
out.log('');
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* steroids ai models - List models for a provider
|
|
127
|
+
*/
|
|
128
|
+
async function modelsSubcommand(args, flags) {
|
|
129
|
+
const out = (0, output_js_1.createOutput)({ command: 'ai models', flags });
|
|
130
|
+
const { values, positionals } = (0, node_util_1.parseArgs)({
|
|
131
|
+
args,
|
|
132
|
+
options: {
|
|
133
|
+
help: { type: 'boolean', short: 'h', default: false },
|
|
134
|
+
api: { type: 'boolean', default: false },
|
|
135
|
+
},
|
|
136
|
+
allowPositionals: true,
|
|
137
|
+
});
|
|
138
|
+
if (values.help || flags.help || positionals.length === 0) {
|
|
139
|
+
out.log(`
|
|
140
|
+
steroids ai models <provider> - List available models
|
|
141
|
+
|
|
142
|
+
USAGE:
|
|
143
|
+
steroids ai models <provider> [options]
|
|
144
|
+
|
|
145
|
+
ARGUMENTS:
|
|
146
|
+
<provider> Provider name: claude | openai | gemini | codex
|
|
147
|
+
|
|
148
|
+
OPTIONS:
|
|
149
|
+
--api Fetch models from API (requires API key)
|
|
150
|
+
-j, --json Output as JSON
|
|
151
|
+
-h, --help Show help
|
|
152
|
+
|
|
153
|
+
EXAMPLES:
|
|
154
|
+
steroids ai models claude # List Claude models from CLI
|
|
155
|
+
steroids ai models openai --api # Fetch OpenAI models from API
|
|
156
|
+
|
|
157
|
+
ENVIRONMENT VARIABLES:
|
|
158
|
+
ANTHROPIC_API_KEY Required for Claude API access
|
|
159
|
+
OPENAI_API_KEY Required for OpenAI API access
|
|
160
|
+
GOOGLE_API_KEY Required for Gemini API access
|
|
161
|
+
`);
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
const provider = positionals[0];
|
|
165
|
+
if (!['claude', 'openai', 'gemini', 'codex'].includes(provider)) {
|
|
166
|
+
out.error('INVALID_ARGUMENTS', `Invalid provider: ${provider}`);
|
|
167
|
+
out.log('Valid providers: claude, openai, gemini, codex');
|
|
168
|
+
process.exit(2);
|
|
169
|
+
}
|
|
170
|
+
if (values.api) {
|
|
171
|
+
// Fetch from API
|
|
172
|
+
if (!['claude', 'openai', 'gemini'].includes(provider)) {
|
|
173
|
+
out.error('INVALID_ARGUMENTS', `Provider ${provider} does not support API model fetching`);
|
|
174
|
+
process.exit(2);
|
|
175
|
+
}
|
|
176
|
+
if (!(0, api_models_js_1.hasApiKey)(provider)) {
|
|
177
|
+
out.error('CONFIGURATION_ERROR', `${(0, api_models_js_1.getApiKeyEnvVar)(provider)} environment variable not set`);
|
|
178
|
+
process.exit(1);
|
|
179
|
+
}
|
|
180
|
+
out.verbose(`Fetching models from ${provider} API...`);
|
|
181
|
+
const result = await (0, api_models_js_1.fetchModelsForProvider)(provider);
|
|
182
|
+
if (!result.success) {
|
|
183
|
+
out.error('GENERAL_ERROR', `Failed to fetch models: ${result.error}`);
|
|
184
|
+
process.exit(1);
|
|
185
|
+
}
|
|
186
|
+
if (flags.json) {
|
|
187
|
+
out.success({ provider, models: result.models });
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
out.log('');
|
|
191
|
+
out.log(colors_js_1.colors.bold(`${provider} models (from API):`));
|
|
192
|
+
out.log('');
|
|
193
|
+
for (const model of result.models) {
|
|
194
|
+
const ctx = model.contextWindow
|
|
195
|
+
? colors_js_1.colors.dim(` (${(model.contextWindow / 1000).toFixed(0)}k ctx)`)
|
|
196
|
+
: '';
|
|
197
|
+
out.log(` ${colors_js_1.colors.cyan(model.id)}`);
|
|
198
|
+
out.log(` ${model.name}${ctx}`);
|
|
199
|
+
}
|
|
200
|
+
out.log('');
|
|
201
|
+
out.log(`Total: ${result.models.length} models`);
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
// Get from CLI provider registry
|
|
205
|
+
const models = (0, api_models_js_1.getModelsForProvider)(provider);
|
|
206
|
+
if (models.length === 0) {
|
|
207
|
+
out.error('NOT_FOUND', `No models found for provider: ${provider}`);
|
|
208
|
+
process.exit(1);
|
|
209
|
+
}
|
|
210
|
+
if (flags.json) {
|
|
211
|
+
out.success({ provider, models });
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
out.log('');
|
|
215
|
+
out.log(colors_js_1.colors.bold(`${provider} models:`));
|
|
216
|
+
out.log('');
|
|
217
|
+
for (const model of models) {
|
|
218
|
+
const recommended = model.recommendedFor && model.recommendedFor.length > 0
|
|
219
|
+
? colors_js_1.colors.dim(` (recommended for: ${model.recommendedFor.join(', ')})`)
|
|
220
|
+
: '';
|
|
221
|
+
out.log(` ${colors_js_1.colors.cyan(model.id)}`);
|
|
222
|
+
out.log(` ${model.name}${recommended}`);
|
|
223
|
+
}
|
|
224
|
+
out.log('');
|
|
225
|
+
out.log(`Total: ${models.length} models`);
|
|
226
|
+
}
|
|
227
|
+
out.log('');
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* steroids ai test - Test provider configuration
|
|
231
|
+
*/
|
|
232
|
+
async function testSubcommand(args, flags) {
|
|
233
|
+
const out = (0, output_js_1.createOutput)({ command: 'ai test', flags });
|
|
234
|
+
const { values, positionals } = (0, node_util_1.parseArgs)({
|
|
235
|
+
args,
|
|
236
|
+
options: {
|
|
237
|
+
help: { type: 'boolean', short: 'h', default: false },
|
|
238
|
+
},
|
|
239
|
+
allowPositionals: true,
|
|
240
|
+
});
|
|
241
|
+
if (values.help || flags.help || positionals.length === 0) {
|
|
242
|
+
out.log(`
|
|
243
|
+
steroids ai test <role> - Test provider configuration
|
|
244
|
+
|
|
245
|
+
USAGE:
|
|
246
|
+
steroids ai test <role> [options]
|
|
247
|
+
|
|
248
|
+
ARGUMENTS:
|
|
249
|
+
<role> Role to test: orchestrator | coder | reviewer
|
|
250
|
+
|
|
251
|
+
OPTIONS:
|
|
252
|
+
-j, --json Output as JSON
|
|
253
|
+
-h, --help Show help
|
|
254
|
+
|
|
255
|
+
DESCRIPTION:
|
|
256
|
+
Tests the configured provider for a role by:
|
|
257
|
+
1. Checking if the provider CLI is available
|
|
258
|
+
2. Verifying the configured model is valid
|
|
259
|
+
3. Checking API key if required
|
|
260
|
+
|
|
261
|
+
EXAMPLES:
|
|
262
|
+
steroids ai test coder # Test coder configuration
|
|
263
|
+
steroids ai test reviewer # Test reviewer configuration
|
|
264
|
+
`);
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
const role = positionals[0];
|
|
268
|
+
if (!['orchestrator', 'coder', 'reviewer'].includes(role)) {
|
|
269
|
+
out.error('INVALID_ARGUMENTS', `Invalid role: ${role}`);
|
|
270
|
+
out.log('Valid roles: orchestrator, coder, reviewer');
|
|
271
|
+
process.exit(2);
|
|
272
|
+
}
|
|
273
|
+
const config = (0, loader_js_1.loadConfig)();
|
|
274
|
+
const roleConfig = config.ai?.[role];
|
|
275
|
+
if (!roleConfig || !roleConfig.provider || !roleConfig.model) {
|
|
276
|
+
out.error('CONFIGURATION_ERROR', `No provider configured for role: ${role}`);
|
|
277
|
+
out.log(`Run "steroids ai setup ${role}" to configure`);
|
|
278
|
+
process.exit(1);
|
|
279
|
+
}
|
|
280
|
+
const provider = roleConfig.provider;
|
|
281
|
+
const model = roleConfig.model;
|
|
282
|
+
out.verbose(`Testing ${role} configuration...`);
|
|
283
|
+
out.verbose(` Provider: ${provider}`);
|
|
284
|
+
out.verbose(` Model: ${model}`);
|
|
285
|
+
out.log('');
|
|
286
|
+
// Check if provider CLI is available
|
|
287
|
+
const status = await (0, api_models_js_1.checkProviderCLI)(provider);
|
|
288
|
+
const results = {
|
|
289
|
+
role,
|
|
290
|
+
provider,
|
|
291
|
+
model,
|
|
292
|
+
cliAvailable: status.available,
|
|
293
|
+
cliPath: status.cliPath,
|
|
294
|
+
modelValid: status.models.includes(model),
|
|
295
|
+
success: false,
|
|
296
|
+
};
|
|
297
|
+
if (!status.available) {
|
|
298
|
+
if (flags.json) {
|
|
299
|
+
out.error('CONFIGURATION_ERROR', 'Provider CLI not available', { ...results, error: 'Provider CLI not available' });
|
|
300
|
+
}
|
|
301
|
+
else {
|
|
302
|
+
out.log(colors_js_1.markers.error(`Provider CLI not available: ${provider}`));
|
|
303
|
+
out.log(`Install the ${provider} CLI to use this provider`);
|
|
304
|
+
}
|
|
305
|
+
process.exit(1);
|
|
306
|
+
}
|
|
307
|
+
out.log(colors_js_1.markers.success(`Provider CLI available: ${status.displayName}`));
|
|
308
|
+
if (status.cliPath) {
|
|
309
|
+
out.log(` Path: ${colors_js_1.colors.cyan(status.cliPath)}`);
|
|
310
|
+
}
|
|
311
|
+
out.log('');
|
|
312
|
+
// Validate model
|
|
313
|
+
if (!status.models.includes(model)) {
|
|
314
|
+
if (flags.json) {
|
|
315
|
+
out.error('CONFIGURATION_ERROR', 'Model not found in provider', { ...results, error: 'Model not found in provider' });
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
out.log(colors_js_1.markers.error(`Model not valid: ${model}`));
|
|
319
|
+
out.log(`Available models: ${status.models.join(', ')}`);
|
|
320
|
+
}
|
|
321
|
+
process.exit(1);
|
|
322
|
+
}
|
|
323
|
+
out.log(colors_js_1.markers.success(`Model valid: ${model}`));
|
|
324
|
+
out.log('');
|
|
325
|
+
results.success = true;
|
|
326
|
+
if (flags.json) {
|
|
327
|
+
out.success(results);
|
|
328
|
+
}
|
|
329
|
+
else {
|
|
330
|
+
out.log(colors_js_1.markers.success(`Configuration valid for role: ${role}`));
|
|
331
|
+
out.log('');
|
|
332
|
+
out.log('Ready to use!');
|
|
333
|
+
}
|
|
334
|
+
out.log('');
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* steroids ai setup - Run setup wizard
|
|
338
|
+
*/
|
|
339
|
+
async function setupSubcommand(args, flags) {
|
|
340
|
+
const out = (0, output_js_1.createOutput)({ command: 'ai setup', flags });
|
|
341
|
+
const { values, positionals } = (0, node_util_1.parseArgs)({
|
|
342
|
+
args,
|
|
343
|
+
options: {
|
|
344
|
+
help: { type: 'boolean', short: 'h', default: false },
|
|
345
|
+
global: { type: 'boolean', default: false },
|
|
346
|
+
},
|
|
347
|
+
allowPositionals: true,
|
|
348
|
+
});
|
|
349
|
+
if (values.help || flags.help) {
|
|
350
|
+
out.log(`
|
|
351
|
+
steroids ai setup [role] - Interactive setup wizard
|
|
352
|
+
|
|
353
|
+
USAGE:
|
|
354
|
+
steroids ai setup [role] [options]
|
|
355
|
+
|
|
356
|
+
ARGUMENTS:
|
|
357
|
+
[role] Optional role: orchestrator | coder | reviewer
|
|
358
|
+
|
|
359
|
+
OPTIONS:
|
|
360
|
+
--global Save to global config
|
|
361
|
+
-h, --help Show help
|
|
362
|
+
|
|
363
|
+
DESCRIPTION:
|
|
364
|
+
Runs the interactive AI provider setup wizard.
|
|
365
|
+
Detects available providers and prompts for model selection.
|
|
366
|
+
|
|
367
|
+
EXAMPLES:
|
|
368
|
+
steroids ai setup # Setup any role interactively
|
|
369
|
+
steroids ai setup coder # Setup coder role
|
|
370
|
+
steroids ai setup reviewer --global # Setup reviewer in global config
|
|
371
|
+
`);
|
|
372
|
+
return;
|
|
373
|
+
}
|
|
374
|
+
const role = positionals[0];
|
|
375
|
+
if (role && !['orchestrator', 'coder', 'reviewer'].includes(role)) {
|
|
376
|
+
out.error('INVALID_ARGUMENTS', `Invalid role: ${role}`);
|
|
377
|
+
out.log('Valid roles: orchestrator, coder, reviewer');
|
|
378
|
+
process.exit(2);
|
|
379
|
+
}
|
|
380
|
+
await (0, ai_setup_js_1.runAISetup)({ role, global: values.global });
|
|
381
|
+
}
|
|
382
|
+
//# sourceMappingURL=ai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai.js","sourceRoot":"","sources":["../../src/commands/ai.ts"],"names":[],"mappings":"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"}
|