specweave 0.28.34 → 0.28.42

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.
Files changed (181) hide show
  1. package/CLAUDE.md +21 -0
  2. package/README.md +47 -33
  3. package/bin/specweave.js +2 -1
  4. package/dist/plugins/specweave-github/lib/user-story-issue-builder.js +6 -6
  5. package/dist/plugins/specweave-github/lib/user-story-issue-builder.js.map +1 -1
  6. package/dist/src/cli/commands/archive.d.ts.map +1 -1
  7. package/dist/src/cli/commands/archive.js +2 -1
  8. package/dist/src/cli/commands/archive.js.map +1 -1
  9. package/dist/src/cli/commands/delete-feature.d.ts.map +1 -1
  10. package/dist/src/cli/commands/delete-feature.js +5 -4
  11. package/dist/src/cli/commands/delete-feature.js.map +1 -1
  12. package/dist/src/cli/commands/init.d.ts.map +1 -1
  13. package/dist/src/cli/commands/init.js +33 -0
  14. package/dist/src/cli/commands/init.js.map +1 -1
  15. package/dist/src/cli/helpers/ado-area-selector.d.ts +49 -0
  16. package/dist/src/cli/helpers/ado-area-selector.d.ts.map +1 -0
  17. package/dist/src/cli/helpers/ado-area-selector.js +161 -0
  18. package/dist/src/cli/helpers/ado-area-selector.js.map +1 -0
  19. package/dist/src/cli/helpers/init/config-detection.d.ts +5 -1
  20. package/dist/src/cli/helpers/init/config-detection.d.ts.map +1 -1
  21. package/dist/src/cli/helpers/init/config-detection.js +50 -17
  22. package/dist/src/cli/helpers/init/config-detection.js.map +1 -1
  23. package/dist/src/cli/helpers/init/external-import.d.ts.map +1 -1
  24. package/dist/src/cli/helpers/init/external-import.js +32 -3
  25. package/dist/src/cli/helpers/init/external-import.js.map +1 -1
  26. package/dist/src/cli/helpers/init/repository-setup.d.ts +2 -0
  27. package/dist/src/cli/helpers/init/repository-setup.d.ts.map +1 -1
  28. package/dist/src/cli/helpers/init/repository-setup.js +34 -2
  29. package/dist/src/cli/helpers/init/repository-setup.js.map +1 -1
  30. package/dist/src/cli/helpers/init/types.d.ts +3 -0
  31. package/dist/src/cli/helpers/init/types.d.ts.map +1 -1
  32. package/dist/src/cli/helpers/issue-tracker/ado.d.ts +10 -0
  33. package/dist/src/cli/helpers/issue-tracker/ado.d.ts.map +1 -1
  34. package/dist/src/cli/helpers/issue-tracker/ado.js +107 -22
  35. package/dist/src/cli/helpers/issue-tracker/ado.js.map +1 -1
  36. package/dist/src/cli/helpers/issue-tracker/index.d.ts.map +1 -1
  37. package/dist/src/cli/helpers/issue-tracker/index.js +30 -10
  38. package/dist/src/cli/helpers/issue-tracker/index.js.map +1 -1
  39. package/dist/src/cli/helpers/issue-tracker/types.d.ts +1 -0
  40. package/dist/src/cli/helpers/issue-tracker/types.d.ts.map +1 -1
  41. package/dist/src/cli/helpers/issue-tracker/types.js.map +1 -1
  42. package/dist/src/core/feature-deleter/github-service.js +2 -2
  43. package/dist/src/core/feature-deleter/github-service.js.map +1 -1
  44. package/dist/src/core/increment/discipline-checker.js +1 -1
  45. package/dist/src/core/increment/increment-archiver.d.ts +56 -6
  46. package/dist/src/core/increment/increment-archiver.d.ts.map +1 -1
  47. package/dist/src/core/increment/increment-archiver.js +228 -77
  48. package/dist/src/core/increment/increment-archiver.js.map +1 -1
  49. package/dist/src/core/living-docs/feature-archiver.d.ts.map +1 -1
  50. package/dist/src/core/living-docs/feature-archiver.js +75 -37
  51. package/dist/src/core/living-docs/feature-archiver.js.map +1 -1
  52. package/dist/src/core/living-docs/feature-id-manager.d.ts +6 -0
  53. package/dist/src/core/living-docs/feature-id-manager.d.ts.map +1 -1
  54. package/dist/src/core/living-docs/feature-id-manager.js +54 -8
  55. package/dist/src/core/living-docs/feature-id-manager.js.map +1 -1
  56. package/dist/src/core/living-docs/hierarchy-mapper.d.ts.map +1 -1
  57. package/dist/src/core/living-docs/hierarchy-mapper.js +28 -17
  58. package/dist/src/core/living-docs/hierarchy-mapper.js.map +1 -1
  59. package/dist/src/core/living-docs/living-docs-sync.d.ts +2 -111
  60. package/dist/src/core/living-docs/living-docs-sync.d.ts.map +1 -1
  61. package/dist/src/core/living-docs/living-docs-sync.js +31 -389
  62. package/dist/src/core/living-docs/living-docs-sync.js.map +1 -1
  63. package/dist/src/core/living-docs/sync-helpers/file-utils.d.ts +30 -0
  64. package/dist/src/core/living-docs/sync-helpers/file-utils.d.ts.map +1 -0
  65. package/dist/src/core/living-docs/sync-helpers/file-utils.js +107 -0
  66. package/dist/src/core/living-docs/sync-helpers/file-utils.js.map +1 -0
  67. package/dist/src/core/living-docs/sync-helpers/generators.d.ts +19 -0
  68. package/dist/src/core/living-docs/sync-helpers/generators.d.ts.map +1 -0
  69. package/dist/src/core/living-docs/sync-helpers/generators.js +146 -0
  70. package/dist/src/core/living-docs/sync-helpers/generators.js.map +1 -0
  71. package/dist/src/core/living-docs/sync-helpers/index.d.ts +8 -0
  72. package/dist/src/core/living-docs/sync-helpers/index.d.ts.map +1 -0
  73. package/dist/src/core/living-docs/sync-helpers/index.js +11 -0
  74. package/dist/src/core/living-docs/sync-helpers/index.js.map +1 -0
  75. package/dist/src/core/living-docs/sync-helpers/parsers.d.ts +19 -0
  76. package/dist/src/core/living-docs/sync-helpers/parsers.d.ts.map +1 -0
  77. package/dist/src/core/living-docs/sync-helpers/parsers.js +94 -0
  78. package/dist/src/core/living-docs/sync-helpers/parsers.js.map +1 -0
  79. package/dist/src/core/living-docs/types.d.ts +45 -0
  80. package/dist/src/core/living-docs/types.d.ts.map +1 -1
  81. package/dist/src/core/types/config.d.ts +1 -1
  82. package/dist/src/core/types/config.js +2 -2
  83. package/dist/src/core/types/config.js.map +1 -1
  84. package/dist/src/core/validation/three-file-validator.js +8 -8
  85. package/dist/src/core/validation/three-file-validator.js.map +1 -1
  86. package/dist/src/generators/spec/spec-parser.d.ts.map +1 -1
  87. package/dist/src/generators/spec/spec-parser.js +4 -3
  88. package/dist/src/generators/spec/spec-parser.js.map +1 -1
  89. package/dist/src/generators/spec/task-parser.d.ts.map +1 -1
  90. package/dist/src/generators/spec/task-parser.js +11 -10
  91. package/dist/src/generators/spec/task-parser.js.map +1 -1
  92. package/dist/src/importers/ado-importer.d.ts.map +1 -1
  93. package/dist/src/importers/ado-importer.js +2 -0
  94. package/dist/src/importers/ado-importer.js.map +1 -1
  95. package/dist/src/importers/duplicate-detector.d.ts +5 -2
  96. package/dist/src/importers/duplicate-detector.d.ts.map +1 -1
  97. package/dist/src/importers/duplicate-detector.js +8 -2
  98. package/dist/src/importers/duplicate-detector.js.map +1 -1
  99. package/dist/src/importers/github-importer.d.ts.map +1 -1
  100. package/dist/src/importers/github-importer.js +24 -1
  101. package/dist/src/importers/github-importer.js.map +1 -1
  102. package/dist/src/importers/item-converter.d.ts.map +1 -1
  103. package/dist/src/importers/item-converter.js +27 -3
  104. package/dist/src/importers/item-converter.js.map +1 -1
  105. package/dist/src/living-docs/fs-id-allocator.d.ts +5 -0
  106. package/dist/src/living-docs/fs-id-allocator.d.ts.map +1 -1
  107. package/dist/src/living-docs/fs-id-allocator.js +35 -6
  108. package/dist/src/living-docs/fs-id-allocator.js.map +1 -1
  109. package/dist/src/utils/external-resource-validator.d.ts +5 -192
  110. package/dist/src/utils/external-resource-validator.d.ts.map +1 -1
  111. package/dist/src/utils/external-resource-validator.js +10 -1162
  112. package/dist/src/utils/external-resource-validator.js.map +1 -1
  113. package/dist/src/utils/feature-id-collision.d.ts +70 -0
  114. package/dist/src/utils/feature-id-collision.d.ts.map +1 -0
  115. package/dist/src/utils/feature-id-collision.js +142 -0
  116. package/dist/src/utils/feature-id-collision.js.map +1 -0
  117. package/dist/src/utils/validators/ado-validator.d.ts +86 -0
  118. package/dist/src/utils/validators/ado-validator.d.ts.map +1 -0
  119. package/dist/src/utils/validators/ado-validator.js +528 -0
  120. package/dist/src/utils/validators/ado-validator.js.map +1 -0
  121. package/dist/src/utils/validators/index.d.ts +11 -0
  122. package/dist/src/utils/validators/index.d.ts.map +1 -0
  123. package/dist/src/utils/validators/index.js +12 -0
  124. package/dist/src/utils/validators/index.js.map +1 -0
  125. package/dist/src/utils/validators/jira-validator.d.ts +70 -0
  126. package/dist/src/utils/validators/jira-validator.d.ts.map +1 -0
  127. package/dist/src/utils/validators/jira-validator.js +606 -0
  128. package/dist/src/utils/validators/jira-validator.js.map +1 -0
  129. package/dist/src/utils/validators/types.d.ts +82 -0
  130. package/dist/src/utils/validators/types.d.ts.map +1 -0
  131. package/dist/src/utils/validators/types.js +6 -0
  132. package/dist/src/utils/validators/types.js.map +1 -0
  133. package/package.json +3 -3
  134. package/plugins/specweave/.claude-plugin/plugin.json +7 -62
  135. package/plugins/specweave/commands/specweave-archive.md +3 -3
  136. package/plugins/specweave/commands/specweave-increment.md +18 -19
  137. package/plugins/specweave/hooks/hooks.json +3 -49
  138. package/plugins/specweave/hooks/hooks.json.bak +72 -0
  139. package/plugins/specweave/hooks/hooks.json.v1-backup +16 -0
  140. package/plugins/specweave/hooks/lib/update-status-line.sh +39 -15
  141. package/plugins/specweave/hooks/post-task-edit.sh +10 -0
  142. package/plugins/specweave/hooks/user-prompt-submit.sh +27 -8
  143. package/plugins/specweave/hooks/v2/dispatchers/post-tool-use.sh +44 -0
  144. package/plugins/specweave/hooks/v2/dispatchers/session-start.sh +24 -0
  145. package/plugins/specweave/hooks/v2/handlers/ac-validation-handler.sh +46 -0
  146. package/plugins/specweave/hooks/v2/handlers/github-sync-handler.sh +54 -0
  147. package/plugins/specweave/hooks/v2/handlers/living-docs-handler.sh +46 -0
  148. package/plugins/specweave/hooks/v2/handlers/status-update.sh +50 -0
  149. package/plugins/specweave/hooks/v2/hooks.json +16 -0
  150. package/plugins/specweave/hooks/v2/queue/dequeue.sh +30 -0
  151. package/plugins/specweave/hooks/v2/queue/enqueue.sh +41 -0
  152. package/plugins/specweave/hooks/v2/queue/processor.sh +72 -0
  153. package/plugins/specweave/lib/vendor/generators/spec/task-parser.js +11 -10
  154. package/plugins/specweave/lib/vendor/generators/spec/task-parser.js.map +1 -1
  155. package/plugins/specweave-ado/lib/ado-multi-project-sync.js +0 -1
  156. package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +20 -1262
  157. package/plugins/specweave-github/lib/user-story-issue-builder.js +4 -4
  158. package/plugins/specweave-github/lib/user-story-issue-builder.ts +6 -6
  159. package/plugins/specweave-jira/lib/enhanced-jira-sync.js +3 -3
  160. package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +30 -1254
  161. package/src/templates/tasks.md.template +2 -0
  162. package/plugins/specweave/hooks/docs-changed.sh.backup +0 -79
  163. package/plugins/specweave/hooks/human-input-required.sh.backup +0 -75
  164. package/plugins/specweave/hooks/post-first-increment.sh.backup +0 -61
  165. package/plugins/specweave/hooks/post-increment-change.sh.backup +0 -98
  166. package/plugins/specweave/hooks/post-increment-completion.sh.backup +0 -231
  167. package/plugins/specweave/hooks/post-increment-planning.sh.backup +0 -1048
  168. package/plugins/specweave/hooks/post-increment-status-change.sh.backup +0 -147
  169. package/plugins/specweave/hooks/post-spec-update.sh.backup +0 -158
  170. package/plugins/specweave/hooks/post-user-story-complete.sh.backup +0 -179
  171. package/plugins/specweave/hooks/pre-command-deduplication.sh.backup +0 -83
  172. package/plugins/specweave/hooks/pre-implementation.sh.backup +0 -67
  173. package/plugins/specweave/hooks/pre-task-completion.sh.backup +0 -194
  174. package/plugins/specweave/hooks/pre-tool-use.sh.backup +0 -133
  175. package/plugins/specweave/hooks/user-prompt-submit.sh.backup +0 -386
  176. package/plugins/specweave-ado/hooks/post-living-docs-update.sh.backup +0 -353
  177. package/plugins/specweave-ado/hooks/post-task-completion.sh.backup +0 -172
  178. package/plugins/specweave-ado/lib/enhanced-ado-sync.js +0 -170
  179. package/plugins/specweave-github/hooks/post-task-completion.sh.backup +0 -258
  180. package/plugins/specweave-jira/hooks/post-task-completion.sh.backup +0 -172
  181. package/plugins/specweave-release/hooks/post-task-completion.sh.backup +0 -110
@@ -0,0 +1,528 @@
1
+ /**
2
+ * Azure DevOps Resource Validator
3
+ *
4
+ * Validates and creates Azure DevOps resources (projects, teams, area paths).
5
+ * Split from external-resource-validator.ts for maintainability.
6
+ *
7
+ * @module utils/validators/ado-validator
8
+ */
9
+ import * as fs from '../fs-native.js';
10
+ import { select, input } from '@inquirer/prompts';
11
+ import chalk from 'chalk';
12
+ import { exec } from 'child_process';
13
+ import { promisify } from 'util';
14
+ const execAsync = promisify(exec);
15
+ export class AzureDevOpsResourceValidator {
16
+ constructor(envPath = '.env', options = {}) {
17
+ this.readOnly = options.readOnly ?? false;
18
+ this.envPath = envPath;
19
+ // Derive config.json path from .env path
20
+ const envDir = envPath.replace(/\.env$/, '');
21
+ this.configPath = envDir ? `${envDir}.specweave/config.json` : '.specweave/config.json';
22
+ // Load PAT from .env (secret)
23
+ const env = this.loadEnv();
24
+ this.pat = env.AZURE_DEVOPS_PAT || env.ADO_PAT || '';
25
+ // Load config from config.json (non-secrets)
26
+ const config = this.loadConfig();
27
+ this.organization = config.organization || env.AZURE_DEVOPS_ORG || '';
28
+ this.project = config.project || '';
29
+ this.strategy = config.strategy || 'area-path-based';
30
+ this.teams = config.teams || [];
31
+ this.areaPaths = config.areaPaths || [];
32
+ }
33
+ /**
34
+ * Load .env file
35
+ */
36
+ loadEnv() {
37
+ try {
38
+ if (!fs.existsSync(this.envPath)) {
39
+ return {};
40
+ }
41
+ const content = fs.readFileSync(this.envPath, 'utf-8');
42
+ const env = {};
43
+ content.split('\n').forEach((line) => {
44
+ const match = line.match(/^([^=:#]+)=(.*)$/);
45
+ if (match) {
46
+ const key = match[1].trim();
47
+ const value = match[2].trim();
48
+ env[key] = value;
49
+ }
50
+ });
51
+ return env;
52
+ }
53
+ catch (error) {
54
+ return {};
55
+ }
56
+ }
57
+ /**
58
+ * Load config from .specweave/config.json
59
+ */
60
+ loadConfig() {
61
+ try {
62
+ if (!fs.existsSync(this.configPath)) {
63
+ return {};
64
+ }
65
+ const content = fs.readFileSync(this.configPath, 'utf-8');
66
+ const config = JSON.parse(content);
67
+ // Find ADO profile in sync.profiles
68
+ const profiles = config.sync?.profiles || {};
69
+ const adoProfile = Object.values(profiles).find((p) => p.provider === 'ado');
70
+ if (adoProfile?.config) {
71
+ return {
72
+ organization: adoProfile.config.organization,
73
+ project: adoProfile.config.project,
74
+ strategy: adoProfile.config.strategy,
75
+ teams: adoProfile.config.teams,
76
+ areaPaths: adoProfile.config.areaPaths
77
+ };
78
+ }
79
+ return {};
80
+ }
81
+ catch (error) {
82
+ return {};
83
+ }
84
+ }
85
+ /**
86
+ * Update .env file with new values
87
+ */
88
+ async updateEnv(updates) {
89
+ try {
90
+ let content = '';
91
+ if (fs.existsSync(this.envPath)) {
92
+ content = fs.readFileSync(this.envPath, 'utf-8');
93
+ }
94
+ // Update existing or append new
95
+ Object.entries(updates).forEach(([key, value]) => {
96
+ const regex = new RegExp(`^${key}=.*$`, 'm');
97
+ if (regex.test(content)) {
98
+ content = content.replace(regex, `${key}=${value}`);
99
+ }
100
+ else {
101
+ content += `\n${key}=${value}`;
102
+ }
103
+ });
104
+ fs.writeFileSync(this.envPath, content.trim() + '\n');
105
+ console.log(chalk.green(`✅ Updated ${this.envPath}`));
106
+ }
107
+ catch (error) {
108
+ console.error(chalk.red(`❌ Failed to update ${this.envPath}: ${error.message}`));
109
+ throw error;
110
+ }
111
+ }
112
+ /**
113
+ * Call Azure DevOps API
114
+ */
115
+ async callAzureDevOpsApi(endpoint, method = 'GET', body) {
116
+ const url = `https://dev.azure.com/${this.organization}/_apis/${endpoint}`;
117
+ const auth = Buffer.from(`:${this.pat}`).toString('base64');
118
+ const curlCommand = `curl -s -f -X ${method} \
119
+ -H "Authorization: Basic ${auth}" \
120
+ -H "Content-Type: application/json" \
121
+ ${body ? `-d '${JSON.stringify(body)}'` : ''} \
122
+ "${url}"`;
123
+ try {
124
+ const { stdout } = await execAsync(curlCommand);
125
+ const response = JSON.parse(stdout);
126
+ // Check for error response
127
+ if (response.message || response.errorMessage) {
128
+ throw new Error(response.message || response.errorMessage);
129
+ }
130
+ return response;
131
+ }
132
+ catch (error) {
133
+ // Improve error message for common cases
134
+ if (error.message.includes('curl: (22)')) {
135
+ throw new Error('Resource not found (HTTP 404)');
136
+ }
137
+ throw error;
138
+ }
139
+ }
140
+ /**
141
+ * Fetch all Azure DevOps projects
142
+ */
143
+ async fetchProjects() {
144
+ try {
145
+ const response = await this.callAzureDevOpsApi('projects?api-version=7.0');
146
+ return response.value.map((p) => ({
147
+ id: p.id,
148
+ name: p.name,
149
+ description: p.description || '',
150
+ }));
151
+ }
152
+ catch (error) {
153
+ return [];
154
+ }
155
+ }
156
+ /**
157
+ * Check if project exists
158
+ */
159
+ async checkProject(projectName) {
160
+ try {
161
+ const project = await this.callAzureDevOpsApi(`projects/${encodeURIComponent(projectName)}?api-version=7.0`);
162
+ return {
163
+ id: project.id,
164
+ name: project.name,
165
+ description: project.description || '',
166
+ };
167
+ }
168
+ catch (error) {
169
+ return null;
170
+ }
171
+ }
172
+ /**
173
+ * Create new Azure DevOps project
174
+ */
175
+ async createProject(projectName, description = '') {
176
+ console.log(chalk.blue(`📦 Creating Azure DevOps project: ${projectName}...`));
177
+ const body = {
178
+ name: projectName,
179
+ description: description || `${projectName} project`,
180
+ capabilities: {
181
+ versioncontrol: {
182
+ sourceControlType: 'Git'
183
+ },
184
+ processTemplate: {
185
+ templateTypeId: 'adcc42ab-9882-485e-a3ed-7678f01f66bc' // Agile process template
186
+ }
187
+ }
188
+ };
189
+ try {
190
+ const project = await this.callAzureDevOpsApi('projects?api-version=7.0', 'POST', body);
191
+ // Wait for project creation to complete (ADO creates projects asynchronously)
192
+ await this.waitForProjectCreation(project.id);
193
+ console.log(chalk.green(`✅ Project created: ${projectName} (ID: ${project.id})`));
194
+ return {
195
+ id: project.id,
196
+ name: projectName,
197
+ description: description,
198
+ };
199
+ }
200
+ catch (error) {
201
+ console.error(chalk.red(`❌ Failed to create project: ${error.message}`));
202
+ throw error;
203
+ }
204
+ }
205
+ /**
206
+ * Wait for project creation to complete
207
+ */
208
+ async waitForProjectCreation(projectId, maxAttempts = 10) {
209
+ for (let i = 0; i < maxAttempts; i++) {
210
+ try {
211
+ const operation = await this.callAzureDevOpsApi(`operations/${projectId}?api-version=7.0`);
212
+ if (operation.status === 'succeeded') {
213
+ return;
214
+ }
215
+ if (operation.status === 'failed') {
216
+ throw new Error('Project creation failed');
217
+ }
218
+ // Wait 2 seconds before next check
219
+ await new Promise(resolve => setTimeout(resolve, 2000));
220
+ }
221
+ catch (error) {
222
+ // Operation might not exist yet, continue waiting
223
+ await new Promise(resolve => setTimeout(resolve, 2000));
224
+ }
225
+ }
226
+ // Project creation timeout is not fatal - it might still succeed
227
+ console.log(chalk.yellow('⚠️ Project creation may still be in progress'));
228
+ }
229
+ /**
230
+ * Create area path in project
231
+ */
232
+ async createAreaPath(projectName, areaName) {
233
+ console.log(chalk.blue(` 📦 Creating area path: ${projectName}\\${areaName}...`));
234
+ const body = {
235
+ name: areaName
236
+ };
237
+ try {
238
+ const area = await this.callAzureDevOpsApi(`wit/classificationnodes/areas?projectId=${encodeURIComponent(projectName)}&api-version=7.0`, 'POST', body);
239
+ console.log(chalk.green(` ✅ Area path created: ${projectName}\\${areaName}`));
240
+ return {
241
+ id: area.id,
242
+ name: area.name,
243
+ path: area.path,
244
+ };
245
+ }
246
+ catch (error) {
247
+ console.error(chalk.red(` ❌ Failed to create area path: ${error.message}`));
248
+ throw error;
249
+ }
250
+ }
251
+ /**
252
+ * Fetch teams in project
253
+ */
254
+ async fetchTeams(projectName) {
255
+ try {
256
+ const response = await this.callAzureDevOpsApi(`projects/${encodeURIComponent(projectName)}/teams?api-version=7.0`);
257
+ return response.value.map((t) => ({
258
+ id: t.id,
259
+ name: t.name,
260
+ description: t.description || '',
261
+ }));
262
+ }
263
+ catch (error) {
264
+ return [];
265
+ }
266
+ }
267
+ /**
268
+ * Create team in project
269
+ */
270
+ async createTeam(projectName, teamName) {
271
+ console.log(chalk.blue(` 📦 Creating team: ${teamName}...`));
272
+ const body = {
273
+ name: teamName,
274
+ description: `${teamName} development team`
275
+ };
276
+ try {
277
+ const team = await this.callAzureDevOpsApi(`projects/${encodeURIComponent(projectName)}/teams?api-version=7.0`, 'POST', body);
278
+ console.log(chalk.green(` ✅ Team created: ${teamName}`));
279
+ return {
280
+ id: team.id,
281
+ name: team.name,
282
+ description: team.description || '',
283
+ };
284
+ }
285
+ catch (error) {
286
+ console.error(chalk.red(` ❌ Failed to create team: ${error.message}`));
287
+ throw error;
288
+ }
289
+ }
290
+ /**
291
+ * Validate and fix Azure DevOps configuration
292
+ */
293
+ async validate() {
294
+ console.log(chalk.blue('\n🔍 Validating Azure DevOps configuration...\n'));
295
+ // Use class properties loaded from config.json (constructor already loaded them)
296
+ const strategy = this.strategy;
297
+ const result = {
298
+ valid: true,
299
+ strategy,
300
+ projects: [],
301
+ teams: [],
302
+ areaPaths: [],
303
+ envUpdated: false,
304
+ };
305
+ // Validate PAT is present (only secret in .env)
306
+ if (!this.pat) {
307
+ console.log(chalk.red('❌ AZURE_DEVOPS_PAT not found in .env'));
308
+ result.valid = false;
309
+ return result;
310
+ }
311
+ // Validate organization is present (from config.json)
312
+ if (!this.organization) {
313
+ console.log(chalk.red('❌ Azure DevOps organization not found in config.json'));
314
+ console.log(chalk.gray(' Expected in: .specweave/config.json → sync.profiles.*.config.organization'));
315
+ result.valid = false;
316
+ return result;
317
+ }
318
+ // Determine project names based on strategy (from config.json)
319
+ let projectNames = [];
320
+ if (strategy === 'project-per-team') {
321
+ // Multiple projects - NOT YET SUPPORTED in config.json
322
+ // For now, fall back to single project
323
+ if (!this.project) {
324
+ console.log(chalk.red('❌ Azure DevOps project not found in config.json'));
325
+ console.log(chalk.gray(' Expected in: .specweave/config.json → sync.profiles.*.config.project'));
326
+ result.valid = false;
327
+ return result;
328
+ }
329
+ projectNames = [this.project];
330
+ }
331
+ else {
332
+ // Single project (area-path-based or team-based)
333
+ if (!this.project) {
334
+ console.log(chalk.red('❌ Azure DevOps project not found in config.json'));
335
+ console.log(chalk.gray(' Expected in: .specweave/config.json → sync.profiles.*.config.project'));
336
+ result.valid = false;
337
+ return result;
338
+ }
339
+ projectNames = [this.project];
340
+ }
341
+ console.log(chalk.gray(`Strategy: ${strategy}`));
342
+ console.log(chalk.gray(`Checking project(s): ${projectNames.join(', ')}...\n`));
343
+ // 1. Validate projects
344
+ for (const projectName of projectNames) {
345
+ const project = await this.checkProject(projectName);
346
+ if (!project) {
347
+ console.log(chalk.yellow(`⚠️ Project "${projectName}" not found\n`));
348
+ // Fetch existing projects
349
+ const existingProjects = await this.fetchProjects();
350
+ // Prompt user
351
+ const action = await select({
352
+ message: `What would you like to do for project "${projectName}"?`,
353
+ choices: [
354
+ { name: 'Select an existing project', value: 'select' },
355
+ { name: 'Create a new project', value: 'create' },
356
+ { name: 'Skip this project', value: 'skip' },
357
+ { name: 'Cancel validation', value: 'cancel' },
358
+ ],
359
+ });
360
+ if (action === 'cancel') {
361
+ result.valid = false;
362
+ return result;
363
+ }
364
+ if (action === 'skip') {
365
+ console.log(chalk.yellow(`⏭️ Skipped project "${projectName}"\n`));
366
+ result.projects.push({ name: projectName, exists: false, created: false });
367
+ continue;
368
+ }
369
+ if (action === 'select') {
370
+ const selectedProject = await select({
371
+ message: 'Select a project:',
372
+ choices: existingProjects.map((p) => ({
373
+ name: `${p.name}${p.description ? ` - ${p.description}` : ''}`,
374
+ value: p.name,
375
+ })),
376
+ });
377
+ // Fetch full project details
378
+ const selectedProjectDetails = await this.checkProject(selectedProject);
379
+ if (!selectedProjectDetails) {
380
+ console.log(chalk.red(`❌ Failed to fetch details for project "${selectedProject}"\n`));
381
+ continue;
382
+ }
383
+ // Update .env
384
+ if (strategy === 'project-per-team') {
385
+ const updatedNames = projectNames.map(n => n === projectName ? selectedProject : n);
386
+ await this.updateEnv({ AZURE_DEVOPS_PROJECTS: updatedNames.join(',') });
387
+ }
388
+ else {
389
+ await this.updateEnv({ AZURE_DEVOPS_PROJECT: selectedProject });
390
+ }
391
+ const projectUrl = `https://dev.azure.com/${this.organization}/${encodeURIComponent(selectedProject)}`;
392
+ console.log(chalk.cyan(`🔗 View in Azure DevOps: ${projectUrl}`));
393
+ console.log(chalk.green(`✅ Project "${selectedProject}" selected\n`));
394
+ result.projects.push({
395
+ name: selectedProject,
396
+ id: selectedProjectDetails.id,
397
+ exists: true,
398
+ created: false,
399
+ });
400
+ result.envUpdated = true;
401
+ }
402
+ else if (action === 'create') {
403
+ const description = await input({
404
+ message: 'Enter project description (optional):',
405
+ default: `${projectName} project`,
406
+ });
407
+ const newProject = await this.createProject(projectName, description);
408
+ const projectUrl = `https://dev.azure.com/${this.organization}/${encodeURIComponent(newProject.name)}`;
409
+ console.log(chalk.cyan(`🔗 View in Azure DevOps: ${projectUrl}\n`));
410
+ result.projects.push({
411
+ name: newProject.name,
412
+ id: newProject.id,
413
+ exists: true,
414
+ created: true,
415
+ });
416
+ }
417
+ }
418
+ else {
419
+ console.log(chalk.green(`✅ Validated: Project "${projectName}" exists`));
420
+ const projectUrl = `https://dev.azure.com/${this.organization}/${encodeURIComponent(project.name)}`;
421
+ console.log(chalk.cyan(`🔗 View in Azure DevOps: ${projectUrl}`));
422
+ result.projects.push({
423
+ name: project.name,
424
+ id: project.id,
425
+ exists: true,
426
+ created: false,
427
+ });
428
+ }
429
+ }
430
+ console.log(); // Empty line after project validation
431
+ // 2. Validate area paths (from config.json)
432
+ result.areaPaths = [];
433
+ if (this.areaPaths.length > 0) {
434
+ // CRITICAL FIX: When readOnly=true, skip ALL create operations
435
+ if (this.readOnly) {
436
+ console.log(chalk.gray(`Skipping area path validation (read-only mode)`));
437
+ // Mark all as "exists" without verification - we trust user's selection
438
+ for (const areaName of this.areaPaths) {
439
+ result.areaPaths.push({ name: areaName, exists: true, created: false });
440
+ }
441
+ }
442
+ else {
443
+ console.log(chalk.gray(`Checking area paths from config.json...`));
444
+ const projectName = projectNames[0]; // Single project for now
445
+ for (const areaName of this.areaPaths) {
446
+ try {
447
+ await this.createAreaPath(projectName, areaName);
448
+ result.areaPaths.push({ name: areaName, exists: false, created: true });
449
+ }
450
+ catch (error) {
451
+ if (error.message.includes('already exists')) {
452
+ console.log(chalk.green(` ✅ Area path exists: ${projectName}\\${areaName}`));
453
+ result.areaPaths.push({ name: areaName, exists: true, created: false });
454
+ }
455
+ else {
456
+ console.log(chalk.red(` ❌ Failed to create/validate area path: ${areaName}`));
457
+ result.valid = false;
458
+ }
459
+ }
460
+ }
461
+ }
462
+ console.log();
463
+ }
464
+ // 3. Validate teams (from config.json)
465
+ result.teams = [];
466
+ if (this.teams.length > 0) {
467
+ // CRITICAL FIX: When readOnly=true, skip team create operations
468
+ if (this.readOnly) {
469
+ console.log(chalk.gray(`Skipping team validation (read-only mode)`));
470
+ for (const teamName of this.teams) {
471
+ result.teams.push({ name: teamName, exists: true, created: false });
472
+ }
473
+ }
474
+ else {
475
+ console.log(chalk.gray(`Checking teams from config.json...`));
476
+ const projectName = projectNames[0]; // Single project for now
477
+ const existingTeams = await this.fetchTeams(projectName);
478
+ for (const teamName of this.teams) {
479
+ const team = existingTeams.find(t => t.name === teamName);
480
+ if (team) {
481
+ console.log(chalk.green(` ✅ Team exists: ${teamName}`));
482
+ result.teams.push({ name: teamName, id: team.id, exists: true, created: false });
483
+ }
484
+ else {
485
+ try {
486
+ const newTeam = await this.createTeam(projectName, teamName);
487
+ result.teams.push({ name: teamName, id: newTeam.id, exists: false, created: true });
488
+ }
489
+ catch (error) {
490
+ console.log(chalk.red(` ❌ Failed to create team: ${teamName}`));
491
+ result.valid = false;
492
+ }
493
+ }
494
+ }
495
+ }
496
+ console.log();
497
+ }
498
+ // Summary
499
+ if (result.valid) {
500
+ console.log(chalk.green(`✅ Azure DevOps configuration validated successfully\n`));
501
+ }
502
+ else {
503
+ console.log(chalk.yellow(`⚠️ Some resources could not be validated\n`));
504
+ }
505
+ return result;
506
+ }
507
+ }
508
+ // ============================================================================
509
+ // Utility Functions
510
+ // ============================================================================
511
+ /**
512
+ * Validate Jira resources
513
+ */
514
+ // ============================================================================
515
+ // Utility Functions
516
+ // ============================================================================
517
+ /**
518
+ * Validate Azure DevOps resources
519
+ *
520
+ * @param envPath - Path to .env file
521
+ * @param options - Validation options
522
+ * @param options.readOnly - If true, skip all create operations (for read-only permissions)
523
+ */
524
+ export async function validateAzureDevOpsResources(envPath = '.env', options) {
525
+ const validator = new AzureDevOpsResourceValidator(envPath, options);
526
+ return validator.validate();
527
+ }
528
+ //# sourceMappingURL=ado-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ado-validator.js","sourceRoot":"","sources":["../../../../src/utils/validators/ado-validator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAQjC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAKlC,MAAM,OAAO,4BAA4B;IAWvC,YAAY,UAAkB,MAAM,EAAE,UAAkC,EAAE;QACxE,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,KAAK,CAAC;QAC1C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,yCAAyC;QACzC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,wBAAwB,CAAC,CAAC,CAAC,wBAAwB,CAAC;QAExF,8BAA8B;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC3B,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,gBAAgB,IAAI,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;QAErD,6CAA6C;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QACjC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,GAAG,CAAC,gBAAgB,IAAI,EAAE,CAAC;QACtE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;QACpC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,iBAAiB,CAAC;QACrD,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;QAChC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;IAC1C,CAAC;IAED;;OAEG;IACK,OAAO;QACb,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBACjC,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACvD,MAAM,GAAG,GAA2B,EAAE,CAAC;YAEvC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;gBACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;gBAC7C,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBAC9B,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;gBACnB,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,OAAO,GAAG,CAAC;QACb,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,UAAU;QAChB,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBACpC,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAEnC,oCAAoC;YACpC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,QAAQ,IAAI,EAAE,CAAC;YAC7C,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAC7C,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAC1B,CAAC;YAET,IAAI,UAAU,EAAE,MAAM,EAAE,CAAC;gBACvB,OAAO;oBACL,YAAY,EAAE,UAAU,CAAC,MAAM,CAAC,YAAY;oBAC5C,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,OAAO;oBAClC,QAAQ,EAAE,UAAU,CAAC,MAAM,CAAC,QAAQ;oBACpC,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,KAAK;oBAC9B,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,SAAS;iBACvC,CAAC;YACJ,CAAC;YAED,OAAO,EAAE,CAAC;QACZ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,SAAS,CAAC,OAA+B;QACrD,IAAI,CAAC;YACH,IAAI,OAAO,GAAG,EAAE,CAAC;YACjB,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAChC,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACnD,CAAC;YAED,gCAAgC;YAChC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;gBAC/C,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC;gBAC7C,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;oBACxB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;gBACtD,CAAC;qBAAM,CAAC;oBACN,OAAO,IAAI,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;gBACjC,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACjF,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,kBAAkB,CAAC,QAAgB,EAAE,SAAiB,KAAK,EAAE,IAAU;QACnF,MAAM,GAAG,GAAG,yBAAyB,IAAI,CAAC,YAAY,UAAU,QAAQ,EAAE,CAAC;QAC3E,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAE5D,MAAM,WAAW,GAAG,iBAAiB,MAAM;iCACd,IAAI;;QAE7B,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;SACzC,GAAG,GAAG,CAAC;QAEZ,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,CAAC;YAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAEpC,2BAA2B;YAC3B,IAAI,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;gBAC9C,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,YAAY,CAAC,CAAC;YAC7D,CAAC;YAED,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,yCAAyC;YACzC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;gBACzC,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;YACnD,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa;QACjB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,0BAA0B,CAAC,CAAC;YAC3E,OAAO,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;gBACrC,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,EAAE;aACjC,CAAC,CAAC,CAAC;QACN,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,WAAmB;QACpC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,YAAY,kBAAkB,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC;YAC7G,OAAO;gBACL,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,EAAE;aACvC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,WAAmB,EAAE,cAAsB,EAAE;QAC/D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qCAAqC,WAAW,KAAK,CAAC,CAAC,CAAC;QAE/E,MAAM,IAAI,GAAG;YACX,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,WAAW,IAAI,GAAG,WAAW,UAAU;YACpD,YAAY,EAAE;gBACZ,cAAc,EAAE;oBACd,iBAAiB,EAAE,KAAK;iBACzB;gBACD,eAAe,EAAE;oBACf,cAAc,EAAE,sCAAsC,CAAC,yBAAyB;iBACjF;aACF;SACF,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,0BAA0B,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;YAExF,8EAA8E;YAC9E,MAAM,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAE9C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,sBAAsB,WAAW,SAAS,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YAClF,OAAO;gBACL,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,IAAI,EAAE,WAAW;gBACjB,WAAW,EAAE,WAAW;aACzB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,+BAA+B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACzE,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,sBAAsB,CAAC,SAAiB,EAAE,cAAsB,EAAE;QAC9E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,cAAc,SAAS,kBAAkB,CAAC,CAAC;gBAC3F,IAAI,SAAS,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;oBACrC,OAAO;gBACT,CAAC;gBACD,IAAI,SAAS,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;oBAClC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;gBAC7C,CAAC;gBACD,mCAAmC;gBACnC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;YAC1D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,kDAAkD;gBAClD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QACD,iEAAiE;QACjE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,+CAA+C,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,WAAmB,EAAE,QAAgB;QACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4BAA4B,WAAW,KAAK,QAAQ,KAAK,CAAC,CAAC,CAAC;QAEnF,MAAM,IAAI,GAAG;YACX,IAAI,EAAE,QAAQ;SACf,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,kBAAkB,CACxC,2CAA2C,kBAAkB,CAAC,WAAW,CAAC,kBAAkB,EAC5F,MAAM,EACN,IAAI,CACL,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,0BAA0B,WAAW,KAAK,QAAQ,EAAE,CAAC,CAAC,CAAC;YAC/E,OAAO;gBACL,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,IAAI,CAAC,IAAI;aAChB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,mCAAmC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC7E,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,WAAmB;QAClC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAC5C,YAAY,kBAAkB,CAAC,WAAW,CAAC,wBAAwB,CACpE,CAAC;YACF,OAAO,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;gBACrC,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,EAAE;aACjC,CAAC,CAAC,CAAC;QACN,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,WAAmB,EAAE,QAAgB;QACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,QAAQ,KAAK,CAAC,CAAC,CAAC;QAE9D,MAAM,IAAI,GAAG;YACX,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,GAAG,QAAQ,mBAAmB;SAC5C,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,kBAAkB,CACxC,YAAY,kBAAkB,CAAC,WAAW,CAAC,wBAAwB,EACnE,MAAM,EACN,IAAI,CACL,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC,CAAC;YAC1D,OAAO;gBACL,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;aACpC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACxE,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ;QACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC,CAAC;QAE3E,iFAAiF;QACjF,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAe,CAAC;QAEtC,MAAM,MAAM,GAAgC;YAC1C,KAAK,EAAE,IAAI;YACX,QAAQ;YACR,QAAQ,EAAE,EAAE;YACZ,KAAK,EAAE,EAAE;YACT,SAAS,EAAE,EAAE;YACb,UAAU,EAAE,KAAK;SAClB,CAAC;QAEF,gDAAgD;QAChD,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC,CAAC;YAC/D,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;YACrB,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,sDAAsD;QACtD,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC,CAAC;YAC/E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8EAA8E,CAAC,CAAC,CAAC;YACxG,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;YACrB,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,+DAA+D;QAC/D,IAAI,YAAY,GAAa,EAAE,CAAC;QAEhC,IAAI,QAAQ,KAAK,kBAAkB,EAAE,CAAC;YACpC,uDAAuD;YACvD,uCAAuC;YACvC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC,CAAC;gBAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAC,CAAC;gBACnG,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;gBACrB,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,YAAY,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,iDAAiD;YACjD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC,CAAC;gBAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAC,CAAC;gBACnG,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;gBACrB,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,YAAY,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,QAAQ,EAAE,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QAEhF,uBAAuB;QACvB,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;YACvC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;YAErD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,WAAW,eAAe,CAAC,CAAC,CAAC;gBAEtE,0BAA0B;gBAC1B,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;gBAEpD,cAAc;gBACd,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC;oBAC1B,OAAO,EAAE,0CAA0C,WAAW,IAAI;oBAClE,OAAO,EAAE;wBACP,EAAE,IAAI,EAAE,4BAA4B,EAAE,KAAK,EAAE,QAAQ,EAAE;wBACvD,EAAE,IAAI,EAAE,sBAAsB,EAAE,KAAK,EAAE,QAAQ,EAAE;wBACjD,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,EAAE;wBAC5C,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,QAAQ,EAAE;qBAC/C;iBACF,CAAC,CAAC;gBAEH,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;oBACxB,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;oBACrB,OAAO,MAAM,CAAC;gBAChB,CAAC;gBAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;oBACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,wBAAwB,WAAW,KAAK,CAAC,CAAC,CAAC;oBACpE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;oBAC3E,SAAS;gBACX,CAAC;gBAED,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;oBACxB,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC;wBACnC,OAAO,EAAE,mBAAmB;wBAC5B,OAAO,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;4BACpC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;4BAC9D,KAAK,EAAE,CAAC,CAAC,IAAI;yBACd,CAAC,CAAC;qBACJ,CAAC,CAAC;oBAEH,6BAA6B;oBAC7B,MAAM,sBAAsB,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;oBACxE,IAAI,CAAC,sBAAsB,EAAE,CAAC;wBAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0CAA0C,eAAe,KAAK,CAAC,CAAC,CAAC;wBACvF,SAAS;oBACX,CAAC;oBAED,cAAc;oBACd,IAAI,QAAQ,KAAK,kBAAkB,EAAE,CAAC;wBACpC,MAAM,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBACpF,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,qBAAqB,EAAE,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAC1E,CAAC;yBAAM,CAAC;wBACN,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,oBAAoB,EAAE,eAAe,EAAE,CAAC,CAAC;oBAClE,CAAC;oBAED,MAAM,UAAU,GAAG,yBAAyB,IAAI,CAAC,YAAY,IAAI,kBAAkB,CAAC,eAAe,CAAC,EAAE,CAAC;oBACvG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4BAA4B,UAAU,EAAE,CAAC,CAAC,CAAC;oBAClE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,eAAe,cAAc,CAAC,CAAC,CAAC;oBAEtE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;wBACnB,IAAI,EAAE,eAAe;wBACrB,EAAE,EAAE,sBAAsB,CAAC,EAAE;wBAC7B,MAAM,EAAE,IAAI;wBACZ,OAAO,EAAE,KAAK;qBACf,CAAC,CAAC;oBACH,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC;gBAC3B,CAAC;qBAAM,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;oBAC/B,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC;wBAC9B,OAAO,EAAE,uCAAuC;wBAChD,OAAO,EAAE,GAAG,WAAW,UAAU;qBAClC,CAAC,CAAC;oBAEH,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;oBAEtE,MAAM,UAAU,GAAG,yBAAyB,IAAI,CAAC,YAAY,IAAI,kBAAkB,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;oBACvG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4BAA4B,UAAU,IAAI,CAAC,CAAC,CAAC;oBAEpE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;wBACnB,IAAI,EAAE,UAAU,CAAC,IAAI;wBACrB,EAAE,EAAE,UAAU,CAAC,EAAE;wBACjB,MAAM,EAAE,IAAI;wBACZ,OAAO,EAAE,IAAI;qBACd,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,yBAAyB,WAAW,UAAU,CAAC,CAAC,CAAC;gBAEzE,MAAM,UAAU,GAAG,yBAAyB,IAAI,CAAC,YAAY,IAAI,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4BAA4B,UAAU,EAAE,CAAC,CAAC,CAAC;gBAElE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;oBACnB,IAAI,EAAE,OAAO,CAAC,IAAI;oBAClB,EAAE,EAAE,OAAO,CAAC,EAAE;oBACd,MAAM,EAAE,IAAI;oBACZ,OAAO,EAAE,KAAK;iBACf,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,sCAAsC;QAErD,4CAA4C;QAC5C,MAAM,CAAC,SAAS,GAAG,EAAE,CAAC;QAEtB,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,+DAA+D;YAC/D,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC,CAAC;gBAC1E,wEAAwE;gBACxE,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;oBACtC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC1E,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC,CAAC;gBAEnE,MAAM,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,yBAAyB;gBAE9D,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;oBACtC,IAAI,CAAC;wBACH,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;wBACjD,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC1E,CAAC;oBAAC,OAAO,KAAU,EAAE,CAAC;wBACpB,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;4BAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,yBAAyB,WAAW,KAAK,QAAQ,EAAE,CAAC,CAAC,CAAC;4BAC9E,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;wBAC1E,CAAC;6BAAM,CAAC;4BACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,4CAA4C,QAAQ,EAAE,CAAC,CAAC,CAAC;4BAC/E,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;wBACvB,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAED,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;QAED,uCAAuC;QACvC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC;QAElB,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,gEAAgE;YAChE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC,CAAC;gBACrE,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;oBAClC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;gBACtE,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC,CAAC;gBAE9D,MAAM,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,yBAAyB;gBAC9D,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;gBAEzD,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;oBAClC,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;oBAE1D,IAAI,IAAI,EAAE,CAAC;wBACT,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,oBAAoB,QAAQ,EAAE,CAAC,CAAC,CAAC;wBACzD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;oBACnF,CAAC;yBAAM,CAAC;wBACN,IAAI,CAAC;4BACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;4BAC7D,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;wBACtF,CAAC;wBAAC,OAAO,KAAU,EAAE,CAAC;4BACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,QAAQ,EAAE,CAAC,CAAC,CAAC;4BACjE,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;wBACvB,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAED,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;QAED,UAAU;QACV,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC,CAAC;QACpF,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,6CAA6C,CAAC,CAAC,CAAC;QAC3E,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E;;GAEG;AAEH,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,UAAkB,MAAM,EACxB,OAAgC;IAEhC,MAAM,SAAS,GAAG,IAAI,4BAA4B,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACrE,OAAO,SAAS,CAAC,QAAQ,EAAE,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * External Resource Validators
3
+ *
4
+ * Barrel export for validator modules.
5
+ *
6
+ * @module utils/validators
7
+ */
8
+ export type { JiraProject, JiraBoard, JiraValidationResult, AzureDevOpsProject, AzureDevOpsTeam, AzureDevOpsAreaPath, AzureDevOpsProjectResult, AzureDevOpsAreaPathResult, AzureDevOpsTeamResult, AzureDevOpsValidationResult, } from './types.js';
9
+ export { JiraResourceValidator, validateJiraResources } from './jira-validator.js';
10
+ export { AzureDevOpsResourceValidator, validateAzureDevOpsResources } from './ado-validator.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/utils/validators/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,YAAY,EACV,WAAW,EACX,SAAS,EACT,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,EACf,mBAAmB,EACnB,wBAAwB,EACxB,yBAAyB,EACzB,qBAAqB,EACrB,2BAA2B,GAC5B,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAGnF,OAAO,EAAE,4BAA4B,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * External Resource Validators
3
+ *
4
+ * Barrel export for validator modules.
5
+ *
6
+ * @module utils/validators
7
+ */
8
+ // Jira Validator
9
+ export { JiraResourceValidator, validateJiraResources } from './jira-validator.js';
10
+ // Azure DevOps Validator
11
+ export { AzureDevOpsResourceValidator, validateAzureDevOpsResources } from './ado-validator.js';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/utils/validators/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAgBH,iBAAiB;AACjB,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAEnF,yBAAyB;AACzB,OAAO,EAAE,4BAA4B,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Jira Resource Validator
3
+ *
4
+ * Validates and creates Jira resources (projects, boards).
5
+ * Split from external-resource-validator.ts for maintainability.
6
+ *
7
+ * @module utils/validators/jira-validator
8
+ */
9
+ import type { JiraProject, JiraBoard, JiraValidationResult } from './types.js';
10
+ export type { JiraProject, JiraBoard, JiraValidationResult };
11
+ export declare class JiraResourceValidator {
12
+ private apiToken;
13
+ private email;
14
+ private domain;
15
+ private envPath;
16
+ constructor(envPath?: string);
17
+ /**
18
+ * Load .env file
19
+ */
20
+ private loadEnv;
21
+ /**
22
+ * Update .env file with new values
23
+ */
24
+ private updateEnv;
25
+ /**
26
+ * Call Jira API
27
+ */
28
+ private callJiraApi;
29
+ /**
30
+ * Fetch all Jira projects
31
+ */
32
+ fetchProjects(): Promise<JiraProject[]>;
33
+ /**
34
+ * Check if project exists
35
+ */
36
+ checkProject(projectKey: string): Promise<JiraProject | null>;
37
+ /**
38
+ * Create new Jira project
39
+ */
40
+ createProject(projectKey: string, projectName: string): Promise<JiraProject>;
41
+ /**
42
+ * Get current user ID (for project lead)
43
+ */
44
+ private getCurrentUserId;
45
+ /**
46
+ * Fetch all boards for a project
47
+ */
48
+ fetchBoards(projectKey: string): Promise<JiraBoard[]>;
49
+ /**
50
+ * Check if board exists by ID
51
+ */
52
+ checkBoard(boardId: number): Promise<JiraBoard | null>;
53
+ /**
54
+ * Create new Jira board
55
+ */
56
+ createBoard(boardName: string, projectKey: string): Promise<JiraBoard>;
57
+ /**
58
+ * Get or create filter for board
59
+ */
60
+ private getOrCreateFilter;
61
+ /**
62
+ * Validate and fix Jira configuration
63
+ */
64
+ validate(): Promise<JiraValidationResult>;
65
+ }
66
+ /**
67
+ * Validate Jira resources
68
+ */
69
+ export declare function validateJiraResources(envPath?: string): Promise<JiraValidationResult>;
70
+ //# sourceMappingURL=jira-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jira-validator.d.ts","sourceRoot":"","sources":["../../../../src/utils/validators/jira-validator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAK/E,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,oBAAoB,EAAE,CAAC;AAE7D,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,GAAE,MAAe;IASpC;;OAEG;IACH,OAAO,CAAC,OAAO;IAwBf;;OAEG;YACW,SAAS;IAyBvB;;OAEG;YACW,WAAW;IA8BzB;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAa7C;;OAEG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAanE;;OAEG;IACG,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAwBlF;;OAEG;YACW,gBAAgB;IAS9B;;OAEG;IACG,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAa3D;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IA8B5D;;OAEG;IACG,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IA2B5E;;OAEG;YACW,iBAAiB;IAgB/B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,oBAAoB,CAAC;CAiXhD;AAMD;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,GAAE,MAAe,GACvB,OAAO,CAAC,oBAAoB,CAAC,CAG/B"}