steroids-cli 0.12.8 → 0.12.10

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.
Files changed (51) hide show
  1. package/dist/commands/llm-content.d.ts +1 -1
  2. package/dist/commands/llm-content.d.ts.map +1 -1
  3. package/dist/commands/llm-content.js +66 -12
  4. package/dist/commands/llm-content.js.map +1 -1
  5. package/dist/commands/project-reset.d.ts +3 -0
  6. package/dist/commands/project-reset.d.ts.map +1 -0
  7. package/dist/commands/project-reset.js +151 -0
  8. package/dist/commands/project-reset.js.map +1 -0
  9. package/dist/commands/tasks-deps.d.ts +10 -0
  10. package/dist/commands/tasks-deps.d.ts.map +1 -0
  11. package/dist/commands/tasks-deps.js +179 -0
  12. package/dist/commands/tasks-deps.js.map +1 -0
  13. package/dist/commands/tasks-reset.d.ts.map +1 -1
  14. package/dist/commands/tasks-reset.js +40 -2
  15. package/dist/commands/tasks-reset.js.map +1 -1
  16. package/dist/commands/tasks.d.ts.map +1 -1
  17. package/dist/commands/tasks.js +57 -3
  18. package/dist/commands/tasks.js.map +1 -1
  19. package/dist/database/queries.d.ts +55 -0
  20. package/dist/database/queries.d.ts.map +1 -1
  21. package/dist/database/queries.js +172 -9
  22. package/dist/database/queries.js.map +1 -1
  23. package/dist/git/submission-resolution.d.ts +5 -0
  24. package/dist/git/submission-resolution.d.ts.map +1 -1
  25. package/dist/git/submission-resolution.js +45 -1
  26. package/dist/git/submission-resolution.js.map +1 -1
  27. package/dist/index.js +5 -0
  28. package/dist/index.js.map +1 -1
  29. package/dist/orchestrator/task-selector.d.ts.map +1 -1
  30. package/dist/orchestrator/task-selector.js +11 -7
  31. package/dist/orchestrator/task-selector.js.map +1 -1
  32. package/dist/runners/orchestrator-loop.d.ts.map +1 -1
  33. package/dist/runners/orchestrator-loop.js +17 -1
  34. package/dist/runners/orchestrator-loop.js.map +1 -1
  35. package/dist/runners/wakeup-global-cleanup.d.ts.map +1 -1
  36. package/dist/runners/wakeup-global-cleanup.js +26 -6
  37. package/dist/runners/wakeup-global-cleanup.js.map +1 -1
  38. package/dist/workspace/git-lifecycle.d.ts +11 -0
  39. package/dist/workspace/git-lifecycle.d.ts.map +1 -1
  40. package/dist/workspace/git-lifecycle.js +47 -0
  41. package/dist/workspace/git-lifecycle.js.map +1 -1
  42. package/dist/workspace/merge-pipeline.d.ts.map +1 -1
  43. package/dist/workspace/merge-pipeline.js +14 -4
  44. package/dist/workspace/merge-pipeline.js.map +1 -1
  45. package/dist/workspace/remote-branch-cleanup.d.ts +9 -0
  46. package/dist/workspace/remote-branch-cleanup.d.ts.map +1 -0
  47. package/dist/workspace/remote-branch-cleanup.js +120 -0
  48. package/dist/workspace/remote-branch-cleanup.js.map +1 -0
  49. package/migrations/027_add_task_dependencies.sql +13 -0
  50. package/migrations/manifest.json +9 -1
  51. package/package.json +1 -1
@@ -6,6 +6,7 @@
6
6
  */
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
8
  exports.handleMergeFailure = handleMergeFailure;
9
+ const git_lifecycle_js_1 = require("./git-lifecycle.js");
9
10
  const queries_js_1 = require("../database/queries.js");
10
11
  const pool_js_1 = require("./pool.js");
11
12
  const MAX_CONFLICT_COUNT = 3;
@@ -15,10 +16,9 @@ const MAX_MERGE_FAILURE_COUNT = 3;
15
16
  * release slot, return task to pending or block.
16
17
  */
17
18
  function handleMergeFailure(projectDb, ctx, taskId, mergeResult) {
18
- // Release the pool slot back to idle
19
- (0, pool_js_1.releaseSlot)(ctx.globalDb, ctx.slot.id);
20
- // Infrastructure failure (e.g. missing remote base branch) — block immediately
19
+ // Infrastructure failure (e.g. missing remote base branch) — block immediately, PRESERVE branch for diagnosis
21
20
  if (mergeResult.infrastructure) {
21
+ (0, pool_js_1.releaseSlot)(ctx.globalDb, ctx.slot.id);
22
22
  (0, queries_js_1.setTaskBlocked)(projectDb, taskId, 'blocked_error', `Infrastructure failure: ${mergeResult.reason}`);
23
23
  return {
24
24
  taskBlocked: true,
@@ -27,6 +27,15 @@ function handleMergeFailure(projectDb, ctx, taskId, mergeResult) {
27
27
  };
28
28
  }
29
29
  if (mergeResult.conflict) {
30
+ // ---- ORDERING CONSTRAINT: delete branch BEFORE releaseSlot ----
31
+ // releaseSlot clears task_branch in DB; we read from the in-memory
32
+ // ctx.slot which still has the value. Once the slot is idle, another
33
+ // runner could claim it, so the branch must be gone first.
34
+ const slot = ctx.slot;
35
+ if (slot.task_branch && slot.slot_path) {
36
+ (0, git_lifecycle_js_1.deleteTaskBranchFromSlot)(slot.slot_path, slot.task_branch);
37
+ }
38
+ (0, pool_js_1.releaseSlot)(ctx.globalDb, ctx.slot.id);
30
39
  // Rebase conflict path
31
40
  const conflictCount = (0, queries_js_1.incrementTaskConflictCount)(projectDb, taskId);
32
41
  if (conflictCount >= MAX_CONFLICT_COUNT) {
@@ -44,7 +53,8 @@ function handleMergeFailure(projectDb, ctx, taskId, mergeResult) {
44
53
  reason: `Rebase conflict (attempt ${conflictCount}/${MAX_CONFLICT_COUNT})`,
45
54
  };
46
55
  }
47
- // General merge failure (push failure, ff-only failure, etc.)
56
+ // General merge failure PRESERVE branch, only release slot
57
+ (0, pool_js_1.releaseSlot)(ctx.globalDb, ctx.slot.id);
48
58
  const mergeFailureCount = (0, queries_js_1.incrementMergeFailureCount)(projectDb, taskId);
49
59
  if (mergeFailureCount >= MAX_MERGE_FAILURE_COUNT) {
50
60
  (0, queries_js_1.setTaskBlocked)(projectDb, taskId, 'blocked_error', `Merge pipeline failed ${mergeFailureCount} times: ${mergeResult.reason}`);
@@ -1 +1 @@
1
- {"version":3,"file":"merge-pipeline.js","sourceRoot":"","sources":["../../src/workspace/merge-pipeline.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AA0BH,gDAmFC;AAxGD,uDAKgC;AAChC,uCAAwC;AAExC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAC7B,MAAM,uBAAuB,GAAG,CAAC,CAAC;AAQlC;;;GAGG;AACH,SAAgB,kBAAkB,CAChC,SAA4B,EAC5B,GAAoB,EACpB,MAAc,EACd,WAAwC;IAExC,qCAAqC;IACrC,IAAA,qBAAW,EAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEvC,+EAA+E;IAC/E,IAAI,WAAW,CAAC,cAAc,EAAE,CAAC;QAC/B,IAAA,2BAAc,EACZ,SAAS,EACT,MAAM,EACN,eAAe,EACf,2BAA2B,WAAW,CAAC,MAAM,EAAE,CAChD,CAAC;QACF,OAAO;YACL,WAAW,EAAE,IAAI;YACjB,WAAW,EAAE,eAAe;YAC5B,MAAM,EAAE,YAAY,WAAW,CAAC,MAAM,EAAE;SACzC,CAAC;IACJ,CAAC;IAED,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC;QACzB,uBAAuB;QACvB,MAAM,aAAa,GAAG,IAAA,uCAA0B,EAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAEpE,IAAI,aAAa,IAAI,kBAAkB,EAAE,CAAC;YACxC,IAAA,2BAAc,EACZ,SAAS,EACT,MAAM,EACN,kBAAkB,EAClB,sBAAsB,aAAa,0BAA0B,WAAW,CAAC,MAAM,EAAE,CAClF,CAAC;YACF,OAAO;gBACL,WAAW,EAAE,IAAI;gBACjB,WAAW,EAAE,kBAAkB;gBAC/B,MAAM,EAAE,iBAAiB,aAAa,mBAAmB;aAC1D,CAAC;QACJ,CAAC;QAED,mCAAmC;QACnC,IAAA,gCAAmB,EACjB,SAAS,EACT,MAAM,EACN,cAAc,EACd,4BAA4B,aAAa,IAAI,kBAAkB,MAAM,WAAW,CAAC,MAAM,EAAE,CAC1F,CAAC;QACF,OAAO;YACL,WAAW,EAAE,KAAK;YAClB,MAAM,EAAE,4BAA4B,aAAa,IAAI,kBAAkB,GAAG;SAC3E,CAAC;IACJ,CAAC;IAED,8DAA8D;IAC9D,MAAM,iBAAiB,GAAG,IAAA,uCAA0B,EAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAExE,IAAI,iBAAiB,IAAI,uBAAuB,EAAE,CAAC;QACjD,IAAA,2BAAc,EACZ,SAAS,EACT,MAAM,EACN,eAAe,EACf,yBAAyB,iBAAiB,WAAW,WAAW,CAAC,MAAM,EAAE,CAC1E,CAAC;QACF,OAAO;YACL,WAAW,EAAE,IAAI;YACjB,WAAW,EAAE,eAAe;YAC5B,MAAM,EAAE,iBAAiB,iBAAiB,iBAAiB;SAC5D,CAAC;IACJ,CAAC;IAED,mCAAmC;IACnC,IAAA,gCAAmB,EACjB,SAAS,EACT,MAAM,EACN,cAAc,EACd,0BAA0B,iBAAiB,IAAI,uBAAuB,MAAM,WAAW,CAAC,MAAM,EAAE,CACjG,CAAC;IACF,OAAO;QACL,WAAW,EAAE,KAAK;QAClB,MAAM,EAAE,0BAA0B,iBAAiB,IAAI,uBAAuB,GAAG;KAClF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"merge-pipeline.js","sourceRoot":"","sources":["../../src/workspace/merge-pipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { WakeupLogger } from '../runners/wakeup-types.js';
2
+ export interface StaleRemoteBranch {
3
+ branchName: string;
4
+ taskId: string;
5
+ reason: 'merged_completed' | 'terminal_not_completed';
6
+ }
7
+ export declare function identifyStaleBranches(projectPath: string): StaleRemoteBranch[];
8
+ export declare function cleanupStaleRemoteTaskBranches(dryRun: boolean, log: WakeupLogger): number;
9
+ //# sourceMappingURL=remote-branch-cleanup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-branch-cleanup.d.ts","sourceRoot":"","sources":["../../src/workspace/remote-branch-cleanup.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAgB/D,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,kBAAkB,GAAG,wBAAwB,CAAC;CACvD;AAuCD,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAuD9E;AAED,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,GAAG,MAAM,CA+BzF"}
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.identifyStaleBranches = identifyStaleBranches;
4
+ exports.cleanupStaleRemoteTaskBranches = cleanupStaleRemoteTaskBranches;
5
+ const node_fs_1 = require("node:fs");
6
+ const loader_js_1 = require("../config/loader.js");
7
+ const queries_js_1 = require("../database/queries.js");
8
+ const connection_js_1 = require("../database/connection.js");
9
+ const projects_js_1 = require("../runners/projects.js");
10
+ const pool_js_1 = require("./pool.js");
11
+ const git_helpers_js_1 = require("./git-helpers.js");
12
+ const TASK_BRANCH_PREFIX = 'steroids/task-';
13
+ const REMOTE_NAME = 'origin';
14
+ const TERMINAL_TASK_STATUSES = new Set([
15
+ 'completed',
16
+ 'disputed',
17
+ 'failed',
18
+ 'skipped',
19
+ 'partial',
20
+ 'blocked_error',
21
+ 'blocked_conflict',
22
+ ]);
23
+ function listRemoteTaskBranches(projectPath) {
24
+ const output = (0, git_helpers_js_1.execGit)(projectPath, ['ls-remote', '--heads', REMOTE_NAME, `refs/heads/${TASK_BRANCH_PREFIX}*`], { tolerateFailure: true, timeoutMs: 30_000 });
25
+ if (!output) {
26
+ return [];
27
+ }
28
+ return output
29
+ .split('\n')
30
+ .map((line) => line.trim().split(/\s+/))
31
+ .map(([sha, ref]) => ({ sha: sha ?? '', ref: ref ?? '' }))
32
+ .filter(({ sha, ref }) => sha.length > 0 && ref.startsWith('refs/heads/'))
33
+ .map(({ sha, ref }) => ({
34
+ sha,
35
+ branchName: ref.slice('refs/heads/'.length),
36
+ }))
37
+ .filter(({ branchName }) => branchName.startsWith(TASK_BRANCH_PREFIX));
38
+ }
39
+ function getTaskIdFromBranch(branchName) {
40
+ if (!branchName.startsWith(TASK_BRANCH_PREFIX)) {
41
+ return null;
42
+ }
43
+ const taskId = branchName.slice(TASK_BRANCH_PREFIX.length).trim();
44
+ return taskId.length > 0 ? taskId : null;
45
+ }
46
+ function identifyStaleBranches(projectPath) {
47
+ if (!(0, node_fs_1.existsSync)(projectPath) || !(0, pool_js_1.resolveRemoteUrl)(projectPath)) {
48
+ return [];
49
+ }
50
+ const branches = listRemoteTaskBranches(projectPath);
51
+ if (branches.length === 0) {
52
+ return [];
53
+ }
54
+ const config = (0, loader_js_1.loadConfig)(projectPath);
55
+ const baseBranch = (0, git_helpers_js_1.resolveBaseBranch)(projectPath, REMOTE_NAME, config.git?.branch ?? null);
56
+ (0, git_helpers_js_1.execGit)(projectPath, ['fetch', REMOTE_NAME, baseBranch], {
57
+ tolerateFailure: true,
58
+ timeoutMs: 120_000,
59
+ });
60
+ const { db, close } = (0, connection_js_1.openDatabase)(projectPath);
61
+ try {
62
+ const staleBranches = [];
63
+ for (const branch of branches) {
64
+ const taskId = getTaskIdFromBranch(branch.branchName);
65
+ if (!taskId)
66
+ continue;
67
+ const task = (0, queries_js_1.getTask)(db, taskId);
68
+ if (!task || !TERMINAL_TASK_STATUSES.has(task.status)) {
69
+ continue;
70
+ }
71
+ const remoteBaseRef = `${REMOTE_NAME}/${baseBranch}`;
72
+ if (!(0, git_helpers_js_1.isAncestor)(projectPath, branch.sha, remoteBaseRef)) {
73
+ continue;
74
+ }
75
+ if (task.status !== 'completed') {
76
+ staleBranches.push({
77
+ branchName: branch.branchName,
78
+ taskId,
79
+ reason: 'terminal_not_completed',
80
+ });
81
+ continue;
82
+ }
83
+ staleBranches.push({
84
+ branchName: branch.branchName,
85
+ taskId,
86
+ reason: 'merged_completed',
87
+ });
88
+ }
89
+ return staleBranches;
90
+ }
91
+ finally {
92
+ close();
93
+ }
94
+ }
95
+ function cleanupStaleRemoteTaskBranches(dryRun, log) {
96
+ let deleted = 0;
97
+ for (const project of (0, projects_js_1.getRegisteredProjects)(true)) {
98
+ let staleBranches = [];
99
+ try {
100
+ staleBranches = identifyStaleBranches(project.path);
101
+ }
102
+ catch {
103
+ continue;
104
+ }
105
+ for (const branch of staleBranches) {
106
+ if (!dryRun) {
107
+ const deletedRemote = (0, git_helpers_js_1.execGit)(project.path, ['push', REMOTE_NAME, '--delete', branch.branchName], { tolerateFailure: true, timeoutMs: 120_000 });
108
+ if (deletedRemote === null) {
109
+ continue;
110
+ }
111
+ }
112
+ deleted++;
113
+ }
114
+ }
115
+ if (deleted > 0) {
116
+ log(`Deleted ${deleted} stale remote task branch(es)`);
117
+ }
118
+ return deleted;
119
+ }
120
+ //# sourceMappingURL=remote-branch-cleanup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-branch-cleanup.js","sourceRoot":"","sources":["../../src/workspace/remote-branch-cleanup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ -- UP
2
+ CREATE TABLE IF NOT EXISTS task_dependencies (
3
+ id TEXT PRIMARY KEY,
4
+ task_id TEXT NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
5
+ depends_on_task_id TEXT NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
6
+ created_at TEXT DEFAULT (datetime('now')),
7
+ UNIQUE(task_id, depends_on_task_id)
8
+ );
9
+ CREATE INDEX IF NOT EXISTS idx_task_deps_task ON task_dependencies(task_id);
10
+ CREATE INDEX IF NOT EXISTS idx_task_deps_depends_on ON task_dependencies(depends_on_task_id);
11
+
12
+ -- DOWN
13
+ DROP TABLE IF EXISTS task_dependencies;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": "0.2.3",
3
- "latestDbVersion": 26,
3
+ "latestDbVersion": 27,
4
4
  "migrations": [
5
5
  {
6
6
  "id": 1,
@@ -209,6 +209,14 @@
209
209
  "description": "Add per-section coder provider/model overrides and PR label/draft fields",
210
210
  "checksum": "",
211
211
  "cliVersion": "0.12.7"
212
+ },
213
+ {
214
+ "id": 27,
215
+ "name": "027_add_task_dependencies",
216
+ "file": "027_add_task_dependencies.sql",
217
+ "description": "Add task_dependencies table for explicit task-level dependency tracking",
218
+ "checksum": "",
219
+ "cliVersion": "0.12.7"
212
220
  }
213
221
  ]
214
222
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "steroids-cli",
3
- "version": "0.12.8",
3
+ "version": "0.12.10",
4
4
  "description": "Automated task execution system with coder/reviewer loop",
5
5
  "main": "dist/index.js",
6
6
  "bin": {