specweave 0.28.36 → 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.
- 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 +161 -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 +1 -1
- 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 +10 -0
- package/dist/src/cli/helpers/issue-tracker/ado.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/ado.js +107 -22
- 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 +30 -10
- package/dist/src/cli/helpers/issue-tracker/index.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/types.d.ts +1 -0
- package/dist/src/cli/helpers/issue-tracker/types.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/types.js.map +1 -1
- package/dist/src/core/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 +2 -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 +86 -0
- package/dist/src/utils/validators/ado-validator.d.ts.map +1 -0
- package/dist/src/utils/validators/ado-validator.js +528 -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/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,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":"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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"}
|
|
@@ -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"}
|