specweave 0.28.36 → 0.28.45

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 (144) hide show
  1. package/CLAUDE.md +21 -0
  2. package/README.md +10 -9
  3. package/bin/specweave.js +2 -1
  4. package/dist/src/cli/commands/archive.d.ts.map +1 -1
  5. package/dist/src/cli/commands/archive.js +2 -1
  6. package/dist/src/cli/commands/archive.js.map +1 -1
  7. package/dist/src/cli/commands/init.d.ts.map +1 -1
  8. package/dist/src/cli/commands/init.js +33 -0
  9. package/dist/src/cli/commands/init.js.map +1 -1
  10. package/dist/src/cli/helpers/ado-area-selector.d.ts +49 -0
  11. package/dist/src/cli/helpers/ado-area-selector.d.ts.map +1 -0
  12. package/dist/src/cli/helpers/ado-area-selector.js +162 -0
  13. package/dist/src/cli/helpers/ado-area-selector.js.map +1 -0
  14. package/dist/src/cli/helpers/init/config-detection.d.ts +5 -1
  15. package/dist/src/cli/helpers/init/config-detection.d.ts.map +1 -1
  16. package/dist/src/cli/helpers/init/config-detection.js +50 -17
  17. package/dist/src/cli/helpers/init/config-detection.js.map +1 -1
  18. package/dist/src/cli/helpers/init/external-import.js +3 -3
  19. package/dist/src/cli/helpers/init/external-import.js.map +1 -1
  20. package/dist/src/cli/helpers/init/repository-setup.d.ts +2 -0
  21. package/dist/src/cli/helpers/init/repository-setup.d.ts.map +1 -1
  22. package/dist/src/cli/helpers/init/repository-setup.js +34 -2
  23. package/dist/src/cli/helpers/init/repository-setup.js.map +1 -1
  24. package/dist/src/cli/helpers/init/types.d.ts +3 -0
  25. package/dist/src/cli/helpers/init/types.d.ts.map +1 -1
  26. package/dist/src/cli/helpers/issue-tracker/ado.d.ts +17 -0
  27. package/dist/src/cli/helpers/issue-tracker/ado.d.ts.map +1 -1
  28. package/dist/src/cli/helpers/issue-tracker/ado.js +308 -44
  29. package/dist/src/cli/helpers/issue-tracker/ado.js.map +1 -1
  30. package/dist/src/cli/helpers/issue-tracker/index.d.ts.map +1 -1
  31. package/dist/src/cli/helpers/issue-tracker/index.js +103 -35
  32. package/dist/src/cli/helpers/issue-tracker/index.js.map +1 -1
  33. package/dist/src/cli/helpers/issue-tracker/types.d.ts +26 -2
  34. package/dist/src/cli/helpers/issue-tracker/types.d.ts.map +1 -1
  35. package/dist/src/cli/helpers/issue-tracker/types.js.map +1 -1
  36. package/dist/src/core/increment/discipline-checker.js +1 -1
  37. package/dist/src/core/increment/increment-archiver.d.ts +13 -0
  38. package/dist/src/core/increment/increment-archiver.d.ts.map +1 -1
  39. package/dist/src/core/increment/increment-archiver.js +60 -3
  40. package/dist/src/core/increment/increment-archiver.js.map +1 -1
  41. package/dist/src/core/living-docs/feature-archiver.d.ts.map +1 -1
  42. package/dist/src/core/living-docs/feature-archiver.js +75 -37
  43. package/dist/src/core/living-docs/feature-archiver.js.map +1 -1
  44. package/dist/src/core/living-docs/living-docs-sync.d.ts +2 -111
  45. package/dist/src/core/living-docs/living-docs-sync.d.ts.map +1 -1
  46. package/dist/src/core/living-docs/living-docs-sync.js +18 -383
  47. package/dist/src/core/living-docs/living-docs-sync.js.map +1 -1
  48. package/dist/src/core/living-docs/sync-helpers/file-utils.d.ts +30 -0
  49. package/dist/src/core/living-docs/sync-helpers/file-utils.d.ts.map +1 -0
  50. package/dist/src/core/living-docs/sync-helpers/file-utils.js +107 -0
  51. package/dist/src/core/living-docs/sync-helpers/file-utils.js.map +1 -0
  52. package/dist/src/core/living-docs/sync-helpers/generators.d.ts +19 -0
  53. package/dist/src/core/living-docs/sync-helpers/generators.d.ts.map +1 -0
  54. package/dist/src/core/living-docs/sync-helpers/generators.js +146 -0
  55. package/dist/src/core/living-docs/sync-helpers/generators.js.map +1 -0
  56. package/dist/src/core/living-docs/sync-helpers/index.d.ts +8 -0
  57. package/dist/src/core/living-docs/sync-helpers/index.d.ts.map +1 -0
  58. package/dist/src/core/living-docs/sync-helpers/index.js +11 -0
  59. package/dist/src/core/living-docs/sync-helpers/index.js.map +1 -0
  60. package/dist/src/core/living-docs/sync-helpers/parsers.d.ts +19 -0
  61. package/dist/src/core/living-docs/sync-helpers/parsers.d.ts.map +1 -0
  62. package/dist/src/core/living-docs/sync-helpers/parsers.js +94 -0
  63. package/dist/src/core/living-docs/sync-helpers/parsers.js.map +1 -0
  64. package/dist/src/core/living-docs/types.d.ts +45 -0
  65. package/dist/src/core/living-docs/types.d.ts.map +1 -1
  66. package/dist/src/core/types/config.d.ts +1 -1
  67. package/dist/src/core/types/config.js +2 -2
  68. package/dist/src/core/types/config.js.map +1 -1
  69. package/dist/src/importers/ado-importer.d.ts.map +1 -1
  70. package/dist/src/importers/ado-importer.js +3 -0
  71. package/dist/src/importers/ado-importer.js.map +1 -1
  72. package/dist/src/importers/item-converter.d.ts.map +1 -1
  73. package/dist/src/importers/item-converter.js +10 -2
  74. package/dist/src/importers/item-converter.js.map +1 -1
  75. package/dist/src/living-docs/fs-id-allocator.d.ts +5 -0
  76. package/dist/src/living-docs/fs-id-allocator.d.ts.map +1 -1
  77. package/dist/src/living-docs/fs-id-allocator.js +31 -2
  78. package/dist/src/living-docs/fs-id-allocator.js.map +1 -1
  79. package/dist/src/utils/external-resource-validator.d.ts +5 -192
  80. package/dist/src/utils/external-resource-validator.d.ts.map +1 -1
  81. package/dist/src/utils/external-resource-validator.js +10 -1162
  82. package/dist/src/utils/external-resource-validator.js.map +1 -1
  83. package/dist/src/utils/validators/ado-validator.d.ts +94 -0
  84. package/dist/src/utils/validators/ado-validator.d.ts.map +1 -0
  85. package/dist/src/utils/validators/ado-validator.js +547 -0
  86. package/dist/src/utils/validators/ado-validator.js.map +1 -0
  87. package/dist/src/utils/validators/index.d.ts +11 -0
  88. package/dist/src/utils/validators/index.d.ts.map +1 -0
  89. package/dist/src/utils/validators/index.js +12 -0
  90. package/dist/src/utils/validators/index.js.map +1 -0
  91. package/dist/src/utils/validators/jira-validator.d.ts +70 -0
  92. package/dist/src/utils/validators/jira-validator.d.ts.map +1 -0
  93. package/dist/src/utils/validators/jira-validator.js +606 -0
  94. package/dist/src/utils/validators/jira-validator.js.map +1 -0
  95. package/dist/src/utils/validators/types.d.ts +82 -0
  96. package/dist/src/utils/validators/types.d.ts.map +1 -0
  97. package/dist/src/utils/validators/types.js +6 -0
  98. package/dist/src/utils/validators/types.js.map +1 -0
  99. package/package.json +1 -1
  100. package/plugins/specweave/.claude-plugin/plugin.json +7 -62
  101. package/plugins/specweave/commands/specweave-archive.md +3 -3
  102. package/plugins/specweave/commands/specweave-increment.md +18 -19
  103. package/plugins/specweave/hooks/hooks.json +3 -49
  104. package/plugins/specweave/hooks/hooks.json.bak +72 -0
  105. package/plugins/specweave/hooks/hooks.json.v1-backup +16 -0
  106. package/plugins/specweave/hooks/lib/update-status-line.sh +39 -15
  107. package/plugins/specweave/hooks/post-task-edit.sh +10 -0
  108. package/plugins/specweave/hooks/user-prompt-submit.sh +27 -8
  109. package/plugins/specweave/hooks/v2/dispatchers/post-tool-use.sh +44 -0
  110. package/plugins/specweave/hooks/v2/dispatchers/session-start.sh +24 -0
  111. package/plugins/specweave/hooks/v2/handlers/ac-validation-handler.sh +46 -0
  112. package/plugins/specweave/hooks/v2/handlers/github-sync-handler.sh +54 -0
  113. package/plugins/specweave/hooks/v2/handlers/living-docs-handler.sh +46 -0
  114. package/plugins/specweave/hooks/v2/handlers/status-update.sh +50 -0
  115. package/plugins/specweave/hooks/v2/hooks.json +16 -0
  116. package/plugins/specweave/hooks/v2/queue/dequeue.sh +30 -0
  117. package/plugins/specweave/hooks/v2/queue/enqueue.sh +41 -0
  118. package/plugins/specweave/hooks/v2/queue/processor.sh +72 -0
  119. package/plugins/specweave-ado/lib/ado-multi-project-sync.js +0 -1
  120. package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +20 -1262
  121. package/plugins/specweave-jira/lib/enhanced-jira-sync.js +3 -3
  122. package/plugins/specweave-release/commands/specweave-release-npm.md +132 -24
  123. package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +30 -1254
  124. package/src/templates/tasks.md.template +2 -0
  125. package/plugins/specweave/hooks/docs-changed.sh.backup +0 -79
  126. package/plugins/specweave/hooks/human-input-required.sh.backup +0 -75
  127. package/plugins/specweave/hooks/post-first-increment.sh.backup +0 -61
  128. package/plugins/specweave/hooks/post-increment-change.sh.backup +0 -98
  129. package/plugins/specweave/hooks/post-increment-completion.sh.backup +0 -231
  130. package/plugins/specweave/hooks/post-increment-planning.sh.backup +0 -1048
  131. package/plugins/specweave/hooks/post-increment-status-change.sh.backup +0 -147
  132. package/plugins/specweave/hooks/post-spec-update.sh.backup +0 -158
  133. package/plugins/specweave/hooks/post-user-story-complete.sh.backup +0 -179
  134. package/plugins/specweave/hooks/pre-command-deduplication.sh.backup +0 -83
  135. package/plugins/specweave/hooks/pre-implementation.sh.backup +0 -67
  136. package/plugins/specweave/hooks/pre-task-completion.sh.backup +0 -194
  137. package/plugins/specweave/hooks/pre-tool-use.sh.backup +0 -133
  138. package/plugins/specweave/hooks/user-prompt-submit.sh.backup +0 -386
  139. package/plugins/specweave-ado/hooks/post-living-docs-update.sh.backup +0 -353
  140. package/plugins/specweave-ado/hooks/post-task-completion.sh.backup +0 -172
  141. package/plugins/specweave-ado/lib/enhanced-ado-sync.js +0 -170
  142. package/plugins/specweave-github/hooks/post-task-completion.sh.backup +0 -258
  143. package/plugins/specweave-jira/hooks/post-task-completion.sh.backup +0 -172
  144. package/plugins/specweave-release/hooks/post-task-completion.sh.backup +0 -110
@@ -0,0 +1,547 @@
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
+ // NOTE: readOnly option removed - validation is ALWAYS read-only now (no create operations)
17
+ constructor(envPath = '.env', _options = {}) {
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
+ * Check if area path exists in project (GET-only, no create)
231
+ *
232
+ * @param projectName - Project name
233
+ * @param areaPath - Full area path (e.g., "OlySense\\Platform-Engineering") or leaf name
234
+ * @returns Area path info if exists, null otherwise
235
+ */
236
+ async checkAreaPathExists(projectName, areaPath) {
237
+ // Extract leaf name if full path is provided (handles "OlySense\Platform-Engineering" -> "Platform-Engineering")
238
+ const leafName = areaPath.includes('\\') ? areaPath.split('\\').pop() : areaPath;
239
+ try {
240
+ // Fetch all area paths for the project
241
+ const response = await this.callAzureDevOpsApi(`wit/classificationnodes/areas/${encodeURIComponent(projectName)}?$depth=10&api-version=7.0`);
242
+ // Search for matching area path in the tree
243
+ const findAreaPath = (node, searchName) => {
244
+ if (node.name === searchName) {
245
+ return node;
246
+ }
247
+ if (node.children) {
248
+ for (const child of node.children) {
249
+ const found = findAreaPath(child, searchName);
250
+ if (found)
251
+ return found;
252
+ }
253
+ }
254
+ return null;
255
+ };
256
+ const found = findAreaPath(response, leafName);
257
+ if (found) {
258
+ return {
259
+ id: found.id,
260
+ name: found.name,
261
+ path: found.path,
262
+ };
263
+ }
264
+ return null;
265
+ }
266
+ catch (error) {
267
+ // API error - treat as not found
268
+ return null;
269
+ }
270
+ }
271
+ /**
272
+ * Create area path in project (kept for backwards compatibility, but not used in validation)
273
+ * @deprecated Use checkAreaPathExists() for validation instead
274
+ */
275
+ async createAreaPath(projectName, areaName) {
276
+ console.log(chalk.blue(` 📦 Creating area path: ${projectName}\\${areaName}...`));
277
+ const body = {
278
+ name: areaName
279
+ };
280
+ try {
281
+ const area = await this.callAzureDevOpsApi(`wit/classificationnodes/areas?projectId=${encodeURIComponent(projectName)}&api-version=7.0`, 'POST', body);
282
+ console.log(chalk.green(` ✅ Area path created: ${projectName}\\${areaName}`));
283
+ return {
284
+ id: area.id,
285
+ name: area.name,
286
+ path: area.path,
287
+ };
288
+ }
289
+ catch (error) {
290
+ console.error(chalk.red(` ❌ Failed to create area path: ${error.message}`));
291
+ throw error;
292
+ }
293
+ }
294
+ /**
295
+ * Fetch teams in project
296
+ */
297
+ async fetchTeams(projectName) {
298
+ try {
299
+ const response = await this.callAzureDevOpsApi(`projects/${encodeURIComponent(projectName)}/teams?api-version=7.0`);
300
+ return response.value.map((t) => ({
301
+ id: t.id,
302
+ name: t.name,
303
+ description: t.description || '',
304
+ }));
305
+ }
306
+ catch (error) {
307
+ return [];
308
+ }
309
+ }
310
+ /**
311
+ * Create team in project
312
+ */
313
+ async createTeam(projectName, teamName) {
314
+ console.log(chalk.blue(` 📦 Creating team: ${teamName}...`));
315
+ const body = {
316
+ name: teamName,
317
+ description: `${teamName} development team`
318
+ };
319
+ try {
320
+ const team = await this.callAzureDevOpsApi(`projects/${encodeURIComponent(projectName)}/teams?api-version=7.0`, 'POST', body);
321
+ console.log(chalk.green(` ✅ Team created: ${teamName}`));
322
+ return {
323
+ id: team.id,
324
+ name: team.name,
325
+ description: team.description || '',
326
+ };
327
+ }
328
+ catch (error) {
329
+ console.error(chalk.red(` ❌ Failed to create team: ${error.message}`));
330
+ throw error;
331
+ }
332
+ }
333
+ /**
334
+ * Validate and fix Azure DevOps configuration
335
+ */
336
+ async validate() {
337
+ console.log(chalk.blue('\n🔍 Validating Azure DevOps configuration...\n'));
338
+ // Use class properties loaded from config.json (constructor already loaded them)
339
+ const strategy = this.strategy;
340
+ const result = {
341
+ valid: true,
342
+ strategy,
343
+ projects: [],
344
+ teams: [],
345
+ areaPaths: [],
346
+ envUpdated: false,
347
+ };
348
+ // Validate PAT is present (only secret in .env)
349
+ if (!this.pat) {
350
+ console.log(chalk.red('❌ AZURE_DEVOPS_PAT not found in .env'));
351
+ result.valid = false;
352
+ return result;
353
+ }
354
+ // Validate organization is present (from config.json)
355
+ if (!this.organization) {
356
+ console.log(chalk.red('❌ Azure DevOps organization not found in config.json'));
357
+ console.log(chalk.gray(' Expected in: .specweave/config.json → sync.profiles.*.config.organization'));
358
+ result.valid = false;
359
+ return result;
360
+ }
361
+ // Determine project names based on strategy (from config.json)
362
+ let projectNames = [];
363
+ if (strategy === 'project-per-team') {
364
+ // Multiple projects - NOT YET SUPPORTED in config.json
365
+ // For now, fall back to single project
366
+ if (!this.project) {
367
+ console.log(chalk.red('❌ Azure DevOps project not found in config.json'));
368
+ console.log(chalk.gray(' Expected in: .specweave/config.json → sync.profiles.*.config.project'));
369
+ result.valid = false;
370
+ return result;
371
+ }
372
+ projectNames = [this.project];
373
+ }
374
+ else {
375
+ // Single project (area-path-based or team-based)
376
+ if (!this.project) {
377
+ console.log(chalk.red('❌ Azure DevOps project not found in config.json'));
378
+ console.log(chalk.gray(' Expected in: .specweave/config.json → sync.profiles.*.config.project'));
379
+ result.valid = false;
380
+ return result;
381
+ }
382
+ projectNames = [this.project];
383
+ }
384
+ console.log(chalk.gray(`Strategy: ${strategy}`));
385
+ console.log(chalk.gray(`Checking project(s): ${projectNames.join(', ')}...\n`));
386
+ // 1. Validate projects
387
+ for (const projectName of projectNames) {
388
+ const project = await this.checkProject(projectName);
389
+ if (!project) {
390
+ console.log(chalk.yellow(`⚠️ Project "${projectName}" not found\n`));
391
+ // Fetch existing projects
392
+ const existingProjects = await this.fetchProjects();
393
+ // Prompt user
394
+ const action = await select({
395
+ message: `What would you like to do for project "${projectName}"?`,
396
+ choices: [
397
+ { name: 'Select an existing project', value: 'select' },
398
+ { name: 'Create a new project', value: 'create' },
399
+ { name: 'Skip this project', value: 'skip' },
400
+ { name: 'Cancel validation', value: 'cancel' },
401
+ ],
402
+ });
403
+ if (action === 'cancel') {
404
+ result.valid = false;
405
+ return result;
406
+ }
407
+ if (action === 'skip') {
408
+ console.log(chalk.yellow(`⏭️ Skipped project "${projectName}"\n`));
409
+ result.projects.push({ name: projectName, exists: false, created: false });
410
+ continue;
411
+ }
412
+ if (action === 'select') {
413
+ const selectedProject = await select({
414
+ message: 'Select a project:',
415
+ choices: existingProjects.map((p) => ({
416
+ name: `${p.name}${p.description ? ` - ${p.description}` : ''}`,
417
+ value: p.name,
418
+ })),
419
+ });
420
+ // Fetch full project details
421
+ const selectedProjectDetails = await this.checkProject(selectedProject);
422
+ if (!selectedProjectDetails) {
423
+ console.log(chalk.red(`❌ Failed to fetch details for project "${selectedProject}"\n`));
424
+ continue;
425
+ }
426
+ // Update .env
427
+ if (strategy === 'project-per-team') {
428
+ const updatedNames = projectNames.map(n => n === projectName ? selectedProject : n);
429
+ await this.updateEnv({ AZURE_DEVOPS_PROJECTS: updatedNames.join(',') });
430
+ }
431
+ else {
432
+ await this.updateEnv({ AZURE_DEVOPS_PROJECT: selectedProject });
433
+ }
434
+ const projectUrl = `https://dev.azure.com/${this.organization}/${encodeURIComponent(selectedProject)}`;
435
+ console.log(chalk.cyan(`🔗 View in Azure DevOps: ${projectUrl}`));
436
+ console.log(chalk.green(`✅ Project "${selectedProject}" selected\n`));
437
+ result.projects.push({
438
+ name: selectedProject,
439
+ id: selectedProjectDetails.id,
440
+ exists: true,
441
+ created: false,
442
+ });
443
+ result.envUpdated = true;
444
+ }
445
+ else if (action === 'create') {
446
+ const description = await input({
447
+ message: 'Enter project description (optional):',
448
+ default: `${projectName} project`,
449
+ });
450
+ const newProject = await this.createProject(projectName, description);
451
+ const projectUrl = `https://dev.azure.com/${this.organization}/${encodeURIComponent(newProject.name)}`;
452
+ console.log(chalk.cyan(`🔗 View in Azure DevOps: ${projectUrl}\n`));
453
+ result.projects.push({
454
+ name: newProject.name,
455
+ id: newProject.id,
456
+ exists: true,
457
+ created: true,
458
+ });
459
+ }
460
+ }
461
+ else {
462
+ console.log(chalk.green(`✅ Validated: Project "${projectName}" exists`));
463
+ const projectUrl = `https://dev.azure.com/${this.organization}/${encodeURIComponent(project.name)}`;
464
+ console.log(chalk.cyan(`🔗 View in Azure DevOps: ${projectUrl}`));
465
+ result.projects.push({
466
+ name: project.name,
467
+ id: project.id,
468
+ exists: true,
469
+ created: false,
470
+ });
471
+ }
472
+ }
473
+ console.log(); // Empty line after project validation
474
+ // 2. Validate area paths (from config.json) - ALWAYS read-only, never create
475
+ result.areaPaths = [];
476
+ if (this.areaPaths.length > 0) {
477
+ console.log(chalk.gray(`Validating area paths...`));
478
+ const projectName = projectNames[0]; // Single project for now
479
+ for (const areaPath of this.areaPaths) {
480
+ // Extract leaf name for display (handles full paths like "OlySense\Platform-Engineering")
481
+ const leafName = areaPath.includes('\\') ? areaPath.split('\\').pop() : areaPath;
482
+ const existingArea = await this.checkAreaPathExists(projectName, areaPath);
483
+ if (existingArea) {
484
+ console.log(chalk.green(` ✅ Area path exists: ${projectName}\\${leafName}`));
485
+ result.areaPaths.push({ name: leafName, exists: true, created: false });
486
+ }
487
+ else {
488
+ console.log(chalk.yellow(` ⚠️ Area path not found: ${projectName}\\${leafName}`));
489
+ console.log(chalk.gray(` This area path was selected but doesn't exist in ADO.`));
490
+ console.log(chalk.gray(` Items may be imported to _default folder instead.`));
491
+ // Don't mark as invalid - just warn. User may have selected incorrectly.
492
+ result.areaPaths.push({ name: leafName, exists: false, created: false });
493
+ }
494
+ }
495
+ console.log();
496
+ }
497
+ // 3. Validate teams (from config.json) - read-only validation only
498
+ // NOTE: Teams are being deprecated from init flow. This section kept for backwards compatibility.
499
+ result.teams = [];
500
+ if (this.teams.length > 0) {
501
+ console.log(chalk.gray(`Validating teams...`));
502
+ const projectName = projectNames[0]; // Single project for now
503
+ const existingTeams = await this.fetchTeams(projectName);
504
+ for (const teamName of this.teams) {
505
+ const team = existingTeams.find(t => t.name === teamName);
506
+ if (team) {
507
+ console.log(chalk.green(` ✅ Team exists: ${teamName}`));
508
+ result.teams.push({ name: teamName, id: team.id, exists: true, created: false });
509
+ }
510
+ else {
511
+ console.log(chalk.yellow(` ⚠️ Team not found: ${teamName}`));
512
+ result.teams.push({ name: teamName, exists: false, created: false });
513
+ }
514
+ }
515
+ console.log();
516
+ }
517
+ // Summary
518
+ if (result.valid) {
519
+ console.log(chalk.green(`✅ Azure DevOps configuration validated successfully\n`));
520
+ }
521
+ else {
522
+ console.log(chalk.yellow(`⚠️ Some resources could not be validated\n`));
523
+ }
524
+ return result;
525
+ }
526
+ }
527
+ // ============================================================================
528
+ // Utility Functions
529
+ // ============================================================================
530
+ /**
531
+ * Validate Jira resources
532
+ */
533
+ // ============================================================================
534
+ // Utility Functions
535
+ // ============================================================================
536
+ /**
537
+ * Validate Azure DevOps resources
538
+ *
539
+ * @param envPath - Path to .env file
540
+ * @param options - Validation options
541
+ * @param options.readOnly - If true, skip all create operations (for read-only permissions)
542
+ */
543
+ export async function validateAzureDevOpsResources(envPath = '.env', options) {
544
+ const validator = new AzureDevOpsResourceValidator(envPath, options);
545
+ return validator.validate();
546
+ }
547
+ //# 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":"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"}
@@ -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"}