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.
- package/CLAUDE.md +21 -0
- package/README.md +10 -9
- package/bin/specweave.js +2 -1
- package/dist/src/cli/commands/archive.d.ts.map +1 -1
- package/dist/src/cli/commands/archive.js +2 -1
- package/dist/src/cli/commands/archive.js.map +1 -1
- package/dist/src/cli/commands/init.d.ts.map +1 -1
- package/dist/src/cli/commands/init.js +33 -0
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/helpers/ado-area-selector.d.ts +49 -0
- package/dist/src/cli/helpers/ado-area-selector.d.ts.map +1 -0
- package/dist/src/cli/helpers/ado-area-selector.js +162 -0
- package/dist/src/cli/helpers/ado-area-selector.js.map +1 -0
- package/dist/src/cli/helpers/init/config-detection.d.ts +5 -1
- package/dist/src/cli/helpers/init/config-detection.d.ts.map +1 -1
- package/dist/src/cli/helpers/init/config-detection.js +50 -17
- package/dist/src/cli/helpers/init/config-detection.js.map +1 -1
- package/dist/src/cli/helpers/init/external-import.js +3 -3
- package/dist/src/cli/helpers/init/external-import.js.map +1 -1
- package/dist/src/cli/helpers/init/repository-setup.d.ts +2 -0
- package/dist/src/cli/helpers/init/repository-setup.d.ts.map +1 -1
- package/dist/src/cli/helpers/init/repository-setup.js +34 -2
- package/dist/src/cli/helpers/init/repository-setup.js.map +1 -1
- package/dist/src/cli/helpers/init/types.d.ts +3 -0
- package/dist/src/cli/helpers/init/types.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/ado.d.ts +17 -0
- package/dist/src/cli/helpers/issue-tracker/ado.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/ado.js +308 -44
- package/dist/src/cli/helpers/issue-tracker/ado.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/index.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/index.js +103 -35
- package/dist/src/cli/helpers/issue-tracker/index.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/types.d.ts +26 -2
- package/dist/src/cli/helpers/issue-tracker/types.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/types.js.map +1 -1
- package/dist/src/core/increment/discipline-checker.js +1 -1
- package/dist/src/core/increment/increment-archiver.d.ts +13 -0
- package/dist/src/core/increment/increment-archiver.d.ts.map +1 -1
- package/dist/src/core/increment/increment-archiver.js +60 -3
- package/dist/src/core/increment/increment-archiver.js.map +1 -1
- package/dist/src/core/living-docs/feature-archiver.d.ts.map +1 -1
- package/dist/src/core/living-docs/feature-archiver.js +75 -37
- package/dist/src/core/living-docs/feature-archiver.js.map +1 -1
- package/dist/src/core/living-docs/living-docs-sync.d.ts +2 -111
- package/dist/src/core/living-docs/living-docs-sync.d.ts.map +1 -1
- package/dist/src/core/living-docs/living-docs-sync.js +18 -383
- package/dist/src/core/living-docs/living-docs-sync.js.map +1 -1
- package/dist/src/core/living-docs/sync-helpers/file-utils.d.ts +30 -0
- package/dist/src/core/living-docs/sync-helpers/file-utils.d.ts.map +1 -0
- package/dist/src/core/living-docs/sync-helpers/file-utils.js +107 -0
- package/dist/src/core/living-docs/sync-helpers/file-utils.js.map +1 -0
- package/dist/src/core/living-docs/sync-helpers/generators.d.ts +19 -0
- package/dist/src/core/living-docs/sync-helpers/generators.d.ts.map +1 -0
- package/dist/src/core/living-docs/sync-helpers/generators.js +146 -0
- package/dist/src/core/living-docs/sync-helpers/generators.js.map +1 -0
- package/dist/src/core/living-docs/sync-helpers/index.d.ts +8 -0
- package/dist/src/core/living-docs/sync-helpers/index.d.ts.map +1 -0
- package/dist/src/core/living-docs/sync-helpers/index.js +11 -0
- package/dist/src/core/living-docs/sync-helpers/index.js.map +1 -0
- package/dist/src/core/living-docs/sync-helpers/parsers.d.ts +19 -0
- package/dist/src/core/living-docs/sync-helpers/parsers.d.ts.map +1 -0
- package/dist/src/core/living-docs/sync-helpers/parsers.js +94 -0
- package/dist/src/core/living-docs/sync-helpers/parsers.js.map +1 -0
- package/dist/src/core/living-docs/types.d.ts +45 -0
- package/dist/src/core/living-docs/types.d.ts.map +1 -1
- package/dist/src/core/types/config.d.ts +1 -1
- package/dist/src/core/types/config.js +2 -2
- package/dist/src/core/types/config.js.map +1 -1
- package/dist/src/importers/ado-importer.d.ts.map +1 -1
- package/dist/src/importers/ado-importer.js +3 -0
- package/dist/src/importers/ado-importer.js.map +1 -1
- package/dist/src/importers/item-converter.d.ts.map +1 -1
- package/dist/src/importers/item-converter.js +10 -2
- package/dist/src/importers/item-converter.js.map +1 -1
- package/dist/src/living-docs/fs-id-allocator.d.ts +5 -0
- package/dist/src/living-docs/fs-id-allocator.d.ts.map +1 -1
- package/dist/src/living-docs/fs-id-allocator.js +31 -2
- package/dist/src/living-docs/fs-id-allocator.js.map +1 -1
- package/dist/src/utils/external-resource-validator.d.ts +5 -192
- package/dist/src/utils/external-resource-validator.d.ts.map +1 -1
- package/dist/src/utils/external-resource-validator.js +10 -1162
- package/dist/src/utils/external-resource-validator.js.map +1 -1
- package/dist/src/utils/validators/ado-validator.d.ts +94 -0
- package/dist/src/utils/validators/ado-validator.d.ts.map +1 -0
- package/dist/src/utils/validators/ado-validator.js +547 -0
- package/dist/src/utils/validators/ado-validator.js.map +1 -0
- package/dist/src/utils/validators/index.d.ts +11 -0
- package/dist/src/utils/validators/index.d.ts.map +1 -0
- package/dist/src/utils/validators/index.js +12 -0
- package/dist/src/utils/validators/index.js.map +1 -0
- package/dist/src/utils/validators/jira-validator.d.ts +70 -0
- package/dist/src/utils/validators/jira-validator.d.ts.map +1 -0
- package/dist/src/utils/validators/jira-validator.js +606 -0
- package/dist/src/utils/validators/jira-validator.js.map +1 -0
- package/dist/src/utils/validators/types.d.ts +82 -0
- package/dist/src/utils/validators/types.d.ts.map +1 -0
- package/dist/src/utils/validators/types.js +6 -0
- package/dist/src/utils/validators/types.js.map +1 -0
- package/package.json +1 -1
- package/plugins/specweave/.claude-plugin/plugin.json +7 -62
- package/plugins/specweave/commands/specweave-archive.md +3 -3
- package/plugins/specweave/commands/specweave-increment.md +18 -19
- package/plugins/specweave/hooks/hooks.json +3 -49
- package/plugins/specweave/hooks/hooks.json.bak +72 -0
- package/plugins/specweave/hooks/hooks.json.v1-backup +16 -0
- package/plugins/specweave/hooks/lib/update-status-line.sh +39 -15
- package/plugins/specweave/hooks/post-task-edit.sh +10 -0
- package/plugins/specweave/hooks/user-prompt-submit.sh +27 -8
- package/plugins/specweave/hooks/v2/dispatchers/post-tool-use.sh +44 -0
- package/plugins/specweave/hooks/v2/dispatchers/session-start.sh +24 -0
- package/plugins/specweave/hooks/v2/handlers/ac-validation-handler.sh +46 -0
- package/plugins/specweave/hooks/v2/handlers/github-sync-handler.sh +54 -0
- package/plugins/specweave/hooks/v2/handlers/living-docs-handler.sh +46 -0
- package/plugins/specweave/hooks/v2/handlers/status-update.sh +50 -0
- package/plugins/specweave/hooks/v2/hooks.json +16 -0
- package/plugins/specweave/hooks/v2/queue/dequeue.sh +30 -0
- package/plugins/specweave/hooks/v2/queue/enqueue.sh +41 -0
- package/plugins/specweave/hooks/v2/queue/processor.sh +72 -0
- package/plugins/specweave-ado/lib/ado-multi-project-sync.js +0 -1
- package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +20 -1262
- package/plugins/specweave-jira/lib/enhanced-jira-sync.js +3 -3
- package/plugins/specweave-release/commands/specweave-release-npm.md +132 -24
- package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +30 -1254
- package/src/templates/tasks.md.template +2 -0
- package/plugins/specweave/hooks/docs-changed.sh.backup +0 -79
- package/plugins/specweave/hooks/human-input-required.sh.backup +0 -75
- package/plugins/specweave/hooks/post-first-increment.sh.backup +0 -61
- package/plugins/specweave/hooks/post-increment-change.sh.backup +0 -98
- package/plugins/specweave/hooks/post-increment-completion.sh.backup +0 -231
- package/plugins/specweave/hooks/post-increment-planning.sh.backup +0 -1048
- package/plugins/specweave/hooks/post-increment-status-change.sh.backup +0 -147
- package/plugins/specweave/hooks/post-spec-update.sh.backup +0 -158
- package/plugins/specweave/hooks/post-user-story-complete.sh.backup +0 -179
- package/plugins/specweave/hooks/pre-command-deduplication.sh.backup +0 -83
- package/plugins/specweave/hooks/pre-implementation.sh.backup +0 -67
- package/plugins/specweave/hooks/pre-task-completion.sh.backup +0 -194
- package/plugins/specweave/hooks/pre-tool-use.sh.backup +0 -133
- package/plugins/specweave/hooks/user-prompt-submit.sh.backup +0 -386
- package/plugins/specweave-ado/hooks/post-living-docs-update.sh.backup +0 -353
- package/plugins/specweave-ado/hooks/post-task-completion.sh.backup +0 -172
- package/plugins/specweave-ado/lib/enhanced-ado-sync.js +0 -170
- package/plugins/specweave-github/hooks/post-task-completion.sh.backup +0 -258
- package/plugins/specweave-jira/hooks/post-task-completion.sh.backup +0 -172
- 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"}
|