steroids-cli 0.4.47
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +640 -0
- package/dist/cli/colors.d.ts +110 -0
- package/dist/cli/colors.d.ts.map +1 -0
- package/dist/cli/colors.js +228 -0
- package/dist/cli/colors.js.map +1 -0
- package/dist/cli/env.d.ts +159 -0
- package/dist/cli/env.d.ts.map +1 -0
- package/dist/cli/env.js +227 -0
- package/dist/cli/env.js.map +1 -0
- package/dist/cli/errors.d.ts +166 -0
- package/dist/cli/errors.d.ts.map +1 -0
- package/dist/cli/errors.js +244 -0
- package/dist/cli/errors.js.map +1 -0
- package/dist/cli/flags.d.ts +75 -0
- package/dist/cli/flags.d.ts.map +1 -0
- package/dist/cli/flags.js +232 -0
- package/dist/cli/flags.js.map +1 -0
- package/dist/cli/help.d.ts +97 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/help.js +275 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/index.d.ts +13 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +29 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/interactive.d.ts +58 -0
- package/dist/cli/interactive.d.ts.map +1 -0
- package/dist/cli/interactive.js +127 -0
- package/dist/cli/interactive.js.map +1 -0
- package/dist/cli/output.d.ts +116 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +178 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/commands/about.d.ts +7 -0
- package/dist/commands/about.d.ts.map +1 -0
- package/dist/commands/about.js +259 -0
- package/dist/commands/about.js.map +1 -0
- package/dist/commands/ai.d.ts +6 -0
- package/dist/commands/ai.d.ts.map +1 -0
- package/dist/commands/ai.js +382 -0
- package/dist/commands/ai.js.map +1 -0
- package/dist/commands/backup.d.ts +3 -0
- package/dist/commands/backup.d.ts.map +1 -0
- package/dist/commands/backup.js +528 -0
- package/dist/commands/backup.js.map +1 -0
- package/dist/commands/completion.d.ts +3 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +405 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +665 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/disputes.d.ts +3 -0
- package/dist/commands/disputes.d.ts.map +1 -0
- package/dist/commands/disputes.js +499 -0
- package/dist/commands/disputes.js.map +1 -0
- package/dist/commands/gc.d.ts +3 -0
- package/dist/commands/gc.d.ts.map +1 -0
- package/dist/commands/gc.js +300 -0
- package/dist/commands/gc.js.map +1 -0
- package/dist/commands/git.d.ts +3 -0
- package/dist/commands/git.d.ts.map +1 -0
- package/dist/commands/git.js +458 -0
- package/dist/commands/git.js.map +1 -0
- package/dist/commands/health.d.ts +3 -0
- package/dist/commands/health.d.ts.map +1 -0
- package/dist/commands/health.js +604 -0
- package/dist/commands/health.js.map +1 -0
- package/dist/commands/hooks.d.ts +6 -0
- package/dist/commands/hooks.d.ts.map +1 -0
- package/dist/commands/hooks.js +529 -0
- package/dist/commands/hooks.js.map +1 -0
- package/dist/commands/init.d.ts +6 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +200 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/llm.d.ts +7 -0
- package/dist/commands/llm.d.ts.map +1 -0
- package/dist/commands/llm.js +285 -0
- package/dist/commands/llm.js.map +1 -0
- package/dist/commands/locks.d.ts +3 -0
- package/dist/commands/locks.d.ts.map +1 -0
- package/dist/commands/locks.js +431 -0
- package/dist/commands/locks.js.map +1 -0
- package/dist/commands/logs.d.ts +3 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +487 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/loop-phases.d.ts +11 -0
- package/dist/commands/loop-phases.d.ts.map +1 -0
- package/dist/commands/loop-phases.js +204 -0
- package/dist/commands/loop-phases.js.map +1 -0
- package/dist/commands/loop.d.ts +3 -0
- package/dist/commands/loop.d.ts.map +1 -0
- package/dist/commands/loop.js +396 -0
- package/dist/commands/loop.js.map +1 -0
- package/dist/commands/projects.d.ts +6 -0
- package/dist/commands/projects.d.ts.map +1 -0
- package/dist/commands/projects.js +362 -0
- package/dist/commands/projects.js.map +1 -0
- package/dist/commands/purge.d.ts +3 -0
- package/dist/commands/purge.d.ts.map +1 -0
- package/dist/commands/purge.js +516 -0
- package/dist/commands/purge.js.map +1 -0
- package/dist/commands/runners.d.ts +3 -0
- package/dist/commands/runners.d.ts.map +1 -0
- package/dist/commands/runners.js +1076 -0
- package/dist/commands/runners.js.map +1 -0
- package/dist/commands/scan.d.ts +3 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +291 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/sections-commands.d.ts +9 -0
- package/dist/commands/sections-commands.d.ts.map +1 -0
- package/dist/commands/sections-commands.js +282 -0
- package/dist/commands/sections-commands.js.map +1 -0
- package/dist/commands/sections-graph.d.ts +25 -0
- package/dist/commands/sections-graph.d.ts.map +1 -0
- package/dist/commands/sections-graph.js +180 -0
- package/dist/commands/sections-graph.js.map +1 -0
- package/dist/commands/sections.d.ts +3 -0
- package/dist/commands/sections.d.ts.map +1 -0
- package/dist/commands/sections.js +376 -0
- package/dist/commands/sections.js.map +1 -0
- package/dist/commands/stats.d.ts +6 -0
- package/dist/commands/stats.d.ts.map +1 -0
- package/dist/commands/stats.js +324 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/commands/tasks.d.ts +3 -0
- package/dist/commands/tasks.d.ts.map +1 -0
- package/dist/commands/tasks.js +1115 -0
- package/dist/commands/tasks.js.map +1 -0
- package/dist/commands/web.d.ts +7 -0
- package/dist/commands/web.d.ts.map +1 -0
- package/dist/commands/web.js +204 -0
- package/dist/commands/web.js.map +1 -0
- package/dist/config/ai-setup.d.ts +27 -0
- package/dist/config/ai-setup.d.ts.map +1 -0
- package/dist/config/ai-setup.js +432 -0
- package/dist/config/ai-setup.js.map +1 -0
- package/dist/config/browser.d.ts +9 -0
- package/dist/config/browser.d.ts.map +1 -0
- package/dist/config/browser.js +200 -0
- package/dist/config/browser.js.map +1 -0
- package/dist/config/json-schema.d.ts +28 -0
- package/dist/config/json-schema.d.ts.map +1 -0
- package/dist/config/json-schema.js +84 -0
- package/dist/config/json-schema.js.map +1 -0
- package/dist/config/loader.d.ts +152 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +270 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +34 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +437 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/validator.d.ts +32 -0
- package/dist/config/validator.d.ts.map +1 -0
- package/dist/config/validator.js +187 -0
- package/dist/config/validator.js.map +1 -0
- package/dist/database/connection.d.ts +35 -0
- package/dist/database/connection.d.ts.map +1 -0
- package/dist/database/connection.js +208 -0
- package/dist/database/connection.js.map +1 -0
- package/dist/database/queries.d.ts +218 -0
- package/dist/database/queries.d.ts.map +1 -0
- package/dist/database/queries.js +613 -0
- package/dist/database/queries.js.map +1 -0
- package/dist/database/schema.d.ts +8 -0
- package/dist/database/schema.d.ts.map +1 -0
- package/dist/database/schema.js +160 -0
- package/dist/database/schema.js.map +1 -0
- package/dist/disputes/behavior.d.ts +106 -0
- package/dist/disputes/behavior.d.ts.map +1 -0
- package/dist/disputes/behavior.js +150 -0
- package/dist/disputes/behavior.js.map +1 -0
- package/dist/disputes/create.d.ts +59 -0
- package/dist/disputes/create.d.ts.map +1 -0
- package/dist/disputes/create.js +222 -0
- package/dist/disputes/create.js.map +1 -0
- package/dist/disputes/index.d.ts +21 -0
- package/dist/disputes/index.d.ts.map +1 -0
- package/dist/disputes/index.js +76 -0
- package/dist/disputes/index.js.map +1 -0
- package/dist/disputes/markdown.d.ts +41 -0
- package/dist/disputes/markdown.d.ts.map +1 -0
- package/dist/disputes/markdown.js +261 -0
- package/dist/disputes/markdown.js.map +1 -0
- package/dist/disputes/queries.d.ts +83 -0
- package/dist/disputes/queries.d.ts.map +1 -0
- package/dist/disputes/queries.js +180 -0
- package/dist/disputes/queries.js.map +1 -0
- package/dist/disputes/resolve.d.ts +57 -0
- package/dist/disputes/resolve.d.ts.map +1 -0
- package/dist/disputes/resolve.js +171 -0
- package/dist/disputes/resolve.js.map +1 -0
- package/dist/disputes/stale.d.ts +98 -0
- package/dist/disputes/stale.d.ts.map +1 -0
- package/dist/disputes/stale.js +205 -0
- package/dist/disputes/stale.js.map +1 -0
- package/dist/disputes/types.d.ts +92 -0
- package/dist/disputes/types.d.ts.map +1 -0
- package/dist/disputes/types.js +100 -0
- package/dist/disputes/types.js.map +1 -0
- package/dist/git/push.d.ts +26 -0
- package/dist/git/push.d.ts.map +1 -0
- package/dist/git/push.js +97 -0
- package/dist/git/push.js.map +1 -0
- package/dist/git/status.d.ts +61 -0
- package/dist/git/status.d.ts.map +1 -0
- package/dist/git/status.js +251 -0
- package/dist/git/status.js.map +1 -0
- package/dist/hooks/events.d.ts +72 -0
- package/dist/hooks/events.d.ts.map +1 -0
- package/dist/hooks/events.js +120 -0
- package/dist/hooks/events.js.map +1 -0
- package/dist/hooks/index.d.ts +19 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +48 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/integration.d.ts +69 -0
- package/dist/hooks/integration.d.ts.map +1 -0
- package/dist/hooks/integration.js +179 -0
- package/dist/hooks/integration.js.map +1 -0
- package/dist/hooks/merge.d.ts +115 -0
- package/dist/hooks/merge.d.ts.map +1 -0
- package/dist/hooks/merge.js +161 -0
- package/dist/hooks/merge.js.map +1 -0
- package/dist/hooks/orchestrator.d.ts +115 -0
- package/dist/hooks/orchestrator.d.ts.map +1 -0
- package/dist/hooks/orchestrator.js +226 -0
- package/dist/hooks/orchestrator.js.map +1 -0
- package/dist/hooks/payload.d.ts +294 -0
- package/dist/hooks/payload.d.ts.map +1 -0
- package/dist/hooks/payload.js +267 -0
- package/dist/hooks/payload.js.map +1 -0
- package/dist/hooks/script-runner.d.ts +63 -0
- package/dist/hooks/script-runner.d.ts.map +1 -0
- package/dist/hooks/script-runner.js +221 -0
- package/dist/hooks/script-runner.js.map +1 -0
- package/dist/hooks/templates.d.ts +104 -0
- package/dist/hooks/templates.d.ts.map +1 -0
- package/dist/hooks/templates.js +327 -0
- package/dist/hooks/templates.js.map +1 -0
- package/dist/hooks/webhook-runner.d.ts +69 -0
- package/dist/hooks/webhook-runner.d.ts.map +1 -0
- package/dist/hooks/webhook-runner.js +208 -0
- package/dist/hooks/webhook-runner.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +281 -0
- package/dist/index.js.map +1 -0
- package/dist/locking/cleanup.d.ts +70 -0
- package/dist/locking/cleanup.d.ts.map +1 -0
- package/dist/locking/cleanup.js +157 -0
- package/dist/locking/cleanup.js.map +1 -0
- package/dist/locking/queries.d.ts +116 -0
- package/dist/locking/queries.d.ts.map +1 -0
- package/dist/locking/queries.js +255 -0
- package/dist/locking/queries.js.map +1 -0
- package/dist/locking/section-lock.d.ts +74 -0
- package/dist/locking/section-lock.d.ts.map +1 -0
- package/dist/locking/section-lock.js +207 -0
- package/dist/locking/section-lock.js.map +1 -0
- package/dist/locking/task-lock.d.ts +92 -0
- package/dist/locking/task-lock.d.ts.map +1 -0
- package/dist/locking/task-lock.js +246 -0
- package/dist/locking/task-lock.js.map +1 -0
- package/dist/migrations/index.d.ts +7 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +37 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/migrations/manifest.d.ts +92 -0
- package/dist/migrations/manifest.d.ts.map +1 -0
- package/dist/migrations/manifest.js +270 -0
- package/dist/migrations/manifest.js.map +1 -0
- package/dist/migrations/runner.d.ts +84 -0
- package/dist/migrations/runner.d.ts.map +1 -0
- package/dist/migrations/runner.js +351 -0
- package/dist/migrations/runner.js.map +1 -0
- package/dist/orchestrator/coder.d.ts +32 -0
- package/dist/orchestrator/coder.d.ts.map +1 -0
- package/dist/orchestrator/coder.js +174 -0
- package/dist/orchestrator/coder.js.map +1 -0
- package/dist/orchestrator/coordinator.d.ts +28 -0
- package/dist/orchestrator/coordinator.d.ts.map +1 -0
- package/dist/orchestrator/coordinator.js +256 -0
- package/dist/orchestrator/coordinator.js.map +1 -0
- package/dist/orchestrator/reviewer.d.ts +35 -0
- package/dist/orchestrator/reviewer.d.ts.map +1 -0
- package/dist/orchestrator/reviewer.js +241 -0
- package/dist/orchestrator/reviewer.js.map +1 -0
- package/dist/orchestrator/task-selector.d.ts +102 -0
- package/dist/orchestrator/task-selector.d.ts.map +1 -0
- package/dist/orchestrator/task-selector.js +341 -0
- package/dist/orchestrator/task-selector.js.map +1 -0
- package/dist/prompts/coder.d.ts +36 -0
- package/dist/prompts/coder.d.ts.map +1 -0
- package/dist/prompts/coder.js +315 -0
- package/dist/prompts/coder.js.map +1 -0
- package/dist/prompts/prompt-helpers.d.ts +51 -0
- package/dist/prompts/prompt-helpers.d.ts.map +1 -0
- package/dist/prompts/prompt-helpers.js +312 -0
- package/dist/prompts/prompt-helpers.js.map +1 -0
- package/dist/prompts/reviewer.d.ts +40 -0
- package/dist/prompts/reviewer.d.ts.map +1 -0
- package/dist/prompts/reviewer.js +438 -0
- package/dist/prompts/reviewer.js.map +1 -0
- package/dist/providers/api-models.d.ts +65 -0
- package/dist/providers/api-models.d.ts.map +1 -0
- package/dist/providers/api-models.js +323 -0
- package/dist/providers/api-models.js.map +1 -0
- package/dist/providers/claude.d.ts +53 -0
- package/dist/providers/claude.d.ts.map +1 -0
- package/dist/providers/claude.js +229 -0
- package/dist/providers/claude.js.map +1 -0
- package/dist/providers/codex.d.ts +53 -0
- package/dist/providers/codex.d.ts.map +1 -0
- package/dist/providers/codex.js +214 -0
- package/dist/providers/codex.js.map +1 -0
- package/dist/providers/gemini.d.ts +58 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +242 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/index.d.ts +13 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +49 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/interface.d.ts +173 -0
- package/dist/providers/interface.d.ts.map +1 -0
- package/dist/providers/interface.js +96 -0
- package/dist/providers/interface.js.map +1 -0
- package/dist/providers/invocation-logger.d.ts +114 -0
- package/dist/providers/invocation-logger.d.ts.map +1 -0
- package/dist/providers/invocation-logger.js +298 -0
- package/dist/providers/invocation-logger.js.map +1 -0
- package/dist/providers/openai.d.ts +53 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +232 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/registry.d.ts +100 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +178 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/runners/activity-log.d.ts +65 -0
- package/dist/runners/activity-log.d.ts.map +1 -0
- package/dist/runners/activity-log.js +148 -0
- package/dist/runners/activity-log.js.map +1 -0
- package/dist/runners/cron.d.ts +26 -0
- package/dist/runners/cron.d.ts.map +1 -0
- package/dist/runners/cron.js +176 -0
- package/dist/runners/cron.js.map +1 -0
- package/dist/runners/daemon.d.ts +71 -0
- package/dist/runners/daemon.d.ts.map +1 -0
- package/dist/runners/daemon.js +245 -0
- package/dist/runners/daemon.js.map +1 -0
- package/dist/runners/global-db.d.ts +31 -0
- package/dist/runners/global-db.d.ts.map +1 -0
- package/dist/runners/global-db.js +230 -0
- package/dist/runners/global-db.js.map +1 -0
- package/dist/runners/hang-detector.d.ts +38 -0
- package/dist/runners/hang-detector.d.ts.map +1 -0
- package/dist/runners/hang-detector.js +136 -0
- package/dist/runners/hang-detector.js.map +1 -0
- package/dist/runners/heartbeat.d.ts +39 -0
- package/dist/runners/heartbeat.d.ts.map +1 -0
- package/dist/runners/heartbeat.js +79 -0
- package/dist/runners/heartbeat.js.map +1 -0
- package/dist/runners/lock.d.ts +47 -0
- package/dist/runners/lock.d.ts.map +1 -0
- package/dist/runners/lock.js +150 -0
- package/dist/runners/lock.js.map +1 -0
- package/dist/runners/orchestrator-loop.d.ts +20 -0
- package/dist/runners/orchestrator-loop.d.ts.map +1 -0
- package/dist/runners/orchestrator-loop.js +285 -0
- package/dist/runners/orchestrator-loop.js.map +1 -0
- package/dist/runners/projects.d.ts +96 -0
- package/dist/runners/projects.d.ts.map +1 -0
- package/dist/runners/projects.js +255 -0
- package/dist/runners/projects.js.map +1 -0
- package/dist/runners/wakeup.d.ts +34 -0
- package/dist/runners/wakeup.d.ts.map +1 -0
- package/dist/runners/wakeup.js +291 -0
- package/dist/runners/wakeup.js.map +1 -0
- package/migrations/001_initial_schema.sql +106 -0
- package/migrations/002_add_commit_sha.sql +12 -0
- package/migrations/003_add_section_priority.sql +13 -0
- package/migrations/004_add_section_dependencies.sql +18 -0
- package/migrations/005_add_audit_actor_model.sql +10 -0
- package/migrations/006_add_task_invocations.sql +33 -0
- package/migrations/007_add_file_anchor.sql +14 -0
- package/migrations/manifest.json +62 -0
- package/package.json +49 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* Steroids CLI - Automated task execution system
|
|
5
|
+
* Entry point for the CLI
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
const node_fs_1 = require("node:fs");
|
|
9
|
+
const node_path_1 = require("node:path");
|
|
10
|
+
const flags_js_1 = require("./cli/flags.js");
|
|
11
|
+
const errors_js_1 = require("./cli/errors.js");
|
|
12
|
+
const output_js_1 = require("./cli/output.js");
|
|
13
|
+
const init_js_1 = require("./commands/init.js");
|
|
14
|
+
const tasks_js_1 = require("./commands/tasks.js");
|
|
15
|
+
const sections_js_1 = require("./commands/sections.js");
|
|
16
|
+
const loop_js_1 = require("./commands/loop.js");
|
|
17
|
+
const runners_js_1 = require("./commands/runners.js");
|
|
18
|
+
const config_js_1 = require("./commands/config.js");
|
|
19
|
+
const health_js_1 = require("./commands/health.js");
|
|
20
|
+
const scan_js_1 = require("./commands/scan.js");
|
|
21
|
+
const backup_js_1 = require("./commands/backup.js");
|
|
22
|
+
const logs_js_1 = require("./commands/logs.js");
|
|
23
|
+
const gc_js_1 = require("./commands/gc.js");
|
|
24
|
+
const completion_js_1 = require("./commands/completion.js");
|
|
25
|
+
const locks_js_1 = require("./commands/locks.js");
|
|
26
|
+
const disputes_js_1 = require("./commands/disputes.js");
|
|
27
|
+
const purge_js_1 = require("./commands/purge.js");
|
|
28
|
+
const git_js_1 = require("./commands/git.js");
|
|
29
|
+
const about_js_1 = require("./commands/about.js");
|
|
30
|
+
const projects_js_1 = require("./commands/projects.js");
|
|
31
|
+
const llm_js_1 = require("./commands/llm.js");
|
|
32
|
+
const stats_js_1 = require("./commands/stats.js");
|
|
33
|
+
const hooks_js_1 = require("./commands/hooks.js");
|
|
34
|
+
const ai_js_1 = require("./commands/ai.js");
|
|
35
|
+
const web_js_1 = require("./commands/web.js");
|
|
36
|
+
// Read version from package.json - search up from dist folder
|
|
37
|
+
function getVersion() {
|
|
38
|
+
// When running from dist/, package.json is one level up
|
|
39
|
+
const paths = [
|
|
40
|
+
(0, node_path_1.join)(__dirname, '..', 'package.json'),
|
|
41
|
+
(0, node_path_1.join)(__dirname, 'package.json'),
|
|
42
|
+
(0, node_path_1.join)(process.cwd(), 'package.json'),
|
|
43
|
+
];
|
|
44
|
+
for (const p of paths) {
|
|
45
|
+
if ((0, node_fs_1.existsSync)(p)) {
|
|
46
|
+
try {
|
|
47
|
+
const pkg = JSON.parse((0, node_fs_1.readFileSync)(p, 'utf-8'));
|
|
48
|
+
if (pkg.name === 'steroids-cli')
|
|
49
|
+
return pkg.version;
|
|
50
|
+
}
|
|
51
|
+
catch { /* ignore */ }
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return '0.0.0';
|
|
55
|
+
}
|
|
56
|
+
const VERSION = getVersion();
|
|
57
|
+
const HELP = `
|
|
58
|
+
steroids - Automated task execution with coder/reviewer loop
|
|
59
|
+
|
|
60
|
+
USAGE:
|
|
61
|
+
steroids <command> [options]
|
|
62
|
+
|
|
63
|
+
COMMANDS:
|
|
64
|
+
about Explain what Steroids is (for LLMs discovering this tool)
|
|
65
|
+
llm Compact instructions for LLM agents (call when context lost)
|
|
66
|
+
|
|
67
|
+
init Initialize steroids in current directory
|
|
68
|
+
sections Manage task sections
|
|
69
|
+
tasks Manage tasks
|
|
70
|
+
stats Global activity statistics
|
|
71
|
+
projects Manage global project registry
|
|
72
|
+
dispute Manage coder/reviewer disputes
|
|
73
|
+
loop Run the orchestrator loop
|
|
74
|
+
runners Manage runner daemons
|
|
75
|
+
config Manage configuration
|
|
76
|
+
ai Manage AI providers and models
|
|
77
|
+
hooks Manage event hooks
|
|
78
|
+
health Check project health
|
|
79
|
+
scan Scan directory for projects
|
|
80
|
+
backup Manage backups
|
|
81
|
+
logs View invocation logs
|
|
82
|
+
gc Garbage collection
|
|
83
|
+
purge Purge old data
|
|
84
|
+
git Git integration commands
|
|
85
|
+
completion Generate shell completions
|
|
86
|
+
web Launch the web dashboard (auto-clones on first run)
|
|
87
|
+
locks Manage task and section locks
|
|
88
|
+
|
|
89
|
+
GLOBAL OPTIONS:
|
|
90
|
+
-h, --help Show help
|
|
91
|
+
--version Show version
|
|
92
|
+
-j, --json Output as JSON
|
|
93
|
+
-q, --quiet Minimal output
|
|
94
|
+
-v, --verbose Detailed output
|
|
95
|
+
--no-color Disable colored output
|
|
96
|
+
--config <path> Custom config file path
|
|
97
|
+
--dry-run Preview without executing
|
|
98
|
+
--timeout <dur> Command timeout (e.g., 30s, 5m)
|
|
99
|
+
--no-hooks Skip hook execution
|
|
100
|
+
|
|
101
|
+
ENVIRONMENT VARIABLES:
|
|
102
|
+
STEROIDS_CONFIG Custom config path
|
|
103
|
+
STEROIDS_JSON Output as JSON (1, true)
|
|
104
|
+
STEROIDS_QUIET Minimal output (1, true)
|
|
105
|
+
STEROIDS_VERBOSE Detailed output (1, true)
|
|
106
|
+
STEROIDS_NO_HOOKS Skip hooks (1, true)
|
|
107
|
+
STEROIDS_NO_COLOR Disable colors (1, true)
|
|
108
|
+
STEROIDS_AUTO_MIGRATE Auto-migrate database (1, true)
|
|
109
|
+
STEROIDS_TIMEOUT Command timeout (duration)
|
|
110
|
+
NO_COLOR Standard no-color variable
|
|
111
|
+
CI CI environment detected
|
|
112
|
+
|
|
113
|
+
EXAMPLES:
|
|
114
|
+
steroids init
|
|
115
|
+
steroids sections add "Phase 1"
|
|
116
|
+
steroids tasks add "Implement feature" --section "Phase 1"
|
|
117
|
+
steroids tasks list --json
|
|
118
|
+
steroids loop --verbose
|
|
119
|
+
STEROIDS_QUIET=1 steroids tasks list
|
|
120
|
+
`;
|
|
121
|
+
async function main() {
|
|
122
|
+
try {
|
|
123
|
+
const args = process.argv.slice(2);
|
|
124
|
+
// Parse global flags first
|
|
125
|
+
const { flags, remaining } = (0, flags_js_1.parseGlobalFlags)(args);
|
|
126
|
+
// Apply global flags (e.g., set NO_COLOR)
|
|
127
|
+
(0, flags_js_1.applyGlobalFlags)(flags);
|
|
128
|
+
// Handle --help at top level
|
|
129
|
+
if (flags.help && remaining.length === 0) {
|
|
130
|
+
console.log(HELP);
|
|
131
|
+
process.exit(0);
|
|
132
|
+
}
|
|
133
|
+
// Handle --version at top level
|
|
134
|
+
if (flags.version && remaining.length === 0) {
|
|
135
|
+
if (flags.json) {
|
|
136
|
+
console.log(JSON.stringify({ version: VERSION }, null, 2));
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
console.log(`steroids v${VERSION}`);
|
|
140
|
+
}
|
|
141
|
+
process.exit(0);
|
|
142
|
+
}
|
|
143
|
+
// No command provided
|
|
144
|
+
if (remaining.length === 0) {
|
|
145
|
+
console.log(HELP);
|
|
146
|
+
process.exit(0);
|
|
147
|
+
}
|
|
148
|
+
const command = remaining[0];
|
|
149
|
+
const commandArgs = remaining.slice(1);
|
|
150
|
+
// Execute command - pass flags to all commands
|
|
151
|
+
switch (command) {
|
|
152
|
+
case 'about':
|
|
153
|
+
await (0, about_js_1.aboutCommand)(commandArgs, flags);
|
|
154
|
+
break;
|
|
155
|
+
case 'init':
|
|
156
|
+
await (0, init_js_1.initCommand)(commandArgs, flags);
|
|
157
|
+
break;
|
|
158
|
+
case 'sections':
|
|
159
|
+
await (0, sections_js_1.sectionsCommand)(commandArgs, flags);
|
|
160
|
+
break;
|
|
161
|
+
case 'tasks':
|
|
162
|
+
await (0, tasks_js_1.tasksCommand)(commandArgs, flags);
|
|
163
|
+
break;
|
|
164
|
+
case 'loop':
|
|
165
|
+
await (0, loop_js_1.loopCommand)(commandArgs, flags);
|
|
166
|
+
break;
|
|
167
|
+
case 'runners':
|
|
168
|
+
await (0, runners_js_1.runnersCommand)(commandArgs, flags);
|
|
169
|
+
break;
|
|
170
|
+
case 'config':
|
|
171
|
+
await (0, config_js_1.configCommand)(commandArgs, flags);
|
|
172
|
+
break;
|
|
173
|
+
case 'ai':
|
|
174
|
+
await (0, ai_js_1.aiCommand)(commandArgs, flags);
|
|
175
|
+
break;
|
|
176
|
+
case 'hooks':
|
|
177
|
+
await (0, hooks_js_1.hooksCommand)(commandArgs, flags);
|
|
178
|
+
break;
|
|
179
|
+
case 'health':
|
|
180
|
+
await (0, health_js_1.healthCommand)(commandArgs, flags);
|
|
181
|
+
break;
|
|
182
|
+
case 'scan':
|
|
183
|
+
await (0, scan_js_1.scanCommand)(commandArgs, flags);
|
|
184
|
+
break;
|
|
185
|
+
case 'backup':
|
|
186
|
+
await (0, backup_js_1.backupCommand)(commandArgs, flags);
|
|
187
|
+
break;
|
|
188
|
+
case 'logs':
|
|
189
|
+
await (0, logs_js_1.logsCommand)(commandArgs, flags);
|
|
190
|
+
break;
|
|
191
|
+
case 'gc':
|
|
192
|
+
await (0, gc_js_1.gcCommand)(commandArgs, flags);
|
|
193
|
+
break;
|
|
194
|
+
case 'completion':
|
|
195
|
+
await (0, completion_js_1.completionCommand)(commandArgs, flags);
|
|
196
|
+
break;
|
|
197
|
+
case 'locks':
|
|
198
|
+
await (0, locks_js_1.locksCommand)(commandArgs, flags);
|
|
199
|
+
break;
|
|
200
|
+
case 'dispute':
|
|
201
|
+
await (0, disputes_js_1.disputeCommand)(commandArgs, flags);
|
|
202
|
+
break;
|
|
203
|
+
case 'purge':
|
|
204
|
+
await (0, purge_js_1.purgeCommand)(commandArgs, flags);
|
|
205
|
+
break;
|
|
206
|
+
case 'git':
|
|
207
|
+
await (0, git_js_1.gitCommand)(commandArgs, flags);
|
|
208
|
+
break;
|
|
209
|
+
case 'projects':
|
|
210
|
+
await (0, projects_js_1.projectsCommand)(commandArgs, flags);
|
|
211
|
+
break;
|
|
212
|
+
case 'stats':
|
|
213
|
+
await (0, stats_js_1.statsCommand)(commandArgs, flags);
|
|
214
|
+
break;
|
|
215
|
+
case 'llm':
|
|
216
|
+
await (0, llm_js_1.llmCommand)(commandArgs, flags);
|
|
217
|
+
break;
|
|
218
|
+
case 'web':
|
|
219
|
+
await (0, web_js_1.webCommand)(commandArgs, flags);
|
|
220
|
+
break;
|
|
221
|
+
default:
|
|
222
|
+
if (flags.json) {
|
|
223
|
+
(0, output_js_1.outputJsonError)(command, null, errors_js_1.ErrorCode.INVALID_ARGUMENTS, `Unknown command: ${command}`, { command });
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
console.error(`Error: Unknown command: ${command}`);
|
|
227
|
+
console.error(`Run 'steroids --help' for usage information.`);
|
|
228
|
+
}
|
|
229
|
+
process.exit((0, errors_js_1.getExitCode)(errors_js_1.ErrorCode.INVALID_ARGUMENTS));
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
catch (error) {
|
|
233
|
+
// Get flags for error output (re-parse if needed, as we may have thrown before parsing)
|
|
234
|
+
let errorFlags = { json: false, verbose: false };
|
|
235
|
+
try {
|
|
236
|
+
const { flags } = (0, flags_js_1.parseGlobalFlags)(process.argv.slice(2));
|
|
237
|
+
errorFlags = { json: flags.json, verbose: flags.verbose };
|
|
238
|
+
}
|
|
239
|
+
catch {
|
|
240
|
+
// If parsing fails, use env vars as fallback
|
|
241
|
+
errorFlags.json = process.env.STEROIDS_JSON === '1' || process.env.STEROIDS_JSON === 'true';
|
|
242
|
+
errorFlags.verbose = process.env.STEROIDS_VERBOSE === '1';
|
|
243
|
+
}
|
|
244
|
+
// Handle CliError with proper exit codes
|
|
245
|
+
if (error instanceof errors_js_1.CliError) {
|
|
246
|
+
if (errorFlags.json) {
|
|
247
|
+
(0, output_js_1.outputJsonError)('steroids', null, error.code, error.message, error.details);
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
console.error(`Error: ${error.message}`);
|
|
251
|
+
if (errorFlags.verbose && error.details) {
|
|
252
|
+
console.error('Details:', JSON.stringify(error.details, null, 2));
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
process.exit(error.exitCode);
|
|
256
|
+
}
|
|
257
|
+
// Handle generic errors
|
|
258
|
+
if (error instanceof Error) {
|
|
259
|
+
if (errorFlags.json) {
|
|
260
|
+
(0, output_js_1.outputJsonError)('steroids', null, errors_js_1.ErrorCode.GENERAL_ERROR, error.message);
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
console.error(`Error: ${error.message}`);
|
|
264
|
+
if (errorFlags.verbose) {
|
|
265
|
+
console.error(error.stack);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
if (errorFlags.json) {
|
|
271
|
+
(0, output_js_1.outputJsonError)('steroids', null, errors_js_1.ErrorCode.GENERAL_ERROR, 'An unexpected error occurred');
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
console.error('An unexpected error occurred');
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
process.exit((0, errors_js_1.getExitCode)(errors_js_1.ErrorCode.GENERAL_ERROR));
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
main();
|
|
281
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lock cleanup for expired locks
|
|
3
|
+
* Called periodically by cron to release stale locks
|
|
4
|
+
*/
|
|
5
|
+
import type Database from 'better-sqlite3';
|
|
6
|
+
import { type TaskLock, type SectionLock } from './queries.js';
|
|
7
|
+
export interface CleanupResult {
|
|
8
|
+
success: boolean;
|
|
9
|
+
taskLocks: {
|
|
10
|
+
found: number;
|
|
11
|
+
cleaned: number;
|
|
12
|
+
locks: TaskLock[];
|
|
13
|
+
};
|
|
14
|
+
sectionLocks: {
|
|
15
|
+
found: number;
|
|
16
|
+
cleaned: number;
|
|
17
|
+
locks: SectionLock[];
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export interface CleanupOptions {
|
|
21
|
+
dryRun?: boolean;
|
|
22
|
+
verbose?: boolean;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Find all expired locks without removing them
|
|
26
|
+
* Useful for reporting or dry-run mode
|
|
27
|
+
*/
|
|
28
|
+
export declare function findExpiredLocks(db: Database.Database): {
|
|
29
|
+
taskLocks: TaskLock[];
|
|
30
|
+
sectionLocks: SectionLock[];
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Clean up expired task locks
|
|
34
|
+
* Returns the number of locks cleaned
|
|
35
|
+
*/
|
|
36
|
+
export declare function cleanupTaskLocks(db: Database.Database, options?: CleanupOptions): {
|
|
37
|
+
found: TaskLock[];
|
|
38
|
+
cleaned: number;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Clean up expired section locks
|
|
42
|
+
* Returns the number of locks cleaned
|
|
43
|
+
*/
|
|
44
|
+
export declare function cleanupSectionLocks(db: Database.Database, options?: CleanupOptions): {
|
|
45
|
+
found: SectionLock[];
|
|
46
|
+
cleaned: number;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Clean up all expired locks (both task and section)
|
|
50
|
+
* Main entry point for lock cleanup
|
|
51
|
+
*/
|
|
52
|
+
export declare function cleanupAllExpiredLocks(db: Database.Database, options?: CleanupOptions): CleanupResult;
|
|
53
|
+
export interface CleanupScheduler {
|
|
54
|
+
start: () => void;
|
|
55
|
+
stop: () => void;
|
|
56
|
+
runNow: () => CleanupResult;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Create a scheduled cleanup runner
|
|
60
|
+
* Automatically cleans up expired locks at regular intervals
|
|
61
|
+
*/
|
|
62
|
+
export declare function createCleanupScheduler(db: Database.Database, intervalMs?: number, onCleanup?: (result: CleanupResult) => void): CleanupScheduler;
|
|
63
|
+
/**
|
|
64
|
+
* Format cleanup result for JSON output
|
|
65
|
+
*/
|
|
66
|
+
export declare function formatCleanupResultJson(result: CleanupResult): object;
|
|
67
|
+
export declare const CLEANUP_CONSTANTS: {
|
|
68
|
+
readonly DEFAULT_INTERVAL_MS: number;
|
|
69
|
+
};
|
|
70
|
+
//# sourceMappingURL=cleanup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cleanup.d.ts","sourceRoot":"","sources":["../../src/locking/cleanup.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAKL,KAAK,QAAQ,EACb,KAAK,WAAW,EACjB,MAAM,cAAc,CAAC;AAItB,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE;QACT,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,QAAQ,EAAE,CAAC;KACnB,CAAC;IACF,YAAY,EAAE;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,WAAW,EAAE,CAAC;KACtB,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAID;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG;IACvD,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,YAAY,EAAE,WAAW,EAAE,CAAC;CAC7B,CAKA;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,GAAE,cAAmB,GAC3B;IAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAexC;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,GAAE,cAAmB,GAC3B;IAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAe3C;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,GAAE,cAAmB,GAC3B,aAAa,CAiBf;AAID,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,MAAM,EAAE,MAAM,aAAa,CAAC;CAC7B;AAKD;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,UAAU,GAAE,MAAoC,EAChD,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,GAC1C,gBAAgB,CAiClB;AAID;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CA8BrE;AAID,eAAO,MAAM,iBAAiB;;CAEpB,CAAC"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Lock cleanup for expired locks
|
|
4
|
+
* Called periodically by cron to release stale locks
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.CLEANUP_CONSTANTS = void 0;
|
|
8
|
+
exports.findExpiredLocks = findExpiredLocks;
|
|
9
|
+
exports.cleanupTaskLocks = cleanupTaskLocks;
|
|
10
|
+
exports.cleanupSectionLocks = cleanupSectionLocks;
|
|
11
|
+
exports.cleanupAllExpiredLocks = cleanupAllExpiredLocks;
|
|
12
|
+
exports.createCleanupScheduler = createCleanupScheduler;
|
|
13
|
+
exports.formatCleanupResultJson = formatCleanupResultJson;
|
|
14
|
+
const queries_js_1 = require("./queries.js");
|
|
15
|
+
// ============ Cleanup Functions ============
|
|
16
|
+
/**
|
|
17
|
+
* Find all expired locks without removing them
|
|
18
|
+
* Useful for reporting or dry-run mode
|
|
19
|
+
*/
|
|
20
|
+
function findExpiredLocks(db) {
|
|
21
|
+
return {
|
|
22
|
+
taskLocks: (0, queries_js_1.findExpiredTaskLocks)(db),
|
|
23
|
+
sectionLocks: (0, queries_js_1.findExpiredSectionLocks)(db),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Clean up expired task locks
|
|
28
|
+
* Returns the number of locks cleaned
|
|
29
|
+
*/
|
|
30
|
+
function cleanupTaskLocks(db, options = {}) {
|
|
31
|
+
const expired = (0, queries_js_1.findExpiredTaskLocks)(db);
|
|
32
|
+
if (options.dryRun || expired.length === 0) {
|
|
33
|
+
return {
|
|
34
|
+
found: expired,
|
|
35
|
+
cleaned: 0,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
const cleaned = (0, queries_js_1.cleanupExpiredTaskLocks)(db);
|
|
39
|
+
return {
|
|
40
|
+
found: expired,
|
|
41
|
+
cleaned,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Clean up expired section locks
|
|
46
|
+
* Returns the number of locks cleaned
|
|
47
|
+
*/
|
|
48
|
+
function cleanupSectionLocks(db, options = {}) {
|
|
49
|
+
const expired = (0, queries_js_1.findExpiredSectionLocks)(db);
|
|
50
|
+
if (options.dryRun || expired.length === 0) {
|
|
51
|
+
return {
|
|
52
|
+
found: expired,
|
|
53
|
+
cleaned: 0,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
const cleaned = (0, queries_js_1.cleanupExpiredSectionLocks)(db);
|
|
57
|
+
return {
|
|
58
|
+
found: expired,
|
|
59
|
+
cleaned,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Clean up all expired locks (both task and section)
|
|
64
|
+
* Main entry point for lock cleanup
|
|
65
|
+
*/
|
|
66
|
+
function cleanupAllExpiredLocks(db, options = {}) {
|
|
67
|
+
const taskResult = cleanupTaskLocks(db, options);
|
|
68
|
+
const sectionResult = cleanupSectionLocks(db, options);
|
|
69
|
+
return {
|
|
70
|
+
success: true,
|
|
71
|
+
taskLocks: {
|
|
72
|
+
found: taskResult.found.length,
|
|
73
|
+
cleaned: taskResult.cleaned,
|
|
74
|
+
locks: taskResult.found,
|
|
75
|
+
},
|
|
76
|
+
sectionLocks: {
|
|
77
|
+
found: sectionResult.found.length,
|
|
78
|
+
cleaned: sectionResult.cleaned,
|
|
79
|
+
locks: sectionResult.found,
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
// Default cleanup interval: 5 minutes
|
|
84
|
+
const DEFAULT_CLEANUP_INTERVAL_MS = 5 * 60 * 1000;
|
|
85
|
+
/**
|
|
86
|
+
* Create a scheduled cleanup runner
|
|
87
|
+
* Automatically cleans up expired locks at regular intervals
|
|
88
|
+
*/
|
|
89
|
+
function createCleanupScheduler(db, intervalMs = DEFAULT_CLEANUP_INTERVAL_MS, onCleanup) {
|
|
90
|
+
let intervalId = null;
|
|
91
|
+
const runCleanup = () => {
|
|
92
|
+
const result = cleanupAllExpiredLocks(db);
|
|
93
|
+
if (onCleanup) {
|
|
94
|
+
onCleanup(result);
|
|
95
|
+
}
|
|
96
|
+
return result;
|
|
97
|
+
};
|
|
98
|
+
const start = () => {
|
|
99
|
+
if (intervalId)
|
|
100
|
+
return; // Already running
|
|
101
|
+
// Run immediately
|
|
102
|
+
runCleanup();
|
|
103
|
+
// Schedule periodic cleanup
|
|
104
|
+
intervalId = setInterval(runCleanup, intervalMs);
|
|
105
|
+
};
|
|
106
|
+
const stop = () => {
|
|
107
|
+
if (intervalId) {
|
|
108
|
+
clearInterval(intervalId);
|
|
109
|
+
intervalId = null;
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
return {
|
|
113
|
+
start,
|
|
114
|
+
stop,
|
|
115
|
+
runNow: runCleanup,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
// ============ JSON Output ============
|
|
119
|
+
/**
|
|
120
|
+
* Format cleanup result for JSON output
|
|
121
|
+
*/
|
|
122
|
+
function formatCleanupResultJson(result) {
|
|
123
|
+
return {
|
|
124
|
+
success: result.success,
|
|
125
|
+
command: 'locks',
|
|
126
|
+
subcommand: 'cleanup',
|
|
127
|
+
data: {
|
|
128
|
+
task_locks: {
|
|
129
|
+
found: result.taskLocks.found,
|
|
130
|
+
cleaned: result.taskLocks.cleaned,
|
|
131
|
+
locks: result.taskLocks.locks.map(lock => ({
|
|
132
|
+
task_id: lock.task_id,
|
|
133
|
+
runner_id: lock.runner_id,
|
|
134
|
+
acquired_at: lock.acquired_at,
|
|
135
|
+
expires_at: lock.expires_at,
|
|
136
|
+
heartbeat_at: lock.heartbeat_at,
|
|
137
|
+
})),
|
|
138
|
+
},
|
|
139
|
+
section_locks: {
|
|
140
|
+
found: result.sectionLocks.found,
|
|
141
|
+
cleaned: result.sectionLocks.cleaned,
|
|
142
|
+
locks: result.sectionLocks.locks.map(lock => ({
|
|
143
|
+
section_id: lock.section_id,
|
|
144
|
+
runner_id: lock.runner_id,
|
|
145
|
+
acquired_at: lock.acquired_at,
|
|
146
|
+
expires_at: lock.expires_at,
|
|
147
|
+
})),
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
error: null,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
// ============ Constants Export ============
|
|
154
|
+
exports.CLEANUP_CONSTANTS = {
|
|
155
|
+
DEFAULT_INTERVAL_MS: DEFAULT_CLEANUP_INTERVAL_MS,
|
|
156
|
+
};
|
|
157
|
+
//# sourceMappingURL=cleanup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../../src/locking/cleanup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database queries for task and section lock management
|
|
3
|
+
* All lock operations are atomic using SQLite transactions
|
|
4
|
+
*/
|
|
5
|
+
import type Database from 'better-sqlite3';
|
|
6
|
+
export interface TaskLock {
|
|
7
|
+
task_id: string;
|
|
8
|
+
runner_id: string;
|
|
9
|
+
acquired_at: string;
|
|
10
|
+
expires_at: string;
|
|
11
|
+
heartbeat_at: string;
|
|
12
|
+
}
|
|
13
|
+
export interface SectionLock {
|
|
14
|
+
section_id: string;
|
|
15
|
+
runner_id: string;
|
|
16
|
+
acquired_at: string;
|
|
17
|
+
expires_at: string;
|
|
18
|
+
}
|
|
19
|
+
export interface LockInfo {
|
|
20
|
+
isLocked: boolean;
|
|
21
|
+
lock: TaskLock | null;
|
|
22
|
+
isExpired: boolean;
|
|
23
|
+
isOwnedByUs: boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Get task lock by task ID
|
|
27
|
+
*/
|
|
28
|
+
export declare function getTaskLock(db: Database.Database, taskId: string): TaskLock | null;
|
|
29
|
+
/**
|
|
30
|
+
* Check if a task lock is expired
|
|
31
|
+
*/
|
|
32
|
+
export declare function isTaskLockExpired(lock: TaskLock): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Get task lock info with ownership and expiry status
|
|
35
|
+
*/
|
|
36
|
+
export declare function getTaskLockInfo(db: Database.Database, taskId: string, runnerId: string): LockInfo;
|
|
37
|
+
/**
|
|
38
|
+
* Try to insert a new task lock (atomic)
|
|
39
|
+
* Returns true if lock was acquired, false if already exists
|
|
40
|
+
*/
|
|
41
|
+
export declare function tryInsertTaskLock(db: Database.Database, taskId: string, runnerId: string, timeoutMinutes: number): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Claim an expired lock atomically
|
|
44
|
+
* Only succeeds if the lock is actually expired at execution time
|
|
45
|
+
*/
|
|
46
|
+
export declare function claimExpiredTaskLock(db: Database.Database, taskId: string, runnerId: string, timeoutMinutes: number): boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Release a task lock (only if owned by the specified runner)
|
|
49
|
+
* Returns true if lock was released, false if not owned
|
|
50
|
+
*/
|
|
51
|
+
export declare function releaseTaskLock(db: Database.Database, taskId: string, runnerId: string): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Force release a task lock (admin operation)
|
|
54
|
+
* Returns true if lock was released
|
|
55
|
+
*/
|
|
56
|
+
export declare function forceReleaseTaskLock(db: Database.Database, taskId: string): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Update heartbeat for a task lock
|
|
59
|
+
* Returns true if heartbeat was updated, false if lock not found or not owned
|
|
60
|
+
*/
|
|
61
|
+
export declare function updateTaskLockHeartbeat(db: Database.Database, taskId: string, runnerId: string): boolean;
|
|
62
|
+
/**
|
|
63
|
+
* Extend a task lock's expiry time
|
|
64
|
+
* Returns true if extended, false if lock not found or not owned
|
|
65
|
+
*/
|
|
66
|
+
export declare function extendTaskLock(db: Database.Database, taskId: string, runnerId: string, additionalMinutes: number): boolean;
|
|
67
|
+
/**
|
|
68
|
+
* List all task locks
|
|
69
|
+
*/
|
|
70
|
+
export declare function listTaskLocks(db: Database.Database): TaskLock[];
|
|
71
|
+
/**
|
|
72
|
+
* Find all expired task locks
|
|
73
|
+
*/
|
|
74
|
+
export declare function findExpiredTaskLocks(db: Database.Database): TaskLock[];
|
|
75
|
+
/**
|
|
76
|
+
* Delete all expired task locks
|
|
77
|
+
* Returns the number of locks deleted
|
|
78
|
+
*/
|
|
79
|
+
export declare function cleanupExpiredTaskLocks(db: Database.Database): number;
|
|
80
|
+
/**
|
|
81
|
+
* Get section lock by section ID
|
|
82
|
+
*/
|
|
83
|
+
export declare function getSectionLock(db: Database.Database, sectionId: string): SectionLock | null;
|
|
84
|
+
/**
|
|
85
|
+
* Check if a section lock is expired
|
|
86
|
+
*/
|
|
87
|
+
export declare function isSectionLockExpired(lock: SectionLock): boolean;
|
|
88
|
+
/**
|
|
89
|
+
* Try to insert a new section lock (atomic)
|
|
90
|
+
*/
|
|
91
|
+
export declare function tryInsertSectionLock(db: Database.Database, sectionId: string, runnerId: string, timeoutMinutes: number): boolean;
|
|
92
|
+
/**
|
|
93
|
+
* Claim an expired section lock atomically
|
|
94
|
+
*/
|
|
95
|
+
export declare function claimExpiredSectionLock(db: Database.Database, sectionId: string, runnerId: string, timeoutMinutes: number): boolean;
|
|
96
|
+
/**
|
|
97
|
+
* Release a section lock
|
|
98
|
+
*/
|
|
99
|
+
export declare function releaseSectionLock(db: Database.Database, sectionId: string, runnerId: string): boolean;
|
|
100
|
+
/**
|
|
101
|
+
* Force release a section lock
|
|
102
|
+
*/
|
|
103
|
+
export declare function forceReleaseSectionLock(db: Database.Database, sectionId: string): boolean;
|
|
104
|
+
/**
|
|
105
|
+
* List all section locks
|
|
106
|
+
*/
|
|
107
|
+
export declare function listSectionLocks(db: Database.Database): SectionLock[];
|
|
108
|
+
/**
|
|
109
|
+
* Find all expired section locks
|
|
110
|
+
*/
|
|
111
|
+
export declare function findExpiredSectionLocks(db: Database.Database): SectionLock[];
|
|
112
|
+
/**
|
|
113
|
+
* Delete all expired section locks
|
|
114
|
+
*/
|
|
115
|
+
export declare function cleanupExpiredSectionLocks(db: Database.Database): number;
|
|
116
|
+
//# sourceMappingURL=queries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/locking/queries.ts"],"names":[],"mappings":"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"}
|