@ipul-labs/forge 1.16.8 → 1.17.1
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/README.md +39 -21
- package/lib/bin/cli/analyze.d.ts +9 -0
- package/lib/bin/cli/analyze.d.ts.map +1 -0
- package/lib/bin/cli/analyze.js +491 -0
- package/lib/bin/cli/analyze.js.map +1 -0
- package/lib/bin/cli/apply.d.ts +2 -0
- package/lib/bin/cli/apply.d.ts.map +1 -0
- package/lib/bin/cli/apply.js +262 -0
- package/lib/bin/cli/apply.js.map +1 -0
- package/lib/bin/cli/cifix.d.ts +2 -0
- package/lib/bin/cli/cifix.d.ts.map +1 -0
- package/lib/bin/cli/cifix.js +310 -0
- package/lib/bin/cli/cifix.js.map +1 -0
- package/lib/bin/cli/close.d.ts +2 -0
- package/lib/bin/cli/close.d.ts.map +1 -0
- package/lib/bin/cli/close.js +113 -0
- package/lib/bin/cli/close.js.map +1 -0
- package/lib/bin/cli/createIssue.d.ts +2 -0
- package/lib/bin/cli/createIssue.d.ts.map +1 -0
- package/lib/bin/cli/createIssue.js +108 -0
- package/lib/bin/cli/createIssue.js.map +1 -0
- package/lib/bin/cli/doctor.d.ts +2 -0
- package/lib/bin/cli/doctor.d.ts.map +1 -0
- package/lib/bin/cli/doctor.js +145 -0
- package/lib/bin/cli/doctor.js.map +1 -0
- package/lib/bin/cli/init.d.ts +4 -0
- package/lib/bin/cli/init.d.ts.map +1 -0
- package/lib/bin/cli/init.js +288 -0
- package/lib/bin/cli/init.js.map +1 -0
- package/lib/bin/cli/ink.d.ts +23 -0
- package/lib/bin/cli/ink.d.ts.map +1 -0
- package/{bin → lib/bin}/cli/ink.js +18 -19
- package/lib/bin/cli/ink.js.map +1 -0
- package/lib/bin/cli/issue.d.ts +2 -0
- package/lib/bin/cli/issue.d.ts.map +1 -0
- package/lib/bin/cli/issue.js +114 -0
- package/lib/bin/cli/issue.js.map +1 -0
- package/lib/bin/cli/issues.d.ts +2 -0
- package/lib/bin/cli/issues.d.ts.map +1 -0
- package/lib/bin/cli/issues.js +149 -0
- package/lib/bin/cli/issues.js.map +1 -0
- package/lib/bin/cli/merge.d.ts +2 -0
- package/lib/bin/cli/merge.d.ts.map +1 -0
- package/lib/bin/cli/merge.js +162 -0
- package/lib/bin/cli/merge.js.map +1 -0
- package/lib/bin/cli/refine.d.ts +2 -0
- package/lib/bin/cli/refine.d.ts.map +1 -0
- package/lib/bin/cli/refine.js +249 -0
- package/lib/bin/cli/refine.js.map +1 -0
- package/lib/bin/cli/repl.d.ts +2 -0
- package/lib/bin/cli/repl.d.ts.map +1 -0
- package/lib/bin/cli/repl.js +309 -0
- package/lib/bin/cli/repl.js.map +1 -0
- package/lib/bin/cli/repos.d.ts +2 -0
- package/lib/bin/cli/repos.d.ts.map +1 -0
- package/lib/bin/cli/repos.js +86 -0
- package/lib/bin/cli/repos.js.map +1 -0
- package/lib/bin/cli/resolution.d.ts +2 -0
- package/lib/bin/cli/resolution.d.ts.map +1 -0
- package/lib/bin/cli/resolution.js +139 -0
- package/lib/bin/cli/resolution.js.map +1 -0
- package/lib/bin/cli/serverClient.d.ts +26 -0
- package/lib/bin/cli/serverClient.d.ts.map +1 -0
- package/lib/bin/cli/serverClient.js +111 -0
- package/lib/bin/cli/serverClient.js.map +1 -0
- package/lib/bin/cli/session.d.ts +8 -0
- package/lib/bin/cli/session.d.ts.map +1 -0
- package/lib/bin/cli/session.js +212 -0
- package/lib/bin/cli/session.js.map +1 -0
- package/lib/bin/cli/sessionStore.d.ts +69 -0
- package/lib/bin/cli/sessionStore.d.ts.map +1 -0
- package/lib/bin/cli/sessionStore.js +196 -0
- package/lib/bin/cli/sessionStore.js.map +1 -0
- package/lib/bin/cli/ship.d.ts +33 -0
- package/lib/bin/cli/ship.d.ts.map +1 -0
- package/lib/bin/cli/ship.js +737 -0
- package/lib/bin/cli/ship.js.map +1 -0
- package/lib/bin/cli/types.d.ts +59 -0
- package/lib/bin/cli/types.d.ts.map +1 -0
- package/lib/bin/cli/types.js +2 -0
- package/lib/bin/cli/types.js.map +1 -0
- package/lib/bin/cli/update.d.ts +2 -0
- package/lib/bin/cli/update.d.ts.map +1 -0
- package/lib/bin/cli/update.js +87 -0
- package/lib/bin/cli/update.js.map +1 -0
- package/lib/bin/cli/utils.d.ts +43 -0
- package/lib/bin/cli/utils.d.ts.map +1 -0
- package/lib/bin/cli/utils.js +181 -0
- package/lib/bin/cli/utils.js.map +1 -0
- package/lib/bin/cli/validate.d.ts +2 -0
- package/lib/bin/cli/validate.d.ts.map +1 -0
- package/lib/bin/cli/validate.js +283 -0
- package/lib/bin/cli/validate.js.map +1 -0
- package/lib/bin/cli/watch.d.ts +5 -0
- package/lib/bin/cli/watch.d.ts.map +1 -0
- package/lib/bin/cli/watch.js +263 -0
- package/lib/bin/cli/watch.js.map +1 -0
- package/lib/bin/forge-agent.d.ts +3 -0
- package/lib/bin/forge-agent.d.ts.map +1 -0
- package/{bin → lib/bin}/forge-agent.js +104 -105
- package/lib/bin/forge-agent.js.map +1 -0
- package/lib/server/forge/core/ForgeAgent.d.ts +260 -0
- package/lib/server/forge/core/ForgeAgent.d.ts.map +1 -0
- package/lib/server/forge/core/ForgeAgent.js +995 -0
- package/lib/server/forge/core/ForgeAgent.js.map +1 -0
- package/lib/server/forge/core/agentClient.d.ts +39 -0
- package/lib/server/forge/core/agentClient.d.ts.map +1 -0
- package/{server → lib/server}/forge/core/agentClient.js +7 -12
- package/lib/server/forge/core/agentClient.js.map +1 -0
- package/lib/server/forge/core/branchName.d.ts +20 -0
- package/lib/server/forge/core/branchName.d.ts.map +1 -0
- package/lib/server/forge/core/branchName.js +39 -0
- package/lib/server/forge/core/branchName.js.map +1 -0
- package/lib/server/forge/core/claudeClient.d.ts +60 -0
- package/lib/server/forge/core/claudeClient.d.ts.map +1 -0
- package/lib/server/forge/core/claudeClient.js +347 -0
- package/lib/server/forge/core/claudeClient.js.map +1 -0
- package/lib/server/forge/core/configStore.d.ts +76 -0
- package/lib/server/forge/core/configStore.d.ts.map +1 -0
- package/lib/server/forge/core/configStore.js +213 -0
- package/lib/server/forge/core/configStore.js.map +1 -0
- package/lib/server/forge/core/gitlabClient.d.ts +144 -0
- package/lib/server/forge/core/gitlabClient.d.ts.map +1 -0
- package/{server → lib/server}/forge/core/gitlabClient.js +98 -180
- package/lib/server/forge/core/gitlabClient.js.map +1 -0
- package/lib/server/forge/core/jobs.d.ts +67 -0
- package/lib/server/forge/core/jobs.d.ts.map +1 -0
- package/lib/server/forge/core/jobs.js +185 -0
- package/lib/server/forge/core/jobs.js.map +1 -0
- package/lib/server/forge/core/k8s.d.ts +18 -0
- package/lib/server/forge/core/k8s.d.ts.map +1 -0
- package/lib/server/forge/core/k8s.js +49 -0
- package/lib/server/forge/core/k8s.js.map +1 -0
- package/lib/server/forge/core/localRepo.d.ts +36 -0
- package/lib/server/forge/core/localRepo.d.ts.map +1 -0
- package/lib/server/forge/core/localRepo.js +165 -0
- package/lib/server/forge/core/localRepo.js.map +1 -0
- package/lib/server/forge/core/openclawClient.d.ts +61 -0
- package/lib/server/forge/core/openclawClient.d.ts.map +1 -0
- package/lib/server/forge/core/openclawClient.js +111 -0
- package/lib/server/forge/core/openclawClient.js.map +1 -0
- package/lib/server/forge/core/prompts.d.ts +96 -0
- package/lib/server/forge/core/prompts.d.ts.map +1 -0
- package/lib/server/forge/core/prompts.js +450 -0
- package/lib/server/forge/core/prompts.js.map +1 -0
- package/lib/server/forge/core/providers/azuredevops.d.ts +134 -0
- package/lib/server/forge/core/providers/azuredevops.d.ts.map +1 -0
- package/lib/server/forge/core/providers/azuredevops.js +360 -0
- package/lib/server/forge/core/providers/azuredevops.js.map +1 -0
- package/lib/server/forge/core/providers/base.d.ts +114 -0
- package/lib/server/forge/core/providers/base.d.ts.map +1 -0
- package/lib/server/forge/core/providers/base.js +98 -0
- package/lib/server/forge/core/providers/base.js.map +1 -0
- package/lib/server/forge/core/providers/github.d.ts +133 -0
- package/lib/server/forge/core/providers/github.d.ts.map +1 -0
- package/lib/server/forge/core/providers/github.js +307 -0
- package/lib/server/forge/core/providers/github.js.map +1 -0
- package/lib/server/forge/core/providers/gitlab.d.ts +144 -0
- package/lib/server/forge/core/providers/gitlab.d.ts.map +1 -0
- package/lib/server/forge/core/providers/gitlab.js +407 -0
- package/lib/server/forge/core/providers/gitlab.js.map +1 -0
- package/lib/server/forge/core/providers/index.d.ts +21 -0
- package/lib/server/forge/core/providers/index.d.ts.map +1 -0
- package/lib/server/forge/core/providers/index.js +43 -0
- package/lib/server/forge/core/providers/index.js.map +1 -0
- package/lib/server/forge/core/providers/types.d.ts +80 -0
- package/lib/server/forge/core/providers/types.d.ts.map +1 -0
- package/lib/server/forge/core/providers/types.js +2 -0
- package/lib/server/forge/core/providers/types.js.map +1 -0
- package/lib/server/forge/core/quotaClient.d.ts +48 -0
- package/lib/server/forge/core/quotaClient.d.ts.map +1 -0
- package/lib/server/forge/core/quotaClient.js +88 -0
- package/lib/server/forge/core/quotaClient.js.map +1 -0
- package/lib/server/forge/core/types.d.ts +160 -0
- package/lib/server/forge/core/types.d.ts.map +1 -0
- package/lib/server/forge/core/types.js +2 -0
- package/lib/server/forge/core/types.js.map +1 -0
- package/lib/server/forge/core/validator/attribute.d.ts +31 -0
- package/lib/server/forge/core/validator/attribute.d.ts.map +1 -0
- package/lib/server/forge/core/validator/attribute.js +82 -0
- package/lib/server/forge/core/validator/attribute.js.map +1 -0
- package/lib/server/forge/core/validator/clone.d.ts +14 -0
- package/lib/server/forge/core/validator/clone.d.ts.map +1 -0
- package/lib/server/forge/core/validator/clone.js +99 -0
- package/lib/server/forge/core/validator/clone.js.map +1 -0
- package/lib/server/forge/core/validator/cmd.d.ts +23 -0
- package/lib/server/forge/core/validator/cmd.d.ts.map +1 -0
- package/lib/server/forge/core/validator/cmd.js +87 -0
- package/lib/server/forge/core/validator/cmd.js.map +1 -0
- package/lib/server/forge/core/validator/fs.d.ts +5 -0
- package/lib/server/forge/core/validator/fs.d.ts.map +1 -0
- package/{server → lib/server}/forge/core/validator/fs.js +8 -3
- package/lib/server/forge/core/validator/fs.js.map +1 -0
- package/lib/server/forge/core/validator/overlay.d.ts +13 -0
- package/lib/server/forge/core/validator/overlay.d.ts.map +1 -0
- package/lib/server/forge/core/validator/overlay.js +53 -0
- package/lib/server/forge/core/validator/overlay.js.map +1 -0
- package/lib/server/forge/core/validator/projectType.d.ts +20 -0
- package/lib/server/forge/core/validator/projectType.d.ts.map +1 -0
- package/lib/server/forge/core/validator/projectType.js +94 -0
- package/lib/server/forge/core/validator/projectType.js.map +1 -0
- package/lib/server/forge/core/validator/runners/go.d.ts +21 -0
- package/lib/server/forge/core/validator/runners/go.d.ts.map +1 -0
- package/lib/server/forge/core/validator/runners/go.js +99 -0
- package/lib/server/forge/core/validator/runners/go.js.map +1 -0
- package/lib/server/forge/core/validator/runners/node.d.ts +12 -0
- package/lib/server/forge/core/validator/runners/node.d.ts.map +1 -0
- package/lib/server/forge/core/validator/runners/node.js +75 -0
- package/lib/server/forge/core/validator/runners/node.js.map +1 -0
- package/lib/server/forge/core/validator/tdd.d.ts +30 -0
- package/lib/server/forge/core/validator/tdd.d.ts.map +1 -0
- package/lib/server/forge/core/validator/tdd.js +96 -0
- package/lib/server/forge/core/validator/tdd.js.map +1 -0
- package/lib/server/forge/core/validator.d.ts +58 -0
- package/lib/server/forge/core/validator.d.ts.map +1 -0
- package/lib/server/forge/core/validator.js +150 -0
- package/lib/server/forge/core/validator.js.map +1 -0
- package/lib/server/forge/routes.d.ts +22 -0
- package/lib/server/forge/routes.d.ts.map +1 -0
- package/lib/server/forge/routes.js +984 -0
- package/lib/server/forge/routes.js.map +1 -0
- package/lib/server.d.ts +2 -0
- package/lib/server.d.ts.map +1 -0
- package/lib/server.js +52 -0
- package/lib/server.js.map +1 -0
- package/lib/shared/events.d.ts +12 -0
- package/lib/shared/events.d.ts.map +1 -0
- package/lib/shared/events.js +12 -0
- package/lib/shared/events.js.map +1 -0
- package/package.json +15 -13
- package/scripts/fix-shebang.cjs +11 -0
- package/bin/cli/analyze.js +0 -516
- package/bin/cli/apply.js +0 -264
- package/bin/cli/cifix.js +0 -300
- package/bin/cli/close.js +0 -125
- package/bin/cli/createIssue.js +0 -112
- package/bin/cli/doctor.js +0 -161
- package/bin/cli/init.js +0 -306
- package/bin/cli/issue.js +0 -116
- package/bin/cli/issues.js +0 -155
- package/bin/cli/merge.js +0 -175
- package/bin/cli/refine.js +0 -253
- package/bin/cli/repl.js +0 -301
- package/bin/cli/repos.js +0 -91
- package/bin/cli/resolution.js +0 -126
- package/bin/cli/session.js +0 -230
- package/bin/cli/sessionStore.js +0 -211
- package/bin/cli/ship.js +0 -762
- package/bin/cli/update.js +0 -95
- package/bin/cli/utils.js +0 -145
- package/bin/cli/validate.js +0 -280
- package/bin/cli/watch.js +0 -274
- package/server/forge/core/ForgeAgent.js +0 -1179
- package/server/forge/core/ForgeAgent.test.js +0 -179
- package/server/forge/core/branchName.js +0 -41
- package/server/forge/core/claudeClient.js +0 -378
- package/server/forge/core/configStore.js +0 -229
- package/server/forge/core/configStore.test.js +0 -89
- package/server/forge/core/jobs.js +0 -180
- package/server/forge/core/k8s.js +0 -54
- package/server/forge/core/localRepo.js +0 -163
- package/server/forge/core/openclawClient.js +0 -125
- package/server/forge/core/prompts.js +0 -483
- package/server/forge/core/prompts.test.js +0 -219
- package/server/forge/core/providers/azuredevops.js +0 -409
- package/server/forge/core/providers/base.js +0 -208
- package/server/forge/core/providers/github.js +0 -348
- package/server/forge/core/providers/gitlab.js +0 -529
- package/server/forge/core/providers/index.js +0 -47
- package/server/forge/core/quotaClient.js +0 -101
- package/server/forge/core/validator/attribute.js +0 -84
- package/server/forge/core/validator/clone.js +0 -116
- package/server/forge/core/validator/cmd.js +0 -98
- package/server/forge/core/validator/overlay.js +0 -52
- package/server/forge/core/validator/projectType.js +0 -87
- package/server/forge/core/validator/runners/go.js +0 -107
- package/server/forge/core/validator/runners/node.js +0 -84
- package/server/forge/core/validator/tdd.js +0 -105
- package/server/forge/core/validator.js +0 -167
- package/server/forge/routes.js +0 -1027
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* server/forge/core/providers/azuredevops.js
|
|
3
|
+
*
|
|
4
|
+
* Azure DevOps REST API implementation of ScmProvider.
|
|
5
|
+
* Maps Work Items → issues, Pull Requests → MRs, Pipelines → CI.
|
|
6
|
+
*
|
|
7
|
+
* Required env vars:
|
|
8
|
+
* AZURE_DEVOPS_TOKEN — Personal Access Token (Base64 or raw PAT)
|
|
9
|
+
* AZURE_DEVOPS_ORG — organization name, e.g. "ipul-labs"
|
|
10
|
+
* AZURE_DEVOPS_PROJECT — team project name, e.g. "web-app"
|
|
11
|
+
* AZURE_DEVOPS_REPO — git repo name (often same as project)
|
|
12
|
+
*
|
|
13
|
+
* Optional:
|
|
14
|
+
* AZURE_DEVOPS_BASE_BRANCH — default target branch (default: "main")
|
|
15
|
+
*/
|
|
16
|
+
import { getConnection } from "../configStore.js";
|
|
17
|
+
import { ScmProvider } from "./base.js";
|
|
18
|
+
export class AzureDevOpsProvider extends ScmProvider {
|
|
19
|
+
_org;
|
|
20
|
+
_project;
|
|
21
|
+
_repo;
|
|
22
|
+
_defaultBranch;
|
|
23
|
+
_vsBase;
|
|
24
|
+
_vssmBase;
|
|
25
|
+
/**
|
|
26
|
+
* @param {string} [repo] "org/project/repo" — overrides env vars
|
|
27
|
+
*/
|
|
28
|
+
constructor(repo) {
|
|
29
|
+
super();
|
|
30
|
+
if (repo && repo.includes("/")) {
|
|
31
|
+
const parts = repo.split("/");
|
|
32
|
+
this._org = parts[0];
|
|
33
|
+
this._project = parts[1];
|
|
34
|
+
this._repo = parts[2] ?? parts[1];
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
this._org = process.env.AZURE_DEVOPS_ORG ?? "";
|
|
38
|
+
this._project = process.env.AZURE_DEVOPS_PROJECT ?? "";
|
|
39
|
+
this._repo = process.env.AZURE_DEVOPS_REPO ?? this._project;
|
|
40
|
+
}
|
|
41
|
+
this._defaultBranch = process.env.AZURE_DEVOPS_BASE_BRANCH ?? "main";
|
|
42
|
+
this._vsBase = `https://dev.azure.com/${this._org}`;
|
|
43
|
+
this._vssmBase = `https://vsrm.dev.azure.com/${this._org}`;
|
|
44
|
+
}
|
|
45
|
+
get name() { return "azuredevops"; }
|
|
46
|
+
get supportsRebase() { return false; }
|
|
47
|
+
// ─── Internal helpers ──────────────────────────────────────────────────────
|
|
48
|
+
_headers() {
|
|
49
|
+
const token = getConnection("azuredevops").token;
|
|
50
|
+
// ADO accepts Basic auth with a PAT as the password (username can be anything)
|
|
51
|
+
const encoded = Buffer.from(`:${token}`).toString("base64");
|
|
52
|
+
return {
|
|
53
|
+
Authorization: `Basic ${encoded}`,
|
|
54
|
+
"Content-Type": "application/json",
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
_gitBase() {
|
|
58
|
+
return `${this._vsBase}/${encodeURIComponent(this._project)}/_apis/git/repositories/${encodeURIComponent(this._repo)}`;
|
|
59
|
+
}
|
|
60
|
+
_witBase() {
|
|
61
|
+
return `${this._vsBase}/${encodeURIComponent(this._project)}/_apis/wit`;
|
|
62
|
+
}
|
|
63
|
+
_pipelineBase() {
|
|
64
|
+
return `${this._vsBase}/${encodeURIComponent(this._project)}/_apis/pipelines`;
|
|
65
|
+
}
|
|
66
|
+
_buildBase() {
|
|
67
|
+
return `${this._vsBase}/${encodeURIComponent(this._project)}/_apis/build`;
|
|
68
|
+
}
|
|
69
|
+
async _req(url, options = {}) {
|
|
70
|
+
const sep = url.includes("?") ? "&" : "?";
|
|
71
|
+
const versioned = url.includes("api-version") ? url : `${url}${sep}api-version=7.1`;
|
|
72
|
+
const res = await fetch(versioned, {
|
|
73
|
+
...options,
|
|
74
|
+
headers: { ...this._headers(), ...options.headers },
|
|
75
|
+
});
|
|
76
|
+
if (res.status === 204)
|
|
77
|
+
return null;
|
|
78
|
+
if (!res.ok) {
|
|
79
|
+
const text = await res.text().catch(() => "");
|
|
80
|
+
throw new Error(`AzureDevOps ${res.status} on ${url}: ${text}`);
|
|
81
|
+
}
|
|
82
|
+
return res.json();
|
|
83
|
+
}
|
|
84
|
+
// ─── Normalizers ──────────────────────────────────────────────────────────
|
|
85
|
+
_issue(raw) {
|
|
86
|
+
const fields = raw.fields ?? {};
|
|
87
|
+
return {
|
|
88
|
+
iid: raw.id,
|
|
89
|
+
title: String(fields["System.Title"] ?? ""),
|
|
90
|
+
description: fields["System.Description"] != null ? String(fields["System.Description"]) : null,
|
|
91
|
+
labels: String(fields["System.Tags"] ?? "").split(";").map((t) => t.trim()).filter(Boolean),
|
|
92
|
+
author: { name: fields["System.CreatedBy"]?.displayName ?? "" },
|
|
93
|
+
created_at: String(fields["System.CreatedDate"] ?? ""),
|
|
94
|
+
web_url: raw._links?.html?.href ?? "",
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
_mr(raw) {
|
|
98
|
+
const status = raw.status ?? "";
|
|
99
|
+
return {
|
|
100
|
+
iid: raw.pullRequestId,
|
|
101
|
+
title: raw.title,
|
|
102
|
+
web_url: `${this._vsBase}/${encodeURIComponent(this._project)}/_git/${encodeURIComponent(this._repo)}/pullrequest/${raw.pullRequestId}`,
|
|
103
|
+
source_branch: (raw.sourceRefName ?? "").replace("refs/heads/", ""),
|
|
104
|
+
target_branch: (raw.targetRefName ?? "").replace("refs/heads/", ""),
|
|
105
|
+
state: status === "completed" ? "merged" : status === "abandoned" ? "closed" : "opened",
|
|
106
|
+
has_conflicts: raw.mergeStatus === "conflicts",
|
|
107
|
+
rebase_in_progress: false,
|
|
108
|
+
merge_status: raw.mergeStatus ?? "",
|
|
109
|
+
detailed_merge_status: null,
|
|
110
|
+
draft: raw.isDraft ?? false,
|
|
111
|
+
head_pipeline: null,
|
|
112
|
+
author: { name: raw.createdBy?.displayName ?? "" },
|
|
113
|
+
created_at: raw.creationDate ?? "",
|
|
114
|
+
merged_at: status === "completed" ? (raw.closedDate ?? null) : null,
|
|
115
|
+
merge_commit_sha: null,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
_pipeline(raw) {
|
|
119
|
+
return {
|
|
120
|
+
id: raw.id,
|
|
121
|
+
status: this._buildStatus(raw),
|
|
122
|
+
web_url: raw._links?.web?.href ?? "",
|
|
123
|
+
created_at: raw.queueTime ?? raw.startTime ?? "",
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
_buildStatus(raw) {
|
|
127
|
+
const result = raw.result;
|
|
128
|
+
if (result === "succeeded")
|
|
129
|
+
return "success";
|
|
130
|
+
if (result === "failed" || result === "partiallySucceeded")
|
|
131
|
+
return "failed";
|
|
132
|
+
if (result === "canceled")
|
|
133
|
+
return "cancelled";
|
|
134
|
+
const status = raw.status;
|
|
135
|
+
if (status === "inProgress")
|
|
136
|
+
return "running";
|
|
137
|
+
if (status === "notStarted")
|
|
138
|
+
return "pending";
|
|
139
|
+
return status ?? "unknown";
|
|
140
|
+
}
|
|
141
|
+
_job(raw) {
|
|
142
|
+
return {
|
|
143
|
+
id: Number(raw.id),
|
|
144
|
+
name: raw.name,
|
|
145
|
+
stage: raw.stageName ?? "",
|
|
146
|
+
status: this._taskStatus(raw),
|
|
147
|
+
web_url: raw._links?.web?.href ?? "",
|
|
148
|
+
duration: raw.finishTime && raw.startTime
|
|
149
|
+
? Math.round((new Date(raw.finishTime).getTime() - new Date(raw.startTime).getTime()) / 1000)
|
|
150
|
+
: null,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
_taskStatus(raw) {
|
|
154
|
+
const result = raw.result;
|
|
155
|
+
if (result === "succeeded")
|
|
156
|
+
return "success";
|
|
157
|
+
if (result === "failed")
|
|
158
|
+
return "failed";
|
|
159
|
+
if (result === "skipped")
|
|
160
|
+
return "skipped";
|
|
161
|
+
const state = raw.state;
|
|
162
|
+
if (state === "inProgress")
|
|
163
|
+
return "running";
|
|
164
|
+
if (state === "pending")
|
|
165
|
+
return "pending";
|
|
166
|
+
return state ?? "unknown";
|
|
167
|
+
}
|
|
168
|
+
_diff(raw) {
|
|
169
|
+
const changeType = raw.changeType ?? "";
|
|
170
|
+
return {
|
|
171
|
+
old_path: raw.item?.path ?? "",
|
|
172
|
+
new_path: raw.item?.path ?? "",
|
|
173
|
+
diff: "", // ADO diff content requires a separate API call
|
|
174
|
+
new_file: changeType === "add",
|
|
175
|
+
renamed_file: changeType === "rename",
|
|
176
|
+
deleted_file: changeType === "delete",
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
// ─── Issues (Work Items) ──────────────────────────────────────────────────
|
|
180
|
+
async listOpenIssues() {
|
|
181
|
+
// WIQL query for open issues in the project
|
|
182
|
+
const wiql = {
|
|
183
|
+
query: `SELECT [System.Id] FROM WorkItems WHERE [System.TeamProject] = '${this._project}' AND [System.State] <> 'Done' AND [System.State] <> 'Closed' AND [System.WorkItemType] IN ('Bug','Issue','Task','User Story') ORDER BY [System.ChangedDate] DESC`,
|
|
184
|
+
};
|
|
185
|
+
const result = await this._req(`${this._witBase()}/wiql?$top=25`, { method: "POST", body: JSON.stringify(wiql) });
|
|
186
|
+
const ids = (result?.workItems ?? []).map((w) => w.id);
|
|
187
|
+
if (ids.length === 0)
|
|
188
|
+
return [];
|
|
189
|
+
const batch = await this._req(`${this._witBase()}/workitems?ids=${ids.join(",")}&$expand=fields`);
|
|
190
|
+
return (batch?.value ?? []).map((wi) => this._issue(wi));
|
|
191
|
+
}
|
|
192
|
+
async getIssue(iid) {
|
|
193
|
+
const raw = await this._req(`${this._witBase()}/workitems/${iid}?$expand=fields`);
|
|
194
|
+
return this._issue(raw);
|
|
195
|
+
}
|
|
196
|
+
async createIssue(title, description = "") {
|
|
197
|
+
const patch = [
|
|
198
|
+
{ op: "add", path: "/fields/System.Title", value: title },
|
|
199
|
+
{ op: "add", path: "/fields/System.Description", value: description },
|
|
200
|
+
];
|
|
201
|
+
const raw = await this._req(`${this._witBase()}/workitems/$Issue`, {
|
|
202
|
+
method: "POST",
|
|
203
|
+
headers: { "Content-Type": "application/json-patch+json" },
|
|
204
|
+
body: JSON.stringify(patch),
|
|
205
|
+
});
|
|
206
|
+
return this._issue(raw);
|
|
207
|
+
}
|
|
208
|
+
async updateIssue(iid, { title, description }) {
|
|
209
|
+
const patch = [];
|
|
210
|
+
if (title !== undefined)
|
|
211
|
+
patch.push({ op: "replace", path: "/fields/System.Title", value: title });
|
|
212
|
+
if (description !== undefined)
|
|
213
|
+
patch.push({ op: "replace", path: "/fields/System.Description", value: description });
|
|
214
|
+
const raw = await this._req(`${this._witBase()}/workitems/${iid}`, {
|
|
215
|
+
method: "PATCH",
|
|
216
|
+
headers: { "Content-Type": "application/json-patch+json" },
|
|
217
|
+
body: JSON.stringify(patch),
|
|
218
|
+
});
|
|
219
|
+
return this._issue(raw);
|
|
220
|
+
}
|
|
221
|
+
async closeIssue(iid) {
|
|
222
|
+
const patch = [{ op: "replace", path: "/fields/System.State", value: "Closed" }];
|
|
223
|
+
const raw = await this._req(`${this._witBase()}/workitems/${iid}`, {
|
|
224
|
+
method: "PATCH",
|
|
225
|
+
headers: { "Content-Type": "application/json-patch+json" },
|
|
226
|
+
body: JSON.stringify(patch),
|
|
227
|
+
});
|
|
228
|
+
return this._issue(raw);
|
|
229
|
+
}
|
|
230
|
+
// ─── Repository ───────────────────────────────────────────────────────────
|
|
231
|
+
async getFileTree(srcPath = "", ref = this._defaultBranch) {
|
|
232
|
+
const scopeParam = srcPath ? `&$scopePath=/${srcPath}` : "";
|
|
233
|
+
const data = await this._req(`${this._gitBase()}/trees/${ref}?recursive=true${scopeParam}`);
|
|
234
|
+
return (data?.treeEntries ?? [])
|
|
235
|
+
.filter((item) => item.gitObjectType === "blob")
|
|
236
|
+
.filter((item) => /\.(ts|tsx|js|jsx|json|css|yaml|yml|md|go|py|rs|java|rb|sh|toml)$/.test(item.relativePath))
|
|
237
|
+
.map((item) => item.relativePath);
|
|
238
|
+
}
|
|
239
|
+
async getFileContent(filePath, ref = this._defaultBranch) {
|
|
240
|
+
const encoded = encodeURIComponent(filePath);
|
|
241
|
+
const url = `${this._gitBase()}/items?path=${encoded}&versionDescriptor.version=${ref}&versionDescriptor.versionType=branch&$format=text&api-version=7.1`;
|
|
242
|
+
const res = await fetch(url, { headers: this._headers() });
|
|
243
|
+
if (!res.ok) {
|
|
244
|
+
const text = await res.text().catch(() => "");
|
|
245
|
+
throw new Error(`AzureDevOps ${res.status} on items/${filePath}: ${text}`);
|
|
246
|
+
}
|
|
247
|
+
return res.text();
|
|
248
|
+
}
|
|
249
|
+
// ─── Mutations ────────────────────────────────────────────────────────────
|
|
250
|
+
async createBranch(branchName, ref = this._defaultBranch) {
|
|
251
|
+
// Get current SHA for ref
|
|
252
|
+
const refs = await this._req(`${this._gitBase()}/refs?filter=heads/${ref}`);
|
|
253
|
+
const sha = refs?.value?.[0]?.objectId;
|
|
254
|
+
if (!sha)
|
|
255
|
+
throw new Error(`AzureDevOps: could not resolve ref ${ref}`);
|
|
256
|
+
return this._req(`${this._gitBase()}/refs`, {
|
|
257
|
+
method: "POST",
|
|
258
|
+
body: JSON.stringify([
|
|
259
|
+
{
|
|
260
|
+
name: `refs/heads/${branchName}`,
|
|
261
|
+
newObjectId: sha,
|
|
262
|
+
oldObjectId: "0000000000000000000000000000000000000000",
|
|
263
|
+
},
|
|
264
|
+
]),
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
async commitFiles(branch, message, actions) {
|
|
268
|
+
const changes = actions.map((action) => ({
|
|
269
|
+
changeType: action.action === "create" ? "add" : action.action === "delete" ? "delete" : "edit",
|
|
270
|
+
item: { path: `/${action.file_path}` },
|
|
271
|
+
newContent: action.action !== "delete"
|
|
272
|
+
? { content: action.content, contentType: "rawtext" }
|
|
273
|
+
: undefined,
|
|
274
|
+
}));
|
|
275
|
+
// Get current commit SHA
|
|
276
|
+
const refs = await this._req(`${this._gitBase()}/refs?filter=heads/${branch}`);
|
|
277
|
+
const oldSha = refs?.value?.[0]?.objectId ?? "0000000000000000000000000000000000000000";
|
|
278
|
+
return this._req(`${this._gitBase()}/pushes`, {
|
|
279
|
+
method: "POST",
|
|
280
|
+
body: JSON.stringify({
|
|
281
|
+
refUpdates: [{ name: `refs/heads/${branch}`, oldObjectId: oldSha }],
|
|
282
|
+
commits: [{ comment: message, changes }],
|
|
283
|
+
}),
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
async createMR({ sourceBranch, targetBranch = this._defaultBranch, title, description = "" }) {
|
|
287
|
+
const raw = await this._req(`${this._gitBase()}/pullrequests`, {
|
|
288
|
+
method: "POST",
|
|
289
|
+
body: JSON.stringify({
|
|
290
|
+
sourceRefName: `refs/heads/${sourceBranch}`,
|
|
291
|
+
targetRefName: `refs/heads/${targetBranch}`,
|
|
292
|
+
title,
|
|
293
|
+
description,
|
|
294
|
+
}),
|
|
295
|
+
});
|
|
296
|
+
return this._mr(raw);
|
|
297
|
+
}
|
|
298
|
+
// ─── PR queries ───────────────────────────────────────────────────────────
|
|
299
|
+
async listAllForgeMRs(state = "open") {
|
|
300
|
+
const adoStatus = state === "merged" ? "completed"
|
|
301
|
+
: state === "closed" ? "abandoned"
|
|
302
|
+
: "active";
|
|
303
|
+
const data = await this._req(`${this._gitBase()}/pullrequests?searchCriteria.status=${adoStatus}&$top=50`);
|
|
304
|
+
return (data?.value ?? [])
|
|
305
|
+
.filter((pr) => pr.sourceRefName?.includes("refs/heads/forge/"))
|
|
306
|
+
.map((pr) => this._mr(pr));
|
|
307
|
+
}
|
|
308
|
+
async listForgeMRsForIssue(issueIid) {
|
|
309
|
+
const data = await this._req(`${this._gitBase()}/pullrequests?searchCriteria.status=active&$top=50`);
|
|
310
|
+
return (data?.value ?? [])
|
|
311
|
+
.filter((pr) => pr.sourceRefName?.includes(`refs/heads/forge/issue-${issueIid}-`))
|
|
312
|
+
.map((pr) => this._mr(pr));
|
|
313
|
+
}
|
|
314
|
+
async listMergedForgeMRsForIssue(issueIid) {
|
|
315
|
+
const data = await this._req(`${this._gitBase()}/pullrequests?searchCriteria.status=completed&$top=50`);
|
|
316
|
+
return (data?.value ?? [])
|
|
317
|
+
.filter((pr) => pr.sourceRefName?.includes(`refs/heads/forge/issue-${issueIid}-`))
|
|
318
|
+
.map((pr) => this._mr(pr));
|
|
319
|
+
}
|
|
320
|
+
async getMR(mrIid) {
|
|
321
|
+
const raw = await this._req(`${this._gitBase()}/pullrequests/${mrIid}`);
|
|
322
|
+
return this._mr(raw);
|
|
323
|
+
}
|
|
324
|
+
async getMRDiffs(mrIid) {
|
|
325
|
+
const data = await this._req(`${this._gitBase()}/pullrequests/${mrIid}/iterations/1/changes`);
|
|
326
|
+
return (data?.changeEntries ?? []).map((c) => this._diff(c));
|
|
327
|
+
}
|
|
328
|
+
// ─── CI / Pipelines ───────────────────────────────────────────────────────
|
|
329
|
+
async getMRPipelines(mrIid) {
|
|
330
|
+
// Get PR statuses which link to builds
|
|
331
|
+
const data = await this._req(`${this._gitBase()}/pullrequests/${mrIid}/statuses`);
|
|
332
|
+
const buildIds = (data?.value ?? [])
|
|
333
|
+
.map((s) => s.targetUrl?.match(/buildId=(\d+)/)?.[1])
|
|
334
|
+
.filter(Boolean)
|
|
335
|
+
.map(Number);
|
|
336
|
+
if (buildIds.length === 0)
|
|
337
|
+
return [];
|
|
338
|
+
return Promise.all(buildIds.map((id) => this.getPipeline(id)));
|
|
339
|
+
}
|
|
340
|
+
async getPipeline(pipelineId) {
|
|
341
|
+
const raw = await this._req(`${this._buildBase()}/builds/${pipelineId}`);
|
|
342
|
+
return this._pipeline(raw);
|
|
343
|
+
}
|
|
344
|
+
async getPipelineJobs(pipelineId) {
|
|
345
|
+
const data = await this._req(`${this._buildBase()}/builds/${pipelineId}/timeline`);
|
|
346
|
+
return (data?.records ?? [])
|
|
347
|
+
.filter((r) => r.type === "Task")
|
|
348
|
+
.map((r) => this._job(r));
|
|
349
|
+
}
|
|
350
|
+
async getJobTrace(jobId) {
|
|
351
|
+
const url = `${this._buildBase()}/builds/${jobId}/logs/1?api-version=7.1`;
|
|
352
|
+
const res = await fetch(url, { headers: this._headers() });
|
|
353
|
+
if (!res.ok) {
|
|
354
|
+
const text = await res.text().catch(() => "");
|
|
355
|
+
throw new Error(`AzureDevOps ${res.status} on builds/${jobId}/logs: ${text}`);
|
|
356
|
+
}
|
|
357
|
+
return res.text();
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
//# sourceMappingURL=azuredevops.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"azuredevops.js","sourceRoot":"","sources":["../../../../../server/forge/core/providers/azuredevops.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* server/forge/core/providers/base.ts
|
|
3
|
+
*
|
|
4
|
+
* Abstract base class that defines the interface every SCM provider must
|
|
5
|
+
* implement. Methods throw "not implemented" by default so subclasses get
|
|
6
|
+
* a clear error rather than a silent no-op when something is missing.
|
|
7
|
+
*
|
|
8
|
+
* All data shapes returned by provider methods are normalised so that
|
|
9
|
+
* ForgeAgent and routes.js never need to know which provider is active.
|
|
10
|
+
*/
|
|
11
|
+
import type { NormalIssue, NormalMR, NormalPipeline, NormalJob, NormalDiff, CommitAction, NormalEnvironment } from "./types.ts";
|
|
12
|
+
export interface MergedMRIssueLink {
|
|
13
|
+
mrIid: number;
|
|
14
|
+
webUrl: string;
|
|
15
|
+
mergedAt: string | null;
|
|
16
|
+
sourceBranch: string | null;
|
|
17
|
+
closedIssueIids: number[];
|
|
18
|
+
}
|
|
19
|
+
export interface CompareResult {
|
|
20
|
+
aheadCount: number;
|
|
21
|
+
}
|
|
22
|
+
export interface CreateMRParams {
|
|
23
|
+
sourceBranch: string;
|
|
24
|
+
targetBranch?: string;
|
|
25
|
+
title: string;
|
|
26
|
+
description?: string;
|
|
27
|
+
labels?: string[];
|
|
28
|
+
}
|
|
29
|
+
export interface UpdateIssueParams {
|
|
30
|
+
title?: string;
|
|
31
|
+
description?: string;
|
|
32
|
+
}
|
|
33
|
+
export declare class ScmProvider {
|
|
34
|
+
/** Provider identifier */
|
|
35
|
+
get name(): string;
|
|
36
|
+
/** Whether the provider supports server-side rebase */
|
|
37
|
+
get supportsRebase(): boolean;
|
|
38
|
+
listOpenIssues(): Promise<NormalIssue[]>;
|
|
39
|
+
getIssue(iid: number | string): Promise<NormalIssue>;
|
|
40
|
+
createIssue(title: string, description?: string): Promise<NormalIssue>;
|
|
41
|
+
updateIssue(iid: number | string, { title, description }: UpdateIssueParams): Promise<NormalIssue>;
|
|
42
|
+
closeIssue(iid: number | string): Promise<NormalIssue>;
|
|
43
|
+
getFileTree(srcPath?: string, ref?: string): Promise<string[]>;
|
|
44
|
+
getFileContent(filePath: string, ref?: string): Promise<string>;
|
|
45
|
+
createBranch(branchName: string, ref?: string): Promise<unknown>;
|
|
46
|
+
deleteBranch(branchName: string): Promise<void>;
|
|
47
|
+
commitFiles(branch: string, message: string, actions: CommitAction[]): Promise<unknown>;
|
|
48
|
+
createMR({ sourceBranch, targetBranch, title, description }: CreateMRParams): Promise<NormalMR>;
|
|
49
|
+
/**
|
|
50
|
+
* @param state Lifecycle filter
|
|
51
|
+
* @returns Forge-created MRs in the requested state
|
|
52
|
+
*/
|
|
53
|
+
listAllForgeMRs(_state?: string): Promise<NormalMR[]>;
|
|
54
|
+
/** Open Forge MRs for a specific issue */
|
|
55
|
+
listForgeMRsForIssue(issueIid: number | string): Promise<NormalMR[]>;
|
|
56
|
+
/** Merged Forge MRs for a specific issue */
|
|
57
|
+
listMergedForgeMRsForIssue(issueIid: number | string): Promise<NormalMR[]>;
|
|
58
|
+
getMR(mrIid: number | string): Promise<NormalMR>;
|
|
59
|
+
getMRDiffs(mrIid: number | string): Promise<NormalDiff[]>;
|
|
60
|
+
rebaseMR(mrIid: number | string): Promise<void>;
|
|
61
|
+
/** Merge the MR immediately. */
|
|
62
|
+
mergeMR(_mrIid: number | string): Promise<void>;
|
|
63
|
+
/** Close the MR without merging. */
|
|
64
|
+
closeMR(_mrIid: number | string): Promise<void>;
|
|
65
|
+
/** Reopen a closed MR. */
|
|
66
|
+
reopenMR(_mrIid: number | string): Promise<void>;
|
|
67
|
+
/**
|
|
68
|
+
* Toggle draft / work-in-progress state on the MR.
|
|
69
|
+
*/
|
|
70
|
+
setMRDraft(_mrIid: number | string, _draft: boolean): Promise<void>;
|
|
71
|
+
getMRPipelines(mrIid: number | string): Promise<NormalPipeline[]>;
|
|
72
|
+
getPipeline(pipelineId: number | string): Promise<NormalPipeline>;
|
|
73
|
+
getPipelineJobs(pipelineId: number | string): Promise<NormalJob[]>;
|
|
74
|
+
getJobTrace(jobId: number | string): Promise<string>;
|
|
75
|
+
getPipelinesBySha(_sha: string): Promise<NormalPipeline[]>;
|
|
76
|
+
getPipelinesByRef(_ref: string): Promise<NormalPipeline[]>;
|
|
77
|
+
listBranchesByPrefix(_prefix: string): Promise<string[]>;
|
|
78
|
+
/**
|
|
79
|
+
* Count commits reachable from `toRef` but not from `fromRef`. Used to detect
|
|
80
|
+
* stale / empty forge branches (aheadCount === 0 means the branch has no
|
|
81
|
+
* pending changes vs. main). Return `null` when the provider can't compute it
|
|
82
|
+
* so callers can distinguish "no divergence" from "unknown".
|
|
83
|
+
*/
|
|
84
|
+
compareRefs(_fromRef: string, _toRef: string): Promise<CompareResult | null>;
|
|
85
|
+
/**
|
|
86
|
+
* Scan recently merged MRs so callers can badge open issues whose fix
|
|
87
|
+
* already shipped. Two attribution paths the consumer can use:
|
|
88
|
+
* 1. `closedIssueIids` — issues named by `Closes #N` / `Fixes #N` /
|
|
89
|
+
* `Resolves #N` trailers in the MR description (primary signal).
|
|
90
|
+
* 2. `sourceBranch` — the MR's source branch; lets the consumer recover
|
|
91
|
+
* issue IDs from branch names like `forge/issue-42-foo` when the MR
|
|
92
|
+
* description has no closing keyword.
|
|
93
|
+
* Returned entries are NOT pre-filtered on `closedIssueIids` — drop noise
|
|
94
|
+
* in the caller if you only want one of the two signals. One bulk call per
|
|
95
|
+
* issue-list render — do NOT call per-issue.
|
|
96
|
+
*/
|
|
97
|
+
listRecentMergedMRIssueLinks(_limit?: number): Promise<MergedMRIssueLink[]>;
|
|
98
|
+
/**
|
|
99
|
+
* List environments attached to a branch. Used to surface per-issue
|
|
100
|
+
* ephemeral URLs + status next to the pipeline on the issue detail view.
|
|
101
|
+
*
|
|
102
|
+
* Implementations that don't support environments should return `[]` so
|
|
103
|
+
* the UI simply doesn't render the section.
|
|
104
|
+
*/
|
|
105
|
+
listEnvironmentsForBranch(_branchName: string): Promise<NormalEnvironment[]>;
|
|
106
|
+
/**
|
|
107
|
+
* Trigger teardown of an environment. GitLab supports this natively via the
|
|
108
|
+
* environments/:id/stop action; GitHub has no equivalent and typically
|
|
109
|
+
* needs a repository_dispatch event to a cleanup workflow. Implementations
|
|
110
|
+
* that can't stop should throw so the caller can surface the limitation.
|
|
111
|
+
*/
|
|
112
|
+
stopEnvironment(_envId: number | string): Promise<void>;
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../../../server/forge/core/providers/base.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* server/forge/core/providers/base.ts
|
|
3
|
+
*
|
|
4
|
+
* Abstract base class that defines the interface every SCM provider must
|
|
5
|
+
* implement. Methods throw "not implemented" by default so subclasses get
|
|
6
|
+
* a clear error rather than a silent no-op when something is missing.
|
|
7
|
+
*
|
|
8
|
+
* All data shapes returned by provider methods are normalised so that
|
|
9
|
+
* ForgeAgent and routes.js never need to know which provider is active.
|
|
10
|
+
*/
|
|
11
|
+
export class ScmProvider {
|
|
12
|
+
/** Provider identifier */
|
|
13
|
+
get name() { return "base"; }
|
|
14
|
+
/** Whether the provider supports server-side rebase */
|
|
15
|
+
get supportsRebase() { return false; }
|
|
16
|
+
// ─── Issues ────────────────────────────────────────────────────────────────
|
|
17
|
+
async listOpenIssues() { throw new Error(`${this.name}: listOpenIssues not implemented`); }
|
|
18
|
+
async getIssue(iid) { throw new Error(`${this.name}: getIssue not implemented`); }
|
|
19
|
+
async createIssue(title, description) { throw new Error(`${this.name}: createIssue not implemented`); }
|
|
20
|
+
async updateIssue(iid, { title, description }) { throw new Error(`${this.name}: updateIssue not implemented`); }
|
|
21
|
+
async closeIssue(iid) { throw new Error(`${this.name}: closeIssue not implemented`); }
|
|
22
|
+
// ─── Repository ────────────────────────────────────────────────────────────
|
|
23
|
+
async getFileTree(srcPath, ref) { throw new Error(`${this.name}: getFileTree not implemented`); }
|
|
24
|
+
async getFileContent(filePath, ref) { throw new Error(`${this.name}: getFileContent not implemented`); }
|
|
25
|
+
// ─── Mutations ─────────────────────────────────────────────────────────────
|
|
26
|
+
async createBranch(branchName, ref) { throw new Error(`${this.name}: createBranch not implemented`); }
|
|
27
|
+
async deleteBranch(branchName) { throw new Error(`${this.name}: deleteBranch not implemented`); }
|
|
28
|
+
async commitFiles(branch, message, actions) { throw new Error(`${this.name}: commitFiles not implemented`); }
|
|
29
|
+
async createMR({ sourceBranch, targetBranch, title, description }) { throw new Error(`${this.name}: createMR not implemented`); }
|
|
30
|
+
// ─── MR / PR queries ───────────────────────────────────────────────────────
|
|
31
|
+
/**
|
|
32
|
+
* @param state Lifecycle filter
|
|
33
|
+
* @returns Forge-created MRs in the requested state
|
|
34
|
+
*/
|
|
35
|
+
async listAllForgeMRs(_state) { throw new Error(`${this.name}: listAllForgeMRs not implemented`); }
|
|
36
|
+
/** Open Forge MRs for a specific issue */
|
|
37
|
+
async listForgeMRsForIssue(issueIid) { throw new Error(`${this.name}: listForgeMRsForIssue not implemented`); }
|
|
38
|
+
/** Merged Forge MRs for a specific issue */
|
|
39
|
+
async listMergedForgeMRsForIssue(issueIid) { throw new Error(`${this.name}: listMergedForgeMRsForIssue not implemented`); }
|
|
40
|
+
async getMR(mrIid) { throw new Error(`${this.name}: getMR not implemented`); }
|
|
41
|
+
async getMRDiffs(mrIid) { throw new Error(`${this.name}: getMRDiffs not implemented`); }
|
|
42
|
+
async rebaseMR(mrIid) { throw new Error(`${this.name}: rebase not supported`); }
|
|
43
|
+
/** Merge the MR immediately. */
|
|
44
|
+
async mergeMR(_mrIid) { throw new Error(`${this.name}: mergeMR not supported`); }
|
|
45
|
+
/** Close the MR without merging. */
|
|
46
|
+
async closeMR(_mrIid) { throw new Error(`${this.name}: closeMR not supported`); }
|
|
47
|
+
/** Reopen a closed MR. */
|
|
48
|
+
async reopenMR(_mrIid) { throw new Error(`${this.name}: reopenMR not supported`); }
|
|
49
|
+
/**
|
|
50
|
+
* Toggle draft / work-in-progress state on the MR.
|
|
51
|
+
*/
|
|
52
|
+
async setMRDraft(_mrIid, _draft) { throw new Error(`${this.name}: setMRDraft not supported`); }
|
|
53
|
+
// ─── CI / Pipelines ────────────────────────────────────────────────────────
|
|
54
|
+
async getMRPipelines(mrIid) { throw new Error(`${this.name}: getMRPipelines not implemented`); }
|
|
55
|
+
async getPipeline(pipelineId) { throw new Error(`${this.name}: getPipeline not implemented`); }
|
|
56
|
+
async getPipelineJobs(pipelineId) { throw new Error(`${this.name}: getPipelineJobs not implemented`); }
|
|
57
|
+
async getJobTrace(jobId) { throw new Error(`${this.name}: getJobTrace not implemented`); }
|
|
58
|
+
async getPipelinesBySha(_sha) { return []; }
|
|
59
|
+
async getPipelinesByRef(_ref) { return []; }
|
|
60
|
+
async listBranchesByPrefix(_prefix) { return []; }
|
|
61
|
+
/**
|
|
62
|
+
* Count commits reachable from `toRef` but not from `fromRef`. Used to detect
|
|
63
|
+
* stale / empty forge branches (aheadCount === 0 means the branch has no
|
|
64
|
+
* pending changes vs. main). Return `null` when the provider can't compute it
|
|
65
|
+
* so callers can distinguish "no divergence" from "unknown".
|
|
66
|
+
*/
|
|
67
|
+
async compareRefs(_fromRef, _toRef) { return null; }
|
|
68
|
+
/**
|
|
69
|
+
* Scan recently merged MRs so callers can badge open issues whose fix
|
|
70
|
+
* already shipped. Two attribution paths the consumer can use:
|
|
71
|
+
* 1. `closedIssueIids` — issues named by `Closes #N` / `Fixes #N` /
|
|
72
|
+
* `Resolves #N` trailers in the MR description (primary signal).
|
|
73
|
+
* 2. `sourceBranch` — the MR's source branch; lets the consumer recover
|
|
74
|
+
* issue IDs from branch names like `forge/issue-42-foo` when the MR
|
|
75
|
+
* description has no closing keyword.
|
|
76
|
+
* Returned entries are NOT pre-filtered on `closedIssueIids` — drop noise
|
|
77
|
+
* in the caller if you only want one of the two signals. One bulk call per
|
|
78
|
+
* issue-list render — do NOT call per-issue.
|
|
79
|
+
*/
|
|
80
|
+
async listRecentMergedMRIssueLinks(_limit) { return []; }
|
|
81
|
+
// ─── Environments (ephemeral review apps) ─────────────────────────────────
|
|
82
|
+
/**
|
|
83
|
+
* List environments attached to a branch. Used to surface per-issue
|
|
84
|
+
* ephemeral URLs + status next to the pipeline on the issue detail view.
|
|
85
|
+
*
|
|
86
|
+
* Implementations that don't support environments should return `[]` so
|
|
87
|
+
* the UI simply doesn't render the section.
|
|
88
|
+
*/
|
|
89
|
+
async listEnvironmentsForBranch(_branchName) { return []; }
|
|
90
|
+
/**
|
|
91
|
+
* Trigger teardown of an environment. GitLab supports this natively via the
|
|
92
|
+
* environments/:id/stop action; GitHub has no equivalent and typically
|
|
93
|
+
* needs a repository_dispatch event to a cleanup workflow. Implementations
|
|
94
|
+
* that can't stop should throw so the caller can surface the limitation.
|
|
95
|
+
*/
|
|
96
|
+
async stopEnvironment(_envId) { throw new Error(`${this.name}: stopEnvironment not implemented`); }
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../../../server/forge/core/providers/base.ts"],"names":[],"mappings":"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"}
|