night-orch 0.3.2 → 0.4.0
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 +47 -108
- package/dist/cli/commands/doctor.d.ts +1 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +18 -0
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/monitoring.d.ts.map +1 -1
- package/dist/cli/commands/monitoring.js +7 -3
- package/dist/cli/commands/monitoring.js.map +1 -1
- package/dist/cli/commands/settings.d.ts.map +1 -1
- package/dist/cli/commands/settings.js +40 -4
- package/dist/cli/commands/settings.js.map +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +26 -3
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/index.js +3 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/tui/app.d.ts.map +1 -1
- package/dist/cli/tui/app.js +52 -3
- package/dist/cli/tui/app.js.map +1 -1
- package/dist/cli/tui/header.d.ts.map +1 -1
- package/dist/cli/tui/header.js +2 -1
- package/dist/cli/tui/header.js.map +1 -1
- package/dist/cli/tui/settings-view.d.ts.map +1 -1
- package/dist/cli/tui/settings-view.js +22 -5
- package/dist/cli/tui/settings-view.js.map +1 -1
- package/dist/cli/tui/stats-view.js +2 -2
- package/dist/cli/tui/stats-view.js.map +1 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +141 -13
- package/dist/config/loader.js.map +1 -1
- package/dist/config/schema.d.ts +903 -21
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +77 -6
- package/dist/config/schema.js.map +1 -1
- package/dist/forge/types.d.ts +7 -0
- package/dist/forge/types.d.ts.map +1 -1
- package/dist/git/repo.d.ts +8 -0
- package/dist/git/repo.d.ts.map +1 -1
- package/dist/git/repo.js +19 -0
- package/dist/git/repo.js.map +1 -1
- package/dist/git/worktree.d.ts +3 -0
- package/dist/git/worktree.d.ts.map +1 -1
- package/dist/git/worktree.js +43 -21
- package/dist/git/worktree.js.map +1 -1
- package/dist/loop/cost.d.ts +33 -8
- package/dist/loop/cost.d.ts.map +1 -1
- package/dist/loop/cost.js +250 -46
- package/dist/loop/cost.js.map +1 -1
- package/dist/loop/decision.js +3 -3
- package/dist/loop/decision.js.map +1 -1
- package/dist/loop/engine.d.ts +1 -0
- package/dist/loop/engine.d.ts.map +1 -1
- package/dist/loop/engine.js +76 -13
- package/dist/loop/engine.js.map +1 -1
- package/dist/loop/parallel.d.ts.map +1 -1
- package/dist/loop/parallel.js +2 -0
- package/dist/loop/parallel.js.map +1 -1
- package/dist/loop/pricing.d.ts +11 -4
- package/dist/loop/pricing.d.ts.map +1 -1
- package/dist/loop/pricing.js +62 -20
- package/dist/loop/pricing.js.map +1 -1
- package/dist/loop/progress.d.ts +24 -0
- package/dist/loop/progress.d.ts.map +1 -0
- package/dist/loop/progress.js +52 -0
- package/dist/loop/progress.js.map +1 -0
- package/dist/loop/step-executor.d.ts +4 -5
- package/dist/loop/step-executor.d.ts.map +1 -1
- package/dist/loop/step-executor.js +1 -0
- package/dist/loop/step-executor.js.map +1 -1
- package/dist/loop/types.d.ts +17 -0
- package/dist/loop/types.d.ts.map +1 -1
- package/dist/mcp/tools/admin.d.ts +29 -0
- package/dist/mcp/tools/admin.d.ts.map +1 -0
- package/dist/mcp/tools/admin.js +89 -0
- package/dist/mcp/tools/admin.js.map +1 -0
- package/dist/mcp/tools/auth.d.ts +3 -0
- package/dist/mcp/tools/auth.d.ts.map +1 -0
- package/dist/mcp/tools/auth.js +19 -0
- package/dist/mcp/tools/auth.js.map +1 -0
- package/dist/mcp/tools/index.d.ts.map +1 -1
- package/dist/mcp/tools/index.js +5 -533
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/mcp/tools/operations.d.ts +32 -0
- package/dist/mcp/tools/operations.d.ts.map +1 -0
- package/dist/mcp/tools/operations.js +95 -0
- package/dist/mcp/tools/operations.js.map +1 -0
- package/dist/mcp/tools/settings.d.ts +12 -0
- package/dist/mcp/tools/settings.d.ts.map +1 -0
- package/dist/mcp/tools/settings.js +58 -0
- package/dist/mcp/tools/settings.js.map +1 -0
- package/dist/mcp/tools/status.d.ts +25 -0
- package/dist/mcp/tools/status.d.ts.map +1 -0
- package/dist/mcp/tools/status.js +307 -0
- package/dist/mcp/tools/status.js.map +1 -0
- package/dist/ops/continue.js +6 -1
- package/dist/ops/continue.js.map +1 -1
- package/dist/ops/project-check.d.ts +15 -0
- package/dist/ops/project-check.d.ts.map +1 -0
- package/dist/ops/project-check.js +136 -0
- package/dist/ops/project-check.js.map +1 -0
- package/dist/ops/rebase-and-check.d.ts +2 -1
- package/dist/ops/rebase-and-check.d.ts.map +1 -1
- package/dist/ops/rebase-and-check.js +2 -2
- package/dist/ops/rebase-and-check.js.map +1 -1
- package/dist/ops/rebase.d.ts +8 -5
- package/dist/ops/rebase.d.ts.map +1 -1
- package/dist/ops/rebase.js +43 -29
- package/dist/ops/rebase.js.map +1 -1
- package/dist/runner/comment-commands.d.ts +20 -0
- package/dist/runner/comment-commands.d.ts.map +1 -0
- package/dist/runner/comment-commands.js +221 -0
- package/dist/runner/comment-commands.js.map +1 -0
- package/dist/runner/helpers.d.ts +57 -0
- package/dist/runner/helpers.d.ts.map +1 -0
- package/dist/runner/helpers.js +259 -0
- package/dist/runner/helpers.js.map +1 -0
- package/dist/runner/poller.d.ts.map +1 -1
- package/dist/runner/poller.js +19 -781
- package/dist/runner/poller.js.map +1 -1
- package/dist/runner/reaction-scan.d.ts +17 -0
- package/dist/runner/reaction-scan.d.ts.map +1 -0
- package/dist/runner/reaction-scan.js +33 -0
- package/dist/runner/reaction-scan.js.map +1 -0
- package/dist/runner/run-finalizer.d.ts +30 -0
- package/dist/runner/run-finalizer.d.ts.map +1 -0
- package/dist/runner/run-finalizer.js +217 -0
- package/dist/runner/run-finalizer.js.map +1 -0
- package/dist/settings/definitions/github.d.ts +3 -0
- package/dist/settings/definitions/github.d.ts.map +1 -0
- package/dist/settings/definitions/github.js +267 -0
- package/dist/settings/definitions/github.js.map +1 -0
- package/dist/settings/definitions/loop.d.ts +3 -0
- package/dist/settings/definitions/loop.d.ts.map +1 -0
- package/dist/settings/definitions/loop.js +113 -0
- package/dist/settings/definitions/loop.js.map +1 -0
- package/dist/settings/definitions/observability.d.ts +3 -0
- package/dist/settings/definitions/observability.d.ts.map +1 -0
- package/dist/settings/definitions/observability.js +74 -0
- package/dist/settings/definitions/observability.js.map +1 -0
- package/dist/settings/definitions/security.d.ts +3 -0
- package/dist/settings/definitions/security.d.ts.map +1 -0
- package/dist/settings/definitions/security.js +121 -0
- package/dist/settings/definitions/security.js.map +1 -0
- package/dist/settings/registry.d.ts +82 -6
- package/dist/settings/registry.d.ts.map +1 -1
- package/dist/settings/registry.js +301 -194
- package/dist/settings/registry.js.map +1 -1
- package/dist/settings/runtime.d.ts +5 -1
- package/dist/settings/runtime.d.ts.map +1 -1
- package/dist/settings/runtime.js +46 -9
- package/dist/settings/runtime.js.map +1 -1
- package/dist/state/db.d.ts.map +1 -1
- package/dist/state/db.js +2 -0
- package/dist/state/db.js.map +1 -1
- package/dist/state/migrations/020-cost-ledger.d.ts +3 -0
- package/dist/state/migrations/020-cost-ledger.d.ts.map +1 -0
- package/dist/state/migrations/020-cost-ledger.js +37 -0
- package/dist/state/migrations/020-cost-ledger.js.map +1 -0
- package/dist/state/runs.d.ts +1 -0
- package/dist/state/runs.d.ts.map +1 -1
- package/dist/state/runs.js +3 -0
- package/dist/state/runs.js.map +1 -1
- package/dist/state/stats.d.ts +20 -0
- package/dist/state/stats.d.ts.map +1 -1
- package/dist/state/stats.js +68 -8
- package/dist/state/stats.js.map +1 -1
- package/dist/utils/logger.d.ts +9 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +13 -0
- package/dist/utils/logger.js.map +1 -1
- package/dist/web/routes/api-events.d.ts +10 -0
- package/dist/web/routes/api-events.d.ts.map +1 -0
- package/dist/web/routes/api-events.js +251 -0
- package/dist/web/routes/api-events.js.map +1 -0
- package/dist/web/routes/api-operations.d.ts +3 -0
- package/dist/web/routes/api-operations.d.ts.map +1 -0
- package/dist/web/routes/api-operations.js +371 -0
- package/dist/web/routes/api-operations.js.map +1 -0
- package/dist/web/routes/api-runs.d.ts +3 -0
- package/dist/web/routes/api-runs.d.ts.map +1 -0
- package/dist/web/routes/api-runs.js +96 -0
- package/dist/web/routes/api-runs.js.map +1 -0
- package/dist/web/routes/api-settings.d.ts +3 -0
- package/dist/web/routes/api-settings.d.ts.map +1 -0
- package/dist/web/routes/api-settings.js +61 -0
- package/dist/web/routes/api-settings.js.map +1 -0
- package/dist/web/routes/context.d.ts +15 -0
- package/dist/web/routes/context.d.ts.map +1 -0
- package/dist/web/routes/context.js +2 -0
- package/dist/web/routes/context.js.map +1 -0
- package/dist/web/server.d.ts +58 -1
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +116 -847
- package/dist/web/server.js.map +1 -1
- package/dist/web/shell-session.d.ts +74 -0
- package/dist/web/shell-session.d.ts.map +1 -0
- package/dist/web/shell-session.js +279 -0
- package/dist/web/shell-session.js.map +1 -0
- package/dist/web/snapshots.d.ts +159 -0
- package/dist/web/snapshots.d.ts.map +1 -0
- package/dist/web/snapshots.js +231 -0
- package/dist/web/snapshots.js.map +1 -0
- package/dist/workers/acp.d.ts.map +1 -1
- package/dist/workers/acp.js +116 -0
- package/dist/workers/acp.js.map +1 -1
- package/dist/workers/claude.d.ts.map +1 -1
- package/dist/workers/claude.js +13 -3
- package/dist/workers/claude.js.map +1 -1
- package/dist/workers/codex.d.ts.map +1 -1
- package/dist/workers/codex.js +16 -4
- package/dist/workers/codex.js.map +1 -1
- package/dist/workers/types.d.ts +14 -4
- package/dist/workers/types.d.ts.map +1 -1
- package/examples/config.example.yaml +12 -3
- package/package.json +8 -2
- package/web/dist/assets/index-BIrXUwFe.css +1 -0
- package/web/dist/assets/index-COMzHPcP.js +26 -0
- package/web/dist/index.html +2 -2
- package/web/dist/assets/index-k6kgdnzy.js +0 -9
- package/web/dist/assets/index-xm9qPlYB.css +0 -1
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { isGitRepo, branchExistsLocally, branchExistsRemotely, fetchOrigin } from '../git/repo.js';
|
|
3
|
+
import { logger } from '../utils/logger.js';
|
|
4
|
+
/**
|
|
5
|
+
* Validate that a target project is properly set up for night-orch.
|
|
6
|
+
* Returns a list of check results — all must pass for the project to be ready.
|
|
7
|
+
*/
|
|
8
|
+
export async function validateProjectSetup(repoConfig, config, forge) {
|
|
9
|
+
const results = [];
|
|
10
|
+
// 1. Repo local path exists and is a git repo
|
|
11
|
+
if (!existsSync(repoConfig.localPath)) {
|
|
12
|
+
results.push({
|
|
13
|
+
name: 'Local path exists',
|
|
14
|
+
passed: false,
|
|
15
|
+
message: `Path does not exist: ${repoConfig.localPath}`,
|
|
16
|
+
category: 'repo',
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
const isRepo = await isGitRepo(repoConfig.localPath);
|
|
21
|
+
results.push({
|
|
22
|
+
name: 'Local path is git repo',
|
|
23
|
+
passed: isRepo,
|
|
24
|
+
message: isRepo
|
|
25
|
+
? `Valid git repo at ${repoConfig.localPath}`
|
|
26
|
+
: `Not a git repo: ${repoConfig.localPath}`,
|
|
27
|
+
category: 'repo',
|
|
28
|
+
});
|
|
29
|
+
// 2. Base branch exists
|
|
30
|
+
if (isRepo) {
|
|
31
|
+
try {
|
|
32
|
+
await fetchOrigin(repoConfig.localPath);
|
|
33
|
+
results.push({
|
|
34
|
+
name: 'Fetch origin',
|
|
35
|
+
passed: true,
|
|
36
|
+
message: 'Successfully fetched from origin',
|
|
37
|
+
category: 'repo',
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
results.push({
|
|
42
|
+
name: 'Fetch origin',
|
|
43
|
+
passed: false,
|
|
44
|
+
message: `Failed to fetch: ${err instanceof Error ? err.message : String(err)}`,
|
|
45
|
+
category: 'repo',
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
const localExists = await branchExistsLocally(repoConfig.localPath, repoConfig.baseBranch);
|
|
49
|
+
const remoteExists = await branchExistsRemotely(repoConfig.localPath, repoConfig.baseBranch);
|
|
50
|
+
results.push({
|
|
51
|
+
name: 'Base branch exists',
|
|
52
|
+
passed: localExists || remoteExists,
|
|
53
|
+
message: localExists || remoteExists
|
|
54
|
+
? `Base branch '${repoConfig.baseBranch}' found (local: ${localExists}, remote: ${remoteExists})`
|
|
55
|
+
: `Base branch '${repoConfig.baseBranch}' not found locally or remotely`,
|
|
56
|
+
category: 'repo',
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// 3. Forge auth works
|
|
61
|
+
try {
|
|
62
|
+
const authInfo = await forge.validateAuth();
|
|
63
|
+
results.push({
|
|
64
|
+
name: 'Forge authentication',
|
|
65
|
+
passed: true,
|
|
66
|
+
message: `Authenticated as ${authInfo.user}`,
|
|
67
|
+
category: 'auth',
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
results.push({
|
|
72
|
+
name: 'Forge authentication',
|
|
73
|
+
passed: false,
|
|
74
|
+
message: `Auth failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
75
|
+
category: 'auth',
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
// 4. Repo is accessible
|
|
79
|
+
try {
|
|
80
|
+
await forge.getIssue(repoConfig.repo, 1).catch(() => null); // 404 is OK — just checking access
|
|
81
|
+
results.push({
|
|
82
|
+
name: 'Repo accessible',
|
|
83
|
+
passed: true,
|
|
84
|
+
message: `Can access ${repoConfig.repo}`,
|
|
85
|
+
category: 'auth',
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
results.push({
|
|
90
|
+
name: 'Repo accessible',
|
|
91
|
+
passed: false,
|
|
92
|
+
message: `Cannot access ${repoConfig.repo}: ${err instanceof Error ? err.message : String(err)}`,
|
|
93
|
+
category: 'auth',
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
// 5. Ready labels configured
|
|
97
|
+
const readyLabels = Array.isArray(repoConfig.labels.ready) ? repoConfig.labels.ready : [repoConfig.labels.ready];
|
|
98
|
+
results.push({
|
|
99
|
+
name: 'Ready labels configured',
|
|
100
|
+
passed: readyLabels.length > 0,
|
|
101
|
+
message: readyLabels.length > 0
|
|
102
|
+
? `Ready labels: ${readyLabels.join(', ')} — run 'night-orch labels-init' to ensure they exist on the repo`
|
|
103
|
+
: 'No ready labels configured',
|
|
104
|
+
category: 'labels',
|
|
105
|
+
});
|
|
106
|
+
// 6. Worker profiles exist for configured roles
|
|
107
|
+
for (const role of ['planner', 'coder', 'reviewer']) {
|
|
108
|
+
const agentName = repoConfig.defaults[role];
|
|
109
|
+
const mappedProfile = repoConfig.agents[agentName];
|
|
110
|
+
const profile = mappedProfile
|
|
111
|
+
? config.workerProfiles[mappedProfile]
|
|
112
|
+
: Object.values(config.workerProfiles).find((p) => p.type === agentName);
|
|
113
|
+
results.push({
|
|
114
|
+
name: `Worker profile for ${role} (${agentName})`,
|
|
115
|
+
passed: !!profile,
|
|
116
|
+
message: profile
|
|
117
|
+
? `Found profile: ${mappedProfile ?? agentName} (command: ${profile.command})`
|
|
118
|
+
: `No worker profile found for agent '${agentName}'`,
|
|
119
|
+
category: 'environment',
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
// 7. Verify commands configured
|
|
123
|
+
const hasVerify = (repoConfig.verify?.length ?? 0) > 0;
|
|
124
|
+
results.push({
|
|
125
|
+
name: 'Verify commands configured',
|
|
126
|
+
passed: hasVerify,
|
|
127
|
+
message: hasVerify
|
|
128
|
+
? `${repoConfig.verify.length} verify command(s) configured`
|
|
129
|
+
: 'No verify commands configured — runs will skip verification',
|
|
130
|
+
category: 'verify',
|
|
131
|
+
optional: true,
|
|
132
|
+
});
|
|
133
|
+
logger.info({ repo: repoConfig.repo, passed: results.filter((r) => r.passed).length, total: results.length }, 'Project validation complete');
|
|
134
|
+
return results;
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=project-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-check.js","sourceRoot":"","sources":["../../src/ops/project-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type Database from 'better-sqlite3';
|
|
2
2
|
import type { ForgeAdapter } from '../forge/types.js';
|
|
3
3
|
import type { RepoConfig } from '../config/schema.js';
|
|
4
|
+
import type { UpdateStrategy } from '../git/worktree.js';
|
|
4
5
|
/**
|
|
5
6
|
* Queue an issue for rebase-and-re-evaluate.
|
|
6
7
|
*
|
|
@@ -26,7 +27,7 @@ export declare function queueRebase(db: Database.Database, forge: ForgeAdapter,
|
|
|
26
27
|
* Returns false if verify fails — the caller should continue with
|
|
27
28
|
* a code→verify→review cycle to fix the issues.
|
|
28
29
|
*/
|
|
29
|
-
export declare function executeRebase(repoLocalPath: string, worktreePath: string, branchName: string, baseBranch: string, repo: string, issueNumber: number, verifyCommands: Array<string | string[]
|
|
30
|
+
export declare function executeRebase(repoLocalPath: string, worktreePath: string, branchName: string, baseBranch: string, repo: string, issueNumber: number, verifyCommands: Array<string | string[]>, strategy?: UpdateStrategy): Promise<{
|
|
30
31
|
rebased: boolean;
|
|
31
32
|
verifyPassed: boolean;
|
|
32
33
|
conflict: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rebase-and-check.d.ts","sourceRoot":"","sources":["../../src/ops/rebase-and-check.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"rebase-and-check.d.ts","sourceRoot":"","sources":["../../src/ops/rebase-and-check.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAErD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAYxD;;;;;;;;;;;;GAYG;AACH,wBAAsB,WAAW,CAC/B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,YAAY,EACnB,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAgD9C;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CACjC,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC,EACxC,QAAQ,GAAE,cAAwB,GACjC,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC,CA+BzE"}
|
|
@@ -68,7 +68,7 @@ export async function queueRebase(db, forge, repoConfig, issueNumber, botUser) {
|
|
|
68
68
|
* Returns false if verify fails — the caller should continue with
|
|
69
69
|
* a code→verify→review cycle to fix the issues.
|
|
70
70
|
*/
|
|
71
|
-
export async function executeRebase(repoLocalPath, worktreePath, branchName, baseBranch, repo, issueNumber, verifyCommands) {
|
|
71
|
+
export async function executeRebase(repoLocalPath, worktreePath, branchName, baseBranch, repo, issueNumber, verifyCommands, strategy = 'merge') {
|
|
72
72
|
const target = {
|
|
73
73
|
repo,
|
|
74
74
|
issueNumber,
|
|
@@ -77,7 +77,7 @@ export async function executeRebase(repoLocalPath, worktreePath, branchName, bas
|
|
|
77
77
|
baseBranch,
|
|
78
78
|
worktreePath,
|
|
79
79
|
};
|
|
80
|
-
const rebaseResult = await autoRebase(target, repoLocalPath);
|
|
80
|
+
const rebaseResult = await autoRebase(target, repoLocalPath, strategy);
|
|
81
81
|
if (rebaseResult === 'up_to_date') {
|
|
82
82
|
return { rebased: false, verifyPassed: true, conflict: false };
|
|
83
83
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rebase-and-check.js","sourceRoot":"","sources":["../../src/ops/rebase-and-check.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAqB,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"rebase-and-check.js","sourceRoot":"","sources":["../../src/ops/rebase-and-check.ts"],"names":[],"mappings":"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"}
|
package/dist/ops/rebase.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { UpdateStrategy } from '../git/worktree.js';
|
|
1
2
|
export interface RebaseTarget {
|
|
2
3
|
repo: string;
|
|
3
4
|
issueNumber: number;
|
|
@@ -8,11 +9,13 @@ export interface RebaseTarget {
|
|
|
8
9
|
}
|
|
9
10
|
export type RebaseResult = 'up_to_date' | 'rebased' | 'conflict' | 'error';
|
|
10
11
|
/**
|
|
11
|
-
*
|
|
12
|
-
* Uses --force-with-lease for
|
|
12
|
+
* Update a branch to incorporate latest base branch changes and push.
|
|
13
|
+
* Supports both merge and rebase strategies. Uses --force-with-lease for
|
|
14
|
+
* push to protect against overwriting others' work.
|
|
13
15
|
*
|
|
14
|
-
* @
|
|
15
|
-
*
|
|
16
|
+
* @param strategy - 'merge' creates a merge commit (reliable), 'rebase' replays commits (linear history)
|
|
17
|
+
* @returns 'up_to_date' if no update needed, 'rebased' on success,
|
|
18
|
+
* 'conflict' if update had conflicts (aborted), 'error' on other failures.
|
|
16
19
|
*/
|
|
17
|
-
export declare function autoRebase(target: RebaseTarget, repoLocalPath: string): Promise<RebaseResult>;
|
|
20
|
+
export declare function autoRebase(target: RebaseTarget, repoLocalPath: string, strategy?: UpdateStrategy): Promise<RebaseResult>;
|
|
18
21
|
//# sourceMappingURL=rebase.d.ts.map
|
package/dist/ops/rebase.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rebase.d.ts","sourceRoot":"","sources":["../../src/ops/rebase.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,CAAA;AAE1E
|
|
1
|
+
{"version":3,"file":"rebase.d.ts","sourceRoot":"","sources":["../../src/ops/rebase.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAExD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,CAAA;AAE1E;;;;;;;;GAQG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,YAAY,EACpB,aAAa,EAAE,MAAM,EACrB,QAAQ,GAAE,cAAwB,GACjC,OAAO,CAAC,YAAY,CAAC,CAoEvB"}
|
package/dist/ops/rebase.js
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import { runGit } from '../git/process.js';
|
|
2
|
+
import { mergeFromBranch } from '../git/repo.js';
|
|
2
3
|
import { logger } from '../utils/logger.js';
|
|
3
4
|
/**
|
|
4
|
-
*
|
|
5
|
-
* Uses --force-with-lease for
|
|
5
|
+
* Update a branch to incorporate latest base branch changes and push.
|
|
6
|
+
* Supports both merge and rebase strategies. Uses --force-with-lease for
|
|
7
|
+
* push to protect against overwriting others' work.
|
|
6
8
|
*
|
|
7
|
-
* @
|
|
8
|
-
*
|
|
9
|
+
* @param strategy - 'merge' creates a merge commit (reliable), 'rebase' replays commits (linear history)
|
|
10
|
+
* @returns 'up_to_date' if no update needed, 'rebased' on success,
|
|
11
|
+
* 'conflict' if update had conflicts (aborted), 'error' on other failures.
|
|
9
12
|
*/
|
|
10
|
-
export async function autoRebase(target, repoLocalPath) {
|
|
13
|
+
export async function autoRebase(target, repoLocalPath, strategy = 'merge') {
|
|
11
14
|
const { branchName, baseBranch, worktreePath } = target;
|
|
12
15
|
const log = logger.child({ repo: target.repo, issue: target.issueNumber, branch: branchName });
|
|
13
16
|
try {
|
|
@@ -16,51 +19,62 @@ export async function autoRebase(target, repoLocalPath) {
|
|
|
16
19
|
cwd: repoLocalPath,
|
|
17
20
|
timeout: 60_000,
|
|
18
21
|
});
|
|
19
|
-
// Check if base branch is already an ancestor of HEAD (i.e., no
|
|
22
|
+
// Check if base branch is already an ancestor of HEAD (i.e., no update needed)
|
|
20
23
|
try {
|
|
21
24
|
await runGit(['merge-base', '--is-ancestor', `origin/${baseBranch}`, 'HEAD'], {
|
|
22
25
|
cwd: worktreePath,
|
|
23
26
|
timeout: 30_000,
|
|
24
27
|
});
|
|
25
|
-
// Exit code 0 means base is ancestor → already up to date
|
|
26
28
|
return 'up_to_date';
|
|
27
29
|
}
|
|
28
30
|
catch {
|
|
29
|
-
// Non-zero exit = base is NOT an ancestor →
|
|
31
|
+
// Non-zero exit = base is NOT an ancestor → update needed
|
|
30
32
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
await
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
catch (rebaseErr) {
|
|
40
|
-
const stderr = rebaseErr.stderr ?? '';
|
|
41
|
-
if (stderr.includes('CONFLICT') || stderr.includes('could not apply')) {
|
|
42
|
-
log.warn({ baseBranch }, 'Rebase conflict — aborting');
|
|
43
|
-
try {
|
|
44
|
-
await runGit(['rebase', '--abort'], { cwd: worktreePath, timeout: 30_000 });
|
|
33
|
+
const remoteRef = `origin/${baseBranch}`;
|
|
34
|
+
log.info({ baseBranch, strategy }, 'Base branch has moved ahead — updating');
|
|
35
|
+
if (strategy === 'merge') {
|
|
36
|
+
const result = await mergeFromBranch(worktreePath, remoteRef);
|
|
37
|
+
if (!result.success) {
|
|
38
|
+
if (result.conflict) {
|
|
39
|
+
log.warn({ baseBranch }, 'Merge conflict with base branch — aborting');
|
|
40
|
+
return 'conflict';
|
|
45
41
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
42
|
+
return 'error';
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
// Rebase strategy
|
|
47
|
+
try {
|
|
48
|
+
await runGit(['rebase', remoteRef], {
|
|
49
|
+
cwd: worktreePath,
|
|
50
|
+
timeout: 120_000,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
catch (rebaseErr) {
|
|
54
|
+
const stderr = rebaseErr.stderr ?? '';
|
|
55
|
+
if (stderr.includes('CONFLICT') || stderr.includes('could not apply')) {
|
|
56
|
+
log.warn({ baseBranch }, 'Rebase conflict — aborting');
|
|
57
|
+
try {
|
|
58
|
+
await runGit(['rebase', '--abort'], { cwd: worktreePath, timeout: 30_000 });
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
log.error('Failed to abort rebase');
|
|
62
|
+
}
|
|
63
|
+
return 'conflict';
|
|
49
64
|
}
|
|
50
|
-
|
|
65
|
+
throw rebaseErr;
|
|
51
66
|
}
|
|
52
|
-
throw rebaseErr;
|
|
53
67
|
}
|
|
54
68
|
// Push with --force-with-lease
|
|
55
69
|
await runGit(['push', '--force-with-lease', 'origin', branchName], {
|
|
56
70
|
cwd: worktreePath,
|
|
57
71
|
timeout: 60_000,
|
|
58
72
|
});
|
|
59
|
-
log.info({ baseBranch }, '
|
|
73
|
+
log.info({ baseBranch, strategy }, 'Updated and pushed successfully');
|
|
60
74
|
return 'rebased';
|
|
61
75
|
}
|
|
62
76
|
catch (err) {
|
|
63
|
-
log.error({ err }, 'Auto-
|
|
77
|
+
log.error({ err }, 'Auto-update failed');
|
|
64
78
|
return 'error';
|
|
65
79
|
}
|
|
66
80
|
}
|
package/dist/ops/rebase.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rebase.js","sourceRoot":"","sources":["../../src/ops/rebase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"rebase.js","sourceRoot":"","sources":["../../src/ops/rebase.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Config } from '../config/schema.js';
|
|
2
|
+
import type Database from 'better-sqlite3';
|
|
3
|
+
import type { RunManager } from '../state/runs.js';
|
|
4
|
+
import type { LeaseManager } from '../state/leases.js';
|
|
5
|
+
import type { ForgeAdapter } from '../forge/types.js';
|
|
6
|
+
/** Issues that returned 404 during comment scan in this process lifecycle.
|
|
7
|
+
* Bounded: entries are evicted when the key's run reaches a terminal state
|
|
8
|
+
* via cleanupRunCaches. */
|
|
9
|
+
export declare const missingCommentCommandIssues: Set<string>;
|
|
10
|
+
export interface ProcessCommentCommandsParams {
|
|
11
|
+
config: Config;
|
|
12
|
+
db: Database.Database;
|
|
13
|
+
forge: ForgeAdapter;
|
|
14
|
+
runManager: RunManager;
|
|
15
|
+
leaseManager: LeaseManager;
|
|
16
|
+
repoConfig: Config['repos'][0];
|
|
17
|
+
botUser: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function processCommentCommands(params: ProcessCommentCommandsParams): Promise<void>;
|
|
20
|
+
//# sourceMappingURL=comment-commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comment-commands.d.ts","sourceRoot":"","sources":["../../src/runner/comment-commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAerD;;4BAE4B;AAC5B,eAAO,MAAM,2BAA2B,aAAoB,CAAA;AAE5D,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,MAAM,CAAA;IACd,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAA;IACrB,KAAK,EAAE,YAAY,CAAA;IACnB,UAAU,EAAE,UAAU,CAAA;IACtB,YAAY,EAAE,YAAY,CAAA;IAC1B,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;IAC9B,OAAO,EAAE,MAAM,CAAA;CAChB;AAUD,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,4BAA4B,GAAG,OAAO,CAAC,IAAI,CAAC,CA4HhG"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { transitionLabels } from '../labels/manager.js';
|
|
2
|
+
import { buildLabelConfig } from '../labels/config.js';
|
|
3
|
+
import { queueRebase } from '../ops/rebase-and-check.js';
|
|
4
|
+
import { queueContinue } from '../ops/continue.js';
|
|
5
|
+
import { isCommandProcessed, markCommandProcessed, parseOrchCommands, } from '../discovery/commands.js';
|
|
6
|
+
import { resolveIssueRepo } from '../utils/issue-repo.js';
|
|
7
|
+
import { nowUtcIso } from '../utils/time.js';
|
|
8
|
+
import { logger } from '../utils/logger.js';
|
|
9
|
+
/** Issues that returned 404 during comment scan in this process lifecycle.
|
|
10
|
+
* Bounded: entries are evicted when the key's run reaches a terminal state
|
|
11
|
+
* via cleanupRunCaches. */
|
|
12
|
+
export const missingCommentCommandIssues = new Set();
|
|
13
|
+
function getHttpStatus(err) {
|
|
14
|
+
if (typeof err !== 'object' || err === null)
|
|
15
|
+
return null;
|
|
16
|
+
const e = err;
|
|
17
|
+
if (typeof e.status === 'number')
|
|
18
|
+
return e.status;
|
|
19
|
+
if (typeof e.response?.status === 'number')
|
|
20
|
+
return e.response.status;
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
export async function processCommentCommands(params) {
|
|
24
|
+
const { config, db, forge, runManager, leaseManager, repoConfig, botUser, } = params;
|
|
25
|
+
const commandSettings = config.commentCommands ?? { enabled: true, requireCollaborator: false };
|
|
26
|
+
if (!commandSettings.enabled)
|
|
27
|
+
return;
|
|
28
|
+
if (!commandSettings.requireCollaborator) {
|
|
29
|
+
logger.warn({ repo: repoConfig.repo }, 'commentCommands.requireCollaborator=false — /orch commands accept any commenter. Enable on public repos.');
|
|
30
|
+
}
|
|
31
|
+
const activeRuns = runManager
|
|
32
|
+
.getActive()
|
|
33
|
+
.filter((run) => run.repo === repoConfig.repo);
|
|
34
|
+
const issueRows = [...new Map(activeRuns.map((run) => {
|
|
35
|
+
const issueRepo = resolveIssueRepo(run.phaseData, repoConfig.repo);
|
|
36
|
+
return [`${issueRepo}#${run.issueNumber}`, { issue_number: run.issueNumber, issue_repo: issueRepo }];
|
|
37
|
+
})).values()]
|
|
38
|
+
.sort((a, b) => a.issue_repo.localeCompare(b.issue_repo) || a.issue_number - b.issue_number);
|
|
39
|
+
if (issueRows.length === 0)
|
|
40
|
+
return;
|
|
41
|
+
const collaboratorCache = new Map();
|
|
42
|
+
for (const row of issueRows) {
|
|
43
|
+
const issueKey = `${row.issue_repo}#${row.issue_number}`;
|
|
44
|
+
if (missingCommentCommandIssues.has(issueKey)) {
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
let comments;
|
|
48
|
+
try {
|
|
49
|
+
comments = await forge.listIssueComments(row.issue_repo, row.issue_number);
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
if (getHttpStatus(err) === 404) {
|
|
53
|
+
missingCommentCommandIssues.add(issueKey);
|
|
54
|
+
logger.debug({ repo: row.issue_repo, issueNumber: row.issue_number }, 'Skipping comment command scan for missing or inaccessible issue');
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
throw err;
|
|
58
|
+
}
|
|
59
|
+
const parsed = parseOrchCommands(comments, '1970-01-01T00:00:00Z');
|
|
60
|
+
for (const item of parsed) {
|
|
61
|
+
if (isCommandProcessed(db, row.issue_repo, row.issue_number, item.commentId))
|
|
62
|
+
continue;
|
|
63
|
+
let commandStatus = null;
|
|
64
|
+
try {
|
|
65
|
+
const allowed = await canExecuteCommentCommand({
|
|
66
|
+
forge,
|
|
67
|
+
repo: row.issue_repo,
|
|
68
|
+
user: item.user,
|
|
69
|
+
requireCollaborator: commandSettings.requireCollaborator,
|
|
70
|
+
cache: collaboratorCache,
|
|
71
|
+
});
|
|
72
|
+
if (!allowed) {
|
|
73
|
+
commandStatus = 'denied';
|
|
74
|
+
logger.info({ repo: repoConfig.repo, issueNumber: row.issue_number, user: item.user, commentId: item.commentId }, 'Ignoring comment command from non-collaborator');
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
const result = await executeCommentCommand({
|
|
78
|
+
command: item.command,
|
|
79
|
+
db,
|
|
80
|
+
forge,
|
|
81
|
+
runManager,
|
|
82
|
+
leaseManager,
|
|
83
|
+
repoConfig,
|
|
84
|
+
issueRepo: row.issue_repo,
|
|
85
|
+
issueNumber: row.issue_number,
|
|
86
|
+
botUser,
|
|
87
|
+
user: item.user,
|
|
88
|
+
});
|
|
89
|
+
if (!result.ok) {
|
|
90
|
+
commandStatus = 'rejected';
|
|
91
|
+
logger.info({ repo: repoConfig.repo, issueNumber: row.issue_number, command: item.command.type, reason: result.reason }, 'Comment command rejected');
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
commandStatus = 'applied';
|
|
95
|
+
logger.info({ repo: repoConfig.repo, issueNumber: row.issue_number, command: item.command.type, user: item.user }, 'Comment command applied');
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
logger.warn({ repo: repoConfig.repo, issueNumber: row.issue_number, commentId: item.commentId, command: item.command.type, err }, 'Comment command failed (transient — will retry)');
|
|
100
|
+
}
|
|
101
|
+
finally {
|
|
102
|
+
if (commandStatus !== null) {
|
|
103
|
+
markCommandProcessed(db, row.issue_repo, row.issue_number, item.commentId, `${item.command.type}:${commandStatus}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
async function canExecuteCommentCommand(params) {
|
|
110
|
+
const { forge, repo, user, requireCollaborator, cache } = params;
|
|
111
|
+
if (!requireCollaborator)
|
|
112
|
+
return true;
|
|
113
|
+
if (!user)
|
|
114
|
+
return false;
|
|
115
|
+
const cacheKey = `${repo}\n${user}`;
|
|
116
|
+
const cached = cache.get(cacheKey);
|
|
117
|
+
if (cached !== undefined)
|
|
118
|
+
return cached;
|
|
119
|
+
if (!forge.isCollaborator) {
|
|
120
|
+
logger.warn({ repo, user }, 'requireCollaborator=true but forge adapter has no isCollaborator() implementation');
|
|
121
|
+
cache.set(cacheKey, false);
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
try {
|
|
125
|
+
const allowed = await forge.isCollaborator(repo, user);
|
|
126
|
+
cache.set(cacheKey, allowed);
|
|
127
|
+
return allowed;
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
logger.warn({ repo, user, err }, 'Failed collaborator check for comment command user');
|
|
131
|
+
cache.set(cacheKey, false);
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
async function executeCommentCommand(params) {
|
|
136
|
+
const { command, db, forge, runManager, leaseManager, repoConfig, issueRepo, issueNumber, botUser, user, } = params;
|
|
137
|
+
switch (command.type) {
|
|
138
|
+
case 'retry':
|
|
139
|
+
return queueRetryFromComment({
|
|
140
|
+
runManager,
|
|
141
|
+
leaseManager,
|
|
142
|
+
forge,
|
|
143
|
+
repoConfig,
|
|
144
|
+
issueRepo,
|
|
145
|
+
issueNumber,
|
|
146
|
+
resetPlan: command.resetPlan,
|
|
147
|
+
});
|
|
148
|
+
case 'continue':
|
|
149
|
+
{
|
|
150
|
+
const result = await queueContinue(db, forge, repoConfig, issueNumber, botUser, { issueRepo });
|
|
151
|
+
return result.queued ? { ok: true } : { ok: false, reason: result.reason };
|
|
152
|
+
}
|
|
153
|
+
case 'rebase': {
|
|
154
|
+
const result = await queueRebase(db, forge, repoConfig, issueNumber, botUser);
|
|
155
|
+
return result.queued ? { ok: true } : { ok: false, reason: result.reason };
|
|
156
|
+
}
|
|
157
|
+
case 'cancel':
|
|
158
|
+
return cancelRunFromComment({
|
|
159
|
+
runManager,
|
|
160
|
+
leaseManager,
|
|
161
|
+
forge,
|
|
162
|
+
repoConfig,
|
|
163
|
+
issueRepo,
|
|
164
|
+
issueNumber,
|
|
165
|
+
user,
|
|
166
|
+
});
|
|
167
|
+
default: {
|
|
168
|
+
const exhaustive = command;
|
|
169
|
+
return { ok: false, reason: `Unsupported command: ${String(exhaustive)}` };
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
async function queueRetryFromComment(params) {
|
|
174
|
+
const { runManager, leaseManager, forge, repoConfig, issueRepo, issueNumber, resetPlan } = params;
|
|
175
|
+
const run = runManager.getByRepoAndIssue(repoConfig.repo, issueNumber);
|
|
176
|
+
if (!run)
|
|
177
|
+
return { ok: false, reason: 'No run found for issue' };
|
|
178
|
+
if (run.status === 'running')
|
|
179
|
+
return { ok: false, reason: 'Run is currently running' };
|
|
180
|
+
if (!['blocked', 'error', 'review_ready'].includes(run.status)) {
|
|
181
|
+
return { ok: false, reason: `Retry not allowed from status ${run.status}` };
|
|
182
|
+
}
|
|
183
|
+
runManager.update(run.id, {
|
|
184
|
+
status: 'queued',
|
|
185
|
+
currentPhase: null,
|
|
186
|
+
endedAt: null,
|
|
187
|
+
lastError: null,
|
|
188
|
+
phaseData: resetPlan ? null : run.phaseData,
|
|
189
|
+
blockReason: null,
|
|
190
|
+
});
|
|
191
|
+
leaseManager.release(issueRepo, issueNumber);
|
|
192
|
+
if (issueRepo !== repoConfig.repo) {
|
|
193
|
+
leaseManager.release(repoConfig.repo, issueNumber);
|
|
194
|
+
}
|
|
195
|
+
const issue = await forge.getIssue(issueRepo, issueNumber);
|
|
196
|
+
await transitionLabels(forge, issueRepo, issueNumber, issue.labels, run.status, 'queued', buildLabelConfig(repoConfig, issue.labels));
|
|
197
|
+
return { ok: true };
|
|
198
|
+
}
|
|
199
|
+
async function cancelRunFromComment(params) {
|
|
200
|
+
const { runManager, leaseManager, forge, repoConfig, issueRepo, issueNumber, user } = params;
|
|
201
|
+
const run = runManager.getByRepoAndIssue(repoConfig.repo, issueNumber);
|
|
202
|
+
if (!run)
|
|
203
|
+
return { ok: false, reason: 'No run found for issue' };
|
|
204
|
+
if (run.status !== 'running' && run.status !== 'queued') {
|
|
205
|
+
return { ok: false, reason: `Cancel only supports running/queued runs (current: ${run.status})` };
|
|
206
|
+
}
|
|
207
|
+
runManager.update(run.id, {
|
|
208
|
+
status: 'blocked',
|
|
209
|
+
endedAt: nowUtcIso(),
|
|
210
|
+
lastError: `Cancelled by @${user} via comment command`,
|
|
211
|
+
blockReason: null,
|
|
212
|
+
});
|
|
213
|
+
leaseManager.release(issueRepo, issueNumber);
|
|
214
|
+
if (issueRepo !== repoConfig.repo) {
|
|
215
|
+
leaseManager.release(repoConfig.repo, issueNumber);
|
|
216
|
+
}
|
|
217
|
+
const issue = await forge.getIssue(issueRepo, issueNumber);
|
|
218
|
+
await transitionLabels(forge, issueRepo, issueNumber, issue.labels, run.status, 'blocked', buildLabelConfig(repoConfig, issue.labels));
|
|
219
|
+
return { ok: true };
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=comment-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comment-commands.js","sourceRoot":"","sources":["../../src/runner/comment-commands.ts"],"names":[],"mappings":"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"}
|