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.
Files changed (85) hide show
  1. package/dist/plugins/specweave-ado/lib/ado-spec-sync.d.ts +16 -0
  2. package/dist/plugins/specweave-ado/lib/ado-spec-sync.d.ts.map +1 -1
  3. package/dist/plugins/specweave-ado/lib/ado-spec-sync.js +63 -3
  4. package/dist/plugins/specweave-ado/lib/ado-spec-sync.js.map +1 -1
  5. package/dist/plugins/specweave-ado/lib/ado-status-sync.d.ts +12 -3
  6. package/dist/plugins/specweave-ado/lib/ado-status-sync.d.ts.map +1 -1
  7. package/dist/plugins/specweave-ado/lib/ado-status-sync.js +37 -3
  8. package/dist/plugins/specweave-ado/lib/ado-status-sync.js.map +1 -1
  9. package/dist/plugins/specweave-github/lib/github-increment-sync-cli.d.ts +8 -6
  10. package/dist/plugins/specweave-github/lib/github-increment-sync-cli.d.ts.map +1 -1
  11. package/dist/plugins/specweave-github/lib/github-increment-sync-cli.js +230 -165
  12. package/dist/plugins/specweave-github/lib/github-increment-sync-cli.js.map +1 -1
  13. package/dist/plugins/specweave-github/lib/github-status-sync.d.ts +10 -0
  14. package/dist/plugins/specweave-github/lib/github-status-sync.d.ts.map +1 -1
  15. package/dist/plugins/specweave-github/lib/github-status-sync.js +40 -2
  16. package/dist/plugins/specweave-github/lib/github-status-sync.js.map +1 -1
  17. package/dist/plugins/specweave-github/lib/increment-issue-builder.d.ts +2 -0
  18. package/dist/plugins/specweave-github/lib/increment-issue-builder.d.ts.map +1 -1
  19. package/dist/plugins/specweave-github/lib/increment-issue-builder.js +25 -5
  20. package/dist/plugins/specweave-github/lib/increment-issue-builder.js.map +1 -1
  21. package/dist/plugins/specweave-jira/lib/jira-spec-sync.d.ts +12 -0
  22. package/dist/plugins/specweave-jira/lib/jira-spec-sync.d.ts.map +1 -1
  23. package/dist/plugins/specweave-jira/lib/jira-spec-sync.js +57 -5
  24. package/dist/plugins/specweave-jira/lib/jira-spec-sync.js.map +1 -1
  25. package/dist/plugins/specweave-jira/lib/jira-status-sync.d.ts +5 -1
  26. package/dist/plugins/specweave-jira/lib/jira-status-sync.d.ts.map +1 -1
  27. package/dist/plugins/specweave-jira/lib/jira-status-sync.js +12 -4
  28. package/dist/plugins/specweave-jira/lib/jira-status-sync.js.map +1 -1
  29. package/dist/src/cli/helpers/init/external-import.d.ts.map +1 -1
  30. package/dist/src/cli/helpers/init/external-import.js +186 -19
  31. package/dist/src/cli/helpers/init/external-import.js.map +1 -1
  32. package/dist/src/cli/helpers/init/jira-ado-auto-detect.d.ts +115 -0
  33. package/dist/src/cli/helpers/init/jira-ado-auto-detect.d.ts.map +1 -0
  34. package/dist/src/cli/helpers/init/jira-ado-auto-detect.js +590 -0
  35. package/dist/src/cli/helpers/init/jira-ado-auto-detect.js.map +1 -0
  36. package/dist/src/config/types.d.ts +6 -6
  37. package/dist/src/core/background/index.d.ts +11 -0
  38. package/dist/src/core/background/index.d.ts.map +1 -0
  39. package/dist/src/core/background/index.js +11 -0
  40. package/dist/src/core/background/index.js.map +1 -0
  41. package/dist/src/core/background/job-manager.d.ts +65 -0
  42. package/dist/src/core/background/job-manager.d.ts.map +1 -0
  43. package/dist/src/core/background/job-manager.js +192 -0
  44. package/dist/src/core/background/job-manager.js.map +1 -0
  45. package/dist/src/core/background/types.d.ts +59 -0
  46. package/dist/src/core/background/types.d.ts.map +1 -0
  47. package/dist/src/core/background/types.js +8 -0
  48. package/dist/src/core/background/types.js.map +1 -0
  49. package/dist/src/core/repo-structure/multi-repo-configurator.d.ts +25 -0
  50. package/dist/src/core/repo-structure/multi-repo-configurator.d.ts.map +1 -0
  51. package/dist/src/core/repo-structure/multi-repo-configurator.js +614 -0
  52. package/dist/src/core/repo-structure/multi-repo-configurator.js.map +1 -0
  53. package/dist/src/core/repo-structure/repo-initializer.d.ts +40 -0
  54. package/dist/src/core/repo-structure/repo-initializer.d.ts.map +1 -0
  55. package/dist/src/core/repo-structure/repo-initializer.js +252 -0
  56. package/dist/src/core/repo-structure/repo-initializer.js.map +1 -0
  57. package/dist/src/core/repo-structure/repo-structure-manager.d.ts +3 -37
  58. package/dist/src/core/repo-structure/repo-structure-manager.d.ts.map +1 -1
  59. package/dist/src/core/repo-structure/repo-structure-manager.js +23 -803
  60. package/dist/src/core/repo-structure/repo-structure-manager.js.map +1 -1
  61. package/dist/src/core/types/spec-metadata.d.ts +2 -0
  62. package/dist/src/core/types/spec-metadata.d.ts.map +1 -1
  63. package/dist/src/importers/import-coordinator.d.ts +20 -0
  64. package/dist/src/importers/import-coordinator.d.ts.map +1 -1
  65. package/dist/src/importers/import-coordinator.js.map +1 -1
  66. package/dist/src/init/architecture/types.d.ts +2 -2
  67. package/dist/src/init/compliance/types.d.ts +1 -1
  68. package/package.json +1 -1
  69. package/plugins/specweave/commands/specweave-jobs.md +160 -0
  70. package/plugins/specweave-ado/lib/ado-spec-sync.js +59 -3
  71. package/plugins/specweave-ado/lib/ado-spec-sync.ts +72 -3
  72. package/plugins/specweave-ado/lib/ado-status-sync.js +35 -3
  73. package/plugins/specweave-ado/lib/ado-status-sync.ts +48 -4
  74. package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +6 -0
  75. package/plugins/specweave-github/lib/github-increment-sync-cli.js +268 -155
  76. package/plugins/specweave-github/lib/github-increment-sync-cli.ts +313 -209
  77. package/plugins/specweave-github/lib/github-status-sync.js +37 -1
  78. package/plugins/specweave-github/lib/github-status-sync.ts +60 -4
  79. package/plugins/specweave-github/lib/increment-issue-builder.js +26 -5
  80. package/plugins/specweave-github/lib/increment-issue-builder.ts +36 -5
  81. package/plugins/specweave-jira/lib/jira-spec-sync.js +53 -5
  82. package/plugins/specweave-jira/lib/jira-spec-sync.ts +87 -7
  83. package/plugins/specweave-jira/lib/jira-status-sync.js +9 -3
  84. package/plugins/specweave-jira/lib/jira-status-sync.ts +15 -6
  85. 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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"}