specweave 0.28.19 → 0.28.20
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/dist/plugins/specweave-ado/lib/ado-spec-sync.d.ts +16 -0
- package/dist/plugins/specweave-ado/lib/ado-spec-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-ado/lib/ado-spec-sync.js +63 -3
- package/dist/plugins/specweave-ado/lib/ado-spec-sync.js.map +1 -1
- package/dist/plugins/specweave-ado/lib/ado-status-sync.d.ts +12 -3
- package/dist/plugins/specweave-ado/lib/ado-status-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-ado/lib/ado-status-sync.js +37 -3
- package/dist/plugins/specweave-ado/lib/ado-status-sync.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-increment-sync-cli.d.ts +8 -6
- package/dist/plugins/specweave-github/lib/github-increment-sync-cli.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-increment-sync-cli.js +230 -165
- package/dist/plugins/specweave-github/lib/github-increment-sync-cli.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-status-sync.d.ts +10 -0
- package/dist/plugins/specweave-github/lib/github-status-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-status-sync.js +40 -2
- package/dist/plugins/specweave-github/lib/github-status-sync.js.map +1 -1
- package/dist/plugins/specweave-github/lib/increment-issue-builder.d.ts +2 -0
- package/dist/plugins/specweave-github/lib/increment-issue-builder.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/increment-issue-builder.js +25 -5
- package/dist/plugins/specweave-github/lib/increment-issue-builder.js.map +1 -1
- package/dist/plugins/specweave-jira/lib/jira-spec-sync.d.ts +12 -0
- package/dist/plugins/specweave-jira/lib/jira-spec-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-jira/lib/jira-spec-sync.js +57 -5
- package/dist/plugins/specweave-jira/lib/jira-spec-sync.js.map +1 -1
- package/dist/plugins/specweave-jira/lib/jira-status-sync.d.ts +5 -1
- package/dist/plugins/specweave-jira/lib/jira-status-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-jira/lib/jira-status-sync.js +12 -4
- package/dist/plugins/specweave-jira/lib/jira-status-sync.js.map +1 -1
- package/dist/src/cli/helpers/init/external-import.d.ts.map +1 -1
- package/dist/src/cli/helpers/init/external-import.js +186 -19
- package/dist/src/cli/helpers/init/external-import.js.map +1 -1
- package/dist/src/cli/helpers/init/jira-ado-auto-detect.d.ts +115 -0
- package/dist/src/cli/helpers/init/jira-ado-auto-detect.d.ts.map +1 -0
- package/dist/src/cli/helpers/init/jira-ado-auto-detect.js +590 -0
- package/dist/src/cli/helpers/init/jira-ado-auto-detect.js.map +1 -0
- package/dist/src/config/types.d.ts +6 -6
- package/dist/src/core/background/index.d.ts +11 -0
- package/dist/src/core/background/index.d.ts.map +1 -0
- package/dist/src/core/background/index.js +11 -0
- package/dist/src/core/background/index.js.map +1 -0
- package/dist/src/core/background/job-manager.d.ts +65 -0
- package/dist/src/core/background/job-manager.d.ts.map +1 -0
- package/dist/src/core/background/job-manager.js +192 -0
- package/dist/src/core/background/job-manager.js.map +1 -0
- package/dist/src/core/background/types.d.ts +59 -0
- package/dist/src/core/background/types.d.ts.map +1 -0
- package/dist/src/core/background/types.js +8 -0
- package/dist/src/core/background/types.js.map +1 -0
- package/dist/src/core/repo-structure/multi-repo-configurator.d.ts +25 -0
- package/dist/src/core/repo-structure/multi-repo-configurator.d.ts.map +1 -0
- package/dist/src/core/repo-structure/multi-repo-configurator.js +614 -0
- package/dist/src/core/repo-structure/multi-repo-configurator.js.map +1 -0
- package/dist/src/core/repo-structure/repo-initializer.d.ts +40 -0
- package/dist/src/core/repo-structure/repo-initializer.d.ts.map +1 -0
- package/dist/src/core/repo-structure/repo-initializer.js +252 -0
- package/dist/src/core/repo-structure/repo-initializer.js.map +1 -0
- package/dist/src/core/repo-structure/repo-structure-manager.d.ts +3 -37
- package/dist/src/core/repo-structure/repo-structure-manager.d.ts.map +1 -1
- package/dist/src/core/repo-structure/repo-structure-manager.js +23 -803
- package/dist/src/core/repo-structure/repo-structure-manager.js.map +1 -1
- package/dist/src/core/types/spec-metadata.d.ts +2 -0
- package/dist/src/core/types/spec-metadata.d.ts.map +1 -1
- package/dist/src/importers/import-coordinator.d.ts +20 -0
- package/dist/src/importers/import-coordinator.d.ts.map +1 -1
- package/dist/src/importers/import-coordinator.js.map +1 -1
- package/dist/src/init/architecture/types.d.ts +2 -2
- package/dist/src/init/compliance/types.d.ts +1 -1
- package/package.json +1 -1
- package/plugins/specweave/commands/specweave-jobs.md +160 -0
- package/plugins/specweave-ado/lib/ado-spec-sync.js +59 -3
- package/plugins/specweave-ado/lib/ado-spec-sync.ts +72 -3
- package/plugins/specweave-ado/lib/ado-status-sync.js +35 -3
- package/plugins/specweave-ado/lib/ado-status-sync.ts +48 -4
- package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +6 -0
- package/plugins/specweave-github/lib/github-increment-sync-cli.js +268 -155
- package/plugins/specweave-github/lib/github-increment-sync-cli.ts +313 -209
- package/plugins/specweave-github/lib/github-status-sync.js +37 -1
- package/plugins/specweave-github/lib/github-status-sync.ts +60 -4
- package/plugins/specweave-github/lib/increment-issue-builder.js +26 -5
- package/plugins/specweave-github/lib/increment-issue-builder.ts +36 -5
- package/plugins/specweave-jira/lib/jira-spec-sync.js +53 -5
- package/plugins/specweave-jira/lib/jira-spec-sync.ts +87 -7
- package/plugins/specweave-jira/lib/jira-status-sync.js +9 -3
- package/plugins/specweave-jira/lib/jira-status-sync.ts +15 -6
- package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +9 -0
|
@@ -0,0 +1,590 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JIRA/ADO Auto-Detection for Init
|
|
3
|
+
*
|
|
4
|
+
* Analyzes external tool structure and recommends optimal organization.
|
|
5
|
+
* Supports 2-level folder structure: specs/{provider-project}/{board-or-area}/
|
|
6
|
+
*
|
|
7
|
+
* @module cli/helpers/init/jira-ado-auto-detect
|
|
8
|
+
*/
|
|
9
|
+
import chalk from 'chalk';
|
|
10
|
+
import ora from 'ora';
|
|
11
|
+
import { select, confirm } from '@inquirer/prompts';
|
|
12
|
+
import { JiraClient } from '../../../integrations/jira/jira-client.js';
|
|
13
|
+
import { fetchBoardsForProject } from '../../../../plugins/specweave-jira/lib/jira-board-resolver.js';
|
|
14
|
+
import { fetchAreaPathsForProject } from '../../../../plugins/specweave-ado/lib/ado-board-resolver.js';
|
|
15
|
+
import { normalizeToProjectId } from '../../../utils/project-id-generator.js';
|
|
16
|
+
// =============================================================================
|
|
17
|
+
// SMART ANALYSIS - Pattern Detection
|
|
18
|
+
// =============================================================================
|
|
19
|
+
/** Keywords for detecting team patterns */
|
|
20
|
+
const PATTERN_KEYWORDS = {
|
|
21
|
+
'tech-stack': ['frontend', 'backend', 'mobile', 'ios', 'android', 'web', 'api', 'ui', 'ux', 'server', 'client', 'infra'],
|
|
22
|
+
'squad-based': ['team', 'squad', 'pod', 'tribe', 'crew', 'group', 'alpha', 'beta', 'gamma', 'delta'],
|
|
23
|
+
'domain-based': ['payment', 'user', 'order', 'catalog', 'checkout', 'shipping', 'inventory', 'customer', 'billing', 'auth'],
|
|
24
|
+
'service-based': ['platform', 'infrastructure', 'devops', 'sre', 'core', 'shared', 'common', 'tools', 'ops'],
|
|
25
|
+
'feature-based': ['feature', 'epic', 'initiative', 'project', 'release', 'sprint'],
|
|
26
|
+
'mixed': [],
|
|
27
|
+
'unknown': [],
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Analyze names to detect team organization pattern
|
|
31
|
+
*/
|
|
32
|
+
function detectTeamPattern(names) {
|
|
33
|
+
const normalizedNames = names.map(n => n.toLowerCase());
|
|
34
|
+
const matches = new Map();
|
|
35
|
+
// Check each pattern
|
|
36
|
+
for (const [pattern, keywords] of Object.entries(PATTERN_KEYWORDS)) {
|
|
37
|
+
if (pattern === 'mixed' || pattern === 'unknown')
|
|
38
|
+
continue;
|
|
39
|
+
const matchedNames = [];
|
|
40
|
+
for (const name of normalizedNames) {
|
|
41
|
+
for (const keyword of keywords) {
|
|
42
|
+
if (name.includes(keyword)) {
|
|
43
|
+
matchedNames.push(names[normalizedNames.indexOf(name)]);
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (matchedNames.length > 0) {
|
|
49
|
+
matches.set(pattern, matchedNames);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// Determine primary pattern
|
|
53
|
+
if (matches.size === 0) {
|
|
54
|
+
return { pattern: 'unknown', confidence: 'low', matches };
|
|
55
|
+
}
|
|
56
|
+
if (matches.size > 2) {
|
|
57
|
+
return { pattern: 'mixed', confidence: 'medium', matches };
|
|
58
|
+
}
|
|
59
|
+
// Find pattern with most matches
|
|
60
|
+
let bestPattern = 'unknown';
|
|
61
|
+
let bestCount = 0;
|
|
62
|
+
for (const [pattern, matched] of matches) {
|
|
63
|
+
if (matched.length > bestCount) {
|
|
64
|
+
bestCount = matched.length;
|
|
65
|
+
bestPattern = pattern;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const coverage = bestCount / names.length;
|
|
69
|
+
const confidence = coverage > 0.7 ? 'high' : coverage > 0.4 ? 'medium' : 'low';
|
|
70
|
+
return { pattern: bestPattern, confidence, matches };
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Generate reasoning explanation for detected pattern
|
|
74
|
+
*/
|
|
75
|
+
function generateReasoning(pattern, matches, scrumCount, kanbanCount) {
|
|
76
|
+
const parts = [];
|
|
77
|
+
// Pattern explanation
|
|
78
|
+
const patternDescriptions = {
|
|
79
|
+
'tech-stack': 'Teams organized by technology layer (Frontend/Backend/Mobile)',
|
|
80
|
+
'squad-based': 'Cross-functional squads or pods',
|
|
81
|
+
'domain-based': 'Teams organized by business domain',
|
|
82
|
+
'service-based': 'Platform/infrastructure focused teams',
|
|
83
|
+
'feature-based': 'Teams organized around features or initiatives',
|
|
84
|
+
'mixed': 'Multiple organization patterns detected',
|
|
85
|
+
'unknown': 'No clear organizational pattern detected',
|
|
86
|
+
};
|
|
87
|
+
parts.push(patternDescriptions[pattern]);
|
|
88
|
+
// Show matched keywords
|
|
89
|
+
if (matches.size > 0) {
|
|
90
|
+
const examples = [];
|
|
91
|
+
for (const [, matched] of matches) {
|
|
92
|
+
examples.push(...matched.slice(0, 2));
|
|
93
|
+
}
|
|
94
|
+
if (examples.length > 0) {
|
|
95
|
+
parts.push(`Found: ${examples.slice(0, 4).join(', ')}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Board type insight
|
|
99
|
+
if (scrumCount > 0 || kanbanCount > 0) {
|
|
100
|
+
const boardInfo = [];
|
|
101
|
+
if (scrumCount > 0)
|
|
102
|
+
boardInfo.push(`${scrumCount} Scrum`);
|
|
103
|
+
if (kanbanCount > 0)
|
|
104
|
+
boardInfo.push(`${kanbanCount} Kanban`);
|
|
105
|
+
parts.push(`Board types: ${boardInfo.join(', ')}`);
|
|
106
|
+
}
|
|
107
|
+
return parts.join('. ');
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Analyze JIRA structure and create detailed analysis
|
|
111
|
+
*/
|
|
112
|
+
function analyzeJiraStructureDeep(projects) {
|
|
113
|
+
// Collect all board names
|
|
114
|
+
const allBoardNames = [];
|
|
115
|
+
let scrumCount = 0;
|
|
116
|
+
let kanbanCount = 0;
|
|
117
|
+
for (const project of projects) {
|
|
118
|
+
for (const board of project.boards) {
|
|
119
|
+
allBoardNames.push(board.name);
|
|
120
|
+
if (board.type === 'scrum')
|
|
121
|
+
scrumCount++;
|
|
122
|
+
else if (board.type === 'kanban')
|
|
123
|
+
kanbanCount++;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Detect pattern
|
|
127
|
+
const { pattern, confidence, matches } = detectTeamPattern(allBoardNames);
|
|
128
|
+
// Generate example mappings
|
|
129
|
+
const suggestedMapping = [];
|
|
130
|
+
for (const project of projects.slice(0, 2)) {
|
|
131
|
+
for (const board of project.boards.slice(0, 2)) {
|
|
132
|
+
const folder = `JIRA-${normalizeToProjectId(project.key)}/${normalizeToProjectId(board.name)}`;
|
|
133
|
+
suggestedMapping.push(folder);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return {
|
|
137
|
+
pattern,
|
|
138
|
+
confidence,
|
|
139
|
+
reasoning: generateReasoning(pattern, matches, scrumCount, kanbanCount),
|
|
140
|
+
scrumBoardCount: scrumCount,
|
|
141
|
+
kanbanBoardCount: kanbanCount,
|
|
142
|
+
suggestedMapping,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Analyze ADO structure and create detailed analysis
|
|
147
|
+
*/
|
|
148
|
+
function analyzeAdoStructureDeep(projects) {
|
|
149
|
+
// Collect all area path names
|
|
150
|
+
const allAreaNames = [];
|
|
151
|
+
for (const project of projects) {
|
|
152
|
+
for (const area of project.areaPaths) {
|
|
153
|
+
allAreaNames.push(area.name);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// Detect pattern
|
|
157
|
+
const { pattern, confidence, matches } = detectTeamPattern(allAreaNames);
|
|
158
|
+
// Generate example mappings
|
|
159
|
+
const suggestedMapping = [];
|
|
160
|
+
for (const project of projects.slice(0, 2)) {
|
|
161
|
+
for (const area of project.areaPaths.slice(0, 2)) {
|
|
162
|
+
const folder = `ADO-${normalizeToProjectId(project.name)}/${normalizeToProjectId(area.name)}`;
|
|
163
|
+
suggestedMapping.push(folder);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return {
|
|
167
|
+
pattern,
|
|
168
|
+
confidence,
|
|
169
|
+
reasoning: generateReasoning(pattern, matches, 0, 0),
|
|
170
|
+
scrumBoardCount: 0,
|
|
171
|
+
kanbanBoardCount: 0,
|
|
172
|
+
suggestedMapping,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
// =============================================================================
|
|
176
|
+
// JIRA AUTO-DETECTION
|
|
177
|
+
// =============================================================================
|
|
178
|
+
/**
|
|
179
|
+
* Auto-detect JIRA structure: projects and their boards
|
|
180
|
+
*/
|
|
181
|
+
export async function detectJiraStructure() {
|
|
182
|
+
const spinner = ora('Analyzing JIRA structure...').start();
|
|
183
|
+
try {
|
|
184
|
+
const client = new JiraClient();
|
|
185
|
+
// 1. Fetch all accessible projects
|
|
186
|
+
const projects = await client.getProjects();
|
|
187
|
+
if (!projects || projects.length === 0) {
|
|
188
|
+
spinner.warn('No JIRA projects found');
|
|
189
|
+
return null;
|
|
190
|
+
}
|
|
191
|
+
// 2. For each project, fetch boards
|
|
192
|
+
const projectInfos = [];
|
|
193
|
+
let totalBoards = 0;
|
|
194
|
+
for (const project of projects.slice(0, 20)) { // Limit to 20 projects for performance
|
|
195
|
+
try {
|
|
196
|
+
const boards = await fetchBoardsForProject(client, project.key);
|
|
197
|
+
projectInfos.push({
|
|
198
|
+
key: project.key,
|
|
199
|
+
name: project.name,
|
|
200
|
+
boards: boards || [],
|
|
201
|
+
});
|
|
202
|
+
totalBoards += boards?.length || 0;
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
// Skip projects where we can't fetch boards
|
|
206
|
+
projectInfos.push({
|
|
207
|
+
key: project.key,
|
|
208
|
+
name: project.name,
|
|
209
|
+
boards: [],
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
// 3. Analyze structure and recommend mode
|
|
214
|
+
const recommendedMode = analyzeJiraStructure(projectInfos, totalBoards);
|
|
215
|
+
const analysis = analyzeJiraStructureDeep(projectInfos);
|
|
216
|
+
spinner.succeed(`Found ${projectInfos.length} projects with ${totalBoards} boards`);
|
|
217
|
+
return {
|
|
218
|
+
projects: projectInfos,
|
|
219
|
+
totalBoards,
|
|
220
|
+
recommendedMode,
|
|
221
|
+
analysis,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
catch (error) {
|
|
225
|
+
spinner.fail('Failed to analyze JIRA structure');
|
|
226
|
+
console.log(chalk.gray(` Error: ${error instanceof Error ? error.message : String(error)}`));
|
|
227
|
+
return null;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Analyze JIRA structure and recommend organization mode
|
|
232
|
+
*/
|
|
233
|
+
function analyzeJiraStructure(projects, totalBoards) {
|
|
234
|
+
const projectCount = projects.length;
|
|
235
|
+
const avgBoardsPerProject = totalBoards / projectCount;
|
|
236
|
+
// Single project
|
|
237
|
+
if (projectCount === 1) {
|
|
238
|
+
const boards = projects[0].boards.length;
|
|
239
|
+
if (boards <= 1)
|
|
240
|
+
return 'simple';
|
|
241
|
+
return 'by-board'; // Multiple boards in single project → board-based
|
|
242
|
+
}
|
|
243
|
+
// Multiple projects
|
|
244
|
+
if (avgBoardsPerProject <= 1.5) {
|
|
245
|
+
return 'by-project'; // Most projects have 1 board → project-based
|
|
246
|
+
}
|
|
247
|
+
return 'hybrid'; // Multiple projects with multiple boards → 2-level
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Display JIRA structure and get user confirmation
|
|
251
|
+
*/
|
|
252
|
+
export async function confirmJiraMapping(structure) {
|
|
253
|
+
console.log(chalk.cyan('\n📊 Detected JIRA Structure:\n'));
|
|
254
|
+
// Show detected structure
|
|
255
|
+
for (const project of structure.projects.slice(0, 10)) {
|
|
256
|
+
const boardList = project.boards.length > 0
|
|
257
|
+
? project.boards.map(b => `${b.name}${b.type ? ` (${b.type})` : ''}`).join(', ')
|
|
258
|
+
: '(no boards)';
|
|
259
|
+
console.log(chalk.white(` ${project.key}`), chalk.gray(`(${project.boards.length} boards): ${boardList}`));
|
|
260
|
+
}
|
|
261
|
+
if (structure.projects.length > 10) {
|
|
262
|
+
console.log(chalk.gray(` ... and ${structure.projects.length - 10} more projects`));
|
|
263
|
+
}
|
|
264
|
+
// Show analysis insight
|
|
265
|
+
console.log('');
|
|
266
|
+
const { analysis } = structure;
|
|
267
|
+
const patternEmoji = {
|
|
268
|
+
'tech-stack': '🔧',
|
|
269
|
+
'squad-based': '👥',
|
|
270
|
+
'domain-based': '📦',
|
|
271
|
+
'service-based': '⚙️',
|
|
272
|
+
'feature-based': '🎯',
|
|
273
|
+
'mixed': '🔀',
|
|
274
|
+
'unknown': '❓',
|
|
275
|
+
};
|
|
276
|
+
console.log(chalk.yellow(`${patternEmoji[analysis.pattern]} Team Pattern: ${analysis.pattern} (${analysis.confidence} confidence)`));
|
|
277
|
+
console.log(chalk.gray(` ${analysis.reasoning}`));
|
|
278
|
+
if (analysis.scrumBoardCount > 0 || analysis.kanbanBoardCount > 0) {
|
|
279
|
+
console.log(chalk.gray(` Methodology: ${analysis.scrumBoardCount} Scrum boards, ${analysis.kanbanBoardCount} Kanban boards`));
|
|
280
|
+
}
|
|
281
|
+
// Show recommended organization
|
|
282
|
+
console.log('');
|
|
283
|
+
const modeDescriptions = {
|
|
284
|
+
'simple': 'All items → specs/jira/',
|
|
285
|
+
'by-project': 'specs/JIRA-{PROJECT}/',
|
|
286
|
+
'by-board': 'specs/JIRA-{PROJECT}/{board}/',
|
|
287
|
+
'hybrid': 'specs/JIRA-{PROJECT}/{board}/ (2-level)',
|
|
288
|
+
};
|
|
289
|
+
console.log(chalk.green(`💡 Recommended: ${modeDescriptions[structure.recommendedMode]}`));
|
|
290
|
+
console.log('');
|
|
291
|
+
// Let user choose
|
|
292
|
+
const mode = await select({
|
|
293
|
+
message: 'How do you want to organize JIRA items?',
|
|
294
|
+
choices: [
|
|
295
|
+
{
|
|
296
|
+
name: `${structure.recommendedMode === 'simple' ? '● ' : '○ '}Simple (all items in one folder)`,
|
|
297
|
+
value: 'simple',
|
|
298
|
+
},
|
|
299
|
+
{
|
|
300
|
+
name: `${structure.recommendedMode === 'by-project' ? '● ' : '○ '}By Project (specs/JIRA-{PROJECT}/)`,
|
|
301
|
+
value: 'by-project',
|
|
302
|
+
},
|
|
303
|
+
{
|
|
304
|
+
name: `${structure.recommendedMode === 'by-board' || structure.recommendedMode === 'hybrid' ? '● ' : '○ '}By Board (specs/JIRA-{PROJECT}/{board}/) [2-level]`,
|
|
305
|
+
value: 'hybrid',
|
|
306
|
+
},
|
|
307
|
+
],
|
|
308
|
+
default: structure.recommendedMode === 'by-board' ? 'hybrid' : structure.recommendedMode,
|
|
309
|
+
});
|
|
310
|
+
// Build mappings based on mode
|
|
311
|
+
const mappings = new Map();
|
|
312
|
+
for (const project of structure.projects) {
|
|
313
|
+
const projectFolder = normalizeToProjectId(project.key);
|
|
314
|
+
const boardMappings = new Map();
|
|
315
|
+
if (mode === 'simple') {
|
|
316
|
+
boardMappings.set('*', 'jira');
|
|
317
|
+
}
|
|
318
|
+
else if (mode === 'by-project') {
|
|
319
|
+
boardMappings.set('*', `JIRA-${projectFolder}`);
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
// hybrid/by-board: each board gets its own folder
|
|
323
|
+
if (project.boards.length === 0) {
|
|
324
|
+
boardMappings.set('*', `JIRA-${projectFolder}/default`);
|
|
325
|
+
}
|
|
326
|
+
else {
|
|
327
|
+
for (const board of project.boards) {
|
|
328
|
+
const boardFolder = normalizeToProjectId(board.name);
|
|
329
|
+
boardMappings.set(board.name, `JIRA-${projectFolder}/${boardFolder}`);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
mappings.set(project.key, boardMappings);
|
|
334
|
+
}
|
|
335
|
+
// Show preview
|
|
336
|
+
console.log(chalk.cyan('\n📁 Folder Structure Preview:\n'));
|
|
337
|
+
let shown = 0;
|
|
338
|
+
outer: for (const [projectKey, boardMap] of mappings) {
|
|
339
|
+
for (const [, folder] of boardMap) {
|
|
340
|
+
console.log(chalk.gray(` specs/${folder}/FS-XXX/`));
|
|
341
|
+
shown++;
|
|
342
|
+
if (shown >= 6) {
|
|
343
|
+
if (mappings.size > 3)
|
|
344
|
+
console.log(chalk.gray(' ...'));
|
|
345
|
+
break outer;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
const confirmed = await confirm({
|
|
350
|
+
message: 'Accept this organization?',
|
|
351
|
+
default: true,
|
|
352
|
+
});
|
|
353
|
+
if (!confirmed) {
|
|
354
|
+
return null;
|
|
355
|
+
}
|
|
356
|
+
return { mode, mappings };
|
|
357
|
+
}
|
|
358
|
+
// =============================================================================
|
|
359
|
+
// ADO AUTO-DETECTION
|
|
360
|
+
// =============================================================================
|
|
361
|
+
/**
|
|
362
|
+
* Auto-detect ADO structure: projects and their area paths
|
|
363
|
+
*/
|
|
364
|
+
export async function detectAdoStructure(organization, pat) {
|
|
365
|
+
const spinner = ora('Analyzing Azure DevOps structure...').start();
|
|
366
|
+
try {
|
|
367
|
+
// Fetch projects using ADO API directly
|
|
368
|
+
const projectsUrl = `https://dev.azure.com/${organization}/_apis/projects?api-version=7.0`;
|
|
369
|
+
const projectsResponse = await fetch(projectsUrl, {
|
|
370
|
+
headers: {
|
|
371
|
+
'Authorization': `Basic ${Buffer.from(`:${pat}`).toString('base64')}`,
|
|
372
|
+
'Content-Type': 'application/json',
|
|
373
|
+
},
|
|
374
|
+
});
|
|
375
|
+
if (!projectsResponse.ok) {
|
|
376
|
+
throw new Error(`ADO API error: ${projectsResponse.status}`);
|
|
377
|
+
}
|
|
378
|
+
const projectsData = await projectsResponse.json();
|
|
379
|
+
const projects = projectsData.value || [];
|
|
380
|
+
if (projects.length === 0) {
|
|
381
|
+
spinner.warn('No ADO projects found');
|
|
382
|
+
return null;
|
|
383
|
+
}
|
|
384
|
+
// For each project, fetch area paths
|
|
385
|
+
const projectInfos = [];
|
|
386
|
+
let totalAreaPaths = 0;
|
|
387
|
+
for (const project of projects.slice(0, 10)) { // Limit to 10 projects
|
|
388
|
+
try {
|
|
389
|
+
const areaPaths = await fetchAreaPathsForProject(organization, project.name, pat);
|
|
390
|
+
// Filter to top-level area paths only (direct children of project root)
|
|
391
|
+
const topLevelPaths = areaPaths.filter(ap => {
|
|
392
|
+
const parts = ap.path.split('\\');
|
|
393
|
+
return parts.length === 2; // "Project\Area"
|
|
394
|
+
});
|
|
395
|
+
projectInfos.push({
|
|
396
|
+
name: project.name,
|
|
397
|
+
areaPaths: topLevelPaths,
|
|
398
|
+
});
|
|
399
|
+
totalAreaPaths += topLevelPaths.length;
|
|
400
|
+
}
|
|
401
|
+
catch {
|
|
402
|
+
projectInfos.push({
|
|
403
|
+
name: project.name,
|
|
404
|
+
areaPaths: [],
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
// Analyze structure and recommend mode
|
|
409
|
+
const recommendedMode = analyzeAdoStructure(projectInfos, totalAreaPaths);
|
|
410
|
+
const analysis = analyzeAdoStructureDeep(projectInfos);
|
|
411
|
+
spinner.succeed(`Found ${projectInfos.length} projects with ${totalAreaPaths} area paths`);
|
|
412
|
+
return {
|
|
413
|
+
projects: projectInfos,
|
|
414
|
+
totalAreaPaths,
|
|
415
|
+
recommendedMode,
|
|
416
|
+
analysis,
|
|
417
|
+
};
|
|
418
|
+
}
|
|
419
|
+
catch (error) {
|
|
420
|
+
spinner.fail('Failed to analyze ADO structure');
|
|
421
|
+
console.log(chalk.gray(` Error: ${error instanceof Error ? error.message : String(error)}`));
|
|
422
|
+
return null;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* Analyze ADO structure and recommend organization mode
|
|
427
|
+
*/
|
|
428
|
+
function analyzeAdoStructure(projects, totalAreaPaths) {
|
|
429
|
+
const projectCount = projects.length;
|
|
430
|
+
const avgAreasPerProject = totalAreaPaths / projectCount;
|
|
431
|
+
// Single project
|
|
432
|
+
if (projectCount === 1) {
|
|
433
|
+
const areas = projects[0].areaPaths.length;
|
|
434
|
+
if (areas <= 1)
|
|
435
|
+
return 'simple';
|
|
436
|
+
return 'by-area'; // Multiple area paths → area-based (2-level)
|
|
437
|
+
}
|
|
438
|
+
// Multiple projects
|
|
439
|
+
if (avgAreasPerProject <= 1.5) {
|
|
440
|
+
return 'by-project'; // Most projects have few area paths → project-based
|
|
441
|
+
}
|
|
442
|
+
return 'by-area'; // Multiple projects with multiple areas → 2-level
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* Display ADO structure and get user confirmation
|
|
446
|
+
*/
|
|
447
|
+
export async function confirmAdoMapping(structure) {
|
|
448
|
+
console.log(chalk.cyan('\n📊 Detected Azure DevOps Structure:\n'));
|
|
449
|
+
// Show detected structure
|
|
450
|
+
for (const project of structure.projects.slice(0, 10)) {
|
|
451
|
+
const areaList = project.areaPaths.length > 0
|
|
452
|
+
? project.areaPaths.map(a => a.name).join(', ')
|
|
453
|
+
: '(root only)';
|
|
454
|
+
console.log(chalk.white(` ${project.name}`), chalk.gray(`(${project.areaPaths.length} areas): ${areaList}`));
|
|
455
|
+
}
|
|
456
|
+
if (structure.projects.length > 10) {
|
|
457
|
+
console.log(chalk.gray(` ... and ${structure.projects.length - 10} more projects`));
|
|
458
|
+
}
|
|
459
|
+
// Show analysis insight
|
|
460
|
+
console.log('');
|
|
461
|
+
const { analysis } = structure;
|
|
462
|
+
const patternEmoji = {
|
|
463
|
+
'tech-stack': '🔧',
|
|
464
|
+
'squad-based': '👥',
|
|
465
|
+
'domain-based': '📦',
|
|
466
|
+
'service-based': '⚙️',
|
|
467
|
+
'feature-based': '🎯',
|
|
468
|
+
'mixed': '🔀',
|
|
469
|
+
'unknown': '❓',
|
|
470
|
+
};
|
|
471
|
+
console.log(chalk.yellow(`${patternEmoji[analysis.pattern]} Team Pattern: ${analysis.pattern} (${analysis.confidence} confidence)`));
|
|
472
|
+
console.log(chalk.gray(` ${analysis.reasoning}`));
|
|
473
|
+
// Show recommended organization
|
|
474
|
+
console.log('');
|
|
475
|
+
const modeDescriptions = {
|
|
476
|
+
'simple': 'All items → specs/ado/',
|
|
477
|
+
'by-project': 'specs/ADO-{PROJECT}/',
|
|
478
|
+
'by-area': 'specs/ADO-{PROJECT}/{area}/ (2-level)',
|
|
479
|
+
};
|
|
480
|
+
console.log(chalk.green(`💡 Recommended: ${modeDescriptions[structure.recommendedMode]}`));
|
|
481
|
+
console.log('');
|
|
482
|
+
// Let user choose
|
|
483
|
+
const mode = await select({
|
|
484
|
+
message: 'How do you want to organize ADO items?',
|
|
485
|
+
choices: [
|
|
486
|
+
{
|
|
487
|
+
name: `${structure.recommendedMode === 'simple' ? '● ' : '○ '}Simple (all items in one folder)`,
|
|
488
|
+
value: 'simple',
|
|
489
|
+
},
|
|
490
|
+
{
|
|
491
|
+
name: `${structure.recommendedMode === 'by-project' ? '● ' : '○ '}By Project (specs/ADO-{PROJECT}/)`,
|
|
492
|
+
value: 'by-project',
|
|
493
|
+
},
|
|
494
|
+
{
|
|
495
|
+
name: `${structure.recommendedMode === 'by-area' ? '● ' : '○ '}By Area Path (specs/ADO-{PROJECT}/{area}/) [2-level]`,
|
|
496
|
+
value: 'by-area',
|
|
497
|
+
},
|
|
498
|
+
],
|
|
499
|
+
default: structure.recommendedMode,
|
|
500
|
+
});
|
|
501
|
+
// Build mappings based on mode
|
|
502
|
+
const mappings = new Map();
|
|
503
|
+
for (const project of structure.projects) {
|
|
504
|
+
const projectFolder = normalizeToProjectId(project.name);
|
|
505
|
+
const areaMappings = new Map();
|
|
506
|
+
if (mode === 'simple') {
|
|
507
|
+
areaMappings.set('*', 'ado');
|
|
508
|
+
}
|
|
509
|
+
else if (mode === 'by-project') {
|
|
510
|
+
areaMappings.set('*', `ADO-${projectFolder}`);
|
|
511
|
+
}
|
|
512
|
+
else {
|
|
513
|
+
// by-area: each area path gets its own folder
|
|
514
|
+
if (project.areaPaths.length === 0) {
|
|
515
|
+
areaMappings.set('*', `ADO-${projectFolder}/default`);
|
|
516
|
+
}
|
|
517
|
+
else {
|
|
518
|
+
for (const area of project.areaPaths) {
|
|
519
|
+
const areaFolder = normalizeToProjectId(area.name);
|
|
520
|
+
areaMappings.set(area.path, `ADO-${projectFolder}/${areaFolder}`);
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
mappings.set(project.name, areaMappings);
|
|
525
|
+
}
|
|
526
|
+
// Show preview
|
|
527
|
+
console.log(chalk.cyan('\n📁 Folder Structure Preview:\n'));
|
|
528
|
+
let shown = 0;
|
|
529
|
+
outer: for (const [, areaMap] of mappings) {
|
|
530
|
+
for (const [, folder] of areaMap) {
|
|
531
|
+
console.log(chalk.gray(` specs/${folder}/FS-XXX/`));
|
|
532
|
+
shown++;
|
|
533
|
+
if (shown >= 6) {
|
|
534
|
+
if (mappings.size > 3)
|
|
535
|
+
console.log(chalk.gray(' ...'));
|
|
536
|
+
break outer;
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
const confirmed = await confirm({
|
|
541
|
+
message: 'Accept this organization?',
|
|
542
|
+
default: true,
|
|
543
|
+
});
|
|
544
|
+
if (!confirmed) {
|
|
545
|
+
return null;
|
|
546
|
+
}
|
|
547
|
+
return { mode, mappings };
|
|
548
|
+
}
|
|
549
|
+
// =============================================================================
|
|
550
|
+
// COORDINATOR CONFIG BUILDERS
|
|
551
|
+
// =============================================================================
|
|
552
|
+
/**
|
|
553
|
+
* Build JIRA coordinator config from mapping result
|
|
554
|
+
*/
|
|
555
|
+
export function buildJiraCoordinatorConfig(baseConfig, mapping) {
|
|
556
|
+
const projectMappings = [];
|
|
557
|
+
for (const [projectKey, boardMap] of mapping.mappings) {
|
|
558
|
+
const boardMappings = [];
|
|
559
|
+
for (const [boardName, folder] of boardMap) {
|
|
560
|
+
boardMappings.push({ boardName, specweaveFolder: folder });
|
|
561
|
+
}
|
|
562
|
+
projectMappings.push({ projectKey, boardMappings });
|
|
563
|
+
}
|
|
564
|
+
return {
|
|
565
|
+
...baseConfig,
|
|
566
|
+
mode: mapping.mode,
|
|
567
|
+
projectMappings,
|
|
568
|
+
};
|
|
569
|
+
}
|
|
570
|
+
/**
|
|
571
|
+
* Build ADO coordinator config from mapping result
|
|
572
|
+
*/
|
|
573
|
+
export function buildAdoCoordinatorConfig(baseConfig, mapping) {
|
|
574
|
+
const projectMappings = [];
|
|
575
|
+
for (const [projectName, areaMap] of mapping.mappings) {
|
|
576
|
+
const areaMappings = [];
|
|
577
|
+
for (const [areaPath, folder] of areaMap) {
|
|
578
|
+
areaMappings.push({ areaPath, specweaveFolder: folder });
|
|
579
|
+
}
|
|
580
|
+
projectMappings.push({ projectName, areaMappings });
|
|
581
|
+
}
|
|
582
|
+
return {
|
|
583
|
+
orgUrl: baseConfig.orgUrl,
|
|
584
|
+
project: baseConfig.project,
|
|
585
|
+
pat: baseConfig.pat,
|
|
586
|
+
mode: mapping.mode,
|
|
587
|
+
projectMappings,
|
|
588
|
+
};
|
|
589
|
+
}
|
|
590
|
+
//# sourceMappingURL=jira-ado-auto-detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jira-ado-auto-detect.js","sourceRoot":"","sources":["../../../../../src/cli/helpers/init/jira-ado-auto-detect.ts"],"names":[],"mappings":"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"}
|