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