specweave 0.28.15 → 0.28.19
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/bin/specweave.js +1 -1
- package/dist/plugins/specweave-ado/lib/ado-board-resolver.d.ts +94 -0
- package/dist/plugins/specweave-ado/lib/ado-board-resolver.d.ts.map +1 -0
- package/dist/plugins/specweave-ado/lib/ado-board-resolver.js +219 -0
- package/dist/plugins/specweave-ado/lib/ado-board-resolver.js.map +1 -0
- package/dist/plugins/specweave-github/lib/github-feature-sync.d.ts +6 -11
- package/dist/plugins/specweave-github/lib/github-feature-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-feature-sync.js +6 -11
- package/dist/plugins/specweave-github/lib/github-feature-sync.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-increment-sync-cli.d.ts +19 -0
- package/dist/plugins/specweave-github/lib/github-increment-sync-cli.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/github-increment-sync-cli.js +380 -0
- package/dist/plugins/specweave-github/lib/github-increment-sync-cli.js.map +1 -0
- package/dist/plugins/specweave-github/lib/increment-issue-builder.d.ts +92 -0
- package/dist/plugins/specweave-github/lib/increment-issue-builder.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/increment-issue-builder.js +349 -0
- package/dist/plugins/specweave-github/lib/increment-issue-builder.js.map +1 -0
- package/dist/plugins/specweave-jira/lib/jira-board-resolver.d.ts +50 -0
- package/dist/plugins/specweave-jira/lib/jira-board-resolver.d.ts.map +1 -0
- package/dist/plugins/specweave-jira/lib/jira-board-resolver.js +84 -0
- package/dist/plugins/specweave-jira/lib/jira-board-resolver.js.map +1 -0
- package/dist/src/cli/commands/import-external.d.ts.map +1 -1
- package/dist/src/cli/commands/import-external.js +12 -7
- package/dist/src/cli/commands/import-external.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 +138 -23
- package/dist/src/cli/helpers/init/external-import.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/ado-area-selection.d.ts +65 -0
- package/dist/src/cli/helpers/issue-tracker/ado-area-selection.d.ts.map +1 -0
- package/dist/src/cli/helpers/issue-tracker/ado-area-selection.js +278 -0
- package/dist/src/cli/helpers/issue-tracker/ado-area-selection.js.map +1 -0
- package/dist/src/cli/helpers/issue-tracker/jira-board-selection.d.ts +64 -0
- package/dist/src/cli/helpers/issue-tracker/jira-board-selection.d.ts.map +1 -0
- package/dist/src/cli/helpers/issue-tracker/jira-board-selection.js +251 -0
- package/dist/src/cli/helpers/issue-tracker/jira-board-selection.js.map +1 -0
- package/dist/src/core/ac-test-validator-cli.js +4 -1
- package/dist/src/core/ac-test-validator-cli.js.map +1 -1
- package/dist/src/core/ac-test-validator.d.ts.map +1 -1
- package/dist/src/core/ac-test-validator.js +4 -1
- package/dist/src/core/ac-test-validator.js.map +1 -1
- package/dist/src/core/qa/qa-runner.js +7 -10
- package/dist/src/core/qa/qa-runner.js.map +1 -1
- package/dist/src/core/types/increment-metadata.d.ts +75 -0
- package/dist/src/core/types/increment-metadata.d.ts.map +1 -1
- package/dist/src/core/types/sync-profile.d.ts +137 -5
- package/dist/src/core/types/sync-profile.d.ts.map +1 -1
- package/dist/src/core/types/sync-profile.js +63 -0
- package/dist/src/core/types/sync-profile.js.map +1 -1
- package/dist/src/importers/external-importer.d.ts +25 -0
- package/dist/src/importers/external-importer.d.ts.map +1 -1
- package/dist/src/importers/github-importer.d.ts.map +1 -1
- package/dist/src/importers/github-importer.js +5 -3
- package/dist/src/importers/github-importer.js.map +1 -1
- package/dist/src/importers/item-converter.d.ts +51 -0
- package/dist/src/importers/item-converter.d.ts.map +1 -1
- package/dist/src/importers/item-converter.js +39 -12
- package/dist/src/importers/item-converter.js.map +1 -1
- package/dist/src/init/repo/types.d.ts +1 -1
- package/dist/src/living-docs/fs-id-allocator.d.ts +72 -3
- package/dist/src/living-docs/fs-id-allocator.d.ts.map +1 -1
- package/dist/src/living-docs/fs-id-allocator.js +142 -16
- package/dist/src/living-docs/fs-id-allocator.js.map +1 -1
- package/dist/src/locales/de/cli.json +14 -0
- package/dist/src/locales/es/cli.json +14 -0
- package/dist/src/locales/fr/cli.json +14 -0
- package/dist/src/locales/ja/cli.json +14 -0
- package/dist/src/locales/ko/cli.json +14 -0
- package/dist/src/locales/pt/cli.json +14 -0
- package/dist/src/locales/ru/cli.json +14 -0
- package/dist/src/locales/zh/cli.json +14 -0
- package/dist/src/utils/chalk-fallback.d.ts +38 -0
- package/dist/src/utils/chalk-fallback.d.ts.map +1 -0
- package/dist/src/utils/chalk-fallback.js +118 -0
- package/dist/src/utils/chalk-fallback.js.map +1 -0
- package/dist/src/utils/project-id-generator.d.ts +127 -0
- package/dist/src/utils/project-id-generator.d.ts.map +1 -0
- package/dist/src/utils/project-id-generator.js +228 -0
- package/dist/src/utils/project-id-generator.js.map +1 -0
- package/package.json +1 -1
- package/plugins/specweave/agents/AGENTS-INDEX.md +9 -7
- package/plugins/specweave/agents/pm/AGENT.md +202 -0
- package/plugins/specweave/commands/specweave-import-external.md +5 -3
- package/plugins/specweave/commands/specweave-qa.md +9 -9
- package/plugins/specweave/commands/specweave-save.md +531 -193
- package/plugins/specweave/commands/specweave-sync-docs.md +6 -2
- package/plugins/specweave/commands/specweave-validate.md +8 -7
- package/plugins/specweave/hooks/pre-task-completion.sh +35 -17
- package/plugins/specweave/lib/vendor/core/ac-test-validator-cli.d.ts +16 -0
- package/plugins/specweave/lib/vendor/core/ac-test-validator-cli.js +121 -0
- package/plugins/specweave/lib/vendor/core/ac-test-validator-cli.js.map +1 -0
- package/plugins/specweave/lib/vendor/core/ac-test-validator.d.ts +111 -0
- package/plugins/specweave/lib/vendor/core/ac-test-validator.js +295 -0
- package/plugins/specweave/lib/vendor/core/ac-test-validator.js.map +1 -0
- package/plugins/specweave/lib/vendor/core/types/increment-metadata.d.ts +75 -0
- package/plugins/specweave/lib/vendor/utils/chalk-fallback.d.ts +38 -0
- package/plugins/specweave/lib/vendor/utils/chalk-fallback.js +118 -0
- package/plugins/specweave/lib/vendor/utils/chalk-fallback.js.map +1 -0
- package/plugins/specweave/lib/vendor/utils/fs-native.d.ts +179 -0
- package/plugins/specweave/lib/vendor/utils/fs-native.js +319 -0
- package/plugins/specweave/lib/vendor/utils/fs-native.js.map +1 -0
- package/plugins/specweave/skills/code-reviewer/SKILL.md +1 -1
- package/plugins/specweave/skills/docs-updater/SKILL.md +61 -0
- package/plugins/specweave/skills/increment-planner/SKILL.md +10 -335
- package/plugins/specweave/skills/increment-planner/templates/metadata.json +13 -0
- package/plugins/specweave/skills/increment-planner/templates/plan.md +50 -0
- package/plugins/specweave/skills/increment-planner/templates/spec-multi-project.md +86 -0
- package/plugins/specweave/skills/increment-planner/templates/spec-single-project.md +50 -0
- package/plugins/specweave/skills/increment-planner/templates/tasks-multi-project.md +86 -0
- package/plugins/specweave/skills/increment-planner/templates/tasks-single-project.md +48 -0
- package/plugins/specweave/skills/increment-quality-judge-v2/SKILL.md +18 -0
- package/plugins/specweave-ado/commands/specweave-ado-import-areas.md +358 -0
- package/plugins/specweave-alternatives/skills/architecture-alternatives/SKILL.md +1 -0
- package/plugins/specweave-alternatives/skills/bmad-method/SKILL.md +1 -0
- package/plugins/specweave-core/skills/code-quality/SKILL.md +1 -0
- package/plugins/specweave-core/skills/design-patterns/SKILL.md +1 -0
- package/plugins/specweave-core/skills/software-architecture/SKILL.md +1 -0
- package/plugins/specweave-github/commands/specweave-github-cleanup-duplicates.md +14 -10
- package/plugins/specweave-github/commands/specweave-github-sync.md +57 -0
- package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +86 -0
- package/plugins/specweave-github/lib/github-feature-sync.ts +6 -11
- package/plugins/specweave-github/lib/github-increment-sync-cli.js +343 -0
- package/plugins/specweave-github/lib/github-increment-sync-cli.ts +484 -0
- package/plugins/specweave-github/lib/increment-issue-builder.js +368 -0
- package/plugins/specweave-github/lib/increment-issue-builder.ts +471 -0
- package/plugins/specweave-github/skills/github-issue-standard/SKILL.md +19 -24
- package/plugins/specweave-infrastructure/agents/observability-engineer/AGENT.md +15 -23
- package/plugins/specweave-jira/commands/specweave-jira-import-boards.md +331 -0
- package/plugins/specweave-ml/agents/data-scientist/AGENT.md +16 -20
- package/plugins/specweave-ml/agents/ml-engineer/AGENT.md +18 -19
- package/plugins/specweave-ml/skills/{ml-pipeline-workflow → mlops-dag-builder}/SKILL.md +18 -14
- package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +129 -0
- package/plugins/specweave-ui/skills/browser-automation/SKILL.md +1 -1
- package/plugins/specweave-ui/skills/ui-testing/SKILL.md +10 -122
- package/dist/plugins/specweave-github/lib/epic-content-builder.d.ts +0 -70
- package/dist/plugins/specweave-github/lib/epic-content-builder.d.ts.map +0 -1
- package/dist/plugins/specweave-github/lib/epic-content-builder.js +0 -258
- package/dist/plugins/specweave-github/lib/epic-content-builder.js.map +0 -1
- package/dist/plugins/specweave-github/lib/github-epic-sync.d.ts +0 -83
- package/dist/plugins/specweave-github/lib/github-epic-sync.d.ts.map +0 -1
- package/dist/plugins/specweave-github/lib/github-epic-sync.js +0 -466
- package/dist/plugins/specweave-github/lib/github-epic-sync.js.map +0 -1
- package/plugins/specweave/agents/increment-quality-judge-v2/AGENT.md +0 -705
- package/plugins/specweave-github/lib/epic-content-builder.js +0 -265
- package/plugins/specweave-github/lib/epic-content-builder.ts +0 -376
- package/plugins/specweave-github/lib/github-epic-sync.js +0 -488
- package/plugins/specweave-github/lib/github-epic-sync.ts +0 -715
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ADO Area Path Selection Helper (v0.29.0+)
|
|
3
|
+
*
|
|
4
|
+
* Provides UI prompts for selecting ADO area paths and mapping them to SpecWeave projects.
|
|
5
|
+
* Used during `specweave init` when user selects area path-based team organization.
|
|
6
|
+
*
|
|
7
|
+
* @module cli/helpers/issue-tracker/ado-area-selection
|
|
8
|
+
*/
|
|
9
|
+
import chalk from 'chalk';
|
|
10
|
+
import { select, checkbox, input, confirm } from '@inquirer/prompts';
|
|
11
|
+
import ora from 'ora';
|
|
12
|
+
import { fetchAreaPathsForProject, } from '../../../../plugins/specweave-ado/lib/ado-board-resolver.js';
|
|
13
|
+
import { generateProjectId, getExistingProjectIds, normalizeToProjectId, } from '../../../utils/project-id-generator.js';
|
|
14
|
+
/**
|
|
15
|
+
* Prompt user to select ADO organization strategy
|
|
16
|
+
*
|
|
17
|
+
* @param hasMultipleAreaPaths Whether the project has multiple area paths
|
|
18
|
+
* @returns Selected strategy
|
|
19
|
+
*/
|
|
20
|
+
export async function promptAdoOrganizationStrategy(hasMultipleAreaPaths) {
|
|
21
|
+
console.log(chalk.cyan('\n🔷 Azure DevOps Project Organization\n'));
|
|
22
|
+
const defaultStrategy = hasMultipleAreaPaths ? 'area-path-based' : 'single-project';
|
|
23
|
+
const strategy = await select({
|
|
24
|
+
message: 'How do you want to organize work items?',
|
|
25
|
+
choices: [
|
|
26
|
+
{
|
|
27
|
+
name: 'Single project (all work at root level)',
|
|
28
|
+
value: 'single-project',
|
|
29
|
+
description: 'Best for small teams or single-product companies',
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
name: 'Area path-based teams (area paths → SpecWeave projects)',
|
|
33
|
+
value: 'area-path-based',
|
|
34
|
+
description: 'Best for enterprise teams using area paths for organization',
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
name: 'Team-based organization (teams → SpecWeave projects)',
|
|
38
|
+
value: 'team-based',
|
|
39
|
+
description: 'Best when teams have dedicated areas in ADO',
|
|
40
|
+
},
|
|
41
|
+
],
|
|
42
|
+
default: defaultStrategy,
|
|
43
|
+
});
|
|
44
|
+
return strategy;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Fetch and display area paths for an ADO project
|
|
48
|
+
* Prompts user to select area paths and map them to SpecWeave projects
|
|
49
|
+
*
|
|
50
|
+
* @param organization ADO organization name
|
|
51
|
+
* @param project ADO project name
|
|
52
|
+
* @param pat Personal Access Token
|
|
53
|
+
* @param projectRoot Path to SpecWeave project root (for existing project IDs)
|
|
54
|
+
* @returns Area path mapping configuration
|
|
55
|
+
*/
|
|
56
|
+
export async function promptAreaPathSelection(organization, project, pat, projectRoot) {
|
|
57
|
+
const spinner = ora(`Fetching area paths from project ${project}...`).start();
|
|
58
|
+
try {
|
|
59
|
+
// Fetch available area paths
|
|
60
|
+
const areaPaths = await fetchAreaPathsForProject(organization, project, pat);
|
|
61
|
+
spinner.succeed(`Found ${areaPaths.length} area path(s) in project ${project}`);
|
|
62
|
+
if (areaPaths.length === 0) {
|
|
63
|
+
console.log(chalk.yellow('\n⚠️ No area paths found in this project.'));
|
|
64
|
+
console.log(chalk.gray(' Using root level organization.\n'));
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
// Filter to show only top-level area paths (direct children of project root)
|
|
68
|
+
// Exclude the root itself
|
|
69
|
+
const topLevelPaths = areaPaths.filter((ap) => {
|
|
70
|
+
// Path format: "ProjectName" (root) or "ProjectName\\ChildArea"
|
|
71
|
+
const parts = ap.path.split('\\');
|
|
72
|
+
return parts.length === 2; // Direct child of root
|
|
73
|
+
});
|
|
74
|
+
if (topLevelPaths.length === 0) {
|
|
75
|
+
console.log(chalk.yellow('\n⚠️ No child area paths found (only root area exists).'));
|
|
76
|
+
console.log(chalk.gray(' You can create area paths in ADO and run this setup again.\n'));
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
// Show area paths and let user select
|
|
80
|
+
console.log(chalk.cyan('\n📋 Select area paths to map to SpecWeave projects:\n'));
|
|
81
|
+
// Filter out archive/inactive paths by default (uncheck them)
|
|
82
|
+
const isArchivePath = (areaPath) => areaPath.name.toLowerCase().includes('archive') ||
|
|
83
|
+
areaPath.name.toLowerCase().includes('inactive') ||
|
|
84
|
+
areaPath.name.toLowerCase().includes('deprecated') ||
|
|
85
|
+
areaPath.name.toLowerCase().includes('legacy');
|
|
86
|
+
const selectedPaths = await checkbox({
|
|
87
|
+
message: 'Select area paths (Space to toggle, Enter to confirm):',
|
|
88
|
+
choices: topLevelPaths.map((ap) => ({
|
|
89
|
+
name: `${ap.name}${ap.hasChildren ? ' (has sub-areas)' : ''}`,
|
|
90
|
+
value: ap.path,
|
|
91
|
+
checked: !isArchivePath(ap), // Pre-select non-archive paths
|
|
92
|
+
})),
|
|
93
|
+
});
|
|
94
|
+
if (selectedPaths.length === 0) {
|
|
95
|
+
console.log(chalk.yellow('\n⚠️ No area paths selected. Falling back to single-project mode.\n'));
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
// Get existing project IDs to prevent collisions
|
|
99
|
+
const existingIds = getExistingProjectIds(projectRoot);
|
|
100
|
+
// Map selected area paths to SpecWeave projects
|
|
101
|
+
console.log(chalk.cyan('\n🏷️ Mapping area paths to SpecWeave projects:\n'));
|
|
102
|
+
const areaPathMappings = [];
|
|
103
|
+
for (const pathStr of selectedPaths) {
|
|
104
|
+
const areaPath = areaPaths.find((ap) => ap.path === pathStr);
|
|
105
|
+
if (!areaPath)
|
|
106
|
+
continue;
|
|
107
|
+
// Suggest a project ID based on area path name
|
|
108
|
+
const suggestedId = generateProjectId({
|
|
109
|
+
externalContainer: project,
|
|
110
|
+
localName: areaPath.name,
|
|
111
|
+
provider: 'ado',
|
|
112
|
+
existingIds: [...existingIds, ...areaPathMappings.map((m) => m.specweaveProject)],
|
|
113
|
+
});
|
|
114
|
+
// Allow user to customize the project ID
|
|
115
|
+
const projectId = await input({
|
|
116
|
+
message: `SpecWeave project ID for "${areaPath.name}":`,
|
|
117
|
+
default: suggestedId.id,
|
|
118
|
+
validate: (val) => {
|
|
119
|
+
if (!val || val.trim() === '') {
|
|
120
|
+
return 'Project ID cannot be empty';
|
|
121
|
+
}
|
|
122
|
+
const normalized = normalizeToProjectId(val);
|
|
123
|
+
if (normalized !== val) {
|
|
124
|
+
return `Invalid format. Suggested: "${normalized}"`;
|
|
125
|
+
}
|
|
126
|
+
if (existingIds.includes(val) || areaPathMappings.some((m) => m.specweaveProject === val)) {
|
|
127
|
+
return `Project ID "${val}" already exists. Choose a different name.`;
|
|
128
|
+
}
|
|
129
|
+
return true;
|
|
130
|
+
},
|
|
131
|
+
});
|
|
132
|
+
// Ask about including child area paths
|
|
133
|
+
let includeChildren = true;
|
|
134
|
+
if (areaPath.hasChildren) {
|
|
135
|
+
includeChildren = await confirm({
|
|
136
|
+
message: `Include child area paths under "${areaPath.name}"?`,
|
|
137
|
+
default: true,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
// Optional: Add keywords for auto-classification
|
|
141
|
+
const addKeywords = await confirm({
|
|
142
|
+
message: `Add keywords for auto-classification of user stories to ${projectId}?`,
|
|
143
|
+
default: false,
|
|
144
|
+
});
|
|
145
|
+
let keywords;
|
|
146
|
+
if (addKeywords) {
|
|
147
|
+
const keywordsInput = await input({
|
|
148
|
+
message: 'Keywords (comma-separated, e.g., "backend, api, database"):',
|
|
149
|
+
default: '',
|
|
150
|
+
});
|
|
151
|
+
keywords = keywordsInput
|
|
152
|
+
.split(',')
|
|
153
|
+
.map((k) => k.trim())
|
|
154
|
+
.filter((k) => k.length > 0);
|
|
155
|
+
}
|
|
156
|
+
areaPathMappings.push({
|
|
157
|
+
areaPath: areaPath.path,
|
|
158
|
+
specweaveProject: projectId,
|
|
159
|
+
includeChildren,
|
|
160
|
+
keywords,
|
|
161
|
+
});
|
|
162
|
+
console.log(chalk.green(` ✓ ${areaPath.path} → ${projectId}`));
|
|
163
|
+
}
|
|
164
|
+
console.log('');
|
|
165
|
+
return {
|
|
166
|
+
project,
|
|
167
|
+
mappings: areaPathMappings,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
spinner.fail('Failed to fetch area paths');
|
|
172
|
+
console.error(chalk.red(` Error: ${error.message}\n`));
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Complete area path selection flow
|
|
178
|
+
* Orchestrates strategy selection and area path mapping
|
|
179
|
+
*
|
|
180
|
+
* @param credentials ADO credentials (partial)
|
|
181
|
+
* @param projectRoot Path to SpecWeave project root
|
|
182
|
+
* @returns Area path selection result
|
|
183
|
+
*/
|
|
184
|
+
export async function completeAreaPathSelectionFlow(credentials, projectRoot) {
|
|
185
|
+
// Check if there are area paths in the project
|
|
186
|
+
const spinner = ora('Checking project structure...').start();
|
|
187
|
+
try {
|
|
188
|
+
const areaPaths = await fetchAreaPathsForProject(credentials.organization, credentials.project, credentials.pat);
|
|
189
|
+
const hasMultipleAreaPaths = areaPaths.filter((ap) => {
|
|
190
|
+
const parts = ap.path.split('\\');
|
|
191
|
+
return parts.length === 2; // Direct children
|
|
192
|
+
}).length > 0;
|
|
193
|
+
spinner.stop();
|
|
194
|
+
// Ask about organization strategy
|
|
195
|
+
const strategy = await promptAdoOrganizationStrategy(hasMultipleAreaPaths);
|
|
196
|
+
if (strategy === 'single-project') {
|
|
197
|
+
return {
|
|
198
|
+
strategy: 'single-project',
|
|
199
|
+
projectName: credentials.project,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
if (strategy === 'team-based') {
|
|
203
|
+
// Team-based maps to area paths internally
|
|
204
|
+
// Ask user to enter team names if not already provided
|
|
205
|
+
let teams = credentials.teams || [];
|
|
206
|
+
if (teams.length === 0) {
|
|
207
|
+
const teamsInput = await input({
|
|
208
|
+
message: 'Enter team names (comma-separated):',
|
|
209
|
+
default: '',
|
|
210
|
+
});
|
|
211
|
+
teams = teamsInput
|
|
212
|
+
.split(',')
|
|
213
|
+
.map((t) => t.trim())
|
|
214
|
+
.filter((t) => t.length > 0);
|
|
215
|
+
}
|
|
216
|
+
if (teams.length === 0) {
|
|
217
|
+
console.log(chalk.yellow('\n⚠️ No teams specified. Falling back to single-project mode.\n'));
|
|
218
|
+
return {
|
|
219
|
+
strategy: 'single-project',
|
|
220
|
+
projectName: credentials.project,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
return {
|
|
224
|
+
strategy: 'team-based',
|
|
225
|
+
projectName: credentials.project,
|
|
226
|
+
teams,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
if (strategy === 'area-path-based') {
|
|
230
|
+
const areaPathMapping = await promptAreaPathSelection(credentials.organization, credentials.project, credentials.pat, projectRoot);
|
|
231
|
+
if (areaPathMapping && areaPathMapping.mappings.length > 0) {
|
|
232
|
+
return {
|
|
233
|
+
strategy: 'area-path-based',
|
|
234
|
+
areaPathMapping,
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
// Fall back to single-project if no area paths selected
|
|
238
|
+
return {
|
|
239
|
+
strategy: 'single-project',
|
|
240
|
+
projectName: credentials.project,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
// multi-project (rare for ADO)
|
|
244
|
+
return {
|
|
245
|
+
strategy: 'single-project',
|
|
246
|
+
projectName: credentials.project,
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
catch (error) {
|
|
250
|
+
spinner.stop();
|
|
251
|
+
console.error(chalk.yellow(`\n⚠️ Could not analyze project structure: ${error.message}`));
|
|
252
|
+
console.log(chalk.gray(' Proceeding with single-project mode.\n'));
|
|
253
|
+
return {
|
|
254
|
+
strategy: 'single-project',
|
|
255
|
+
projectName: credentials.project,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Display summary of area path mapping
|
|
261
|
+
*/
|
|
262
|
+
export function displayAreaPathMappingSummary(mapping) {
|
|
263
|
+
console.log(chalk.cyan.bold('\n🔷 ADO Area Path Mapping Summary\n'));
|
|
264
|
+
console.log(chalk.gray(` Project: ${mapping.project}`));
|
|
265
|
+
console.log(chalk.gray(` Area paths mapped: ${mapping.mappings.length}\n`));
|
|
266
|
+
for (const area of mapping.mappings) {
|
|
267
|
+
console.log(chalk.green(` ✓ ${area.areaPath}`));
|
|
268
|
+
console.log(chalk.gray(` → SpecWeave project: ${area.specweaveProject}`));
|
|
269
|
+
if (area.includeChildren) {
|
|
270
|
+
console.log(chalk.gray(` → Includes child areas: yes`));
|
|
271
|
+
}
|
|
272
|
+
if (area.keywords && area.keywords.length > 0) {
|
|
273
|
+
console.log(chalk.gray(` → Keywords: ${area.keywords.join(', ')}`));
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
console.log('');
|
|
277
|
+
}
|
|
278
|
+
//# sourceMappingURL=ado-area-selection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ado-area-selection.js","sourceRoot":"","sources":["../../../../../src/cli/helpers/issue-tracker/ado-area-selection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JIRA Board Selection Helper (v0.29.0+)
|
|
3
|
+
*
|
|
4
|
+
* Provides UI prompts for selecting JIRA boards and mapping them to SpecWeave projects.
|
|
5
|
+
* Used during `specweave init` when user selects board-based team organization.
|
|
6
|
+
*
|
|
7
|
+
* @module cli/helpers/issue-tracker/jira-board-selection
|
|
8
|
+
*/
|
|
9
|
+
import type { JiraBoardMappingConfig } from '../../../core/types/sync-profile.js';
|
|
10
|
+
import { JiraClient } from '../../../integrations/jira/jira-client.js';
|
|
11
|
+
/**
|
|
12
|
+
* JIRA organization strategy
|
|
13
|
+
*/
|
|
14
|
+
export type JiraOrganizationStrategy = 'single-project' | 'board-based' | 'multi-project';
|
|
15
|
+
/**
|
|
16
|
+
* Board selection result
|
|
17
|
+
*/
|
|
18
|
+
export interface BoardSelectionResult {
|
|
19
|
+
/** Selected organization strategy */
|
|
20
|
+
strategy: JiraOrganizationStrategy;
|
|
21
|
+
/** Board mapping config (only for board-based strategy) */
|
|
22
|
+
boardMapping?: JiraBoardMappingConfig;
|
|
23
|
+
/** Selected project keys (for multi-project strategy) */
|
|
24
|
+
projectKeys?: string[];
|
|
25
|
+
/** Single project key (for single-project strategy) */
|
|
26
|
+
projectKey?: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Prompt user to select JIRA organization strategy
|
|
30
|
+
*
|
|
31
|
+
* @param projectCount Number of projects user has access to
|
|
32
|
+
* @returns Selected strategy
|
|
33
|
+
*/
|
|
34
|
+
export declare function promptOrganizationStrategy(projectCount: number): Promise<JiraOrganizationStrategy>;
|
|
35
|
+
/**
|
|
36
|
+
* Fetch and display boards for a JIRA project
|
|
37
|
+
* Prompts user to select boards and map them to SpecWeave projects
|
|
38
|
+
*
|
|
39
|
+
* @param client JIRA client for API calls
|
|
40
|
+
* @param projectKey JIRA project key (e.g., "CORE")
|
|
41
|
+
* @param projectRoot Path to SpecWeave project root (for existing project IDs)
|
|
42
|
+
* @returns Board mapping configuration
|
|
43
|
+
*/
|
|
44
|
+
export declare function promptBoardSelection(client: JiraClient, projectKey: string, projectRoot: string): Promise<JiraBoardMappingConfig | null>;
|
|
45
|
+
/**
|
|
46
|
+
* Complete board selection flow
|
|
47
|
+
* Orchestrates strategy selection and board mapping
|
|
48
|
+
*
|
|
49
|
+
* @param credentials JIRA credentials (partial)
|
|
50
|
+
* @param selectedProjects Already selected JIRA projects
|
|
51
|
+
* @param projectRoot Path to SpecWeave project root
|
|
52
|
+
* @returns Board selection result
|
|
53
|
+
*/
|
|
54
|
+
export declare function completeBoardSelectionFlow(credentials: {
|
|
55
|
+
domain: string;
|
|
56
|
+
email: string;
|
|
57
|
+
token: string;
|
|
58
|
+
instanceType: 'cloud' | 'server';
|
|
59
|
+
}, selectedProjects: string[], projectRoot: string): Promise<BoardSelectionResult>;
|
|
60
|
+
/**
|
|
61
|
+
* Display summary of board mapping
|
|
62
|
+
*/
|
|
63
|
+
export declare function displayBoardMappingSummary(mapping: JiraBoardMappingConfig): void;
|
|
64
|
+
//# sourceMappingURL=jira-board-selection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jira-board-selection.d.ts","sourceRoot":"","sources":["../../../../../src/cli/helpers/issue-tracker/jira-board-selection.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAoB,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AACpG,OAAO,EAAE,UAAU,EAAE,MAAM,2CAA2C,CAAC;AAQvE;;GAEG;AACH,MAAM,MAAM,wBAAwB,GAChC,gBAAgB,GAChB,aAAa,GACb,eAAe,CAAC;AAEpB;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,qCAAqC;IACrC,QAAQ,EAAE,wBAAwB,CAAC;IAEnC,2DAA2D;IAC3D,YAAY,CAAC,EAAE,sBAAsB,CAAC;IAEtC,yDAAyD;IACzD,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IAEvB,uDAAuD;IACvD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAC9C,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,wBAAwB,CAAC,CAgCnC;AAED;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,UAAU,EAClB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAoHxC;AAED;;;;;;;;GAQG;AACH,wBAAsB,0BAA0B,CAC9C,WAAW,EAAE;IACX,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,OAAO,GAAG,QAAQ,CAAC;CAClC,EACD,gBAAgB,EAAE,MAAM,EAAE,EAC1B,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,oBAAoB,CAAC,CAwF/B;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,sBAAsB,GAAG,IAAI,CAahF"}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JIRA Board Selection Helper (v0.29.0+)
|
|
3
|
+
*
|
|
4
|
+
* Provides UI prompts for selecting JIRA boards and mapping them to SpecWeave projects.
|
|
5
|
+
* Used during `specweave init` when user selects board-based team organization.
|
|
6
|
+
*
|
|
7
|
+
* @module cli/helpers/issue-tracker/jira-board-selection
|
|
8
|
+
*/
|
|
9
|
+
import chalk from 'chalk';
|
|
10
|
+
import { select, checkbox, input, confirm } from '@inquirer/prompts';
|
|
11
|
+
import ora from 'ora';
|
|
12
|
+
import { JiraClient } from '../../../integrations/jira/jira-client.js';
|
|
13
|
+
import { fetchBoardsForProject } from '../../../../plugins/specweave-jira/lib/jira-board-resolver.js';
|
|
14
|
+
import { generateProjectId, getExistingProjectIds, normalizeToProjectId, } from '../../../utils/project-id-generator.js';
|
|
15
|
+
/**
|
|
16
|
+
* Prompt user to select JIRA organization strategy
|
|
17
|
+
*
|
|
18
|
+
* @param projectCount Number of projects user has access to
|
|
19
|
+
* @returns Selected strategy
|
|
20
|
+
*/
|
|
21
|
+
export async function promptOrganizationStrategy(projectCount) {
|
|
22
|
+
console.log(chalk.cyan('\n📋 JIRA Project Organization\n'));
|
|
23
|
+
// Determine default based on project count
|
|
24
|
+
const defaultStrategy = projectCount === 1 ? 'single-project' :
|
|
25
|
+
projectCount <= 3 ? 'board-based' :
|
|
26
|
+
'multi-project';
|
|
27
|
+
const strategy = await select({
|
|
28
|
+
message: 'How do you want to organize work items?',
|
|
29
|
+
choices: [
|
|
30
|
+
{
|
|
31
|
+
name: 'Single project (all work in one JIRA project)',
|
|
32
|
+
value: 'single-project',
|
|
33
|
+
description: 'Best for small teams or single-product companies',
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
name: 'Board-based teams (one project, multiple boards → SpecWeave projects)',
|
|
37
|
+
value: 'board-based',
|
|
38
|
+
description: 'Best for enterprise teams sharing a JIRA project',
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
name: 'Multiple projects (each JIRA project → SpecWeave project)',
|
|
42
|
+
value: 'multi-project',
|
|
43
|
+
description: 'Best for organizations with separate JIRA projects per team',
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
default: defaultStrategy,
|
|
47
|
+
});
|
|
48
|
+
return strategy;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Fetch and display boards for a JIRA project
|
|
52
|
+
* Prompts user to select boards and map them to SpecWeave projects
|
|
53
|
+
*
|
|
54
|
+
* @param client JIRA client for API calls
|
|
55
|
+
* @param projectKey JIRA project key (e.g., "CORE")
|
|
56
|
+
* @param projectRoot Path to SpecWeave project root (for existing project IDs)
|
|
57
|
+
* @returns Board mapping configuration
|
|
58
|
+
*/
|
|
59
|
+
export async function promptBoardSelection(client, projectKey, projectRoot) {
|
|
60
|
+
const spinner = ora(`Fetching boards from project ${projectKey}...`).start();
|
|
61
|
+
try {
|
|
62
|
+
// Fetch available boards
|
|
63
|
+
const boards = await fetchBoardsForProject(client, projectKey);
|
|
64
|
+
spinner.succeed(`Found ${boards.length} board(s) in project ${projectKey}`);
|
|
65
|
+
if (boards.length === 0) {
|
|
66
|
+
console.log(chalk.yellow('\n⚠️ No boards found in this project.'));
|
|
67
|
+
console.log(chalk.gray(' You can create boards in JIRA and run this setup again.\n'));
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
// Show boards and let user select
|
|
71
|
+
console.log(chalk.cyan('\n📋 Select boards to map to SpecWeave projects:\n'));
|
|
72
|
+
// Filter out archive/inactive boards by default (uncheck them)
|
|
73
|
+
const isArchiveBoard = (board) => board.name.toLowerCase().includes('archive') ||
|
|
74
|
+
board.name.toLowerCase().includes('inactive') ||
|
|
75
|
+
board.name.toLowerCase().includes('deprecated');
|
|
76
|
+
const selectedBoardIds = await checkbox({
|
|
77
|
+
message: 'Select boards (Space to toggle, Enter to confirm):',
|
|
78
|
+
choices: boards.map((board) => ({
|
|
79
|
+
name: `${board.name} (${board.type}, ID: ${board.id})`,
|
|
80
|
+
value: board.id,
|
|
81
|
+
checked: !isArchiveBoard(board), // Pre-select non-archive boards
|
|
82
|
+
})),
|
|
83
|
+
});
|
|
84
|
+
if (selectedBoardIds.length === 0) {
|
|
85
|
+
console.log(chalk.yellow('\n⚠️ No boards selected. Falling back to single-project mode.\n'));
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
// Get existing project IDs to prevent collisions
|
|
89
|
+
const existingIds = getExistingProjectIds(projectRoot);
|
|
90
|
+
// Map selected boards to SpecWeave projects
|
|
91
|
+
console.log(chalk.cyan('\n🏷️ Mapping boards to SpecWeave projects:\n'));
|
|
92
|
+
const boardMappings = [];
|
|
93
|
+
for (const boardId of selectedBoardIds) {
|
|
94
|
+
const board = boards.find((b) => b.id === boardId);
|
|
95
|
+
if (!board)
|
|
96
|
+
continue;
|
|
97
|
+
// Suggest a project ID based on board name
|
|
98
|
+
const suggestedId = generateProjectId({
|
|
99
|
+
externalContainer: projectKey,
|
|
100
|
+
localName: board.name,
|
|
101
|
+
provider: 'jira',
|
|
102
|
+
existingIds: [...existingIds, ...boardMappings.map((m) => m.specweaveProject)],
|
|
103
|
+
});
|
|
104
|
+
// Allow user to customize the project ID
|
|
105
|
+
const projectId = await input({
|
|
106
|
+
message: `SpecWeave project ID for "${board.name}":`,
|
|
107
|
+
default: suggestedId.id,
|
|
108
|
+
validate: (val) => {
|
|
109
|
+
if (!val || val.trim() === '') {
|
|
110
|
+
return 'Project ID cannot be empty';
|
|
111
|
+
}
|
|
112
|
+
const normalized = normalizeToProjectId(val);
|
|
113
|
+
if (normalized !== val) {
|
|
114
|
+
return `Invalid format. Suggested: "${normalized}"`;
|
|
115
|
+
}
|
|
116
|
+
if (existingIds.includes(val) || boardMappings.some((m) => m.specweaveProject === val)) {
|
|
117
|
+
return `Project ID "${val}" already exists. Choose a different name.`;
|
|
118
|
+
}
|
|
119
|
+
return true;
|
|
120
|
+
},
|
|
121
|
+
});
|
|
122
|
+
// Optional: Add keywords for auto-classification
|
|
123
|
+
const addKeywords = await confirm({
|
|
124
|
+
message: `Add keywords for auto-classification of user stories to ${projectId}?`,
|
|
125
|
+
default: false,
|
|
126
|
+
});
|
|
127
|
+
let keywords;
|
|
128
|
+
if (addKeywords) {
|
|
129
|
+
const keywordsInput = await input({
|
|
130
|
+
message: 'Keywords (comma-separated, e.g., "frontend, UI, react"):',
|
|
131
|
+
default: '',
|
|
132
|
+
});
|
|
133
|
+
keywords = keywordsInput
|
|
134
|
+
.split(',')
|
|
135
|
+
.map((k) => k.trim())
|
|
136
|
+
.filter((k) => k.length > 0);
|
|
137
|
+
}
|
|
138
|
+
boardMappings.push({
|
|
139
|
+
boardId: board.id,
|
|
140
|
+
boardName: board.name,
|
|
141
|
+
specweaveProject: projectId,
|
|
142
|
+
boardType: board.type,
|
|
143
|
+
keywords,
|
|
144
|
+
});
|
|
145
|
+
console.log(chalk.green(` ✓ ${board.name} → ${projectId}`));
|
|
146
|
+
}
|
|
147
|
+
console.log('');
|
|
148
|
+
return {
|
|
149
|
+
projectKey,
|
|
150
|
+
boards: boardMappings,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
spinner.fail('Failed to fetch boards');
|
|
155
|
+
console.error(chalk.red(` Error: ${error.message}\n`));
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Complete board selection flow
|
|
161
|
+
* Orchestrates strategy selection and board mapping
|
|
162
|
+
*
|
|
163
|
+
* @param credentials JIRA credentials (partial)
|
|
164
|
+
* @param selectedProjects Already selected JIRA projects
|
|
165
|
+
* @param projectRoot Path to SpecWeave project root
|
|
166
|
+
* @returns Board selection result
|
|
167
|
+
*/
|
|
168
|
+
export async function completeBoardSelectionFlow(credentials, selectedProjects, projectRoot) {
|
|
169
|
+
// If only one project selected, ask about organization strategy
|
|
170
|
+
if (selectedProjects.length === 1) {
|
|
171
|
+
const strategy = await promptOrganizationStrategy(1);
|
|
172
|
+
if (strategy === 'single-project') {
|
|
173
|
+
return {
|
|
174
|
+
strategy: 'single-project',
|
|
175
|
+
projectKey: selectedProjects[0],
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
if (strategy === 'board-based') {
|
|
179
|
+
// Create JIRA client for API calls (uses credentialsManager internally)
|
|
180
|
+
const client = new JiraClient();
|
|
181
|
+
const boardMapping = await promptBoardSelection(client, selectedProjects[0], projectRoot);
|
|
182
|
+
if (boardMapping && boardMapping.boards.length > 0) {
|
|
183
|
+
return {
|
|
184
|
+
strategy: 'board-based',
|
|
185
|
+
boardMapping,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
// Fall back to single-project if no boards selected
|
|
189
|
+
return {
|
|
190
|
+
strategy: 'single-project',
|
|
191
|
+
projectKey: selectedProjects[0],
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
// multi-project with 1 project doesn't make sense, treat as single
|
|
195
|
+
return {
|
|
196
|
+
strategy: 'single-project',
|
|
197
|
+
projectKey: selectedProjects[0],
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
// Multiple projects selected - determine strategy
|
|
201
|
+
const wantBoardBased = await confirm({
|
|
202
|
+
message: `You selected ${selectedProjects.length} projects. Do any have multiple boards you want to map to SpecWeave projects?`,
|
|
203
|
+
default: false,
|
|
204
|
+
});
|
|
205
|
+
if (!wantBoardBased) {
|
|
206
|
+
// Standard multi-project mode
|
|
207
|
+
return {
|
|
208
|
+
strategy: 'multi-project',
|
|
209
|
+
projectKeys: selectedProjects,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
// Ask which project to configure with board mapping
|
|
213
|
+
const projectForBoards = await select({
|
|
214
|
+
message: 'Which project has multiple boards to map?',
|
|
215
|
+
choices: selectedProjects.map((p) => ({ name: p, value: p })),
|
|
216
|
+
});
|
|
217
|
+
// Create JIRA client (uses credentialsManager internally)
|
|
218
|
+
const client = new JiraClient();
|
|
219
|
+
const boardMapping = await promptBoardSelection(client, projectForBoards, projectRoot);
|
|
220
|
+
if (boardMapping && boardMapping.boards.length > 0) {
|
|
221
|
+
// Remove the board-mapped project from the multi-project list
|
|
222
|
+
const remainingProjects = selectedProjects.filter((p) => p !== projectForBoards);
|
|
223
|
+
return {
|
|
224
|
+
strategy: 'board-based',
|
|
225
|
+
boardMapping,
|
|
226
|
+
projectKeys: remainingProjects.length > 0 ? remainingProjects : undefined,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
// Fall back to multi-project
|
|
230
|
+
return {
|
|
231
|
+
strategy: 'multi-project',
|
|
232
|
+
projectKeys: selectedProjects,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Display summary of board mapping
|
|
237
|
+
*/
|
|
238
|
+
export function displayBoardMappingSummary(mapping) {
|
|
239
|
+
console.log(chalk.cyan.bold('\n📋 JIRA Board Mapping Summary\n'));
|
|
240
|
+
console.log(chalk.gray(` Project: ${mapping.projectKey}`));
|
|
241
|
+
console.log(chalk.gray(` Boards mapped: ${mapping.boards.length}\n`));
|
|
242
|
+
for (const board of mapping.boards) {
|
|
243
|
+
console.log(chalk.green(` ✓ ${board.boardName} (${board.boardType || 'unknown'})`));
|
|
244
|
+
console.log(chalk.gray(` → SpecWeave project: ${board.specweaveProject}`));
|
|
245
|
+
if (board.keywords && board.keywords.length > 0) {
|
|
246
|
+
console.log(chalk.gray(` → Keywords: ${board.keywords.join(', ')}`));
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
console.log('');
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=jira-board-selection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jira-board-selection.js","sourceRoot":"","sources":["../../../../../src/cli/helpers/issue-tracker/jira-board-selection.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAE,UAAU,EAAE,MAAM,2CAA2C,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAkB,MAAM,+DAA+D,CAAC;AACtH,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,wCAAwC,CAAC;AA2BhD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,YAAoB;IAEpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC,CAAC;IAE5D,2CAA2C;IAC3C,MAAM,eAAe,GACnB,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;QACvC,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;YACnC,eAAe,CAAC;IAElB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAA2B;QACtD,OAAO,EAAE,yCAAyC;QAClD,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,+CAA+C;gBACrD,KAAK,EAAE,gBAAgB;gBACvB,WAAW,EAAE,kDAAkD;aAChE;YACD;gBACE,IAAI,EAAE,uEAAuE;gBAC7E,KAAK,EAAE,aAAa;gBACpB,WAAW,EAAE,kDAAkD;aAChE;YACD;gBACE,IAAI,EAAE,2DAA2D;gBACjE,KAAK,EAAE,eAAe;gBACtB,WAAW,EAAE,6DAA6D;aAC3E;SACF;QACD,OAAO,EAAE,eAAe;KACzB,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAAkB,EAClB,UAAkB,EAClB,WAAmB;IAEnB,MAAM,OAAO,GAAG,GAAG,CAAC,gCAAgC,UAAU,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;IAE7E,IAAI,CAAC;QACH,yBAAyB;QACzB,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC/D,OAAO,CAAC,OAAO,CAAC,SAAS,MAAM,CAAC,MAAM,wBAAwB,UAAU,EAAE,CAAC,CAAC;QAE5E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,wCAAwC,CAAC,CAAC,CAAC;YACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC,CAAC;YACxF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,kCAAkC;QAClC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC,CAAC;QAE9E,+DAA+D;QAC/D,MAAM,cAAc,GAAG,CAAC,KAAgB,EAAE,EAAE,CAC1C,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;YAC5C,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;YAC7C,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAElD,MAAM,gBAAgB,GAAG,MAAM,QAAQ,CAAC;YACtC,OAAO,EAAE,oDAAoD;YAC7D,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAC9B,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,SAAS,KAAK,CAAC,EAAE,GAAG;gBACtD,KAAK,EAAE,KAAK,CAAC,EAAE;gBACf,OAAO,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,gCAAgC;aAClE,CAAC,CAAC;SACJ,CAAC,CAAC;QAEH,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kEAAkE,CAAC,CAAC,CAAC;YAC9F,OAAO,IAAI,CAAC;QACd,CAAC;QAED,iDAAiD;QACjD,MAAM,WAAW,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;QAEvD,4CAA4C;QAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC,CAAC;QAE1E,MAAM,aAAa,GAAuB,EAAE,CAAC;QAE7C,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;YACvC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;YACnD,IAAI,CAAC,KAAK;gBAAE,SAAS;YAErB,2CAA2C;YAC3C,MAAM,WAAW,GAAG,iBAAiB,CAAC;gBACpC,iBAAiB,EAAE,UAAU;gBAC7B,SAAS,EAAE,KAAK,CAAC,IAAI;gBACrB,QAAQ,EAAE,MAAM;gBAChB,WAAW,EAAE,CAAC,GAAG,WAAW,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;aAC/E,CAAC,CAAC;YAEH,yCAAyC;YACzC,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC;gBAC5B,OAAO,EAAE,6BAA6B,KAAK,CAAC,IAAI,IAAI;gBACpD,OAAO,EAAE,WAAW,CAAC,EAAE;gBACvB,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;oBAChB,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;wBAC9B,OAAO,4BAA4B,CAAC;oBACtC,CAAC;oBACD,MAAM,UAAU,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;oBAC7C,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;wBACvB,OAAO,+BAA+B,UAAU,GAAG,CAAC;oBACtD,CAAC;oBACD,IAAI,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,KAAK,GAAG,CAAC,EAAE,CAAC;wBACvF,OAAO,eAAe,GAAG,4CAA4C,CAAC;oBACxE,CAAC;oBACD,OAAO,IAAI,CAAC;gBACd,CAAC;aACF,CAAC,CAAC;YAEH,iDAAiD;YACjD,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC;gBAChC,OAAO,EAAE,2DAA2D,SAAS,GAAG;gBAChF,OAAO,EAAE,KAAK;aACf,CAAC,CAAC;YAEH,IAAI,QAA8B,CAAC;YACnC,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC;oBAChC,OAAO,EAAE,0DAA0D;oBACnE,OAAO,EAAE,EAAE;iBACZ,CAAC,CAAC;gBACH,QAAQ,GAAG,aAAa;qBACrB,KAAK,CAAC,GAAG,CAAC;qBACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;qBACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACjC,CAAC;YAED,aAAa,CAAC,IAAI,CAAC;gBACjB,OAAO,EAAE,KAAK,CAAC,EAAE;gBACjB,SAAS,EAAE,KAAK,CAAC,IAAI;gBACrB,gBAAgB,EAAE,SAAS;gBAC3B,SAAS,EAAE,KAAK,CAAC,IAAI;gBACrB,QAAQ;aACT,CAAC,CAAC;YAEH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,KAAK,CAAC,IAAI,MAAM,SAAS,EAAE,CAAC,CAAC,CAAC;QAChE,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,OAAO;YACL,UAAU;YACV,MAAM,EAAE,aAAa;SACtB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACvC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,WAKC,EACD,gBAA0B,EAC1B,WAAmB;IAEnB,gEAAgE;IAChE,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,0BAA0B,CAAC,CAAC,CAAC,CAAC;QAErD,IAAI,QAAQ,KAAK,gBAAgB,EAAE,CAAC;YAClC,OAAO;gBACL,QAAQ,EAAE,gBAAgB;gBAC1B,UAAU,EAAE,gBAAgB,CAAC,CAAC,CAAC;aAChC,CAAC;QACJ,CAAC;QAED,IAAI,QAAQ,KAAK,aAAa,EAAE,CAAC;YAC/B,wEAAwE;YACxE,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAEhC,MAAM,YAAY,GAAG,MAAM,oBAAoB,CAC7C,MAAM,EACN,gBAAgB,CAAC,CAAC,CAAC,EACnB,WAAW,CACZ,CAAC;YAEF,IAAI,YAAY,IAAI,YAAY,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnD,OAAO;oBACL,QAAQ,EAAE,aAAa;oBACvB,YAAY;iBACb,CAAC;YACJ,CAAC;YAED,oDAAoD;YACpD,OAAO;gBACL,QAAQ,EAAE,gBAAgB;gBAC1B,UAAU,EAAE,gBAAgB,CAAC,CAAC,CAAC;aAChC,CAAC;QACJ,CAAC;QAED,mEAAmE;QACnE,OAAO;YACL,QAAQ,EAAE,gBAAgB;YAC1B,UAAU,EAAE,gBAAgB,CAAC,CAAC,CAAC;SAChC,CAAC;IACJ,CAAC;IAED,kDAAkD;IAClD,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC;QACnC,OAAO,EAAE,gBAAgB,gBAAgB,CAAC,MAAM,+EAA+E;QAC/H,OAAO,EAAE,KAAK;KACf,CAAC,CAAC;IAEH,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,8BAA8B;QAC9B,OAAO;YACL,QAAQ,EAAE,eAAe;YACzB,WAAW,EAAE,gBAAgB;SAC9B,CAAC;IACJ,CAAC;IAED,oDAAoD;IACpD,MAAM,gBAAgB,GAAG,MAAM,MAAM,CAAC;QACpC,OAAO,EAAE,2CAA2C;QACpD,OAAO,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;KAC9D,CAAC,CAAC;IAEH,0DAA0D;IAC1D,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;IAEhC,MAAM,YAAY,GAAG,MAAM,oBAAoB,CAC7C,MAAM,EACN,gBAAgB,EAChB,WAAW,CACZ,CAAC;IAEF,IAAI,YAAY,IAAI,YAAY,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnD,8DAA8D;QAC9D,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,gBAAgB,CAAC,CAAC;QAEjF,OAAO;YACL,QAAQ,EAAE,aAAa;YACvB,YAAY;YACZ,WAAW,EAAE,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS;SAC1E,CAAC;IACJ,CAAC;IAED,6BAA6B;IAC7B,OAAO;QACL,QAAQ,EAAE,eAAe;QACzB,WAAW,EAAE,gBAAgB;KAC9B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,OAA+B;IACxE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;IAExE,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC;QACtF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6BAA6B,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;QAC/E,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -16,7 +16,10 @@ import path from 'path';
|
|
|
16
16
|
import * as fs from '../utils/fs-native.js';
|
|
17
17
|
import { createACTestValidator } from './ac-test-validator.js';
|
|
18
18
|
import { parseTasksWithUSLinks, getAllTasks } from '../generators/spec/task-parser.js';
|
|
19
|
-
import
|
|
19
|
+
import chalkFallback, { getChalk } from '../utils/chalk-fallback.js';
|
|
20
|
+
// Use chalk if available, otherwise fallback to ANSI codes
|
|
21
|
+
let chalk = chalkFallback;
|
|
22
|
+
getChalk().then(c => { chalk = c; }).catch(() => { });
|
|
20
23
|
async function main() {
|
|
21
24
|
// Parse arguments
|
|
22
25
|
const incrementId = process.argv[2];
|