specweave 0.8.20 → 0.8.21
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/cli/helpers/issue-tracker/ado.d.ts.map +1 -1
- package/dist/cli/helpers/issue-tracker/ado.js +21 -13
- package/dist/cli/helpers/issue-tracker/ado.js.map +1 -1
- package/dist/cli/helpers/issue-tracker/types.d.ts +2 -1
- package/dist/cli/helpers/issue-tracker/types.d.ts.map +1 -1
- package/dist/cli/helpers/issue-tracker/types.js.map +1 -1
- package/dist/core/credentials-manager.d.ts +2 -1
- package/dist/core/credentials-manager.d.ts.map +1 -1
- package/dist/core/credentials-manager.js +30 -25
- package/dist/core/credentials-manager.js.map +1 -1
- package/dist/core/sync/folder-mapper.d.ts +71 -0
- package/dist/core/sync/folder-mapper.d.ts.map +1 -0
- package/dist/core/sync/folder-mapper.js +168 -0
- package/dist/core/sync/folder-mapper.js.map +1 -0
- package/dist/core/sync/profile-validator.d.ts +52 -0
- package/dist/core/sync/profile-validator.d.ts.map +1 -0
- package/dist/core/sync/profile-validator.js +225 -0
- package/dist/core/sync/profile-validator.js.map +1 -0
- package/dist/core/types/sync-profile.d.ts +52 -2
- package/dist/core/types/sync-profile.d.ts.map +1 -1
- package/dist/utils/env-multi-project-parser.d.ts +22 -12
- package/dist/utils/env-multi-project-parser.d.ts.map +1 -1
- package/dist/utils/env-multi-project-parser.js +31 -34
- package/dist/utils/env-multi-project-parser.js.map +1 -1
- package/dist/utils/string-utils.d.ts +40 -0
- package/dist/utils/string-utils.d.ts.map +1 -0
- package/dist/utils/string-utils.js +58 -0
- package/dist/utils/string-utils.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sync Profile Validator
|
|
3
|
+
*
|
|
4
|
+
* Validates sync profile configurations for multi-team support
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Validate Jira profile configuration
|
|
8
|
+
*
|
|
9
|
+
* Rules:
|
|
10
|
+
* - Strategy is required
|
|
11
|
+
* - project-per-team: requires projects[] array
|
|
12
|
+
* - shared-project-with-components: requires projectKey + components[]
|
|
13
|
+
* - Cannot mix strategies (no projects[] with shared-project)
|
|
14
|
+
*
|
|
15
|
+
* @param config - Jira configuration
|
|
16
|
+
* @returns Validation result with errors/warnings
|
|
17
|
+
*/
|
|
18
|
+
export function validateJiraConfig(config) {
|
|
19
|
+
const errors = [];
|
|
20
|
+
const warnings = [];
|
|
21
|
+
// Validate domain
|
|
22
|
+
if (!config.domain || config.domain.trim().length === 0) {
|
|
23
|
+
errors.push('Jira domain is required');
|
|
24
|
+
}
|
|
25
|
+
// Strategy is optional for backward compatibility
|
|
26
|
+
// If not provided, assume single project mode
|
|
27
|
+
if (!config.strategy) {
|
|
28
|
+
// Legacy mode: single projectKey
|
|
29
|
+
if (!config.projectKey) {
|
|
30
|
+
errors.push('Either strategy (with projects/components) or projectKey (legacy) is required');
|
|
31
|
+
}
|
|
32
|
+
return { valid: errors.length === 0, errors, warnings };
|
|
33
|
+
}
|
|
34
|
+
// Validate project-per-team strategy
|
|
35
|
+
if (config.strategy === 'project-per-team') {
|
|
36
|
+
if (!config.projects || config.projects.length === 0) {
|
|
37
|
+
errors.push('projects[] is required for project-per-team strategy');
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
// Validate project keys (must be uppercase alphanumeric)
|
|
41
|
+
const invalidProjects = config.projects.filter((p) => !/^[A-Z][A-Z0-9]*$/.test(p));
|
|
42
|
+
if (invalidProjects.length > 0) {
|
|
43
|
+
errors.push(`Invalid Jira project keys: ${invalidProjects.join(', ')} (must be uppercase alphanumeric, e.g., FRONTEND, QA)`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Cannot have projectKey or components with this strategy
|
|
47
|
+
if (config.projectKey) {
|
|
48
|
+
errors.push('projectKey is not allowed with project-per-team strategy (use projects[] instead)');
|
|
49
|
+
}
|
|
50
|
+
if (config.components) {
|
|
51
|
+
errors.push('components[] is not allowed with project-per-team strategy');
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// Validate shared-project-with-components strategy
|
|
55
|
+
if (config.strategy === 'shared-project-with-components') {
|
|
56
|
+
if (!config.projectKey || config.projectKey.trim().length === 0) {
|
|
57
|
+
errors.push('projectKey is required for shared-project-with-components strategy');
|
|
58
|
+
}
|
|
59
|
+
else if (!/^[A-Z][A-Z0-9]*$/.test(config.projectKey)) {
|
|
60
|
+
errors.push(`Invalid Jira project key: ${config.projectKey} (must be uppercase alphanumeric, e.g., PRODUCT)`);
|
|
61
|
+
}
|
|
62
|
+
if (!config.components || config.components.length === 0) {
|
|
63
|
+
errors.push('components[] is required for shared-project-with-components strategy');
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
// Validate component names (no empty strings)
|
|
67
|
+
const emptyComponents = config.components.filter((c) => !c.trim());
|
|
68
|
+
if (emptyComponents.length > 0) {
|
|
69
|
+
errors.push('Component names cannot be empty');
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Cannot have projects[] with this strategy
|
|
73
|
+
if (config.projects) {
|
|
74
|
+
errors.push('projects[] is not allowed with shared-project-with-components strategy (use components[] instead)');
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Warnings
|
|
78
|
+
if (config.strategy === 'project-per-team' && config.projects && config.projects.length > 10) {
|
|
79
|
+
warnings.push(`Large number of projects (${config.projects.length}). Consider using shared-project-with-components strategy for better manageability.`);
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
valid: errors.length === 0,
|
|
83
|
+
errors,
|
|
84
|
+
warnings,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Validate Azure DevOps profile configuration
|
|
89
|
+
*
|
|
90
|
+
* Rules:
|
|
91
|
+
* - organization and project are required
|
|
92
|
+
* - teams[] array is optional (single project if not provided)
|
|
93
|
+
* - Team names cannot be empty
|
|
94
|
+
* - areaPaths map must match teams if both provided
|
|
95
|
+
*
|
|
96
|
+
* @param config - ADO configuration
|
|
97
|
+
* @returns Validation result with errors/warnings
|
|
98
|
+
*/
|
|
99
|
+
export function validateAdoConfig(config) {
|
|
100
|
+
const errors = [];
|
|
101
|
+
const warnings = [];
|
|
102
|
+
// Validate organization
|
|
103
|
+
if (!config.organization || config.organization.trim().length === 0) {
|
|
104
|
+
errors.push('ADO organization is required');
|
|
105
|
+
}
|
|
106
|
+
// Validate project
|
|
107
|
+
if (!config.project || config.project.trim().length === 0) {
|
|
108
|
+
errors.push('ADO project is required');
|
|
109
|
+
}
|
|
110
|
+
// Validate teams (optional)
|
|
111
|
+
if (config.teams) {
|
|
112
|
+
if (config.teams.length === 0) {
|
|
113
|
+
warnings.push('teams[] is empty. Remove it to use single-project mode.');
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
// Validate team names (no empty strings)
|
|
117
|
+
const emptyTeams = config.teams.filter((t) => !t.trim());
|
|
118
|
+
if (emptyTeams.length > 0) {
|
|
119
|
+
errors.push('Team names cannot be empty');
|
|
120
|
+
}
|
|
121
|
+
// Check for duplicate team names
|
|
122
|
+
const uniqueTeams = new Set(config.teams);
|
|
123
|
+
if (uniqueTeams.size !== config.teams.length) {
|
|
124
|
+
errors.push('Duplicate team names detected');
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// Validate areaPaths (optional, must match teams if both provided)
|
|
129
|
+
if (config.areaPaths && config.teams) {
|
|
130
|
+
const teamFolders = new Set(config.teams.map((t) => t.toLowerCase().replace(/\s+/g, '-')));
|
|
131
|
+
const areaPathFolders = new Set(Object.keys(config.areaPaths));
|
|
132
|
+
// Check if all team folders have area paths
|
|
133
|
+
for (const folder of teamFolders) {
|
|
134
|
+
if (!areaPathFolders.has(folder)) {
|
|
135
|
+
warnings.push(`Missing Area Path for team folder "${folder}". It will be auto-generated.`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// Check for extra area paths (not matching any team)
|
|
139
|
+
for (const folder of areaPathFolders) {
|
|
140
|
+
if (!teamFolders.has(folder)) {
|
|
141
|
+
warnings.push(`Area Path for "${folder}" does not match any team. It will be ignored.`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// Warnings
|
|
146
|
+
if (config.teams && config.teams.length > 20) {
|
|
147
|
+
warnings.push(`Large number of teams (${config.teams.length}). Consider splitting into multiple ADO projects.`);
|
|
148
|
+
}
|
|
149
|
+
return {
|
|
150
|
+
valid: errors.length === 0,
|
|
151
|
+
errors,
|
|
152
|
+
warnings,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Validate GitHub profile configuration
|
|
157
|
+
*
|
|
158
|
+
* Rules:
|
|
159
|
+
* - owner and repo are required
|
|
160
|
+
*
|
|
161
|
+
* @param config - GitHub configuration
|
|
162
|
+
* @returns Validation result with errors/warnings
|
|
163
|
+
*/
|
|
164
|
+
export function validateGitHubConfig(config) {
|
|
165
|
+
const errors = [];
|
|
166
|
+
const warnings = [];
|
|
167
|
+
if (!config.owner || config.owner.trim().length === 0) {
|
|
168
|
+
errors.push('GitHub owner is required');
|
|
169
|
+
}
|
|
170
|
+
if (!config.repo || config.repo.trim().length === 0) {
|
|
171
|
+
errors.push('GitHub repo is required');
|
|
172
|
+
}
|
|
173
|
+
return {
|
|
174
|
+
valid: errors.length === 0,
|
|
175
|
+
errors,
|
|
176
|
+
warnings,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Validate sync profile
|
|
181
|
+
*
|
|
182
|
+
* Validates entire profile including provider-specific config
|
|
183
|
+
*
|
|
184
|
+
* @param profile - Sync profile to validate
|
|
185
|
+
* @returns Validation result with errors/warnings
|
|
186
|
+
*/
|
|
187
|
+
export function validateSyncProfile(profile) {
|
|
188
|
+
const errors = [];
|
|
189
|
+
const warnings = [];
|
|
190
|
+
// Validate displayName
|
|
191
|
+
if (!profile.displayName || profile.displayName.trim().length === 0) {
|
|
192
|
+
errors.push('Profile displayName is required');
|
|
193
|
+
}
|
|
194
|
+
// Validate provider
|
|
195
|
+
if (!profile.provider) {
|
|
196
|
+
errors.push('Provider is required (github, jira, or ado)');
|
|
197
|
+
return { valid: false, errors, warnings };
|
|
198
|
+
}
|
|
199
|
+
// Validate provider-specific config
|
|
200
|
+
let providerValidation;
|
|
201
|
+
if (profile.provider === 'github') {
|
|
202
|
+
providerValidation = validateGitHubConfig(profile.config);
|
|
203
|
+
}
|
|
204
|
+
else if (profile.provider === 'jira') {
|
|
205
|
+
providerValidation = validateJiraConfig(profile.config);
|
|
206
|
+
}
|
|
207
|
+
else if (profile.provider === 'ado') {
|
|
208
|
+
providerValidation = validateAdoConfig(profile.config);
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
errors.push(`Unknown provider: ${profile.provider}`);
|
|
212
|
+
return { valid: false, errors, warnings };
|
|
213
|
+
}
|
|
214
|
+
// Merge provider validation results
|
|
215
|
+
errors.push(...providerValidation.errors);
|
|
216
|
+
if (providerValidation.warnings) {
|
|
217
|
+
warnings.push(...providerValidation.warnings);
|
|
218
|
+
}
|
|
219
|
+
return {
|
|
220
|
+
valid: errors.length === 0,
|
|
221
|
+
errors,
|
|
222
|
+
warnings: warnings.length > 0 ? warnings : undefined,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=profile-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-validator.js","sourceRoot":"","sources":["../../../src/core/sync/profile-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,20 +5,70 @@
|
|
|
5
5
|
* with time range filtering and rate limiting protection.
|
|
6
6
|
*/
|
|
7
7
|
export type SyncProvider = 'github' | 'jira' | 'ado';
|
|
8
|
+
export type JiraStrategy = 'project-per-team' | 'shared-project-with-components';
|
|
8
9
|
export interface GitHubConfig {
|
|
9
10
|
owner: string;
|
|
10
11
|
repo: string;
|
|
11
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* Jira Configuration (Multi-Team Support)
|
|
15
|
+
*
|
|
16
|
+
* Jira has NO explicit "Team" concept like ADO.
|
|
17
|
+
* Instead, teams are simulated using either:
|
|
18
|
+
* 1. Multiple Projects (one per team) - simpler, more projects
|
|
19
|
+
* 2. One Project with Components (team labels) - fewer projects, shared backlog
|
|
20
|
+
*
|
|
21
|
+
* Backward Compatibility:
|
|
22
|
+
* - Old config: { domain, projectKey } - single project mode
|
|
23
|
+
* - New config: { domain, strategy, projects/components } - multi-team mode
|
|
24
|
+
*/
|
|
12
25
|
export interface JiraConfig {
|
|
13
26
|
domain: string;
|
|
14
|
-
projectKey: string;
|
|
15
27
|
issueType?: 'Epic' | 'Story' | 'Task';
|
|
28
|
+
/**
|
|
29
|
+
* How teams are organized in Jira (optional for backward compatibility)
|
|
30
|
+
* - 'project-per-team': Each team has separate project (FRONTEND, BACKEND, QA)
|
|
31
|
+
* - 'shared-project-with-components': One project with components per team
|
|
32
|
+
* - undefined: Single project mode (backward compatible)
|
|
33
|
+
*/
|
|
34
|
+
strategy?: JiraStrategy;
|
|
35
|
+
/**
|
|
36
|
+
* Strategy 1: Multiple projects (one per team)
|
|
37
|
+
* Example: ["FRONTEND", "BACKEND", "QA"]
|
|
38
|
+
* Creates folders: frontend/, backend/, qa/
|
|
39
|
+
*/
|
|
40
|
+
projects?: string[];
|
|
41
|
+
/**
|
|
42
|
+
* Strategy 2: Shared project with components
|
|
43
|
+
* OR Legacy: Single project key
|
|
44
|
+
* Example: projectKey="PRODUCT", components=["Frontend", "Backend", "QA"]
|
|
45
|
+
* Creates folders: frontend/, backend/, qa/
|
|
46
|
+
*/
|
|
47
|
+
projectKey?: string;
|
|
48
|
+
components?: string[];
|
|
16
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* Azure DevOps Configuration (Multi-Team Support)
|
|
52
|
+
*
|
|
53
|
+
* ADO has REAL Teams as explicit entities within a project.
|
|
54
|
+
* Multiple teams can exist in ONE project, each with own Area Path.
|
|
55
|
+
*/
|
|
17
56
|
export interface AdoConfig {
|
|
18
57
|
organization: string;
|
|
19
58
|
project: string;
|
|
20
59
|
workItemType?: 'Epic' | 'Feature' | 'User Story';
|
|
21
|
-
|
|
60
|
+
/**
|
|
61
|
+
* Teams within the project
|
|
62
|
+
* Example: ["League Scheduler Team", "Platform Engineering Team", "QA Team"]
|
|
63
|
+
* Creates folders: league-scheduler-team/, platform-engineering-team/, qa-team/
|
|
64
|
+
*/
|
|
65
|
+
teams?: string[];
|
|
66
|
+
/**
|
|
67
|
+
* Explicit Area Paths per team (optional, auto-generated if not provided)
|
|
68
|
+
* Format: { "team-folder-name": "Project\\Team Name" }
|
|
69
|
+
* Example: { "platform-team": "League Scheduler\\Platform Engineering Team" }
|
|
70
|
+
*/
|
|
71
|
+
areaPaths?: Record<string, string>;
|
|
22
72
|
iterationPath?: string;
|
|
23
73
|
}
|
|
24
74
|
export type ProviderConfig = GitHubConfig | JiraConfig | AdoConfig;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-profile.d.ts","sourceRoot":"","sources":["../../../src/core/types/sync-profile.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"sync-profile.d.ts","sourceRoot":"","sources":["../../../src/core/types/sync-profile.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,11 +2,15 @@
|
|
|
2
2
|
* Environment Multi-Project Parser
|
|
3
3
|
*
|
|
4
4
|
* Parses comma-separated project lists from .env:
|
|
5
|
-
* - JIRA_PROJECT_KEYS=BACKEND,FRONTEND,MOBILE
|
|
6
|
-
* - GITHUB_REPOS=owner/backend-api,owner/frontend-web
|
|
7
|
-
* -
|
|
5
|
+
* - JIRA_PROJECT_KEYS=BACKEND,FRONTEND,MOBILE (multiple projects)
|
|
6
|
+
* - GITHUB_REPOS=owner/backend-api,owner/frontend-web (multiple repos)
|
|
7
|
+
* - AZURE_DEVOPS_PROJECT=myproject (single project only)
|
|
8
|
+
* - AZURE_DEVOPS_TEAMS=Frontend,Backend,Mobile (multiple teams within project)
|
|
8
9
|
*
|
|
9
|
-
* Auto-creates sync profiles for each project.
|
|
10
|
+
* Auto-creates sync profiles for each project/repo.
|
|
11
|
+
*
|
|
12
|
+
* NOTE: Azure DevOps uses ONE project per organization with multiple teams.
|
|
13
|
+
* Multi-project support is for Jira and GitHub only.
|
|
10
14
|
*/
|
|
11
15
|
import { SyncProfile } from '../core/types/sync-profile.js';
|
|
12
16
|
export interface JiraProjectConfig {
|
|
@@ -90,25 +94,29 @@ export declare function parseJiraProjects(): JiraProjectConfig[];
|
|
|
90
94
|
*/
|
|
91
95
|
export declare function parseGitHubRepos(): GitHubRepoConfig[];
|
|
92
96
|
/**
|
|
93
|
-
* Parse Azure DevOps
|
|
97
|
+
* Parse Azure DevOps project from .env
|
|
98
|
+
*
|
|
99
|
+
* NOTE: Azure DevOps supports ONE project per organization with multiple teams.
|
|
100
|
+
* For multi-team support, use AZURE_DEVOPS_TEAMS (comma-separated).
|
|
94
101
|
*
|
|
95
102
|
* Reads:
|
|
96
|
-
* -
|
|
97
|
-
* - AZURE_DEVOPS_ORG (
|
|
98
|
-
* - AZURE_DEVOPS_PAT (
|
|
103
|
+
* - AZURE_DEVOPS_PROJECT (single project, required)
|
|
104
|
+
* - AZURE_DEVOPS_ORG (organization)
|
|
105
|
+
* - AZURE_DEVOPS_PAT (credential)
|
|
106
|
+
* - AZURE_DEVOPS_TEAMS (comma-separated teams, optional)
|
|
99
107
|
*
|
|
100
|
-
* @returns Array
|
|
108
|
+
* @returns Array with single ADO project configuration
|
|
101
109
|
*
|
|
102
110
|
* @example
|
|
103
111
|
* // .env:
|
|
104
|
-
* //
|
|
112
|
+
* // AZURE_DEVOPS_PROJECT=myproject
|
|
105
113
|
* // AZURE_DEVOPS_ORG=easychamp
|
|
106
114
|
* // AZURE_DEVOPS_PAT=xyz789
|
|
115
|
+
* // AZURE_DEVOPS_TEAMS=Frontend,Backend,Mobile
|
|
107
116
|
*
|
|
108
117
|
* parseAdoProjects()
|
|
109
118
|
* // Returns: [
|
|
110
|
-
* // { organization: "easychamp", project: "
|
|
111
|
-
* // { organization: "easychamp", project: "frontend-web", pat: "..." }
|
|
119
|
+
* // { organization: "easychamp", project: "myproject", pat: "..." }
|
|
112
120
|
* // ]
|
|
113
121
|
*/
|
|
114
122
|
export declare function parseAdoProjects(): AdoProjectConfig[];
|
|
@@ -148,6 +156,8 @@ export declare function createGitHubSyncProfile(config: GitHubRepoConfig): {
|
|
|
148
156
|
};
|
|
149
157
|
/**
|
|
150
158
|
* Create Azure DevOps sync profile from project configuration
|
|
159
|
+
*
|
|
160
|
+
* NOTE: Creates ONE profile per organization. Teams are managed within the project.
|
|
151
161
|
*/
|
|
152
162
|
export declare function createAdoSyncProfile(config: AdoProjectConfig): {
|
|
153
163
|
id: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-multi-project-parser.d.ts","sourceRoot":"","sources":["../../src/utils/env-multi-project-parser.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"env-multi-project-parser.d.ts","sourceRoot":"","sources":["../../src/utils/env-multi-project-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAM5D,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,iBAAiB,EAAE,CAAC;IAC1B,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,GAAG,EAAE,gBAAgB,EAAE,CAAC;CACzB;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,CASvE;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,iBAAiB,IAAI,iBAAiB,EAAE,CAoCvD;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,IAAI,gBAAgB,EAAE,CA8BrD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,gBAAgB,IAAI,gBAAgB,EAAE,CAkBrD;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,qBAAqB,CAM5D;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,iBAAiB,GAAG;IAChE,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;CAClC,CAwBA;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,gBAAgB,GAAG;IACjE,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;CAClC,CAuBA;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,GAAG;IAC9D,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;CAClC,CAwBA;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,2BAA2B,IAAI,KAAK,CAAC;IACnD,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;CAClC,CAAC,CAoBD;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAcjE;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAqB9D;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAUjE"}
|
|
@@ -2,11 +2,15 @@
|
|
|
2
2
|
* Environment Multi-Project Parser
|
|
3
3
|
*
|
|
4
4
|
* Parses comma-separated project lists from .env:
|
|
5
|
-
* - JIRA_PROJECT_KEYS=BACKEND,FRONTEND,MOBILE
|
|
6
|
-
* - GITHUB_REPOS=owner/backend-api,owner/frontend-web
|
|
7
|
-
* -
|
|
5
|
+
* - JIRA_PROJECT_KEYS=BACKEND,FRONTEND,MOBILE (multiple projects)
|
|
6
|
+
* - GITHUB_REPOS=owner/backend-api,owner/frontend-web (multiple repos)
|
|
7
|
+
* - AZURE_DEVOPS_PROJECT=myproject (single project only)
|
|
8
|
+
* - AZURE_DEVOPS_TEAMS=Frontend,Backend,Mobile (multiple teams within project)
|
|
8
9
|
*
|
|
9
|
-
* Auto-creates sync profiles for each project.
|
|
10
|
+
* Auto-creates sync profiles for each project/repo.
|
|
11
|
+
*
|
|
12
|
+
* NOTE: Azure DevOps uses ONE project per organization with multiple teams.
|
|
13
|
+
* Multi-project support is for Jira and GitHub only.
|
|
10
14
|
*/
|
|
11
15
|
// ============================================================================
|
|
12
16
|
// Parsing Functions
|
|
@@ -136,56 +140,47 @@ export function parseGitHubRepos() {
|
|
|
136
140
|
return configs;
|
|
137
141
|
}
|
|
138
142
|
/**
|
|
139
|
-
* Parse Azure DevOps
|
|
143
|
+
* Parse Azure DevOps project from .env
|
|
144
|
+
*
|
|
145
|
+
* NOTE: Azure DevOps supports ONE project per organization with multiple teams.
|
|
146
|
+
* For multi-team support, use AZURE_DEVOPS_TEAMS (comma-separated).
|
|
140
147
|
*
|
|
141
148
|
* Reads:
|
|
142
|
-
* -
|
|
143
|
-
* - AZURE_DEVOPS_ORG (
|
|
144
|
-
* - AZURE_DEVOPS_PAT (
|
|
149
|
+
* - AZURE_DEVOPS_PROJECT (single project, required)
|
|
150
|
+
* - AZURE_DEVOPS_ORG (organization)
|
|
151
|
+
* - AZURE_DEVOPS_PAT (credential)
|
|
152
|
+
* - AZURE_DEVOPS_TEAMS (comma-separated teams, optional)
|
|
145
153
|
*
|
|
146
|
-
* @returns Array
|
|
154
|
+
* @returns Array with single ADO project configuration
|
|
147
155
|
*
|
|
148
156
|
* @example
|
|
149
157
|
* // .env:
|
|
150
|
-
* //
|
|
158
|
+
* // AZURE_DEVOPS_PROJECT=myproject
|
|
151
159
|
* // AZURE_DEVOPS_ORG=easychamp
|
|
152
160
|
* // AZURE_DEVOPS_PAT=xyz789
|
|
161
|
+
* // AZURE_DEVOPS_TEAMS=Frontend,Backend,Mobile
|
|
153
162
|
*
|
|
154
163
|
* parseAdoProjects()
|
|
155
164
|
* // Returns: [
|
|
156
|
-
* // { organization: "easychamp", project: "
|
|
157
|
-
* // { organization: "easychamp", project: "frontend-web", pat: "..." }
|
|
165
|
+
* // { organization: "easychamp", project: "myproject", pat: "..." }
|
|
158
166
|
* // ]
|
|
159
167
|
*/
|
|
160
168
|
export function parseAdoProjects() {
|
|
161
169
|
const organization = process.env.AZURE_DEVOPS_ORG;
|
|
162
170
|
const pat = process.env.AZURE_DEVOPS_PAT;
|
|
171
|
+
const project = process.env.AZURE_DEVOPS_PROJECT;
|
|
163
172
|
// Missing credentials → return empty array
|
|
164
|
-
if (!organization || !pat) {
|
|
173
|
+
if (!organization || !pat || !project) {
|
|
165
174
|
return [];
|
|
166
175
|
}
|
|
167
|
-
//
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
const projects = parseCommaSeparated(projectsStr);
|
|
171
|
-
return projects.map((project) => ({
|
|
176
|
+
// ADO only supports ONE project per organization
|
|
177
|
+
return [
|
|
178
|
+
{
|
|
172
179
|
organization,
|
|
173
|
-
project,
|
|
180
|
+
project: project.trim(),
|
|
174
181
|
pat,
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
// Fallback to legacy format (AZURE_DEVOPS_PROJECT - singular)
|
|
178
|
-
const legacyProject = process.env.AZURE_DEVOPS_PROJECT;
|
|
179
|
-
if (legacyProject) {
|
|
180
|
-
return [
|
|
181
|
-
{
|
|
182
|
-
organization,
|
|
183
|
-
project: legacyProject.trim(),
|
|
184
|
-
pat,
|
|
185
|
-
},
|
|
186
|
-
];
|
|
187
|
-
}
|
|
188
|
-
return [];
|
|
182
|
+
},
|
|
183
|
+
];
|
|
189
184
|
}
|
|
190
185
|
/**
|
|
191
186
|
* Parse all multi-project configurations from .env
|
|
@@ -273,6 +268,8 @@ export function createGitHubSyncProfile(config) {
|
|
|
273
268
|
}
|
|
274
269
|
/**
|
|
275
270
|
* Create Azure DevOps sync profile from project configuration
|
|
271
|
+
*
|
|
272
|
+
* NOTE: Creates ONE profile per organization. Teams are managed within the project.
|
|
276
273
|
*/
|
|
277
274
|
export function createAdoSyncProfile(config) {
|
|
278
275
|
const profileId = generateProfileId('ado', config.project);
|
|
@@ -281,7 +278,7 @@ export function createAdoSyncProfile(config) {
|
|
|
281
278
|
profile: {
|
|
282
279
|
provider: 'ado',
|
|
283
280
|
displayName: `${config.organization}/${config.project}`,
|
|
284
|
-
description: `Auto-created from
|
|
281
|
+
description: `Auto-created from AZURE_DEVOPS_PROJECT (single project with teams)`,
|
|
285
282
|
config: {
|
|
286
283
|
organization: config.organization,
|
|
287
284
|
project: config.project,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-multi-project-parser.js","sourceRoot":"","sources":["../../src/utils/env-multi-project-parser.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"env-multi-project-parser.js","sourceRoot":"","sources":["../../src/utils/env-multi-project-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* String Utilities
|
|
3
|
+
*
|
|
4
|
+
* Utilities for string manipulation and formatting
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Convert a string to kebab-case (lowercase with hyphens)
|
|
8
|
+
*
|
|
9
|
+
* Examples:
|
|
10
|
+
* - "Platform Engineering Team" → "platform-engineering-team"
|
|
11
|
+
* - "FRONTEND" → "frontend"
|
|
12
|
+
* - "League Scheduler Team" → "league-scheduler-team"
|
|
13
|
+
*
|
|
14
|
+
* @param str - Input string to slugify
|
|
15
|
+
* @returns Kebab-case string suitable for folder names
|
|
16
|
+
*/
|
|
17
|
+
export declare function slugify(str: string): string;
|
|
18
|
+
/**
|
|
19
|
+
* Parse comma-separated values and trim whitespace
|
|
20
|
+
*
|
|
21
|
+
* Examples:
|
|
22
|
+
* - "Team A, Team B, Team C" → ["Team A", "Team B", "Team C"]
|
|
23
|
+
* - "FRONTEND,BACKEND,QA" → ["FRONTEND", "BACKEND", "QA"]
|
|
24
|
+
*
|
|
25
|
+
* @param input - Comma-separated string
|
|
26
|
+
* @returns Array of trimmed strings (empty strings removed)
|
|
27
|
+
*/
|
|
28
|
+
export declare function parseCommaSeparated(input: string): string[];
|
|
29
|
+
/**
|
|
30
|
+
* Convert kebab-case to Title Case
|
|
31
|
+
*
|
|
32
|
+
* Examples:
|
|
33
|
+
* - "platform-engineering-team" → "Platform Engineering Team"
|
|
34
|
+
* - "frontend" → "Frontend"
|
|
35
|
+
*
|
|
36
|
+
* @param str - Kebab-case string
|
|
37
|
+
* @returns Title Case string
|
|
38
|
+
*/
|
|
39
|
+
export declare function unslugify(str: string): string;
|
|
40
|
+
//# sourceMappingURL=string-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string-utils.d.ts","sourceRoot":"","sources":["../../src/utils/string-utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;;;;GAUG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQ3C;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAK3D;AAED;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK7C"}
|