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.
Files changed (34) hide show
  1. package/README.md +58 -9
  2. package/bin/specweave.js +65 -0
  3. package/dist/cli/commands/migrate-to-profiles.d.ts.map +1 -1
  4. package/dist/cli/commands/migrate-to-profiles.js +0 -2
  5. package/dist/cli/commands/migrate-to-profiles.js.map +1 -1
  6. package/dist/core/sync/folder-mapper.d.ts.map +1 -1
  7. package/dist/core/sync/folder-mapper.js +70 -35
  8. package/dist/core/sync/folder-mapper.js.map +1 -1
  9. package/dist/core/sync/profile-validator.d.ts.map +1 -1
  10. package/dist/core/sync/profile-validator.js +35 -90
  11. package/dist/core/sync/profile-validator.js.map +1 -1
  12. package/dist/core/types/sync-profile.d.ts +101 -155
  13. package/dist/core/types/sync-profile.d.ts.map +1 -1
  14. package/dist/core/types/sync-profile.js +46 -22
  15. package/dist/core/types/sync-profile.js.map +1 -1
  16. package/dist/utils/env-multi-project-parser.d.ts.map +1 -1
  17. package/dist/utils/env-multi-project-parser.js +0 -2
  18. package/dist/utils/env-multi-project-parser.js.map +1 -1
  19. package/dist/utils/project-mapper.d.ts +19 -1
  20. package/dist/utils/project-mapper.d.ts.map +1 -1
  21. package/dist/utils/project-mapper.js +7 -4
  22. package/dist/utils/project-mapper.js.map +1 -1
  23. package/dist/utils/spec-splitter.d.ts +7 -0
  24. package/dist/utils/spec-splitter.d.ts.map +1 -1
  25. package/dist/utils/spec-splitter.js +20 -2
  26. package/dist/utils/spec-splitter.js.map +1 -1
  27. package/package.json +1 -1
  28. package/plugins/specweave-ado/lib/ado-multi-project-sync.js +40 -7
  29. package/plugins/specweave-ado/lib/ado-multi-project-sync.ts +49 -7
  30. package/plugins/specweave-github/hooks/hooks.json +0 -11
  31. package/plugins/specweave-github/lib/github-multi-project-sync.js +58 -5
  32. package/plugins/specweave-github/lib/github-multi-project-sync.ts +80 -4
  33. package/plugins/specweave-jira/lib/jira-multi-project-sync.js +30 -5
  34. 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,CA+BzE;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"}
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 metadata = parseFrontmatter(frontmatterMatch[1]);
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 || parsedSpec.metadata.spec_id || '0001').replace(/^SPEC-/, '');
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.14.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 mappings = mapUserStoryToProjects(userStory);
60
- if (mappings.length > 0 && mappings[0].confidence >= 0.3) {
61
- const primary = mappings[0];
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
- console.warn(`\u26A0\uFE0F Low confidence for ${userStory.id} (${(mappings[0]?.confidence || 0) * 100}%) - assigning to ${this.config.projects[0]}`);
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 || parsedSpec.metadata.estimated_effort}
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 || parsedSpec.metadata.estimated_effort}
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 mappings = mapUserStoryToProjects(userStory);
177
+ const mapperConfig = {
178
+ confidenceThreshold: this.config.confidenceThreshold
179
+ };
180
+ const primary = getPrimaryProject(userStory, undefined, mapperConfig);
144
181
 
145
- if (mappings.length > 0 && mappings[0].confidence >= 0.3) {
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
- console.warn(`⚠️ Low confidence for ${userStory.id} (${(mappings[0]?.confidence || 0) * 100}%) - assigning to ${this.config.projects![0]}`);
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 || parsedSpec.metadata.estimated_effort}
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 || parsedSpec.metadata.estimated_effort}
326
+ <strong>Estimated Effort</strong>: ${parsedSpec.metadata.estimatedEffort || 'TBD'}
285
327
 
286
328
  <h3>Executive Summary</h3>
287
329
 
@@ -10,17 +10,6 @@
10
10
  }
11
11
  ]
12
12
  }
13
- ],
14
- "PostSlashCommand": [
15
- {
16
- "matcher": "specweave:specweave-done",
17
- "hooks": [
18
- {
19
- "type": "command",
20
- "command": "${CLAUDE_PLUGIN_ROOT}/hooks/post-increment-done.sh"
21
- }
22
- ]
23
- }
24
13
  ]
25
14
  }
26
15
  }
@@ -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
- console.warn(`\u26A0\uFE0F No confident project match for ${userStory.id} - skipping`);
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 || parsedSpec.metadata.estimated_effort}
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
- console.warn(`⚠️ No confident project match for ${userStory.id} - skipping`);
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 || parsedSpec.metadata.estimated_effort}
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 mappings = mapUserStoryToProjects(userStory);
37
- if (mappings.length > 0 && mappings[0].confidence >= 0.3) {
38
- const primary = mappings[0];
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
- console.warn(`\u26A0\uFE0F Low confidence for ${userStory.id} (${(mappings[0]?.confidence || 0) * 100}%) - assigning to ${this.config.projects[0]}`);
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 || parsedSpec.metadata.estimated_effort}
106
+ *Estimated Effort*: ${parsedSpec.metadata.estimatedEffort || "TBD"}
82
107
 
83
108
  h3. Executive Summary
84
109