specweave 0.24.8 → 0.24.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/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.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/github-multi-repo.js +18 -2
- package/dist/src/cli/helpers/issue-tracker/github-multi-repo.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/index.js +4 -4
- package/dist/src/cli/helpers/issue-tracker/index.js.map +1 -1
- package/dist/src/core/repo-structure/git-error-handler.d.ts +1 -1
- package/dist/src/core/repo-structure/git-error-handler.d.ts.map +1 -1
- package/dist/src/core/repo-structure/git-provider.d.ts +1 -1
- package/dist/src/core/repo-structure/git-provider.d.ts.map +1 -1
- package/dist/src/core/repo-structure/platform-registry.d.ts.map +1 -1
- package/dist/src/core/repo-structure/platform-registry.js +20 -9
- package/dist/src/core/repo-structure/platform-registry.js.map +1 -1
- package/dist/src/core/repo-structure/prompt-consolidator.d.ts +13 -1
- package/dist/src/core/repo-structure/prompt-consolidator.d.ts.map +1 -1
- package/dist/src/core/repo-structure/prompt-consolidator.js +38 -5
- 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 +12 -11
- package/dist/src/core/repo-structure/providers/bitbucket-provider.d.ts.map +1 -1
- package/dist/src/core/repo-structure/providers/bitbucket-provider.js +164 -30
- package/dist/src/core/repo-structure/providers/bitbucket-provider.js.map +1 -1
- package/dist/src/core/repo-structure/providers/gitlab-provider.d.ts +10 -9
- package/dist/src/core/repo-structure/providers/gitlab-provider.d.ts.map +1 -1
- package/dist/src/core/repo-structure/providers/gitlab-provider.js +182 -28
- package/dist/src/core/repo-structure/providers/gitlab-provider.js.map +1 -1
- package/dist/src/core/repo-structure/providers/index.d.ts +3 -1
- package/dist/src/core/repo-structure/providers/index.d.ts.map +1 -1
- package/dist/src/core/repo-structure/providers/index.js +10 -2
- package/dist/src/core/repo-structure/providers/index.js.map +1 -1
- 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 +11 -1
- package/dist/src/core/repo-structure/repo-structure-manager.d.ts.map +1 -1
- package/dist/src/core/repo-structure/repo-structure-manager.js +268 -84
- package/dist/src/core/repo-structure/repo-structure-manager.js.map +1 -1
- package/package.json +1 -1
- package/plugins/specweave/agents/pm/AGENT.md.bak +1893 -0
- package/plugins/specweave/hooks/docs-changed.sh.backup +79 -0
- package/plugins/specweave/hooks/human-input-required.sh.backup +75 -0
- package/plugins/specweave/hooks/lib/migrate-increment-work.sh.bak +245 -0
- package/plugins/specweave/hooks/lib/sync-spec-content.sh.bak +149 -0
- package/plugins/specweave/hooks/lib/validate-spec-status.sh.bak +163 -0
- package/plugins/specweave/hooks/post-first-increment.sh.backup +61 -0
- package/plugins/specweave/hooks/post-first-increment.sh.bak +61 -0
- package/plugins/specweave/hooks/post-increment-change.sh.backup +98 -0
- package/plugins/specweave/hooks/post-increment-completion.sh.backup +231 -0
- package/plugins/specweave/hooks/post-increment-planning.sh.backup +1048 -0
- package/plugins/specweave/hooks/post-increment-status-change.sh.backup +147 -0
- package/plugins/specweave/hooks/post-spec-update.sh.backup +158 -0
- package/plugins/specweave/hooks/post-spec-update.sh.bak +158 -0
- package/plugins/specweave/hooks/post-task-completion.sh +69 -175
- package/plugins/specweave/hooks/post-user-story-complete.sh.backup +179 -0
- package/plugins/specweave/hooks/post-user-story-complete.sh.bak +179 -0
- package/plugins/specweave/hooks/pre-command-deduplication.sh.backup +83 -0
- package/plugins/specweave/hooks/pre-command-deduplication.sh.bak +83 -0
- package/plugins/specweave/hooks/pre-implementation.sh.backup +67 -0
- package/plugins/specweave/hooks/pre-task-completion.sh.backup +194 -0
- package/plugins/specweave/hooks/pre-tool-use.sh.backup +133 -0
- package/plugins/specweave/hooks/user-prompt-submit.sh.backup +386 -0
- package/plugins/specweave/hooks/user-prompt-submit.sh.bak +386 -0
- package/plugins/specweave/lib/hooks/auto-transition.js.bak +50 -0
- package/plugins/specweave/lib/hooks/auto-transition.ts.bak +84 -0
- package/plugins/specweave/lib/hooks/consolidated-sync.js +183 -0
- package/plugins/specweave/lib/hooks/git-diff-analyzer.d.js.bak +0 -0
- package/plugins/specweave/lib/hooks/git-diff-analyzer.d.ts.bak +89 -0
- package/plugins/specweave/lib/hooks/git-diff-analyzer.js.bak +142 -0
- package/plugins/specweave/lib/hooks/git-diff-analyzer.ts.bak +269 -0
- package/plugins/specweave/lib/hooks/invoke-translator-skill.d.js.bak +0 -0
- package/plugins/specweave/lib/hooks/invoke-translator-skill.d.ts.bak +60 -0
- package/plugins/specweave/lib/hooks/invoke-translator-skill.js.bak +155 -0
- package/plugins/specweave/lib/hooks/invoke-translator-skill.ts.bak +264 -0
- package/plugins/specweave/lib/hooks/prepare-reflection-context.d.js.bak +0 -0
- package/plugins/specweave/lib/hooks/prepare-reflection-context.d.ts.bak +42 -0
- package/plugins/specweave/lib/hooks/prepare-reflection-context.js.bak +110 -0
- package/plugins/specweave/lib/hooks/prepare-reflection-context.ts.bak +178 -0
- package/plugins/specweave/lib/hooks/reflection-config-loader.d.js.bak +0 -0
- package/plugins/specweave/lib/hooks/reflection-config-loader.d.ts.bak +45 -0
- package/plugins/specweave/lib/hooks/reflection-config-loader.js.bak +92 -0
- package/plugins/specweave/lib/hooks/reflection-config-loader.ts.bak +156 -0
- package/plugins/specweave/lib/hooks/reflection-parser.d.js.bak +0 -0
- package/plugins/specweave/lib/hooks/reflection-parser.d.ts.bak +33 -0
- package/plugins/specweave/lib/hooks/reflection-parser.js.bak +301 -0
- package/plugins/specweave/lib/hooks/reflection-parser.ts.bak +484 -0
- package/plugins/specweave/lib/hooks/reflection-prompt-builder.d.js.bak +0 -0
- package/plugins/specweave/lib/hooks/reflection-prompt-builder.d.ts.bak +56 -0
- package/plugins/specweave/lib/hooks/reflection-prompt-builder.js.bak +182 -0
- package/plugins/specweave/lib/hooks/reflection-prompt-builder.ts.bak +306 -0
- package/plugins/specweave/lib/hooks/reflection-storage.d.js.bak +0 -0
- package/plugins/specweave/lib/hooks/reflection-storage.d.ts.bak +64 -0
- package/plugins/specweave/lib/hooks/reflection-storage.js.bak +231 -0
- package/plugins/specweave/lib/hooks/reflection-storage.ts.bak +369 -0
- package/plugins/specweave/lib/hooks/run-self-reflection.d.js.bak +0 -0
- package/plugins/specweave/lib/hooks/run-self-reflection.d.ts.bak +43 -0
- package/plugins/specweave/lib/hooks/run-self-reflection.js.bak +132 -0
- package/plugins/specweave/lib/hooks/run-self-reflection.ts.bak +258 -0
- package/plugins/specweave/lib/hooks/sync-cache.js.bak +294 -0
- package/plugins/specweave/lib/hooks/sync-living-docs.d.js.bak +1 -0
- package/plugins/specweave/lib/hooks/sync-living-docs.d.ts.bak +27 -0
- package/plugins/specweave/lib/hooks/sync-living-docs.js.bak +339 -0
- package/plugins/specweave/lib/hooks/sync-us-tasks.js.bak +476 -0
- package/plugins/specweave/lib/hooks/translate-file.d.js.bak +0 -0
- package/plugins/specweave/lib/hooks/translate-file.d.ts.bak +59 -0
- package/plugins/specweave/lib/hooks/translate-file.js.bak +289 -0
- package/plugins/specweave/lib/hooks/translate-file.ts.bak +428 -0
- package/plugins/specweave/lib/hooks/translate-living-docs.d.js.bak +0 -0
- package/plugins/specweave/lib/hooks/translate-living-docs.d.ts.bak +13 -0
- package/plugins/specweave/lib/hooks/translate-living-docs.js.bak +119 -0
- package/plugins/specweave/lib/hooks/translate-living-docs.ts.bak +224 -0
- package/plugins/specweave/lib/hooks/update-ac-status.js.bak +51 -0
- package/plugins/specweave/lib/hooks/update-ac-status.ts.bak +103 -0
- package/plugins/specweave/lib/hooks/update-tasks-md.d.js.bak +1 -0
- package/plugins/specweave/lib/hooks/update-tasks-md.d.ts.bak +29 -0
- package/plugins/specweave/lib/hooks/update-tasks-md.js.bak +296 -0
- package/plugins/specweave/lib/hooks/update-tasks-md.ts.bak +489 -0
- package/plugins/specweave-ado/hooks/post-living-docs-update.sh.backup +353 -0
- package/plugins/specweave-ado/hooks/post-task-completion.sh.backup +172 -0
- package/plugins/specweave-ado/lib/ado-multi-project-sync.js +1 -0
- package/plugins/specweave-ado/lib/enhanced-ado-sync.js +170 -0
- package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +424 -0
- package/plugins/specweave-github/hooks/post-task-completion.sh.backup +258 -0
- package/plugins/specweave-jira/hooks/post-task-completion.sh.backup +172 -0
- package/plugins/specweave-jira/lib/enhanced-jira-sync.js +3 -3
- package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +540 -0
- package/plugins/specweave-release/hooks/post-task-completion.sh.backup +110 -0
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* GitLab Provider Implementation
|
|
2
|
+
* GitLab Provider Implementation
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Implements GitProvider interface for GitLab.com and self-hosted GitLab instances.
|
|
5
|
+
* Handles project validation, creation, and management via GitLab API v4.
|
|
6
6
|
*
|
|
7
7
|
* @module providers/gitlab-provider
|
|
8
8
|
*/
|
|
9
9
|
import { BaseGitProvider } from '../git-provider.js';
|
|
10
|
+
import { getActionableError, formatActionableError } from '../git-error-handler.js';
|
|
10
11
|
/**
|
|
11
|
-
* GitLab Provider
|
|
12
|
+
* GitLab Provider
|
|
12
13
|
*
|
|
13
|
-
*
|
|
14
|
+
* Implements Git operations for GitLab platform.
|
|
15
|
+
* Supports both GitLab.com and self-hosted GitLab instances.
|
|
14
16
|
*/
|
|
15
17
|
export class GitLabProvider extends BaseGitProvider {
|
|
16
18
|
constructor(config) {
|
|
@@ -24,43 +26,195 @@ export class GitLabProvider extends BaseGitProvider {
|
|
|
24
26
|
});
|
|
25
27
|
}
|
|
26
28
|
/**
|
|
27
|
-
* Validate
|
|
29
|
+
* Validate if a project exists on GitLab
|
|
28
30
|
*/
|
|
29
31
|
async validateRepository(owner, repo, token) {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
32
|
+
try {
|
|
33
|
+
const headers = {
|
|
34
|
+
'Accept': 'application/json'
|
|
35
|
+
};
|
|
36
|
+
if (token) {
|
|
37
|
+
headers['PRIVATE-TOKEN'] = token;
|
|
38
|
+
}
|
|
39
|
+
// GitLab uses namespace/project format for project IDs
|
|
40
|
+
const projectPath = encodeURIComponent(`${owner}/${repo}`);
|
|
41
|
+
const response = await fetch(this.getApiUrl(`/projects/${projectPath}`), { headers });
|
|
42
|
+
if (response.status === 404) {
|
|
43
|
+
// Project does not exist (good for creation)
|
|
44
|
+
return { exists: false, valid: true };
|
|
45
|
+
}
|
|
46
|
+
if (response.status === 200) {
|
|
47
|
+
// Project already exists
|
|
48
|
+
const data = await response.json();
|
|
49
|
+
return {
|
|
50
|
+
exists: true,
|
|
51
|
+
valid: true,
|
|
52
|
+
url: data.web_url
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
if (response.status === 401 || response.status === 403) {
|
|
56
|
+
// Authentication or permission error
|
|
57
|
+
const apiError = {
|
|
58
|
+
status: response.status,
|
|
59
|
+
message: response.statusText,
|
|
60
|
+
platform: 'gitlab',
|
|
61
|
+
operation: 'validate_repo',
|
|
62
|
+
resourceType: 'project',
|
|
63
|
+
resourceName: `${owner}/${repo}`
|
|
64
|
+
};
|
|
65
|
+
const actionable = getActionableError(apiError);
|
|
66
|
+
return { exists: false, valid: false, error: formatActionableError(actionable) };
|
|
67
|
+
}
|
|
68
|
+
// Other error
|
|
69
|
+
const apiError = {
|
|
70
|
+
status: response.status,
|
|
71
|
+
message: response.statusText,
|
|
72
|
+
platform: 'gitlab',
|
|
73
|
+
operation: 'validate_repo',
|
|
74
|
+
resourceType: 'project',
|
|
75
|
+
resourceName: `${owner}/${repo}`
|
|
76
|
+
};
|
|
77
|
+
const actionable = getActionableError(apiError);
|
|
78
|
+
return {
|
|
79
|
+
exists: false,
|
|
80
|
+
valid: false,
|
|
81
|
+
error: formatActionableError(actionable)
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
return {
|
|
86
|
+
exists: false,
|
|
87
|
+
valid: false,
|
|
88
|
+
error: `Network error: ${error instanceof Error ? error.message : String(error)}`
|
|
89
|
+
};
|
|
90
|
+
}
|
|
46
91
|
}
|
|
47
92
|
/**
|
|
48
|
-
* Validate
|
|
93
|
+
* Validate if a GitLab namespace (user or group) exists
|
|
49
94
|
*/
|
|
50
95
|
async validateOwner(owner, token) {
|
|
51
|
-
|
|
96
|
+
const headers = {
|
|
97
|
+
'Accept': 'application/json'
|
|
98
|
+
};
|
|
99
|
+
if (token) {
|
|
100
|
+
headers['PRIVATE-TOKEN'] = token;
|
|
101
|
+
}
|
|
102
|
+
try {
|
|
103
|
+
// Try as user first
|
|
104
|
+
const userResponse = await fetch(this.getApiUrl(`/users?username=${encodeURIComponent(owner)}`), { headers });
|
|
105
|
+
if (userResponse.status === 200) {
|
|
106
|
+
const users = await userResponse.json();
|
|
107
|
+
if (users.length > 0) {
|
|
108
|
+
return { valid: true, type: 'user' };
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// Try as group
|
|
112
|
+
const groupResponse = await fetch(this.getApiUrl(`/groups/${encodeURIComponent(owner)}`), { headers });
|
|
113
|
+
if (groupResponse.status === 200) {
|
|
114
|
+
return { valid: true, type: 'organization' };
|
|
115
|
+
}
|
|
116
|
+
// Not found
|
|
117
|
+
const apiError = {
|
|
118
|
+
status: 404,
|
|
119
|
+
message: 'Not Found',
|
|
120
|
+
platform: 'gitlab',
|
|
121
|
+
operation: 'validate_owner',
|
|
122
|
+
resourceType: 'namespace',
|
|
123
|
+
resourceName: owner
|
|
124
|
+
};
|
|
125
|
+
const actionable = getActionableError(apiError);
|
|
126
|
+
return { valid: false, error: formatActionableError(actionable) };
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
return {
|
|
130
|
+
valid: false,
|
|
131
|
+
error: `Network error: ${error instanceof Error ? error.message : String(error)}`
|
|
132
|
+
};
|
|
133
|
+
}
|
|
52
134
|
}
|
|
53
135
|
/**
|
|
54
|
-
* Create
|
|
136
|
+
* Create a new project on GitLab
|
|
55
137
|
*/
|
|
56
138
|
async createRepository(options, token) {
|
|
57
|
-
|
|
139
|
+
// Check if it's a group or user namespace
|
|
140
|
+
const isGroup = await this.isOrganization(options.owner, token);
|
|
141
|
+
const payload = {
|
|
142
|
+
name: options.name,
|
|
143
|
+
description: options.description,
|
|
144
|
+
visibility: options.visibility === 'private' ? 'private' :
|
|
145
|
+
options.visibility === 'internal' ? 'internal' : 'public',
|
|
146
|
+
initialize_with_readme: options.autoInit || false,
|
|
147
|
+
issues_enabled: options.hasIssues !== false,
|
|
148
|
+
wiki_enabled: options.hasWiki || false
|
|
149
|
+
};
|
|
150
|
+
// For group projects, specify the namespace_id
|
|
151
|
+
if (isGroup) {
|
|
152
|
+
try {
|
|
153
|
+
const groupResponse = await fetch(this.getApiUrl(`/groups/${encodeURIComponent(options.owner)}`), {
|
|
154
|
+
headers: {
|
|
155
|
+
'PRIVATE-TOKEN': token,
|
|
156
|
+
'Accept': 'application/json'
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
if (groupResponse.ok) {
|
|
160
|
+
const group = await groupResponse.json();
|
|
161
|
+
payload.namespace_id = group.id;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
// Continue without namespace_id, will use user's namespace
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
const response = await fetch(this.getApiUrl('/projects'), {
|
|
169
|
+
method: 'POST',
|
|
170
|
+
headers: {
|
|
171
|
+
'PRIVATE-TOKEN': token,
|
|
172
|
+
'Accept': 'application/json',
|
|
173
|
+
'Content-Type': 'application/json'
|
|
174
|
+
},
|
|
175
|
+
body: JSON.stringify(payload)
|
|
176
|
+
});
|
|
177
|
+
if (!response.ok) {
|
|
178
|
+
const error = await response.json();
|
|
179
|
+
// Handle "already exists" error
|
|
180
|
+
if (error.message?.name?.[0]?.includes('has already been taken')) {
|
|
181
|
+
// Project already exists, return URL
|
|
182
|
+
const host = this.config.customDomain || this.config.host;
|
|
183
|
+
return `https://${host}/${options.owner}/${options.name}`;
|
|
184
|
+
}
|
|
185
|
+
// Handle other errors with actionable messages
|
|
186
|
+
const apiError = {
|
|
187
|
+
status: response.status,
|
|
188
|
+
message: error.message || response.statusText,
|
|
189
|
+
platform: 'gitlab',
|
|
190
|
+
operation: 'create_repo',
|
|
191
|
+
resourceType: 'project',
|
|
192
|
+
resourceName: `${options.owner}/${options.name}`
|
|
193
|
+
};
|
|
194
|
+
const actionable = getActionableError(apiError);
|
|
195
|
+
throw new Error(formatActionableError(actionable));
|
|
196
|
+
}
|
|
197
|
+
const data = await response.json();
|
|
198
|
+
return data.web_url;
|
|
58
199
|
}
|
|
59
200
|
/**
|
|
60
|
-
* Check if
|
|
201
|
+
* Check if a namespace is a group (organization)
|
|
61
202
|
*/
|
|
62
203
|
async isOrganization(account, token) {
|
|
63
|
-
|
|
204
|
+
try {
|
|
205
|
+
const headers = {
|
|
206
|
+
'Accept': 'application/json'
|
|
207
|
+
};
|
|
208
|
+
if (token) {
|
|
209
|
+
headers['PRIVATE-TOKEN'] = token;
|
|
210
|
+
}
|
|
211
|
+
const response = await fetch(this.getApiUrl(`/groups/${encodeURIComponent(account)}`), { headers });
|
|
212
|
+
return response.ok;
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
// Assume user if we can't determine
|
|
216
|
+
return false;
|
|
217
|
+
}
|
|
64
218
|
}
|
|
65
219
|
/**
|
|
66
220
|
* Get token creation URL
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gitlab-provider.js","sourceRoot":"","sources":["../../../../../src/core/repo-structure/providers/gitlab-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,eAAe,EAAsG,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"gitlab-provider.js","sourceRoot":"","sources":["../../../../../src/core/repo-structure/providers/gitlab-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
export { GitHubProvider, createGitHubProvider } from './github-provider.js';
|
|
10
10
|
export { GitLabProvider, createGitLabProvider } from './gitlab-provider.js';
|
|
11
11
|
export { BitbucketProvider, createBitbucketProvider } from './bitbucket-provider.js';
|
|
12
|
+
export { AzureDevOpsProvider, createAzureDevOpsProvider } from './azure-devops-provider.js';
|
|
13
|
+
export { LocalGitProvider, createLocalGitProvider } from './local-provider.js';
|
|
12
14
|
/**
|
|
13
15
|
* Initialize and register all Git providers
|
|
14
16
|
*
|
|
@@ -29,5 +31,5 @@ export declare function resetProviders(): void;
|
|
|
29
31
|
* @param platform - Platform type
|
|
30
32
|
* @returns Provider instance or undefined
|
|
31
33
|
*/
|
|
32
|
-
export declare function getProvider(platform: 'github' | 'gitlab' | 'bitbucket'): import("../git-provider.js").GitProvider;
|
|
34
|
+
export declare function getProvider(platform: 'github' | 'gitlab' | 'bitbucket' | 'azure-devops' | 'local'): import("../git-provider.js").GitProvider;
|
|
33
35
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/repo-structure/providers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/repo-structure/providers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AACrF,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAC5F,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAe/E;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAwB1C;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,cAAc,GAAG,OAAO,4CAGjG"}
|
|
@@ -9,10 +9,14 @@
|
|
|
9
9
|
export { GitHubProvider, createGitHubProvider } from './github-provider.js';
|
|
10
10
|
export { GitLabProvider, createGitLabProvider } from './gitlab-provider.js';
|
|
11
11
|
export { BitbucketProvider, createBitbucketProvider } from './bitbucket-provider.js';
|
|
12
|
+
export { AzureDevOpsProvider, createAzureDevOpsProvider } from './azure-devops-provider.js';
|
|
13
|
+
export { LocalGitProvider, createLocalGitProvider } from './local-provider.js';
|
|
12
14
|
import { getPlatformRegistry } from '../platform-registry.js';
|
|
13
15
|
import { createGitHubProvider } from './github-provider.js';
|
|
14
16
|
import { createGitLabProvider } from './gitlab-provider.js';
|
|
15
17
|
import { createBitbucketProvider } from './bitbucket-provider.js';
|
|
18
|
+
import { createAzureDevOpsProvider } from './azure-devops-provider.js';
|
|
19
|
+
import { createLocalGitProvider } from './local-provider.js';
|
|
16
20
|
/**
|
|
17
21
|
* Track whether providers have been initialized
|
|
18
22
|
* Prevents re-initialization in long-running sessions (Issue #2 fix)
|
|
@@ -34,10 +38,14 @@ export function initializeProviders() {
|
|
|
34
38
|
const registry = getPlatformRegistry();
|
|
35
39
|
// Register GitHub provider (fully supported)
|
|
36
40
|
registry.registerProvider('github', createGitHubProvider());
|
|
37
|
-
// Register GitLab provider (
|
|
41
|
+
// Register GitLab provider (fully supported)
|
|
38
42
|
registry.registerProvider('gitlab', createGitLabProvider());
|
|
39
|
-
// Register Bitbucket provider (
|
|
43
|
+
// Register Bitbucket provider (fully supported)
|
|
40
44
|
registry.registerProvider('bitbucket', createBitbucketProvider());
|
|
45
|
+
// Register Azure DevOps provider (fully supported)
|
|
46
|
+
registry.registerProvider('azure-devops', createAzureDevOpsProvider());
|
|
47
|
+
// Register Local Git provider (fully supported)
|
|
48
|
+
registry.registerProvider('local', createLocalGitProvider());
|
|
41
49
|
providersInitialized = true;
|
|
42
50
|
}
|
|
43
51
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/repo-structure/providers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/repo-structure/providers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AACrF,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAC5F,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAE/E,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAE7D;;;GAGG;AACH,IAAI,oBAAoB,GAAG,KAAK,CAAC;AAEjC;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB;IACjC,8DAA8D;IAC9D,IAAI,oBAAoB,EAAE,CAAC;QACzB,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAC;IAEvC,6CAA6C;IAC7C,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,EAAE,oBAAoB,EAAE,CAAC,CAAC;IAE5D,6CAA6C;IAC7C,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,EAAE,oBAAoB,EAAE,CAAC,CAAC;IAE5D,gDAAgD;IAChD,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,uBAAuB,EAAE,CAAC,CAAC;IAElE,mDAAmD;IACnD,QAAQ,CAAC,gBAAgB,CAAC,cAAc,EAAE,yBAAyB,EAAE,CAAC,CAAC;IAEvE,gDAAgD;IAChD,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAC;IAE7D,oBAAoB,GAAG,IAAI,CAAC;AAC9B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc;IAC5B,oBAAoB,GAAG,KAAK,CAAC;AAC/B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,QAAsE;IAChG,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAC;IACvC,OAAO,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local Git Provider Implementation
|
|
3
|
+
*
|
|
4
|
+
* Implements GitProvider interface for local-only Git repositories.
|
|
5
|
+
* Suitable for repositories without remote hosting (GitHub, GitLab, etc.).
|
|
6
|
+
*
|
|
7
|
+
* @module providers/local-provider
|
|
8
|
+
*/
|
|
9
|
+
import { BaseGitProvider, type PlatformConfig, type RepoValidationResult, type OwnerValidationResult, type CreateRepoOptions } from '../git-provider.js';
|
|
10
|
+
import type { UrlType } from '../url-generator.js';
|
|
11
|
+
/**
|
|
12
|
+
* Local Git Provider
|
|
13
|
+
*
|
|
14
|
+
* Implements Git operations for local-only repositories.
|
|
15
|
+
* Does not require API tokens or remote hosting.
|
|
16
|
+
*/
|
|
17
|
+
export declare class LocalGitProvider extends BaseGitProvider {
|
|
18
|
+
constructor(config?: Partial<PlatformConfig>);
|
|
19
|
+
/**
|
|
20
|
+
* Validate if a local repository exists
|
|
21
|
+
* owner represents the parent directory path
|
|
22
|
+
* repo represents the repository directory name
|
|
23
|
+
*/
|
|
24
|
+
validateRepository(owner: string, repo: string, token?: string): Promise<RepoValidationResult>;
|
|
25
|
+
/**
|
|
26
|
+
* Validate if a local directory (owner) exists
|
|
27
|
+
*/
|
|
28
|
+
validateOwner(owner: string, token?: string): Promise<OwnerValidationResult>;
|
|
29
|
+
/**
|
|
30
|
+
* Create a new local repository
|
|
31
|
+
* Note: This creates a bare directory, not a Git repository.
|
|
32
|
+
* Users should run `git init` separately.
|
|
33
|
+
*/
|
|
34
|
+
createRepository(options: CreateRepoOptions, token: string): Promise<string>;
|
|
35
|
+
/**
|
|
36
|
+
* Local directories are never organizations
|
|
37
|
+
*/
|
|
38
|
+
isOrganization(account: string, token?: string): Promise<boolean>;
|
|
39
|
+
/**
|
|
40
|
+
* Get token creation URL (not applicable for local Git)
|
|
41
|
+
*/
|
|
42
|
+
getTokenUrl(): string;
|
|
43
|
+
/**
|
|
44
|
+
* Get required token scopes (none for local Git)
|
|
45
|
+
*/
|
|
46
|
+
getRequiredScopes(isOrganization?: boolean): string[];
|
|
47
|
+
/**
|
|
48
|
+
* Generate Git remote URL for local repositories
|
|
49
|
+
* Local repos use file:// protocol
|
|
50
|
+
*/
|
|
51
|
+
getRemoteUrl(owner: string, repo: string, urlType: UrlType): string;
|
|
52
|
+
/**
|
|
53
|
+
* Override getAuthHeaders (not needed for local Git)
|
|
54
|
+
*/
|
|
55
|
+
protected getAuthHeaders(token: string): Record<string, string>;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Create a Local Git provider instance
|
|
59
|
+
*/
|
|
60
|
+
export declare function createLocalGitProvider(config?: Partial<PlatformConfig>): LocalGitProvider;
|
|
61
|
+
//# sourceMappingURL=local-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-provider.d.ts","sourceRoot":"","sources":["../../../../../src/core/repo-structure/providers/local-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;AACzJ,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAInD;;;;;GAKG;AACH,qBAAa,gBAAiB,SAAQ,eAAe;gBACvC,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC;IAW5C;;;;OAIG;IACG,kBAAkB,CACtB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,oBAAoB,CAAC;IAqChC;;OAEG;IACG,aAAa,CACjB,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,qBAAqB,CAAC;IAsBjC;;;;OAIG;IACG,gBAAgB,CACpB,OAAO,EAAE,iBAAiB,EAC1B,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,CAAC;IAmBlB;;OAEG;IACG,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIvE;;OAEG;IACH,WAAW,IAAI,MAAM;IAIrB;;OAEG;IACH,iBAAiB,CAAC,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,EAAE;IAIrD;;;OAGG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM;IAKnE;;OAEG;IACH,SAAS,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAGhE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,gBAAgB,CAEzF"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local Git Provider Implementation
|
|
3
|
+
*
|
|
4
|
+
* Implements GitProvider interface for local-only Git repositories.
|
|
5
|
+
* Suitable for repositories without remote hosting (GitHub, GitLab, etc.).
|
|
6
|
+
*
|
|
7
|
+
* @module providers/local-provider
|
|
8
|
+
*/
|
|
9
|
+
import { BaseGitProvider } from '../git-provider.js';
|
|
10
|
+
import { existsSync } from 'fs';
|
|
11
|
+
import { resolve, join } from 'path';
|
|
12
|
+
/**
|
|
13
|
+
* Local Git Provider
|
|
14
|
+
*
|
|
15
|
+
* Implements Git operations for local-only repositories.
|
|
16
|
+
* Does not require API tokens or remote hosting.
|
|
17
|
+
*/
|
|
18
|
+
export class LocalGitProvider extends BaseGitProvider {
|
|
19
|
+
constructor(config) {
|
|
20
|
+
super({
|
|
21
|
+
type: 'custom',
|
|
22
|
+
name: 'Local Git',
|
|
23
|
+
host: 'localhost',
|
|
24
|
+
apiBaseUrl: '',
|
|
25
|
+
selfHosted: true,
|
|
26
|
+
customDomain: config?.customDomain
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Validate if a local repository exists
|
|
31
|
+
* owner represents the parent directory path
|
|
32
|
+
* repo represents the repository directory name
|
|
33
|
+
*/
|
|
34
|
+
async validateRepository(owner, repo, token) {
|
|
35
|
+
try {
|
|
36
|
+
// Resolve the full path
|
|
37
|
+
const repoPath = resolve(owner, repo);
|
|
38
|
+
const gitPath = join(repoPath, '.git');
|
|
39
|
+
// Check if directory exists
|
|
40
|
+
if (!existsSync(repoPath)) {
|
|
41
|
+
return { exists: false, valid: true };
|
|
42
|
+
}
|
|
43
|
+
// Check if it's a Git repository
|
|
44
|
+
const isGitRepo = existsSync(gitPath);
|
|
45
|
+
if (isGitRepo) {
|
|
46
|
+
return {
|
|
47
|
+
exists: true,
|
|
48
|
+
valid: true,
|
|
49
|
+
url: `file://${repoPath}`
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
// Directory exists but is not a Git repository
|
|
54
|
+
return {
|
|
55
|
+
exists: false,
|
|
56
|
+
valid: true
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
return {
|
|
62
|
+
exists: false,
|
|
63
|
+
valid: false,
|
|
64
|
+
error: `File system error: ${error instanceof Error ? error.message : String(error)}`
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Validate if a local directory (owner) exists
|
|
70
|
+
*/
|
|
71
|
+
async validateOwner(owner, token) {
|
|
72
|
+
try {
|
|
73
|
+
const ownerPath = resolve(owner);
|
|
74
|
+
if (!existsSync(ownerPath)) {
|
|
75
|
+
return {
|
|
76
|
+
valid: false,
|
|
77
|
+
error: `Directory does not exist: ${ownerPath}`
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
// Local directories are always treated as "user" type
|
|
81
|
+
return { valid: true, type: 'user' };
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
return {
|
|
85
|
+
valid: false,
|
|
86
|
+
error: `File system error: ${error instanceof Error ? error.message : String(error)}`
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Create a new local repository
|
|
92
|
+
* Note: This creates a bare directory, not a Git repository.
|
|
93
|
+
* Users should run `git init` separately.
|
|
94
|
+
*/
|
|
95
|
+
async createRepository(options, token) {
|
|
96
|
+
const repoPath = resolve(options.owner, options.name);
|
|
97
|
+
// Check if directory already exists
|
|
98
|
+
if (existsSync(repoPath)) {
|
|
99
|
+
return `file://${repoPath}`;
|
|
100
|
+
}
|
|
101
|
+
// Note: We don't actually create the directory here
|
|
102
|
+
// The repository initialization should be done separately with git init
|
|
103
|
+
throw new Error(`Local repository creation requires manual setup:\n` +
|
|
104
|
+
` mkdir -p "${repoPath}"\n` +
|
|
105
|
+
` cd "${repoPath}"\n` +
|
|
106
|
+
` git init\n\n` +
|
|
107
|
+
`SpecWeave does not automatically create local Git repositories.`);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Local directories are never organizations
|
|
111
|
+
*/
|
|
112
|
+
async isOrganization(account, token) {
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Get token creation URL (not applicable for local Git)
|
|
117
|
+
*/
|
|
118
|
+
getTokenUrl() {
|
|
119
|
+
return '';
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Get required token scopes (none for local Git)
|
|
123
|
+
*/
|
|
124
|
+
getRequiredScopes(isOrganization) {
|
|
125
|
+
return [];
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Generate Git remote URL for local repositories
|
|
129
|
+
* Local repos use file:// protocol
|
|
130
|
+
*/
|
|
131
|
+
getRemoteUrl(owner, repo, urlType) {
|
|
132
|
+
const repoPath = resolve(owner, repo);
|
|
133
|
+
return `file://${repoPath}`;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Override getAuthHeaders (not needed for local Git)
|
|
137
|
+
*/
|
|
138
|
+
getAuthHeaders(token) {
|
|
139
|
+
return {};
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Create a Local Git provider instance
|
|
144
|
+
*/
|
|
145
|
+
export function createLocalGitProvider(config) {
|
|
146
|
+
return new LocalGitProvider(config);
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=local-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-provider.js","sourceRoot":"","sources":["../../../../../src/core/repo-structure/providers/local-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
* - Organize specs per project/team
|
|
15
15
|
* - Split tasks between repositories
|
|
16
16
|
*/
|
|
17
|
+
import { type ArchitectureChoice } from './prompt-consolidator.js';
|
|
17
18
|
import type { GitProvider, GitPlatformType } from './git-provider.js';
|
|
18
19
|
export type RepoArchitecture = 'single' | 'multi-repo' | 'monorepo' | 'parent';
|
|
19
20
|
export interface RepoStructureConfig {
|
|
@@ -47,12 +48,21 @@ export declare class RepoStructureManager {
|
|
|
47
48
|
constructor(projectPath: string, githubToken?: string);
|
|
48
49
|
/**
|
|
49
50
|
* Prompt user for repository structure decisions
|
|
51
|
+
*
|
|
52
|
+
* @param preSelectedArchitecture - Optional pre-selected architecture to skip duplicate prompts
|
|
50
53
|
*/
|
|
51
|
-
promptStructure(): Promise<RepoStructureConfig>;
|
|
54
|
+
promptStructure(preSelectedArchitecture?: ArchitectureChoice): Promise<RepoStructureConfig>;
|
|
52
55
|
/**
|
|
53
56
|
* Map ArchitectureChoice to internal RepoArchitecture (2 options)
|
|
54
57
|
*/
|
|
55
58
|
private mapArchitectureChoice;
|
|
59
|
+
/**
|
|
60
|
+
* Format architecture choice for display
|
|
61
|
+
*
|
|
62
|
+
* @param choice - Architecture choice
|
|
63
|
+
* @returns Human-readable format
|
|
64
|
+
*/
|
|
65
|
+
private formatArchitectureForDisplay;
|
|
56
66
|
/**
|
|
57
67
|
* Resume setup from saved state
|
|
58
68
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repo-structure-manager.d.ts","sourceRoot":"","sources":["../../../../src/core/repo-structure/repo-structure-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;
|
|
1
|
+
{"version":3,"file":"repo-structure-manager.d.ts","sourceRoot":"","sources":["../../../../src/core/repo-structure/repo-structure-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAcH,OAAO,EAML,KAAK,kBAAkB,EACxB,MAAM,0BAA0B,CAAC;AAOlC,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGtE,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,YAAY,GAAG,UAAU,GAAG,QAAQ,CAAC;AAE/E,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,gBAAgB,CAAC;IAC/B,OAAO,EAAE,KAAK,GAAG,OAAO,CAAC;IACzB,QAAQ,EAAE,eAAe,CAAC;IAC1B,QAAQ,EAAE,WAAW,CAAC;IACtB,UAAU,CAAC,EAAE;QACX,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,SAAS,GAAG,QAAQ,CAAC;QACjC,cAAc,EAAE,OAAO,CAAC;KACzB,CAAC;IACF,YAAY,EAAE,KAAK,CAAC;QAClB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,SAAS,GAAG,QAAQ,CAAC;QACjC,cAAc,EAAE,OAAO,CAAC;QACxB,QAAQ,EAAE,OAAO,CAAC;KACnB,CAAC,CAAC;IACH,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,YAAY,CAAoB;gBAE5B,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;IASrD;;;;OAIG;IACG,eAAe,CAAC,uBAAuB,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA8GjG;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAW7B;;;;;OAKG;IACH,OAAO,CAAC,4BAA4B;IAWpC;;OAEG;YACW,WAAW;IAgCzB;;OAEG;YACW,mBAAmB;IA8IjC;;;;;;;;;;;OAWG;YACW,kBAAkB;IA+tBhC;;OAEG;YACW,cAAc;IAQ5B;;OAEG;YACW,iBAAiB;IAuF/B;;OAEG;IACG,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAiFpE;;OAEG;YACW,eAAe;IA8C7B;;OAEG;YACW,gBAAgB;IAgC9B;;OAEG;YACW,gBAAgB;IAmC9B;;OAEG;YACW,oBAAoB;IAmBlC;;OAEG;YACW,wBAAwB;IAmBtC;;;OAGG;YACW,qBAAqB;IAmEnC;;OAEG;IACG,oBAAoB,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoEtE;;;;;OAKG;IACH,OAAO,CAAC,wBAAwB;IAyBhC;;;;;OAKG;IACG,wBAAwB,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;CAwC3E"}
|