specweave 0.17.6 → 0.17.8
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 +365 -9
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.d.ts +9 -4
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.d.ts.map +1 -1
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.js +82 -12
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-spec-content-sync.d.ts +2 -2
- package/dist/plugins/specweave-github/lib/github-spec-content-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-spec-content-sync.js +69 -10
- package/dist/plugins/specweave-github/lib/github-spec-content-sync.js.map +1 -1
- package/dist/src/cli/commands/detect-project.d.ts +9 -0
- package/dist/src/cli/commands/detect-project.d.ts.map +1 -0
- package/dist/src/cli/commands/detect-project.js +85 -0
- package/dist/src/cli/commands/detect-project.js.map +1 -0
- package/dist/src/cli/commands/detect-specs.d.ts +9 -0
- package/dist/src/cli/commands/detect-specs.d.ts.map +1 -0
- package/dist/src/cli/commands/detect-specs.js +73 -0
- package/dist/src/cli/commands/detect-specs.js.map +1 -0
- package/dist/src/cli/commands/init.d.ts.map +1 -1
- package/dist/src/cli/commands/init.js +8 -15
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/core/living-docs/content-classifier.d.ts +83 -0
- package/dist/src/core/living-docs/content-classifier.d.ts.map +1 -0
- package/dist/src/core/living-docs/content-classifier.js +393 -0
- package/dist/src/core/living-docs/content-classifier.js.map +1 -0
- package/dist/src/core/living-docs/content-distributor.d.ts +126 -0
- package/dist/src/core/living-docs/content-distributor.d.ts.map +1 -0
- package/dist/src/core/living-docs/content-distributor.js +339 -0
- package/dist/src/core/living-docs/content-distributor.js.map +1 -0
- package/dist/src/core/living-docs/content-parser.d.ts +140 -0
- package/dist/src/core/living-docs/content-parser.d.ts.map +1 -0
- package/dist/src/core/living-docs/content-parser.js +316 -0
- package/dist/src/core/living-docs/content-parser.js.map +1 -0
- package/dist/src/core/living-docs/cross-linker.d.ts +126 -0
- package/dist/src/core/living-docs/cross-linker.d.ts.map +1 -0
- package/dist/src/core/living-docs/cross-linker.js +374 -0
- package/dist/src/core/living-docs/cross-linker.js.map +1 -0
- package/dist/src/core/living-docs/index.d.ts +89 -0
- package/dist/src/core/living-docs/index.d.ts.map +1 -0
- package/dist/src/core/living-docs/index.js +169 -0
- package/dist/src/core/living-docs/index.js.map +1 -0
- package/dist/src/core/living-docs/project-detector.d.ts +103 -0
- package/dist/src/core/living-docs/project-detector.d.ts.map +1 -0
- package/dist/src/core/living-docs/project-detector.js +314 -0
- package/dist/src/core/living-docs/project-detector.js.map +1 -0
- package/dist/src/core/repo-structure/prompt-consolidator.d.ts +1 -1
- package/dist/src/core/repo-structure/prompt-consolidator.d.ts.map +1 -1
- package/dist/src/core/repo-structure/prompt-consolidator.js +51 -22
- package/dist/src/core/repo-structure/prompt-consolidator.js.map +1 -1
- package/dist/src/core/repo-structure/repo-structure-manager.d.ts +2 -0
- package/dist/src/core/repo-structure/repo-structure-manager.d.ts.map +1 -1
- package/dist/src/core/repo-structure/repo-structure-manager.js +126 -62
- package/dist/src/core/repo-structure/repo-structure-manager.js.map +1 -1
- package/dist/src/core/spec-content-sync.d.ts +6 -0
- package/dist/src/core/spec-content-sync.d.ts.map +1 -1
- package/dist/src/core/spec-content-sync.js +25 -7
- package/dist/src/core/spec-content-sync.js.map +1 -1
- package/dist/src/core/spec-detector.d.ts +54 -0
- package/dist/src/core/spec-detector.d.ts.map +1 -0
- package/dist/src/core/spec-detector.js +197 -0
- package/dist/src/core/spec-detector.js.map +1 -0
- package/dist/src/core/spec-identifier-detector.d.ts +49 -0
- package/dist/src/core/spec-identifier-detector.d.ts.map +1 -0
- package/dist/src/core/spec-identifier-detector.js +198 -0
- package/dist/src/core/spec-identifier-detector.js.map +1 -0
- package/dist/src/core/types/spec-identifier.d.ts +67 -0
- package/dist/src/core/types/spec-identifier.d.ts.map +1 -0
- package/dist/src/core/types/spec-identifier.js +23 -0
- package/dist/src/core/types/spec-identifier.js.map +1 -0
- package/dist/src/utils/docs-preview/config-generator.d.ts.map +1 -1
- package/dist/src/utils/docs-preview/config-generator.js +11 -0
- package/dist/src/utils/docs-preview/config-generator.js.map +1 -1
- package/package.json +2 -1
- package/plugins/specweave/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave/lib/hooks/sync-living-docs.js +61 -5
- package/plugins/specweave/lib/hooks/sync-living-docs.ts +102 -13
- package/plugins/specweave-ado/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-docs-preview/commands/preview.md +11 -11
- package/plugins/specweave-github/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-github/hooks/post-task-completion.sh +59 -30
- package/plugins/specweave-github/lib/github-spec-content-sync.js +55 -6
- package/plugins/specweave-github/lib/github-spec-content-sync.ts +84 -12
- package/plugins/specweave-jira/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-mobile/.claude-plugin/plugin.json +1 -4
- package/plugins/specweave-release/.claude-plugin/plugin.json +3 -15
- package/src/templates/AGENTS.md.template +297 -0
- package/dist/locales/de/.gitkeep +0 -0
- package/dist/locales/de/cli.json +0 -108
- package/dist/locales/en/cli.json +0 -287
- package/dist/locales/en/errors.json +0 -7
- package/dist/locales/en/templates.json +0 -6
- package/dist/locales/es/.gitkeep +0 -0
- package/dist/locales/es/cli.json +0 -41
- package/dist/locales/fr/.gitkeep +0 -0
- package/dist/locales/fr/cli.json +0 -108
- package/dist/locales/ja/.gitkeep +0 -0
- package/dist/locales/ja/cli.json +0 -108
- package/dist/locales/ko/.gitkeep +0 -0
- package/dist/locales/ko/cli.json +0 -108
- package/dist/locales/pt/.gitkeep +0 -0
- package/dist/locales/pt/cli.json +0 -108
- package/dist/locales/ru/.gitkeep +0 -0
- package/dist/locales/ru/cli.json +0 -269
- package/dist/locales/zh/.gitkeep +0 -0
- package/dist/locales/zh/cli.json +0 -108
- package/plugins/specweave/plugin.json +0 -22
- package/plugins/specweave-ado/plugin.json +0 -20
- package/plugins/specweave-github/plugin.json +0 -19
- package/plugins/specweave-jira/plugin.json +0 -20
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Content Parser for Intelligent Living Docs Sync
|
|
3
|
+
*
|
|
4
|
+
* Parses increment spec.md into structured sections for classification and distribution.
|
|
5
|
+
*
|
|
6
|
+
* @module living-docs/content-parser
|
|
7
|
+
*/
|
|
8
|
+
import matter from 'gray-matter';
|
|
9
|
+
/**
|
|
10
|
+
* Content Parser class
|
|
11
|
+
*/
|
|
12
|
+
export class ContentParser {
|
|
13
|
+
constructor(options = {}) {
|
|
14
|
+
this.options = {
|
|
15
|
+
preserveCodeBlocks: options.preserveCodeBlocks ?? true,
|
|
16
|
+
preserveLinks: options.preserveLinks ?? true,
|
|
17
|
+
preserveImages: options.preserveImages ?? true,
|
|
18
|
+
maxDepth: options.maxDepth ?? 6,
|
|
19
|
+
includeRawContent: options.includeRawContent ?? true,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Parse markdown content into structured sections
|
|
24
|
+
*/
|
|
25
|
+
parse(markdown, filePath) {
|
|
26
|
+
// 1. Extract frontmatter
|
|
27
|
+
const { data: frontmatter, content } = matter(markdown);
|
|
28
|
+
// 2. Split into lines for line number tracking
|
|
29
|
+
const lines = content.split('\n');
|
|
30
|
+
// 3. Parse sections
|
|
31
|
+
const sections = this.parseSections(lines, 0, lines.length);
|
|
32
|
+
return {
|
|
33
|
+
frontmatter,
|
|
34
|
+
sections,
|
|
35
|
+
raw: markdown,
|
|
36
|
+
filePath,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Parse sections from lines array (recursive for nested sections)
|
|
41
|
+
*/
|
|
42
|
+
parseSections(lines, startIndex, endIndex, parentLevel = 0) {
|
|
43
|
+
const sections = [];
|
|
44
|
+
let currentSection = null;
|
|
45
|
+
let sectionContentLines = [];
|
|
46
|
+
let currentLine = startIndex;
|
|
47
|
+
while (currentLine < endIndex) {
|
|
48
|
+
const line = lines[currentLine];
|
|
49
|
+
const headingMatch = line.match(/^(#{1,6})\s+(.+)$/);
|
|
50
|
+
if (headingMatch) {
|
|
51
|
+
const level = headingMatch[1].length;
|
|
52
|
+
// Only process headings at or below max depth
|
|
53
|
+
if (level <= this.options.maxDepth) {
|
|
54
|
+
// Save previous section
|
|
55
|
+
if (currentSection) {
|
|
56
|
+
currentSection.content = sectionContentLines.join('\n').trim();
|
|
57
|
+
currentSection.endLine = currentLine - 1;
|
|
58
|
+
// Parse content elements
|
|
59
|
+
if (this.options.preserveCodeBlocks) {
|
|
60
|
+
currentSection.codeBlocks = this.extractCodeBlocks(currentSection.content);
|
|
61
|
+
}
|
|
62
|
+
if (this.options.preserveLinks) {
|
|
63
|
+
currentSection.links = this.extractLinks(currentSection.content);
|
|
64
|
+
}
|
|
65
|
+
if (this.options.preserveImages) {
|
|
66
|
+
currentSection.images = this.extractImages(currentSection.content);
|
|
67
|
+
}
|
|
68
|
+
sections.push(currentSection);
|
|
69
|
+
}
|
|
70
|
+
// Start new section
|
|
71
|
+
const heading = headingMatch[2].trim();
|
|
72
|
+
currentSection = {
|
|
73
|
+
id: this.slugify(heading),
|
|
74
|
+
heading,
|
|
75
|
+
level,
|
|
76
|
+
content: '',
|
|
77
|
+
rawContent: '',
|
|
78
|
+
codeBlocks: [],
|
|
79
|
+
links: [],
|
|
80
|
+
images: [],
|
|
81
|
+
startLine: currentLine,
|
|
82
|
+
endLine: currentLine,
|
|
83
|
+
children: [],
|
|
84
|
+
};
|
|
85
|
+
sectionContentLines = [];
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
else if (currentSection) {
|
|
89
|
+
// Add line to current section content
|
|
90
|
+
sectionContentLines.push(line);
|
|
91
|
+
}
|
|
92
|
+
currentLine++;
|
|
93
|
+
}
|
|
94
|
+
// Save last section
|
|
95
|
+
if (currentSection) {
|
|
96
|
+
currentSection.content = sectionContentLines.join('\n').trim();
|
|
97
|
+
currentSection.endLine = endIndex - 1;
|
|
98
|
+
if (this.options.preserveCodeBlocks) {
|
|
99
|
+
currentSection.codeBlocks = this.extractCodeBlocks(currentSection.content);
|
|
100
|
+
}
|
|
101
|
+
if (this.options.preserveLinks) {
|
|
102
|
+
currentSection.links = this.extractLinks(currentSection.content);
|
|
103
|
+
}
|
|
104
|
+
if (this.options.preserveImages) {
|
|
105
|
+
currentSection.images = this.extractImages(currentSection.content);
|
|
106
|
+
}
|
|
107
|
+
sections.push(currentSection);
|
|
108
|
+
}
|
|
109
|
+
// Build hierarchy (nest sub-sections)
|
|
110
|
+
return this.buildHierarchy(sections);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Build section hierarchy (nest sub-sections under parent sections)
|
|
114
|
+
*/
|
|
115
|
+
buildHierarchy(sections) {
|
|
116
|
+
const result = [];
|
|
117
|
+
const stack = [];
|
|
118
|
+
for (const section of sections) {
|
|
119
|
+
// Pop stack until we find a parent with lower level
|
|
120
|
+
while (stack.length > 0 && stack[stack.length - 1].level >= section.level) {
|
|
121
|
+
stack.pop();
|
|
122
|
+
}
|
|
123
|
+
if (stack.length === 0) {
|
|
124
|
+
// Top-level section
|
|
125
|
+
result.push(section);
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
// Nested section - add to parent
|
|
129
|
+
const parent = stack[stack.length - 1];
|
|
130
|
+
parent.children.push(section);
|
|
131
|
+
}
|
|
132
|
+
stack.push(section);
|
|
133
|
+
}
|
|
134
|
+
// Set raw content for each section (including children)
|
|
135
|
+
this.setRawContent(result);
|
|
136
|
+
return result;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Set raw content for sections (including nested children)
|
|
140
|
+
*/
|
|
141
|
+
setRawContent(sections) {
|
|
142
|
+
for (const section of sections) {
|
|
143
|
+
if (this.options.includeRawContent) {
|
|
144
|
+
section.rawContent = this.generateRawContent(section);
|
|
145
|
+
}
|
|
146
|
+
if (section.children.length > 0) {
|
|
147
|
+
this.setRawContent(section.children);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Generate raw content for a section (including nested children)
|
|
153
|
+
*/
|
|
154
|
+
generateRawContent(section) {
|
|
155
|
+
let content = `${'#'.repeat(section.level)} ${section.heading}\n\n`;
|
|
156
|
+
content += section.content;
|
|
157
|
+
for (const child of section.children) {
|
|
158
|
+
content += '\n\n' + this.generateRawContent(child);
|
|
159
|
+
}
|
|
160
|
+
return content;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Extract code blocks from content
|
|
164
|
+
*/
|
|
165
|
+
extractCodeBlocks(content) {
|
|
166
|
+
const codeBlocks = [];
|
|
167
|
+
const lines = content.split('\n');
|
|
168
|
+
let inCodeBlock = false;
|
|
169
|
+
let currentBlock = null;
|
|
170
|
+
lines.forEach((line, index) => {
|
|
171
|
+
const codeBlockStart = line.match(/^```(\w*)/);
|
|
172
|
+
const codeBlockEnd = line.match(/^```\s*$/);
|
|
173
|
+
if (codeBlockStart && !inCodeBlock) {
|
|
174
|
+
inCodeBlock = true;
|
|
175
|
+
currentBlock = {
|
|
176
|
+
language: codeBlockStart[1] || 'text',
|
|
177
|
+
lines: [],
|
|
178
|
+
startLine: index,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
else if (codeBlockEnd && inCodeBlock && currentBlock) {
|
|
182
|
+
inCodeBlock = false;
|
|
183
|
+
codeBlocks.push({
|
|
184
|
+
language: currentBlock.language,
|
|
185
|
+
content: currentBlock.lines.join('\n'),
|
|
186
|
+
startLine: currentBlock.startLine,
|
|
187
|
+
endLine: index,
|
|
188
|
+
});
|
|
189
|
+
currentBlock = null;
|
|
190
|
+
}
|
|
191
|
+
else if (inCodeBlock && currentBlock) {
|
|
192
|
+
currentBlock.lines.push(line);
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
return codeBlocks;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Extract links from content
|
|
199
|
+
*/
|
|
200
|
+
extractLinks(content) {
|
|
201
|
+
const links = [];
|
|
202
|
+
// Markdown links: [text](url)
|
|
203
|
+
const markdownLinkRegex = /\[([^\]]+)\]\(([^)]+)\)/g;
|
|
204
|
+
let match;
|
|
205
|
+
while ((match = markdownLinkRegex.exec(content)) !== null) {
|
|
206
|
+
const [, text, url] = match;
|
|
207
|
+
links.push({
|
|
208
|
+
text,
|
|
209
|
+
url,
|
|
210
|
+
type: this.determineLinkType(url),
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
return links;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Extract images from content
|
|
217
|
+
*/
|
|
218
|
+
extractImages(content) {
|
|
219
|
+
const images = [];
|
|
220
|
+
// Markdown images: 
|
|
221
|
+
const imageRegex = /!\[([^\]]*)\]\(([^)\s]+)(?:\s+"([^"]+)")?\)/g;
|
|
222
|
+
let match;
|
|
223
|
+
while ((match = imageRegex.exec(content)) !== null) {
|
|
224
|
+
const [, alt, url, title] = match;
|
|
225
|
+
images.push({
|
|
226
|
+
alt,
|
|
227
|
+
url,
|
|
228
|
+
title,
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
return images;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Determine link type (internal/external/anchor)
|
|
235
|
+
*/
|
|
236
|
+
determineLinkType(url) {
|
|
237
|
+
if (url.startsWith('#')) {
|
|
238
|
+
return 'anchor';
|
|
239
|
+
}
|
|
240
|
+
else if (url.startsWith('http://') || url.startsWith('https://')) {
|
|
241
|
+
return 'external';
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
return 'internal';
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Convert heading to URL-safe slug
|
|
249
|
+
*/
|
|
250
|
+
slugify(text) {
|
|
251
|
+
return text
|
|
252
|
+
.toLowerCase()
|
|
253
|
+
.replace(/[^\w\s-]/g, '') // Remove special characters
|
|
254
|
+
.replace(/\s+/g, '-') // Replace spaces with hyphens
|
|
255
|
+
.replace(/--+/g, '-') // Replace multiple hyphens with single
|
|
256
|
+
.trim();
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Find section by ID (recursive search)
|
|
260
|
+
*/
|
|
261
|
+
findSection(sections, id) {
|
|
262
|
+
for (const section of sections) {
|
|
263
|
+
if (section.id === id) {
|
|
264
|
+
return section;
|
|
265
|
+
}
|
|
266
|
+
if (section.children.length > 0) {
|
|
267
|
+
const found = this.findSection(section.children, id);
|
|
268
|
+
if (found)
|
|
269
|
+
return found;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
return null;
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Get all sections flattened (no hierarchy)
|
|
276
|
+
*/
|
|
277
|
+
flattenSections(sections) {
|
|
278
|
+
const result = [];
|
|
279
|
+
for (const section of sections) {
|
|
280
|
+
result.push(section);
|
|
281
|
+
if (section.children.length > 0) {
|
|
282
|
+
result.push(...this.flattenSections(section.children));
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
return result;
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Get sections by level
|
|
289
|
+
*/
|
|
290
|
+
getSectionsByLevel(sections, level) {
|
|
291
|
+
return this.flattenSections(sections).filter((s) => s.level === level);
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Get section content without code blocks
|
|
295
|
+
*/
|
|
296
|
+
getContentWithoutCode(section) {
|
|
297
|
+
let content = section.content;
|
|
298
|
+
// Remove code blocks
|
|
299
|
+
content = content.replace(/```[\s\S]*?```/g, '');
|
|
300
|
+
return content.trim();
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Factory function to create parser
|
|
305
|
+
*/
|
|
306
|
+
export function createContentParser(options) {
|
|
307
|
+
return new ContentParser(options);
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Convenience function to parse markdown
|
|
311
|
+
*/
|
|
312
|
+
export function parseMarkdown(markdown, options) {
|
|
313
|
+
const parser = new ContentParser(options);
|
|
314
|
+
return parser.parse(markdown);
|
|
315
|
+
}
|
|
316
|
+
//# sourceMappingURL=content-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-parser.js","sourceRoot":"","sources":["../../../../src/core/living-docs/content-parser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,MAAM,MAAM,aAAa,CAAC;AAqEjC;;GAEG;AACH,MAAM,OAAO,aAAa;IAGxB,YAAY,UAAyB,EAAE;QACrC,IAAI,CAAC,OAAO,GAAG;YACb,kBAAkB,EAAE,OAAO,CAAC,kBAAkB,IAAI,IAAI;YACtD,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,IAAI;YAC5C,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,IAAI;YAC9C,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,CAAC;YAC/B,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,IAAI,IAAI;SACrD,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAgB,EAAE,QAAiB;QACvC,yBAAyB;QACzB,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QAExD,+CAA+C;QAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAElC,oBAAoB;QACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAE5D,OAAO;YACL,WAAW;YACX,QAAQ;YACR,GAAG,EAAE,QAAQ;YACb,QAAQ;SACT,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,aAAa,CACnB,KAAe,EACf,UAAkB,EAClB,QAAgB,EAChB,cAAsB,CAAC;QAEvB,MAAM,QAAQ,GAAoB,EAAE,CAAC;QACrC,IAAI,cAAc,GAAyB,IAAI,CAAC;QAChD,IAAI,mBAAmB,GAAa,EAAE,CAAC;QACvC,IAAI,WAAW,GAAG,UAAU,CAAC;QAE7B,OAAO,WAAW,GAAG,QAAQ,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC;YAChC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;YAErD,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;gBAErC,8CAA8C;gBAC9C,IAAI,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACnC,wBAAwB;oBACxB,IAAI,cAAc,EAAE,CAAC;wBACnB,cAAc,CAAC,OAAO,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;wBAC/D,cAAc,CAAC,OAAO,GAAG,WAAW,GAAG,CAAC,CAAC;wBAEzC,yBAAyB;wBACzB,IAAI,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC;4BACpC,cAAc,CAAC,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;wBAC7E,CAAC;wBACD,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;4BAC/B,cAAc,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;wBACnE,CAAC;wBACD,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;4BAChC,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;wBACrE,CAAC;wBAED,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;oBAChC,CAAC;oBAED,oBAAoB;oBACpB,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBACvC,cAAc,GAAG;wBACf,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;wBACzB,OAAO;wBACP,KAAK;wBACL,OAAO,EAAE,EAAE;wBACX,UAAU,EAAE,EAAE;wBACd,UAAU,EAAE,EAAE;wBACd,KAAK,EAAE,EAAE;wBACT,MAAM,EAAE,EAAE;wBACV,SAAS,EAAE,WAAW;wBACtB,OAAO,EAAE,WAAW;wBACpB,QAAQ,EAAE,EAAE;qBACb,CAAC;oBACF,mBAAmB,GAAG,EAAE,CAAC;gBAC3B,CAAC;YACH,CAAC;iBAAM,IAAI,cAAc,EAAE,CAAC;gBAC1B,sCAAsC;gBACtC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjC,CAAC;YAED,WAAW,EAAE,CAAC;QAChB,CAAC;QAED,oBAAoB;QACpB,IAAI,cAAc,EAAE,CAAC;YACnB,cAAc,CAAC,OAAO,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;YAC/D,cAAc,CAAC,OAAO,GAAG,QAAQ,GAAG,CAAC,CAAC;YAEtC,IAAI,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC;gBACpC,cAAc,CAAC,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YAC7E,CAAC;YACD,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;gBAC/B,cAAc,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YACnE,CAAC;YACD,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;gBAChC,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YACrE,CAAC;YAED,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAChC,CAAC;QAED,sCAAsC;QACtC,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,QAAyB;QAC9C,MAAM,MAAM,GAAoB,EAAE,CAAC;QACnC,MAAM,KAAK,GAAoB,EAAE,CAAC;QAElC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,oDAAoD;YACpD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBAC1E,KAAK,CAAC,GAAG,EAAE,CAAC;YACd,CAAC;YAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,oBAAoB;gBACpB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,iCAAiC;gBACjC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACvC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAChC,CAAC;YAED,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtB,CAAC;QAED,wDAAwD;QACxD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAE3B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,QAAyB;QAC7C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;gBACnC,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;YACxD,CAAC;YACD,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,kBAAkB,CAAC,OAAsB;QAC/C,IAAI,OAAO,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,OAAO,MAAM,CAAC;QACpE,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;QAE3B,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrC,OAAO,IAAI,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACrD,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,OAAe;QACvC,MAAM,UAAU,GAAgB,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,IAAI,YAAY,GAAoE,IAAI,CAAC;QAEzF,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YAC5B,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC/C,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAE5C,IAAI,cAAc,IAAI,CAAC,WAAW,EAAE,CAAC;gBACnC,WAAW,GAAG,IAAI,CAAC;gBACnB,YAAY,GAAG;oBACb,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,MAAM;oBACrC,KAAK,EAAE,EAAE;oBACT,SAAS,EAAE,KAAK;iBACjB,CAAC;YACJ,CAAC;iBAAM,IAAI,YAAY,IAAI,WAAW,IAAI,YAAY,EAAE,CAAC;gBACvD,WAAW,GAAG,KAAK,CAAC;gBACpB,UAAU,CAAC,IAAI,CAAC;oBACd,QAAQ,EAAE,YAAY,CAAC,QAAQ;oBAC/B,OAAO,EAAE,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;oBACtC,SAAS,EAAE,YAAY,CAAC,SAAS;oBACjC,OAAO,EAAE,KAAK;iBACf,CAAC,CAAC;gBACH,YAAY,GAAG,IAAI,CAAC;YACtB,CAAC;iBAAM,IAAI,WAAW,IAAI,YAAY,EAAE,CAAC;gBACvC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,OAAe;QAClC,MAAM,KAAK,GAAW,EAAE,CAAC;QAEzB,8BAA8B;QAC9B,MAAM,iBAAiB,GAAG,0BAA0B,CAAC;QACrD,IAAI,KAAK,CAAC;QAEV,OAAO,CAAC,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC1D,MAAM,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI;gBACJ,GAAG;gBACH,IAAI,EAAE,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC;aAClC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,OAAe;QACnC,MAAM,MAAM,GAAY,EAAE,CAAC;QAE3B,uCAAuC;QACvC,MAAM,UAAU,GAAG,8CAA8C,CAAC;QAClE,IAAI,KAAK,CAAC;QAEV,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACnD,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,KAAK,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC;gBACV,GAAG;gBACH,GAAG;gBACH,KAAK;aACN,CAAC,CAAC;QACL,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,GAAW;QACnC,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,OAAO,QAAQ,CAAC;QAClB,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACnE,OAAO,UAAU,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,OAAO,UAAU,CAAC;QACpB,CAAC;IACH,CAAC;IAED;;OAEG;IACK,OAAO,CAAC,IAAY;QAC1B,OAAO,IAAI;aACR,WAAW,EAAE;aACb,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,4BAA4B;aACrD,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAK,8BAA8B;aACvD,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAK,uCAAuC;aAChE,IAAI,EAAE,CAAC;IACZ,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,QAAyB,EAAE,EAAU;QAC/C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;gBACtB,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACrD,IAAI,KAAK;oBAAE,OAAO,KAAK,CAAC;YAC1B,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,QAAyB;QACvC,MAAM,MAAM,GAAoB,EAAE,CAAC;QAEnC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrB,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,QAAyB,EAAE,KAAa;QACzD,OAAO,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;IACzE,CAAC;IAED;;OAEG;IACH,qBAAqB,CAAC,OAAsB;QAC1C,IAAI,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAE9B,qBAAqB;QACrB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;QAEjD,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAuB;IACzD,OAAO,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,OAAuB;IACrE,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;IAC1C,OAAO,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-Linker for Intelligent Living Docs Sync
|
|
3
|
+
*
|
|
4
|
+
* Generates cross-references between related documents for traceability.
|
|
5
|
+
*
|
|
6
|
+
* @module living-docs/cross-linker
|
|
7
|
+
*/
|
|
8
|
+
import { DistributionResult } from './content-distributor.js';
|
|
9
|
+
/**
|
|
10
|
+
* Cross-link between documents
|
|
11
|
+
*/
|
|
12
|
+
export interface CrossLink {
|
|
13
|
+
source: string;
|
|
14
|
+
target: string;
|
|
15
|
+
type: LinkType;
|
|
16
|
+
description?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Link types
|
|
20
|
+
*/
|
|
21
|
+
export declare enum LinkType {
|
|
22
|
+
Implements = "implements",// Spec implements architecture
|
|
23
|
+
DependsOn = "depends-on",// Operation depends on architecture
|
|
24
|
+
References = "references",// General reference
|
|
25
|
+
RelatedTo = "related-to",// Related content
|
|
26
|
+
DefinedIn = "defined-in",// Term/concept defined in another doc
|
|
27
|
+
TestsFor = "tests-for"
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Linker options
|
|
31
|
+
*/
|
|
32
|
+
export interface LinkerOptions {
|
|
33
|
+
basePath?: string;
|
|
34
|
+
generateBacklinks?: boolean;
|
|
35
|
+
updateExisting?: boolean;
|
|
36
|
+
dryRun?: boolean;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Cross-Linker class
|
|
40
|
+
*/
|
|
41
|
+
export declare class CrossLinker {
|
|
42
|
+
private options;
|
|
43
|
+
private links;
|
|
44
|
+
constructor(options?: LinkerOptions);
|
|
45
|
+
/**
|
|
46
|
+
* Generate cross-links for distributed files
|
|
47
|
+
*/
|
|
48
|
+
generateLinks(result: DistributionResult): Promise<CrossLink[]>;
|
|
49
|
+
/**
|
|
50
|
+
* Group files by category
|
|
51
|
+
*/
|
|
52
|
+
private groupByCategory;
|
|
53
|
+
/**
|
|
54
|
+
* Generate links from specs to architecture
|
|
55
|
+
*/
|
|
56
|
+
private generateArchitectureLinks;
|
|
57
|
+
/**
|
|
58
|
+
* Generate links from operations to architecture
|
|
59
|
+
*/
|
|
60
|
+
private generateOperationsLinks;
|
|
61
|
+
/**
|
|
62
|
+
* Generate links from delivery to specs
|
|
63
|
+
*/
|
|
64
|
+
private generateDeliveryLinks;
|
|
65
|
+
/**
|
|
66
|
+
* Generate links from strategy to specs
|
|
67
|
+
*/
|
|
68
|
+
private generateStrategyLinks;
|
|
69
|
+
/**
|
|
70
|
+
* Check if two documents are related (heuristic)
|
|
71
|
+
*/
|
|
72
|
+
private documentsRelated;
|
|
73
|
+
/**
|
|
74
|
+
* Generate backlinks (bidirectional)
|
|
75
|
+
*/
|
|
76
|
+
private generateBacklinks;
|
|
77
|
+
/**
|
|
78
|
+
* Get reverse link type
|
|
79
|
+
*/
|
|
80
|
+
private getReverseType;
|
|
81
|
+
/**
|
|
82
|
+
* Get reverse description
|
|
83
|
+
*/
|
|
84
|
+
private getReverseDescription;
|
|
85
|
+
/**
|
|
86
|
+
* Update documents with generated links
|
|
87
|
+
*/
|
|
88
|
+
private updateDocuments;
|
|
89
|
+
/**
|
|
90
|
+
* Update a single document with links
|
|
91
|
+
*/
|
|
92
|
+
private updateDocument;
|
|
93
|
+
/**
|
|
94
|
+
* Generate markdown for links section
|
|
95
|
+
*/
|
|
96
|
+
private generateLinksMarkdown;
|
|
97
|
+
/**
|
|
98
|
+
* Get link type display title
|
|
99
|
+
*/
|
|
100
|
+
private getLinkTypeTitle;
|
|
101
|
+
/**
|
|
102
|
+
* Get relative path from source to target
|
|
103
|
+
*/
|
|
104
|
+
private getRelativePath;
|
|
105
|
+
/**
|
|
106
|
+
* Get all links
|
|
107
|
+
*/
|
|
108
|
+
getLinks(): CrossLink[];
|
|
109
|
+
/**
|
|
110
|
+
* Get links for a specific file
|
|
111
|
+
*/
|
|
112
|
+
getLinksFor(filePath: string): CrossLink[];
|
|
113
|
+
/**
|
|
114
|
+
* Get statistics
|
|
115
|
+
*/
|
|
116
|
+
getStatistics(): {
|
|
117
|
+
total: number;
|
|
118
|
+
byType: Record<LinkType, number>;
|
|
119
|
+
bidirectional: number;
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Factory function to create linker
|
|
124
|
+
*/
|
|
125
|
+
export declare function createCrossLinker(options?: LinkerOptions): CrossLinker;
|
|
126
|
+
//# sourceMappingURL=cross-linker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cross-linker.d.ts","sourceRoot":"","sources":["../../../../src/core/living-docs/cross-linker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,kBAAkB,EAAmB,MAAM,0BAA0B,CAAC;AAG/E;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,oBAAY,QAAQ;IAClB,UAAU,eAAe,CAAO,+BAA+B;IAC/D,SAAS,eAAe,CAAQ,oCAAoC;IACpE,UAAU,eAAe,CAAO,oBAAoB;IACpD,SAAS,eAAe,CAAQ,kBAAkB;IAClD,SAAS,eAAe,CAAQ,sCAAsC;IACtE,QAAQ,cAAc;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,KAAK,CAAc;gBAEf,OAAO,GAAE,aAAkB;IAYvC;;OAEG;IACG,aAAa,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAyBrE;;OAEG;IACH,OAAO,CAAC,eAAe;IAgBvB;;OAEG;YACW,yBAAyB;IAkCvC;;OAEG;YACW,uBAAuB;IAoBrC;;OAEG;YACW,qBAAqB;IAoBnC;;OAEG;YACW,qBAAqB;IAoBnC;;OAEG;YACW,gBAAgB;IAyC9B;;OAEG;YACW,iBAAiB;IAgB/B;;OAEG;IACH,OAAO,CAAC,cAAc;IAatB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAK7B;;OAEG;YACW,eAAe;IAiB7B;;OAEG;YACW,cAAc;IAoC5B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAgC7B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAaxB;;OAEG;IACH,OAAO,CAAC,eAAe;IAKvB;;OAEG;IACH,QAAQ,IAAI,SAAS,EAAE;IAIvB;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE;IAI1C;;OAEG;IACH,aAAa,IAAI;QACf,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACjC,aAAa,EAAE,MAAM,CAAC;KACvB;CAkBF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,WAAW,CAEtE"}
|