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.
- package/dist/commands/llm-content.d.ts +1 -1
- package/dist/commands/llm-content.d.ts.map +1 -1
- package/dist/commands/llm-content.js +66 -12
- package/dist/commands/llm-content.js.map +1 -1
- package/dist/commands/project-reset.d.ts +3 -0
- package/dist/commands/project-reset.d.ts.map +1 -0
- package/dist/commands/project-reset.js +151 -0
- package/dist/commands/project-reset.js.map +1 -0
- package/dist/commands/tasks-deps.d.ts +10 -0
- package/dist/commands/tasks-deps.d.ts.map +1 -0
- package/dist/commands/tasks-deps.js +179 -0
- package/dist/commands/tasks-deps.js.map +1 -0
- package/dist/commands/tasks-reset.d.ts.map +1 -1
- package/dist/commands/tasks-reset.js +40 -2
- package/dist/commands/tasks-reset.js.map +1 -1
- package/dist/commands/tasks.d.ts.map +1 -1
- package/dist/commands/tasks.js +57 -3
- package/dist/commands/tasks.js.map +1 -1
- package/dist/database/queries.d.ts +55 -0
- package/dist/database/queries.d.ts.map +1 -1
- package/dist/database/queries.js +172 -9
- package/dist/database/queries.js.map +1 -1
- package/dist/git/submission-resolution.d.ts +5 -0
- package/dist/git/submission-resolution.d.ts.map +1 -1
- package/dist/git/submission-resolution.js +45 -1
- package/dist/git/submission-resolution.js.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/orchestrator/task-selector.d.ts.map +1 -1
- package/dist/orchestrator/task-selector.js +11 -7
- package/dist/orchestrator/task-selector.js.map +1 -1
- package/dist/runners/orchestrator-loop.d.ts.map +1 -1
- package/dist/runners/orchestrator-loop.js +17 -1
- package/dist/runners/orchestrator-loop.js.map +1 -1
- package/dist/runners/wakeup-global-cleanup.d.ts.map +1 -1
- package/dist/runners/wakeup-global-cleanup.js +26 -6
- package/dist/runners/wakeup-global-cleanup.js.map +1 -1
- package/dist/workspace/git-lifecycle.d.ts +11 -0
- package/dist/workspace/git-lifecycle.d.ts.map +1 -1
- package/dist/workspace/git-lifecycle.js +47 -0
- package/dist/workspace/git-lifecycle.js.map +1 -1
- package/dist/workspace/merge-pipeline.d.ts.map +1 -1
- package/dist/workspace/merge-pipeline.js +14 -4
- package/dist/workspace/merge-pipeline.js.map +1 -1
- package/dist/workspace/remote-branch-cleanup.d.ts +9 -0
- package/dist/workspace/remote-branch-cleanup.d.ts.map +1 -0
- package/dist/workspace/remote-branch-cleanup.js +120 -0
- package/dist/workspace/remote-branch-cleanup.js.map +1 -0
- package/migrations/027_add_task_dependencies.sql +13 -0
- package/migrations/manifest.json +9 -1
- 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
|
-
//
|
|
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
|
|
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;;
|
|
1
|
+
{"version":3,"file":"merge-pipeline.js","sourceRoot":"","sources":["../../src/workspace/merge-pipeline.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AA2BH,gDA4FC;AAlHD,yDAA8D;AAC9D,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,8GAA8G;IAC9G,IAAI,WAAW,CAAC,cAAc,EAAE,CAAC;QAC/B,IAAA,qBAAW,EAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvC,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,kEAAkE;QAClE,mEAAmE;QACnE,qEAAqE;QACrE,2DAA2D;QAC3D,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;QACtB,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACvC,IAAA,2CAAwB,EAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAC7D,CAAC;QACD,IAAA,qBAAW,EAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEvC,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,6DAA6D;IAC7D,IAAA,qBAAW,EAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvC,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"}
|
|
@@ -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;
|
package/migrations/manifest.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": "0.2.3",
|
|
3
|
-
"latestDbVersion":
|
|
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
|
}
|