specweave 0.30.11 → 0.30.13

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 (134) hide show
  1. package/dist/src/cli/commands/init.d.ts.map +1 -1
  2. package/dist/src/cli/commands/init.js +25 -2
  3. package/dist/src/cli/commands/init.js.map +1 -1
  4. package/dist/src/cli/helpers/ado-area-selector.d.ts.map +1 -1
  5. package/dist/src/cli/helpers/ado-area-selector.js +13 -0
  6. package/dist/src/cli/helpers/ado-area-selector.js.map +1 -1
  7. package/dist/src/cli/helpers/init/living-docs-preflight.d.ts +5 -1
  8. package/dist/src/cli/helpers/init/living-docs-preflight.d.ts.map +1 -1
  9. package/dist/src/cli/helpers/init/living-docs-preflight.js +80 -28
  10. package/dist/src/cli/helpers/init/living-docs-preflight.js.map +1 -1
  11. package/dist/src/cli/helpers/issue-tracker/index.d.ts.map +1 -1
  12. package/dist/src/cli/helpers/issue-tracker/index.js +7 -2
  13. package/dist/src/cli/helpers/issue-tracker/index.js.map +1 -1
  14. package/dist/src/cli/helpers/issue-tracker/sync-config-writer.d.ts +7 -0
  15. package/dist/src/cli/helpers/issue-tracker/sync-config-writer.d.ts.map +1 -1
  16. package/dist/src/cli/helpers/issue-tracker/sync-config-writer.js +33 -2
  17. package/dist/src/cli/helpers/issue-tracker/sync-config-writer.js.map +1 -1
  18. package/dist/src/cli/workers/brownfield-worker.d.ts +13 -0
  19. package/dist/src/cli/workers/brownfield-worker.d.ts.map +1 -1
  20. package/dist/src/cli/workers/brownfield-worker.js +154 -0
  21. package/dist/src/cli/workers/brownfield-worker.js.map +1 -1
  22. package/dist/src/cli/workers/clone-worker.js +19 -3
  23. package/dist/src/cli/workers/clone-worker.js.map +1 -1
  24. package/dist/src/cli/workers/living-docs-worker.js +272 -11
  25. package/dist/src/cli/workers/living-docs-worker.js.map +1 -1
  26. package/dist/src/core/background/brownfield-launcher.d.ts +2 -1
  27. package/dist/src/core/background/brownfield-launcher.d.ts.map +1 -1
  28. package/dist/src/core/background/brownfield-launcher.js.map +1 -1
  29. package/dist/src/core/background/types.d.ts +10 -2
  30. package/dist/src/core/background/types.d.ts.map +1 -1
  31. package/dist/src/core/discrepancy/brownfield-types.d.ts +3 -1
  32. package/dist/src/core/discrepancy/brownfield-types.d.ts.map +1 -1
  33. package/dist/src/core/living-docs/board-matcher.d.ts +120 -0
  34. package/dist/src/core/living-docs/board-matcher.d.ts.map +1 -0
  35. package/dist/src/core/living-docs/board-matcher.js +466 -0
  36. package/dist/src/core/living-docs/board-matcher.js.map +1 -0
  37. package/dist/src/core/living-docs/feature-archiver.d.ts +39 -0
  38. package/dist/src/core/living-docs/feature-archiver.d.ts.map +1 -1
  39. package/dist/src/core/living-docs/feature-archiver.js +197 -0
  40. package/dist/src/core/living-docs/feature-archiver.js.map +1 -1
  41. package/dist/src/core/living-docs/foundation-builder.js +1 -1
  42. package/dist/src/core/living-docs/foundation-builder.js.map +1 -1
  43. package/dist/src/core/living-docs/living-docs-sync.d.ts +19 -8
  44. package/dist/src/core/living-docs/living-docs-sync.d.ts.map +1 -1
  45. package/dist/src/core/living-docs/living-docs-sync.js +148 -52
  46. package/dist/src/core/living-docs/living-docs-sync.js.map +1 -1
  47. package/dist/src/core/living-docs/suggestions-generator.js +1 -1
  48. package/dist/src/core/living-docs/suggestions-generator.js.map +1 -1
  49. package/dist/src/core/living-docs/umbrella-detector.d.ts +4 -0
  50. package/dist/src/core/living-docs/umbrella-detector.d.ts.map +1 -1
  51. package/dist/src/core/living-docs/umbrella-detector.js +20 -1
  52. package/dist/src/core/living-docs/umbrella-detector.js.map +1 -1
  53. package/dist/src/core/living-docs/workitem-matcher.js +5 -5
  54. package/dist/src/core/living-docs/workitem-matcher.js.map +1 -1
  55. package/dist/src/core/llm/availability-messages.d.ts +33 -0
  56. package/dist/src/core/llm/availability-messages.d.ts.map +1 -0
  57. package/dist/src/core/llm/availability-messages.js +170 -0
  58. package/dist/src/core/llm/availability-messages.js.map +1 -0
  59. package/dist/src/core/llm/index.d.ts +34 -0
  60. package/dist/src/core/llm/index.d.ts.map +1 -0
  61. package/dist/src/core/llm/index.js +35 -0
  62. package/dist/src/core/llm/index.js.map +1 -0
  63. package/dist/src/core/llm/provider-factory.d.ts +48 -0
  64. package/dist/src/core/llm/provider-factory.d.ts.map +1 -0
  65. package/dist/src/core/llm/provider-factory.js +274 -0
  66. package/dist/src/core/llm/provider-factory.js.map +1 -0
  67. package/dist/src/core/llm/providers/anthropic-provider.d.ts +66 -0
  68. package/dist/src/core/llm/providers/anthropic-provider.d.ts.map +1 -0
  69. package/dist/src/core/llm/providers/anthropic-provider.js +195 -0
  70. package/dist/src/core/llm/providers/anthropic-provider.js.map +1 -0
  71. package/dist/src/core/llm/providers/azure-openai-provider.d.ts +47 -0
  72. package/dist/src/core/llm/providers/azure-openai-provider.d.ts.map +1 -0
  73. package/dist/src/core/llm/providers/azure-openai-provider.js +116 -0
  74. package/dist/src/core/llm/providers/azure-openai-provider.js.map +1 -0
  75. package/dist/src/core/llm/providers/bedrock-provider.d.ts +44 -0
  76. package/dist/src/core/llm/providers/bedrock-provider.d.ts.map +1 -0
  77. package/dist/src/core/llm/providers/bedrock-provider.js +149 -0
  78. package/dist/src/core/llm/providers/bedrock-provider.js.map +1 -0
  79. package/dist/src/core/llm/providers/claude-code-provider.d.ts +115 -0
  80. package/dist/src/core/llm/providers/claude-code-provider.d.ts.map +1 -0
  81. package/dist/src/core/llm/providers/claude-code-provider.js +379 -0
  82. package/dist/src/core/llm/providers/claude-code-provider.js.map +1 -0
  83. package/dist/src/core/llm/providers/ollama-provider.d.ts +40 -0
  84. package/dist/src/core/llm/providers/ollama-provider.d.ts.map +1 -0
  85. package/dist/src/core/llm/providers/ollama-provider.js +116 -0
  86. package/dist/src/core/llm/providers/ollama-provider.js.map +1 -0
  87. package/dist/src/core/llm/providers/openai-provider.d.ts +44 -0
  88. package/dist/src/core/llm/providers/openai-provider.d.ts.map +1 -0
  89. package/dist/src/core/llm/providers/openai-provider.js +119 -0
  90. package/dist/src/core/llm/providers/openai-provider.js.map +1 -0
  91. package/dist/src/core/llm/providers/vertex-ai-provider.d.ts +46 -0
  92. package/dist/src/core/llm/providers/vertex-ai-provider.d.ts.map +1 -0
  93. package/dist/src/core/llm/providers/vertex-ai-provider.js +123 -0
  94. package/dist/src/core/llm/providers/vertex-ai-provider.js.map +1 -0
  95. package/dist/src/core/llm/types.d.ts +181 -0
  96. package/dist/src/core/llm/types.d.ts.map +1 -0
  97. package/dist/src/core/llm/types.js +56 -0
  98. package/dist/src/core/llm/types.js.map +1 -0
  99. package/dist/src/importers/item-converter.d.ts +4 -0
  100. package/dist/src/importers/item-converter.d.ts.map +1 -1
  101. package/dist/src/importers/item-converter.js +73 -12
  102. package/dist/src/importers/item-converter.js.map +1 -1
  103. package/dist/src/init/repo/types.d.ts +1 -1
  104. package/dist/src/living-docs/enterprise-analyzer.d.ts +160 -0
  105. package/dist/src/living-docs/enterprise-analyzer.d.ts.map +1 -0
  106. package/dist/src/living-docs/enterprise-analyzer.js +887 -0
  107. package/dist/src/living-docs/enterprise-analyzer.js.map +1 -0
  108. package/dist/src/living-docs/epic-id-allocator.d.ts +4 -0
  109. package/dist/src/living-docs/epic-id-allocator.d.ts.map +1 -1
  110. package/dist/src/living-docs/epic-id-allocator.js +4 -0
  111. package/dist/src/living-docs/epic-id-allocator.js.map +1 -1
  112. package/dist/src/living-docs/fs-id-allocator.d.ts +9 -0
  113. package/dist/src/living-docs/fs-id-allocator.d.ts.map +1 -1
  114. package/dist/src/living-docs/fs-id-allocator.js +16 -5
  115. package/dist/src/living-docs/fs-id-allocator.js.map +1 -1
  116. package/dist/src/living-docs/smart-doc-organizer.d.ts +114 -0
  117. package/dist/src/living-docs/smart-doc-organizer.d.ts.map +1 -0
  118. package/dist/src/living-docs/smart-doc-organizer.js +535 -0
  119. package/dist/src/living-docs/smart-doc-organizer.js.map +1 -0
  120. package/package.json +1 -1
  121. package/plugins/specweave/commands/specweave-archive.md +69 -2
  122. package/plugins/specweave/commands/specweave-judge.md +265 -0
  123. package/plugins/specweave/commands/specweave-organize-docs.md +185 -0
  124. package/plugins/specweave/hooks/hooks.json +3 -3
  125. package/plugins/specweave/hooks/universal/hook-wrapper.cmd +26 -0
  126. package/plugins/specweave/hooks/universal/hook-wrapper.sh +67 -0
  127. package/plugins/specweave-docs/commands/build.md +158 -0
  128. package/plugins/specweave-docs/commands/{docs-generate.md → generate.md} +7 -2
  129. package/plugins/specweave-docs/commands/health.md +268 -0
  130. package/plugins/specweave-docs/commands/{docs-init.md → init.md} +7 -2
  131. package/plugins/specweave-docs/commands/organize.md +184 -0
  132. package/plugins/specweave-docs/commands/preview.md +138 -0
  133. package/plugins/specweave-docs/skills/preview/SKILL.md +105 -0
  134. package/plugins/specweave-release/commands/specweave-release-npm.md +22 -235
@@ -1 +1 @@
1
- {"version":3,"file":"brownfield-types.d.ts","sourceRoot":"","sources":["../../../../src/core/discrepancy/brownfield-types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"brownfield-types.d.ts","sourceRoot":"","sources":["../../../../src/core/discrepancy/brownfield-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * BoardMatcher - Intelligent board/area path matching for living docs sync
3
+ *
4
+ * Matches increments to the correct board/area path based on:
5
+ * - Increment title and description keywords
6
+ * - Area path names from config
7
+ * - ChildRepo names/teams from umbrella config
8
+ * - Configured keywords (areaPathMapping.mappings[].keywords)
9
+ *
10
+ * @see ADR-0178: Intelligent Board/Area Path Matching
11
+ */
12
+ import { Logger } from '../../utils/logger.js';
13
+ /**
14
+ * Information about an available board/area path
15
+ */
16
+ export interface BoardInfo {
17
+ /** Unique identifier (area path name, childRepo id, or folder name) */
18
+ id: string;
19
+ /** Human-readable name */
20
+ name: string;
21
+ /** Source of this board info */
22
+ source: 'areaPath' | 'areaPathMapping' | 'childRepo' | 'existing-folder' | 'multiProject';
23
+ /** ADO profile name (if from ADO config) */
24
+ adoProfile?: string;
25
+ /** ADO project name (for 2-level folder structure: {project}/{areaPath}) */
26
+ adoProject?: string;
27
+ /** Configured keywords for matching */
28
+ keywords?: string[];
29
+ /** Team name (from childRepo) */
30
+ team?: string;
31
+ /** Full path in specs folder (if existing) */
32
+ specsPath?: string;
33
+ }
34
+ /**
35
+ * Result of matching an increment against boards
36
+ */
37
+ export interface BoardMatchResult {
38
+ /** Board identifier */
39
+ boardId: string;
40
+ /** Human-readable board name */
41
+ boardName: string;
42
+ /** Confidence score (0-100) */
43
+ confidence: number;
44
+ /** Terms that matched */
45
+ matchedTerms: string[];
46
+ /** Source of the match */
47
+ source: BoardInfo['source'];
48
+ /** Match type explanation */
49
+ matchType: 'exact' | 'partial' | 'keyword' | 'fuzzy';
50
+ /** ADO project name (for 2-level folder structure: {project}/{boardId}) */
51
+ adoProject?: string;
52
+ }
53
+ /**
54
+ * Decision from the matcher
55
+ */
56
+ export interface MatchDecision {
57
+ /** Whether user input is needed */
58
+ needsUserInput: boolean;
59
+ /** Reason for the decision */
60
+ reason: string;
61
+ /** Best match (if any) */
62
+ bestMatch?: BoardMatchResult;
63
+ /** All matches sorted by confidence */
64
+ allMatches: BoardMatchResult[];
65
+ /** Available boards (for user selection) */
66
+ availableBoards: BoardInfo[];
67
+ }
68
+ export declare class BoardMatcher {
69
+ private projectRoot;
70
+ private options;
71
+ private config;
72
+ private configLoaded;
73
+ constructor(projectRoot: string, options?: {
74
+ logger?: Logger;
75
+ });
76
+ private get logger();
77
+ /**
78
+ * Load config from project root
79
+ */
80
+ private loadConfig;
81
+ /**
82
+ * Extract keywords from increment spec content
83
+ *
84
+ * Extracts meaningful words from:
85
+ * - Title (# heading)
86
+ * - Description (first paragraph)
87
+ * - User stories (## US-XXX sections)
88
+ * - Type field
89
+ */
90
+ extractIncrementKeywords(specContent: string): string[];
91
+ /**
92
+ * Add words from text to a Set
93
+ */
94
+ private addWordsToSet;
95
+ /**
96
+ * Get all available boards from config
97
+ */
98
+ getAvailableBoards(): Promise<BoardInfo[]>;
99
+ /**
100
+ * Normalize board ID to kebab-case
101
+ */
102
+ private normalizeId;
103
+ /**
104
+ * Match increment content against available boards
105
+ */
106
+ matchIncrement(incrementId: string, specContent: string): Promise<MatchDecision>;
107
+ /**
108
+ * Calculate match score for a board against keywords
109
+ */
110
+ private calculateMatch;
111
+ /**
112
+ * Fuzzy match for common variations
113
+ */
114
+ private fuzzyMatch;
115
+ /**
116
+ * Check if this is a utility/cross-cutting increment that shouldn't auto-match
117
+ */
118
+ isUtilityIncrement(specContent: string): boolean;
119
+ }
120
+ //# sourceMappingURL=board-matcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"board-matcher.d.ts","sourceRoot":"","sources":["../../../../src/core/living-docs/board-matcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,EAAE,MAAM,EAAiB,MAAM,uBAAuB,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,uEAAuE;IACvE,EAAE,EAAE,MAAM,CAAC;IACX,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,MAAM,EAAE,UAAU,GAAG,iBAAiB,GAAG,WAAW,GAAG,iBAAiB,GAAG,cAAc,CAAC;IAC1F,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,iCAAiC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,yBAAyB;IACzB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,0BAA0B;IAC1B,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC5B,6BAA6B;IAC7B,SAAS,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;IACrD,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,mCAAmC;IACnC,cAAc,EAAE,OAAO,CAAC;IACxB,8BAA8B;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,0BAA0B;IAC1B,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,uCAAuC;IACvC,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B,4CAA4C;IAC5C,eAAe,EAAE,SAAS,EAAE,CAAC;CAC9B;AAsCD,qBAAa,YAAY;IAKrB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,OAAO;IALjB,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,YAAY,CAAS;gBAGnB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO;IAG3C,OAAO,KAAK,MAAM,GAEjB;IAED;;OAEG;YACW,UAAU;IAoBxB;;;;;;;;OAQG;IACH,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE;IAoDvD;;OAEG;IACH,OAAO,CAAC,aAAa;IAwBrB;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IA8GhD;;OAEG;IACH,OAAO,CAAC,WAAW;IASnB;;OAEG;IACG,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAoGtF;;OAEG;IACH,OAAO,CAAC,cAAc;IA4FtB;;OAEG;IACH,OAAO,CAAC,UAAU;IA4BlB;;OAEG;IACH,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;CAejD"}
@@ -0,0 +1,466 @@
1
+ /**
2
+ * BoardMatcher - Intelligent board/area path matching for living docs sync
3
+ *
4
+ * Matches increments to the correct board/area path based on:
5
+ * - Increment title and description keywords
6
+ * - Area path names from config
7
+ * - ChildRepo names/teams from umbrella config
8
+ * - Configured keywords (areaPathMapping.mappings[].keywords)
9
+ *
10
+ * @see ADR-0178: Intelligent Board/Area Path Matching
11
+ */
12
+ import { existsSync } from 'fs';
13
+ import * as fs from 'fs/promises';
14
+ import * as path from 'path';
15
+ import { consoleLogger } from '../../utils/logger.js';
16
+ export class BoardMatcher {
17
+ constructor(projectRoot, options = {}) {
18
+ this.projectRoot = projectRoot;
19
+ this.options = options;
20
+ this.config = null;
21
+ this.configLoaded = false;
22
+ }
23
+ get logger() {
24
+ return this.options.logger ?? consoleLogger;
25
+ }
26
+ /**
27
+ * Load config from project root
28
+ */
29
+ async loadConfig() {
30
+ if (this.configLoaded)
31
+ return this.config;
32
+ const configPath = path.join(this.projectRoot, '.specweave/config.json');
33
+ if (!existsSync(configPath)) {
34
+ this.configLoaded = true;
35
+ return null;
36
+ }
37
+ try {
38
+ const content = await fs.readFile(configPath, 'utf-8');
39
+ this.config = JSON.parse(content);
40
+ this.configLoaded = true;
41
+ return this.config;
42
+ }
43
+ catch {
44
+ this.configLoaded = true;
45
+ return null;
46
+ }
47
+ }
48
+ /**
49
+ * Extract keywords from increment spec content
50
+ *
51
+ * Extracts meaningful words from:
52
+ * - Title (# heading)
53
+ * - Description (first paragraph)
54
+ * - User stories (## US-XXX sections)
55
+ * - Type field
56
+ */
57
+ extractIncrementKeywords(specContent) {
58
+ const keywords = new Set();
59
+ // Extract title (first # heading)
60
+ const titleMatch = specContent.match(/^#\s+(.+)$/m);
61
+ if (titleMatch) {
62
+ this.addWordsToSet(titleMatch[1], keywords);
63
+ }
64
+ // Extract increment name from YAML frontmatter
65
+ const incrementMatch = specContent.match(/^increment:\s*(.+)$/m);
66
+ if (incrementMatch) {
67
+ this.addWordsToSet(incrementMatch[1], keywords);
68
+ }
69
+ // Extract type field
70
+ const typeMatch = specContent.match(/\*\*Type\*\*:\s*(.+)/i);
71
+ if (typeMatch) {
72
+ this.addWordsToSet(typeMatch[1], keywords);
73
+ }
74
+ // Extract description (text after ## Description or first paragraph after title)
75
+ const descMatch = specContent.match(/##\s*Description\s*\n([\s\S]*?)(?=\n##|\n\*\*|$)/i);
76
+ if (descMatch) {
77
+ this.addWordsToSet(descMatch[1], keywords);
78
+ }
79
+ // Extract user story titles
80
+ const usMatches = specContent.matchAll(/##\s*(?:US-\d+[:\s]+)?(.+)/g);
81
+ for (const match of usMatches) {
82
+ this.addWordsToSet(match[1], keywords);
83
+ }
84
+ // Remove common stop words
85
+ const stopWords = new Set([
86
+ 'the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'been', 'being',
87
+ 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could',
88
+ 'should', 'may', 'might', 'must', 'shall', 'can', 'need', 'dare',
89
+ 'for', 'and', 'nor', 'but', 'or', 'yet', 'so', 'as', 'to', 'of',
90
+ 'in', 'on', 'at', 'by', 'with', 'from', 'up', 'about', 'into',
91
+ 'through', 'during', 'before', 'after', 'above', 'below', 'between',
92
+ 'under', 'again', 'further', 'then', 'once', 'here', 'there', 'when',
93
+ 'where', 'why', 'how', 'all', 'each', 'few', 'more', 'most', 'other',
94
+ 'some', 'such', 'no', 'not', 'only', 'own', 'same', 'than', 'too',
95
+ 'very', 'just', 'also', 'now', 'new', 'user', 'feature', 'implement',
96
+ 'add', 'create', 'update', 'fix', 'bug', 'enhancement', 'story',
97
+ 'increment', 'spec', 'task', 'status', 'completed', 'pending', 'active'
98
+ ]);
99
+ return Array.from(keywords).filter(w => !stopWords.has(w) && w.length > 2);
100
+ }
101
+ /**
102
+ * Add words from text to a Set
103
+ */
104
+ addWordsToSet(text, set) {
105
+ // Split on non-word characters, normalize
106
+ const words = text
107
+ .toLowerCase()
108
+ .replace(/[^a-z0-9\s-]/g, ' ')
109
+ .split(/[\s-]+/)
110
+ .filter(w => w.length > 2);
111
+ for (const word of words) {
112
+ set.add(word);
113
+ }
114
+ // Also add hyphenated combinations (e.g., "clinical-insights")
115
+ const hyphenated = text
116
+ .toLowerCase()
117
+ .replace(/[^a-z0-9-]/g, '-')
118
+ .replace(/-+/g, '-')
119
+ .replace(/^-|-$/g, '');
120
+ if (hyphenated.includes('-') && hyphenated.length > 3) {
121
+ set.add(hyphenated);
122
+ }
123
+ }
124
+ /**
125
+ * Get all available boards from config
126
+ */
127
+ async getAvailableBoards() {
128
+ const config = await this.loadConfig();
129
+ const boards = [];
130
+ const seenIds = new Set();
131
+ // 1. Check ADO area paths (both formats)
132
+ if (config?.sync?.profiles) {
133
+ for (const [profileName, profile] of Object.entries(config.sync.profiles)) {
134
+ if (profile.provider !== 'ado')
135
+ continue;
136
+ // Get ADO project name for 2-level folder structure
137
+ const adoProject = profile.config?.project
138
+ ? this.normalizeId(profile.config.project)
139
+ : undefined;
140
+ // Format 1: areaPathMapping.mappings[] (with keywords)
141
+ if (profile.config?.areaPathMapping?.mappings?.length) {
142
+ for (const mapping of profile.config.areaPathMapping.mappings) {
143
+ const id = this.normalizeId(mapping.specweaveProject);
144
+ if (!seenIds.has(id)) {
145
+ seenIds.add(id);
146
+ boards.push({
147
+ id,
148
+ name: mapping.specweaveProject,
149
+ source: 'areaPathMapping',
150
+ adoProfile: profileName,
151
+ adoProject,
152
+ keywords: mapping.keywords
153
+ });
154
+ }
155
+ }
156
+ }
157
+ // Format 2: areaPaths[] (simple list)
158
+ if (profile.config?.areaPaths?.length) {
159
+ for (const areaPath of profile.config.areaPaths) {
160
+ const id = this.normalizeId(areaPath);
161
+ if (!seenIds.has(id)) {
162
+ seenIds.add(id);
163
+ boards.push({
164
+ id,
165
+ name: areaPath,
166
+ source: 'areaPath',
167
+ adoProfile: profileName,
168
+ adoProject
169
+ });
170
+ }
171
+ }
172
+ }
173
+ }
174
+ }
175
+ // 2. Check umbrella childRepos
176
+ if (config?.umbrella?.enabled && config.umbrella.childRepos?.length) {
177
+ for (const repo of config.umbrella.childRepos) {
178
+ const id = this.normalizeId(repo.name || repo.id);
179
+ if (!seenIds.has(id)) {
180
+ seenIds.add(id);
181
+ boards.push({
182
+ id,
183
+ name: repo.name || repo.id,
184
+ source: 'childRepo',
185
+ team: repo.team
186
+ });
187
+ }
188
+ }
189
+ }
190
+ // 3. Check multiProject.projects
191
+ if (config?.multiProject?.enabled && config.multiProject.projects) {
192
+ for (const [projectId, project] of Object.entries(config.multiProject.projects)) {
193
+ const id = this.normalizeId(projectId);
194
+ if (!seenIds.has(id)) {
195
+ seenIds.add(id);
196
+ boards.push({
197
+ id,
198
+ name: project.name || projectId,
199
+ source: 'multiProject'
200
+ });
201
+ }
202
+ }
203
+ }
204
+ // 4. Check existing folders in specs/
205
+ const specsBase = path.join(this.projectRoot, '.specweave/docs/internal/specs');
206
+ if (existsSync(specsBase)) {
207
+ try {
208
+ const entries = await fs.readdir(specsBase, { withFileTypes: true });
209
+ for (const entry of entries) {
210
+ if (entry.isDirectory() && !entry.name.startsWith('_') && !entry.name.startsWith('FS-')) {
211
+ const id = this.normalizeId(entry.name);
212
+ if (!seenIds.has(id)) {
213
+ seenIds.add(id);
214
+ boards.push({
215
+ id,
216
+ name: entry.name,
217
+ source: 'existing-folder',
218
+ specsPath: entry.name
219
+ });
220
+ }
221
+ }
222
+ }
223
+ }
224
+ catch {
225
+ // Ignore read errors
226
+ }
227
+ }
228
+ return boards;
229
+ }
230
+ /**
231
+ * Normalize board ID to kebab-case
232
+ */
233
+ normalizeId(name) {
234
+ return name
235
+ .toLowerCase()
236
+ .replace(/\s+/g, '-')
237
+ .replace(/[^a-z0-9-]/g, '')
238
+ .replace(/-+/g, '-')
239
+ .replace(/^-|-$/g, '');
240
+ }
241
+ /**
242
+ * Match increment content against available boards
243
+ */
244
+ async matchIncrement(incrementId, specContent) {
245
+ const boards = await this.getAvailableBoards();
246
+ const keywords = this.extractIncrementKeywords(specContent);
247
+ this.logger.log(` 🔍 Extracted keywords: ${keywords.slice(0, 10).join(', ')}${keywords.length > 10 ? '...' : ''}`);
248
+ if (boards.length === 0) {
249
+ return {
250
+ needsUserInput: false,
251
+ reason: 'no-boards-configured',
252
+ allMatches: [],
253
+ availableBoards: []
254
+ };
255
+ }
256
+ if (boards.length === 1) {
257
+ // Single board - auto-assign
258
+ return {
259
+ needsUserInput: false,
260
+ reason: 'single-board',
261
+ bestMatch: {
262
+ boardId: boards[0].id,
263
+ boardName: boards[0].name,
264
+ confidence: 100,
265
+ matchedTerms: [],
266
+ source: boards[0].source,
267
+ matchType: 'exact',
268
+ adoProject: boards[0].adoProject
269
+ },
270
+ allMatches: [{
271
+ boardId: boards[0].id,
272
+ boardName: boards[0].name,
273
+ confidence: 100,
274
+ matchedTerms: [],
275
+ source: boards[0].source,
276
+ matchType: 'exact',
277
+ adoProject: boards[0].adoProject
278
+ }],
279
+ availableBoards: boards
280
+ };
281
+ }
282
+ // Multiple boards - calculate matches
283
+ const matches = [];
284
+ for (const board of boards) {
285
+ const result = this.calculateMatch(board, keywords, incrementId);
286
+ if (result.confidence > 0) {
287
+ matches.push(result);
288
+ }
289
+ }
290
+ // Sort by confidence (descending)
291
+ matches.sort((a, b) => b.confidence - a.confidence);
292
+ const bestMatch = matches[0];
293
+ const secondBest = matches[1];
294
+ // Decision logic
295
+ if (!bestMatch || bestMatch.confidence === 0) {
296
+ return {
297
+ needsUserInput: true,
298
+ reason: 'no-match-found',
299
+ allMatches: matches,
300
+ availableBoards: boards
301
+ };
302
+ }
303
+ // High confidence (>80%) AND significantly better than second best
304
+ if (bestMatch.confidence > 80 && (!secondBest || bestMatch.confidence - secondBest.confidence > 20)) {
305
+ return {
306
+ needsUserInput: false,
307
+ reason: 'high-confidence-match',
308
+ bestMatch,
309
+ allMatches: matches,
310
+ availableBoards: boards
311
+ };
312
+ }
313
+ // Medium confidence (50-80%) OR close to second best - ask for confirmation
314
+ if (bestMatch.confidence >= 50) {
315
+ return {
316
+ needsUserInput: true,
317
+ reason: 'medium-confidence-needs-confirmation',
318
+ bestMatch,
319
+ allMatches: matches,
320
+ availableBoards: boards
321
+ };
322
+ }
323
+ // Low confidence (<50%) - ask user
324
+ return {
325
+ needsUserInput: true,
326
+ reason: 'low-confidence',
327
+ bestMatch,
328
+ allMatches: matches,
329
+ availableBoards: boards
330
+ };
331
+ }
332
+ /**
333
+ * Calculate match score for a board against keywords
334
+ */
335
+ calculateMatch(board, keywords, incrementId) {
336
+ let confidence = 0;
337
+ const matchedTerms = [];
338
+ let matchType = 'fuzzy';
339
+ const boardNameNormalized = this.normalizeId(board.name);
340
+ const boardNameWords = boardNameNormalized.split('-').filter(w => w.length > 2);
341
+ // Check for exact match in increment ID
342
+ if (incrementId.toLowerCase().includes(boardNameNormalized)) {
343
+ confidence += 50;
344
+ matchedTerms.push(`increment-id:${boardNameNormalized}`);
345
+ matchType = 'exact';
346
+ }
347
+ // Check each keyword against board name
348
+ for (const keyword of keywords) {
349
+ const keywordNorm = this.normalizeId(keyword);
350
+ // Exact match with board name
351
+ if (keywordNorm === boardNameNormalized) {
352
+ confidence += 40;
353
+ matchedTerms.push(`exact:${keyword}`);
354
+ matchType = 'exact';
355
+ continue;
356
+ }
357
+ // Keyword is part of board name (e.g., "clinical" in "clinical-insights")
358
+ if (boardNameNormalized.includes(keywordNorm) && keywordNorm.length > 3) {
359
+ confidence += 25;
360
+ matchedTerms.push(`partial:${keyword}`);
361
+ if (matchType !== 'exact')
362
+ matchType = 'partial';
363
+ continue;
364
+ }
365
+ // Board name word matches keyword
366
+ for (const boardWord of boardNameWords) {
367
+ if (boardWord === keywordNorm) {
368
+ confidence += 20;
369
+ matchedTerms.push(`word:${keyword}`);
370
+ if (matchType !== 'exact' && matchType !== 'partial')
371
+ matchType = 'keyword';
372
+ break;
373
+ }
374
+ // Fuzzy match (singularization)
375
+ if (this.fuzzyMatch(boardWord, keywordNorm)) {
376
+ confidence += 10;
377
+ matchedTerms.push(`fuzzy:${keyword}`);
378
+ break;
379
+ }
380
+ }
381
+ }
382
+ // Check configured keywords
383
+ if (board.keywords) {
384
+ for (const configKeyword of board.keywords) {
385
+ const configNorm = this.normalizeId(configKeyword);
386
+ for (const keyword of keywords) {
387
+ if (this.normalizeId(keyword) === configNorm) {
388
+ confidence += 30;
389
+ matchedTerms.push(`config-keyword:${keyword}`);
390
+ matchType = 'keyword';
391
+ }
392
+ }
393
+ }
394
+ }
395
+ // Check team name (from childRepo)
396
+ if (board.team) {
397
+ const teamNorm = this.normalizeId(board.team);
398
+ for (const keyword of keywords) {
399
+ if (this.normalizeId(keyword) === teamNorm) {
400
+ confidence += 25;
401
+ matchedTerms.push(`team:${keyword}`);
402
+ if (matchType !== 'exact')
403
+ matchType = 'partial';
404
+ }
405
+ }
406
+ }
407
+ // Cap at 100
408
+ confidence = Math.min(confidence, 100);
409
+ return {
410
+ boardId: board.id,
411
+ boardName: board.name,
412
+ confidence,
413
+ matchedTerms,
414
+ source: board.source,
415
+ matchType,
416
+ adoProject: board.adoProject
417
+ };
418
+ }
419
+ /**
420
+ * Fuzzy match for common variations
421
+ */
422
+ fuzzyMatch(a, b) {
423
+ // Singularization
424
+ if (a + 's' === b || b + 's' === a)
425
+ return true;
426
+ if (a.replace(/s$/, '') === b.replace(/s$/, ''))
427
+ return true;
428
+ // Common variations
429
+ const variations = {
430
+ 'ops': ['operations', 'operation'],
431
+ 'dev': ['development', 'developer'],
432
+ 'eng': ['engineering', 'engineer'],
433
+ 'mgmt': ['management'],
434
+ 'mgt': ['management'],
435
+ 'svc': ['service', 'services'],
436
+ 'sys': ['system', 'systems'],
437
+ 'config': ['configuration'],
438
+ 'auth': ['authentication', 'authorization'],
439
+ 'admin': ['administration', 'administrator']
440
+ };
441
+ for (const [abbr, full] of Object.entries(variations)) {
442
+ if ((a === abbr && full.includes(b)) || (b === abbr && full.includes(a))) {
443
+ return true;
444
+ }
445
+ }
446
+ return false;
447
+ }
448
+ /**
449
+ * Check if this is a utility/cross-cutting increment that shouldn't auto-match
450
+ */
451
+ isUtilityIncrement(specContent) {
452
+ const utilityIndicators = [
453
+ /\*\*Type\*\*:\s*utility/i,
454
+ /\*\*Type\*\*:\s*cross-cutting/i,
455
+ /\*\*Type\*\*:\s*infrastructure/i,
456
+ /\*\*Type\*\*:\s*tooling/i,
457
+ /cross-cutting/i,
458
+ /utility\s+increment/i,
459
+ /shared\s+infrastructure/i,
460
+ /platform-wide/i,
461
+ /all\s+teams/i
462
+ ];
463
+ return utilityIndicators.some(pattern => pattern.test(specContent));
464
+ }
465
+ }
466
+ //# sourceMappingURL=board-matcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"board-matcher.js","sourceRoot":"","sources":["../../../../src/core/living-docs/board-matcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAU,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAgG9D,MAAM,OAAO,YAAY;IAIvB,YACU,WAAmB,EACnB,UAA+B,EAAE;QADjC,gBAAW,GAAX,WAAW,CAAQ;QACnB,YAAO,GAAP,OAAO,CAA0B;QALnC,WAAM,GAAwB,IAAI,CAAC;QACnC,iBAAY,GAAG,KAAK,CAAC;IAK1B,CAAC;IAEJ,IAAY,MAAM;QAChB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC;IAC9C,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,UAAU;QACtB,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC;QAE1C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,wBAAwB,CAAC,CAAC;QACzE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACvD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAClC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,OAAO,IAAI,CAAC,MAAM,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACH,wBAAwB,CAAC,WAAmB;QAC1C,MAAM,QAAQ,GAAgB,IAAI,GAAG,EAAE,CAAC;QAExC,kCAAkC;QAClC,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACpD,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC9C,CAAC;QAED,+CAA+C;QAC/C,MAAM,cAAc,GAAG,WAAW,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACjE,IAAI,cAAc,EAAE,CAAC;YACnB,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAClD,CAAC;QAED,qBAAqB;QACrB,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC7D,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC7C,CAAC;QAED,iFAAiF;QACjF,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACzF,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC7C,CAAC;QAED,4BAA4B;QAC5B,MAAM,SAAS,GAAG,WAAW,CAAC,QAAQ,CAAC,6BAA6B,CAAC,CAAC;QACtE,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;YAC9B,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QACzC,CAAC;QAED,2BAA2B;QAC3B,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;YACxB,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO;YACnE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;YACnE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM;YAChE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;YAC/D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM;YAC7D,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS;YACnE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;YACpE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO;YACpE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK;YACjE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW;YACpE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO;YAC/D,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ;SACxE,CAAC,CAAC;QAEH,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,IAAY,EAAE,GAAgB;QAClD,0CAA0C;QAC1C,MAAM,KAAK,GAAG,IAAI;aACf,WAAW,EAAE;aACb,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC;aAC7B,KAAK,CAAC,QAAQ,CAAC;aACf,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAE7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC;QAED,+DAA+D;QAC/D,MAAM,UAAU,GAAG,IAAI;aACpB,WAAW,EAAE;aACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;aAC3B,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;aACnB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAEzB,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtD,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB;QACtB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACvC,MAAM,MAAM,GAAgB,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAElC,yCAAyC;QACzC,IAAI,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;YAC3B,KAAK,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC1E,IAAI,OAAO,CAAC,QAAQ,KAAK,KAAK;oBAAE,SAAS;gBAEzC,oDAAoD;gBACpD,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO;oBACxC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;oBAC1C,CAAC,CAAC,SAAS,CAAC;gBAEd,uDAAuD;gBACvD,IAAI,OAAO,CAAC,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;oBACtD,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC;wBAC9D,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;wBACtD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;4BACrB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;4BAChB,MAAM,CAAC,IAAI,CAAC;gCACV,EAAE;gCACF,IAAI,EAAE,OAAO,CAAC,gBAAgB;gCAC9B,MAAM,EAAE,iBAAiB;gCACzB,UAAU,EAAE,WAAW;gCACvB,UAAU;gCACV,QAAQ,EAAE,OAAO,CAAC,QAAQ;6BAC3B,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,sCAAsC;gBACtC,IAAI,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;oBACtC,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;wBAChD,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;wBACtC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;4BACrB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;4BAChB,MAAM,CAAC,IAAI,CAAC;gCACV,EAAE;gCACF,IAAI,EAAE,QAAQ;gCACd,MAAM,EAAE,UAAU;gCAClB,UAAU,EAAE,WAAW;gCACvB,UAAU;6BACX,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,+BAA+B;QAC/B,IAAI,MAAM,EAAE,QAAQ,EAAE,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;YACpE,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;gBAC9C,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;gBAClD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;oBACrB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAChB,MAAM,CAAC,IAAI,CAAC;wBACV,EAAE;wBACF,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE;wBAC1B,MAAM,EAAE,WAAW;wBACnB,IAAI,EAAE,IAAI,CAAC,IAAI;qBAChB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,iCAAiC;QACjC,IAAI,MAAM,EAAE,YAAY,EAAE,OAAO,IAAI,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;YAClE,KAAK,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAChF,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;gBACvC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;oBACrB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAChB,MAAM,CAAC,IAAI,CAAC;wBACV,EAAE;wBACF,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,SAAS;wBAC/B,MAAM,EAAE,cAAc;qBACvB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,sCAAsC;QACtC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gCAAgC,CAAC,CAAC;QAChF,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;gBACrE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;oBAC5B,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;wBACxF,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wBACxC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;4BACrB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;4BAChB,MAAM,CAAC,IAAI,CAAC;gCACV,EAAE;gCACF,IAAI,EAAE,KAAK,CAAC,IAAI;gCAChB,MAAM,EAAE,iBAAiB;gCACzB,SAAS,EAAE,KAAK,CAAC,IAAI;6BACtB,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,qBAAqB;YACvB,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,IAAY;QAC9B,OAAO,IAAI;aACR,WAAW,EAAE;aACb,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;aACpB,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC;aAC1B,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;aACnB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,WAAmB,EAAE,WAAmB;QAC3D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,wBAAwB,CAAC,WAAW,CAAC,CAAC;QAE5D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,6BAA6B,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAErH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO;gBACL,cAAc,EAAE,KAAK;gBACrB,MAAM,EAAE,sBAAsB;gBAC9B,UAAU,EAAE,EAAE;gBACd,eAAe,EAAE,EAAE;aACpB,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,6BAA6B;YAC7B,OAAO;gBACL,cAAc,EAAE,KAAK;gBACrB,MAAM,EAAE,cAAc;gBACtB,SAAS,EAAE;oBACT,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;oBACrB,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;oBACzB,UAAU,EAAE,GAAG;oBACf,YAAY,EAAE,EAAE;oBAChB,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM;oBACxB,SAAS,EAAE,OAAO;oBAClB,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU;iBACjC;gBACD,UAAU,EAAE,CAAC;wBACX,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;wBACrB,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;wBACzB,UAAU,EAAE,GAAG;wBACf,YAAY,EAAE,EAAE;wBAChB,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM;wBACxB,SAAS,EAAE,OAAO;wBAClB,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU;qBACjC,CAAC;gBACF,eAAe,EAAE,MAAM;aACxB,CAAC;QACJ,CAAC;QAED,sCAAsC;QACtC,MAAM,OAAO,GAAuB,EAAE,CAAC;QAEvC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;YACjE,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;gBAC1B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAED,kCAAkC;QAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;QAEpD,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAE9B,iBAAiB;QACjB,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;YAC7C,OAAO;gBACL,cAAc,EAAE,IAAI;gBACpB,MAAM,EAAE,gBAAgB;gBACxB,UAAU,EAAE,OAAO;gBACnB,eAAe,EAAE,MAAM;aACxB,CAAC;QACJ,CAAC;QAED,mEAAmE;QACnE,IAAI,SAAS,CAAC,UAAU,GAAG,EAAE,IAAI,CAAC,CAAC,UAAU,IAAI,SAAS,CAAC,UAAU,GAAG,UAAU,CAAC,UAAU,GAAG,EAAE,CAAC,EAAE,CAAC;YACpG,OAAO;gBACL,cAAc,EAAE,KAAK;gBACrB,MAAM,EAAE,uBAAuB;gBAC/B,SAAS;gBACT,UAAU,EAAE,OAAO;gBACnB,eAAe,EAAE,MAAM;aACxB,CAAC;QACJ,CAAC;QAED,4EAA4E;QAC5E,IAAI,SAAS,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;YAC/B,OAAO;gBACL,cAAc,EAAE,IAAI;gBACpB,MAAM,EAAE,sCAAsC;gBAC9C,SAAS;gBACT,UAAU,EAAE,OAAO;gBACnB,eAAe,EAAE,MAAM;aACxB,CAAC;QACJ,CAAC;QAED,mCAAmC;QACnC,OAAO;YACL,cAAc,EAAE,IAAI;YACpB,MAAM,EAAE,gBAAgB;YACxB,SAAS;YACT,UAAU,EAAE,OAAO;YACnB,eAAe,EAAE,MAAM;SACxB,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,KAAgB,EAAE,QAAkB,EAAE,WAAmB;QAC9E,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,MAAM,YAAY,GAAa,EAAE,CAAC;QAClC,IAAI,SAAS,GAAkC,OAAO,CAAC;QAEvD,MAAM,mBAAmB,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzD,MAAM,cAAc,GAAG,mBAAmB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEhF,wCAAwC;QACxC,IAAI,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;YAC5D,UAAU,IAAI,EAAE,CAAC;YACjB,YAAY,CAAC,IAAI,CAAC,gBAAgB,mBAAmB,EAAE,CAAC,CAAC;YACzD,SAAS,GAAG,OAAO,CAAC;QACtB,CAAC;QAED,wCAAwC;QACxC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAE9C,8BAA8B;YAC9B,IAAI,WAAW,KAAK,mBAAmB,EAAE,CAAC;gBACxC,UAAU,IAAI,EAAE,CAAC;gBACjB,YAAY,CAAC,IAAI,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC;gBACtC,SAAS,GAAG,OAAO,CAAC;gBACpB,SAAS;YACX,CAAC;YAED,0EAA0E;YAC1E,IAAI,mBAAmB,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxE,UAAU,IAAI,EAAE,CAAC;gBACjB,YAAY,CAAC,IAAI,CAAC,WAAW,OAAO,EAAE,CAAC,CAAC;gBACxC,IAAI,SAAS,KAAK,OAAO;oBAAE,SAAS,GAAG,SAAS,CAAC;gBACjD,SAAS;YACX,CAAC;YAED,kCAAkC;YAClC,KAAK,MAAM,SAAS,IAAI,cAAc,EAAE,CAAC;gBACvC,IAAI,SAAS,KAAK,WAAW,EAAE,CAAC;oBAC9B,UAAU,IAAI,EAAE,CAAC;oBACjB,YAAY,CAAC,IAAI,CAAC,QAAQ,OAAO,EAAE,CAAC,CAAC;oBACrC,IAAI,SAAS,KAAK,OAAO,IAAI,SAAS,KAAK,SAAS;wBAAE,SAAS,GAAG,SAAS,CAAC;oBAC5E,MAAM;gBACR,CAAC;gBACD,gCAAgC;gBAChC,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,CAAC;oBAC5C,UAAU,IAAI,EAAE,CAAC;oBACjB,YAAY,CAAC,IAAI,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC;oBACtC,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;QAED,4BAA4B;QAC5B,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,KAAK,MAAM,aAAa,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;gBACnD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;oBAC/B,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,UAAU,EAAE,CAAC;wBAC7C,UAAU,IAAI,EAAE,CAAC;wBACjB,YAAY,CAAC,IAAI,CAAC,kBAAkB,OAAO,EAAE,CAAC,CAAC;wBAC/C,SAAS,GAAG,SAAS,CAAC;oBACxB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,mCAAmC;QACnC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC9C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;oBAC3C,UAAU,IAAI,EAAE,CAAC;oBACjB,YAAY,CAAC,IAAI,CAAC,QAAQ,OAAO,EAAE,CAAC,CAAC;oBACrC,IAAI,SAAS,KAAK,OAAO;wBAAE,SAAS,GAAG,SAAS,CAAC;gBACnD,CAAC;YACH,CAAC;QACH,CAAC;QAED,aAAa;QACb,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QAEvC,OAAO;YACL,OAAO,EAAE,KAAK,CAAC,EAAE;YACjB,SAAS,EAAE,KAAK,CAAC,IAAI;YACrB,UAAU;YACV,YAAY;YACZ,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,SAAS;YACT,UAAU,EAAE,KAAK,CAAC,UAAU;SAC7B,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,UAAU,CAAC,CAAS,EAAE,CAAS;QACrC,kBAAkB;QAClB,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAChD,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC;QAE7D,oBAAoB;QACpB,MAAM,UAAU,GAA6B;YAC3C,KAAK,EAAE,CAAC,YAAY,EAAE,WAAW,CAAC;YAClC,KAAK,EAAE,CAAC,aAAa,EAAE,WAAW,CAAC;YACnC,KAAK,EAAE,CAAC,aAAa,EAAE,UAAU,CAAC;YAClC,MAAM,EAAE,CAAC,YAAY,CAAC;YACtB,KAAK,EAAE,CAAC,YAAY,CAAC;YACrB,KAAK,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC;YAC9B,KAAK,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC;YAC5B,QAAQ,EAAE,CAAC,eAAe,CAAC;YAC3B,MAAM,EAAE,CAAC,gBAAgB,EAAE,eAAe,CAAC;YAC3C,OAAO,EAAE,CAAC,gBAAgB,EAAE,eAAe,CAAC;SAC7C,CAAC;QAEF,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YACtD,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzE,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,WAAmB;QACpC,MAAM,iBAAiB,GAAG;YACxB,0BAA0B;YAC1B,gCAAgC;YAChC,iCAAiC;YACjC,0BAA0B;YAC1B,gBAAgB;YAChB,sBAAsB;YACtB,0BAA0B;YAC1B,gBAAgB;YAChB,cAAc;SACf,CAAC;QAEF,OAAO,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IACtE,CAAC;CACF"}