specweave 1.0.255 → 1.0.256
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/CLAUDE.md +24 -24
- package/README.md +138 -203
- package/dist/src/core/ac-checkbox-formatter.d.ts +24 -0
- package/dist/src/core/ac-checkbox-formatter.d.ts.map +1 -0
- package/dist/src/core/ac-checkbox-formatter.js +35 -0
- package/dist/src/core/ac-checkbox-formatter.js.map +1 -0
- package/dist/src/core/ac-progress-sync.d.ts +116 -0
- package/dist/src/core/ac-progress-sync.d.ts.map +1 -0
- package/dist/src/core/ac-progress-sync.js +272 -0
- package/dist/src/core/ac-progress-sync.js.map +1 -0
- package/dist/src/core/fabric/registry-schema.d.ts +79 -0
- package/dist/src/core/fabric/registry-schema.d.ts.map +1 -0
- package/dist/src/core/fabric/registry-schema.js +6 -0
- package/dist/src/core/fabric/registry-schema.js.map +1 -0
- package/dist/src/core/fabric/security-scanner.d.ts +12 -0
- package/dist/src/core/fabric/security-scanner.d.ts.map +1 -0
- package/dist/src/core/fabric/security-scanner.js +219 -0
- package/dist/src/core/fabric/security-scanner.js.map +1 -0
- package/dist/src/core/types/sync-profile.d.ts +44 -0
- package/dist/src/core/types/sync-profile.d.ts.map +1 -1
- package/dist/src/core/types/sync-profile.js.map +1 -1
- package/package.json +1 -1
- package/plugins/specweave/hooks/v2/dispatchers/post-tool-use.sh +4 -4
- package/plugins/{specweave-github/hooks/github-ac-sync-handler.sh → specweave/hooks/v2/handlers/ac-sync-dispatcher.sh} +96 -92
- package/plugins/specweave/skills/architect/SKILL.md +1 -1
- package/plugins/specweave/skills/auto/SKILL.md +1 -1
- package/plugins/specweave/skills/cancel-auto/SKILL.md +1 -1
- package/plugins/specweave/skills/code-simplifier/SKILL.md +1 -1
- package/plugins/specweave/skills/do/SKILL.md +1 -1
- package/plugins/specweave/skills/docs/SKILL.md +1 -1
- package/plugins/specweave/skills/docs-updater/SKILL.md +1 -1
- package/plugins/specweave/skills/done/SKILL.md +13 -70
- package/plugins/specweave/skills/framework/SKILL.md +1 -1
- package/plugins/specweave/skills/grill/SKILL.md +1 -1
- package/plugins/specweave/skills/increment/SKILL.md +1 -1
- package/plugins/specweave/skills/increment-planner/SKILL.md +1 -1
- package/plugins/specweave/skills/lsp/SKILL.md +1 -1
- package/plugins/specweave/skills/pm/SKILL.md +1 -1
- package/plugins/specweave/skills/progress/SKILL.md +1 -1
- package/plugins/specweave/skills/save/SKILL.md +1 -1
- package/plugins/specweave/skills/security/SKILL.md +1 -1
- package/plugins/specweave/skills/security-patterns/SKILL.md +1 -1
- package/plugins/specweave/skills/tdd-cycle/SKILL.md +1 -1
- package/plugins/specweave/skills/tdd-green/SKILL.md +1 -1
- package/plugins/specweave/skills/tdd-orchestrator/SKILL.md +1 -1
- package/plugins/specweave/skills/tdd-red/SKILL.md +1 -1
- package/plugins/specweave/skills/validate/SKILL.md +1 -1
- package/plugins/specweave-github/commands/sync.md +1 -22
- package/dist/plugins/specweave-github/lib/ThreeLayerSyncManager.d.ts +0 -205
- package/dist/plugins/specweave-github/lib/ThreeLayerSyncManager.d.ts.map +0 -1
- package/dist/plugins/specweave-github/lib/ThreeLayerSyncManager.js +0 -685
- package/dist/plugins/specweave-github/lib/ThreeLayerSyncManager.js.map +0 -1
- package/dist/plugins/specweave-github/lib/cli-sync-increment-changes.d.ts +0 -12
- package/dist/plugins/specweave-github/lib/cli-sync-increment-changes.d.ts.map +0 -1
- package/dist/plugins/specweave-github/lib/cli-sync-increment-changes.js +0 -28
- package/dist/plugins/specweave-github/lib/cli-sync-increment-changes.js.map +0 -1
- package/dist/plugins/specweave-github/lib/github-increment-sync-cli.d.ts +0 -21
- package/dist/plugins/specweave-github/lib/github-increment-sync-cli.d.ts.map +0 -1
- package/dist/plugins/specweave-github/lib/github-increment-sync-cli.js +0 -471
- package/dist/plugins/specweave-github/lib/github-increment-sync-cli.js.map +0 -1
- package/dist/plugins/specweave-github/lib/github-status-sync.d.ts +0 -53
- package/dist/plugins/specweave-github/lib/github-status-sync.d.ts.map +0 -1
- package/dist/plugins/specweave-github/lib/github-status-sync.js +0 -120
- package/dist/plugins/specweave-github/lib/github-status-sync.js.map +0 -1
- package/dist/plugins/specweave-github/lib/github-sync-increment-changes.d.ts +0 -18
- package/dist/plugins/specweave-github/lib/github-sync-increment-changes.d.ts.map +0 -1
- package/dist/plugins/specweave-github/lib/github-sync-increment-changes.js +0 -297
- package/dist/plugins/specweave-github/lib/github-sync-increment-changes.js.map +0 -1
- package/dist/plugins/specweave-github/lib/increment-issue-builder.d.ts +0 -94
- package/dist/plugins/specweave-github/lib/increment-issue-builder.d.ts.map +0 -1
- package/dist/plugins/specweave-github/lib/increment-issue-builder.js +0 -385
- package/dist/plugins/specweave-github/lib/increment-issue-builder.js.map +0 -1
- package/plugins/specweave-github/lib/ThreeLayerSyncManager.js +0 -611
- package/plugins/specweave-github/lib/ThreeLayerSyncManager.ts +0 -909
- package/plugins/specweave-github/lib/cli-sync-increment-changes.d.js +0 -1
- package/plugins/specweave-github/lib/cli-sync-increment-changes.d.ts +0 -12
- package/plugins/specweave-github/lib/cli-sync-increment-changes.d.ts.map +0 -1
- package/plugins/specweave-github/lib/cli-sync-increment-changes.js +0 -17
- package/plugins/specweave-github/lib/cli-sync-increment-changes.js.map +0 -1
- package/plugins/specweave-github/lib/cli-sync-increment-changes.ts +0 -33
- package/plugins/specweave-github/lib/github-increment-sync-cli.js +0 -474
- package/plugins/specweave-github/lib/github-increment-sync-cli.ts +0 -616
- package/plugins/specweave-github/lib/github-status-sync.js +0 -107
- package/plugins/specweave-github/lib/github-status-sync.ts +0 -163
- package/plugins/specweave-github/lib/github-sync-increment-changes.d.js +0 -0
- package/plugins/specweave-github/lib/github-sync-increment-changes.d.ts +0 -18
- package/plugins/specweave-github/lib/github-sync-increment-changes.d.ts.map +0 -1
- package/plugins/specweave-github/lib/github-sync-increment-changes.js +0 -253
- package/plugins/specweave-github/lib/github-sync-increment-changes.js.map +0 -1
- package/plugins/specweave-github/lib/github-sync-increment-changes.ts +0 -391
- package/plugins/specweave-github/lib/increment-issue-builder.js +0 -402
- package/plugins/specweave-github/lib/increment-issue-builder.ts +0 -520
|
@@ -1,385 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Increment Issue Builder - Generate GitHub issues from increment spec.md
|
|
3
|
-
*
|
|
4
|
-
* For brownfield projects without full living docs structure,
|
|
5
|
-
* this builder extracts User Stories and ACs directly from spec.md
|
|
6
|
-
* and generates properly formatted GitHub issues.
|
|
7
|
-
*
|
|
8
|
-
* Correct format: [FS-XXX][US-YYY] User Story Title
|
|
9
|
-
* With ACs as checkable items in issue body.
|
|
10
|
-
*
|
|
11
|
-
* @see ADR-0143 (GitHub Issue Format)
|
|
12
|
-
*/
|
|
13
|
-
import { readFile } from 'fs/promises';
|
|
14
|
-
import { existsSync } from 'fs';
|
|
15
|
-
import * as path from 'path';
|
|
16
|
-
import * as yaml from 'yaml';
|
|
17
|
-
export class IncrementIssueBuilder {
|
|
18
|
-
constructor(incrementPath, projectRoot) {
|
|
19
|
-
this.incrementPath = incrementPath;
|
|
20
|
-
this.projectRoot = projectRoot;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Parse increment spec.md and extract all data
|
|
24
|
-
*/
|
|
25
|
-
async parse() {
|
|
26
|
-
const specPath = path.join(this.incrementPath, 'spec.md');
|
|
27
|
-
if (!existsSync(specPath)) {
|
|
28
|
-
throw new Error(`spec.md not found at ${specPath}`);
|
|
29
|
-
}
|
|
30
|
-
const content = await readFile(specPath, 'utf-8');
|
|
31
|
-
// Extract YAML frontmatter
|
|
32
|
-
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
33
|
-
if (!frontmatterMatch) {
|
|
34
|
-
throw new Error('spec.md missing YAML frontmatter');
|
|
35
|
-
}
|
|
36
|
-
const frontmatter = yaml.parse(frontmatterMatch[1]);
|
|
37
|
-
const bodyContent = content.slice(frontmatterMatch[0].length).trim();
|
|
38
|
-
// Extract main title
|
|
39
|
-
const titleMatch = bodyContent.match(/^#\s+(.+)$/m);
|
|
40
|
-
const title = titleMatch ? titleMatch[1].trim() : frontmatter.increment;
|
|
41
|
-
// Extract problem statement
|
|
42
|
-
const problemStatement = this.extractSection(bodyContent, 'Problem Statement');
|
|
43
|
-
// Extract user stories
|
|
44
|
-
const userStories = this.extractUserStories(bodyContent);
|
|
45
|
-
// Extract out of scope
|
|
46
|
-
const outOfScopeSection = this.extractSection(bodyContent, 'Out of Scope');
|
|
47
|
-
const outOfScope = outOfScopeSection
|
|
48
|
-
.split('\n')
|
|
49
|
-
.filter(line => line.startsWith('-'))
|
|
50
|
-
.map(line => line.replace(/^-\s*/, '').trim());
|
|
51
|
-
// Extract tasks from tasks.md
|
|
52
|
-
const tasks = await this.extractTasks();
|
|
53
|
-
return {
|
|
54
|
-
frontmatter,
|
|
55
|
-
title,
|
|
56
|
-
problemStatement,
|
|
57
|
-
userStories,
|
|
58
|
-
tasks,
|
|
59
|
-
outOfScope,
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Extract tasks from tasks.md
|
|
64
|
-
*/
|
|
65
|
-
async extractTasks() {
|
|
66
|
-
const tasksPath = path.join(this.incrementPath, 'tasks.md');
|
|
67
|
-
if (!existsSync(tasksPath)) {
|
|
68
|
-
return [];
|
|
69
|
-
}
|
|
70
|
-
try {
|
|
71
|
-
const content = await readFile(tasksPath, 'utf-8');
|
|
72
|
-
const tasks = [];
|
|
73
|
-
// Split by task headers: ### T-XXX: Title
|
|
74
|
-
const taskBlocks = content.split(/(?=###\s+T-\d+)/);
|
|
75
|
-
for (const block of taskBlocks) {
|
|
76
|
-
const headerMatch = block.match(/###\s+(T-\d+):\s*(.+)/);
|
|
77
|
-
if (!headerMatch)
|
|
78
|
-
continue;
|
|
79
|
-
const id = headerMatch[1];
|
|
80
|
-
const title = headerMatch[2].trim();
|
|
81
|
-
// Extract status: **Status**: [x] completed or **Status**: [ ] pending
|
|
82
|
-
const statusMatch = block.match(/\*\*Status\*\*:\s*\[([x\s])\]/i);
|
|
83
|
-
const completed = statusMatch ? statusMatch[1].toLowerCase() === 'x' : false;
|
|
84
|
-
// Extract user stories: **User Story**: US-001 or **Satisfies ACs**: AC-US1-01
|
|
85
|
-
const userStoryMatch = block.match(/\*\*User Story\*\*:\s*([^\n]+)/i);
|
|
86
|
-
const satisfiesMatch = block.match(/\*\*Satisfies ACs?\*\*:\s*([^\n]+)/i);
|
|
87
|
-
let userStories = [];
|
|
88
|
-
if (userStoryMatch) {
|
|
89
|
-
userStories = userStoryMatch[1].split(',').map(s => s.trim());
|
|
90
|
-
}
|
|
91
|
-
else if (satisfiesMatch) {
|
|
92
|
-
// Extract US IDs from AC IDs (AC-US1-01 → US-001)
|
|
93
|
-
const acIds = satisfiesMatch[1].split(',').map(s => s.trim());
|
|
94
|
-
const usIds = new Set();
|
|
95
|
-
for (const ac of acIds) {
|
|
96
|
-
const usMatch = ac.match(/AC-(US\d+)-/i);
|
|
97
|
-
if (usMatch) {
|
|
98
|
-
usIds.add(usMatch[1]);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
userStories = Array.from(usIds);
|
|
102
|
-
}
|
|
103
|
-
// Extract priority
|
|
104
|
-
const priorityMatch = block.match(/\*\*Priority\*\*:\s*(P\d)/i);
|
|
105
|
-
const priority = priorityMatch ? priorityMatch[1] : undefined;
|
|
106
|
-
tasks.push({
|
|
107
|
-
id,
|
|
108
|
-
title,
|
|
109
|
-
completed,
|
|
110
|
-
userStories,
|
|
111
|
-
priority,
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
return tasks;
|
|
115
|
-
}
|
|
116
|
-
catch {
|
|
117
|
-
return [];
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* Extract a section by heading
|
|
122
|
-
*/
|
|
123
|
-
extractSection(content, heading) {
|
|
124
|
-
const regex = new RegExp(`##\\s+${heading}\\s*\\n([\\s\\S]*?)(?=\\n##\\s|$)`, 'i');
|
|
125
|
-
const match = content.match(regex);
|
|
126
|
-
return match ? match[1].trim() : '';
|
|
127
|
-
}
|
|
128
|
-
/**
|
|
129
|
-
* Extract user stories from spec.md
|
|
130
|
-
*/
|
|
131
|
-
extractUserStories(content) {
|
|
132
|
-
const stories = [];
|
|
133
|
-
// Find User Stories section
|
|
134
|
-
const userStoriesSection = this.extractSection(content, 'User Stories');
|
|
135
|
-
if (!userStoriesSection) {
|
|
136
|
-
return stories;
|
|
137
|
-
}
|
|
138
|
-
// Split by ### US-XXX headers
|
|
139
|
-
const storyBlocks = userStoriesSection.split(/(?=###\s+US-\d+)/);
|
|
140
|
-
for (const block of storyBlocks) {
|
|
141
|
-
const headerMatch = block.match(/###\s+(US-\d+):\s*(.+)/);
|
|
142
|
-
if (!headerMatch)
|
|
143
|
-
continue;
|
|
144
|
-
const id = headerMatch[1];
|
|
145
|
-
const title = headerMatch[2].trim();
|
|
146
|
-
// Extract As a/I want/So that
|
|
147
|
-
const asAMatch = block.match(/\*\*As a\*\*\s+([^\n]+)/i);
|
|
148
|
-
const iWantMatch = block.match(/\*\*I want\*\*\s+([^\n]+)/i);
|
|
149
|
-
const soThatMatch = block.match(/\*\*So that\*\*\s+([^\n]+)/i);
|
|
150
|
-
// Extract Acceptance Criteria
|
|
151
|
-
const acceptanceCriteria = this.extractAcceptanceCriteria(block, id);
|
|
152
|
-
stories.push({
|
|
153
|
-
id,
|
|
154
|
-
title,
|
|
155
|
-
asA: asAMatch ? asAMatch[1].trim().replace(/,$/, '') : '',
|
|
156
|
-
iWant: iWantMatch ? iWantMatch[1].trim().replace(/,$/, '') : '',
|
|
157
|
-
soThat: soThatMatch ? soThatMatch[1].trim().replace(/\.$/, '') : '',
|
|
158
|
-
acceptanceCriteria,
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
return stories;
|
|
162
|
-
}
|
|
163
|
-
/**
|
|
164
|
-
* Extract acceptance criteria from a user story block
|
|
165
|
-
*/
|
|
166
|
-
extractAcceptanceCriteria(block, userStoryId) {
|
|
167
|
-
const criteria = [];
|
|
168
|
-
// Pattern: - [x] **AC-US1-01**: Description or - [ ] **AC-US1-01**: Description
|
|
169
|
-
const acPattern = /-\s*\[([ x])\]\s*\*\*AC-(US\d+)-(\d+)\*\*:\s*(.+)/gi;
|
|
170
|
-
let match;
|
|
171
|
-
while ((match = acPattern.exec(block)) !== null) {
|
|
172
|
-
const completed = match[1].toLowerCase() === 'x';
|
|
173
|
-
const usNum = match[2];
|
|
174
|
-
const acNum = match[3];
|
|
175
|
-
const description = match[4].trim();
|
|
176
|
-
criteria.push({
|
|
177
|
-
id: `AC-${usNum}-${acNum}`,
|
|
178
|
-
description,
|
|
179
|
-
completed,
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
return criteria;
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* Build GitHub issue for a single user story
|
|
186
|
-
*/
|
|
187
|
-
buildUserStoryIssue(story, incrementData, githubRepo) {
|
|
188
|
-
const featureId = incrementData.frontmatter.feature_id || this.generateFeatureId(incrementData);
|
|
189
|
-
const incrementId = incrementData.frontmatter.increment;
|
|
190
|
-
// Title format: [FS-XXX][US-YYY] User Story Title
|
|
191
|
-
const title = `[${featureId}][${story.id}] ${story.title}`;
|
|
192
|
-
// Build body
|
|
193
|
-
let body = '';
|
|
194
|
-
// ❌ REMOVED: Metadata header (Feature, Status, Priority)
|
|
195
|
-
// WHY: GitHub has NATIVE fields for this (labels, milestones)
|
|
196
|
-
// Body should contain ONLY actual work content (ACs, tasks, user story)
|
|
197
|
-
// See: .specweave/docs/internal/troubleshooting/CRITICAL-remove-metadata-header-from-github-issues.md
|
|
198
|
-
// Progress section (consistency with user-story-issue-builder.ts)
|
|
199
|
-
const completedACs = story.acceptanceCriteria.filter(ac => ac.completed).length;
|
|
200
|
-
const totalACs = story.acceptanceCriteria.length;
|
|
201
|
-
const storyTasks = incrementData.tasks.filter(t => t.userStories.includes(story.id) ||
|
|
202
|
-
t.userStories.some(us => us.toUpperCase() === story.id.toUpperCase()));
|
|
203
|
-
const completedTasks = storyTasks.filter(t => t.completed).length;
|
|
204
|
-
const totalTasks = storyTasks.length;
|
|
205
|
-
const overallPercentage = (totalACs + totalTasks) > 0
|
|
206
|
-
? Math.round(((completedACs + completedTasks) / (totalACs + totalTasks)) * 100)
|
|
207
|
-
: 0;
|
|
208
|
-
body += `## Progress\n\n`;
|
|
209
|
-
body += `**Acceptance Criteria**: ${completedACs}/${totalACs} (${totalACs > 0 ? Math.round((completedACs / totalACs) * 100) : 0}%)\n`;
|
|
210
|
-
body += `**Tasks**: ${completedTasks}/${totalTasks} (${totalTasks > 0 ? Math.round((completedTasks / totalTasks) * 100) : 0}%)\n`;
|
|
211
|
-
body += `**Overall**: ${overallPercentage}%\n\n`;
|
|
212
|
-
// Progress bar
|
|
213
|
-
const filledBlocks = Math.floor(overallPercentage / 5);
|
|
214
|
-
const emptyBlocks = 20 - filledBlocks;
|
|
215
|
-
body += `${'█'.repeat(filledBlocks)}${'░'.repeat(emptyBlocks)} ${overallPercentage}%\n\n`;
|
|
216
|
-
body += `---\n\n`;
|
|
217
|
-
// User Story description
|
|
218
|
-
body += `## User Story\n\n`;
|
|
219
|
-
if (story.asA && story.iWant && story.soThat) {
|
|
220
|
-
body += `**As a** ${story.asA}\n`;
|
|
221
|
-
body += `**I want** ${story.iWant}\n`;
|
|
222
|
-
body += `**So that** ${story.soThat}\n\n`;
|
|
223
|
-
}
|
|
224
|
-
else {
|
|
225
|
-
body += `${story.title}\n\n`;
|
|
226
|
-
}
|
|
227
|
-
body += `---\n\n`;
|
|
228
|
-
// Acceptance Criteria (checkable!)
|
|
229
|
-
body += `## Acceptance Criteria\n\n`;
|
|
230
|
-
if (story.acceptanceCriteria.length > 0) {
|
|
231
|
-
const completed = story.acceptanceCriteria.filter(ac => ac.completed).length;
|
|
232
|
-
const total = story.acceptanceCriteria.length;
|
|
233
|
-
const percentage = total > 0 ? Math.round((completed / total) * 100) : 0;
|
|
234
|
-
body += `Progress: ${completed}/${total} criteria met (${percentage}%)\n\n`;
|
|
235
|
-
for (const ac of story.acceptanceCriteria) {
|
|
236
|
-
const checkbox = ac.completed ? '[x]' : '[ ]';
|
|
237
|
-
body += `- ${checkbox} **${ac.id}**: ${ac.description}\n`;
|
|
238
|
-
}
|
|
239
|
-
body += '\n';
|
|
240
|
-
}
|
|
241
|
-
else {
|
|
242
|
-
body += `*No acceptance criteria defined*\n\n`;
|
|
243
|
-
}
|
|
244
|
-
body += `---\n\n`;
|
|
245
|
-
// Tasks for this user story (already calculated above for Progress section)
|
|
246
|
-
if (storyTasks.length > 0) {
|
|
247
|
-
body += `## Tasks\n\n`;
|
|
248
|
-
const completedTasks = storyTasks.filter(t => t.completed).length;
|
|
249
|
-
body += `Progress: ${completedTasks}/${storyTasks.length} tasks\n\n`;
|
|
250
|
-
for (const task of storyTasks) {
|
|
251
|
-
const checkbox = task.completed ? '[x]' : '[ ]';
|
|
252
|
-
body += `- ${checkbox} **${task.id}**: ${task.title}\n`;
|
|
253
|
-
}
|
|
254
|
-
body += '\n---\n\n';
|
|
255
|
-
}
|
|
256
|
-
// Link to increment
|
|
257
|
-
body += `## Implementation\n\n`;
|
|
258
|
-
if (githubRepo) {
|
|
259
|
-
body += `**Increment**: [${incrementId}](https://github.com/${githubRepo}/tree/develop/.specweave/increments/${incrementId})\n\n`;
|
|
260
|
-
}
|
|
261
|
-
else {
|
|
262
|
-
body += `**Increment**: ${incrementId}\n\n`;
|
|
263
|
-
}
|
|
264
|
-
body += `---\n\n`;
|
|
265
|
-
body += `🤖 Auto-synced by SpecWeave Increment Sync`;
|
|
266
|
-
// Labels
|
|
267
|
-
const labels = ['specweave', 'user-story'];
|
|
268
|
-
// Add type label if available
|
|
269
|
-
if (incrementData.frontmatter.type) {
|
|
270
|
-
labels.push(incrementData.frontmatter.type.toLowerCase());
|
|
271
|
-
}
|
|
272
|
-
// Add priority label (from story or default to p2)
|
|
273
|
-
const priority = story.priority?.toLowerCase() || incrementData.frontmatter.priority?.toLowerCase() || 'p2';
|
|
274
|
-
labels.push(priority);
|
|
275
|
-
return { title, body, labels };
|
|
276
|
-
}
|
|
277
|
-
/**
|
|
278
|
-
* Build GitHub issue for the entire increment (epic-style)
|
|
279
|
-
*/
|
|
280
|
-
buildIncrementIssue(incrementData, githubRepo) {
|
|
281
|
-
const featureId = incrementData.frontmatter.feature_id || this.generateFeatureId(incrementData);
|
|
282
|
-
const incrementId = incrementData.frontmatter.increment;
|
|
283
|
-
// Title format: [FS-XXX] Increment Title
|
|
284
|
-
const title = `[${featureId}] ${incrementData.title}`;
|
|
285
|
-
// Build body
|
|
286
|
-
let body = '';
|
|
287
|
-
// Header with metadata
|
|
288
|
-
body += `**Increment**: ${incrementId}\n`;
|
|
289
|
-
body += `**Status**: ${incrementData.frontmatter.status || 'planning'}\n`;
|
|
290
|
-
body += `**Priority**: P0 (Critical)\n`;
|
|
291
|
-
// Calculate progress
|
|
292
|
-
const totalACs = incrementData.userStories.reduce((sum, us) => sum + us.acceptanceCriteria.length, 0);
|
|
293
|
-
const completedACs = incrementData.userStories.reduce((sum, us) => sum + us.acceptanceCriteria.filter(ac => ac.completed).length, 0);
|
|
294
|
-
const percentage = totalACs > 0 ? Math.round((completedACs / totalACs) * 100) : 0;
|
|
295
|
-
body += `**Progress**: ${completedACs}/${totalACs} ACs (${percentage}%)\n`;
|
|
296
|
-
body += `\n---\n\n`;
|
|
297
|
-
// Overview
|
|
298
|
-
body += `## Overview\n\n`;
|
|
299
|
-
body += incrementData.problemStatement || incrementData.title;
|
|
300
|
-
body += `\n\n---\n\n`;
|
|
301
|
-
// User Stories with ACs
|
|
302
|
-
body += `## User Stories\n\n`;
|
|
303
|
-
for (const story of incrementData.userStories) {
|
|
304
|
-
const usCompleted = story.acceptanceCriteria.filter(ac => ac.completed).length;
|
|
305
|
-
const usTotal = story.acceptanceCriteria.length;
|
|
306
|
-
const usCheckbox = usCompleted === usTotal && usTotal > 0 ? '[x]' : '[ ]';
|
|
307
|
-
body += `### ${usCheckbox} ${story.id}: ${story.title}\n\n`;
|
|
308
|
-
if (story.asA && story.iWant && story.soThat) {
|
|
309
|
-
body += `> **As a** ${story.asA}, **I want** ${story.iWant}, **So that** ${story.soThat}\n\n`;
|
|
310
|
-
}
|
|
311
|
-
body += `**Acceptance Criteria:**\n`;
|
|
312
|
-
for (const ac of story.acceptanceCriteria) {
|
|
313
|
-
const checkbox = ac.completed ? '[x]' : '[ ]';
|
|
314
|
-
body += `- ${checkbox} **${ac.id}**: ${ac.description}\n`;
|
|
315
|
-
}
|
|
316
|
-
body += '\n';
|
|
317
|
-
}
|
|
318
|
-
body += `---\n\n`;
|
|
319
|
-
// Tasks section
|
|
320
|
-
if (incrementData.tasks.length > 0) {
|
|
321
|
-
body += `## Tasks\n\n`;
|
|
322
|
-
const completedTasks = incrementData.tasks.filter(t => t.completed).length;
|
|
323
|
-
const totalTasks = incrementData.tasks.length;
|
|
324
|
-
const taskPercentage = totalTasks > 0 ? Math.round((completedTasks / totalTasks) * 100) : 0;
|
|
325
|
-
body += `Progress: ${completedTasks}/${totalTasks} tasks (${taskPercentage}%)\n\n`;
|
|
326
|
-
for (const task of incrementData.tasks) {
|
|
327
|
-
const checkbox = task.completed ? '[x]' : '[ ]';
|
|
328
|
-
body += `- ${checkbox} **${task.id}**: ${task.title}\n`;
|
|
329
|
-
if (task.priority || task.userStories.length > 0) {
|
|
330
|
-
const parts = [];
|
|
331
|
-
if (task.priority)
|
|
332
|
-
parts.push(`Priority: ${task.priority}`);
|
|
333
|
-
if (task.userStories.length > 0)
|
|
334
|
-
parts.push(`User ${task.userStories.length === 1 ? 'Story' : 'Stories'}: ${task.userStories.join(', ')}`);
|
|
335
|
-
body += ` - ${parts.join(' | ')}\n`;
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
body += '\n---\n\n';
|
|
339
|
-
}
|
|
340
|
-
// Links to increment files
|
|
341
|
-
body += `## SpecWeave Increment\n\n`;
|
|
342
|
-
if (githubRepo) {
|
|
343
|
-
body += `- **Spec**: [\`spec.md\`](https://github.com/${githubRepo}/blob/develop/.specweave/increments/${incrementId}/spec.md)\n`;
|
|
344
|
-
body += `- **Plan**: [\`plan.md\`](https://github.com/${githubRepo}/blob/develop/.specweave/increments/${incrementId}/plan.md)\n`;
|
|
345
|
-
body += `- **Tasks**: [\`tasks.md\`](https://github.com/${githubRepo}/blob/develop/.specweave/increments/${incrementId}/tasks.md)\n`;
|
|
346
|
-
}
|
|
347
|
-
else {
|
|
348
|
-
body += `- **Spec**: \`spec.md\`\n`;
|
|
349
|
-
body += `- **Plan**: \`plan.md\`\n`;
|
|
350
|
-
body += `- **Tasks**: \`tasks.md\`\n`;
|
|
351
|
-
}
|
|
352
|
-
body += `\n---\n\n`;
|
|
353
|
-
body += `🤖 Auto-synced by SpecWeave Increment Sync`;
|
|
354
|
-
// Labels
|
|
355
|
-
const labels = ['specweave', 'increment'];
|
|
356
|
-
// Add type label (default to 'enhancement' if not specified)
|
|
357
|
-
const typeLabel = incrementData.frontmatter.type?.toLowerCase() || 'enhancement';
|
|
358
|
-
labels.push(typeLabel);
|
|
359
|
-
// Add priority label (default to 'p2' if not specified)
|
|
360
|
-
const priority = incrementData.frontmatter.priority?.toLowerCase() || 'p2';
|
|
361
|
-
labels.push(priority);
|
|
362
|
-
return { title, body, labels };
|
|
363
|
-
}
|
|
364
|
-
/**
|
|
365
|
-
* Generate a feature ID if not present in frontmatter
|
|
366
|
-
* Uses date-based format: FS-YY-MM-DD
|
|
367
|
-
*/
|
|
368
|
-
generateFeatureId(incrementData) {
|
|
369
|
-
// Try to extract increment number
|
|
370
|
-
const incrementNum = incrementData.frontmatter.increment.match(/^(\d+)/)?.[1];
|
|
371
|
-
if (incrementNum) {
|
|
372
|
-
return `FS-${incrementNum.padStart(3, '0')}`;
|
|
373
|
-
}
|
|
374
|
-
// Fallback to date-based
|
|
375
|
-
const created = incrementData.frontmatter.created;
|
|
376
|
-
if (created) {
|
|
377
|
-
const match = created.match(/^(\d{4})-(\d{2})-(\d{2})/);
|
|
378
|
-
if (match) {
|
|
379
|
-
return `FS-${match[1].slice(2)}-${match[2]}-${match[3]}`;
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
return 'FS-UNKNOWN';
|
|
383
|
-
}
|
|
384
|
-
}
|
|
385
|
-
//# sourceMappingURL=increment-issue-builder.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"increment-issue-builder.js","sourceRoot":"","sources":["../../../../plugins/specweave-github/lib/increment-issue-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAmD7B,MAAM,OAAO,qBAAqB;IAIhC,YAAY,aAAqB,EAAE,WAAmB;QACpD,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;QAE1D,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,EAAE,CAAC,CAAC;QACtD,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAElD,2BAA2B;QAC3B,MAAM,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAChE,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACtD,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAyB,CAAC;QAC5E,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAErE,qBAAqB;QACrB,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC;QAExE,4BAA4B;QAC5B,MAAM,gBAAgB,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;QAE/E,uBAAuB;QACvB,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QAEzD,uBAAuB;QACvB,MAAM,iBAAiB,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QAC3E,MAAM,UAAU,GAAG,iBAAiB;aACjC,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;aACpC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAEjD,8BAA8B;QAC9B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAExC,OAAO;YACL,WAAW;YACX,KAAK;YACL,gBAAgB;YAChB,WAAW;YACX,KAAK;YACL,UAAU;SACX,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,YAAY;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;QAE5D,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACnD,MAAM,KAAK,GAAW,EAAE,CAAC;YAEzB,0CAA0C;YAC1C,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YAEpD,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;gBAC/B,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;gBACzD,IAAI,CAAC,WAAW;oBAAE,SAAS;gBAE3B,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;gBAC1B,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAEpC,uEAAuE;gBACvE,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;gBAClE,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;gBAE7E,+EAA+E;gBAC/E,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;gBACtE,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;gBAE1E,IAAI,WAAW,GAAa,EAAE,CAAC;gBAC/B,IAAI,cAAc,EAAE,CAAC;oBACnB,WAAW,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBAChE,CAAC;qBAAM,IAAI,cAAc,EAAE,CAAC;oBAC1B,kDAAkD;oBAClD,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;oBAC9D,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;oBAChC,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;wBACvB,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;wBACzC,IAAI,OAAO,EAAE,CAAC;4BACZ,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;wBACxB,CAAC;oBACH,CAAC;oBACD,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClC,CAAC;gBAED,mBAAmB;gBACnB,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;gBAChE,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAE9D,KAAK,CAAC,IAAI,CAAC;oBACT,EAAE;oBACF,KAAK;oBACL,SAAS;oBACT,WAAW;oBACX,QAAQ;iBACT,CAAC,CAAC;YACL,CAAC;YAED,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,OAAe,EAAE,OAAe;QACrD,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,SAAS,OAAO,mCAAmC,EAAE,GAAG,CAAC,CAAC;QACnF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACnC,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACtC,CAAC;IAED;;OAEG;IACK,kBAAkB,CAAC,OAAe;QACxC,MAAM,OAAO,GAAgB,EAAE,CAAC;QAEhC,4BAA4B;QAC5B,MAAM,kBAAkB,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QACxE,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACxB,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,8BAA8B;QAC9B,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAEjE,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;YAChC,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;YAC1D,IAAI,CAAC,WAAW;gBAAE,SAAS;YAE3B,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAC1B,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAEpC,8BAA8B;YAC9B,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YACzD,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAC7D,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAE/D,8BAA8B;YAC9B,MAAM,kBAAkB,GAAG,IAAI,CAAC,yBAAyB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAErE,OAAO,CAAC,IAAI,CAAC;gBACX,EAAE;gBACF,KAAK;gBACL,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;gBACzD,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;gBAC/D,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;gBACnE,kBAAkB;aACnB,CAAC,CAAC;QACL,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACK,yBAAyB,CAAC,KAAa,EAAE,WAAmB;QAClE,MAAM,QAAQ,GAA0B,EAAE,CAAC;QAE3C,gFAAgF;QAChF,MAAM,SAAS,GAAG,qDAAqD,CAAC;QAExE,IAAI,KAAK,CAAC;QACV,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAChD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC;YACjD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACvB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACvB,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAEpC,QAAQ,CAAC,IAAI,CAAC;gBACZ,EAAE,EAAE,MAAM,KAAK,IAAI,KAAK,EAAE;gBAC1B,WAAW;gBACX,SAAS;aACV,CAAC,CAAC;QACL,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,mBAAmB,CACjB,KAAgB,EAChB,aAA4B,EAC5B,UAAmB;QAEnB,MAAM,SAAS,GAAG,aAAa,CAAC,WAAW,CAAC,UAAU,IAAI,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;QAChG,MAAM,WAAW,GAAG,aAAa,CAAC,WAAW,CAAC,SAAS,CAAC;QAExD,kDAAkD;QAClD,MAAM,KAAK,GAAG,IAAI,SAAS,KAAK,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC;QAE3D,aAAa;QACb,IAAI,IAAI,GAAG,EAAE,CAAC;QAEd,yDAAyD;QACzD,8DAA8D;QAC9D,wEAAwE;QACxE,sGAAsG;QAEtG,kEAAkE;QAClE,MAAM,YAAY,GAAG,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;QAChF,MAAM,QAAQ,GAAG,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC;QACjD,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAChD,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CACtE,CAAC;QACF,MAAM,cAAc,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;QAClE,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC;QACrC,MAAM,iBAAiB,GAAG,CAAC,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC;YACnD,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,GAAG,cAAc,CAAC,GAAG,CAAC,QAAQ,GAAG,UAAU,CAAC,CAAC,GAAG,GAAG,CAAC;YAC/E,CAAC,CAAC,CAAC,CAAC;QAEN,IAAI,IAAI,iBAAiB,CAAC;QAC1B,IAAI,IAAI,4BAA4B,YAAY,IAAI,QAAQ,KAAK,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,GAAG,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACtI,IAAI,IAAI,cAAc,cAAc,IAAI,UAAU,KAAK,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,cAAc,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAClI,IAAI,IAAI,gBAAgB,iBAAiB,OAAO,CAAC;QAEjD,eAAe;QACf,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC;QACvD,MAAM,WAAW,GAAG,EAAE,GAAG,YAAY,CAAC;QACtC,IAAI,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,iBAAiB,OAAO,CAAC;QAC1F,IAAI,IAAI,SAAS,CAAC;QAElB,yBAAyB;QACzB,IAAI,IAAI,mBAAmB,CAAC;QAC5B,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YAC7C,IAAI,IAAI,YAAY,KAAK,CAAC,GAAG,IAAI,CAAC;YAClC,IAAI,IAAI,cAAc,KAAK,CAAC,KAAK,IAAI,CAAC;YACtC,IAAI,IAAI,eAAe,KAAK,CAAC,MAAM,MAAM,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,IAAI,IAAI,GAAG,KAAK,CAAC,KAAK,MAAM,CAAC;QAC/B,CAAC;QAED,IAAI,IAAI,SAAS,CAAC;QAElB,mCAAmC;QACnC,IAAI,IAAI,4BAA4B,CAAC;QACrC,IAAI,KAAK,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxC,MAAM,SAAS,GAAG,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;YAC7E,MAAM,KAAK,GAAG,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC;YAC9C,MAAM,UAAU,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACzE,IAAI,IAAI,aAAa,SAAS,IAAI,KAAK,kBAAkB,UAAU,QAAQ,CAAC;YAE5E,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,kBAAkB,EAAE,CAAC;gBAC1C,MAAM,QAAQ,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;gBAC9C,IAAI,IAAI,KAAK,QAAQ,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,WAAW,IAAI,CAAC;YAC5D,CAAC;YACD,IAAI,IAAI,IAAI,CAAC;QACf,CAAC;aAAM,CAAC;YACN,IAAI,IAAI,sCAAsC,CAAC;QACjD,CAAC;QAED,IAAI,IAAI,SAAS,CAAC;QAElB,4EAA4E;QAC5E,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,IAAI,IAAI,cAAc,CAAC;YACvB,MAAM,cAAc,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;YAClE,IAAI,IAAI,aAAa,cAAc,IAAI,UAAU,CAAC,MAAM,YAAY,CAAC;YAErE,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;gBAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;gBAChD,IAAI,IAAI,KAAK,QAAQ,MAAM,IAAI,CAAC,EAAE,OAAO,IAAI,CAAC,KAAK,IAAI,CAAC;YAC1D,CAAC;YACD,IAAI,IAAI,WAAW,CAAC;QACtB,CAAC;QAED,oBAAoB;QACpB,IAAI,IAAI,uBAAuB,CAAC;QAChC,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,IAAI,mBAAmB,WAAW,wBAAwB,UAAU,uCAAuC,WAAW,OAAO,CAAC;QACpI,CAAC;aAAM,CAAC;YACN,IAAI,IAAI,kBAAkB,WAAW,MAAM,CAAC;QAC9C,CAAC;QAED,IAAI,IAAI,SAAS,CAAC;QAClB,IAAI,IAAI,4CAA4C,CAAC;QAErD,SAAS;QACT,MAAM,MAAM,GAAG,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAE3C,8BAA8B;QAC9B,IAAI,aAAa,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,mDAAmD;QACnD,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,aAAa,CAAC,WAAW,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,IAAI,CAAC;QAC5G,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEtB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,mBAAmB,CACjB,aAA4B,EAC5B,UAAmB;QAEnB,MAAM,SAAS,GAAG,aAAa,CAAC,WAAW,CAAC,UAAU,IAAI,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;QAChG,MAAM,WAAW,GAAG,aAAa,CAAC,WAAW,CAAC,SAAS,CAAC;QAExD,yCAAyC;QACzC,MAAM,KAAK,GAAG,IAAI,SAAS,KAAK,aAAa,CAAC,KAAK,EAAE,CAAC;QAEtD,aAAa;QACb,IAAI,IAAI,GAAG,EAAE,CAAC;QAEd,uBAAuB;QACvB,IAAI,IAAI,kBAAkB,WAAW,IAAI,CAAC;QAC1C,IAAI,IAAI,eAAe,aAAa,CAAC,WAAW,CAAC,MAAM,IAAI,UAAU,IAAI,CAAC;QAC1E,IAAI,IAAI,+BAA+B,CAAC;QAExC,qBAAqB;QACrB,MAAM,QAAQ,GAAG,aAAa,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACtG,MAAM,YAAY,GAAG,aAAa,CAAC,WAAW,CAAC,MAAM,CACnD,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC,CAC9E,CAAC;QACF,MAAM,UAAU,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,GAAG,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClF,IAAI,IAAI,iBAAiB,YAAY,IAAI,QAAQ,SAAS,UAAU,MAAM,CAAC;QAE3E,IAAI,IAAI,WAAW,CAAC;QAEpB,WAAW;QACX,IAAI,IAAI,iBAAiB,CAAC;QAC1B,IAAI,IAAI,aAAa,CAAC,gBAAgB,IAAI,aAAa,CAAC,KAAK,CAAC;QAC9D,IAAI,IAAI,aAAa,CAAC;QAEtB,wBAAwB;QACxB,IAAI,IAAI,qBAAqB,CAAC;QAC9B,KAAK,MAAM,KAAK,IAAI,aAAa,CAAC,WAAW,EAAE,CAAC;YAC9C,MAAM,WAAW,GAAG,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;YAC/E,MAAM,OAAO,GAAG,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC;YAChD,MAAM,UAAU,GAAG,WAAW,KAAK,OAAO,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;YAE1E,IAAI,IAAI,OAAO,UAAU,IAAI,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,KAAK,MAAM,CAAC;YAE5D,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC7C,IAAI,IAAI,cAAc,KAAK,CAAC,GAAG,gBAAgB,KAAK,CAAC,KAAK,iBAAiB,KAAK,CAAC,MAAM,MAAM,CAAC;YAChG,CAAC;YAED,IAAI,IAAI,4BAA4B,CAAC;YACrC,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,kBAAkB,EAAE,CAAC;gBAC1C,MAAM,QAAQ,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;gBAC9C,IAAI,IAAI,KAAK,QAAQ,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,WAAW,IAAI,CAAC;YAC5D,CAAC;YACD,IAAI,IAAI,IAAI,CAAC;QACf,CAAC;QAED,IAAI,IAAI,SAAS,CAAC;QAElB,gBAAgB;QAChB,IAAI,aAAa,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnC,IAAI,IAAI,cAAc,CAAC;YACvB,MAAM,cAAc,GAAG,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;YAC3E,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC;YAC9C,MAAM,cAAc,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,cAAc,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5F,IAAI,IAAI,aAAa,cAAc,IAAI,UAAU,WAAW,cAAc,QAAQ,CAAC;YAEnF,KAAK,MAAM,IAAI,IAAI,aAAa,CAAC,KAAK,EAAE,CAAC;gBACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;gBAChD,IAAI,IAAI,KAAK,QAAQ,MAAM,IAAI,CAAC,EAAE,OAAO,IAAI,CAAC,KAAK,IAAI,CAAC;gBACxD,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACjD,MAAM,KAAK,GAAa,EAAE,CAAC;oBAC3B,IAAI,IAAI,CAAC,QAAQ;wBAAE,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;oBAC5D,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;wBAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBAC3I,IAAI,IAAI,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;gBACvC,CAAC;YACH,CAAC;YACD,IAAI,IAAI,WAAW,CAAC;QACtB,CAAC;QAED,2BAA2B;QAC3B,IAAI,IAAI,4BAA4B,CAAC;QACrC,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,IAAI,gDAAgD,UAAU,uCAAuC,WAAW,aAAa,CAAC;YAClI,IAAI,IAAI,gDAAgD,UAAU,uCAAuC,WAAW,aAAa,CAAC;YAClI,IAAI,IAAI,kDAAkD,UAAU,uCAAuC,WAAW,cAAc,CAAC;QACvI,CAAC;aAAM,CAAC;YACN,IAAI,IAAI,2BAA2B,CAAC;YACpC,IAAI,IAAI,2BAA2B,CAAC;YACpC,IAAI,IAAI,6BAA6B,CAAC;QACxC,CAAC;QAED,IAAI,IAAI,WAAW,CAAC;QACpB,IAAI,IAAI,4CAA4C,CAAC;QAErD,SAAS;QACT,MAAM,MAAM,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAE1C,6DAA6D;QAC7D,MAAM,SAAS,GAAG,aAAa,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,aAAa,CAAC;QACjF,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAEvB,wDAAwD;QACxD,MAAM,QAAQ,GAAG,aAAa,CAAC,WAAW,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,IAAI,CAAC;QAC3E,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEtB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACjC,CAAC;IAED;;;OAGG;IACK,iBAAiB,CAAC,aAA4B;QACpD,kCAAkC;QAClC,MAAM,YAAY,GAAG,aAAa,CAAC,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9E,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;QAC/C,CAAC;QAED,yBAAyB;QACzB,MAAM,OAAO,GAAG,aAAa,CAAC,WAAW,CAAC,OAAO,CAAC;QAClD,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YACxD,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3D,CAAC;QACH,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;CACF"}
|