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,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global flags parser for Steroids CLI
|
|
3
|
+
*
|
|
4
|
+
* Parses global flags that apply to all commands:
|
|
5
|
+
* - Output format: --json, --quiet, --verbose
|
|
6
|
+
* - Display: --no-color, --help
|
|
7
|
+
* - Configuration: --config, --dry-run, --timeout, --no-hooks
|
|
8
|
+
* - Version: --version
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Parsed global options available to all commands
|
|
12
|
+
*/
|
|
13
|
+
export interface GlobalFlags {
|
|
14
|
+
/** Output as JSON (-j, --json) */
|
|
15
|
+
json: boolean;
|
|
16
|
+
/** Minimal output (-q, --quiet) */
|
|
17
|
+
quiet: boolean;
|
|
18
|
+
/** Detailed output (-v, --verbose) */
|
|
19
|
+
verbose: boolean;
|
|
20
|
+
/** Show help (-h, --help) */
|
|
21
|
+
help: boolean;
|
|
22
|
+
/** Show version (--version) */
|
|
23
|
+
version: boolean;
|
|
24
|
+
/** Disable colors (--no-color) */
|
|
25
|
+
noColor: boolean;
|
|
26
|
+
/** Custom config path (--config) */
|
|
27
|
+
configPath?: string;
|
|
28
|
+
/** Preview without executing (--dry-run) */
|
|
29
|
+
dryRun: boolean;
|
|
30
|
+
/** Command timeout in milliseconds (--timeout) */
|
|
31
|
+
timeout?: number;
|
|
32
|
+
/** Skip hook execution (--no-hooks) */
|
|
33
|
+
noHooks: boolean;
|
|
34
|
+
/** Don't wait for locks to be released (--no-wait) */
|
|
35
|
+
noWait: boolean;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Result of parsing global flags
|
|
39
|
+
*/
|
|
40
|
+
export interface ParsedArgs {
|
|
41
|
+
/** Parsed global flags */
|
|
42
|
+
flags: GlobalFlags;
|
|
43
|
+
/** Remaining args after global flags are extracted */
|
|
44
|
+
remaining: string[];
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Default values for global flags
|
|
48
|
+
*/
|
|
49
|
+
export declare function getDefaultFlags(): GlobalFlags;
|
|
50
|
+
/**
|
|
51
|
+
* Parse duration string to milliseconds
|
|
52
|
+
* Supports: 30s, 5m, 1h, or plain number (ms)
|
|
53
|
+
*/
|
|
54
|
+
export declare function parseDuration(value: string): number;
|
|
55
|
+
/**
|
|
56
|
+
* Load flags from environment variables
|
|
57
|
+
* Environment variables provide defaults that can be overridden by CLI flags
|
|
58
|
+
*/
|
|
59
|
+
export declare function loadEnvFlags(): Partial<GlobalFlags>;
|
|
60
|
+
/**
|
|
61
|
+
* Parse global flags from command line arguments
|
|
62
|
+
*
|
|
63
|
+
* Global flags can appear anywhere in the args and are extracted,
|
|
64
|
+
* leaving the remaining args for command-specific parsing.
|
|
65
|
+
*
|
|
66
|
+
* @param args - Command line arguments to parse
|
|
67
|
+
* @returns Parsed flags and remaining arguments
|
|
68
|
+
*/
|
|
69
|
+
export declare function parseGlobalFlags(args: string[]): ParsedArgs;
|
|
70
|
+
/**
|
|
71
|
+
* Apply global flags to affect runtime behavior
|
|
72
|
+
* Call this after parsing to set up the environment
|
|
73
|
+
*/
|
|
74
|
+
export declare function applyGlobalFlags(flags: GlobalFlags): void;
|
|
75
|
+
//# sourceMappingURL=flags.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flags.d.ts","sourceRoot":"","sources":["../../src/cli/flags.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,kCAAkC;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,mCAAmC;IACnC,KAAK,EAAE,OAAO,CAAC;IACf,sCAAsC;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,6BAA6B;IAC7B,IAAI,EAAE,OAAO,CAAC;IACd,+BAA+B;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,kCAAkC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,oCAAoC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4CAA4C;IAC5C,MAAM,EAAE,OAAO,CAAC;IAChB,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,sDAAsD;IACtD,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,0BAA0B;IAC1B,KAAK,EAAE,WAAW,CAAC;IACnB,sDAAsD;IACtD,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,WAAW,CAc7C;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAqBnD;AAUD;;;GAGG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAAC,WAAW,CAAC,CAiCnD;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CA2H3D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAKzD"}
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Global flags parser for Steroids CLI
|
|
4
|
+
*
|
|
5
|
+
* Parses global flags that apply to all commands:
|
|
6
|
+
* - Output format: --json, --quiet, --verbose
|
|
7
|
+
* - Display: --no-color, --help
|
|
8
|
+
* - Configuration: --config, --dry-run, --timeout, --no-hooks
|
|
9
|
+
* - Version: --version
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.getDefaultFlags = getDefaultFlags;
|
|
13
|
+
exports.parseDuration = parseDuration;
|
|
14
|
+
exports.loadEnvFlags = loadEnvFlags;
|
|
15
|
+
exports.parseGlobalFlags = parseGlobalFlags;
|
|
16
|
+
exports.applyGlobalFlags = applyGlobalFlags;
|
|
17
|
+
/**
|
|
18
|
+
* Default values for global flags
|
|
19
|
+
*/
|
|
20
|
+
function getDefaultFlags() {
|
|
21
|
+
return {
|
|
22
|
+
json: false,
|
|
23
|
+
quiet: false,
|
|
24
|
+
verbose: false,
|
|
25
|
+
help: false,
|
|
26
|
+
version: false,
|
|
27
|
+
noColor: false,
|
|
28
|
+
configPath: undefined,
|
|
29
|
+
dryRun: false,
|
|
30
|
+
timeout: undefined,
|
|
31
|
+
noHooks: false,
|
|
32
|
+
noWait: false,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Parse duration string to milliseconds
|
|
37
|
+
* Supports: 30s, 5m, 1h, or plain number (ms)
|
|
38
|
+
*/
|
|
39
|
+
function parseDuration(value) {
|
|
40
|
+
const match = value.match(/^(\d+)(ms|s|m|h)?$/);
|
|
41
|
+
if (!match) {
|
|
42
|
+
throw new Error(`Invalid duration format: ${value}. Use format: 30s, 5m, 1h, or milliseconds`);
|
|
43
|
+
}
|
|
44
|
+
const num = parseInt(match[1], 10);
|
|
45
|
+
const unit = match[2] || 'ms';
|
|
46
|
+
switch (unit) {
|
|
47
|
+
case 'ms':
|
|
48
|
+
return num;
|
|
49
|
+
case 's':
|
|
50
|
+
return num * 1000;
|
|
51
|
+
case 'm':
|
|
52
|
+
return num * 60 * 1000;
|
|
53
|
+
case 'h':
|
|
54
|
+
return num * 60 * 60 * 1000;
|
|
55
|
+
default:
|
|
56
|
+
return num;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Check if a value is truthy for boolean env vars
|
|
61
|
+
*/
|
|
62
|
+
function isTruthy(value) {
|
|
63
|
+
if (!value)
|
|
64
|
+
return false;
|
|
65
|
+
return value === '1' || value.toLowerCase() === 'true';
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Load flags from environment variables
|
|
69
|
+
* Environment variables provide defaults that can be overridden by CLI flags
|
|
70
|
+
*/
|
|
71
|
+
function loadEnvFlags() {
|
|
72
|
+
const env = {};
|
|
73
|
+
if (isTruthy(process.env.STEROIDS_JSON)) {
|
|
74
|
+
env.json = true;
|
|
75
|
+
}
|
|
76
|
+
if (isTruthy(process.env.STEROIDS_QUIET)) {
|
|
77
|
+
env.quiet = true;
|
|
78
|
+
}
|
|
79
|
+
if (isTruthy(process.env.STEROIDS_VERBOSE)) {
|
|
80
|
+
env.verbose = true;
|
|
81
|
+
}
|
|
82
|
+
if (isTruthy(process.env.STEROIDS_NO_HOOKS)) {
|
|
83
|
+
env.noHooks = true;
|
|
84
|
+
}
|
|
85
|
+
if (isTruthy(process.env.STEROIDS_NO_WAIT)) {
|
|
86
|
+
env.noWait = true;
|
|
87
|
+
}
|
|
88
|
+
if (isTruthy(process.env.STEROIDS_NO_COLOR) || process.env.NO_COLOR !== undefined) {
|
|
89
|
+
env.noColor = true;
|
|
90
|
+
}
|
|
91
|
+
if (process.env.STEROIDS_CONFIG) {
|
|
92
|
+
env.configPath = process.env.STEROIDS_CONFIG;
|
|
93
|
+
}
|
|
94
|
+
if (process.env.STEROIDS_TIMEOUT) {
|
|
95
|
+
try {
|
|
96
|
+
env.timeout = parseDuration(process.env.STEROIDS_TIMEOUT);
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// Ignore invalid timeout from env
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return env;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Parse global flags from command line arguments
|
|
106
|
+
*
|
|
107
|
+
* Global flags can appear anywhere in the args and are extracted,
|
|
108
|
+
* leaving the remaining args for command-specific parsing.
|
|
109
|
+
*
|
|
110
|
+
* @param args - Command line arguments to parse
|
|
111
|
+
* @returns Parsed flags and remaining arguments
|
|
112
|
+
*/
|
|
113
|
+
function parseGlobalFlags(args) {
|
|
114
|
+
// Start with defaults, then apply env vars
|
|
115
|
+
const flags = {
|
|
116
|
+
...getDefaultFlags(),
|
|
117
|
+
...loadEnvFlags(),
|
|
118
|
+
};
|
|
119
|
+
const remaining = [];
|
|
120
|
+
let i = 0;
|
|
121
|
+
while (i < args.length) {
|
|
122
|
+
const arg = args[i];
|
|
123
|
+
// Handle combined short flags like -jqv
|
|
124
|
+
if (arg.match(/^-[jqvh]+$/) && arg.length > 2) {
|
|
125
|
+
for (const char of arg.slice(1)) {
|
|
126
|
+
switch (char) {
|
|
127
|
+
case 'j':
|
|
128
|
+
flags.json = true;
|
|
129
|
+
break;
|
|
130
|
+
case 'q':
|
|
131
|
+
flags.quiet = true;
|
|
132
|
+
break;
|
|
133
|
+
case 'v':
|
|
134
|
+
flags.verbose = true;
|
|
135
|
+
break;
|
|
136
|
+
case 'h':
|
|
137
|
+
flags.help = true;
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
i++;
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
switch (arg) {
|
|
145
|
+
case '-j':
|
|
146
|
+
case '--json':
|
|
147
|
+
flags.json = true;
|
|
148
|
+
i++;
|
|
149
|
+
break;
|
|
150
|
+
case '-q':
|
|
151
|
+
case '--quiet':
|
|
152
|
+
flags.quiet = true;
|
|
153
|
+
i++;
|
|
154
|
+
break;
|
|
155
|
+
case '-v':
|
|
156
|
+
case '--verbose':
|
|
157
|
+
flags.verbose = true;
|
|
158
|
+
i++;
|
|
159
|
+
break;
|
|
160
|
+
case '-h':
|
|
161
|
+
case '--help':
|
|
162
|
+
flags.help = true;
|
|
163
|
+
i++;
|
|
164
|
+
break;
|
|
165
|
+
case '--version':
|
|
166
|
+
flags.version = true;
|
|
167
|
+
i++;
|
|
168
|
+
break;
|
|
169
|
+
case '--no-color':
|
|
170
|
+
flags.noColor = true;
|
|
171
|
+
i++;
|
|
172
|
+
break;
|
|
173
|
+
case '--dry-run':
|
|
174
|
+
flags.dryRun = true;
|
|
175
|
+
i++;
|
|
176
|
+
break;
|
|
177
|
+
case '--no-hooks':
|
|
178
|
+
flags.noHooks = true;
|
|
179
|
+
i++;
|
|
180
|
+
break;
|
|
181
|
+
case '--no-wait':
|
|
182
|
+
flags.noWait = true;
|
|
183
|
+
i++;
|
|
184
|
+
break;
|
|
185
|
+
case '--config':
|
|
186
|
+
if (i + 1 >= args.length) {
|
|
187
|
+
throw new Error('--config requires a path argument');
|
|
188
|
+
}
|
|
189
|
+
flags.configPath = args[i + 1];
|
|
190
|
+
i += 2;
|
|
191
|
+
break;
|
|
192
|
+
case '--timeout':
|
|
193
|
+
if (i + 1 >= args.length) {
|
|
194
|
+
throw new Error('--timeout requires a duration argument');
|
|
195
|
+
}
|
|
196
|
+
flags.timeout = parseDuration(args[i + 1]);
|
|
197
|
+
i += 2;
|
|
198
|
+
break;
|
|
199
|
+
default:
|
|
200
|
+
// Handle --config=value and --timeout=value syntax
|
|
201
|
+
if (arg.startsWith('--config=')) {
|
|
202
|
+
flags.configPath = arg.slice('--config='.length);
|
|
203
|
+
i++;
|
|
204
|
+
}
|
|
205
|
+
else if (arg.startsWith('--timeout=')) {
|
|
206
|
+
flags.timeout = parseDuration(arg.slice('--timeout='.length));
|
|
207
|
+
i++;
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
// Not a global flag, pass through to remaining
|
|
211
|
+
remaining.push(arg);
|
|
212
|
+
i++;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
// Validate conflicting flags
|
|
217
|
+
if (flags.quiet && flags.verbose) {
|
|
218
|
+
throw new Error('Cannot use --quiet and --verbose together');
|
|
219
|
+
}
|
|
220
|
+
return { flags, remaining };
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Apply global flags to affect runtime behavior
|
|
224
|
+
* Call this after parsing to set up the environment
|
|
225
|
+
*/
|
|
226
|
+
function applyGlobalFlags(flags) {
|
|
227
|
+
// Disable colors if requested
|
|
228
|
+
if (flags.noColor) {
|
|
229
|
+
process.env.NO_COLOR = '1';
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=flags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flags.js","sourceRoot":"","sources":["../../src/cli/flags.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Help system for Steroids CLI
|
|
3
|
+
*
|
|
4
|
+
* Provides templates and utilities for creating consistent,
|
|
5
|
+
* comprehensive help text across all commands.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Help section structure
|
|
9
|
+
*/
|
|
10
|
+
export interface HelpSection {
|
|
11
|
+
title: string;
|
|
12
|
+
content: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Command example
|
|
16
|
+
*/
|
|
17
|
+
export interface CommandExample {
|
|
18
|
+
command: string;
|
|
19
|
+
description: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Option definition for help text
|
|
23
|
+
*/
|
|
24
|
+
export interface OptionDef {
|
|
25
|
+
short?: string;
|
|
26
|
+
long: string;
|
|
27
|
+
description: string;
|
|
28
|
+
values?: string;
|
|
29
|
+
default?: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Subcommand definition
|
|
33
|
+
*/
|
|
34
|
+
export interface SubcommandDef {
|
|
35
|
+
name: string;
|
|
36
|
+
description: string;
|
|
37
|
+
args?: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Related command reference
|
|
41
|
+
*/
|
|
42
|
+
export interface RelatedCommand {
|
|
43
|
+
command: string;
|
|
44
|
+
description: string;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Help template configuration
|
|
48
|
+
*/
|
|
49
|
+
export interface HelpTemplate {
|
|
50
|
+
/** Command name (e.g., 'tasks', 'sections') */
|
|
51
|
+
command: string;
|
|
52
|
+
/** Short one-line description */
|
|
53
|
+
description: string;
|
|
54
|
+
/** Detailed description (optional) */
|
|
55
|
+
details?: string;
|
|
56
|
+
/** Usage examples */
|
|
57
|
+
usage?: string[];
|
|
58
|
+
/** Subcommands */
|
|
59
|
+
subcommands?: SubcommandDef[];
|
|
60
|
+
/** Command-specific options */
|
|
61
|
+
options?: OptionDef[];
|
|
62
|
+
/** Examples with descriptions */
|
|
63
|
+
examples?: CommandExample[];
|
|
64
|
+
/** Related commands */
|
|
65
|
+
related?: RelatedCommand[];
|
|
66
|
+
/** Custom sections */
|
|
67
|
+
sections?: HelpSection[];
|
|
68
|
+
/** Whether to show global options (default: true) */
|
|
69
|
+
showGlobalOptions?: boolean;
|
|
70
|
+
/** Whether to show exit codes (default: true) */
|
|
71
|
+
showExitCodes?: boolean;
|
|
72
|
+
/** Whether to show environment variables (default: true) */
|
|
73
|
+
showEnvVars?: boolean;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Generate help text from template
|
|
77
|
+
*/
|
|
78
|
+
export declare function generateHelp(template: HelpTemplate): string;
|
|
79
|
+
/**
|
|
80
|
+
* Quick help for simple commands
|
|
81
|
+
*
|
|
82
|
+
* Generates basic help text with just usage and options
|
|
83
|
+
*/
|
|
84
|
+
export declare function quickHelp(command: string, description: string, options?: OptionDef[], examples?: CommandExample[]): string;
|
|
85
|
+
/**
|
|
86
|
+
* Display error codes table
|
|
87
|
+
*/
|
|
88
|
+
export declare function showErrorCodes(): void;
|
|
89
|
+
/**
|
|
90
|
+
* Format a compact help hint for error messages
|
|
91
|
+
*/
|
|
92
|
+
export declare function helpHint(command?: string): string;
|
|
93
|
+
/**
|
|
94
|
+
* Format a "Did you mean?" suggestion
|
|
95
|
+
*/
|
|
96
|
+
export declare function didYouMean(provided: string, options: string[]): string | null;
|
|
97
|
+
//# sourceMappingURL=help.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qBAAqB;IACrB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,kBAAkB;IAClB,WAAW,CAAC,EAAE,aAAa,EAAE,CAAC;IAC9B,+BAA+B;IAC/B,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;IACtB,iCAAiC;IACjC,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;IAC5B,uBAAuB;IACvB,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B,sBAAsB;IACtB,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;IACzB,qDAAqD;IACrD,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,iDAAiD;IACjD,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,4DAA4D;IAC5D,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAsFD;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAoG3D;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,SAAS,EAAO,EACzB,QAAQ,GAAE,cAAc,EAAO,GAC9B,MAAM,CAOR;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CA0BrC;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAKjD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAe7E"}
|
package/dist/cli/help.js
ADDED
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Help system for Steroids CLI
|
|
4
|
+
*
|
|
5
|
+
* Provides templates and utilities for creating consistent,
|
|
6
|
+
* comprehensive help text across all commands.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.generateHelp = generateHelp;
|
|
10
|
+
exports.quickHelp = quickHelp;
|
|
11
|
+
exports.showErrorCodes = showErrorCodes;
|
|
12
|
+
exports.helpHint = helpHint;
|
|
13
|
+
exports.didYouMean = didYouMean;
|
|
14
|
+
/**
|
|
15
|
+
* Format an option for display
|
|
16
|
+
*/
|
|
17
|
+
function formatOption(opt) {
|
|
18
|
+
const flags = opt.short ? `-${opt.short}, --${opt.long}` : ` --${opt.long}`;
|
|
19
|
+
const paddedFlags = flags.padEnd(24);
|
|
20
|
+
let desc = opt.description;
|
|
21
|
+
if (opt.values) {
|
|
22
|
+
desc += `\n${' '.repeat(24)}Values: ${opt.values}`;
|
|
23
|
+
}
|
|
24
|
+
if (opt.default) {
|
|
25
|
+
desc += `\n${' '.repeat(24)}Default: ${opt.default}`;
|
|
26
|
+
}
|
|
27
|
+
return ` ${paddedFlags}${desc}`;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Format a subcommand for display
|
|
31
|
+
*/
|
|
32
|
+
function formatSubcommand(sub) {
|
|
33
|
+
const name = sub.args ? `${sub.name} ${sub.args}` : sub.name;
|
|
34
|
+
const paddedName = name.padEnd(20);
|
|
35
|
+
return ` ${paddedName}${sub.description}`;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Format an example for display
|
|
39
|
+
*/
|
|
40
|
+
function formatExample(ex) {
|
|
41
|
+
return ` ${ex.command.padEnd(50)} # ${ex.description}`;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Global options that apply to all commands
|
|
45
|
+
*/
|
|
46
|
+
const GLOBAL_OPTIONS = [
|
|
47
|
+
{ short: 'h', long: 'help', description: 'Show help' },
|
|
48
|
+
{ long: 'version', description: 'Show version' },
|
|
49
|
+
{ short: 'j', long: 'json', description: 'Output as JSON' },
|
|
50
|
+
{ short: 'q', long: 'quiet', description: 'Minimal output' },
|
|
51
|
+
{ short: 'v', long: 'verbose', description: 'Detailed output' },
|
|
52
|
+
{ long: 'no-color', description: 'Disable colored output' },
|
|
53
|
+
{ long: 'config', description: 'Custom config file path', values: '<path>' },
|
|
54
|
+
{ long: 'dry-run', description: 'Preview without executing' },
|
|
55
|
+
{ long: 'timeout', description: 'Command timeout', values: '<duration> (e.g., 30s, 5m, 1h)' },
|
|
56
|
+
{ long: 'no-hooks', description: 'Skip hook execution' },
|
|
57
|
+
{ long: 'no-wait', description: 'Don\'t wait for locks' },
|
|
58
|
+
];
|
|
59
|
+
/**
|
|
60
|
+
* Environment variables section
|
|
61
|
+
*/
|
|
62
|
+
const ENV_VARS_SECTION = `
|
|
63
|
+
ENVIRONMENT VARIABLES:
|
|
64
|
+
STEROIDS_CONFIG Custom config path (--config)
|
|
65
|
+
STEROIDS_JSON Output as JSON (--json)
|
|
66
|
+
STEROIDS_QUIET Minimal output (--quiet)
|
|
67
|
+
STEROIDS_VERBOSE Detailed output (--verbose)
|
|
68
|
+
STEROIDS_NO_HOOKS Skip hooks (--no-hooks)
|
|
69
|
+
STEROIDS_NO_COLOR Disable colors (--no-color)
|
|
70
|
+
STEROIDS_NO_WAIT Don't wait for locks (--no-wait)
|
|
71
|
+
STEROIDS_AUTO_MIGRATE Auto-migrate database (1, true)
|
|
72
|
+
STEROIDS_TIMEOUT Command timeout (duration)
|
|
73
|
+
NO_COLOR Standard no-color variable
|
|
74
|
+
CI CI environment detected
|
|
75
|
+
`;
|
|
76
|
+
/**
|
|
77
|
+
* Exit codes section
|
|
78
|
+
*/
|
|
79
|
+
const EXIT_CODES_SECTION = `
|
|
80
|
+
EXIT CODES:
|
|
81
|
+
0 Success
|
|
82
|
+
1 General error
|
|
83
|
+
2 Invalid arguments
|
|
84
|
+
3 Configuration error or not initialized
|
|
85
|
+
4 Resource not found
|
|
86
|
+
5 Permission denied
|
|
87
|
+
6 Resource locked
|
|
88
|
+
7 Health check failed
|
|
89
|
+
`;
|
|
90
|
+
/**
|
|
91
|
+
* Generate help text from template
|
|
92
|
+
*/
|
|
93
|
+
function generateHelp(template) {
|
|
94
|
+
const lines = [];
|
|
95
|
+
// Header
|
|
96
|
+
lines.push(`steroids ${template.command} - ${template.description}`);
|
|
97
|
+
lines.push('');
|
|
98
|
+
// Usage
|
|
99
|
+
if (template.usage && template.usage.length > 0) {
|
|
100
|
+
lines.push('USAGE:');
|
|
101
|
+
for (const usage of template.usage) {
|
|
102
|
+
lines.push(` ${usage}`);
|
|
103
|
+
}
|
|
104
|
+
lines.push('');
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
lines.push('USAGE:');
|
|
108
|
+
lines.push(` steroids ${template.command} [options]`);
|
|
109
|
+
lines.push('');
|
|
110
|
+
}
|
|
111
|
+
// Detailed description
|
|
112
|
+
if (template.details) {
|
|
113
|
+
lines.push('DESCRIPTION:');
|
|
114
|
+
const detailLines = template.details.trim().split('\n');
|
|
115
|
+
for (const line of detailLines) {
|
|
116
|
+
lines.push(line ? ` ${line}` : '');
|
|
117
|
+
}
|
|
118
|
+
lines.push('');
|
|
119
|
+
}
|
|
120
|
+
// Subcommands
|
|
121
|
+
if (template.subcommands && template.subcommands.length > 0) {
|
|
122
|
+
lines.push('SUBCOMMANDS:');
|
|
123
|
+
for (const sub of template.subcommands) {
|
|
124
|
+
lines.push(formatSubcommand(sub));
|
|
125
|
+
}
|
|
126
|
+
lines.push('');
|
|
127
|
+
}
|
|
128
|
+
// Command-specific options
|
|
129
|
+
if (template.options && template.options.length > 0) {
|
|
130
|
+
lines.push('OPTIONS:');
|
|
131
|
+
for (const opt of template.options) {
|
|
132
|
+
lines.push(formatOption(opt));
|
|
133
|
+
}
|
|
134
|
+
lines.push('');
|
|
135
|
+
}
|
|
136
|
+
// Global options
|
|
137
|
+
if (template.showGlobalOptions !== false) {
|
|
138
|
+
lines.push('GLOBAL OPTIONS:');
|
|
139
|
+
for (const opt of GLOBAL_OPTIONS) {
|
|
140
|
+
lines.push(formatOption(opt));
|
|
141
|
+
}
|
|
142
|
+
lines.push('');
|
|
143
|
+
}
|
|
144
|
+
// Examples
|
|
145
|
+
if (template.examples && template.examples.length > 0) {
|
|
146
|
+
lines.push('EXAMPLES:');
|
|
147
|
+
for (const ex of template.examples) {
|
|
148
|
+
lines.push(formatExample(ex));
|
|
149
|
+
}
|
|
150
|
+
lines.push('');
|
|
151
|
+
}
|
|
152
|
+
// Related commands
|
|
153
|
+
if (template.related && template.related.length > 0) {
|
|
154
|
+
lines.push('RELATED COMMANDS:');
|
|
155
|
+
for (const rel of template.related) {
|
|
156
|
+
lines.push(` ${rel.command.padEnd(30)}${rel.description}`);
|
|
157
|
+
}
|
|
158
|
+
lines.push('');
|
|
159
|
+
}
|
|
160
|
+
// Custom sections
|
|
161
|
+
if (template.sections && template.sections.length > 0) {
|
|
162
|
+
for (const section of template.sections) {
|
|
163
|
+
lines.push(`${section.title}:`);
|
|
164
|
+
const sectionLines = section.content.trim().split('\n');
|
|
165
|
+
for (const line of sectionLines) {
|
|
166
|
+
lines.push(line ? ` ${line}` : '');
|
|
167
|
+
}
|
|
168
|
+
lines.push('');
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// Environment variables
|
|
172
|
+
if (template.showEnvVars !== false) {
|
|
173
|
+
lines.push(ENV_VARS_SECTION.trim());
|
|
174
|
+
lines.push('');
|
|
175
|
+
}
|
|
176
|
+
// Exit codes
|
|
177
|
+
if (template.showExitCodes !== false) {
|
|
178
|
+
lines.push(EXIT_CODES_SECTION.trim());
|
|
179
|
+
lines.push('');
|
|
180
|
+
}
|
|
181
|
+
return lines.join('\n');
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Quick help for simple commands
|
|
185
|
+
*
|
|
186
|
+
* Generates basic help text with just usage and options
|
|
187
|
+
*/
|
|
188
|
+
function quickHelp(command, description, options = [], examples = []) {
|
|
189
|
+
return generateHelp({
|
|
190
|
+
command,
|
|
191
|
+
description,
|
|
192
|
+
options,
|
|
193
|
+
examples,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Display error codes table
|
|
198
|
+
*/
|
|
199
|
+
function showErrorCodes() {
|
|
200
|
+
console.log('ERROR CODES AND EXIT CODES:\n');
|
|
201
|
+
console.log(' Code Exit Description');
|
|
202
|
+
console.log(' ' + '─'.repeat(70));
|
|
203
|
+
const codes = [
|
|
204
|
+
['SUCCESS', '0', 'Operation completed successfully'],
|
|
205
|
+
['GENERAL_ERROR', '1', 'Unspecified error'],
|
|
206
|
+
['INVALID_ARGUMENTS', '2', 'Bad command arguments'],
|
|
207
|
+
['CONFIG_ERROR', '3', 'Configuration problem'],
|
|
208
|
+
['NOT_FOUND', '4', 'Resource not found'],
|
|
209
|
+
['PERMISSION_DENIED', '5', 'Access denied'],
|
|
210
|
+
['RESOURCE_LOCKED', '6', 'Lock held by another'],
|
|
211
|
+
['HEALTH_FAILED', '7', 'Health check failed'],
|
|
212
|
+
['TASK_NOT_FOUND', '4', 'Task doesn\'t exist'],
|
|
213
|
+
['SECTION_NOT_FOUND', '4', 'Section doesn\'t exist'],
|
|
214
|
+
['TASK_LOCKED', '6', 'Task locked by runner'],
|
|
215
|
+
['NOT_INITIALIZED', '3', 'Steroids not initialized'],
|
|
216
|
+
['MIGRATION_REQUIRED', '3', 'Database needs migration'],
|
|
217
|
+
['HOOK_FAILED', '1', 'Hook execution failed'],
|
|
218
|
+
];
|
|
219
|
+
for (const [code, exit, desc] of codes) {
|
|
220
|
+
console.log(` ${code.padEnd(20)} ${exit.padEnd(5)} ${desc}`);
|
|
221
|
+
}
|
|
222
|
+
console.log();
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Format a compact help hint for error messages
|
|
226
|
+
*/
|
|
227
|
+
function helpHint(command) {
|
|
228
|
+
if (command) {
|
|
229
|
+
return `Run 'steroids ${command} --help' for usage information.`;
|
|
230
|
+
}
|
|
231
|
+
return `Run 'steroids --help' for usage information.`;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Format a "Did you mean?" suggestion
|
|
235
|
+
*/
|
|
236
|
+
function didYouMean(provided, options) {
|
|
237
|
+
// Simple Levenshtein distance for suggestions
|
|
238
|
+
const distances = options.map(opt => ({
|
|
239
|
+
option: opt,
|
|
240
|
+
distance: levenshtein(provided.toLowerCase(), opt.toLowerCase()),
|
|
241
|
+
}));
|
|
242
|
+
distances.sort((a, b) => a.distance - b.distance);
|
|
243
|
+
// Only suggest if distance is small enough (less than half the length)
|
|
244
|
+
if (distances[0] && distances[0].distance <= provided.length / 2) {
|
|
245
|
+
return `Did you mean '${distances[0].option}'?`;
|
|
246
|
+
}
|
|
247
|
+
return null;
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Simple Levenshtein distance for suggestions
|
|
251
|
+
*/
|
|
252
|
+
function levenshtein(a, b) {
|
|
253
|
+
const matrix = [];
|
|
254
|
+
for (let i = 0; i <= b.length; i++) {
|
|
255
|
+
matrix[i] = [i];
|
|
256
|
+
}
|
|
257
|
+
for (let j = 0; j <= a.length; j++) {
|
|
258
|
+
matrix[0][j] = j;
|
|
259
|
+
}
|
|
260
|
+
for (let i = 1; i <= b.length; i++) {
|
|
261
|
+
for (let j = 1; j <= a.length; j++) {
|
|
262
|
+
if (b.charAt(i - 1) === a.charAt(j - 1)) {
|
|
263
|
+
matrix[i][j] = matrix[i - 1][j - 1];
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, // substitution
|
|
267
|
+
matrix[i][j - 1] + 1, // insertion
|
|
268
|
+
matrix[i - 1][j] + 1 // deletion
|
|
269
|
+
);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
return matrix[b.length][a.length];
|
|
274
|
+
}
|
|
275
|
+
//# sourceMappingURL=help.js.map
|