specweave 0.14.0 → 0.15.1
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/README.md +58 -9
- package/bin/specweave.js +65 -0
- package/dist/cli/commands/migrate-to-profiles.d.ts.map +1 -1
- package/dist/cli/commands/migrate-to-profiles.js +0 -2
- package/dist/cli/commands/migrate-to-profiles.js.map +1 -1
- package/dist/core/sync/folder-mapper.d.ts.map +1 -1
- package/dist/core/sync/folder-mapper.js +70 -35
- package/dist/core/sync/folder-mapper.js.map +1 -1
- package/dist/core/sync/profile-validator.d.ts.map +1 -1
- package/dist/core/sync/profile-validator.js +35 -90
- package/dist/core/sync/profile-validator.js.map +1 -1
- package/dist/core/types/sync-profile.d.ts +101 -155
- package/dist/core/types/sync-profile.d.ts.map +1 -1
- package/dist/core/types/sync-profile.js +46 -22
- package/dist/core/types/sync-profile.js.map +1 -1
- package/dist/utils/env-multi-project-parser.d.ts.map +1 -1
- package/dist/utils/env-multi-project-parser.js +0 -2
- package/dist/utils/env-multi-project-parser.js.map +1 -1
- package/dist/utils/project-mapper.d.ts +19 -1
- package/dist/utils/project-mapper.d.ts.map +1 -1
- package/dist/utils/project-mapper.js +7 -4
- package/dist/utils/project-mapper.js.map +1 -1
- package/dist/utils/spec-splitter.d.ts +7 -0
- package/dist/utils/spec-splitter.d.ts.map +1 -1
- package/dist/utils/spec-splitter.js +20 -2
- package/dist/utils/spec-splitter.js.map +1 -1
- package/package.json +1 -1
- package/plugins/specweave-ado/lib/ado-multi-project-sync.js +40 -7
- package/plugins/specweave-ado/lib/ado-multi-project-sync.ts +49 -7
- package/plugins/specweave-github/hooks/hooks.json +0 -11
- package/plugins/specweave-github/lib/github-multi-project-sync.js +58 -5
- package/plugins/specweave-github/lib/github-multi-project-sync.ts +80 -4
- package/plugins/specweave-jira/lib/jira-multi-project-sync.js +30 -5
- package/plugins/specweave-jira/lib/jira-multi-project-sync.ts +34 -5
|
@@ -28,6 +28,13 @@ export interface SpecMetadata {
|
|
|
28
28
|
jiraProjects?: string[];
|
|
29
29
|
jira_projects?: string[];
|
|
30
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* Normalize metadata fields (prefers camelCase over snake_case)
|
|
33
|
+
*
|
|
34
|
+
* @param metadata Raw metadata with potential snake_case fields
|
|
35
|
+
* @returns Normalized metadata with camelCase fields
|
|
36
|
+
*/
|
|
37
|
+
export declare function normalizeMetadata(metadata: SpecMetadata): SpecMetadata;
|
|
31
38
|
export interface ParsedSpec {
|
|
32
39
|
metadata: SpecMetadata;
|
|
33
40
|
executiveSummary: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spec-splitter.d.ts","sourceRoot":"","sources":["../../src/utils/spec-splitter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAIL,KAAK,SAAS,EACd,KAAK,WAAW,EACjB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,YAAY,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,SAAS,EAAE,CAAC;IACzB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,yBAAyB,EAAE,MAAM,CAAC;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"spec-splitter.d.ts","sourceRoot":"","sources":["../../src/utils/spec-splitter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAIL,KAAK,SAAS,EACd,KAAK,WAAW,EACjB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,YAAY,GAAG,YAAY,CAUtE;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,YAAY,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,SAAS,EAAE,CAAC;IACzB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,yBAAyB,EAAE,MAAM,CAAC;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAgCzE;AA8ID;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,YAAY,GAAE,WAAW,EAA0B,GAClD,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA0B9B;AA6GD;;;;;GAKG;AACH,wBAAsB,iCAAiC,CACrD,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAAE,GACnB,OAAO,CAAC,IAAI,CAAC,CAgCf"}
|
|
@@ -9,6 +9,23 @@
|
|
|
9
9
|
import fs from 'fs-extra';
|
|
10
10
|
import path from 'path';
|
|
11
11
|
import { splitSpecByProject, DEFAULT_PROJECT_RULES } from './project-mapper.js';
|
|
12
|
+
/**
|
|
13
|
+
* Normalize metadata fields (prefers camelCase over snake_case)
|
|
14
|
+
*
|
|
15
|
+
* @param metadata Raw metadata with potential snake_case fields
|
|
16
|
+
* @returns Normalized metadata with camelCase fields
|
|
17
|
+
*/
|
|
18
|
+
export function normalizeMetadata(metadata) {
|
|
19
|
+
return {
|
|
20
|
+
...metadata,
|
|
21
|
+
specId: metadata.specId || metadata.spec_id,
|
|
22
|
+
lastUpdated: metadata.lastUpdated || metadata.last_updated,
|
|
23
|
+
estimatedEffort: metadata.estimatedEffort || metadata.estimated_effort,
|
|
24
|
+
targetRelease: metadata.targetRelease || metadata.target_release,
|
|
25
|
+
jiraSync: metadata.jiraSync !== undefined ? metadata.jiraSync : metadata.jira_sync,
|
|
26
|
+
jiraProjects: metadata.jiraProjects || metadata.jira_projects
|
|
27
|
+
};
|
|
28
|
+
}
|
|
12
29
|
/**
|
|
13
30
|
* Parse spec file into structured format
|
|
14
31
|
*
|
|
@@ -22,7 +39,8 @@ export async function parseSpecFile(specPath) {
|
|
|
22
39
|
if (!frontmatterMatch) {
|
|
23
40
|
throw new Error('No frontmatter found in spec file');
|
|
24
41
|
}
|
|
25
|
-
const
|
|
42
|
+
const rawMetadata = parseFrontmatter(frontmatterMatch[1]);
|
|
43
|
+
const metadata = normalizeMetadata(rawMetadata);
|
|
26
44
|
// Extract sections
|
|
27
45
|
const sections = extractSections(content);
|
|
28
46
|
// Parse user stories
|
|
@@ -178,7 +196,7 @@ export async function splitSpecIntoProjects(specPath, outputDir, projectRules =
|
|
|
178
196
|
for (const [projectId, stories] of projectStories.entries()) {
|
|
179
197
|
const projectDir = path.join(outputDir, projectId);
|
|
180
198
|
await fs.ensureDir(projectDir);
|
|
181
|
-
const specId = (parsedSpec.metadata.specId ||
|
|
199
|
+
const specId = (parsedSpec.metadata.specId || '0001').replace(/^SPEC-/, '');
|
|
182
200
|
const outputPath = path.join(projectDir, `spec-${specId.toLowerCase()}-${projectId.toLowerCase()}.md`);
|
|
183
201
|
const projectSpec = generateProjectSpec(parsedSpec, projectId, stories);
|
|
184
202
|
await fs.writeFile(outputPath, projectSpec, 'utf-8');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spec-splitter.js","sourceRoot":"","sources":["../../src/utils/spec-splitter.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"spec-splitter.js","sourceRoot":"","sources":["../../src/utils/spec-splitter.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "specweave",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.15.1",
|
|
4
4
|
"description": "Spec-driven development framework for Claude Code. AI-native workflow with living documentation, intelligent agents, and multilingual support (9 languages). Enterprise-grade traceability with permanent specs and temporary increments.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -16,6 +16,31 @@ class AdoMultiProjectSync {
|
|
|
16
16
|
}
|
|
17
17
|
});
|
|
18
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* Pre-flight validation: Verify all ADO projects exist
|
|
21
|
+
*
|
|
22
|
+
* @throws Error if any projects are missing
|
|
23
|
+
*/
|
|
24
|
+
async validateProjects() {
|
|
25
|
+
const projectsToValidate = [];
|
|
26
|
+
if (this.config.projects) {
|
|
27
|
+
projectsToValidate.push(...this.config.projects);
|
|
28
|
+
} else if (this.config.project) {
|
|
29
|
+
projectsToValidate.push(this.config.project);
|
|
30
|
+
}
|
|
31
|
+
if (projectsToValidate.length === 0) {
|
|
32
|
+
throw new Error("No ADO projects configured for validation");
|
|
33
|
+
}
|
|
34
|
+
const missing = await validateAdoProjects(this.config, projectsToValidate);
|
|
35
|
+
if (missing.length > 0) {
|
|
36
|
+
throw new Error(
|
|
37
|
+
`\u274C Pre-flight check failed: Missing Azure DevOps projects:
|
|
38
|
+
` + missing.map((p) => ` - ${p} (${this.config.organization})`).join("\n") + `
|
|
39
|
+
|
|
40
|
+
Please verify project names and access permissions.`
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
19
44
|
/**
|
|
20
45
|
* Sync spec to ADO projects with intelligent mapping
|
|
21
46
|
*
|
|
@@ -24,6 +49,7 @@ class AdoMultiProjectSync {
|
|
|
24
49
|
*/
|
|
25
50
|
async syncSpec(specPath) {
|
|
26
51
|
const results = [];
|
|
52
|
+
await this.validateProjects();
|
|
27
53
|
const parsedSpec = await parseSpecFile(specPath);
|
|
28
54
|
const isAreaPathBased = !!this.config.project && !!this.config.areaPaths;
|
|
29
55
|
if (isAreaPathBased) {
|
|
@@ -56,9 +82,11 @@ class AdoMultiProjectSync {
|
|
|
56
82
|
const projectStories = /* @__PURE__ */ new Map();
|
|
57
83
|
for (const userStory of parsedSpec.userStories) {
|
|
58
84
|
if (this.config.intelligentMapping !== false) {
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
|
|
85
|
+
const mapperConfig = {
|
|
86
|
+
confidenceThreshold: this.config.confidenceThreshold
|
|
87
|
+
};
|
|
88
|
+
const primary = getPrimaryProject(userStory, void 0, mapperConfig);
|
|
89
|
+
if (primary) {
|
|
62
90
|
const projectName = this.findProjectForId(primary.projectId);
|
|
63
91
|
if (projectName) {
|
|
64
92
|
const existing = projectStories.get(projectName) || [];
|
|
@@ -66,7 +94,9 @@ class AdoMultiProjectSync {
|
|
|
66
94
|
projectStories.set(projectName, existing);
|
|
67
95
|
}
|
|
68
96
|
} else {
|
|
69
|
-
|
|
97
|
+
const mappings = mapUserStoryToProjects(userStory);
|
|
98
|
+
const threshold = this.config.confidenceThreshold ?? 0.3;
|
|
99
|
+
console.warn(`\u26A0\uFE0F Low confidence for ${userStory.id} (${(mappings[0]?.confidence || 0) * 100}% < ${threshold * 100}% threshold) - assigning to ${this.config.projects[0]}`);
|
|
70
100
|
const fallback = this.config.projects[0];
|
|
71
101
|
const existing = projectStories.get(fallback) || [];
|
|
72
102
|
existing.push({ story: userStory, confidence: mappings[0]?.confidence || 0 });
|
|
@@ -105,8 +135,11 @@ class AdoMultiProjectSync {
|
|
|
105
135
|
const epicResult = await this.createEpicInRootArea(parsedSpec);
|
|
106
136
|
results.push(epicResult);
|
|
107
137
|
const areaPathStories = /* @__PURE__ */ new Map();
|
|
138
|
+
const mapperConfig = {
|
|
139
|
+
confidenceThreshold: this.config.confidenceThreshold
|
|
140
|
+
};
|
|
108
141
|
for (const userStory of parsedSpec.userStories) {
|
|
109
|
-
const primaryProject = getPrimaryProject(userStory);
|
|
142
|
+
const primaryProject = getPrimaryProject(userStory, void 0, mapperConfig);
|
|
110
143
|
if (primaryProject) {
|
|
111
144
|
const areaPath = this.findAreaPathForProjectId(primaryProject.projectId);
|
|
112
145
|
if (areaPath) {
|
|
@@ -133,7 +166,7 @@ class AdoMultiProjectSync {
|
|
|
133
166
|
|
|
134
167
|
<strong>Status</strong>: ${parsedSpec.metadata.status}<br/>
|
|
135
168
|
<strong>Priority</strong>: ${parsedSpec.metadata.priority}<br/>
|
|
136
|
-
<strong>Estimated Effort</strong>: ${parsedSpec.metadata.estimatedEffort ||
|
|
169
|
+
<strong>Estimated Effort</strong>: ${parsedSpec.metadata.estimatedEffort || "TBD"}
|
|
137
170
|
|
|
138
171
|
<h3>Executive Summary</h3>
|
|
139
172
|
|
|
@@ -172,7 +205,7 @@ User stories will be added as child work items.
|
|
|
172
205
|
|
|
173
206
|
<strong>Status</strong>: ${parsedSpec.metadata.status}<br/>
|
|
174
207
|
<strong>Priority</strong>: ${parsedSpec.metadata.priority}<br/>
|
|
175
|
-
<strong>Estimated Effort</strong>: ${parsedSpec.metadata.estimatedEffort ||
|
|
208
|
+
<strong>Estimated Effort</strong>: ${parsedSpec.metadata.estimatedEffort || "TBD"}
|
|
176
209
|
|
|
177
210
|
<h3>Executive Summary</h3>
|
|
178
211
|
|
|
@@ -84,6 +84,37 @@ export class AdoMultiProjectSync {
|
|
|
84
84
|
});
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
+
/**
|
|
88
|
+
* Pre-flight validation: Verify all ADO projects exist
|
|
89
|
+
*
|
|
90
|
+
* @throws Error if any projects are missing
|
|
91
|
+
*/
|
|
92
|
+
async validateProjects(): Promise<void> {
|
|
93
|
+
const projectsToValidate: string[] = [];
|
|
94
|
+
|
|
95
|
+
// Collect projects to validate
|
|
96
|
+
if (this.config.projects) {
|
|
97
|
+
projectsToValidate.push(...this.config.projects);
|
|
98
|
+
} else if (this.config.project) {
|
|
99
|
+
projectsToValidate.push(this.config.project);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (projectsToValidate.length === 0) {
|
|
103
|
+
throw new Error('No ADO projects configured for validation');
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Validate projects exist
|
|
107
|
+
const missing = await validateAdoProjects(this.config, projectsToValidate);
|
|
108
|
+
|
|
109
|
+
if (missing.length > 0) {
|
|
110
|
+
throw new Error(
|
|
111
|
+
`❌ Pre-flight check failed: Missing Azure DevOps projects:\n` +
|
|
112
|
+
missing.map(p => ` - ${p} (${this.config.organization})`).join('\n') +
|
|
113
|
+
`\n\nPlease verify project names and access permissions.`
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
87
118
|
/**
|
|
88
119
|
* Sync spec to ADO projects with intelligent mapping
|
|
89
120
|
*
|
|
@@ -93,6 +124,9 @@ export class AdoMultiProjectSync {
|
|
|
93
124
|
async syncSpec(specPath: string): Promise<AdoSyncResult[]> {
|
|
94
125
|
const results: AdoSyncResult[] = [];
|
|
95
126
|
|
|
127
|
+
// Pre-flight validation: Verify all projects exist
|
|
128
|
+
await this.validateProjects();
|
|
129
|
+
|
|
96
130
|
// Parse spec
|
|
97
131
|
const parsedSpec = await parseSpecFile(specPath);
|
|
98
132
|
|
|
@@ -140,10 +174,12 @@ export class AdoMultiProjectSync {
|
|
|
140
174
|
for (const userStory of parsedSpec.userStories) {
|
|
141
175
|
if (this.config.intelligentMapping !== false) {
|
|
142
176
|
// Intelligent mapping (default)
|
|
143
|
-
const
|
|
177
|
+
const mapperConfig = {
|
|
178
|
+
confidenceThreshold: this.config.confidenceThreshold
|
|
179
|
+
};
|
|
180
|
+
const primary = getPrimaryProject(userStory, undefined, mapperConfig);
|
|
144
181
|
|
|
145
|
-
if (
|
|
146
|
-
const primary = mappings[0];
|
|
182
|
+
if (primary) {
|
|
147
183
|
const projectName = this.findProjectForId(primary.projectId);
|
|
148
184
|
|
|
149
185
|
if (projectName) {
|
|
@@ -153,7 +189,9 @@ export class AdoMultiProjectSync {
|
|
|
153
189
|
}
|
|
154
190
|
} else {
|
|
155
191
|
// No confident match - assign to first project or skip
|
|
156
|
-
|
|
192
|
+
const mappings = mapUserStoryToProjects(userStory);
|
|
193
|
+
const threshold = this.config.confidenceThreshold ?? 0.3;
|
|
194
|
+
console.warn(`⚠️ Low confidence for ${userStory.id} (${(mappings[0]?.confidence || 0) * 100}% < ${threshold * 100}% threshold) - assigning to ${this.config.projects![0]}`);
|
|
157
195
|
const fallback = this.config.projects![0];
|
|
158
196
|
const existing = projectStories.get(fallback) || [];
|
|
159
197
|
existing.push({ story: userStory, confidence: mappings[0]?.confidence || 0 });
|
|
@@ -203,8 +241,12 @@ export class AdoMultiProjectSync {
|
|
|
203
241
|
// Step 2: Classify user stories by area path
|
|
204
242
|
const areaPathStories = new Map<string, UserStory[]>();
|
|
205
243
|
|
|
244
|
+
const mapperConfig = {
|
|
245
|
+
confidenceThreshold: this.config.confidenceThreshold
|
|
246
|
+
};
|
|
247
|
+
|
|
206
248
|
for (const userStory of parsedSpec.userStories) {
|
|
207
|
-
const primaryProject = getPrimaryProject(userStory);
|
|
249
|
+
const primaryProject = getPrimaryProject(userStory, undefined, mapperConfig);
|
|
208
250
|
|
|
209
251
|
if (primaryProject) {
|
|
210
252
|
const areaPath = this.findAreaPathForProjectId(primaryProject.projectId);
|
|
@@ -238,7 +280,7 @@ export class AdoMultiProjectSync {
|
|
|
238
280
|
|
|
239
281
|
<strong>Status</strong>: ${parsedSpec.metadata.status}<br/>
|
|
240
282
|
<strong>Priority</strong>: ${parsedSpec.metadata.priority}<br/>
|
|
241
|
-
<strong>Estimated Effort</strong>: ${parsedSpec.metadata.estimatedEffort ||
|
|
283
|
+
<strong>Estimated Effort</strong>: ${parsedSpec.metadata.estimatedEffort || 'TBD'}
|
|
242
284
|
|
|
243
285
|
<h3>Executive Summary</h3>
|
|
244
286
|
|
|
@@ -281,7 +323,7 @@ User stories will be added as child work items.
|
|
|
281
323
|
|
|
282
324
|
<strong>Status</strong>: ${parsedSpec.metadata.status}<br/>
|
|
283
325
|
<strong>Priority</strong>: ${parsedSpec.metadata.priority}<br/>
|
|
284
|
-
<strong>Estimated Effort</strong>: ${parsedSpec.metadata.estimatedEffort ||
|
|
326
|
+
<strong>Estimated Effort</strong>: ${parsedSpec.metadata.estimatedEffort || 'TBD'}
|
|
285
327
|
|
|
286
328
|
<h3>Executive Summary</h3>
|
|
287
329
|
|
|
@@ -6,6 +6,35 @@ class GitHubMultiProjectSync {
|
|
|
6
6
|
this.config = config;
|
|
7
7
|
this.octokit = new Octokit({ auth: config.token });
|
|
8
8
|
}
|
|
9
|
+
/**
|
|
10
|
+
* Pre-flight validation: Verify all repos exist
|
|
11
|
+
*
|
|
12
|
+
* @throws Error if any repos are missing
|
|
13
|
+
*/
|
|
14
|
+
async validateRepos() {
|
|
15
|
+
const reposToValidate = [];
|
|
16
|
+
if (this.config.repos) {
|
|
17
|
+
reposToValidate.push(...this.config.repos);
|
|
18
|
+
}
|
|
19
|
+
if (this.config.masterRepo) {
|
|
20
|
+
reposToValidate.push(this.config.masterRepo);
|
|
21
|
+
}
|
|
22
|
+
if (this.config.nestedRepos) {
|
|
23
|
+
reposToValidate.push(...this.config.nestedRepos);
|
|
24
|
+
}
|
|
25
|
+
if (reposToValidate.length === 0) {
|
|
26
|
+
throw new Error("No repositories configured for validation");
|
|
27
|
+
}
|
|
28
|
+
const missing = await validateGitHubRepos(this.config, reposToValidate);
|
|
29
|
+
if (missing.length > 0) {
|
|
30
|
+
throw new Error(
|
|
31
|
+
`\u274C Pre-flight check failed: Missing GitHub repositories:
|
|
32
|
+
` + missing.map((r) => ` - ${this.config.owner}/${r}`).join("\n") + `
|
|
33
|
+
|
|
34
|
+
Please verify repository names and access permissions.`
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
9
38
|
/**
|
|
10
39
|
* Sync spec to appropriate GitHub repos based on project mapping
|
|
11
40
|
*
|
|
@@ -14,6 +43,7 @@ class GitHubMultiProjectSync {
|
|
|
14
43
|
*/
|
|
15
44
|
async syncSpec(specPath) {
|
|
16
45
|
const results = [];
|
|
46
|
+
await this.validateRepos();
|
|
17
47
|
const parsedSpec = await parseSpecFile(specPath);
|
|
18
48
|
const isMasterNested = !!this.config.masterRepo && !!this.config.nestedRepos;
|
|
19
49
|
if (isMasterNested) {
|
|
@@ -36,14 +66,18 @@ class GitHubMultiProjectSync {
|
|
|
36
66
|
async syncMultipleRepos(parsedSpec) {
|
|
37
67
|
const results = [];
|
|
38
68
|
const projectStories = /* @__PURE__ */ new Map();
|
|
69
|
+
const mapperConfig = {
|
|
70
|
+
confidenceThreshold: this.config.confidenceThreshold
|
|
71
|
+
};
|
|
39
72
|
for (const userStory of parsedSpec.userStories) {
|
|
40
|
-
const primaryProject = getPrimaryProject(userStory);
|
|
73
|
+
const primaryProject = getPrimaryProject(userStory, void 0, mapperConfig);
|
|
41
74
|
if (primaryProject) {
|
|
42
75
|
const existing = projectStories.get(primaryProject.projectId) || [];
|
|
43
76
|
existing.push(userStory);
|
|
44
77
|
projectStories.set(primaryProject.projectId, existing);
|
|
45
78
|
} else {
|
|
46
|
-
|
|
79
|
+
const threshold = this.config.confidenceThreshold ?? 0.3;
|
|
80
|
+
console.warn(`\u26A0\uFE0F No confident project match for ${userStory.id} (< ${threshold * 100}% threshold) - skipping`);
|
|
47
81
|
}
|
|
48
82
|
}
|
|
49
83
|
for (const [projectId, stories] of projectStories.entries()) {
|
|
@@ -83,8 +117,11 @@ class GitHubMultiProjectSync {
|
|
|
83
117
|
const epicResult = await this.createEpicInMasterRepo(parsedSpec);
|
|
84
118
|
results.push(epicResult);
|
|
85
119
|
const projectStories = /* @__PURE__ */ new Map();
|
|
120
|
+
const mapperConfig = {
|
|
121
|
+
confidenceThreshold: this.config.confidenceThreshold
|
|
122
|
+
};
|
|
86
123
|
for (const userStory of parsedSpec.userStories) {
|
|
87
|
-
const primaryProject = getPrimaryProject(userStory);
|
|
124
|
+
const primaryProject = getPrimaryProject(userStory, void 0, mapperConfig);
|
|
88
125
|
if (primaryProject) {
|
|
89
126
|
const existing = projectStories.get(primaryProject.projectId) || [];
|
|
90
127
|
existing.push(userStory);
|
|
@@ -116,7 +153,7 @@ class GitHubMultiProjectSync {
|
|
|
116
153
|
|
|
117
154
|
**Status**: ${parsedSpec.metadata.status}
|
|
118
155
|
**Priority**: ${parsedSpec.metadata.priority}
|
|
119
|
-
**Estimated Effort**: ${parsedSpec.metadata.estimatedEffort ||
|
|
156
|
+
**Estimated Effort**: ${parsedSpec.metadata.estimatedEffort || "TBD"}
|
|
120
157
|
|
|
121
158
|
## Executive Summary
|
|
122
159
|
|
|
@@ -334,7 +371,23 @@ function formatSyncResults(results) {
|
|
|
334
371
|
`);
|
|
335
372
|
return lines.join("\n");
|
|
336
373
|
}
|
|
374
|
+
async function validateGitHubRepos(config, repoNames) {
|
|
375
|
+
const missing = [];
|
|
376
|
+
const octokit = new Octokit({ auth: config.token });
|
|
377
|
+
for (const repo of repoNames) {
|
|
378
|
+
try {
|
|
379
|
+
await octokit.repos.get({
|
|
380
|
+
owner: config.owner,
|
|
381
|
+
repo
|
|
382
|
+
});
|
|
383
|
+
} catch (error) {
|
|
384
|
+
missing.push(repo);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
return missing;
|
|
388
|
+
}
|
|
337
389
|
export {
|
|
338
390
|
GitHubMultiProjectSync,
|
|
339
|
-
formatSyncResults
|
|
391
|
+
formatSyncResults,
|
|
392
|
+
validateGitHubRepos
|
|
340
393
|
};
|
|
@@ -27,6 +27,7 @@ export interface GitHubMultiProjectConfig {
|
|
|
27
27
|
masterRepoLevel?: 'epic'; // Master repo contains epics
|
|
28
28
|
nestedRepoLevel?: 'story-task'; // Nested repos contain stories/tasks
|
|
29
29
|
crossLinking?: boolean; // Enable epic → issue links
|
|
30
|
+
confidenceThreshold?: number; // Minimum confidence for project classification (default: 0.3)
|
|
30
31
|
}
|
|
31
32
|
|
|
32
33
|
export interface GitHubIssue {
|
|
@@ -58,6 +59,41 @@ export class GitHubMultiProjectSync {
|
|
|
58
59
|
this.octokit = new Octokit({ auth: config.token });
|
|
59
60
|
}
|
|
60
61
|
|
|
62
|
+
/**
|
|
63
|
+
* Pre-flight validation: Verify all repos exist
|
|
64
|
+
*
|
|
65
|
+
* @throws Error if any repos are missing
|
|
66
|
+
*/
|
|
67
|
+
async validateRepos(): Promise<void> {
|
|
68
|
+
const reposToValidate: string[] = [];
|
|
69
|
+
|
|
70
|
+
// Collect all repos to validate
|
|
71
|
+
if (this.config.repos) {
|
|
72
|
+
reposToValidate.push(...this.config.repos);
|
|
73
|
+
}
|
|
74
|
+
if (this.config.masterRepo) {
|
|
75
|
+
reposToValidate.push(this.config.masterRepo);
|
|
76
|
+
}
|
|
77
|
+
if (this.config.nestedRepos) {
|
|
78
|
+
reposToValidate.push(...this.config.nestedRepos);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (reposToValidate.length === 0) {
|
|
82
|
+
throw new Error('No repositories configured for validation');
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Validate repos exist
|
|
86
|
+
const missing = await validateGitHubRepos(this.config, reposToValidate);
|
|
87
|
+
|
|
88
|
+
if (missing.length > 0) {
|
|
89
|
+
throw new Error(
|
|
90
|
+
`❌ Pre-flight check failed: Missing GitHub repositories:\n` +
|
|
91
|
+
missing.map(r => ` - ${this.config.owner}/${r}`).join('\n') +
|
|
92
|
+
`\n\nPlease verify repository names and access permissions.`
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
61
97
|
/**
|
|
62
98
|
* Sync spec to appropriate GitHub repos based on project mapping
|
|
63
99
|
*
|
|
@@ -67,6 +103,9 @@ export class GitHubMultiProjectSync {
|
|
|
67
103
|
async syncSpec(specPath: string): Promise<SyncResult[]> {
|
|
68
104
|
const results: SyncResult[] = [];
|
|
69
105
|
|
|
106
|
+
// Pre-flight validation: Verify all repos exist
|
|
107
|
+
await this.validateRepos();
|
|
108
|
+
|
|
70
109
|
// Parse spec
|
|
71
110
|
const parsedSpec = await parseSpecFile(specPath);
|
|
72
111
|
|
|
@@ -100,8 +139,12 @@ export class GitHubMultiProjectSync {
|
|
|
100
139
|
// Classify user stories by project
|
|
101
140
|
const projectStories = new Map<string, UserStory[]>();
|
|
102
141
|
|
|
142
|
+
const mapperConfig = {
|
|
143
|
+
confidenceThreshold: this.config.confidenceThreshold
|
|
144
|
+
};
|
|
145
|
+
|
|
103
146
|
for (const userStory of parsedSpec.userStories) {
|
|
104
|
-
const primaryProject = getPrimaryProject(userStory);
|
|
147
|
+
const primaryProject = getPrimaryProject(userStory, undefined, mapperConfig);
|
|
105
148
|
|
|
106
149
|
if (primaryProject) {
|
|
107
150
|
const existing = projectStories.get(primaryProject.projectId) || [];
|
|
@@ -109,7 +152,8 @@ export class GitHubMultiProjectSync {
|
|
|
109
152
|
projectStories.set(primaryProject.projectId, existing);
|
|
110
153
|
} else {
|
|
111
154
|
// No confident match - skip or assign to default repo
|
|
112
|
-
|
|
155
|
+
const threshold = this.config.confidenceThreshold ?? 0.3;
|
|
156
|
+
console.warn(`⚠️ No confident project match for ${userStory.id} (< ${threshold * 100}% threshold) - skipping`);
|
|
113
157
|
}
|
|
114
158
|
}
|
|
115
159
|
|
|
@@ -162,8 +206,12 @@ export class GitHubMultiProjectSync {
|
|
|
162
206
|
// Step 2: Classify user stories by project
|
|
163
207
|
const projectStories = new Map<string, UserStory[]>();
|
|
164
208
|
|
|
209
|
+
const mapperConfig = {
|
|
210
|
+
confidenceThreshold: this.config.confidenceThreshold
|
|
211
|
+
};
|
|
212
|
+
|
|
165
213
|
for (const userStory of parsedSpec.userStories) {
|
|
166
|
-
const primaryProject = getPrimaryProject(userStory);
|
|
214
|
+
const primaryProject = getPrimaryProject(userStory, undefined, mapperConfig);
|
|
167
215
|
|
|
168
216
|
if (primaryProject) {
|
|
169
217
|
const existing = projectStories.get(primaryProject.projectId) || [];
|
|
@@ -205,7 +253,7 @@ export class GitHubMultiProjectSync {
|
|
|
205
253
|
|
|
206
254
|
**Status**: ${parsedSpec.metadata.status}
|
|
207
255
|
**Priority**: ${parsedSpec.metadata.priority}
|
|
208
|
-
**Estimated Effort**: ${parsedSpec.metadata.estimatedEffort ||
|
|
256
|
+
**Estimated Effort**: ${parsedSpec.metadata.estimatedEffort || 'TBD'}
|
|
209
257
|
|
|
210
258
|
## Executive Summary
|
|
211
259
|
|
|
@@ -459,3 +507,31 @@ export function formatSyncResults(results: SyncResult[]): string {
|
|
|
459
507
|
|
|
460
508
|
return lines.join('\n');
|
|
461
509
|
}
|
|
510
|
+
|
|
511
|
+
/**
|
|
512
|
+
* Validate GitHub repositories exist
|
|
513
|
+
*
|
|
514
|
+
* @param config GitHub configuration
|
|
515
|
+
* @param repoNames Array of repo names to validate
|
|
516
|
+
* @returns Validation results (missing repos)
|
|
517
|
+
*/
|
|
518
|
+
export async function validateGitHubRepos(
|
|
519
|
+
config: GitHubMultiProjectConfig,
|
|
520
|
+
repoNames: string[]
|
|
521
|
+
): Promise<string[]> {
|
|
522
|
+
const missing: string[] = [];
|
|
523
|
+
const octokit = new Octokit({ auth: config.token });
|
|
524
|
+
|
|
525
|
+
for (const repo of repoNames) {
|
|
526
|
+
try {
|
|
527
|
+
await octokit.repos.get({
|
|
528
|
+
owner: config.owner,
|
|
529
|
+
repo
|
|
530
|
+
});
|
|
531
|
+
} catch (error) {
|
|
532
|
+
missing.push(repo);
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
return missing;
|
|
537
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { JiraClient } from "../../../src/integrations/jira/jira-client.js";
|
|
2
2
|
import {
|
|
3
|
+
getPrimaryProject,
|
|
3
4
|
suggestJiraItemType,
|
|
4
5
|
mapUserStoryToProjects
|
|
5
6
|
} from "../../../src/utils/project-mapper.js";
|
|
@@ -13,6 +14,25 @@ class JiraMultiProjectSync {
|
|
|
13
14
|
apiToken: config.apiToken
|
|
14
15
|
});
|
|
15
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* Pre-flight validation: Verify all JIRA projects exist
|
|
19
|
+
*
|
|
20
|
+
* @throws Error if any projects are missing
|
|
21
|
+
*/
|
|
22
|
+
async validateProjects() {
|
|
23
|
+
if (!this.config.projects || this.config.projects.length === 0) {
|
|
24
|
+
throw new Error("No JIRA projects configured for validation");
|
|
25
|
+
}
|
|
26
|
+
const missing = await validateJiraProjects(this.client, this.config.projects);
|
|
27
|
+
if (missing.length > 0) {
|
|
28
|
+
throw new Error(
|
|
29
|
+
`\u274C Pre-flight check failed: Missing JIRA projects:
|
|
30
|
+
` + missing.map((p) => ` - ${p} (${this.config.domain})`).join("\n") + `
|
|
31
|
+
|
|
32
|
+
Please verify project keys and access permissions.`
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
16
36
|
/**
|
|
17
37
|
* Sync spec to JIRA projects with intelligent mapping
|
|
18
38
|
*
|
|
@@ -21,6 +41,7 @@ class JiraMultiProjectSync {
|
|
|
21
41
|
*/
|
|
22
42
|
async syncSpec(specPath) {
|
|
23
43
|
const results = [];
|
|
44
|
+
await this.validateProjects();
|
|
24
45
|
const parsedSpec = await parseSpecFile(specPath);
|
|
25
46
|
const epicsByProject = /* @__PURE__ */ new Map();
|
|
26
47
|
if (this.config.autoCreateEpics !== false) {
|
|
@@ -33,14 +54,18 @@ class JiraMultiProjectSync {
|
|
|
33
54
|
const projectStories = /* @__PURE__ */ new Map();
|
|
34
55
|
for (const userStory of parsedSpec.userStories) {
|
|
35
56
|
if (this.config.intelligentMapping !== false) {
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
57
|
+
const mapperConfig = {
|
|
58
|
+
confidenceThreshold: this.config.confidenceThreshold
|
|
59
|
+
};
|
|
60
|
+
const primary = getPrimaryProject(userStory, void 0, mapperConfig);
|
|
61
|
+
if (primary) {
|
|
39
62
|
const existing = projectStories.get(primary.projectId) || [];
|
|
40
63
|
existing.push({ story: userStory, confidence: primary.confidence });
|
|
41
64
|
projectStories.set(primary.projectId, existing);
|
|
42
65
|
} else {
|
|
43
|
-
|
|
66
|
+
const mappings = mapUserStoryToProjects(userStory);
|
|
67
|
+
const threshold = this.config.confidenceThreshold ?? 0.3;
|
|
68
|
+
console.warn(`\u26A0\uFE0F Low confidence for ${userStory.id} (${(mappings[0]?.confidence || 0) * 100}% < ${threshold * 100}% threshold) - assigning to ${this.config.projects[0]}`);
|
|
44
69
|
const fallback = this.config.projects[0];
|
|
45
70
|
const existing = projectStories.get(fallback) || [];
|
|
46
71
|
existing.push({ story: userStory, confidence: mappings[0]?.confidence || 0 });
|
|
@@ -78,7 +103,7 @@ class JiraMultiProjectSync {
|
|
|
78
103
|
|
|
79
104
|
*Status*: ${parsedSpec.metadata.status}
|
|
80
105
|
*Priority*: ${parsedSpec.metadata.priority}
|
|
81
|
-
*Estimated Effort*: ${parsedSpec.metadata.estimatedEffort ||
|
|
106
|
+
*Estimated Effort*: ${parsedSpec.metadata.estimatedEffort || "TBD"}
|
|
82
107
|
|
|
83
108
|
h3. Executive Summary
|
|
84
109
|
|