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.
- package/README.md +89 -193
- package/dist/plugins/specweave-github/lib/github-ac-comment-poster.d.ts +37 -0
- package/dist/plugins/specweave-github/lib/github-ac-comment-poster.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/github-ac-comment-poster.js +176 -0
- package/dist/plugins/specweave-github/lib/github-ac-comment-poster.js.map +1 -0
- package/dist/plugins/specweave-github/lib/github-batch-sync.d.ts +36 -0
- package/dist/plugins/specweave-github/lib/github-batch-sync.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/github-batch-sync.js +115 -0
- package/dist/plugins/specweave-github/lib/github-batch-sync.js.map +1 -0
- package/dist/plugins/specweave-github/lib/github-board-resolver-v2.d.ts +37 -0
- package/dist/plugins/specweave-github/lib/github-board-resolver-v2.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/github-board-resolver-v2.js +56 -0
- package/dist/plugins/specweave-github/lib/github-board-resolver-v2.js.map +1 -0
- package/dist/plugins/specweave-github/lib/github-conflict-resolver.d.ts +68 -0
- package/dist/plugins/specweave-github/lib/github-conflict-resolver.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/github-conflict-resolver.js +102 -0
- package/dist/plugins/specweave-github/lib/github-conflict-resolver.js.map +1 -0
- package/dist/plugins/specweave-github/lib/github-cross-repo-sync.d.ts +64 -0
- package/dist/plugins/specweave-github/lib/github-cross-repo-sync.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/github-cross-repo-sync.js +162 -0
- package/dist/plugins/specweave-github/lib/github-cross-repo-sync.js.map +1 -0
- package/dist/plugins/specweave-github/lib/github-field-sync.d.ts +50 -0
- package/dist/plugins/specweave-github/lib/github-field-sync.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/github-field-sync.js +107 -0
- package/dist/plugins/specweave-github/lib/github-field-sync.js.map +1 -0
- package/dist/plugins/specweave-github/lib/github-graphql-client.d.ts +53 -0
- package/dist/plugins/specweave-github/lib/github-graphql-client.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/github-graphql-client.js +138 -0
- package/dist/plugins/specweave-github/lib/github-graphql-client.js.map +1 -0
- package/dist/plugins/specweave-github/lib/github-issue-body-generator.d.ts +40 -0
- package/dist/plugins/specweave-github/lib/github-issue-body-generator.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/github-issue-body-generator.js +50 -0
- package/dist/plugins/specweave-github/lib/github-issue-body-generator.js.map +1 -0
- package/dist/plugins/specweave-github/lib/github-issue-body-parser.d.ts +30 -0
- package/dist/plugins/specweave-github/lib/github-issue-body-parser.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/github-issue-body-parser.js +75 -0
- package/dist/plugins/specweave-github/lib/github-issue-body-parser.js.map +1 -0
- package/dist/plugins/specweave-github/lib/github-pull-sync.d.ts +94 -0
- package/dist/plugins/specweave-github/lib/github-pull-sync.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/github-pull-sync.js +232 -0
- package/dist/plugins/specweave-github/lib/github-pull-sync.js.map +1 -0
- package/dist/plugins/specweave-github/lib/github-push-sync.d.ts +50 -0
- package/dist/plugins/specweave-github/lib/github-push-sync.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/github-push-sync.js +114 -0
- package/dist/plugins/specweave-github/lib/github-push-sync.js.map +1 -0
- package/dist/plugins/specweave-github/lib/github-rate-limiter.d.ts +53 -0
- package/dist/plugins/specweave-github/lib/github-rate-limiter.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/github-rate-limiter.js +109 -0
- package/dist/plugins/specweave-github/lib/github-rate-limiter.js.map +1 -0
- package/dist/plugins/specweave-github/lib/github-spec-frontmatter-updater.d.ts +21 -0
- package/dist/plugins/specweave-github/lib/github-spec-frontmatter-updater.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/github-spec-frontmatter-updater.js +161 -0
- package/dist/plugins/specweave-github/lib/github-spec-frontmatter-updater.js.map +1 -0
- package/dist/plugins/specweave-github/lib/github-sync-orchestrator.d.ts +46 -0
- package/dist/plugins/specweave-github/lib/github-sync-orchestrator.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/github-sync-orchestrator.js +99 -0
- package/dist/plugins/specweave-github/lib/github-sync-orchestrator.js.map +1 -0
- package/dist/plugins/specweave-github/lib/github-us-auto-closer.d.ts +43 -0
- package/dist/plugins/specweave-github/lib/github-us-auto-closer.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/github-us-auto-closer.js +153 -0
- package/dist/plugins/specweave-github/lib/github-us-auto-closer.js.map +1 -0
- package/dist/plugins/specweave-github/lib/index.d.ts +1 -4
- package/dist/plugins/specweave-github/lib/index.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/index.js +1 -4
- package/dist/plugins/specweave-github/lib/index.js.map +1 -1
- package/dist/plugins/specweave-testing/lib/playwright-ci-defaults.d.ts +7 -0
- package/dist/plugins/specweave-testing/lib/playwright-ci-defaults.d.ts.map +1 -0
- package/dist/plugins/specweave-testing/lib/playwright-ci-defaults.js +15 -0
- package/dist/plugins/specweave-testing/lib/playwright-ci-defaults.js.map +1 -0
- package/dist/plugins/specweave-testing/lib/playwright-cli-detector.d.ts +10 -0
- package/dist/plugins/specweave-testing/lib/playwright-cli-detector.d.ts.map +1 -0
- package/dist/plugins/specweave-testing/lib/playwright-cli-detector.js +36 -0
- package/dist/plugins/specweave-testing/lib/playwright-cli-detector.js.map +1 -0
- package/dist/plugins/specweave-testing/lib/playwright-cli-runner.d.ts +25 -0
- package/dist/plugins/specweave-testing/lib/playwright-cli-runner.d.ts.map +1 -0
- package/dist/plugins/specweave-testing/lib/playwright-cli-runner.js +57 -0
- package/dist/plugins/specweave-testing/lib/playwright-cli-runner.js.map +1 -0
- package/dist/plugins/specweave-testing/lib/playwright-routing.d.ts +7 -0
- package/dist/plugins/specweave-testing/lib/playwright-routing.d.ts.map +1 -0
- package/dist/plugins/specweave-testing/lib/playwright-routing.js +17 -0
- package/dist/plugins/specweave-testing/lib/playwright-routing.js.map +1 -0
- package/dist/src/cli/commands/auto.d.ts.map +1 -1
- package/dist/src/cli/commands/auto.js +1 -2
- package/dist/src/cli/commands/auto.js.map +1 -1
- package/dist/src/cli/commands/cancel-auto.js +1 -2
- package/dist/src/cli/commands/cancel-auto.js.map +1 -1
- package/dist/src/cli/commands/living-docs.js +2 -2
- package/dist/src/cli/commands/living-docs.js.map +1 -1
- package/dist/src/cli/commands/update.d.ts.map +1 -1
- package/dist/src/cli/commands/update.js +1 -2
- package/dist/src/cli/commands/update.js.map +1 -1
- package/dist/src/core/config/types.d.ts +8 -0
- package/dist/src/core/config/types.d.ts.map +1 -1
- package/dist/src/core/config/types.js +3 -0
- package/dist/src/core/config/types.js.map +1 -1
- package/dist/src/core/types/sync-profile.d.ts +72 -0
- package/dist/src/core/types/sync-profile.d.ts.map +1 -1
- package/dist/src/core/types/sync-profile.js +6 -0
- package/dist/src/core/types/sync-profile.js.map +1 -1
- package/package.json +2 -2
- package/plugins/specweave/hooks/hooks.json +2 -2
- package/plugins/specweave/hooks/startup-health-check.sh +1 -1
- package/plugins/specweave/hooks/stop-auto-v5.sh +166 -0
- package/plugins/specweave/hooks/user-prompt-submit.sh +10 -0
- package/plugins/specweave/hooks/v2/dispatchers/post-tool-use.sh +21 -1
- package/plugins/specweave/hooks/v2/dispatchers/session-start.sh +1 -1
- package/plugins/specweave/skills/auto/SKILL.md +71 -251
- package/plugins/specweave/skills/team-build/SKILL.md +370 -0
- package/plugins/specweave/skills/team-merge/SKILL.md +123 -0
- package/plugins/specweave/skills/team-orchestrate/SKILL.md +800 -0
- package/plugins/specweave/skills/team-status/SKILL.md +89 -0
- package/plugins/specweave-github/MULTI-PROJECT-SYNC-ARCHITECTURE.md +94 -8
- package/plugins/specweave-github/commands/sync.md +17 -3
- package/plugins/specweave-github/hooks/github-ac-sync-handler.sh +255 -0
- package/plugins/specweave-github/hooks/github-auto-create-handler.sh +455 -0
- package/plugins/specweave-github/lib/github-ac-comment-poster.js +150 -0
- package/plugins/specweave-github/lib/github-ac-comment-poster.ts +245 -0
- package/plugins/specweave-github/lib/github-batch-sync.js +93 -0
- package/plugins/specweave-github/lib/github-batch-sync.ts +152 -0
- package/plugins/specweave-github/lib/github-board-resolver-v2.js +47 -0
- package/plugins/specweave-github/lib/github-board-resolver-v2.ts +73 -0
- package/plugins/specweave-github/lib/github-conflict-resolver.js +90 -0
- package/plugins/specweave-github/lib/github-conflict-resolver.ts +154 -0
- package/plugins/specweave-github/lib/github-cross-repo-sync.js +168 -0
- package/plugins/specweave-github/lib/github-cross-repo-sync.ts +252 -0
- package/plugins/specweave-github/lib/github-field-sync.js +116 -0
- package/plugins/specweave-github/lib/github-field-sync.ts +165 -0
- package/plugins/specweave-github/lib/github-graphql-client.js +129 -0
- package/plugins/specweave-github/lib/github-graphql-client.ts +181 -0
- package/plugins/specweave-github/lib/github-issue-body-generator.js +30 -0
- package/plugins/specweave-github/lib/github-issue-body-generator.ts +76 -0
- package/plugins/specweave-github/lib/github-issue-body-parser.js +55 -0
- package/plugins/specweave-github/lib/github-issue-body-parser.ts +92 -0
- package/plugins/specweave-github/lib/github-pull-sync.js +185 -0
- package/plugins/specweave-github/lib/github-pull-sync.ts +343 -0
- package/plugins/specweave-github/lib/github-push-sync.js +119 -0
- package/plugins/specweave-github/lib/github-push-sync.ts +174 -0
- package/plugins/specweave-github/lib/github-rate-limiter.js +96 -0
- package/plugins/specweave-github/lib/github-rate-limiter.ts +143 -0
- package/plugins/specweave-github/lib/github-spec-frontmatter-updater.js +117 -0
- package/plugins/specweave-github/lib/github-spec-frontmatter-updater.ts +180 -0
- package/plugins/specweave-github/lib/github-sync-orchestrator.js +84 -0
- package/plugins/specweave-github/lib/github-sync-orchestrator.ts +156 -0
- package/plugins/specweave-github/lib/github-us-auto-closer.js +134 -0
- package/plugins/specweave-github/lib/github-us-auto-closer.ts +226 -0
- package/plugins/specweave-github/lib/index.js +1 -7
- package/plugins/specweave-github/lib/index.ts +1 -4
- package/plugins/specweave-github/skills/github-sync/SKILL.md +76 -4
- package/plugins/specweave-testing/commands/e2e-setup.md +18 -0
- package/plugins/specweave-testing/commands/ui-automate.md +2 -0
- package/plugins/specweave-testing/commands/ui-inspect.md +8 -0
- package/plugins/specweave-testing/lib/playwright-ci-defaults.d.ts +6 -0
- package/plugins/specweave-testing/lib/playwright-ci-defaults.js +14 -0
- package/plugins/specweave-testing/lib/playwright-ci-defaults.ts +24 -0
- package/plugins/specweave-testing/lib/playwright-cli-detector.js +33 -0
- package/plugins/specweave-testing/lib/playwright-cli-detector.ts +48 -0
- package/plugins/specweave-testing/lib/playwright-cli-runner.js +58 -0
- package/plugins/specweave-testing/lib/playwright-cli-runner.ts +80 -0
- package/plugins/specweave-testing/lib/playwright-routing.js +16 -0
- package/plugins/specweave-testing/lib/playwright-routing.ts +38 -0
- package/plugins/specweave-testing/skills/e2e-testing/SKILL.md +38 -0
- package/src/templates/CLAUDE.md.template +7 -0
- package/src/templates/config.json.template +9 -1
- package/dist/plugins/specweave-github/lib/subtask-sync.d.ts +0 -51
- package/dist/plugins/specweave-github/lib/subtask-sync.d.ts.map +0 -1
- package/dist/plugins/specweave-github/lib/subtask-sync.js +0 -147
- package/dist/plugins/specweave-github/lib/subtask-sync.js.map +0 -1
- package/dist/plugins/specweave-github/lib/task-parser.d.ts +0 -37
- package/dist/plugins/specweave-github/lib/task-parser.d.ts.map +0 -1
- package/dist/plugins/specweave-github/lib/task-parser.js +0 -211
- package/dist/plugins/specweave-github/lib/task-parser.js.map +0 -1
- package/dist/plugins/specweave-github/lib/task-sync.d.ts +0 -56
- package/dist/plugins/specweave-github/lib/task-sync.d.ts.map +0 -1
- package/dist/plugins/specweave-github/lib/task-sync.js +0 -375
- package/dist/plugins/specweave-github/lib/task-sync.js.map +0 -1
- package/plugins/specweave/hooks/validate-completion-conditions.sh +0 -474
- package/plugins/specweave-github/lib/subtask-sync.d.ts +0 -51
- package/plugins/specweave-github/lib/subtask-sync.d.ts.map +0 -1
- package/plugins/specweave-github/lib/subtask-sync.js +0 -154
- package/plugins/specweave-github/lib/subtask-sync.js.map +0 -1
- package/plugins/specweave-github/lib/subtask-sync.ts +0 -225
- package/plugins/specweave-github/lib/task-parser.d.js +0 -0
- package/plugins/specweave-github/lib/task-parser.d.ts +0 -37
- package/plugins/specweave-github/lib/task-parser.d.ts.map +0 -1
- package/plugins/specweave-github/lib/task-parser.js +0 -195
- package/plugins/specweave-github/lib/task-parser.js.map +0 -1
- package/plugins/specweave-github/lib/task-parser.ts +0 -246
- package/plugins/specweave-github/lib/task-sync.d.js +0 -0
- package/plugins/specweave-github/lib/task-sync.d.ts +0 -51
- package/plugins/specweave-github/lib/task-sync.d.ts.map +0 -1
- package/plugins/specweave-github/lib/task-sync.js +0 -415
- package/plugins/specweave-github/lib/task-sync.js.map +0 -1
- package/plugins/specweave-github/lib/task-sync.ts +0 -451
- package/plugins/specweave-github/skills/github-issue-tracker/SKILL.md +0 -496
- /package/plugins/specweave/hooks/{stop-auto.sh → _archive/stop-auto-v4-legacy.sh} +0 -0
- /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":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AA+CrE;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAA6B,EAC7B,OAA6B;IAE7B,MAAM,MAAM,GAAwB;QAClC,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,EAAE;QACX,MAAM,EAAE,EAAE;QACV,eAAe,EAAE,EAAE;KACpB,CAAC;IAEF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAExC,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAElC,+CAA+C;IAC/C,MAAM,aAAa,GAAG,IAAI,GAAG,EAAwD,CAAC;IAEtF,+CAA+C;IAC/C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;YACxC,CAAC,CAAC,KAAK,CAAC,WAAW;YACnB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QAEhD,MAAM,WAAW,GAAiD,EAAE,CAAC;QAErE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,iBAAiB,CAAC;oBAC7B,EAAE,EAAE,KAAK,CAAC,EAAE;oBACZ,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,WAAW,EAAE,KAAK,CAAC,WAAW;oBAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;oBAC5C,MAAM,EAAE,KAAK,CAAC,MAAM;iBACrB,CAAC,CAAC;gBAEH,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC;gBAC7C,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;gBAExD,IAAI,QAAQ,EAAE,CAAC;oBACb,MAAM,WAAW,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;oBAC3D,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;wBAClB,WAAW,EAAE,KAAK,CAAC,EAAE;wBACrB,IAAI;wBACJ,WAAW,EAAE,QAAQ,CAAC,MAAM;wBAC5B,QAAQ,EAAE,sBAAsB,IAAI,WAAW,QAAQ,CAAC,MAAM,EAAE;qBACjE,CAAC,CAAC;oBACH,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC3D,CAAC;qBAAM,CAAC;oBACN,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;oBACjE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;wBAClB,WAAW,EAAE,KAAK,CAAC,EAAE;wBACrB,IAAI;wBACJ,WAAW,EAAE,OAAO,CAAC,MAAM;wBAC3B,QAAQ,EAAE,OAAO,CAAC,GAAG;wBACrB,WAAW,EAAE,OAAO,CAAC,OAAO;qBAC7B,CAAC,CAAC;oBACH,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC1D,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;oBACjB,WAAW,EAAE,KAAK,CAAC,EAAE;oBACrB,IAAI;oBACJ,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACxD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,sDAAsD;IACtD,KAAK,MAAM,CAAC,EAAE,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;QACvC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3D,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC;gBAC1B,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,QAAQ;aACT,CAAC,CAAC;YAEH,8DAA8D;YAC9D,MAAM,eAAe,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;YACvD,IAAI,CAAC;gBACH,MAAM,iBAAiB,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,EAAE,eAAe,EAAE,GAAG,CAAC,CAAC;YAC/E,CAAC;YAAC,MAAM,CAAC;gBACP,uCAAuC;YACzC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,IAAY,EACZ,IAAY,EACZ,GAAsB;IAEtB,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE;QACtC,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE,IAAI;QACd,UAAU,EAAE,IAAI,IAAI,YAAY;QAChC,QAAQ,EAAE,sBAAsB;QAChC,SAAS,EAAE,GAAG;KACf,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IAEZ,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtC,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9C,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,KAAa,EACb,IAAY,EACZ,KAAyB,EACzB,IAAY,EACZ,GAAsB;IAEtB,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE;QACtC,OAAO,EAAE,QAAQ;QACjB,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,KAAK;QAChB,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,YAAY;QACvB,SAAS,EAAE,YAAY,KAAK,CAAC,QAAQ,EAAE;QACvC,QAAQ,EAAE,oBAAoB;KAC/B,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IAEZ,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,WAAmB,EACnB,KAAa,EACb,IAAY,EACZ,IAAY,EACZ,GAAsB;IAEtB,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE;QACtC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC;QACpC,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,KAAK;QAChB,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,YAAY;KACvB,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IAEZ,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,WAAmB,EACnB,IAAY,EACZ,OAAe,EACf,GAAsB;IAEtB,oCAAoC;IACpC,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE;QACtC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC;QACpC,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,OAAO;QACjB,QAAQ,EAAE,YAAY;KACvB,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IAEZ,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,QAAsD;IAClF,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1E,OAAO,kCAAkC,IAAI,EAAE,CAAC;AAClD,CAAC;AAED,SAAS,MAAM,CAAC,KAAc;IAC5B,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC7C,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,CAAC;AACrB,CAAC"}
|