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,150 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Singleton lock for runner daemon
|
|
4
|
+
* Uses directory-based locking with PID file
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.getLockDir = getLockDir;
|
|
8
|
+
exports.getPidFilePath = getPidFilePath;
|
|
9
|
+
exports.isProcessAlive = isProcessAlive;
|
|
10
|
+
exports.readLockPid = readLockPid;
|
|
11
|
+
exports.removeLock = removeLock;
|
|
12
|
+
exports.acquireLock = acquireLock;
|
|
13
|
+
exports.releaseLock = releaseLock;
|
|
14
|
+
exports.checkLockStatus = checkLockStatus;
|
|
15
|
+
const node_fs_1 = require("node:fs");
|
|
16
|
+
const node_path_1 = require("node:path");
|
|
17
|
+
const global_db_js_1 = require("./global-db.js");
|
|
18
|
+
const LOCK_DIR = 'runners/lock';
|
|
19
|
+
const PID_FILE = 'pid';
|
|
20
|
+
/**
|
|
21
|
+
* Get the lock directory path
|
|
22
|
+
*/
|
|
23
|
+
function getLockDir() {
|
|
24
|
+
return (0, node_path_1.join)((0, global_db_js_1.getGlobalSteroidsDir)(), LOCK_DIR);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Get the PID file path
|
|
28
|
+
*/
|
|
29
|
+
function getPidFilePath() {
|
|
30
|
+
return (0, node_path_1.join)(getLockDir(), PID_FILE);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Check if a process with given PID is running
|
|
34
|
+
*/
|
|
35
|
+
function isProcessAlive(pid) {
|
|
36
|
+
try {
|
|
37
|
+
// Sending signal 0 checks if process exists without killing it
|
|
38
|
+
process.kill(pid, 0);
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Read the PID from lock file
|
|
47
|
+
*/
|
|
48
|
+
function readLockPid() {
|
|
49
|
+
const pidPath = getPidFilePath();
|
|
50
|
+
if (!(0, node_fs_1.existsSync)(pidPath)) {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
try {
|
|
54
|
+
const content = (0, node_fs_1.readFileSync)(pidPath, 'utf-8').trim();
|
|
55
|
+
const pid = parseInt(content, 10);
|
|
56
|
+
return isNaN(pid) ? null : pid;
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Remove the lock directory
|
|
64
|
+
*/
|
|
65
|
+
function removeLock() {
|
|
66
|
+
const lockDir = getLockDir();
|
|
67
|
+
if ((0, node_fs_1.existsSync)(lockDir)) {
|
|
68
|
+
(0, node_fs_1.rmSync)(lockDir, { recursive: true, force: true });
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Attempt to acquire the singleton lock
|
|
73
|
+
* Returns result indicating success or existing lock holder
|
|
74
|
+
*/
|
|
75
|
+
function acquireLock() {
|
|
76
|
+
const lockDir = getLockDir();
|
|
77
|
+
const pidPath = getPidFilePath();
|
|
78
|
+
// Check if lock exists
|
|
79
|
+
if ((0, node_fs_1.existsSync)(lockDir)) {
|
|
80
|
+
const existingPid = readLockPid();
|
|
81
|
+
if (existingPid !== null) {
|
|
82
|
+
if (isProcessAlive(existingPid)) {
|
|
83
|
+
// Another runner is active
|
|
84
|
+
return {
|
|
85
|
+
acquired: false,
|
|
86
|
+
existingPid,
|
|
87
|
+
isZombie: false,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
// Zombie lock - process is dead
|
|
91
|
+
removeLock();
|
|
92
|
+
// Fall through to acquire
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
// Lock dir exists but no valid PID - clean up
|
|
96
|
+
removeLock();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Create lock directory
|
|
100
|
+
try {
|
|
101
|
+
(0, node_fs_1.mkdirSync)(lockDir, { recursive: true });
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
// Race condition - another process may have created it
|
|
105
|
+
if ((0, node_fs_1.existsSync)(lockDir)) {
|
|
106
|
+
const existingPid = readLockPid();
|
|
107
|
+
if (existingPid !== null && isProcessAlive(existingPid)) {
|
|
108
|
+
return {
|
|
109
|
+
acquired: false,
|
|
110
|
+
existingPid,
|
|
111
|
+
isZombie: false,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
throw err;
|
|
116
|
+
}
|
|
117
|
+
// Write our PID
|
|
118
|
+
(0, node_fs_1.writeFileSync)(pidPath, String(process.pid));
|
|
119
|
+
return { acquired: true };
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Release the lock (should be called on shutdown)
|
|
123
|
+
*/
|
|
124
|
+
function releaseLock() {
|
|
125
|
+
const existingPid = readLockPid();
|
|
126
|
+
// Only release if we own the lock
|
|
127
|
+
if (existingPid === process.pid) {
|
|
128
|
+
removeLock();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Check lock status without acquiring
|
|
133
|
+
*/
|
|
134
|
+
function checkLockStatus() {
|
|
135
|
+
const lockDir = getLockDir();
|
|
136
|
+
if (!(0, node_fs_1.existsSync)(lockDir)) {
|
|
137
|
+
return { locked: false, pid: null, isZombie: false };
|
|
138
|
+
}
|
|
139
|
+
const pid = readLockPid();
|
|
140
|
+
if (pid === null) {
|
|
141
|
+
return { locked: false, pid: null, isZombie: false };
|
|
142
|
+
}
|
|
143
|
+
const alive = isProcessAlive(pid);
|
|
144
|
+
return {
|
|
145
|
+
locked: alive,
|
|
146
|
+
pid,
|
|
147
|
+
isZombie: !alive,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.js","sourceRoot":"","sources":["../../src/runners/lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Orchestrator loop - core task processing logic
|
|
3
|
+
* Used by both the daemon and the loop command
|
|
4
|
+
*/
|
|
5
|
+
export interface LoopOptions {
|
|
6
|
+
projectPath: string;
|
|
7
|
+
once?: boolean;
|
|
8
|
+
sectionId?: string;
|
|
9
|
+
runnerId?: string;
|
|
10
|
+
onIteration?: (iteration: number) => void;
|
|
11
|
+
onTaskStart?: (taskId: string, action: string) => void;
|
|
12
|
+
onTaskComplete?: (taskId: string) => void;
|
|
13
|
+
shouldStop?: () => boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Run the orchestrator loop
|
|
17
|
+
* Processes tasks until all are complete or shouldStop returns true
|
|
18
|
+
*/
|
|
19
|
+
export declare function runOrchestratorLoop(options: LoopOptions): Promise<void>;
|
|
20
|
+
//# sourceMappingURL=orchestrator-loop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator-loop.d.ts","sourceRoot":"","sources":["../../src/runners/orchestrator-loop.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAuBH,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvD,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC;CAC5B;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAmN7E"}
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Orchestrator loop - core task processing logic
|
|
4
|
+
* Used by both the daemon and the loop command
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.runOrchestratorLoop = runOrchestratorLoop;
|
|
8
|
+
const connection_js_1 = require("../database/connection.js");
|
|
9
|
+
const index_js_1 = require("../migrations/index.js");
|
|
10
|
+
const queries_js_1 = require("../database/queries.js");
|
|
11
|
+
const task_selector_js_1 = require("../orchestrator/task-selector.js");
|
|
12
|
+
const coder_js_1 = require("../orchestrator/coder.js");
|
|
13
|
+
const loader_js_1 = require("../config/loader.js");
|
|
14
|
+
const reviewer_js_1 = require("../orchestrator/reviewer.js");
|
|
15
|
+
const activity_log_js_1 = require("./activity-log.js");
|
|
16
|
+
const projects_js_1 = require("./projects.js");
|
|
17
|
+
const node_child_process_1 = require("node:child_process");
|
|
18
|
+
function sleep(ms) {
|
|
19
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Run the orchestrator loop
|
|
23
|
+
* Processes tasks until all are complete or shouldStop returns true
|
|
24
|
+
*/
|
|
25
|
+
async function runOrchestratorLoop(options) {
|
|
26
|
+
const { projectPath, once = false, shouldStop, sectionId } = options;
|
|
27
|
+
const { db, close } = (0, connection_js_1.openDatabase)(projectPath);
|
|
28
|
+
// Auto-migrate database if needed
|
|
29
|
+
const dbPath = (0, connection_js_1.getDbPath)(projectPath);
|
|
30
|
+
const migrationResult = (0, index_js_1.autoMigrate)(db, dbPath);
|
|
31
|
+
if (migrationResult.applied) {
|
|
32
|
+
console.log(`Applied ${migrationResult.migrations.length} migration(s): ${migrationResult.migrations.join(', ')}`);
|
|
33
|
+
}
|
|
34
|
+
else if (migrationResult.error) {
|
|
35
|
+
console.error(`Migration error: ${migrationResult.error}`);
|
|
36
|
+
close();
|
|
37
|
+
throw new Error(`Database migration failed: ${migrationResult.error}`);
|
|
38
|
+
}
|
|
39
|
+
// Load batch mode config
|
|
40
|
+
const config = (0, loader_js_1.loadConfig)(projectPath);
|
|
41
|
+
const batchMode = config.sections?.batchMode ?? false;
|
|
42
|
+
const maxBatchSize = config.sections?.maxBatchSize ?? 10;
|
|
43
|
+
try {
|
|
44
|
+
let iteration = 0;
|
|
45
|
+
while (true) {
|
|
46
|
+
// Check if we should stop
|
|
47
|
+
if (shouldStop?.()) {
|
|
48
|
+
console.log('\nLoop stopped by signal');
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
// Check if project has been disabled
|
|
52
|
+
const registeredProject = (0, projects_js_1.getRegisteredProject)(projectPath);
|
|
53
|
+
if (registeredProject && !registeredProject.enabled) {
|
|
54
|
+
console.log('\nProject has been disabled. Stopping loop.');
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
iteration++;
|
|
58
|
+
console.log(`\n─── Iteration ${iteration} ───\n`);
|
|
59
|
+
options.onIteration?.(iteration);
|
|
60
|
+
// Batch mode: process multiple pending tasks at once
|
|
61
|
+
// Only active when not focusing on a specific section and batch mode is enabled
|
|
62
|
+
if (batchMode && !sectionId) {
|
|
63
|
+
const batch = (0, task_selector_js_1.selectTaskBatch)(db, maxBatchSize);
|
|
64
|
+
if (batch && batch.tasks.length > 0) {
|
|
65
|
+
console.log(`[BATCH MODE] Section "${batch.sectionName}" - ${batch.tasks.length} tasks`);
|
|
66
|
+
// Mark all tasks as in_progress
|
|
67
|
+
for (const task of batch.tasks) {
|
|
68
|
+
(0, task_selector_js_1.markTaskInProgress)(db, task.id);
|
|
69
|
+
options.onTaskStart?.(task.id, 'batch');
|
|
70
|
+
}
|
|
71
|
+
// Invoke batch coder
|
|
72
|
+
console.log('\n>>> Invoking BATCH CODER...\n');
|
|
73
|
+
await (0, coder_js_1.invokeCoderBatch)(batch.tasks, batch.sectionName, projectPath);
|
|
74
|
+
// Check which tasks are now in review status
|
|
75
|
+
const tasksInReview = batch.tasks
|
|
76
|
+
.map(t => (0, queries_js_1.getTask)(db, t.id))
|
|
77
|
+
.filter((t) => t !== null && t.status === 'review');
|
|
78
|
+
if (tasksInReview.length > 0) {
|
|
79
|
+
console.log(`\n[BATCH MODE] ${tasksInReview.length} tasks ready for batch review\n`);
|
|
80
|
+
// Invoke batch reviewer
|
|
81
|
+
console.log('\n>>> Invoking BATCH REVIEWER...\n');
|
|
82
|
+
await (0, reviewer_js_1.invokeReviewerBatch)(tasksInReview, batch.sectionName, projectPath);
|
|
83
|
+
// Handle results for each reviewed task
|
|
84
|
+
for (const task of tasksInReview) {
|
|
85
|
+
const updatedTask = (0, queries_js_1.getTask)(db, task.id);
|
|
86
|
+
if (!updatedTask)
|
|
87
|
+
continue;
|
|
88
|
+
const section = task.section_id ? (0, queries_js_1.getSection)(db, task.section_id) : null;
|
|
89
|
+
const sectionName = section?.name ?? null;
|
|
90
|
+
if (updatedTask.status === 'completed' && options.runnerId) {
|
|
91
|
+
// Get commit message for activity log
|
|
92
|
+
let commitMessage = null;
|
|
93
|
+
try {
|
|
94
|
+
commitMessage = (0, node_child_process_1.execSync)('git log -1 --format=%B', {
|
|
95
|
+
cwd: projectPath,
|
|
96
|
+
encoding: 'utf-8',
|
|
97
|
+
}).trim();
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
// Ignore error
|
|
101
|
+
}
|
|
102
|
+
(0, activity_log_js_1.logActivity)(projectPath, options.runnerId, task.id, task.title, sectionName, 'completed', commitMessage);
|
|
103
|
+
}
|
|
104
|
+
else if (updatedTask.status === 'failed' && options.runnerId) {
|
|
105
|
+
(0, activity_log_js_1.logActivity)(projectPath, options.runnerId, task.id, task.title, sectionName, 'failed');
|
|
106
|
+
}
|
|
107
|
+
else if (updatedTask.status === 'disputed' && options.runnerId) {
|
|
108
|
+
(0, activity_log_js_1.logActivity)(projectPath, options.runnerId, task.id, task.title, sectionName, 'disputed');
|
|
109
|
+
}
|
|
110
|
+
else if (updatedTask.status === 'skipped' && options.runnerId) {
|
|
111
|
+
(0, activity_log_js_1.logActivity)(projectPath, options.runnerId, task.id, task.title, sectionName, 'skipped');
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// Push changes after batch review if any tasks were approved
|
|
115
|
+
const approvedTasks = tasksInReview.filter(t => {
|
|
116
|
+
const updated = (0, queries_js_1.getTask)(db, t.id);
|
|
117
|
+
return updated?.status === 'completed';
|
|
118
|
+
});
|
|
119
|
+
if (approvedTasks.length > 0) {
|
|
120
|
+
try {
|
|
121
|
+
console.log('Pushing batch changes to git...');
|
|
122
|
+
(0, node_child_process_1.execSync)('git push', { cwd: projectPath, stdio: 'inherit' });
|
|
123
|
+
console.log(`Pushed ${approvedTasks.length} approved task(s)`);
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
console.warn('Failed to push:', error);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Notify completion for each task
|
|
131
|
+
for (const task of batch.tasks) {
|
|
132
|
+
options.onTaskComplete?.(task.id);
|
|
133
|
+
}
|
|
134
|
+
if (once) {
|
|
135
|
+
console.log('\n[--once] Stopping after one batch');
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
await sleep(1000);
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Select next task
|
|
143
|
+
const selected = (0, task_selector_js_1.selectNextTask)(db, sectionId);
|
|
144
|
+
if (!selected) {
|
|
145
|
+
console.log('');
|
|
146
|
+
console.log('╔════════════════════════════════════════════════════════════╗');
|
|
147
|
+
console.log('║ ALL TASKS COMPLETE ║');
|
|
148
|
+
console.log('╚════════════════════════════════════════════════════════════╝');
|
|
149
|
+
console.log('');
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
const { task, action } = selected;
|
|
153
|
+
console.log(`Task: ${task.title}`);
|
|
154
|
+
console.log(`Action: ${action}`);
|
|
155
|
+
console.log(`Status: ${task.status}`);
|
|
156
|
+
options.onTaskStart?.(task.id, action);
|
|
157
|
+
if (action === 'start') {
|
|
158
|
+
(0, task_selector_js_1.markTaskInProgress)(db, task.id);
|
|
159
|
+
await runCoderPhase(db, task, projectPath, 'start');
|
|
160
|
+
}
|
|
161
|
+
else if (action === 'resume') {
|
|
162
|
+
await runCoderPhase(db, task, projectPath, 'resume');
|
|
163
|
+
}
|
|
164
|
+
else if (action === 'review') {
|
|
165
|
+
await runReviewerPhase(db, task, projectPath, options.runnerId);
|
|
166
|
+
}
|
|
167
|
+
options.onTaskComplete?.(task.id);
|
|
168
|
+
if (once) {
|
|
169
|
+
console.log('\n[--once] Stopping after one iteration');
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
// Brief pause between iterations
|
|
173
|
+
await sleep(1000);
|
|
174
|
+
}
|
|
175
|
+
// Final status
|
|
176
|
+
const finalCounts = (0, task_selector_js_1.getTaskCounts)(db, sectionId);
|
|
177
|
+
console.log('\nFinal Status:');
|
|
178
|
+
console.log(` Completed: ${finalCounts.completed}`);
|
|
179
|
+
console.log(` Failed: ${finalCounts.failed}`);
|
|
180
|
+
console.log(` Disputed: ${finalCounts.disputed}`);
|
|
181
|
+
}
|
|
182
|
+
finally {
|
|
183
|
+
close();
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
async function runCoderPhase(db, task, projectPath, action) {
|
|
187
|
+
console.log('\n>>> Invoking CODER...\n');
|
|
188
|
+
const result = await (0, coder_js_1.invokeCoder)(task, projectPath, action);
|
|
189
|
+
if (result.timedOut) {
|
|
190
|
+
console.warn('Coder timed out. Will retry next iteration.');
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
const updatedTask = (0, queries_js_1.getTask)(db, task.id);
|
|
194
|
+
if (!updatedTask)
|
|
195
|
+
return;
|
|
196
|
+
if (updatedTask.status === 'review') {
|
|
197
|
+
console.log('\nCoder submitted for review. Ready for reviewer.');
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
console.log(`Task status unchanged (${updatedTask.status}). Will retry next iteration.`);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
async function runReviewerPhase(db, task, projectPath, runnerId) {
|
|
204
|
+
console.log('\n>>> Invoking REVIEWER...\n');
|
|
205
|
+
const result = await (0, reviewer_js_1.invokeReviewer)(task, projectPath);
|
|
206
|
+
if (result.timedOut) {
|
|
207
|
+
console.warn('Reviewer timed out. Will retry next iteration.');
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
const updatedTask = (0, queries_js_1.getTask)(db, task.id);
|
|
211
|
+
if (!updatedTask)
|
|
212
|
+
return;
|
|
213
|
+
// Get section name for activity logging
|
|
214
|
+
const section = task.section_id ? (0, queries_js_1.getSection)(db, task.section_id) : null;
|
|
215
|
+
const sectionName = section?.name ?? null;
|
|
216
|
+
// Check actual task status in database - don't trust parsed decision alone
|
|
217
|
+
// The reviewer might say "APPROVE" but the command could fail
|
|
218
|
+
if (updatedTask.status === 'completed') {
|
|
219
|
+
console.log('\n✓ Task APPROVED');
|
|
220
|
+
// Get the commit message and SHA before pushing
|
|
221
|
+
let commitMessage = null;
|
|
222
|
+
let commitSha = null;
|
|
223
|
+
try {
|
|
224
|
+
commitMessage = (0, node_child_process_1.execSync)('git log -1 --format=%B', {
|
|
225
|
+
cwd: projectPath,
|
|
226
|
+
encoding: 'utf-8',
|
|
227
|
+
}).trim();
|
|
228
|
+
commitSha = (0, node_child_process_1.execSync)('git rev-parse HEAD', {
|
|
229
|
+
cwd: projectPath,
|
|
230
|
+
encoding: 'utf-8',
|
|
231
|
+
}).trim();
|
|
232
|
+
}
|
|
233
|
+
catch (error) {
|
|
234
|
+
console.warn('Failed to get commit info:', error);
|
|
235
|
+
}
|
|
236
|
+
// Push changes
|
|
237
|
+
try {
|
|
238
|
+
console.log('Pushing to git...');
|
|
239
|
+
(0, node_child_process_1.execSync)('git push', { cwd: projectPath, stdio: 'inherit' });
|
|
240
|
+
console.log(`Pushed successfully (${commitSha})`);
|
|
241
|
+
}
|
|
242
|
+
catch (error) {
|
|
243
|
+
console.warn('Failed to push:', error);
|
|
244
|
+
}
|
|
245
|
+
// Log activity for completed task
|
|
246
|
+
if (runnerId) {
|
|
247
|
+
(0, activity_log_js_1.logActivity)(projectPath, runnerId, task.id, task.title, sectionName, 'completed', commitMessage, commitSha);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
else if (updatedTask.status === 'skipped') {
|
|
251
|
+
console.log('\n⊘ Task SKIPPED');
|
|
252
|
+
// Log activity for skipped task
|
|
253
|
+
if (runnerId) {
|
|
254
|
+
(0, activity_log_js_1.logActivity)(projectPath, runnerId, task.id, task.title, sectionName, 'skipped');
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
else if (result.decision === 'reject') {
|
|
258
|
+
console.log('\n✗ Task REJECTED');
|
|
259
|
+
console.log(`Rejection count: ${updatedTask.rejection_count}/15`);
|
|
260
|
+
if (result.notes) {
|
|
261
|
+
console.log(`Notes: ${result.notes}`);
|
|
262
|
+
}
|
|
263
|
+
// Check if task failed (exceeded 15 rejections)
|
|
264
|
+
if (updatedTask.status === 'failed' && runnerId) {
|
|
265
|
+
(0, activity_log_js_1.logActivity)(projectPath, runnerId, task.id, task.title, sectionName, 'failed');
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
console.log('Returning to coder for fixes.');
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
else if (result.decision === 'dispute') {
|
|
272
|
+
console.log('\n! Task DISPUTED');
|
|
273
|
+
if (result.notes) {
|
|
274
|
+
console.log(`Reason: ${result.notes}`);
|
|
275
|
+
}
|
|
276
|
+
// Log activity for disputed task
|
|
277
|
+
if (runnerId) {
|
|
278
|
+
(0, activity_log_js_1.logActivity)(projectPath, runnerId, task.id, task.title, sectionName, 'disputed');
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
console.log(`\nReviewer completed without clear decision. Status: ${updatedTask.status}`);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
//# sourceMappingURL=orchestrator-loop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator-loop.js","sourceRoot":"","sources":["../../src/runners/orchestrator-loop.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAsCH,kDAmNC;AAvPD,6DAAoE;AACpE,qDAAqD;AACrD,uDAA6D;AAC7D,uEAK0C;AAC1C,uDAAyE;AACzE,mDAAiD;AACjD,6DAAkF;AAElF,uDAAgD;AAChD,+CAAqD;AACrD,2DAA8C;AAE9C,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAaD;;;GAGG;AACI,KAAK,UAAU,mBAAmB,CAAC,OAAoB;IAC5D,MAAM,EAAE,WAAW,EAAE,IAAI,GAAG,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAErE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,IAAA,4BAAY,EAAC,WAAW,CAAC,CAAC;IAEhD,kCAAkC;IAClC,MAAM,MAAM,GAAG,IAAA,yBAAS,EAAC,WAAW,CAAC,CAAC;IACtC,MAAM,eAAe,GAAG,IAAA,sBAAW,EAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAChD,IAAI,eAAe,CAAC,OAAO,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,WAAW,eAAe,CAAC,UAAU,CAAC,MAAM,kBAAkB,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrH,CAAC;SAAM,IAAI,eAAe,CAAC,KAAK,EAAE,CAAC;QACjC,OAAO,CAAC,KAAK,CAAC,oBAAoB,eAAe,CAAC,KAAK,EAAE,CAAC,CAAC;QAC3D,KAAK,EAAE,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,8BAA8B,eAAe,CAAC,KAAK,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,yBAAyB;IACzB,MAAM,MAAM,GAAG,IAAA,sBAAU,EAAC,WAAW,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,EAAE,SAAS,IAAI,KAAK,CAAC;IACtD,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,EAAE,YAAY,IAAI,EAAE,CAAC;IAEzD,IAAI,CAAC;QACH,IAAI,SAAS,GAAG,CAAC,CAAC;QAElB,OAAO,IAAI,EAAE,CAAC;YACZ,0BAA0B;YAC1B,IAAI,UAAU,EAAE,EAAE,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;gBACxC,MAAM;YACR,CAAC;YAED,qCAAqC;YACrC,MAAM,iBAAiB,GAAG,IAAA,kCAAoB,EAAC,WAAW,CAAC,CAAC;YAC5D,IAAI,iBAAiB,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;gBACpD,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;gBAC3D,MAAM;YACR,CAAC;YAED,SAAS,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,mBAAmB,SAAS,QAAQ,CAAC,CAAC;YAClD,OAAO,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC;YAEjC,qDAAqD;YACrD,gFAAgF;YAChF,IAAI,SAAS,IAAI,CAAC,SAAS,EAAE,CAAC;gBAC5B,MAAM,KAAK,GAAG,IAAA,kCAAe,EAAC,EAAE,EAAE,YAAY,CAAC,CAAC;gBAChD,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACpC,OAAO,CAAC,GAAG,CAAC,yBAAyB,KAAK,CAAC,WAAW,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;oBAEzF,gCAAgC;oBAChC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;wBAC/B,IAAA,qCAAkB,EAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;wBAChC,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;oBAC1C,CAAC;oBAED,qBAAqB;oBACrB,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;oBAC/C,MAAM,IAAA,2BAAgB,EAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;oBAEpE,6CAA6C;oBAC7C,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK;yBAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAA,oBAAO,EAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;yBAC3B,MAAM,CAAC,CAAC,CAAC,EAA8B,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC;oBAElF,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC7B,OAAO,CAAC,GAAG,CAAC,kBAAkB,aAAa,CAAC,MAAM,iCAAiC,CAAC,CAAC;wBAErF,wBAAwB;wBACxB,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;wBAClD,MAAM,IAAA,iCAAmB,EAAC,aAAa,EAAE,KAAK,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;wBAEzE,wCAAwC;wBACxC,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;4BACjC,MAAM,WAAW,GAAG,IAAA,oBAAO,EAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;4BACzC,IAAI,CAAC,WAAW;gCAAE,SAAS;4BAE3B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAA,uBAAU,EAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;4BACzE,MAAM,WAAW,GAAG,OAAO,EAAE,IAAI,IAAI,IAAI,CAAC;4BAE1C,IAAI,WAAW,CAAC,MAAM,KAAK,WAAW,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gCAC3D,sCAAsC;gCACtC,IAAI,aAAa,GAAkB,IAAI,CAAC;gCACxC,IAAI,CAAC;oCACH,aAAa,GAAG,IAAA,6BAAQ,EAAC,wBAAwB,EAAE;wCACjD,GAAG,EAAE,WAAW;wCAChB,QAAQ,EAAE,OAAO;qCAClB,CAAC,CAAC,IAAI,EAAE,CAAC;gCACZ,CAAC;gCAAC,MAAM,CAAC;oCACP,eAAe;gCACjB,CAAC;gCAED,IAAA,6BAAW,EACT,WAAW,EACX,OAAO,CAAC,QAAQ,EAChB,IAAI,CAAC,EAAE,EACP,IAAI,CAAC,KAAK,EACV,WAAW,EACX,WAAW,EACX,aAAa,CACd,CAAC;4BACJ,CAAC;iCAAM,IAAI,WAAW,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gCAC/D,IAAA,6BAAW,EACT,WAAW,EACX,OAAO,CAAC,QAAQ,EAChB,IAAI,CAAC,EAAE,EACP,IAAI,CAAC,KAAK,EACV,WAAW,EACX,QAAQ,CACT,CAAC;4BACJ,CAAC;iCAAM,IAAI,WAAW,CAAC,MAAM,KAAK,UAAU,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gCACjE,IAAA,6BAAW,EACT,WAAW,EACX,OAAO,CAAC,QAAQ,EAChB,IAAI,CAAC,EAAE,EACP,IAAI,CAAC,KAAK,EACV,WAAW,EACX,UAAU,CACX,CAAC;4BACJ,CAAC;iCAAM,IAAI,WAAW,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gCAChE,IAAA,6BAAW,EACT,WAAW,EACX,OAAO,CAAC,QAAQ,EAChB,IAAI,CAAC,EAAE,EACP,IAAI,CAAC,KAAK,EACV,WAAW,EACX,SAAS,CACV,CAAC;4BACJ,CAAC;wBACH,CAAC;wBAED,6DAA6D;wBAC7D,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;4BAC7C,MAAM,OAAO,GAAG,IAAA,oBAAO,EAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;4BAClC,OAAO,OAAO,EAAE,MAAM,KAAK,WAAW,CAAC;wBACzC,CAAC,CAAC,CAAC;wBAEH,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BAC7B,IAAI,CAAC;gCACH,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;gCAC/C,IAAA,6BAAQ,EAAC,UAAU,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;gCAC7D,OAAO,CAAC,GAAG,CAAC,UAAU,aAAa,CAAC,MAAM,mBAAmB,CAAC,CAAC;4BACjE,CAAC;4BAAC,OAAO,KAAK,EAAE,CAAC;gCACf,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;4BACzC,CAAC;wBACH,CAAC;oBACH,CAAC;oBAED,kCAAkC;oBAClC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;wBAC/B,OAAO,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACpC,CAAC;oBAED,IAAI,IAAI,EAAE,CAAC;wBACT,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;wBACnD,MAAM;oBACR,CAAC;oBAED,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;oBAClB,SAAS;gBACX,CAAC;YACH,CAAC;YAED,mBAAmB;YACnB,MAAM,QAAQ,GAAG,IAAA,iCAAc,EAAC,EAAE,EAAE,SAAS,CAAC,CAAC;YAE/C,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;gBAC9E,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;gBACjF,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;gBAC9E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,MAAM;YACR,CAAC;YAED,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;YAElC,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,EAAE,CAAC,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YAEtC,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YAEvC,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;gBACvB,IAAA,qCAAkB,EAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;gBAChC,MAAM,aAAa,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;YACtD,CAAC;iBAAM,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC/B,MAAM,aAAa,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;YACvD,CAAC;iBAAM,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC/B,MAAM,gBAAgB,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;YAClE,CAAC;YAED,OAAO,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAElC,IAAI,IAAI,EAAE,CAAC;gBACT,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;gBACvD,MAAM;YACR,CAAC;YAED,iCAAiC;YACjC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;QAED,eAAe;QACf,MAAM,WAAW,GAAG,IAAA,gCAAa,EAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,gBAAgB,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,gBAAgB,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,gBAAgB,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;IACtD,CAAC;YAAS,CAAC;QACT,KAAK,EAAE,CAAC;IACV,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,EAAyC,EACzC,IAA6C,EAC7C,WAAmB,EACnB,MAA0B;IAE1B,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IAEzC,MAAM,MAAM,GAAG,MAAM,IAAA,sBAAW,EAAC,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IAE5D,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAC5D,OAAO;IACT,CAAC;IAED,MAAM,WAAW,GAAG,IAAA,oBAAO,EAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACzC,IAAI,CAAC,WAAW;QAAE,OAAO;IAEzB,IAAI,WAAW,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;IACnE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,0BAA0B,WAAW,CAAC,MAAM,+BAA+B,CAAC,CAAC;IAC3F,CAAC;AACH,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,EAAyC,EACzC,IAA6C,EAC7C,WAAmB,EACnB,QAAiB;IAEjB,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAE5C,MAAM,MAAM,GAAG,MAAM,IAAA,4BAAc,EAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAEvD,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;QAC/D,OAAO;IACT,CAAC;IAED,MAAM,WAAW,GAAG,IAAA,oBAAO,EAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACzC,IAAI,CAAC,WAAW;QAAE,OAAO;IAEzB,wCAAwC;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAA,uBAAU,EAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACzE,MAAM,WAAW,GAAG,OAAO,EAAE,IAAI,IAAI,IAAI,CAAC;IAE1C,2EAA2E;IAC3E,8DAA8D;IAC9D,IAAI,WAAW,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QAEjC,gDAAgD;QAChD,IAAI,aAAa,GAAkB,IAAI,CAAC;QACxC,IAAI,SAAS,GAAkB,IAAI,CAAC;QACpC,IAAI,CAAC;YACH,aAAa,GAAG,IAAA,6BAAQ,EAAC,wBAAwB,EAAE;gBACjD,GAAG,EAAE,WAAW;gBAChB,QAAQ,EAAE,OAAO;aAClB,CAAC,CAAC,IAAI,EAAE,CAAC;YACV,SAAS,GAAG,IAAA,6BAAQ,EAAC,oBAAoB,EAAE;gBACzC,GAAG,EAAE,WAAW;gBAChB,QAAQ,EAAE,OAAO;aAClB,CAAC,CAAC,IAAI,EAAE,CAAC;QACZ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;QACpD,CAAC;QAED,eAAe;QACf,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACjC,IAAA,6BAAQ,EAAC,UAAU,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,wBAAwB,SAAS,GAAG,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;QACzC,CAAC;QAED,kCAAkC;QAClC,IAAI,QAAQ,EAAE,CAAC;YACb,IAAA,6BAAW,EACT,WAAW,EACX,QAAQ,EACR,IAAI,CAAC,EAAE,EACP,IAAI,CAAC,KAAK,EACV,WAAW,EACX,WAAW,EACX,aAAa,EACb,SAAS,CACV,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,IAAI,WAAW,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAEhC,gCAAgC;QAChC,IAAI,QAAQ,EAAE,CAAC;YACb,IAAA,6BAAW,EACT,WAAW,EACX,QAAQ,EACR,IAAI,CAAC,EAAE,EACP,IAAI,CAAC,KAAK,EACV,WAAW,EACX,SAAS,CACV,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,oBAAoB,WAAW,CAAC,eAAe,KAAK,CAAC,CAAC;QAClE,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACxC,CAAC;QAED,gDAAgD;QAChD,IAAI,WAAW,CAAC,MAAM,KAAK,QAAQ,IAAI,QAAQ,EAAE,CAAC;YAChD,IAAA,6BAAW,EACT,WAAW,EACX,QAAQ,EACR,IAAI,CAAC,EAAE,EACP,IAAI,CAAC,KAAK,EACV,WAAW,EACX,QAAQ,CACT,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;SAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACjC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACzC,CAAC;QAED,iCAAiC;QACjC,IAAI,QAAQ,EAAE,CAAC;YACb,IAAA,6BAAW,EACT,WAAW,EACX,QAAQ,EACR,IAAI,CAAC,EAAE,EACP,IAAI,CAAC,KAAK,EACV,WAAW,EACX,UAAU,CACX,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,wDAAwD,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5F,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global project registry management
|
|
3
|
+
* Tracks all registered steroids projects across the system
|
|
4
|
+
*/
|
|
5
|
+
export interface RegisteredProject {
|
|
6
|
+
path: string;
|
|
7
|
+
name: string | null;
|
|
8
|
+
registered_at: string;
|
|
9
|
+
last_seen_at: string;
|
|
10
|
+
enabled: boolean;
|
|
11
|
+
pending_count?: number;
|
|
12
|
+
in_progress_count?: number;
|
|
13
|
+
review_count?: number;
|
|
14
|
+
completed_count?: number;
|
|
15
|
+
stats_updated_at?: string | null;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Register a project in the global registry
|
|
19
|
+
* Idempotent - updates last_seen_at if project already exists
|
|
20
|
+
*
|
|
21
|
+
* @param path - Absolute path to project directory
|
|
22
|
+
* @param name - Optional project name
|
|
23
|
+
*/
|
|
24
|
+
export declare function registerProject(path: string, name?: string): void;
|
|
25
|
+
/**
|
|
26
|
+
* Get all registered projects (enabled only by default)
|
|
27
|
+
*
|
|
28
|
+
* @param includeDisabled - If true, includes disabled projects
|
|
29
|
+
* @returns Array of registered projects
|
|
30
|
+
*/
|
|
31
|
+
export declare function getRegisteredProjects(includeDisabled?: boolean): RegisteredProject[];
|
|
32
|
+
/**
|
|
33
|
+
* Get a single registered project by path
|
|
34
|
+
*
|
|
35
|
+
* @param path - Project path to look up
|
|
36
|
+
* @returns Project if found, null otherwise
|
|
37
|
+
*/
|
|
38
|
+
export declare function getRegisteredProject(path: string): RegisteredProject | null;
|
|
39
|
+
/**
|
|
40
|
+
* Unregister a project from the global registry
|
|
41
|
+
* Removes it completely from the database
|
|
42
|
+
*
|
|
43
|
+
* @param path - Project path to unregister
|
|
44
|
+
*/
|
|
45
|
+
export declare function unregisterProject(path: string): void;
|
|
46
|
+
/**
|
|
47
|
+
* Disable a project (skip in wakeup, but keep in registry)
|
|
48
|
+
*
|
|
49
|
+
* @param path - Project path to disable
|
|
50
|
+
*/
|
|
51
|
+
export declare function disableProject(path: string): void;
|
|
52
|
+
/**
|
|
53
|
+
* Enable a project (include in wakeup)
|
|
54
|
+
*
|
|
55
|
+
* @param path - Project path to enable
|
|
56
|
+
*/
|
|
57
|
+
export declare function enableProject(path: string): void;
|
|
58
|
+
/**
|
|
59
|
+
* Remove projects that no longer exist on disk
|
|
60
|
+
* Returns the number of projects removed
|
|
61
|
+
*
|
|
62
|
+
* @returns Number of projects pruned
|
|
63
|
+
*/
|
|
64
|
+
export declare function pruneProjects(): number;
|
|
65
|
+
/**
|
|
66
|
+
* Update last_seen_at timestamp for a project
|
|
67
|
+
* Used by runners to track when project was last active
|
|
68
|
+
*
|
|
69
|
+
* @param path - Project path to update
|
|
70
|
+
*/
|
|
71
|
+
export declare function updateProjectLastSeen(path: string): void;
|
|
72
|
+
/**
|
|
73
|
+
* Check if a project is registered
|
|
74
|
+
*
|
|
75
|
+
* @param path - Project path to check
|
|
76
|
+
* @returns True if project is registered
|
|
77
|
+
*/
|
|
78
|
+
export declare function isProjectRegistered(path: string): boolean;
|
|
79
|
+
/**
|
|
80
|
+
* Task count statistics for a project
|
|
81
|
+
*/
|
|
82
|
+
export interface ProjectStats {
|
|
83
|
+
pending: number;
|
|
84
|
+
in_progress: number;
|
|
85
|
+
review: number;
|
|
86
|
+
completed: number;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Update project stats in global database
|
|
90
|
+
* Called by runner heartbeat to cache stats for API/WebUI access
|
|
91
|
+
*
|
|
92
|
+
* @param path - Project path
|
|
93
|
+
* @param stats - Task counts by status
|
|
94
|
+
*/
|
|
95
|
+
export declare function updateProjectStats(path: string, stats: ProjectStats): void;
|
|
96
|
+
//# sourceMappingURL=projects.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/runners/projects.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAmBD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAejE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,eAAe,UAAQ,GAAG,iBAAiB,EAAE,CAoClF;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAuC3E;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CASpD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CASjD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAShD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAsBtC;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAWxD;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAazD;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAuB1E"}
|