@pennyfarthing/shared 7.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/dist/generate-skill-docs.d.ts +35 -0
  2. package/dist/generate-skill-docs.d.ts.map +1 -0
  3. package/dist/generate-skill-docs.js +442 -0
  4. package/dist/generate-skill-docs.js.map +1 -0
  5. package/dist/generate-skill-docs.test.d.ts +13 -0
  6. package/dist/generate-skill-docs.test.d.ts.map +1 -0
  7. package/dist/generate-skill-docs.test.js +519 -0
  8. package/dist/generate-skill-docs.test.js.map +1 -0
  9. package/dist/index.d.ts +10 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +10 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/portrait-resolver.d.ts +32 -0
  14. package/dist/portrait-resolver.d.ts.map +1 -0
  15. package/dist/portrait-resolver.js +147 -0
  16. package/dist/portrait-resolver.js.map +1 -0
  17. package/dist/portrait-resolver.test.d.ts +2 -0
  18. package/dist/portrait-resolver.test.d.ts.map +1 -0
  19. package/dist/portrait-resolver.test.js +156 -0
  20. package/dist/portrait-resolver.test.js.map +1 -0
  21. package/dist/skill-search.d.ts +36 -0
  22. package/dist/skill-search.d.ts.map +1 -0
  23. package/dist/skill-search.js +300 -0
  24. package/dist/skill-search.js.map +1 -0
  25. package/dist/skill-search.sh +41 -0
  26. package/dist/skill-search.test.d.ts +16 -0
  27. package/dist/skill-search.test.d.ts.map +1 -0
  28. package/dist/skill-search.test.js +193 -0
  29. package/dist/skill-search.test.js.map +1 -0
  30. package/dist/skill-suggest.d.ts +76 -0
  31. package/dist/skill-suggest.d.ts.map +1 -0
  32. package/dist/skill-suggest.js +256 -0
  33. package/dist/skill-suggest.js.map +1 -0
  34. package/dist/skill-suggest.test.d.ts +12 -0
  35. package/dist/skill-suggest.test.d.ts.map +1 -0
  36. package/dist/skill-suggest.test.js +257 -0
  37. package/dist/skill-suggest.test.js.map +1 -0
  38. package/dist/theme-loader.d.ts +35 -0
  39. package/dist/theme-loader.d.ts.map +1 -0
  40. package/dist/theme-loader.js +170 -0
  41. package/dist/theme-loader.js.map +1 -0
  42. package/dist/theme-loader.test.d.ts +2 -0
  43. package/dist/theme-loader.test.d.ts.map +1 -0
  44. package/dist/theme-loader.test.js +72 -0
  45. package/dist/theme-loader.test.js.map +1 -0
  46. package/package.json +38 -0
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Skill Documentation Generator - Story 9-4
3
+ *
4
+ * Generates docs/SKILLS.md from pennyfarthing-dist/skills/skill-registry.yaml.
5
+ * Organizes skills by category with table of contents and all metadata.
6
+ */
7
+ export interface GeneratorOptions {
8
+ /** Path to skill-registry.yaml (defaults to pennyfarthing-dist/skills/skill-registry.yaml) */
9
+ registryPath?: string;
10
+ /** Path to write output (optional - if provided with writeFile=true, writes to disk) */
11
+ outputPath?: string;
12
+ /** Whether to write the file to disk */
13
+ writeFile?: boolean;
14
+ /** Strict mode - error if required fields missing */
15
+ strict?: boolean;
16
+ }
17
+ export interface GeneratorResult {
18
+ /** Whether generation succeeded */
19
+ success: boolean;
20
+ /** Generated markdown content */
21
+ content: string;
22
+ /** Number of skills processed */
23
+ skillCount: number;
24
+ /** Path where file was written (if writeFile=true) */
25
+ writtenTo?: string;
26
+ }
27
+ /**
28
+ * Generate skill documentation from the skill registry.
29
+ *
30
+ * @param options - Generator options
31
+ * @returns Promise resolving to generator result
32
+ * @throws Error if registry not found or invalid
33
+ */
34
+ export declare function generateSkillDocs(options?: GeneratorOptions): Promise<GeneratorResult>;
35
+ //# sourceMappingURL=generate-skill-docs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-skill-docs.d.ts","sourceRoot":"","sources":["../src/generate-skill-docs.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,MAAM,WAAW,gBAAgB;IAC/B,8FAA8F;IAC9F,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wFAAwF;IACxF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,qDAAqD;IACrD,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,mCAAmC;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAgWD;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC,CA6DhG"}
@@ -0,0 +1,442 @@
1
+ /**
2
+ * Skill Documentation Generator - Story 9-4
3
+ *
4
+ * Generates docs/SKILLS.md from pennyfarthing-dist/skills/skill-registry.yaml.
5
+ * Organizes skills by category with table of contents and all metadata.
6
+ */
7
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
8
+ import { join, dirname } from 'node:path';
9
+ import { resolvePennyfarthingDist } from './portrait-resolver.js';
10
+ // ----- YAML Parser -----
11
+ /**
12
+ * Parse inline YAML array like [tag1, tag2, tag3]
13
+ */
14
+ function parseInlineArray(value) {
15
+ const match = value.match(/^\[(.*)\]$/);
16
+ if (!match)
17
+ return [];
18
+ return match[1]
19
+ .split(',')
20
+ .map(item => item.trim().replace(/^["']|["']$/g, ''))
21
+ .filter(Boolean);
22
+ }
23
+ /**
24
+ * Simple YAML parser for skill registry.
25
+ * Handles the specific nested structure we need without external dependencies.
26
+ */
27
+ function parseRegistryYaml(content) {
28
+ // Basic YAML validation - check for obvious syntax errors
29
+ const lines = content.split('\n');
30
+ for (let i = 0; i < lines.length; i++) {
31
+ const line = lines[i];
32
+ const trimmed = line.trim();
33
+ // Skip empty lines and comments
34
+ if (!trimmed || trimmed.startsWith('#'))
35
+ continue;
36
+ // Check for unclosed brackets
37
+ if ((trimmed.includes('[') && !trimmed.includes(']')) ||
38
+ (trimmed.includes('{') && !trimmed.includes('}'))) {
39
+ throw new Error(`Invalid YAML: unclosed bracket at line ${i + 1}`);
40
+ }
41
+ // Check for invalid key format (key without colon in non-array context)
42
+ if (!trimmed.startsWith('-') && trimmed.includes(':')) {
43
+ const colonPos = trimmed.indexOf(':');
44
+ const beforeColon = trimmed.substring(0, colonPos);
45
+ // Check if the part before colon looks like a valid key
46
+ if (beforeColon.includes('[') || beforeColon.includes(']') ||
47
+ beforeColon.includes('{') || beforeColon.includes('}')) {
48
+ throw new Error(`Invalid YAML: malformed key at line ${i + 1}`);
49
+ }
50
+ }
51
+ }
52
+ const result = { version: '', skills: {} };
53
+ let currentSkillKey = null;
54
+ let currentArrayField = null;
55
+ let insideExamples = false;
56
+ for (const line of lines) {
57
+ const trimmedEnd = line.trimEnd();
58
+ const trimmed = trimmedEnd.trim();
59
+ // Skip empty lines and comments
60
+ if (!trimmed || trimmed.startsWith('#'))
61
+ continue;
62
+ const indent = line.length - line.trimStart().length;
63
+ const colonIndex = trimmed.indexOf(':');
64
+ const key = colonIndex >= 0 ? trimmed.substring(0, colonIndex).trim() : trimmed;
65
+ const value = colonIndex >= 0 ? trimmed.substring(colonIndex + 1).trim() : '';
66
+ // Top-level version
67
+ if (indent === 0 && key === 'version') {
68
+ result.version = value.replace(/^["']|["']$/g, '');
69
+ continue;
70
+ }
71
+ // Top-level skills key
72
+ if (indent === 0 && key === 'skills') {
73
+ continue;
74
+ }
75
+ // Skill key (indent 2)
76
+ if (indent === 2 && !trimmed.startsWith('-')) {
77
+ currentSkillKey = key;
78
+ result.skills[currentSkillKey] = {
79
+ name: '',
80
+ description: '',
81
+ category: '',
82
+ tags: [],
83
+ version: '',
84
+ prerequisites: [],
85
+ examples: [],
86
+ anti_patterns: [],
87
+ related_skills: [],
88
+ keywords: []
89
+ };
90
+ currentArrayField = null;
91
+ insideExamples = false;
92
+ continue;
93
+ }
94
+ // Skill fields (indent 4)
95
+ if (indent === 4 && currentSkillKey) {
96
+ insideExamples = false;
97
+ currentArrayField = null;
98
+ if (key === 'name') {
99
+ result.skills[currentSkillKey].name = value.replace(/^["']|["']$/g, '');
100
+ }
101
+ else if (key === 'description') {
102
+ result.skills[currentSkillKey].description = value.replace(/^["']|["']$/g, '');
103
+ }
104
+ else if (key === 'category') {
105
+ result.skills[currentSkillKey].category = value.replace(/^["']|["']$/g, '');
106
+ }
107
+ else if (key === 'version') {
108
+ result.skills[currentSkillKey].version = value.replace(/^["']|["']$/g, '');
109
+ }
110
+ else if (key === 'tags') {
111
+ if (value.startsWith('[')) {
112
+ result.skills[currentSkillKey].tags = parseInlineArray(value);
113
+ }
114
+ else {
115
+ currentArrayField = 'tags';
116
+ }
117
+ }
118
+ else if (key === 'keywords') {
119
+ if (value.startsWith('[')) {
120
+ result.skills[currentSkillKey].keywords = parseInlineArray(value);
121
+ }
122
+ else {
123
+ currentArrayField = 'keywords';
124
+ }
125
+ }
126
+ else if (key === 'prerequisites') {
127
+ if (value.startsWith('[')) {
128
+ result.skills[currentSkillKey].prerequisites = parseInlineArray(value);
129
+ }
130
+ else {
131
+ currentArrayField = 'prerequisites';
132
+ }
133
+ }
134
+ else if (key === 'related_skills') {
135
+ if (value.startsWith('[')) {
136
+ result.skills[currentSkillKey].related_skills = parseInlineArray(value);
137
+ }
138
+ else {
139
+ currentArrayField = 'related_skills';
140
+ }
141
+ }
142
+ else if (key === 'anti_patterns') {
143
+ currentArrayField = 'anti_patterns';
144
+ }
145
+ else if (key === 'examples') {
146
+ insideExamples = true;
147
+ currentArrayField = null;
148
+ }
149
+ continue;
150
+ }
151
+ // Array items (indent 6 starting with -)
152
+ if (indent === 6 && currentSkillKey && trimmed.startsWith('-')) {
153
+ const afterDash = trimmed.substring(1).trim();
154
+ const itemColonIndex = afterDash.indexOf(':');
155
+ const itemKey = itemColonIndex >= 0 ? afterDash.substring(0, itemColonIndex).trim() : '';
156
+ const itemValue = itemColonIndex >= 0 ? afterDash.substring(itemColonIndex + 1).trim().replace(/^["']|["']$/g, '') : afterDash.replace(/^["']|["']$/g, '');
157
+ if (insideExamples) {
158
+ // Start of a new example object - might have inline key:value like "- context: Running project tests"
159
+ const newExample = { context: '', invocation: '' };
160
+ if (itemKey === 'context') {
161
+ newExample.context = itemValue;
162
+ }
163
+ else if (itemKey === 'invocation') {
164
+ newExample.invocation = itemValue;
165
+ }
166
+ result.skills[currentSkillKey].examples.push(newExample);
167
+ }
168
+ else if (currentArrayField && currentArrayField in result.skills[currentSkillKey]) {
169
+ const arr = result.skills[currentSkillKey][currentArrayField];
170
+ if (Array.isArray(arr) && typeof arr[0] !== 'object') {
171
+ arr.push(afterDash.replace(/^["']|["']$/g, ''));
172
+ }
173
+ }
174
+ continue;
175
+ }
176
+ // Example sub-fields (indent 8) - continuation of example started at indent 6
177
+ if (indent === 8 && currentSkillKey && insideExamples) {
178
+ const examples = result.skills[currentSkillKey].examples;
179
+ if (examples.length > 0) {
180
+ const lastExample = examples[examples.length - 1];
181
+ if (key === 'context') {
182
+ lastExample.context = value.replace(/^["']|["']$/g, '');
183
+ }
184
+ else if (key === 'invocation') {
185
+ lastExample.invocation = value.replace(/^["']|["']$/g, '');
186
+ }
187
+ }
188
+ continue;
189
+ }
190
+ }
191
+ return result;
192
+ }
193
+ // ----- Markdown Generation -----
194
+ /**
195
+ * Convert category slug to display name
196
+ */
197
+ function categoryDisplayName(category) {
198
+ const map = {
199
+ 'ai-llm': 'AI/LLM',
200
+ 'development': 'Development',
201
+ 'documentation': 'Documentation',
202
+ 'tools': 'Tools',
203
+ 'benchmarking': 'Benchmarking',
204
+ 'project-management': 'Project Management',
205
+ 'theming': 'Theming'
206
+ };
207
+ return map[category] || category.split('-').map(w => w[0].toUpperCase() + w.slice(1)).join(' ');
208
+ }
209
+ /**
210
+ * Convert text to GitHub-compatible anchor
211
+ */
212
+ function toAnchor(text) {
213
+ return text.toLowerCase().replace(/[^a-z0-9 -]/g, '').replace(/\s+/g, '-');
214
+ }
215
+ /**
216
+ * Generate markdown for a single skill
217
+ */
218
+ function generateSkillMarkdown(skill) {
219
+ const lines = [];
220
+ lines.push(`### ${skill.name}`);
221
+ lines.push('');
222
+ lines.push(skill.description);
223
+ lines.push('');
224
+ // Tags
225
+ if (skill.tags.length > 0) {
226
+ lines.push(`**Tags:** ${skill.tags.join(', ')}`);
227
+ lines.push('');
228
+ }
229
+ // Keywords
230
+ if (skill.keywords.length > 0) {
231
+ lines.push(`**Keywords:** ${skill.keywords.join(', ')}`);
232
+ lines.push('');
233
+ }
234
+ // Examples
235
+ if (skill.examples.length > 0) {
236
+ lines.push('**Examples:**');
237
+ for (const ex of skill.examples) {
238
+ lines.push(`- ${ex.context}: \`${ex.invocation}\``);
239
+ }
240
+ lines.push('');
241
+ }
242
+ // Anti-patterns
243
+ if (skill.anti_patterns.length > 0) {
244
+ lines.push('**Anti-patterns:**');
245
+ for (const ap of skill.anti_patterns) {
246
+ lines.push(`- ${ap}`);
247
+ }
248
+ lines.push('');
249
+ }
250
+ // Related skills
251
+ if (skill.related_skills.length > 0) {
252
+ lines.push(`**Related:** ${skill.related_skills.map(s => `[${s}](#${toAnchor(s)})`).join(', ')}`);
253
+ lines.push('');
254
+ }
255
+ return lines.join('\n');
256
+ }
257
+ /**
258
+ * Generate full markdown documentation from registry
259
+ */
260
+ function generateMarkdown(registry) {
261
+ const lines = [];
262
+ // Header
263
+ lines.push('# Pennyfarthing Skills Reference');
264
+ lines.push('');
265
+ lines.push('This document is auto-generated from `skill-registry.yaml`. Do not edit manually.');
266
+ lines.push('');
267
+ // Group skills by category
268
+ const byCategory = {};
269
+ for (const skill of Object.values(registry.skills)) {
270
+ if (!byCategory[skill.category]) {
271
+ byCategory[skill.category] = [];
272
+ }
273
+ byCategory[skill.category].push(skill);
274
+ }
275
+ // Sort categories alphabetically (AI/LLM first as special case)
276
+ const sortedCategories = Object.keys(byCategory).sort((a, b) => {
277
+ if (a === 'ai-llm')
278
+ return -1;
279
+ if (b === 'ai-llm')
280
+ return 1;
281
+ return a.localeCompare(b);
282
+ });
283
+ // Sort skills within each category alphabetically
284
+ for (const cat of sortedCategories) {
285
+ byCategory[cat].sort((a, b) => a.name.localeCompare(b.name));
286
+ }
287
+ // Table of Contents
288
+ lines.push('## Table of Contents');
289
+ lines.push('');
290
+ for (const cat of sortedCategories) {
291
+ const displayName = categoryDisplayName(cat);
292
+ lines.push(`- [${displayName}](#${toAnchor(displayName)})`);
293
+ for (const skill of byCategory[cat]) {
294
+ lines.push(` - [${skill.name}](#${toAnchor(skill.name)})`);
295
+ }
296
+ }
297
+ lines.push('');
298
+ // Categories and skills
299
+ for (const cat of sortedCategories) {
300
+ const displayName = categoryDisplayName(cat);
301
+ lines.push(`## ${displayName}`);
302
+ lines.push('');
303
+ for (const skill of byCategory[cat]) {
304
+ lines.push(generateSkillMarkdown(skill));
305
+ }
306
+ }
307
+ // Footer
308
+ lines.push('---');
309
+ lines.push('');
310
+ lines.push('*Generated by `generate-skill-docs`*');
311
+ lines.push('');
312
+ return lines.join('\n');
313
+ }
314
+ // ----- Main Export -----
315
+ /**
316
+ * Generate skill documentation from the skill registry.
317
+ *
318
+ * @param options - Generator options
319
+ * @returns Promise resolving to generator result
320
+ * @throws Error if registry not found or invalid
321
+ */
322
+ export async function generateSkillDocs(options = {}) {
323
+ // Resolve registry path
324
+ let registryPath = options.registryPath;
325
+ if (!registryPath) {
326
+ const distPath = resolvePennyfarthingDist();
327
+ if (!distPath) {
328
+ throw new Error('Registry not found: Cannot resolve pennyfarthing-dist directory');
329
+ }
330
+ registryPath = join(distPath, 'skills', 'skill-registry.yaml');
331
+ }
332
+ // Validate registry exists
333
+ if (!existsSync(registryPath)) {
334
+ throw new Error(`Registry not found: ${registryPath}`);
335
+ }
336
+ // Parse registry
337
+ let content;
338
+ try {
339
+ content = readFileSync(registryPath, 'utf-8');
340
+ }
341
+ catch {
342
+ throw new Error(`Cannot read registry: ${registryPath}`);
343
+ }
344
+ let registry;
345
+ try {
346
+ registry = parseRegistryYaml(content);
347
+ }
348
+ catch (err) {
349
+ throw new Error(`Invalid YAML in registry: ${err.message}`);
350
+ }
351
+ // Strict mode validation
352
+ if (options.strict) {
353
+ for (const [key, skill] of Object.entries(registry.skills)) {
354
+ if (!skill.description) {
355
+ throw new Error(`Missing required field 'description' for skill: ${key}`);
356
+ }
357
+ }
358
+ }
359
+ // Generate markdown
360
+ const markdown = generateMarkdown(registry);
361
+ const skillCount = Object.keys(registry.skills).length;
362
+ // Write file if requested
363
+ let writtenTo;
364
+ if (options.writeFile && options.outputPath) {
365
+ const dir = dirname(options.outputPath);
366
+ if (!existsSync(dir)) {
367
+ mkdirSync(dir, { recursive: true });
368
+ }
369
+ writeFileSync(options.outputPath, markdown, 'utf-8');
370
+ writtenTo = options.outputPath;
371
+ }
372
+ return {
373
+ success: true,
374
+ content: markdown,
375
+ skillCount,
376
+ writtenTo
377
+ };
378
+ }
379
+ // ----- CLI Entry Point -----
380
+ if (import.meta.url === `file://${process.argv[1]}`) {
381
+ const args = process.argv.slice(2);
382
+ let registryPath;
383
+ let outputPath;
384
+ let dryRun = false;
385
+ // Parse command-line arguments
386
+ for (let i = 0; i < args.length; i++) {
387
+ const arg = args[i];
388
+ if (arg === '--help' || arg === '-h') {
389
+ console.log(`Usage: generate-skill-docs [options]
390
+
391
+ Options:
392
+ --registry <path> Path to skill-registry.yaml
393
+ --output <path> Path to write output (default: docs/SKILLS.md)
394
+ --dry-run Print output instead of writing file
395
+ --help, -h Show this help
396
+
397
+ Examples:
398
+ generate-skill-docs
399
+ generate-skill-docs --dry-run
400
+ generate-skill-docs --registry ./custom-registry.yaml --output ./SKILLS.md
401
+ `);
402
+ process.exit(0);
403
+ }
404
+ else if (arg === '--dry-run') {
405
+ dryRun = true;
406
+ }
407
+ else if (arg === '--registry' && args[i + 1]) {
408
+ registryPath = args[++i];
409
+ }
410
+ else if (arg === '--output' && args[i + 1]) {
411
+ outputPath = args[++i];
412
+ }
413
+ }
414
+ // Default output path
415
+ if (!outputPath && !dryRun) {
416
+ const distPath = resolvePennyfarthingDist();
417
+ if (distPath) {
418
+ outputPath = join(dirname(dirname(distPath)), 'docs', 'SKILLS.md');
419
+ }
420
+ }
421
+ generateSkillDocs({
422
+ registryPath,
423
+ outputPath,
424
+ writeFile: !dryRun && !!outputPath
425
+ })
426
+ .then(result => {
427
+ if (dryRun) {
428
+ console.log(result.content);
429
+ }
430
+ else {
431
+ console.log(`Generated documentation for ${result.skillCount} skills`);
432
+ if (result.writtenTo) {
433
+ console.log(`Written to: ${result.writtenTo}`);
434
+ }
435
+ }
436
+ })
437
+ .catch(err => {
438
+ console.error(`Error: ${err.message}`);
439
+ process.exit(1);
440
+ });
441
+ }
442
+ //# sourceMappingURL=generate-skill-docs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-skill-docs.js","sourceRoot":"","sources":["../src/generate-skill-docs.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAiDlE,0BAA0B;AAE1B;;GAEG;AACH,SAAS,gBAAgB,CAAC,KAAa;IACrC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IAEtB,OAAO,KAAK,CAAC,CAAC,CAAC;SACZ,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;SACpD,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CAAC,OAAe;IACxC,0DAA0D;IAC1D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAE5B,gCAAgC;QAChC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAElD,8BAA8B;QAC9B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACjD,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrE,CAAC;QAED,wEAAwE;QACxE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACtD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACtC,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YACnD,wDAAwD;YACxD,IAAI,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC;gBACtD,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC3D,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAa,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAErD,IAAI,eAAe,GAAkB,IAAI,CAAC;IAC1C,IAAI,iBAAiB,GAAkB,IAAI,CAAC;IAC5C,IAAI,cAAc,GAAG,KAAK,CAAC;IAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;QAElC,gCAAgC;QAChC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAElD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC;QACrD,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QAChF,MAAM,KAAK,GAAG,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAE9E,oBAAoB;QACpB,IAAI,MAAM,KAAK,CAAC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtC,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;YACnD,SAAS;QACX,CAAC;QAED,uBAAuB;QACvB,IAAI,MAAM,KAAK,CAAC,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YACrC,SAAS;QACX,CAAC;QAED,uBAAuB;QACvB,IAAI,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7C,eAAe,GAAG,GAAG,CAAC;YACtB,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG;gBAC/B,IAAI,EAAE,EAAE;gBACR,WAAW,EAAE,EAAE;gBACf,QAAQ,EAAE,EAAE;gBACZ,IAAI,EAAE,EAAE;gBACR,OAAO,EAAE,EAAE;gBACX,aAAa,EAAE,EAAE;gBACjB,QAAQ,EAAE,EAAE;gBACZ,aAAa,EAAE,EAAE;gBACjB,cAAc,EAAE,EAAE;gBAClB,QAAQ,EAAE,EAAE;aACb,CAAC;YACF,iBAAiB,GAAG,IAAI,CAAC;YACzB,cAAc,GAAG,KAAK,CAAC;YACvB,SAAS;QACX,CAAC;QAED,0BAA0B;QAC1B,IAAI,MAAM,KAAK,CAAC,IAAI,eAAe,EAAE,CAAC;YACpC,cAAc,GAAG,KAAK,CAAC;YACvB,iBAAiB,GAAG,IAAI,CAAC;YAEzB,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;gBACnB,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;YAC1E,CAAC;iBAAM,IAAI,GAAG,KAAK,aAAa,EAAE,CAAC;gBACjC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;YACjF,CAAC;iBAAM,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;gBAC9B,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;YAC9E,CAAC;iBAAM,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBAC7B,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;YAC7E,CAAC;iBAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;gBAC1B,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC1B,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBAChE,CAAC;qBAAM,CAAC;oBACN,iBAAiB,GAAG,MAAM,CAAC;gBAC7B,CAAC;YACH,CAAC;iBAAM,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;gBAC9B,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC1B,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBACpE,CAAC;qBAAM,CAAC;oBACN,iBAAiB,GAAG,UAAU,CAAC;gBACjC,CAAC;YACH,CAAC;iBAAM,IAAI,GAAG,KAAK,eAAe,EAAE,CAAC;gBACnC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC1B,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,aAAa,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBACzE,CAAC;qBAAM,CAAC;oBACN,iBAAiB,GAAG,eAAe,CAAC;gBACtC,CAAC;YACH,CAAC;iBAAM,IAAI,GAAG,KAAK,gBAAgB,EAAE,CAAC;gBACpC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC1B,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,cAAc,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBAC1E,CAAC;qBAAM,CAAC;oBACN,iBAAiB,GAAG,gBAAgB,CAAC;gBACvC,CAAC;YACH,CAAC;iBAAM,IAAI,GAAG,KAAK,eAAe,EAAE,CAAC;gBACnC,iBAAiB,GAAG,eAAe,CAAC;YACtC,CAAC;iBAAM,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;gBAC9B,cAAc,GAAG,IAAI,CAAC;gBACtB,iBAAiB,GAAG,IAAI,CAAC;YAC3B,CAAC;YACD,SAAS;QACX,CAAC;QAED,yCAAyC;QACzC,IAAI,MAAM,KAAK,CAAC,IAAI,eAAe,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/D,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC9C,MAAM,cAAc,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC9C,MAAM,OAAO,GAAG,cAAc,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzF,MAAM,SAAS,GAAG,cAAc,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;YAE3J,IAAI,cAAc,EAAE,CAAC;gBACnB,sGAAsG;gBACtG,MAAM,UAAU,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;gBACnD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;oBAC1B,UAAU,CAAC,OAAO,GAAG,SAAS,CAAC;gBACjC,CAAC;qBAAM,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;oBACpC,UAAU,CAAC,UAAU,GAAG,SAAS,CAAC;gBACpC,CAAC;gBACD,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC3D,CAAC;iBAAM,IAAI,iBAAiB,IAAI,iBAAiB,IAAI,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC;gBACpF,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,iBAAgC,CAAC,CAAC;gBAC7E,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;oBACpD,GAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC;gBAChE,CAAC;YACH,CAAC;YACD,SAAS;QACX,CAAC;QAED,8EAA8E;QAC9E,IAAI,MAAM,KAAK,CAAC,IAAI,eAAe,IAAI,cAAc,EAAE,CAAC;YACtD,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,QAAQ,CAAC;YACzD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBAClD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;oBACtB,WAAW,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;gBAC1D,CAAC;qBAAM,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;oBAChC,WAAW,CAAC,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;gBAC7D,CAAC;YACH,CAAC;YACD,SAAS;QACX,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,kCAAkC;AAElC;;GAEG;AACH,SAAS,mBAAmB,CAAC,QAAgB;IAC3C,MAAM,GAAG,GAA2B;QAClC,QAAQ,EAAE,QAAQ;QAClB,aAAa,EAAE,aAAa;QAC5B,eAAe,EAAE,eAAe;QAChC,OAAO,EAAE,OAAO;QAChB,cAAc,EAAE,cAAc;QAC9B,oBAAoB,EAAE,oBAAoB;QAC1C,SAAS,EAAE,SAAS;KACrB,CAAC;IACF,OAAO,GAAG,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClG,CAAC;AAED;;GAEG;AACH,SAAS,QAAQ,CAAC,IAAY;IAC5B,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAC7E,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,KAAY;IACzC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAChC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC9B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,OAAO;IACP,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,aAAa,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,WAAW;IACX,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,iBAAiB,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,WAAW;IACX,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC5B,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,OAAO,OAAO,EAAE,CAAC,UAAU,IAAI,CAAC,CAAC;QACtD,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,gBAAgB;IAChB,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACjC,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;YACrC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACxB,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,iBAAiB;IACjB,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,gBAAgB,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,QAAkB;IAC1C,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,SAAS;IACT,KAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAC/C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,mFAAmF,CAAC,CAAC;IAChG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,2BAA2B;IAC3B,MAAM,UAAU,GAA4B,EAAE,CAAC;IAC/C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;QAClC,CAAC;QACD,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,gEAAgE;IAChE,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC7D,IAAI,CAAC,KAAK,QAAQ;YAAE,OAAO,CAAC,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK,QAAQ;YAAE,OAAO,CAAC,CAAC;QAC7B,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,kDAAkD;IAClD,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACnC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,oBAAoB;IACpB,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACnC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACnC,MAAM,WAAW,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC,MAAM,WAAW,MAAM,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC5D,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,QAAQ,KAAK,CAAC,IAAI,MAAM,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,wBAAwB;IACxB,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACnC,MAAM,WAAW,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC,MAAM,WAAW,EAAE,CAAC,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,SAAS;IACT,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IACnD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,0BAA0B;AAE1B;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,UAA4B,EAAE;IACpE,wBAAwB;IACxB,IAAI,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IACxC,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,QAAQ,GAAG,wBAAwB,EAAE,CAAC;QAC5C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;QACrF,CAAC;QACD,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,qBAAqB,CAAC,CAAC;IACjE,CAAC;IAED,2BAA2B;IAC3B,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,uBAAuB,YAAY,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,iBAAiB;IACjB,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,yBAAyB,YAAY,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,QAAkB,CAAC;IACvB,IAAI,CAAC;QACH,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,6BAA8B,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,yBAAyB;IACzB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3D,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CAAC,mDAAmD,GAAG,EAAE,CAAC,CAAC;YAC5E,CAAC;QACH,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;IAEvD,0BAA0B;IAC1B,IAAI,SAA6B,CAAC;IAClC,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QAC5C,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACxC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,CAAC;QACD,aAAa,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QACrD,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC;IACjC,CAAC;IAED,OAAO;QACL,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,QAAQ;QACjB,UAAU;QACV,SAAS;KACV,CAAC;AACJ,CAAC;AAED,8BAA8B;AAE9B,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACpD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,YAAgC,CAAC;IACrC,IAAI,UAA8B,CAAC;IACnC,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,+BAA+B;IAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;CAYjB,CAAC,CAAC;YACG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;aAAM,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YAC/B,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;aAAM,IAAI,GAAG,KAAK,YAAY,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC/C,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3B,CAAC;aAAM,IAAI,GAAG,KAAK,UAAU,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC7C,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,IAAI,CAAC,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,wBAAwB,EAAE,CAAC;QAC5C,IAAI,QAAQ,EAAE,CAAC;YACb,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IAED,iBAAiB,CAAC;QAChB,YAAY;QACZ,UAAU;QACV,SAAS,EAAE,CAAC,MAAM,IAAI,CAAC,CAAC,UAAU;KACnC,CAAC;SACC,IAAI,CAAC,MAAM,CAAC,EAAE;QACb,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,+BAA+B,MAAM,CAAC,UAAU,SAAS,CAAC,CAAC;YACvE,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;gBACrB,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;IACH,CAAC,CAAC;SACD,KAAK,CAAC,GAAG,CAAC,EAAE;QACX,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Tests for Story 9-4: Skill Documentation Generator
3
+ *
4
+ * These tests verify:
5
+ * - AC1: docs/SKILLS.md auto-generated from skill-registry.yaml
6
+ * - AC2: Generated docs include all skill metadata
7
+ * - AC3: Skills organized by category with table of contents
8
+ * - AC4: Build process triggers doc generation
9
+ *
10
+ * Run with: npm test -- packages/shared/src/generate-skill-docs.test.ts
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=generate-skill-docs.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-skill-docs.test.d.ts","sourceRoot":"","sources":["../src/generate-skill-docs.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}