specweave 0.24.6 → 0.24.9
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/CLAUDE.md +64 -0
- package/README.md +34 -0
- package/dist/src/cli/commands/init.d.ts.map +1 -1
- package/dist/src/cli/commands/init.js +3 -1
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/github-multi-repo.d.ts +5 -2
- package/dist/src/cli/helpers/issue-tracker/github-multi-repo.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/github-multi-repo.js +90 -8
- package/dist/src/cli/helpers/issue-tracker/github-multi-repo.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/github.d.ts +2 -1
- package/dist/src/cli/helpers/issue-tracker/github.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/github.js +4 -3
- package/dist/src/cli/helpers/issue-tracker/github.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/index.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/index.js +26 -9
- package/dist/src/cli/helpers/issue-tracker/index.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/types.d.ts +1 -0
- package/dist/src/cli/helpers/issue-tracker/types.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/types.js.map +1 -1
- package/dist/src/core/repo-structure/git-error-handler.d.ts +37 -0
- package/dist/src/core/repo-structure/git-error-handler.d.ts.map +1 -0
- package/dist/src/core/repo-structure/git-error-handler.js +214 -0
- package/dist/src/core/repo-structure/git-error-handler.js.map +1 -0
- package/dist/src/core/repo-structure/git-provider.d.ts +183 -0
- package/dist/src/core/repo-structure/git-provider.d.ts.map +1 -0
- package/dist/src/core/repo-structure/git-provider.js +57 -0
- package/dist/src/core/repo-structure/git-provider.js.map +1 -0
- package/dist/src/core/repo-structure/github-validator.d.ts +1 -0
- package/dist/src/core/repo-structure/github-validator.d.ts.map +1 -1
- package/dist/src/core/repo-structure/github-validator.js +35 -9
- package/dist/src/core/repo-structure/github-validator.js.map +1 -1
- package/dist/src/core/repo-structure/platform-registry.d.ts +114 -0
- package/dist/src/core/repo-structure/platform-registry.d.ts.map +1 -0
- package/dist/src/core/repo-structure/platform-registry.js +206 -0
- package/dist/src/core/repo-structure/platform-registry.js.map +1 -0
- package/dist/src/core/repo-structure/prompt-consolidator.d.ts +42 -0
- package/dist/src/core/repo-structure/prompt-consolidator.d.ts.map +1 -1
- package/dist/src/core/repo-structure/prompt-consolidator.js +102 -0
- package/dist/src/core/repo-structure/prompt-consolidator.js.map +1 -1
- package/dist/src/core/repo-structure/providers/azure-devops-provider.d.ts +64 -0
- package/dist/src/core/repo-structure/providers/azure-devops-provider.d.ts.map +1 -0
- package/dist/src/core/repo-structure/providers/azure-devops-provider.js +263 -0
- package/dist/src/core/repo-structure/providers/azure-devops-provider.js.map +1 -0
- package/dist/src/core/repo-structure/providers/bitbucket-provider.d.ts +55 -0
- package/dist/src/core/repo-structure/providers/bitbucket-provider.d.ts.map +1 -0
- package/dist/src/core/repo-structure/providers/bitbucket-provider.js +238 -0
- package/dist/src/core/repo-structure/providers/bitbucket-provider.js.map +1 -0
- package/dist/src/core/repo-structure/providers/github-provider.d.ts +53 -0
- package/dist/src/core/repo-structure/providers/github-provider.d.ts.map +1 -0
- package/dist/src/core/repo-structure/providers/github-provider.js +239 -0
- package/dist/src/core/repo-structure/providers/github-provider.js.map +1 -0
- package/dist/src/core/repo-structure/providers/gitlab-provider.d.ts +51 -0
- package/dist/src/core/repo-structure/providers/gitlab-provider.d.ts.map +1 -0
- package/dist/src/core/repo-structure/providers/gitlab-provider.js +251 -0
- package/dist/src/core/repo-structure/providers/gitlab-provider.js.map +1 -0
- package/dist/src/core/repo-structure/providers/index.d.ts +35 -0
- package/dist/src/core/repo-structure/providers/index.d.ts.map +1 -0
- package/dist/src/core/repo-structure/providers/index.js +68 -0
- package/dist/src/core/repo-structure/providers/index.js.map +1 -0
- package/dist/src/core/repo-structure/providers/local-provider.d.ts +61 -0
- package/dist/src/core/repo-structure/providers/local-provider.d.ts.map +1 -0
- package/dist/src/core/repo-structure/providers/local-provider.js +148 -0
- package/dist/src/core/repo-structure/providers/local-provider.js.map +1 -0
- package/dist/src/core/repo-structure/repo-structure-manager.d.ts +21 -4
- package/dist/src/core/repo-structure/repo-structure-manager.d.ts.map +1 -1
- package/dist/src/core/repo-structure/repo-structure-manager.js +380 -113
- package/dist/src/core/repo-structure/repo-structure-manager.js.map +1 -1
- package/dist/src/core/repo-structure/url-generator.d.ts +80 -0
- package/dist/src/core/repo-structure/url-generator.d.ts.map +1 -0
- package/dist/src/core/repo-structure/url-generator.js +110 -0
- package/dist/src/core/repo-structure/url-generator.js.map +1 -0
- package/package.json +1 -1
- package/plugins/specweave/hooks/post-task-completion.sh +69 -175
- package/plugins/specweave/lib/hooks/consolidated-sync.js +183 -0
- package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +64 -0
- package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +96 -0
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Azure DevOps Provider Implementation
|
|
3
|
+
*
|
|
4
|
+
* Implements GitProvider interface for Azure DevOps Repos.
|
|
5
|
+
* Handles repository validation, creation, and management via Azure DevOps REST API.
|
|
6
|
+
*
|
|
7
|
+
* @module providers/azure-devops-provider
|
|
8
|
+
*/
|
|
9
|
+
import { BaseGitProvider } from '../git-provider.js';
|
|
10
|
+
import { getActionableError, formatActionableError } from '../git-error-handler.js';
|
|
11
|
+
/**
|
|
12
|
+
* Azure DevOps Provider
|
|
13
|
+
*
|
|
14
|
+
* Implements Git operations for Azure DevOps platform.
|
|
15
|
+
* Note: Azure DevOps uses organization/project/repository structure.
|
|
16
|
+
* The "owner" parameter typically represents "organization/project".
|
|
17
|
+
*/
|
|
18
|
+
export class AzureDevOpsProvider extends BaseGitProvider {
|
|
19
|
+
constructor(config) {
|
|
20
|
+
super({
|
|
21
|
+
type: 'azure-devops',
|
|
22
|
+
name: 'Azure DevOps',
|
|
23
|
+
host: config?.host || 'dev.azure.com',
|
|
24
|
+
apiBaseUrl: config?.apiBaseUrl || 'https://dev.azure.com',
|
|
25
|
+
selfHosted: config?.selfHosted || false,
|
|
26
|
+
customDomain: config?.customDomain
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Validate if a repository exists in Azure DevOps
|
|
31
|
+
* owner format: "organization/project"
|
|
32
|
+
*/
|
|
33
|
+
async validateRepository(owner, repo, token) {
|
|
34
|
+
try {
|
|
35
|
+
const [organization, project] = this.parseOwner(owner);
|
|
36
|
+
const headers = {
|
|
37
|
+
'Accept': 'application/json'
|
|
38
|
+
};
|
|
39
|
+
if (token) {
|
|
40
|
+
// Azure DevOps uses Basic Auth with PAT
|
|
41
|
+
const auth = Buffer.from(`:${token}`).toString('base64');
|
|
42
|
+
headers['Authorization'] = `Basic ${auth}`;
|
|
43
|
+
}
|
|
44
|
+
const response = await fetch(`${this.config.apiBaseUrl}/${organization}/${project}/_apis/git/repositories/${repo}?api-version=7.0`, { headers });
|
|
45
|
+
if (response.status === 404) {
|
|
46
|
+
// Repository does not exist (good for creation)
|
|
47
|
+
return { exists: false, valid: true };
|
|
48
|
+
}
|
|
49
|
+
if (response.status === 200) {
|
|
50
|
+
// Repository already exists
|
|
51
|
+
const data = await response.json();
|
|
52
|
+
return {
|
|
53
|
+
exists: true,
|
|
54
|
+
valid: true,
|
|
55
|
+
url: data.webUrl || data.remoteUrl
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
if (response.status === 401 || response.status === 403) {
|
|
59
|
+
// Authentication or permission error
|
|
60
|
+
const apiError = {
|
|
61
|
+
status: response.status,
|
|
62
|
+
message: response.statusText,
|
|
63
|
+
platform: 'azure-devops',
|
|
64
|
+
operation: 'validate_repo',
|
|
65
|
+
resourceType: 'repository',
|
|
66
|
+
resourceName: `${organization}/${project}/${repo}`
|
|
67
|
+
};
|
|
68
|
+
const actionable = getActionableError(apiError);
|
|
69
|
+
return { exists: false, valid: false, error: formatActionableError(actionable) };
|
|
70
|
+
}
|
|
71
|
+
// Other error
|
|
72
|
+
const apiError = {
|
|
73
|
+
status: response.status,
|
|
74
|
+
message: response.statusText,
|
|
75
|
+
platform: 'azure-devops',
|
|
76
|
+
operation: 'validate_repo',
|
|
77
|
+
resourceType: 'repository',
|
|
78
|
+
resourceName: `${organization}/${project}/${repo}`
|
|
79
|
+
};
|
|
80
|
+
const actionable = getActionableError(apiError);
|
|
81
|
+
return {
|
|
82
|
+
exists: false,
|
|
83
|
+
valid: false,
|
|
84
|
+
error: formatActionableError(actionable)
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
return {
|
|
89
|
+
exists: false,
|
|
90
|
+
valid: false,
|
|
91
|
+
error: `Network error: ${error instanceof Error ? error.message : String(error)}`
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Validate if an Azure DevOps organization/project exists
|
|
97
|
+
* owner format: "organization/project"
|
|
98
|
+
*/
|
|
99
|
+
async validateOwner(owner, token) {
|
|
100
|
+
const headers = {
|
|
101
|
+
'Accept': 'application/json'
|
|
102
|
+
};
|
|
103
|
+
if (token) {
|
|
104
|
+
const auth = Buffer.from(`:${token}`).toString('base64');
|
|
105
|
+
headers['Authorization'] = `Basic ${auth}`;
|
|
106
|
+
}
|
|
107
|
+
try {
|
|
108
|
+
const [organization, project] = this.parseOwner(owner);
|
|
109
|
+
// Validate organization exists by checking projects
|
|
110
|
+
const orgResponse = await fetch(`${this.config.apiBaseUrl}/${organization}/_apis/projects?api-version=7.0`, { headers });
|
|
111
|
+
if (orgResponse.status !== 200) {
|
|
112
|
+
const apiError = {
|
|
113
|
+
status: 404,
|
|
114
|
+
message: 'Organization not found',
|
|
115
|
+
platform: 'azure-devops',
|
|
116
|
+
operation: 'validate_owner',
|
|
117
|
+
resourceType: 'organization',
|
|
118
|
+
resourceName: organization
|
|
119
|
+
};
|
|
120
|
+
const actionable = getActionableError(apiError);
|
|
121
|
+
return { valid: false, error: formatActionableError(actionable) };
|
|
122
|
+
}
|
|
123
|
+
// If project specified, validate it exists
|
|
124
|
+
if (project) {
|
|
125
|
+
const projectResponse = await fetch(`${this.config.apiBaseUrl}/${organization}/_apis/projects/${project}?api-version=7.0`, { headers });
|
|
126
|
+
if (projectResponse.status !== 200) {
|
|
127
|
+
const apiError = {
|
|
128
|
+
status: 404,
|
|
129
|
+
message: 'Project not found',
|
|
130
|
+
platform: 'azure-devops',
|
|
131
|
+
operation: 'validate_owner',
|
|
132
|
+
resourceType: 'project',
|
|
133
|
+
resourceName: `${organization}/${project}`
|
|
134
|
+
};
|
|
135
|
+
const actionable = getActionableError(apiError);
|
|
136
|
+
return { valid: false, error: formatActionableError(actionable) };
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// Azure DevOps organizations are always "organization" type
|
|
140
|
+
return { valid: true, type: 'organization' };
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
return {
|
|
144
|
+
valid: false,
|
|
145
|
+
error: `Network error: ${error instanceof Error ? error.message : String(error)}`
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Create a new repository in Azure DevOps
|
|
151
|
+
*/
|
|
152
|
+
async createRepository(options, token) {
|
|
153
|
+
const [organization, project] = this.parseOwner(options.owner);
|
|
154
|
+
if (!project) {
|
|
155
|
+
throw new Error('Azure DevOps requires a project. Use format: "organization/project"');
|
|
156
|
+
}
|
|
157
|
+
const payload = {
|
|
158
|
+
name: options.name,
|
|
159
|
+
project: {
|
|
160
|
+
name: project
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
const auth = Buffer.from(`:${token}`).toString('base64');
|
|
164
|
+
const response = await fetch(`${this.config.apiBaseUrl}/${organization}/${project}/_apis/git/repositories?api-version=7.0`, {
|
|
165
|
+
method: 'POST',
|
|
166
|
+
headers: {
|
|
167
|
+
'Authorization': `Basic ${auth}`,
|
|
168
|
+
'Accept': 'application/json',
|
|
169
|
+
'Content-Type': 'application/json'
|
|
170
|
+
},
|
|
171
|
+
body: JSON.stringify(payload)
|
|
172
|
+
});
|
|
173
|
+
if (!response.ok) {
|
|
174
|
+
const error = await response.json();
|
|
175
|
+
// Handle "already exists" error
|
|
176
|
+
if (error.message?.includes('already exists') || error.typeKey === 'GitRepositoryNameAlreadyExistsException') {
|
|
177
|
+
// Repository already exists, return URL
|
|
178
|
+
const host = this.config.customDomain || this.config.host;
|
|
179
|
+
return `https://${host}/${organization}/${project}/_git/${options.name}`;
|
|
180
|
+
}
|
|
181
|
+
// Handle other errors with actionable messages
|
|
182
|
+
const apiError = {
|
|
183
|
+
status: response.status,
|
|
184
|
+
message: error.message || response.statusText,
|
|
185
|
+
platform: 'azure-devops',
|
|
186
|
+
operation: 'create_repo',
|
|
187
|
+
resourceType: 'repository',
|
|
188
|
+
resourceName: `${organization}/${project}/${options.name}`
|
|
189
|
+
};
|
|
190
|
+
const actionable = getActionableError(apiError);
|
|
191
|
+
throw new Error(formatActionableError(actionable));
|
|
192
|
+
}
|
|
193
|
+
const data = await response.json();
|
|
194
|
+
return data.webUrl || data.remoteUrl;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Check if account is an organization (always true for Azure DevOps)
|
|
198
|
+
*/
|
|
199
|
+
async isOrganization(account, token) {
|
|
200
|
+
// Azure DevOps always uses organizations
|
|
201
|
+
return true;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Get token creation URL
|
|
205
|
+
*/
|
|
206
|
+
getTokenUrl() {
|
|
207
|
+
if (this.config.selfHosted) {
|
|
208
|
+
return `https://${this.config.customDomain || this.config.host}/_usersSettings/tokens`;
|
|
209
|
+
}
|
|
210
|
+
return 'https://dev.azure.com/_usersSettings/tokens';
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Get required token scopes
|
|
214
|
+
*/
|
|
215
|
+
getRequiredScopes(isOrganization) {
|
|
216
|
+
return ['vso.code_write', 'vso.code_manage', 'vso.project'];
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Override getRemoteUrl for Azure DevOps-specific URL format
|
|
220
|
+
*/
|
|
221
|
+
getRemoteUrl(owner, repo, urlType) {
|
|
222
|
+
const [organization, project] = this.parseOwner(owner);
|
|
223
|
+
const host = this.config.customDomain || this.config.host;
|
|
224
|
+
if (!project) {
|
|
225
|
+
throw new Error('Azure DevOps requires a project. Use format: "organization/project"');
|
|
226
|
+
}
|
|
227
|
+
if (urlType === 'ssh') {
|
|
228
|
+
return `git@ssh.${host}:v3/${organization}/${project}/${repo}`;
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
return `https://${host}/${organization}/${project}/_git/${repo}`;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Override getAuthHeaders for Azure DevOps-specific auth (Basic Auth with PAT)
|
|
236
|
+
*/
|
|
237
|
+
getAuthHeaders(token) {
|
|
238
|
+
const auth = Buffer.from(`:${token}`).toString('base64');
|
|
239
|
+
return {
|
|
240
|
+
'Authorization': `Basic ${auth}`,
|
|
241
|
+
'Accept': 'application/json',
|
|
242
|
+
'Content-Type': 'application/json'
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Parse owner string into organization and project
|
|
247
|
+
* Format: "organization" or "organization/project"
|
|
248
|
+
*/
|
|
249
|
+
parseOwner(owner) {
|
|
250
|
+
const parts = owner.split('/');
|
|
251
|
+
if (parts.length === 1) {
|
|
252
|
+
return [parts[0], null];
|
|
253
|
+
}
|
|
254
|
+
return [parts[0], parts[1]];
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Create an Azure DevOps provider instance
|
|
259
|
+
*/
|
|
260
|
+
export function createAzureDevOpsProvider(config) {
|
|
261
|
+
return new AzureDevOpsProvider(config);
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=azure-devops-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"azure-devops-provider.js","sourceRoot":"","sources":["../../../../../src/core/repo-structure/providers/azure-devops-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bitbucket Provider Implementation
|
|
3
|
+
*
|
|
4
|
+
* Implements GitProvider interface for Bitbucket.org and Bitbucket Server/Data Center.
|
|
5
|
+
* Handles repository validation, creation, and management via Bitbucket API 2.0.
|
|
6
|
+
*
|
|
7
|
+
* @module providers/bitbucket-provider
|
|
8
|
+
*/
|
|
9
|
+
import { BaseGitProvider, type PlatformConfig, type RepoValidationResult, type OwnerValidationResult, type CreateRepoOptions } from '../git-provider.js';
|
|
10
|
+
/**
|
|
11
|
+
* Bitbucket Provider
|
|
12
|
+
*
|
|
13
|
+
* Implements Git operations for Bitbucket platform.
|
|
14
|
+
* Supports both Bitbucket.org and Bitbucket Server/Data Center.
|
|
15
|
+
*/
|
|
16
|
+
export declare class BitbucketProvider extends BaseGitProvider {
|
|
17
|
+
constructor(config?: Partial<PlatformConfig>);
|
|
18
|
+
/**
|
|
19
|
+
* Validate if a repository exists on Bitbucket
|
|
20
|
+
*/
|
|
21
|
+
validateRepository(owner: string, repo: string, token?: string): Promise<RepoValidationResult>;
|
|
22
|
+
/**
|
|
23
|
+
* Validate if a Bitbucket workspace (user or team) exists
|
|
24
|
+
*/
|
|
25
|
+
validateOwner(owner: string, token?: string): Promise<OwnerValidationResult>;
|
|
26
|
+
/**
|
|
27
|
+
* Create a new repository on Bitbucket
|
|
28
|
+
*/
|
|
29
|
+
createRepository(options: CreateRepoOptions, token: string): Promise<string>;
|
|
30
|
+
/**
|
|
31
|
+
* Check if a workspace is a team (organization)
|
|
32
|
+
*/
|
|
33
|
+
isOrganization(account: string, token?: string): Promise<boolean>;
|
|
34
|
+
/**
|
|
35
|
+
* Get token creation URL
|
|
36
|
+
*/
|
|
37
|
+
getTokenUrl(): string;
|
|
38
|
+
/**
|
|
39
|
+
* Get required token scopes
|
|
40
|
+
*/
|
|
41
|
+
getRequiredScopes(isOrganization?: boolean): string[];
|
|
42
|
+
/**
|
|
43
|
+
* Override SSH user for Bitbucket
|
|
44
|
+
*/
|
|
45
|
+
protected getSSHUser(): string;
|
|
46
|
+
/**
|
|
47
|
+
* Override getAuthHeaders for Bitbucket-specific auth (Bearer token)
|
|
48
|
+
*/
|
|
49
|
+
protected getAuthHeaders(token: string): Record<string, string>;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Create a Bitbucket provider instance
|
|
53
|
+
*/
|
|
54
|
+
export declare function createBitbucketProvider(config?: Partial<PlatformConfig>): BitbucketProvider;
|
|
55
|
+
//# sourceMappingURL=bitbucket-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bitbucket-provider.d.ts","sourceRoot":"","sources":["../../../../../src/core/repo-structure/providers/bitbucket-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,eAAe,EAAE,KAAK,cAAc,EAAE,KAAK,oBAAoB,EAAE,KAAK,qBAAqB,EAAE,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAGzJ;;;;;GAKG;AACH,qBAAa,iBAAkB,SAAQ,eAAe;gBACxC,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC;IAW5C;;OAEG;IACG,kBAAkB,CACtB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,oBAAoB,CAAC;IAuEhC;;OAEG;IACG,aAAa,CACjB,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,qBAAqB,CAAC;IAsDjC;;OAEG;IACG,gBAAgB,CACpB,OAAO,EAAE,iBAAiB,EAC1B,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,CAAC;IAoDlB;;OAEG;IACG,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAyBvE;;OAEG;IACH,WAAW,IAAI,MAAM;IAOrB;;OAEG;IACH,iBAAiB,CAAC,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,EAAE;IAIrD;;OAEG;IACH,SAAS,CAAC,UAAU,IAAI,MAAM;IAI9B;;OAEG;IACH,SAAS,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAOhE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,iBAAiB,CAE3F"}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bitbucket Provider Implementation
|
|
3
|
+
*
|
|
4
|
+
* Implements GitProvider interface for Bitbucket.org and Bitbucket Server/Data Center.
|
|
5
|
+
* Handles repository validation, creation, and management via Bitbucket API 2.0.
|
|
6
|
+
*
|
|
7
|
+
* @module providers/bitbucket-provider
|
|
8
|
+
*/
|
|
9
|
+
import { BaseGitProvider } from '../git-provider.js';
|
|
10
|
+
import { getActionableError, formatActionableError } from '../git-error-handler.js';
|
|
11
|
+
/**
|
|
12
|
+
* Bitbucket Provider
|
|
13
|
+
*
|
|
14
|
+
* Implements Git operations for Bitbucket platform.
|
|
15
|
+
* Supports both Bitbucket.org and Bitbucket Server/Data Center.
|
|
16
|
+
*/
|
|
17
|
+
export class BitbucketProvider extends BaseGitProvider {
|
|
18
|
+
constructor(config) {
|
|
19
|
+
super({
|
|
20
|
+
type: 'bitbucket',
|
|
21
|
+
name: 'Bitbucket',
|
|
22
|
+
host: config?.host || 'bitbucket.org',
|
|
23
|
+
apiBaseUrl: config?.apiBaseUrl || 'https://api.bitbucket.org/2.0',
|
|
24
|
+
selfHosted: config?.selfHosted || false,
|
|
25
|
+
customDomain: config?.customDomain
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Validate if a repository exists on Bitbucket
|
|
30
|
+
*/
|
|
31
|
+
async validateRepository(owner, repo, token) {
|
|
32
|
+
try {
|
|
33
|
+
const headers = {
|
|
34
|
+
'Accept': 'application/json'
|
|
35
|
+
};
|
|
36
|
+
if (token) {
|
|
37
|
+
headers['Authorization'] = `Bearer ${token}`;
|
|
38
|
+
}
|
|
39
|
+
const response = await fetch(this.getApiUrl(`/repositories/${owner}/${repo}`), { headers });
|
|
40
|
+
if (response.status === 404) {
|
|
41
|
+
// Repository does not exist (good for creation)
|
|
42
|
+
return { exists: false, valid: true };
|
|
43
|
+
}
|
|
44
|
+
if (response.status === 200) {
|
|
45
|
+
// Repository already exists
|
|
46
|
+
const data = await response.json();
|
|
47
|
+
return {
|
|
48
|
+
exists: true,
|
|
49
|
+
valid: true,
|
|
50
|
+
url: data.links.html.href
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
if (response.status === 401 || response.status === 403) {
|
|
54
|
+
// Authentication or permission error
|
|
55
|
+
const apiError = {
|
|
56
|
+
status: response.status,
|
|
57
|
+
message: response.statusText,
|
|
58
|
+
platform: 'bitbucket',
|
|
59
|
+
operation: 'validate_repo',
|
|
60
|
+
resourceType: 'repository',
|
|
61
|
+
resourceName: `${owner}/${repo}`
|
|
62
|
+
};
|
|
63
|
+
const actionable = getActionableError(apiError);
|
|
64
|
+
return { exists: false, valid: false, error: formatActionableError(actionable) };
|
|
65
|
+
}
|
|
66
|
+
// Other error
|
|
67
|
+
const apiError = {
|
|
68
|
+
status: response.status,
|
|
69
|
+
message: response.statusText,
|
|
70
|
+
platform: 'bitbucket',
|
|
71
|
+
operation: 'validate_repo',
|
|
72
|
+
resourceType: 'repository',
|
|
73
|
+
resourceName: `${owner}/${repo}`
|
|
74
|
+
};
|
|
75
|
+
const actionable = getActionableError(apiError);
|
|
76
|
+
return {
|
|
77
|
+
exists: false,
|
|
78
|
+
valid: false,
|
|
79
|
+
error: formatActionableError(actionable)
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
return {
|
|
84
|
+
exists: false,
|
|
85
|
+
valid: false,
|
|
86
|
+
error: `Network error: ${error instanceof Error ? error.message : String(error)}`
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Validate if a Bitbucket workspace (user or team) exists
|
|
92
|
+
*/
|
|
93
|
+
async validateOwner(owner, token) {
|
|
94
|
+
const headers = {
|
|
95
|
+
'Accept': 'application/json'
|
|
96
|
+
};
|
|
97
|
+
if (token) {
|
|
98
|
+
headers['Authorization'] = `Bearer ${token}`;
|
|
99
|
+
}
|
|
100
|
+
try {
|
|
101
|
+
// Try as workspace (can be user or team)
|
|
102
|
+
const workspaceResponse = await fetch(this.getApiUrl(`/workspaces/${owner}`), { headers });
|
|
103
|
+
if (workspaceResponse.status === 200) {
|
|
104
|
+
const data = await workspaceResponse.json();
|
|
105
|
+
// Workspace can be either user or team
|
|
106
|
+
const type = data.type === 'team' ? 'organization' : 'user';
|
|
107
|
+
return { valid: true, type };
|
|
108
|
+
}
|
|
109
|
+
// Try as user
|
|
110
|
+
const userResponse = await fetch(this.getApiUrl(`/users/${owner}`), { headers });
|
|
111
|
+
if (userResponse.status === 200) {
|
|
112
|
+
return { valid: true, type: 'user' };
|
|
113
|
+
}
|
|
114
|
+
// Not found
|
|
115
|
+
const apiError = {
|
|
116
|
+
status: 404,
|
|
117
|
+
message: 'Not Found',
|
|
118
|
+
platform: 'bitbucket',
|
|
119
|
+
operation: 'validate_owner',
|
|
120
|
+
resourceType: 'workspace',
|
|
121
|
+
resourceName: owner
|
|
122
|
+
};
|
|
123
|
+
const actionable = getActionableError(apiError);
|
|
124
|
+
return { valid: false, error: formatActionableError(actionable) };
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
return {
|
|
128
|
+
valid: false,
|
|
129
|
+
error: `Network error: ${error instanceof Error ? error.message : String(error)}`
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Create a new repository on Bitbucket
|
|
135
|
+
*/
|
|
136
|
+
async createRepository(options, token) {
|
|
137
|
+
const payload = {
|
|
138
|
+
scm: 'git',
|
|
139
|
+
name: options.name,
|
|
140
|
+
description: options.description,
|
|
141
|
+
is_private: options.visibility === 'private',
|
|
142
|
+
has_issues: options.hasIssues !== false,
|
|
143
|
+
has_wiki: options.hasWiki || false,
|
|
144
|
+
fork_policy: 'no_public_forks'
|
|
145
|
+
};
|
|
146
|
+
const response = await fetch(this.getApiUrl(`/repositories/${options.owner}/${options.name}`), {
|
|
147
|
+
method: 'POST',
|
|
148
|
+
headers: {
|
|
149
|
+
'Authorization': `Bearer ${token}`,
|
|
150
|
+
'Accept': 'application/json',
|
|
151
|
+
'Content-Type': 'application/json'
|
|
152
|
+
},
|
|
153
|
+
body: JSON.stringify(payload)
|
|
154
|
+
});
|
|
155
|
+
if (!response.ok) {
|
|
156
|
+
const error = await response.json();
|
|
157
|
+
// Handle "already exists" error
|
|
158
|
+
if (response.status === 400 && error.error?.message?.includes('already exists')) {
|
|
159
|
+
// Repository already exists, return URL
|
|
160
|
+
const host = this.config.customDomain || this.config.host;
|
|
161
|
+
return `https://${host}/${options.owner}/${options.name}`;
|
|
162
|
+
}
|
|
163
|
+
// Handle other errors with actionable messages
|
|
164
|
+
const apiError = {
|
|
165
|
+
status: response.status,
|
|
166
|
+
message: error.error?.message || response.statusText,
|
|
167
|
+
platform: 'bitbucket',
|
|
168
|
+
operation: 'create_repo',
|
|
169
|
+
resourceType: 'repository',
|
|
170
|
+
resourceName: `${options.owner}/${options.name}`
|
|
171
|
+
};
|
|
172
|
+
const actionable = getActionableError(apiError);
|
|
173
|
+
throw new Error(formatActionableError(actionable));
|
|
174
|
+
}
|
|
175
|
+
const data = await response.json();
|
|
176
|
+
return data.links.html.href;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Check if a workspace is a team (organization)
|
|
180
|
+
*/
|
|
181
|
+
async isOrganization(account, token) {
|
|
182
|
+
try {
|
|
183
|
+
const headers = {
|
|
184
|
+
'Accept': 'application/json'
|
|
185
|
+
};
|
|
186
|
+
if (token) {
|
|
187
|
+
headers['Authorization'] = `Bearer ${token}`;
|
|
188
|
+
}
|
|
189
|
+
const response = await fetch(this.getApiUrl(`/workspaces/${account}`), { headers });
|
|
190
|
+
if (response.ok) {
|
|
191
|
+
const data = await response.json();
|
|
192
|
+
return data.type === 'team';
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
// Assume user if we can't determine
|
|
197
|
+
}
|
|
198
|
+
return false;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Get token creation URL
|
|
202
|
+
*/
|
|
203
|
+
getTokenUrl() {
|
|
204
|
+
if (this.config.selfHosted) {
|
|
205
|
+
return `https://${this.config.customDomain || this.config.host}/account/settings/app-passwords/`;
|
|
206
|
+
}
|
|
207
|
+
return 'https://bitbucket.org/account/settings/app-passwords/';
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Get required token scopes
|
|
211
|
+
*/
|
|
212
|
+
getRequiredScopes(isOrganization) {
|
|
213
|
+
return ['repository:read', 'repository:write', 'repository:admin'];
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Override SSH user for Bitbucket
|
|
217
|
+
*/
|
|
218
|
+
getSSHUser() {
|
|
219
|
+
return 'git';
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Override getAuthHeaders for Bitbucket-specific auth (Bearer token)
|
|
223
|
+
*/
|
|
224
|
+
getAuthHeaders(token) {
|
|
225
|
+
return {
|
|
226
|
+
'Authorization': `Bearer ${token}`,
|
|
227
|
+
'Accept': 'application/json',
|
|
228
|
+
'Content-Type': 'application/json'
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Create a Bitbucket provider instance
|
|
234
|
+
*/
|
|
235
|
+
export function createBitbucketProvider(config) {
|
|
236
|
+
return new BitbucketProvider(config);
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=bitbucket-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bitbucket-provider.js","sourceRoot":"","sources":["../../../../../src/core/repo-structure/providers/bitbucket-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub Provider Implementation
|
|
3
|
+
*
|
|
4
|
+
* Implements GitProvider interface for GitHub.com and GitHub Enterprise.
|
|
5
|
+
* Handles repository validation, creation, and management via GitHub API.
|
|
6
|
+
*
|
|
7
|
+
* @module providers/github-provider
|
|
8
|
+
*/
|
|
9
|
+
import { BaseGitProvider, type PlatformConfig, type RepoValidationResult, type OwnerValidationResult, type CreateRepoOptions } from '../git-provider.js';
|
|
10
|
+
/**
|
|
11
|
+
* GitHub Provider
|
|
12
|
+
*
|
|
13
|
+
* Implements Git operations for GitHub platform.
|
|
14
|
+
*/
|
|
15
|
+
export declare class GitHubProvider extends BaseGitProvider {
|
|
16
|
+
constructor(config?: Partial<PlatformConfig>);
|
|
17
|
+
/**
|
|
18
|
+
* Validate if a repository exists on GitHub
|
|
19
|
+
*/
|
|
20
|
+
validateRepository(owner: string, repo: string, token?: string): Promise<RepoValidationResult>;
|
|
21
|
+
/**
|
|
22
|
+
* Validate if a GitHub owner (user or organization) exists
|
|
23
|
+
*/
|
|
24
|
+
validateOwner(owner: string, token?: string): Promise<OwnerValidationResult>;
|
|
25
|
+
/**
|
|
26
|
+
* Create a new repository on GitHub
|
|
27
|
+
*/
|
|
28
|
+
createRepository(options: CreateRepoOptions, token: string): Promise<string>;
|
|
29
|
+
/**
|
|
30
|
+
* Check if an account is an organization
|
|
31
|
+
*/
|
|
32
|
+
isOrganization(account: string, token?: string): Promise<boolean>;
|
|
33
|
+
/**
|
|
34
|
+
* Get token creation URL
|
|
35
|
+
*/
|
|
36
|
+
getTokenUrl(): string;
|
|
37
|
+
/**
|
|
38
|
+
* Get required token scopes
|
|
39
|
+
*/
|
|
40
|
+
getRequiredScopes(isOrganization?: boolean): string[];
|
|
41
|
+
/**
|
|
42
|
+
* Override getAuthHeaders for GitHub-specific auth
|
|
43
|
+
*/
|
|
44
|
+
protected getAuthHeaders(token: string): Record<string, string>;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Create a GitHub provider instance
|
|
48
|
+
*
|
|
49
|
+
* @param config - Optional platform configuration
|
|
50
|
+
* @returns GitHub provider instance
|
|
51
|
+
*/
|
|
52
|
+
export declare function createGitHubProvider(config?: Partial<PlatformConfig>): GitHubProvider;
|
|
53
|
+
//# sourceMappingURL=github-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-provider.d.ts","sourceRoot":"","sources":["../../../../../src/core/repo-structure/providers/github-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,eAAe,EAAE,KAAK,cAAc,EAAE,KAAK,oBAAoB,EAAE,KAAK,qBAAqB,EAAE,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAIzJ;;;;GAIG;AACH,qBAAa,cAAe,SAAQ,eAAe;gBACrC,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC;IAW5C;;OAEG;IACG,kBAAkB,CACtB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,oBAAoB,CAAC;IAuEhC;;OAEG;IACG,aAAa,CACjB,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,qBAAqB,CAAC;IAqDjC;;OAEG;IACG,gBAAgB,CACpB,OAAO,EAAE,iBAAiB,EAC1B,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,CAAC;IAmDlB;;OAEG;IACG,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAyBvE;;OAEG;IACH,WAAW,IAAI,MAAM;IAOrB;;OAEG;IACH,iBAAiB,CAAC,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,EAAE;IAQrD;;OAEG;IACH,SAAS,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAOhE;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,cAAc,CAErF"}
|