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,606 @@
|
|
|
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 * 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 JiraResourceValidator {
|
|
16
|
+
constructor(envPath = '.env') {
|
|
17
|
+
this.envPath = envPath;
|
|
18
|
+
// Load from .env
|
|
19
|
+
const env = this.loadEnv();
|
|
20
|
+
this.apiToken = env.JIRA_API_TOKEN || '';
|
|
21
|
+
this.email = env.JIRA_EMAIL || '';
|
|
22
|
+
this.domain = env.JIRA_DOMAIN || '';
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Load .env file
|
|
26
|
+
*/
|
|
27
|
+
loadEnv() {
|
|
28
|
+
try {
|
|
29
|
+
if (!fs.existsSync(this.envPath)) {
|
|
30
|
+
return {};
|
|
31
|
+
}
|
|
32
|
+
const content = fs.readFileSync(this.envPath, 'utf-8');
|
|
33
|
+
const env = {};
|
|
34
|
+
content.split('\n').forEach((line) => {
|
|
35
|
+
const match = line.match(/^([^=:#]+)=(.*)$/);
|
|
36
|
+
if (match) {
|
|
37
|
+
const key = match[1].trim();
|
|
38
|
+
const value = match[2].trim();
|
|
39
|
+
env[key] = value;
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
return env;
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
return {};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Update .env file with new values
|
|
50
|
+
*/
|
|
51
|
+
async updateEnv(updates) {
|
|
52
|
+
try {
|
|
53
|
+
let content = '';
|
|
54
|
+
if (fs.existsSync(this.envPath)) {
|
|
55
|
+
content = fs.readFileSync(this.envPath, 'utf-8');
|
|
56
|
+
}
|
|
57
|
+
// Update existing or append new
|
|
58
|
+
Object.entries(updates).forEach(([key, value]) => {
|
|
59
|
+
const regex = new RegExp(`^${key}=.*$`, 'm');
|
|
60
|
+
if (regex.test(content)) {
|
|
61
|
+
content = content.replace(regex, `${key}=${value}`);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
content += `\n${key}=${value}`;
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
fs.writeFileSync(this.envPath, content.trim() + '\n');
|
|
68
|
+
console.log(chalk.green(`✅ Updated ${this.envPath}`));
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
console.error(chalk.red(`❌ Failed to update ${this.envPath}: ${error.message}`));
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Call Jira API
|
|
77
|
+
*/
|
|
78
|
+
async callJiraApi(endpoint, method = 'GET', body) {
|
|
79
|
+
const url = `https://${this.domain}/rest/api/3/${endpoint}`;
|
|
80
|
+
const auth = Buffer.from(`${this.email}:${this.apiToken}`).toString('base64');
|
|
81
|
+
const curlCommand = `curl -s -f -X ${method} \
|
|
82
|
+
-H "Authorization: Basic ${auth}" \
|
|
83
|
+
-H "Content-Type: application/json" \
|
|
84
|
+
${body ? `-d '${JSON.stringify(body)}'` : ''} \
|
|
85
|
+
"${url}"`;
|
|
86
|
+
try {
|
|
87
|
+
const { stdout } = await execAsync(curlCommand);
|
|
88
|
+
const response = JSON.parse(stdout);
|
|
89
|
+
// Double-check for error response (defense in depth)
|
|
90
|
+
if (response.errorMessages || response.errors) {
|
|
91
|
+
const errorMsg = response.errorMessages?.join(', ') || JSON.stringify(response.errors);
|
|
92
|
+
throw new Error(errorMsg);
|
|
93
|
+
}
|
|
94
|
+
return response;
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
// Improve error message for common cases
|
|
98
|
+
if (error.message.includes('curl: (22)')) {
|
|
99
|
+
throw new Error('Resource not found (HTTP 404)');
|
|
100
|
+
}
|
|
101
|
+
throw error;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Fetch all Jira projects
|
|
106
|
+
*/
|
|
107
|
+
async fetchProjects() {
|
|
108
|
+
try {
|
|
109
|
+
const response = await this.callJiraApi('project');
|
|
110
|
+
return response.map((p) => ({
|
|
111
|
+
id: p.id,
|
|
112
|
+
key: p.key,
|
|
113
|
+
name: p.name,
|
|
114
|
+
}));
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
return [];
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Check if project exists
|
|
122
|
+
*/
|
|
123
|
+
async checkProject(projectKey) {
|
|
124
|
+
try {
|
|
125
|
+
const project = await this.callJiraApi(`project/${projectKey}`);
|
|
126
|
+
return {
|
|
127
|
+
id: project.id,
|
|
128
|
+
key: project.key,
|
|
129
|
+
name: project.name,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Create new Jira project
|
|
138
|
+
*/
|
|
139
|
+
async createProject(projectKey, projectName) {
|
|
140
|
+
console.log(chalk.blue(`📦 Creating Jira project: ${projectKey} (${projectName})...`));
|
|
141
|
+
const body = {
|
|
142
|
+
key: projectKey,
|
|
143
|
+
name: projectName,
|
|
144
|
+
projectTypeKey: 'software',
|
|
145
|
+
leadAccountId: await this.getCurrentUserId(),
|
|
146
|
+
};
|
|
147
|
+
try {
|
|
148
|
+
const project = await this.callJiraApi('project', 'POST', body);
|
|
149
|
+
console.log(chalk.green(`✅ Project created: ${projectKey}`));
|
|
150
|
+
return {
|
|
151
|
+
id: project.id,
|
|
152
|
+
key: project.key,
|
|
153
|
+
name: project.name,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
console.error(chalk.red(`❌ Failed to create project: ${error.message}`));
|
|
158
|
+
throw error;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Get current user ID (for project lead)
|
|
163
|
+
*/
|
|
164
|
+
async getCurrentUserId() {
|
|
165
|
+
try {
|
|
166
|
+
const user = await this.callJiraApi('myself');
|
|
167
|
+
return user.accountId;
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
throw new Error('Failed to get current user ID');
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Fetch all boards for a project
|
|
175
|
+
*/
|
|
176
|
+
async fetchBoards(projectKey) {
|
|
177
|
+
try {
|
|
178
|
+
const response = await this.callJiraApi(`board?projectKeyOrId=${projectKey}`);
|
|
179
|
+
return response.values.map((b) => ({
|
|
180
|
+
id: b.id,
|
|
181
|
+
name: b.name,
|
|
182
|
+
type: b.type,
|
|
183
|
+
}));
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
return [];
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Check if board exists by ID
|
|
191
|
+
*/
|
|
192
|
+
async checkBoard(boardId) {
|
|
193
|
+
try {
|
|
194
|
+
const board = await this.callJiraApi(`board/${boardId}`);
|
|
195
|
+
// Fetch board configuration to get project information
|
|
196
|
+
let location;
|
|
197
|
+
try {
|
|
198
|
+
const config = await this.callJiraApi(`board/${boardId}/configuration`);
|
|
199
|
+
if (config.location) {
|
|
200
|
+
location = {
|
|
201
|
+
projectKey: config.location.projectKey,
|
|
202
|
+
projectId: config.location.projectId,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
// Configuration fetch failed, board exists but we don't know which project
|
|
208
|
+
// This is OK for backward compatibility
|
|
209
|
+
}
|
|
210
|
+
return {
|
|
211
|
+
id: board.id,
|
|
212
|
+
name: board.name,
|
|
213
|
+
type: board.type,
|
|
214
|
+
location,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
catch (error) {
|
|
218
|
+
return null;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Create new Jira board
|
|
223
|
+
*/
|
|
224
|
+
async createBoard(boardName, projectKey) {
|
|
225
|
+
console.log(chalk.blue(`📦 Creating Jira board: ${boardName} in project ${projectKey}...`));
|
|
226
|
+
const body = {
|
|
227
|
+
name: boardName,
|
|
228
|
+
type: 'scrum',
|
|
229
|
+
filterId: await this.getOrCreateFilter(projectKey),
|
|
230
|
+
location: {
|
|
231
|
+
type: 'project',
|
|
232
|
+
projectKeyOrId: projectKey,
|
|
233
|
+
},
|
|
234
|
+
};
|
|
235
|
+
try {
|
|
236
|
+
const board = await this.callJiraApi('board', 'POST', body);
|
|
237
|
+
console.log(chalk.green(`✅ Board created: ${boardName} (ID: ${board.id})`));
|
|
238
|
+
return {
|
|
239
|
+
id: board.id,
|
|
240
|
+
name: board.name,
|
|
241
|
+
type: board.type,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
catch (error) {
|
|
245
|
+
console.error(chalk.red(`❌ Failed to create board: ${error.message}`));
|
|
246
|
+
throw error;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Get or create filter for board
|
|
251
|
+
*/
|
|
252
|
+
async getOrCreateFilter(projectKey) {
|
|
253
|
+
// For simplicity, create a basic filter
|
|
254
|
+
// In production, you might want to check for existing filters first
|
|
255
|
+
const body = {
|
|
256
|
+
name: `${projectKey} Issues`,
|
|
257
|
+
jql: `project = ${projectKey}`,
|
|
258
|
+
};
|
|
259
|
+
try {
|
|
260
|
+
const filter = await this.callJiraApi('filter', 'POST', body);
|
|
261
|
+
return filter.id;
|
|
262
|
+
}
|
|
263
|
+
catch (error) {
|
|
264
|
+
throw new Error(`Failed to create filter: ${error.message}`);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Validate and fix Jira configuration
|
|
269
|
+
*/
|
|
270
|
+
async validate() {
|
|
271
|
+
console.log(chalk.blue('\n🔍 Validating Jira configuration...\n'));
|
|
272
|
+
const result = {
|
|
273
|
+
valid: true,
|
|
274
|
+
project: { exists: false },
|
|
275
|
+
boards: { valid: true, existing: [], missing: [], created: [] },
|
|
276
|
+
envUpdated: false,
|
|
277
|
+
};
|
|
278
|
+
const env = this.loadEnv();
|
|
279
|
+
const strategy = env.JIRA_STRATEGY || 'project-per-team';
|
|
280
|
+
// Determine project key(s) based on strategy
|
|
281
|
+
let projectKeys = [];
|
|
282
|
+
if (strategy === 'project-per-team') {
|
|
283
|
+
// Multiple projects (JIRA_PROJECTS is comma-separated)
|
|
284
|
+
const projectsEnv = env.JIRA_PROJECTS || '';
|
|
285
|
+
if (!projectsEnv) {
|
|
286
|
+
console.log(chalk.red('❌ JIRA_PROJECTS not found in .env'));
|
|
287
|
+
result.valid = false;
|
|
288
|
+
return result;
|
|
289
|
+
}
|
|
290
|
+
projectKeys = projectsEnv.split(',').map(p => p.trim()).filter(p => p);
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
// Single project (component-based or board-based)
|
|
294
|
+
const projectKey = env.JIRA_PROJECT;
|
|
295
|
+
if (!projectKey) {
|
|
296
|
+
console.log(chalk.red('❌ JIRA_PROJECT not found in .env'));
|
|
297
|
+
result.valid = false;
|
|
298
|
+
return result;
|
|
299
|
+
}
|
|
300
|
+
projectKeys = [projectKey];
|
|
301
|
+
}
|
|
302
|
+
// 1. Validate project(s)
|
|
303
|
+
console.log(chalk.gray(`Strategy: ${strategy}`));
|
|
304
|
+
console.log(chalk.gray(`Checking project(s): ${projectKeys.join(', ')}...\n`));
|
|
305
|
+
// NEW: Validate per-project var naming (detect orphaned configs)
|
|
306
|
+
const perProjectBoardVars = Object.keys(env).filter(key => key.startsWith('JIRA_BOARDS_'));
|
|
307
|
+
for (const varName of perProjectBoardVars) {
|
|
308
|
+
const projectFromVar = varName.split('JIRA_BOARDS_')[1];
|
|
309
|
+
if (!projectKeys.includes(projectFromVar)) {
|
|
310
|
+
console.log(chalk.yellow(`⚠️ Configuration warning: ${varName}`));
|
|
311
|
+
console.log(chalk.gray(` Project "${projectFromVar}" not found in JIRA_PROJECTS`));
|
|
312
|
+
console.log(chalk.gray(` Expected projects: ${projectKeys.join(', ')}`));
|
|
313
|
+
console.log(chalk.gray(` This configuration will be ignored.\n`));
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
// Track all validated/created projects (for multi-project IDs)
|
|
317
|
+
const allProjects = [];
|
|
318
|
+
for (const projectKey of projectKeys) {
|
|
319
|
+
const project = await this.checkProject(projectKey);
|
|
320
|
+
if (!project) {
|
|
321
|
+
console.log(chalk.yellow(`⚠️ Project "${projectKey}" not found\n`));
|
|
322
|
+
// Fetch existing projects
|
|
323
|
+
const existingProjects = await this.fetchProjects();
|
|
324
|
+
// Prompt user
|
|
325
|
+
const action = await select({
|
|
326
|
+
message: `What would you like to do for project "${projectKey}"?`,
|
|
327
|
+
choices: [
|
|
328
|
+
{ name: 'Select an existing project', value: 'select' },
|
|
329
|
+
{ name: 'Create a new project', value: 'create' },
|
|
330
|
+
{ name: 'Skip this project', value: 'skip' },
|
|
331
|
+
{ name: 'Cancel validation', value: 'cancel' },
|
|
332
|
+
],
|
|
333
|
+
});
|
|
334
|
+
if (action === 'cancel') {
|
|
335
|
+
result.valid = false;
|
|
336
|
+
return result;
|
|
337
|
+
}
|
|
338
|
+
if (action === 'skip') {
|
|
339
|
+
console.log(chalk.yellow(`⏭️ Skipped project "${projectKey}"\n`));
|
|
340
|
+
continue;
|
|
341
|
+
}
|
|
342
|
+
if (action === 'select') {
|
|
343
|
+
const selectedProject = await select({
|
|
344
|
+
message: 'Select a project:',
|
|
345
|
+
choices: existingProjects.map((p) => ({
|
|
346
|
+
name: `${p.key} - ${p.name}`,
|
|
347
|
+
value: p.key,
|
|
348
|
+
})),
|
|
349
|
+
});
|
|
350
|
+
// Fetch full project details to get ID
|
|
351
|
+
const selectedProjectDetails = await this.checkProject(selectedProject);
|
|
352
|
+
if (!selectedProjectDetails) {
|
|
353
|
+
console.log(chalk.red(`❌ Failed to fetch details for project "${selectedProject}"\n`));
|
|
354
|
+
continue;
|
|
355
|
+
}
|
|
356
|
+
// Update .env (handle both single and multiple projects)
|
|
357
|
+
if (strategy === 'project-per-team') {
|
|
358
|
+
// Replace this project key in JIRA_PROJECTS
|
|
359
|
+
const updatedKeys = projectKeys.map(k => k === projectKey ? selectedProject : k);
|
|
360
|
+
await this.updateEnv({ JIRA_PROJECTS: updatedKeys.join(',') });
|
|
361
|
+
}
|
|
362
|
+
else {
|
|
363
|
+
await this.updateEnv({ JIRA_PROJECT: selectedProject });
|
|
364
|
+
}
|
|
365
|
+
// Print link to selected project
|
|
366
|
+
const projectUrl = `https://${this.domain}/jira/software/c/projects/${selectedProject}`;
|
|
367
|
+
console.log(chalk.cyan(`🔗 View in Jira: ${projectUrl}`));
|
|
368
|
+
result.project = {
|
|
369
|
+
exists: true,
|
|
370
|
+
key: selectedProject,
|
|
371
|
+
id: selectedProjectDetails.id,
|
|
372
|
+
name: selectedProjectDetails.name,
|
|
373
|
+
};
|
|
374
|
+
result.envUpdated = true;
|
|
375
|
+
console.log(chalk.green(`✅ Project "${selectedProject}" selected\n`));
|
|
376
|
+
// Track for multi-project ID collection
|
|
377
|
+
allProjects.push({
|
|
378
|
+
key: selectedProject,
|
|
379
|
+
id: selectedProjectDetails.id,
|
|
380
|
+
name: selectedProjectDetails.name,
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
else if (action === 'create') {
|
|
384
|
+
const projectName = await input({
|
|
385
|
+
message: 'Enter project name:',
|
|
386
|
+
default: projectKey,
|
|
387
|
+
});
|
|
388
|
+
const newProject = await this.createProject(projectKey, projectName);
|
|
389
|
+
// Print link to created project
|
|
390
|
+
const projectUrl = `https://${this.domain}/jira/software/c/projects/${newProject.key}`;
|
|
391
|
+
console.log(chalk.cyan(`🔗 View in Jira: ${projectUrl}\n`));
|
|
392
|
+
result.project = {
|
|
393
|
+
exists: true,
|
|
394
|
+
key: newProject.key,
|
|
395
|
+
id: newProject.id,
|
|
396
|
+
name: newProject.name,
|
|
397
|
+
};
|
|
398
|
+
// Track for multi-project ID collection
|
|
399
|
+
allProjects.push({
|
|
400
|
+
key: newProject.key,
|
|
401
|
+
id: newProject.id,
|
|
402
|
+
name: newProject.name,
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
else {
|
|
407
|
+
console.log(chalk.green(`✅ Validated: Project "${projectKey}" exists in Jira`));
|
|
408
|
+
// Print link to validated project
|
|
409
|
+
const projectUrl = `https://${this.domain}/jira/software/c/projects/${project.key}`;
|
|
410
|
+
console.log(chalk.cyan(`🔗 View in Jira: ${projectUrl}`));
|
|
411
|
+
result.project = {
|
|
412
|
+
exists: true,
|
|
413
|
+
key: project.key,
|
|
414
|
+
id: project.id,
|
|
415
|
+
name: project.name,
|
|
416
|
+
};
|
|
417
|
+
// Track for multi-project ID collection
|
|
418
|
+
allProjects.push({
|
|
419
|
+
key: project.key,
|
|
420
|
+
id: project.id,
|
|
421
|
+
name: project.name,
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
console.log(); // Empty line after project validation
|
|
426
|
+
// Update .env with project IDs (for multi-project strategy)
|
|
427
|
+
if (strategy === 'project-per-team' && allProjects.length > 0) {
|
|
428
|
+
const projectIds = allProjects.map(p => p.id).join(',');
|
|
429
|
+
await this.updateEnv({ JIRA_PROJECT_IDS: projectIds });
|
|
430
|
+
result.envUpdated = true;
|
|
431
|
+
console.log(chalk.green(`✅ Updated .env with project IDs: ${projectIds}\n`));
|
|
432
|
+
}
|
|
433
|
+
else if (allProjects.length === 1) {
|
|
434
|
+
// Single project - store both key and ID
|
|
435
|
+
await this.updateEnv({ JIRA_PROJECT_ID: allProjects[0].id });
|
|
436
|
+
result.envUpdated = true;
|
|
437
|
+
console.log(chalk.green(`✅ Updated .env with project ID: ${allProjects[0].id}\n`));
|
|
438
|
+
}
|
|
439
|
+
// 2. Validate boards (per-project OR legacy board-based strategy)
|
|
440
|
+
result.boards = { valid: true, existing: [], missing: [], created: [] };
|
|
441
|
+
// NEW: Check for per-project boards (JIRA_BOARDS_{ProjectKey})
|
|
442
|
+
let hasPerProjectBoards = false;
|
|
443
|
+
for (const projectKey of projectKeys) {
|
|
444
|
+
const perProjectKey = `JIRA_BOARDS_${projectKey}`;
|
|
445
|
+
if (env[perProjectKey]) {
|
|
446
|
+
hasPerProjectBoards = true;
|
|
447
|
+
break;
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
if (hasPerProjectBoards) {
|
|
451
|
+
// Per-project boards (NEW!)
|
|
452
|
+
console.log(chalk.gray(`Checking per-project boards...\n`));
|
|
453
|
+
// Track board names to detect conflicts across projects
|
|
454
|
+
const boardNamesSeen = new Map(); // name -> project
|
|
455
|
+
for (const projectKey of projectKeys) {
|
|
456
|
+
const perProjectKey = `JIRA_BOARDS_${projectKey}`;
|
|
457
|
+
const boardsConfig = env[perProjectKey];
|
|
458
|
+
if (boardsConfig) {
|
|
459
|
+
const boardEntries = boardsConfig.split(',').map((b) => b.trim()).filter(b => b);
|
|
460
|
+
if (boardEntries.length > 0) {
|
|
461
|
+
console.log(chalk.gray(` Project: ${projectKey} (${boardEntries.length} boards)`));
|
|
462
|
+
const finalBoardIds = [];
|
|
463
|
+
for (const entry of boardEntries) {
|
|
464
|
+
const isNumeric = /^\d+$/.test(entry);
|
|
465
|
+
if (isNumeric) {
|
|
466
|
+
// Entry is a board ID - validate it exists AND belongs to this project
|
|
467
|
+
const boardId = parseInt(entry, 10);
|
|
468
|
+
const board = await this.checkBoard(boardId);
|
|
469
|
+
if (board) {
|
|
470
|
+
// NEW: Validate board belongs to the correct project
|
|
471
|
+
if (board.location?.projectKey && board.location.projectKey !== projectKey) {
|
|
472
|
+
console.log(chalk.yellow(` ⚠️ Board ${boardId}: ${board.name} belongs to project ${board.location.projectKey}, not ${projectKey}`));
|
|
473
|
+
console.log(chalk.gray(` Expected: ${projectKey}, Found: ${board.location.projectKey}`));
|
|
474
|
+
result.boards.missing.push(entry);
|
|
475
|
+
result.boards.valid = false;
|
|
476
|
+
}
|
|
477
|
+
else {
|
|
478
|
+
// Board exists and belongs to correct project (or project unknown - backward compat)
|
|
479
|
+
if (board.location?.projectKey) {
|
|
480
|
+
console.log(chalk.green(` ✅ Board ${boardId}: ${board.name} (project: ${board.location.projectKey})`));
|
|
481
|
+
}
|
|
482
|
+
else {
|
|
483
|
+
console.log(chalk.green(` ✅ Board ${boardId}: ${board.name} (project verification skipped)`));
|
|
484
|
+
}
|
|
485
|
+
result.boards.existing.push(board.id);
|
|
486
|
+
finalBoardIds.push(board.id);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
else {
|
|
490
|
+
console.log(chalk.yellow(` ⚠️ Board ${boardId}: Not found`));
|
|
491
|
+
result.boards.missing.push(entry);
|
|
492
|
+
result.boards.valid = false;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
else {
|
|
496
|
+
// Entry is a board name - check for conflicts, then create it
|
|
497
|
+
// NEW: Detect board name conflicts across projects
|
|
498
|
+
if (boardNamesSeen.has(entry)) {
|
|
499
|
+
const existingProject = boardNamesSeen.get(entry);
|
|
500
|
+
console.log(chalk.yellow(` ⚠️ Board name conflict: "${entry}" already used in project ${existingProject}`));
|
|
501
|
+
console.log(chalk.gray(` Tip: Use unique board names or append project suffix (e.g., "${entry}-${projectKey}")`));
|
|
502
|
+
result.boards.missing.push(entry);
|
|
503
|
+
result.boards.valid = false;
|
|
504
|
+
}
|
|
505
|
+
else {
|
|
506
|
+
console.log(chalk.blue(` 📦 Creating board: ${entry}...`));
|
|
507
|
+
try {
|
|
508
|
+
const board = await this.createBoard(entry, projectKey);
|
|
509
|
+
console.log(chalk.green(` ✅ Created: ${entry} (ID: ${board.id})`));
|
|
510
|
+
result.boards.created.push({ name: entry, id: board.id });
|
|
511
|
+
finalBoardIds.push(board.id);
|
|
512
|
+
boardNamesSeen.set(entry, projectKey); // Track this board name
|
|
513
|
+
}
|
|
514
|
+
catch (error) {
|
|
515
|
+
console.log(chalk.red(` ❌ Failed to create ${entry}: ${error.message}`));
|
|
516
|
+
result.boards.missing.push(entry);
|
|
517
|
+
result.boards.valid = false;
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
// Update .env with final board IDs for this project
|
|
523
|
+
if (finalBoardIds.length > 0) {
|
|
524
|
+
await this.updateEnv({ [perProjectKey]: finalBoardIds.join(',') });
|
|
525
|
+
result.envUpdated = true;
|
|
526
|
+
console.log(chalk.green(` ✅ Updated ${perProjectKey}: ${finalBoardIds.join(',')}`));
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
console.log();
|
|
532
|
+
}
|
|
533
|
+
else {
|
|
534
|
+
// Legacy: Global boards (backward compatibility)
|
|
535
|
+
const boardsConfig = env.JIRA_BOARDS || '';
|
|
536
|
+
if (boardsConfig && strategy === 'board-based') {
|
|
537
|
+
console.log(chalk.gray(`Checking boards: ${boardsConfig}...`));
|
|
538
|
+
// For board-based strategy, use the single project key
|
|
539
|
+
const projectKeyForBoards = projectKeys[0];
|
|
540
|
+
const boardEntries = boardsConfig.split(',').map((b) => b.trim());
|
|
541
|
+
const finalBoardIds = [];
|
|
542
|
+
for (const entry of boardEntries) {
|
|
543
|
+
const isNumeric = /^\d+$/.test(entry);
|
|
544
|
+
if (isNumeric) {
|
|
545
|
+
// Entry is a board ID - validate it exists
|
|
546
|
+
const boardId = parseInt(entry, 10);
|
|
547
|
+
const board = await this.checkBoard(boardId);
|
|
548
|
+
if (board) {
|
|
549
|
+
console.log(chalk.green(` ✅ Board ${boardId}: ${board.name} (exists)`));
|
|
550
|
+
result.boards.existing.push(board.id);
|
|
551
|
+
finalBoardIds.push(board.id);
|
|
552
|
+
}
|
|
553
|
+
else {
|
|
554
|
+
console.log(chalk.yellow(` ⚠️ Board ${boardId}: Not found`));
|
|
555
|
+
result.boards.missing.push(entry);
|
|
556
|
+
result.boards.valid = false;
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
else {
|
|
560
|
+
// Entry is a board name - create it
|
|
561
|
+
console.log(chalk.blue(` 📦 Creating board: ${entry}...`));
|
|
562
|
+
try {
|
|
563
|
+
const board = await this.createBoard(entry, projectKeyForBoards);
|
|
564
|
+
console.log(chalk.green(` ✅ Created: ${entry} (ID: ${board.id})`));
|
|
565
|
+
result.boards.created.push({ name: entry, id: board.id });
|
|
566
|
+
finalBoardIds.push(board.id);
|
|
567
|
+
}
|
|
568
|
+
catch (error) {
|
|
569
|
+
console.log(chalk.red(` ❌ Failed to create ${entry}: ${error.message}`));
|
|
570
|
+
result.boards.missing.push(entry);
|
|
571
|
+
result.boards.valid = false;
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
// Update .env if any boards were created
|
|
576
|
+
if (result.boards.created.length > 0) {
|
|
577
|
+
console.log(chalk.blue('\n📝 Updating .env with board IDs...'));
|
|
578
|
+
await this.updateEnv({ JIRA_BOARDS: finalBoardIds.join(',') });
|
|
579
|
+
result.boards.existing = finalBoardIds;
|
|
580
|
+
result.envUpdated = true;
|
|
581
|
+
console.log(chalk.green(`✅ Updated JIRA_BOARDS: ${finalBoardIds.join(',')}`));
|
|
582
|
+
}
|
|
583
|
+
// Summary
|
|
584
|
+
console.log();
|
|
585
|
+
if (result.boards.missing.length > 0) {
|
|
586
|
+
console.log(chalk.yellow(`⚠️ Issues found: ${result.boards.missing.length} board(s)\n`));
|
|
587
|
+
}
|
|
588
|
+
else {
|
|
589
|
+
console.log(chalk.green(`✅ All boards validated/created successfully\n`));
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
return result;
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
// ============================================================================
|
|
597
|
+
// Utility Functions
|
|
598
|
+
// ============================================================================
|
|
599
|
+
/**
|
|
600
|
+
* Validate Jira resources
|
|
601
|
+
*/
|
|
602
|
+
export async function validateJiraResources(envPath = '.env') {
|
|
603
|
+
const validator = new JiraResourceValidator(envPath);
|
|
604
|
+
return validator.validate();
|
|
605
|
+
}
|
|
606
|
+
//# sourceMappingURL=jira-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jira-validator.js","sourceRoot":"","sources":["../../../../src/utils/validators/jira-validator.ts"],"names":[],"mappings":"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"}
|