specweave 1.0.235 → 1.0.239

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 (196) hide show
  1. package/README.md +89 -193
  2. package/dist/plugins/specweave-github/lib/github-ac-comment-poster.d.ts +37 -0
  3. package/dist/plugins/specweave-github/lib/github-ac-comment-poster.d.ts.map +1 -0
  4. package/dist/plugins/specweave-github/lib/github-ac-comment-poster.js +176 -0
  5. package/dist/plugins/specweave-github/lib/github-ac-comment-poster.js.map +1 -0
  6. package/dist/plugins/specweave-github/lib/github-batch-sync.d.ts +36 -0
  7. package/dist/plugins/specweave-github/lib/github-batch-sync.d.ts.map +1 -0
  8. package/dist/plugins/specweave-github/lib/github-batch-sync.js +115 -0
  9. package/dist/plugins/specweave-github/lib/github-batch-sync.js.map +1 -0
  10. package/dist/plugins/specweave-github/lib/github-board-resolver-v2.d.ts +37 -0
  11. package/dist/plugins/specweave-github/lib/github-board-resolver-v2.d.ts.map +1 -0
  12. package/dist/plugins/specweave-github/lib/github-board-resolver-v2.js +56 -0
  13. package/dist/plugins/specweave-github/lib/github-board-resolver-v2.js.map +1 -0
  14. package/dist/plugins/specweave-github/lib/github-conflict-resolver.d.ts +68 -0
  15. package/dist/plugins/specweave-github/lib/github-conflict-resolver.d.ts.map +1 -0
  16. package/dist/plugins/specweave-github/lib/github-conflict-resolver.js +102 -0
  17. package/dist/plugins/specweave-github/lib/github-conflict-resolver.js.map +1 -0
  18. package/dist/plugins/specweave-github/lib/github-cross-repo-sync.d.ts +64 -0
  19. package/dist/plugins/specweave-github/lib/github-cross-repo-sync.d.ts.map +1 -0
  20. package/dist/plugins/specweave-github/lib/github-cross-repo-sync.js +162 -0
  21. package/dist/plugins/specweave-github/lib/github-cross-repo-sync.js.map +1 -0
  22. package/dist/plugins/specweave-github/lib/github-field-sync.d.ts +50 -0
  23. package/dist/plugins/specweave-github/lib/github-field-sync.d.ts.map +1 -0
  24. package/dist/plugins/specweave-github/lib/github-field-sync.js +107 -0
  25. package/dist/plugins/specweave-github/lib/github-field-sync.js.map +1 -0
  26. package/dist/plugins/specweave-github/lib/github-graphql-client.d.ts +53 -0
  27. package/dist/plugins/specweave-github/lib/github-graphql-client.d.ts.map +1 -0
  28. package/dist/plugins/specweave-github/lib/github-graphql-client.js +138 -0
  29. package/dist/plugins/specweave-github/lib/github-graphql-client.js.map +1 -0
  30. package/dist/plugins/specweave-github/lib/github-issue-body-generator.d.ts +40 -0
  31. package/dist/plugins/specweave-github/lib/github-issue-body-generator.d.ts.map +1 -0
  32. package/dist/plugins/specweave-github/lib/github-issue-body-generator.js +50 -0
  33. package/dist/plugins/specweave-github/lib/github-issue-body-generator.js.map +1 -0
  34. package/dist/plugins/specweave-github/lib/github-issue-body-parser.d.ts +30 -0
  35. package/dist/plugins/specweave-github/lib/github-issue-body-parser.d.ts.map +1 -0
  36. package/dist/plugins/specweave-github/lib/github-issue-body-parser.js +75 -0
  37. package/dist/plugins/specweave-github/lib/github-issue-body-parser.js.map +1 -0
  38. package/dist/plugins/specweave-github/lib/github-pull-sync.d.ts +94 -0
  39. package/dist/plugins/specweave-github/lib/github-pull-sync.d.ts.map +1 -0
  40. package/dist/plugins/specweave-github/lib/github-pull-sync.js +232 -0
  41. package/dist/plugins/specweave-github/lib/github-pull-sync.js.map +1 -0
  42. package/dist/plugins/specweave-github/lib/github-push-sync.d.ts +50 -0
  43. package/dist/plugins/specweave-github/lib/github-push-sync.d.ts.map +1 -0
  44. package/dist/plugins/specweave-github/lib/github-push-sync.js +114 -0
  45. package/dist/plugins/specweave-github/lib/github-push-sync.js.map +1 -0
  46. package/dist/plugins/specweave-github/lib/github-rate-limiter.d.ts +53 -0
  47. package/dist/plugins/specweave-github/lib/github-rate-limiter.d.ts.map +1 -0
  48. package/dist/plugins/specweave-github/lib/github-rate-limiter.js +109 -0
  49. package/dist/plugins/specweave-github/lib/github-rate-limiter.js.map +1 -0
  50. package/dist/plugins/specweave-github/lib/github-spec-frontmatter-updater.d.ts +21 -0
  51. package/dist/plugins/specweave-github/lib/github-spec-frontmatter-updater.d.ts.map +1 -0
  52. package/dist/plugins/specweave-github/lib/github-spec-frontmatter-updater.js +161 -0
  53. package/dist/plugins/specweave-github/lib/github-spec-frontmatter-updater.js.map +1 -0
  54. package/dist/plugins/specweave-github/lib/github-sync-orchestrator.d.ts +46 -0
  55. package/dist/plugins/specweave-github/lib/github-sync-orchestrator.d.ts.map +1 -0
  56. package/dist/plugins/specweave-github/lib/github-sync-orchestrator.js +99 -0
  57. package/dist/plugins/specweave-github/lib/github-sync-orchestrator.js.map +1 -0
  58. package/dist/plugins/specweave-github/lib/github-us-auto-closer.d.ts +43 -0
  59. package/dist/plugins/specweave-github/lib/github-us-auto-closer.d.ts.map +1 -0
  60. package/dist/plugins/specweave-github/lib/github-us-auto-closer.js +153 -0
  61. package/dist/plugins/specweave-github/lib/github-us-auto-closer.js.map +1 -0
  62. package/dist/plugins/specweave-github/lib/index.d.ts +1 -4
  63. package/dist/plugins/specweave-github/lib/index.d.ts.map +1 -1
  64. package/dist/plugins/specweave-github/lib/index.js +1 -4
  65. package/dist/plugins/specweave-github/lib/index.js.map +1 -1
  66. package/dist/plugins/specweave-testing/lib/playwright-ci-defaults.d.ts +7 -0
  67. package/dist/plugins/specweave-testing/lib/playwright-ci-defaults.d.ts.map +1 -0
  68. package/dist/plugins/specweave-testing/lib/playwright-ci-defaults.js +15 -0
  69. package/dist/plugins/specweave-testing/lib/playwright-ci-defaults.js.map +1 -0
  70. package/dist/plugins/specweave-testing/lib/playwright-cli-detector.d.ts +10 -0
  71. package/dist/plugins/specweave-testing/lib/playwright-cli-detector.d.ts.map +1 -0
  72. package/dist/plugins/specweave-testing/lib/playwright-cli-detector.js +36 -0
  73. package/dist/plugins/specweave-testing/lib/playwright-cli-detector.js.map +1 -0
  74. package/dist/plugins/specweave-testing/lib/playwright-cli-runner.d.ts +25 -0
  75. package/dist/plugins/specweave-testing/lib/playwright-cli-runner.d.ts.map +1 -0
  76. package/dist/plugins/specweave-testing/lib/playwright-cli-runner.js +57 -0
  77. package/dist/plugins/specweave-testing/lib/playwright-cli-runner.js.map +1 -0
  78. package/dist/plugins/specweave-testing/lib/playwright-routing.d.ts +7 -0
  79. package/dist/plugins/specweave-testing/lib/playwright-routing.d.ts.map +1 -0
  80. package/dist/plugins/specweave-testing/lib/playwright-routing.js +17 -0
  81. package/dist/plugins/specweave-testing/lib/playwright-routing.js.map +1 -0
  82. package/dist/src/cli/commands/auto.d.ts.map +1 -1
  83. package/dist/src/cli/commands/auto.js +1 -2
  84. package/dist/src/cli/commands/auto.js.map +1 -1
  85. package/dist/src/cli/commands/cancel-auto.js +1 -2
  86. package/dist/src/cli/commands/cancel-auto.js.map +1 -1
  87. package/dist/src/cli/commands/living-docs.js +2 -2
  88. package/dist/src/cli/commands/living-docs.js.map +1 -1
  89. package/dist/src/cli/commands/update.d.ts.map +1 -1
  90. package/dist/src/cli/commands/update.js +1 -2
  91. package/dist/src/cli/commands/update.js.map +1 -1
  92. package/dist/src/core/config/types.d.ts +8 -0
  93. package/dist/src/core/config/types.d.ts.map +1 -1
  94. package/dist/src/core/config/types.js +3 -0
  95. package/dist/src/core/config/types.js.map +1 -1
  96. package/dist/src/core/types/sync-profile.d.ts +72 -0
  97. package/dist/src/core/types/sync-profile.d.ts.map +1 -1
  98. package/dist/src/core/types/sync-profile.js +6 -0
  99. package/dist/src/core/types/sync-profile.js.map +1 -1
  100. package/package.json +2 -2
  101. package/plugins/specweave/hooks/hooks.json +2 -2
  102. package/plugins/specweave/hooks/startup-health-check.sh +1 -1
  103. package/plugins/specweave/hooks/stop-auto-v5.sh +166 -0
  104. package/plugins/specweave/hooks/user-prompt-submit.sh +10 -0
  105. package/plugins/specweave/hooks/v2/dispatchers/post-tool-use.sh +21 -1
  106. package/plugins/specweave/hooks/v2/dispatchers/session-start.sh +1 -1
  107. package/plugins/specweave/skills/auto/SKILL.md +71 -251
  108. package/plugins/specweave/skills/team-build/SKILL.md +370 -0
  109. package/plugins/specweave/skills/team-merge/SKILL.md +123 -0
  110. package/plugins/specweave/skills/team-orchestrate/SKILL.md +800 -0
  111. package/plugins/specweave/skills/team-status/SKILL.md +89 -0
  112. package/plugins/specweave-github/MULTI-PROJECT-SYNC-ARCHITECTURE.md +94 -8
  113. package/plugins/specweave-github/commands/sync.md +17 -3
  114. package/plugins/specweave-github/hooks/github-ac-sync-handler.sh +255 -0
  115. package/plugins/specweave-github/hooks/github-auto-create-handler.sh +455 -0
  116. package/plugins/specweave-github/lib/github-ac-comment-poster.js +150 -0
  117. package/plugins/specweave-github/lib/github-ac-comment-poster.ts +245 -0
  118. package/plugins/specweave-github/lib/github-batch-sync.js +93 -0
  119. package/plugins/specweave-github/lib/github-batch-sync.ts +152 -0
  120. package/plugins/specweave-github/lib/github-board-resolver-v2.js +47 -0
  121. package/plugins/specweave-github/lib/github-board-resolver-v2.ts +73 -0
  122. package/plugins/specweave-github/lib/github-conflict-resolver.js +90 -0
  123. package/plugins/specweave-github/lib/github-conflict-resolver.ts +154 -0
  124. package/plugins/specweave-github/lib/github-cross-repo-sync.js +168 -0
  125. package/plugins/specweave-github/lib/github-cross-repo-sync.ts +252 -0
  126. package/plugins/specweave-github/lib/github-field-sync.js +116 -0
  127. package/plugins/specweave-github/lib/github-field-sync.ts +165 -0
  128. package/plugins/specweave-github/lib/github-graphql-client.js +129 -0
  129. package/plugins/specweave-github/lib/github-graphql-client.ts +181 -0
  130. package/plugins/specweave-github/lib/github-issue-body-generator.js +30 -0
  131. package/plugins/specweave-github/lib/github-issue-body-generator.ts +76 -0
  132. package/plugins/specweave-github/lib/github-issue-body-parser.js +55 -0
  133. package/plugins/specweave-github/lib/github-issue-body-parser.ts +92 -0
  134. package/plugins/specweave-github/lib/github-pull-sync.js +185 -0
  135. package/plugins/specweave-github/lib/github-pull-sync.ts +343 -0
  136. package/plugins/specweave-github/lib/github-push-sync.js +119 -0
  137. package/plugins/specweave-github/lib/github-push-sync.ts +174 -0
  138. package/plugins/specweave-github/lib/github-rate-limiter.js +96 -0
  139. package/plugins/specweave-github/lib/github-rate-limiter.ts +143 -0
  140. package/plugins/specweave-github/lib/github-spec-frontmatter-updater.js +117 -0
  141. package/plugins/specweave-github/lib/github-spec-frontmatter-updater.ts +180 -0
  142. package/plugins/specweave-github/lib/github-sync-orchestrator.js +84 -0
  143. package/plugins/specweave-github/lib/github-sync-orchestrator.ts +156 -0
  144. package/plugins/specweave-github/lib/github-us-auto-closer.js +134 -0
  145. package/plugins/specweave-github/lib/github-us-auto-closer.ts +226 -0
  146. package/plugins/specweave-github/lib/index.js +1 -7
  147. package/plugins/specweave-github/lib/index.ts +1 -4
  148. package/plugins/specweave-github/skills/github-sync/SKILL.md +76 -4
  149. package/plugins/specweave-testing/commands/e2e-setup.md +18 -0
  150. package/plugins/specweave-testing/commands/ui-automate.md +2 -0
  151. package/plugins/specweave-testing/commands/ui-inspect.md +8 -0
  152. package/plugins/specweave-testing/lib/playwright-ci-defaults.d.ts +6 -0
  153. package/plugins/specweave-testing/lib/playwright-ci-defaults.js +14 -0
  154. package/plugins/specweave-testing/lib/playwright-ci-defaults.ts +24 -0
  155. package/plugins/specweave-testing/lib/playwright-cli-detector.js +33 -0
  156. package/plugins/specweave-testing/lib/playwright-cli-detector.ts +48 -0
  157. package/plugins/specweave-testing/lib/playwright-cli-runner.js +58 -0
  158. package/plugins/specweave-testing/lib/playwright-cli-runner.ts +80 -0
  159. package/plugins/specweave-testing/lib/playwright-routing.js +16 -0
  160. package/plugins/specweave-testing/lib/playwright-routing.ts +38 -0
  161. package/plugins/specweave-testing/skills/e2e-testing/SKILL.md +38 -0
  162. package/src/templates/CLAUDE.md.template +7 -0
  163. package/src/templates/config.json.template +9 -1
  164. package/dist/plugins/specweave-github/lib/subtask-sync.d.ts +0 -51
  165. package/dist/plugins/specweave-github/lib/subtask-sync.d.ts.map +0 -1
  166. package/dist/plugins/specweave-github/lib/subtask-sync.js +0 -147
  167. package/dist/plugins/specweave-github/lib/subtask-sync.js.map +0 -1
  168. package/dist/plugins/specweave-github/lib/task-parser.d.ts +0 -37
  169. package/dist/plugins/specweave-github/lib/task-parser.d.ts.map +0 -1
  170. package/dist/plugins/specweave-github/lib/task-parser.js +0 -211
  171. package/dist/plugins/specweave-github/lib/task-parser.js.map +0 -1
  172. package/dist/plugins/specweave-github/lib/task-sync.d.ts +0 -56
  173. package/dist/plugins/specweave-github/lib/task-sync.d.ts.map +0 -1
  174. package/dist/plugins/specweave-github/lib/task-sync.js +0 -375
  175. package/dist/plugins/specweave-github/lib/task-sync.js.map +0 -1
  176. package/plugins/specweave/hooks/validate-completion-conditions.sh +0 -474
  177. package/plugins/specweave-github/lib/subtask-sync.d.ts +0 -51
  178. package/plugins/specweave-github/lib/subtask-sync.d.ts.map +0 -1
  179. package/plugins/specweave-github/lib/subtask-sync.js +0 -154
  180. package/plugins/specweave-github/lib/subtask-sync.js.map +0 -1
  181. package/plugins/specweave-github/lib/subtask-sync.ts +0 -225
  182. package/plugins/specweave-github/lib/task-parser.d.js +0 -0
  183. package/plugins/specweave-github/lib/task-parser.d.ts +0 -37
  184. package/plugins/specweave-github/lib/task-parser.d.ts.map +0 -1
  185. package/plugins/specweave-github/lib/task-parser.js +0 -195
  186. package/plugins/specweave-github/lib/task-parser.js.map +0 -1
  187. package/plugins/specweave-github/lib/task-parser.ts +0 -246
  188. package/plugins/specweave-github/lib/task-sync.d.js +0 -0
  189. package/plugins/specweave-github/lib/task-sync.d.ts +0 -51
  190. package/plugins/specweave-github/lib/task-sync.d.ts.map +0 -1
  191. package/plugins/specweave-github/lib/task-sync.js +0 -415
  192. package/plugins/specweave-github/lib/task-sync.js.map +0 -1
  193. package/plugins/specweave-github/lib/task-sync.ts +0 -451
  194. package/plugins/specweave-github/skills/github-issue-tracker/SKILL.md +0 -496
  195. /package/plugins/specweave/hooks/{stop-auto.sh → _archive/stop-auto-v4-legacy.sh} +0 -0
  196. /package/plugins/{specweave-github/lib/subtask-sync.d.js → specweave-testing/lib/playwright-ci-defaults.d.js} +0 -0
@@ -0,0 +1,115 @@
1
+ /**
2
+ * GitHub Batch Sync — Sync all specs in workspace
3
+ *
4
+ * Discovers all spec files and syncs them sequentially
5
+ * using the GitHubSyncOrchestrator.
6
+ *
7
+ * @module github-batch-sync
8
+ */
9
+ import { glob } from 'glob';
10
+ import { readFile } from 'fs/promises';
11
+ import { join } from 'path';
12
+ import { GitHubSyncOrchestrator } from './github-sync-orchestrator.js';
13
+ /**
14
+ * Discover all specs and sync them sequentially.
15
+ */
16
+ export async function batchSyncAllSpecs(config) {
17
+ const specsDir = join(config.workspaceRoot, '.specweave/docs/internal/specs');
18
+ // Discover specs
19
+ const specFiles = await glob('**/spec-*.md', { cwd: specsDir });
20
+ const result = {
21
+ specsProcessed: 0,
22
+ specsFailed: 0,
23
+ totalIssuesCreated: 0,
24
+ totalIssuesUpdated: 0,
25
+ errors: [],
26
+ summary: '',
27
+ };
28
+ if (specFiles.length === 0) {
29
+ result.summary = 'No specs found';
30
+ return result;
31
+ }
32
+ // Create orchestrator
33
+ const orchestrator = new GitHubSyncOrchestrator({
34
+ owner: config.owner,
35
+ repo: config.repo,
36
+ token: config.token,
37
+ dryRun: config.dryRun,
38
+ projectV2Enabled: config.projectV2Enabled,
39
+ projectV2Number: config.projectV2Number,
40
+ projectV2Id: config.projectV2Id,
41
+ statusFieldMapping: config.statusFieldMapping,
42
+ priorityFieldMapping: config.priorityFieldMapping,
43
+ });
44
+ // Sync each spec sequentially
45
+ for (const specFile of specFiles) {
46
+ const specPath = join(specsDir, specFile);
47
+ result.specsProcessed++;
48
+ try {
49
+ const content = await readFile(specPath, 'utf-8');
50
+ const userStories = parseUserStoriesFromSpec(content);
51
+ const syncResult = await orchestrator.syncSpec(specPath, userStories);
52
+ result.totalIssuesCreated += syncResult.pushResult.created.length;
53
+ result.totalIssuesUpdated += syncResult.pushResult.updated.length;
54
+ }
55
+ catch (err) {
56
+ result.specsFailed++;
57
+ result.errors.push({
58
+ specPath,
59
+ error: err instanceof Error ? err.message : String(err),
60
+ });
61
+ }
62
+ }
63
+ const synced = result.specsProcessed - result.specsFailed;
64
+ result.summary = `Synced ${synced}/${result.specsProcessed} specs, ${result.totalIssuesCreated} issues created, ${result.totalIssuesUpdated} updated`;
65
+ return result;
66
+ }
67
+ // US header: ### US-001: Title
68
+ const US_HEADER_RE = /^###?\s+(US-\d{3,}E?):\s*(.+)$/;
69
+ // AC checkbox: - [x] **AC-US1-01**: Description
70
+ const AC_CHECKBOX_RE = /^-\s+\[([ xX])\]\s+\*\*(?<acId>AC-US\d+E?-\d{2})\*\*:\s*(?<desc>.+)$/;
71
+ // Priority: **Priority**: P1
72
+ const PRIORITY_RE = /\*\*Priority\*\*:\s*(P[0-3])/;
73
+ /**
74
+ * Parse user stories from spec.md content.
75
+ */
76
+ function parseUserStoriesFromSpec(content) {
77
+ const lines = content.split('\n');
78
+ const userStories = [];
79
+ let current = null;
80
+ for (const line of lines) {
81
+ const usMatch = line.match(US_HEADER_RE);
82
+ if (usMatch) {
83
+ if (current)
84
+ userStories.push(current);
85
+ current = {
86
+ id: usMatch[1],
87
+ title: usMatch[2],
88
+ description: '',
89
+ priority: 'P3',
90
+ status: 'planned',
91
+ acceptanceCriteria: [],
92
+ };
93
+ continue;
94
+ }
95
+ if (!current)
96
+ continue;
97
+ const acMatch = line.match(AC_CHECKBOX_RE);
98
+ if (acMatch?.groups) {
99
+ current.acceptanceCriteria.push({
100
+ id: acMatch.groups.acId,
101
+ description: acMatch.groups.desc.trim(),
102
+ completed: acMatch[1] !== ' ',
103
+ });
104
+ continue;
105
+ }
106
+ const prioMatch = line.match(PRIORITY_RE);
107
+ if (prioMatch) {
108
+ current.priority = prioMatch[1];
109
+ }
110
+ }
111
+ if (current)
112
+ userStories.push(current);
113
+ return userStories;
114
+ }
115
+ //# sourceMappingURL=github-batch-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-batch-sync.js","sourceRoot":"","sources":["../../../../plugins/specweave-github/lib/github-batch-sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * GitHub Board Resolver V2 — Projects V2 Integration
3
+ *
4
+ * Finds or creates GitHub Projects V2 boards and adds issues to them.
5
+ * Replaces the deprecated V1 Classic Projects board resolver.
6
+ *
7
+ * @module github-board-resolver-v2
8
+ */
9
+ import { GitHubGraphQLClient } from './github-graphql-client.js';
10
+ export interface BoardResolverConfig {
11
+ owner: string;
12
+ projectV2Number?: number;
13
+ projectV2Id?: string;
14
+ }
15
+ export declare class GitHubBoardResolverV2 {
16
+ private client;
17
+ private config;
18
+ constructor(client: GitHubGraphQLClient, config: BoardResolverConfig);
19
+ /**
20
+ * Find an existing project or create a new one.
21
+ *
22
+ * Priority:
23
+ * 1. If projectV2Id is configured, use it directly (skip lookup)
24
+ * 2. If projectV2Number is configured, return with that number
25
+ * 3. Otherwise, create a new project
26
+ */
27
+ findOrCreateProject(title: string): Promise<{
28
+ id: string;
29
+ number: number;
30
+ }>;
31
+ /**
32
+ * Add issues (by node ID) to a Projects V2 board.
33
+ * Returns the project item IDs for each added issue.
34
+ */
35
+ addIssuesToProject(projectId: string, issueNodeIds: string[]): Promise<string[]>;
36
+ }
37
+ //# sourceMappingURL=github-board-resolver-v2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-board-resolver-v2.d.ts","sourceRoot":"","sources":["../../../../plugins/specweave-github/lib/github-board-resolver-v2.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,MAAM,CAAsB;gBAExB,MAAM,EAAE,mBAAmB,EAAE,MAAM,EAAE,mBAAmB;IAKpE;;;;;;;OAOG;IACG,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAwBjF;;;OAGG;IACG,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAUvF"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * GitHub Board Resolver V2 — Projects V2 Integration
3
+ *
4
+ * Finds or creates GitHub Projects V2 boards and adds issues to them.
5
+ * Replaces the deprecated V1 Classic Projects board resolver.
6
+ *
7
+ * @module github-board-resolver-v2
8
+ */
9
+ export class GitHubBoardResolverV2 {
10
+ constructor(client, config) {
11
+ this.client = client;
12
+ this.config = config;
13
+ }
14
+ /**
15
+ * Find an existing project or create a new one.
16
+ *
17
+ * Priority:
18
+ * 1. If projectV2Id is configured, use it directly (skip lookup)
19
+ * 2. If projectV2Number is configured, return with that number
20
+ * 3. Otherwise, create a new project
21
+ */
22
+ async findOrCreateProject(title) {
23
+ // If we have a direct project ID, use it
24
+ if (this.config.projectV2Id) {
25
+ return {
26
+ id: this.config.projectV2Id,
27
+ number: this.config.projectV2Number || 0,
28
+ };
29
+ }
30
+ // If we have a project number, look it up by querying the owner
31
+ if (this.config.projectV2Number) {
32
+ const ownerId = await this.client.getOwnerNodeId(this.config.owner);
33
+ // Return the project reference — the number is known, ID will be resolved on first use
34
+ return {
35
+ id: ownerId, // Will be resolved to actual project ID during operations
36
+ number: this.config.projectV2Number,
37
+ };
38
+ }
39
+ // No project configured — create a new one
40
+ const ownerId = await this.client.getOwnerNodeId(this.config.owner);
41
+ return this.client.createProjectV2(ownerId, title);
42
+ }
43
+ /**
44
+ * Add issues (by node ID) to a Projects V2 board.
45
+ * Returns the project item IDs for each added issue.
46
+ */
47
+ async addIssuesToProject(projectId, issueNodeIds) {
48
+ const itemIds = [];
49
+ for (const nodeId of issueNodeIds) {
50
+ const itemId = await this.client.addProjectV2Item(projectId, nodeId);
51
+ itemIds.push(itemId);
52
+ }
53
+ return itemIds;
54
+ }
55
+ }
56
+ //# sourceMappingURL=github-board-resolver-v2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-board-resolver-v2.js","sourceRoot":"","sources":["../../../../plugins/specweave-github/lib/github-board-resolver-v2.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH,MAAM,OAAO,qBAAqB;IAIhC,YAAY,MAA2B,EAAE,MAA2B;QAClE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,mBAAmB,CAAC,KAAa;QACrC,yCAAyC;QACzC,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAC5B,OAAO;gBACL,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;gBAC3B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,CAAC;aACzC,CAAC;QACJ,CAAC;QAED,gEAAgE;QAChE,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;YAChC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACpE,uFAAuF;YACvF,OAAO;gBACL,EAAE,EAAE,OAAO,EAAE,0DAA0D;gBACvE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe;aACpC,CAAC;QACJ,CAAC;QAED,2CAA2C;QAC3C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACrD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,kBAAkB,CAAC,SAAiB,EAAE,YAAsB;QAChE,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YACrE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * GitHub Conflict Resolver
3
+ *
4
+ * Field-level conflict detection and resolution between spec state
5
+ * and GitHub issue state. Supports title, status, and AC fields.
6
+ *
7
+ * @module github-conflict-resolver
8
+ */
9
+ export type ConflictResolution = 'github-wins' | 'spec-wins' | 'prompt';
10
+ export interface ConflictField {
11
+ field: string;
12
+ specValue: string;
13
+ githubValue: string;
14
+ defaultResolution: ConflictResolution;
15
+ }
16
+ export interface ResolvedConflict {
17
+ field: string;
18
+ specValue: string;
19
+ githubValue: string;
20
+ resolution: ConflictResolution;
21
+ resolvedValue: string;
22
+ resolvedAt: string;
23
+ }
24
+ export interface ConflictResolverConfig {
25
+ defaultStatusResolution?: ConflictResolution;
26
+ defaultContentResolution?: ConflictResolution;
27
+ defaultACResolution?: ConflictResolution;
28
+ }
29
+ interface SpecState {
30
+ title: string;
31
+ status: string;
32
+ acceptanceCriteria: Array<{
33
+ id: string;
34
+ completed: boolean;
35
+ }>;
36
+ }
37
+ interface GitHubState {
38
+ title: string;
39
+ state: 'open' | 'closed';
40
+ acceptanceCriteria: Array<{
41
+ id: string;
42
+ completed: boolean;
43
+ }>;
44
+ }
45
+ export declare class GitHubConflictResolver {
46
+ private statusResolution;
47
+ private contentResolution;
48
+ private acResolution;
49
+ constructor(config?: ConflictResolverConfig);
50
+ /**
51
+ * Detect conflicts between spec and GitHub states.
52
+ */
53
+ detectConflicts(specState: SpecState, githubState: GitHubState): ConflictField[];
54
+ /**
55
+ * Resolve all conflicts using their default resolution strategy.
56
+ */
57
+ resolveConflicts(conflicts: ConflictField[]): ResolvedConflict[];
58
+ /**
59
+ * Resolve a single conflict with optional override.
60
+ */
61
+ resolveConflict(conflict: ConflictField, resolution?: ConflictResolution): ResolvedConflict;
62
+ /**
63
+ * Check if spec status and GitHub state represent a conflict.
64
+ */
65
+ private isStatusConflict;
66
+ }
67
+ export {};
68
+ //# sourceMappingURL=github-conflict-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-conflict-resolver.d.ts","sourceRoot":"","sources":["../../../../plugins/specweave-github/lib/github-conflict-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,MAAM,kBAAkB,GAAG,aAAa,GAAG,WAAW,GAAG,QAAQ,CAAC;AAExE,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,kBAAkB,CAAC;CACvC;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,uBAAuB,CAAC,EAAE,kBAAkB,CAAC;IAC7C,wBAAwB,CAAC,EAAE,kBAAkB,CAAC;IAC9C,mBAAmB,CAAC,EAAE,kBAAkB,CAAC;CAC1C;AAED,UAAU,SAAS;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAC/D;AAED,UAAU,WAAW;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC;IACzB,kBAAkB,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAC/D;AAED,qBAAa,sBAAsB;IACjC,OAAO,CAAC,gBAAgB,CAAqB;IAC7C,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,OAAO,CAAC,YAAY,CAAqB;gBAE7B,MAAM,CAAC,EAAE,sBAAsB;IAM3C;;OAEG;IACH,eAAe,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,GAAG,aAAa,EAAE;IA+ChF;;OAEG;IACH,gBAAgB,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,gBAAgB,EAAE;IAIhE;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,aAAa,EAAE,UAAU,CAAC,EAAE,kBAAkB,GAAG,gBAAgB;IA2B3F;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAOzB"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * GitHub Conflict Resolver
3
+ *
4
+ * Field-level conflict detection and resolution between spec state
5
+ * and GitHub issue state. Supports title, status, and AC fields.
6
+ *
7
+ * @module github-conflict-resolver
8
+ */
9
+ export class GitHubConflictResolver {
10
+ constructor(config) {
11
+ this.statusResolution = config?.defaultStatusResolution ?? 'github-wins';
12
+ this.contentResolution = config?.defaultContentResolution ?? 'prompt';
13
+ this.acResolution = config?.defaultACResolution ?? 'github-wins';
14
+ }
15
+ /**
16
+ * Detect conflicts between spec and GitHub states.
17
+ */
18
+ detectConflicts(specState, githubState) {
19
+ const conflicts = [];
20
+ // Title conflict
21
+ if (specState.title !== githubState.title) {
22
+ conflicts.push({
23
+ field: 'title',
24
+ specValue: specState.title,
25
+ githubValue: githubState.title,
26
+ defaultResolution: this.contentResolution,
27
+ });
28
+ }
29
+ // Status conflict: map GitHub state to spec status for comparison
30
+ const githubStatus = githubState.state; // 'open' or 'closed'
31
+ const specStatus = specState.status;
32
+ const statusMismatch = this.isStatusConflict(specStatus, githubStatus);
33
+ if (statusMismatch) {
34
+ conflicts.push({
35
+ field: 'status',
36
+ specValue: specStatus,
37
+ githubValue: githubStatus,
38
+ defaultResolution: this.statusResolution,
39
+ });
40
+ }
41
+ // AC conflicts
42
+ const ghAcMap = new Map(githubState.acceptanceCriteria.map(ac => [ac.id, ac.completed]));
43
+ for (const specAc of specState.acceptanceCriteria) {
44
+ const ghCompleted = ghAcMap.get(specAc.id);
45
+ if (ghCompleted !== undefined && specAc.completed !== ghCompleted) {
46
+ conflicts.push({
47
+ field: `ac:${specAc.id}`,
48
+ specValue: String(specAc.completed),
49
+ githubValue: String(ghCompleted),
50
+ defaultResolution: this.acResolution,
51
+ });
52
+ }
53
+ }
54
+ return conflicts;
55
+ }
56
+ /**
57
+ * Resolve all conflicts using their default resolution strategy.
58
+ */
59
+ resolveConflicts(conflicts) {
60
+ return conflicts.map(c => this.resolveConflict(c));
61
+ }
62
+ /**
63
+ * Resolve a single conflict with optional override.
64
+ */
65
+ resolveConflict(conflict, resolution) {
66
+ const effectiveResolution = resolution ?? conflict.defaultResolution;
67
+ let resolvedValue;
68
+ switch (effectiveResolution) {
69
+ case 'github-wins':
70
+ resolvedValue = conflict.githubValue;
71
+ break;
72
+ case 'spec-wins':
73
+ resolvedValue = conflict.specValue;
74
+ break;
75
+ case 'prompt':
76
+ // Prompt keeps spec value pending user decision
77
+ resolvedValue = conflict.specValue;
78
+ break;
79
+ }
80
+ return {
81
+ field: conflict.field,
82
+ specValue: conflict.specValue,
83
+ githubValue: conflict.githubValue,
84
+ resolution: effectiveResolution,
85
+ resolvedValue,
86
+ resolvedAt: new Date().toISOString(),
87
+ };
88
+ }
89
+ /**
90
+ * Check if spec status and GitHub state represent a conflict.
91
+ */
92
+ isStatusConflict(specStatus, githubState) {
93
+ // "completed" spec + "open" GitHub = conflict
94
+ if (specStatus === 'completed' && githubState === 'open')
95
+ return true;
96
+ // "planned" or "in-progress" spec + "closed" GitHub = conflict
97
+ if (specStatus !== 'completed' && githubState === 'closed')
98
+ return true;
99
+ return false;
100
+ }
101
+ }
102
+ //# sourceMappingURL=github-conflict-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-conflict-resolver.js","sourceRoot":"","sources":["../../../../plugins/specweave-github/lib/github-conflict-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * GitHub Cross-Repo Sync — Distributed multi-repo issue creation and linking
3
+ *
4
+ * Creates issues in different repos based on user story target repo tags,
5
+ * then adds cross-reference sections for stories spanning multiple repos.
6
+ *
7
+ * @module github-cross-repo-sync
8
+ */
9
+ export interface CrossRepoUserStory {
10
+ id: string;
11
+ title: string;
12
+ description: string;
13
+ priority: string;
14
+ status: string;
15
+ acceptanceCriteria: Array<{
16
+ id: string;
17
+ description: string;
18
+ completed: boolean;
19
+ }>;
20
+ targetRepos: string[];
21
+ specId?: string;
22
+ }
23
+ export interface CrossRepoSyncOptions {
24
+ owner: string;
25
+ defaultRepo: string;
26
+ token?: string;
27
+ }
28
+ interface CreatedIssue {
29
+ userStoryId: string;
30
+ repo: string;
31
+ issueNumber: number;
32
+ issueUrl: string;
33
+ issueNodeId: string;
34
+ }
35
+ interface UpdatedIssue {
36
+ userStoryId: string;
37
+ repo: string;
38
+ issueNumber: number;
39
+ issueUrl: string;
40
+ }
41
+ interface CrossReference {
42
+ repo: string;
43
+ issueNumber: number;
44
+ linkedTo: Array<{
45
+ repo: string;
46
+ issueNumber: number;
47
+ }>;
48
+ }
49
+ export interface CrossRepoSyncResult {
50
+ created: CreatedIssue[];
51
+ updated: UpdatedIssue[];
52
+ errors: Array<{
53
+ userStoryId: string;
54
+ repo: string;
55
+ error: string;
56
+ }>;
57
+ crossReferences: CrossReference[];
58
+ }
59
+ /**
60
+ * Create/update issues across multiple repos and add cross-references.
61
+ */
62
+ export declare function crossRepoSync(stories: CrossRepoUserStory[], options: CrossRepoSyncOptions): Promise<CrossRepoSyncResult>;
63
+ export {};
64
+ //# sourceMappingURL=github-cross-repo-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-cross-repo-sync.d.ts","sourceRoot":"","sources":["../../../../plugins/specweave-github/lib/github-cross-repo-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACnF,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,YAAY;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,YAAY;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxD;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,MAAM,EAAE,KAAK,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpE,eAAe,EAAE,cAAc,EAAE,CAAC;CACnC;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,kBAAkB,EAAE,EAC7B,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,mBAAmB,CAAC,CA4F9B"}
@@ -0,0 +1,162 @@
1
+ /**
2
+ * GitHub Cross-Repo Sync — Distributed multi-repo issue creation and linking
3
+ *
4
+ * Creates issues in different repos based on user story target repo tags,
5
+ * then adds cross-reference sections for stories spanning multiple repos.
6
+ *
7
+ * @module github-cross-repo-sync
8
+ */
9
+ import { execFileNoThrow } from '../../../src/utils/execFileNoThrow.js';
10
+ import { generateIssueBody } from './github-issue-body-generator.js';
11
+ /**
12
+ * Create/update issues across multiple repos and add cross-references.
13
+ */
14
+ export async function crossRepoSync(stories, options) {
15
+ const result = {
16
+ created: [],
17
+ updated: [],
18
+ errors: [],
19
+ crossReferences: [],
20
+ };
21
+ if (stories.length === 0)
22
+ return result;
23
+ const env = getEnv(options.token);
24
+ // Track per-story issues for cross-referencing
25
+ const storyIssueMap = new Map();
26
+ // Step 1: Create/update issues in target repos
27
+ for (const story of stories) {
28
+ const repos = story.targetRepos.length > 0
29
+ ? story.targetRepos
30
+ : [`${options.owner}/${options.defaultRepo}`];
31
+ const storyIssues = [];
32
+ for (const repo of repos) {
33
+ try {
34
+ const body = generateIssueBody({
35
+ id: story.id,
36
+ title: story.title,
37
+ description: story.description,
38
+ priority: story.priority,
39
+ acceptanceCriteria: story.acceptanceCriteria,
40
+ specId: story.specId,
41
+ });
42
+ const title = `[${story.id}] ${story.title}`;
43
+ const existing = await searchIssue(story.id, repo, env);
44
+ if (existing) {
45
+ await updateIssue(existing.number, title, body, repo, env);
46
+ result.updated.push({
47
+ userStoryId: story.id,
48
+ repo,
49
+ issueNumber: existing.number,
50
+ issueUrl: `https://github.com/${repo}/issues/${existing.number}`,
51
+ });
52
+ storyIssues.push({ repo, issueNumber: existing.number });
53
+ }
54
+ else {
55
+ const created = await createIssue(title, body, story, repo, env);
56
+ result.created.push({
57
+ userStoryId: story.id,
58
+ repo,
59
+ issueNumber: created.number,
60
+ issueUrl: created.url,
61
+ issueNodeId: created.node_id,
62
+ });
63
+ storyIssues.push({ repo, issueNumber: created.number });
64
+ }
65
+ }
66
+ catch (err) {
67
+ result.errors.push({
68
+ userStoryId: story.id,
69
+ repo,
70
+ error: err instanceof Error ? err.message : String(err),
71
+ });
72
+ }
73
+ }
74
+ if (storyIssues.length > 1) {
75
+ storyIssueMap.set(story.id, storyIssues);
76
+ }
77
+ }
78
+ // Step 2: Add cross-references for multi-repo stories
79
+ for (const [, issues] of storyIssueMap) {
80
+ for (const issue of issues) {
81
+ const linkedTo = issues.filter(i => i.repo !== issue.repo);
82
+ result.crossReferences.push({
83
+ repo: issue.repo,
84
+ issueNumber: issue.issueNumber,
85
+ linkedTo,
86
+ });
87
+ // Add cross-reference comment via issue edit (append to body)
88
+ const crossRefSection = buildCrossRefSection(linkedTo);
89
+ try {
90
+ await appendToIssueBody(issue.issueNumber, issue.repo, crossRefSection, env);
91
+ }
92
+ catch {
93
+ // Non-fatal: cross-ref is nice-to-have
94
+ }
95
+ }
96
+ }
97
+ return result;
98
+ }
99
+ async function searchIssue(usId, repo, env) {
100
+ const res = await execFileNoThrow('gh', [
101
+ 'issue', 'list',
102
+ '--repo', repo,
103
+ '--search', `[${usId}] in:title`,
104
+ '--json', 'number,title,node_id',
105
+ '--limit', '1',
106
+ ], { env });
107
+ if (!res.success) {
108
+ throw new Error(`Search failed for ${repo}: ${res.stderr}`);
109
+ }
110
+ const issues = JSON.parse(res.stdout);
111
+ return issues.length > 0 ? issues[0] : null;
112
+ }
113
+ async function createIssue(title, body, story, repo, env) {
114
+ const res = await execFileNoThrow('gh', [
115
+ 'issue', 'create',
116
+ '--repo', repo,
117
+ '--title', title,
118
+ '--body', body,
119
+ '--label', 'user-story',
120
+ '--label', `priority:${story.priority}`,
121
+ '--json', 'number,url,node_id',
122
+ ], { env });
123
+ if (!res.success) {
124
+ throw new Error(`Create failed for ${repo}: ${res.stderr}`);
125
+ }
126
+ return JSON.parse(res.stdout);
127
+ }
128
+ async function updateIssue(issueNumber, title, body, repo, env) {
129
+ const res = await execFileNoThrow('gh', [
130
+ 'issue', 'edit', String(issueNumber),
131
+ '--repo', repo,
132
+ '--title', title,
133
+ '--body', body,
134
+ '--json', 'number,url',
135
+ ], { env });
136
+ if (!res.success) {
137
+ throw new Error(`Update failed for ${repo}: ${res.stderr}`);
138
+ }
139
+ }
140
+ async function appendToIssueBody(issueNumber, repo, section, env) {
141
+ // Use gh issue edit with --add-body
142
+ const res = await execFileNoThrow('gh', [
143
+ 'issue', 'edit', String(issueNumber),
144
+ '--repo', repo,
145
+ '--body', section,
146
+ '--json', 'number,url',
147
+ ], { env });
148
+ if (!res.success) {
149
+ throw new Error(`Cross-ref update failed: ${res.stderr}`);
150
+ }
151
+ }
152
+ function buildCrossRefSection(linkedTo) {
153
+ const refs = linkedTo.map(l => `- ${l.repo}#${l.issueNumber}`).join('\n');
154
+ return `\n\n---\n**Also tracked in:**\n${refs}`;
155
+ }
156
+ function getEnv(token) {
157
+ if (token) {
158
+ return { ...process.env, GH_TOKEN: token };
159
+ }
160
+ return process.env;
161
+ }
162
+ //# sourceMappingURL=github-cross-repo-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-cross-repo-sync.js","sourceRoot":"","sources":["../../../../plugins/specweave-github/lib/github-cross-repo-sync.ts"],"names":[],"mappings":"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"}