specweave 0.28.67 → 0.29.0

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 (239) hide show
  1. package/CLAUDE.md +3 -2
  2. package/README.md +19 -2
  3. package/dist/src/cli/commands/discrepancies.d.ts +89 -0
  4. package/dist/src/cli/commands/discrepancies.d.ts.map +1 -0
  5. package/dist/src/cli/commands/discrepancies.js +385 -0
  6. package/dist/src/cli/commands/discrepancies.js.map +1 -0
  7. package/dist/src/cli/commands/notifications.d.ts +70 -0
  8. package/dist/src/cli/commands/notifications.d.ts.map +1 -0
  9. package/dist/src/cli/commands/notifications.js +236 -0
  10. package/dist/src/cli/commands/notifications.js.map +1 -0
  11. package/dist/src/cli/commands/sync-logs.d.ts +54 -0
  12. package/dist/src/cli/commands/sync-logs.d.ts.map +1 -0
  13. package/dist/src/cli/commands/sync-logs.js +240 -0
  14. package/dist/src/cli/commands/sync-logs.js.map +1 -0
  15. package/dist/src/cli/commands/sync-monitor.d.ts +42 -0
  16. package/dist/src/cli/commands/sync-monitor.d.ts.map +1 -0
  17. package/dist/src/cli/commands/sync-monitor.js +191 -0
  18. package/dist/src/cli/commands/sync-monitor.js.map +1 -0
  19. package/dist/src/cli/helpers/init/brownfield-analysis.d.ts +45 -0
  20. package/dist/src/cli/helpers/init/brownfield-analysis.d.ts.map +1 -0
  21. package/dist/src/cli/helpers/init/brownfield-analysis.js +431 -0
  22. package/dist/src/cli/helpers/init/brownfield-analysis.js.map +1 -0
  23. package/dist/src/cli/helpers/init/index.d.ts +1 -0
  24. package/dist/src/cli/helpers/init/index.d.ts.map +1 -1
  25. package/dist/src/cli/helpers/init/index.js +2 -0
  26. package/dist/src/cli/helpers/init/index.js.map +1 -1
  27. package/dist/src/cli/helpers/issue-tracker/ado.d.ts.map +1 -1
  28. package/dist/src/cli/helpers/issue-tracker/ado.js +14 -5
  29. package/dist/src/cli/helpers/issue-tracker/ado.js.map +1 -1
  30. package/dist/src/cli/workers/brownfield-worker.d.ts +66 -0
  31. package/dist/src/cli/workers/brownfield-worker.d.ts.map +1 -0
  32. package/dist/src/cli/workers/brownfield-worker.js +417 -0
  33. package/dist/src/cli/workers/brownfield-worker.js.map +1 -0
  34. package/dist/src/core/background/brownfield-launcher.d.ts +86 -0
  35. package/dist/src/core/background/brownfield-launcher.d.ts.map +1 -0
  36. package/dist/src/core/background/brownfield-launcher.js +295 -0
  37. package/dist/src/core/background/brownfield-launcher.js.map +1 -0
  38. package/dist/src/core/background/index.d.ts +2 -0
  39. package/dist/src/core/background/index.d.ts.map +1 -1
  40. package/dist/src/core/background/index.js +2 -0
  41. package/dist/src/core/background/index.js.map +1 -1
  42. package/dist/src/core/background/types.d.ts +23 -2
  43. package/dist/src/core/background/types.d.ts.map +1 -1
  44. package/dist/src/core/config/index.d.ts +1 -0
  45. package/dist/src/core/config/index.d.ts.map +1 -1
  46. package/dist/src/core/config/index.js +1 -0
  47. package/dist/src/core/config/index.js.map +1 -1
  48. package/dist/src/core/config/types.d.ts +6 -0
  49. package/dist/src/core/config/types.d.ts.map +1 -1
  50. package/dist/src/core/config/types.js.map +1 -1
  51. package/dist/src/core/dashboard/dashboard-data.d.ts +156 -0
  52. package/dist/src/core/dashboard/dashboard-data.d.ts.map +1 -0
  53. package/dist/src/core/dashboard/dashboard-data.js +191 -0
  54. package/dist/src/core/dashboard/dashboard-data.js.map +1 -0
  55. package/dist/src/core/dashboard/index.d.ts +9 -0
  56. package/dist/src/core/dashboard/index.d.ts.map +1 -0
  57. package/dist/src/core/dashboard/index.js +9 -0
  58. package/dist/src/core/dashboard/index.js.map +1 -0
  59. package/dist/src/core/discrepancy/analyzers/api-route-analyzer.d.ts +77 -0
  60. package/dist/src/core/discrepancy/analyzers/api-route-analyzer.d.ts.map +1 -0
  61. package/dist/src/core/discrepancy/analyzers/api-route-analyzer.js +286 -0
  62. package/dist/src/core/discrepancy/analyzers/api-route-analyzer.js.map +1 -0
  63. package/dist/src/core/discrepancy/analyzers/index.d.ts +8 -0
  64. package/dist/src/core/discrepancy/analyzers/index.d.ts.map +1 -0
  65. package/dist/src/core/discrepancy/analyzers/index.js +8 -0
  66. package/dist/src/core/discrepancy/analyzers/index.js.map +1 -0
  67. package/dist/src/core/discrepancy/analyzers/typescript-analyzer.d.ts +96 -0
  68. package/dist/src/core/discrepancy/analyzers/typescript-analyzer.d.ts.map +1 -0
  69. package/dist/src/core/discrepancy/analyzers/typescript-analyzer.js +247 -0
  70. package/dist/src/core/discrepancy/analyzers/typescript-analyzer.js.map +1 -0
  71. package/dist/src/core/discrepancy/brownfield-manager.d.ts +88 -0
  72. package/dist/src/core/discrepancy/brownfield-manager.d.ts.map +1 -0
  73. package/dist/src/core/discrepancy/brownfield-manager.js +520 -0
  74. package/dist/src/core/discrepancy/brownfield-manager.js.map +1 -0
  75. package/dist/src/core/discrepancy/brownfield-types.d.ts +174 -0
  76. package/dist/src/core/discrepancy/brownfield-types.d.ts.map +1 -0
  77. package/dist/src/core/discrepancy/brownfield-types.js +11 -0
  78. package/dist/src/core/discrepancy/brownfield-types.js.map +1 -0
  79. package/dist/src/core/discrepancy/detector.d.ts +92 -0
  80. package/dist/src/core/discrepancy/detector.d.ts.map +1 -0
  81. package/dist/src/core/discrepancy/detector.js +346 -0
  82. package/dist/src/core/discrepancy/detector.js.map +1 -0
  83. package/dist/src/core/discrepancy/increment-generator.d.ts +51 -0
  84. package/dist/src/core/discrepancy/increment-generator.d.ts.map +1 -0
  85. package/dist/src/core/discrepancy/increment-generator.js +234 -0
  86. package/dist/src/core/discrepancy/increment-generator.js.map +1 -0
  87. package/dist/src/core/discrepancy/index.d.ts +18 -0
  88. package/dist/src/core/discrepancy/index.d.ts.map +1 -0
  89. package/dist/src/core/discrepancy/index.js +24 -0
  90. package/dist/src/core/discrepancy/index.js.map +1 -0
  91. package/dist/src/core/discrepancy/severity-classifier.d.ts +81 -0
  92. package/dist/src/core/discrepancy/severity-classifier.d.ts.map +1 -0
  93. package/dist/src/core/discrepancy/severity-classifier.js +289 -0
  94. package/dist/src/core/discrepancy/severity-classifier.js.map +1 -0
  95. package/dist/src/core/discrepancy/spec-parser.d.ts +74 -0
  96. package/dist/src/core/discrepancy/spec-parser.d.ts.map +1 -0
  97. package/dist/src/core/discrepancy/spec-parser.js +213 -0
  98. package/dist/src/core/discrepancy/spec-parser.js.map +1 -0
  99. package/dist/src/core/discrepancy/update-recommender.d.ts +77 -0
  100. package/dist/src/core/discrepancy/update-recommender.d.ts.map +1 -0
  101. package/dist/src/core/discrepancy/update-recommender.js +323 -0
  102. package/dist/src/core/discrepancy/update-recommender.js.map +1 -0
  103. package/dist/src/core/living-docs/living-docs-sync.d.ts +13 -16
  104. package/dist/src/core/living-docs/living-docs-sync.d.ts.map +1 -1
  105. package/dist/src/core/living-docs/living-docs-sync.js +31 -112
  106. package/dist/src/core/living-docs/living-docs-sync.js.map +1 -1
  107. package/dist/src/core/logs/index.d.ts +10 -0
  108. package/dist/src/core/logs/index.d.ts.map +1 -0
  109. package/dist/src/core/logs/index.js +10 -0
  110. package/dist/src/core/logs/index.js.map +1 -0
  111. package/dist/src/core/logs/log-aggregator.d.ts +130 -0
  112. package/dist/src/core/logs/log-aggregator.d.ts.map +1 -0
  113. package/dist/src/core/logs/log-aggregator.js +206 -0
  114. package/dist/src/core/logs/log-aggregator.js.map +1 -0
  115. package/dist/src/core/logs/log-exporter.d.ts +81 -0
  116. package/dist/src/core/logs/log-exporter.d.ts.map +1 -0
  117. package/dist/src/core/logs/log-exporter.js +141 -0
  118. package/dist/src/core/logs/log-exporter.js.map +1 -0
  119. package/dist/src/core/notifications/command-integration.d.ts +82 -0
  120. package/dist/src/core/notifications/command-integration.d.ts.map +1 -0
  121. package/dist/src/core/notifications/command-integration.js +80 -0
  122. package/dist/src/core/notifications/command-integration.js.map +1 -0
  123. package/dist/src/core/notifications/index.d.ts +12 -0
  124. package/dist/src/core/notifications/index.d.ts.map +1 -0
  125. package/dist/src/core/notifications/index.js +12 -0
  126. package/dist/src/core/notifications/index.js.map +1 -0
  127. package/dist/src/core/notifications/notification-display.d.ts +70 -0
  128. package/dist/src/core/notifications/notification-display.d.ts.map +1 -0
  129. package/dist/src/core/notifications/notification-display.js +177 -0
  130. package/dist/src/core/notifications/notification-display.js.map +1 -0
  131. package/dist/src/core/notifications/notification-manager.d.ts +126 -0
  132. package/dist/src/core/notifications/notification-manager.d.ts.map +1 -0
  133. package/dist/src/core/notifications/notification-manager.js +287 -0
  134. package/dist/src/core/notifications/notification-manager.js.map +1 -0
  135. package/dist/src/core/notifications/notification-types.d.ts +159 -0
  136. package/dist/src/core/notifications/notification-types.d.ts.map +1 -0
  137. package/dist/src/core/notifications/notification-types.js +93 -0
  138. package/dist/src/core/notifications/notification-types.js.map +1 -0
  139. package/dist/src/core/scheduler/index.d.ts +11 -0
  140. package/dist/src/core/scheduler/index.d.ts.map +1 -0
  141. package/dist/src/core/scheduler/index.js +11 -0
  142. package/dist/src/core/scheduler/index.js.map +1 -0
  143. package/dist/src/core/scheduler/job-scheduler.d.ts +179 -0
  144. package/dist/src/core/scheduler/job-scheduler.d.ts.map +1 -0
  145. package/dist/src/core/scheduler/job-scheduler.js +282 -0
  146. package/dist/src/core/scheduler/job-scheduler.js.map +1 -0
  147. package/dist/src/core/scheduler/schedule-persistence.d.ts +83 -0
  148. package/dist/src/core/scheduler/schedule-persistence.d.ts.map +1 -0
  149. package/dist/src/core/scheduler/schedule-persistence.js +180 -0
  150. package/dist/src/core/scheduler/schedule-persistence.js.map +1 -0
  151. package/dist/src/core/scheduler/scheduled-job.d.ts +188 -0
  152. package/dist/src/core/scheduler/scheduled-job.d.ts.map +1 -0
  153. package/dist/src/core/scheduler/scheduled-job.js +182 -0
  154. package/dist/src/core/scheduler/scheduled-job.js.map +1 -0
  155. package/dist/src/core/sync/permission-enforcer.d.ts +206 -0
  156. package/dist/src/core/sync/permission-enforcer.d.ts.map +1 -0
  157. package/dist/src/core/sync/permission-enforcer.js +268 -0
  158. package/dist/src/core/sync/permission-enforcer.js.map +1 -0
  159. package/dist/src/core/sync/sync-audit-logger.d.ts +217 -0
  160. package/dist/src/core/sync/sync-audit-logger.d.ts.map +1 -0
  161. package/dist/src/core/sync/sync-audit-logger.js +327 -0
  162. package/dist/src/core/sync/sync-audit-logger.js.map +1 -0
  163. package/dist/src/core/sync/sync-interceptor.d.ts +190 -0
  164. package/dist/src/core/sync/sync-interceptor.d.ts.map +1 -0
  165. package/dist/src/core/sync/sync-interceptor.js +224 -0
  166. package/dist/src/core/sync/sync-interceptor.js.map +1 -0
  167. package/dist/src/core/types/increment-metadata.d.ts +5 -2
  168. package/dist/src/core/types/increment-metadata.d.ts.map +1 -1
  169. package/dist/src/core/types/sync-config.d.ts +267 -0
  170. package/dist/src/core/types/sync-config.d.ts.map +1 -0
  171. package/dist/src/core/types/sync-config.js +304 -0
  172. package/dist/src/core/types/sync-config.js.map +1 -0
  173. package/dist/src/hooks/index.d.ts +11 -0
  174. package/dist/src/hooks/index.d.ts.map +1 -0
  175. package/dist/src/hooks/index.js +11 -0
  176. package/dist/src/hooks/index.js.map +1 -0
  177. package/dist/src/hooks/platform.d.ts +125 -0
  178. package/dist/src/hooks/platform.d.ts.map +1 -0
  179. package/dist/src/hooks/platform.js +325 -0
  180. package/dist/src/hooks/platform.js.map +1 -0
  181. package/dist/src/hooks/processor.d.ts +20 -0
  182. package/dist/src/hooks/processor.d.ts.map +1 -0
  183. package/dist/src/hooks/processor.js +317 -0
  184. package/dist/src/hooks/processor.js.map +1 -0
  185. package/dist/src/hooks/scheduler-startup.d.ts +19 -0
  186. package/dist/src/hooks/scheduler-startup.d.ts.map +1 -0
  187. package/dist/src/hooks/scheduler-startup.js +92 -0
  188. package/dist/src/hooks/scheduler-startup.js.map +1 -0
  189. package/dist/src/hooks/session-start.d.ts +16 -0
  190. package/dist/src/hooks/session-start.d.ts.map +1 -0
  191. package/dist/src/hooks/session-start.js +92 -0
  192. package/dist/src/hooks/session-start.js.map +1 -0
  193. package/dist/src/importers/duplicate-detector.d.ts +13 -2
  194. package/dist/src/importers/duplicate-detector.d.ts.map +1 -1
  195. package/dist/src/importers/duplicate-detector.js +21 -2
  196. package/dist/src/importers/duplicate-detector.js.map +1 -1
  197. package/dist/src/importers/item-converter.d.ts +41 -2
  198. package/dist/src/importers/item-converter.d.ts.map +1 -1
  199. package/dist/src/importers/item-converter.js +231 -45
  200. package/dist/src/importers/item-converter.js.map +1 -1
  201. package/dist/src/living-docs/fs-id-allocator.d.ts +7 -0
  202. package/dist/src/living-docs/fs-id-allocator.d.ts.map +1 -1
  203. package/dist/src/living-docs/fs-id-allocator.js +30 -4
  204. package/dist/src/living-docs/fs-id-allocator.js.map +1 -1
  205. package/dist/src/sync/ado-sync-wrapper.d.ts +137 -0
  206. package/dist/src/sync/ado-sync-wrapper.d.ts.map +1 -0
  207. package/dist/src/sync/ado-sync-wrapper.js +148 -0
  208. package/dist/src/sync/ado-sync-wrapper.js.map +1 -0
  209. package/dist/src/sync/github-sync-wrapper.d.ts +195 -0
  210. package/dist/src/sync/github-sync-wrapper.d.ts.map +1 -0
  211. package/dist/src/sync/github-sync-wrapper.js +220 -0
  212. package/dist/src/sync/github-sync-wrapper.js.map +1 -0
  213. package/dist/src/sync/jira-sync-wrapper.d.ts +155 -0
  214. package/dist/src/sync/jira-sync-wrapper.d.ts.map +1 -0
  215. package/dist/src/sync/jira-sync-wrapper.js +175 -0
  216. package/dist/src/sync/jira-sync-wrapper.js.map +1 -0
  217. package/dist/src/utils/feature-id-derivation.d.ts +58 -0
  218. package/dist/src/utils/feature-id-derivation.d.ts.map +1 -0
  219. package/dist/src/utils/feature-id-derivation.js +77 -0
  220. package/dist/src/utils/feature-id-derivation.js.map +1 -0
  221. package/package.json +1 -1
  222. package/plugins/specweave/commands/specweave-discrepancies.md +141 -0
  223. package/plugins/specweave/commands/specweave-discrepancy-to-increment.md +160 -0
  224. package/plugins/specweave/commands/specweave-jobs.md +45 -2
  225. package/plugins/specweave/commands/specweave-notifications.md +92 -0
  226. package/plugins/specweave/commands/specweave-sync-logs.md +131 -0
  227. package/plugins/specweave/commands/specweave-sync-monitor.md +57 -0
  228. package/plugins/specweave/hooks/hooks.json +3 -3
  229. package/plugins/specweave/hooks/lib/scheduler-startup.sh +72 -0
  230. package/plugins/specweave/hooks/universal/dispatcher.mjs +246 -0
  231. package/plugins/specweave/hooks/universal/session-start.cmd +16 -0
  232. package/plugins/specweave/hooks/universal/session-start.ps1 +16 -0
  233. package/plugins/specweave/hooks/v2/dispatchers/session-start.sh +14 -5
  234. package/plugins/specweave/lib/vendor/core/types/increment-metadata.d.ts +5 -2
  235. package/plugins/specweave/skills/discrepancy-viewer.md +154 -0
  236. package/plugins/specweave-ado/lib/ado-project-detector.js +11 -5
  237. package/plugins/specweave-ado/lib/ado-project-detector.ts +16 -5
  238. package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +34 -0
  239. package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +51 -0
package/CLAUDE.md CHANGED
@@ -212,9 +212,9 @@ src/cli/helpers/init/
212
212
  ```yaml
213
213
  ---
214
214
  increment: 0001-feature-name # REQUIRED
215
- feature_id: FS-001 # OPTIONAL
216
215
  ---
217
216
  ```
217
+ **NOTE**: `feature_id` is derived from increment number (0001 → FS-001), not stored
218
218
 
219
219
  ### ADR Naming
220
220
  **Format**: `XXXX-decision-title.md` (4-digit, NO `adr-` prefix)
@@ -231,7 +231,8 @@ feature_id: FS-001 # OPTIONAL
231
231
  ### Structured Data Matching
232
232
  ```typescript
233
233
  // ❌ WRONG: content.includes('FS-039') // Matches "See FS-039"!
234
- // ✅ CORRECT: content.match(/^feature_id:\s*["']?([^"'\n]+)["']?$/m)
234
+ // ✅ CORRECT: Use deriveFeatureId() from src/utils/feature-id-derivation.ts
235
+ // or match folder patterns: /^FS-\d{3,}E?$/
235
236
  ```
236
237
 
237
238
  ### GitHub Duplicates
package/README.md CHANGED
@@ -267,6 +267,9 @@ Three gates before any increment closes:
267
267
  | `/specweave:validate 0001` | Run quality checks |
268
268
  | `/specweave:sync-progress` | Sync to GitHub/JIRA/ADO |
269
269
  | `/specweave:tdd-cycle` | Full red-green-refactor workflow |
270
+ | `/specweave:discrepancies` | View brownfield documentation gaps |
271
+ | `/specweave:discrepancy-to-increment` | Convert gaps to actionable increments |
272
+ | `/specweave:jobs` | Monitor background jobs (analysis, import) |
270
273
 
271
274
  **[Full Command Reference](https://spec-weave.com/docs/commands/overview)**
272
275
 
@@ -276,8 +279,22 @@ Three gates before any increment closes:
276
279
 
277
280
  **10-Year-Old Legacy Codebase?**
278
281
  ```bash
279
- specweave init . --brownfield
280
- # Analyzes existing code, imports from JIRA/GitHub, creates specs from reality
282
+ specweave init .
283
+ # During init, choose "Run brownfield analysis" to scan for documentation gaps
284
+ # Or run manually later: /specweave:discrepancies
285
+ ```
286
+
287
+ **What happens?** Brownfield analysis scans your codebase and creates **discrepancies** — actionable documentation gaps:
288
+ - `missing-docs` — Undocumented code exports
289
+ - `stale-docs` — Documentation out of sync with code
290
+ - `knowledge-gap` — Single-contributor modules (bus factor risk)
291
+ - `orphan-doc` — Docs for deleted code
292
+ - `missing-adr` — Significant patterns without ADRs
293
+
294
+ Convert discrepancies to increments:
295
+ ```bash
296
+ /specweave:discrepancies # View all gaps
297
+ /specweave:discrepancy-to-increment DISC-0001 # Create increment from gap
281
298
  ```
282
299
 
283
300
  **Fresh Startup MVP?**
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Discrepancies Command
3
+ *
4
+ * View and act on code-to-spec discrepancies.
5
+ *
6
+ * @module cli/commands/discrepancies
7
+ */
8
+ import { Command } from 'commander';
9
+ import { Discrepancy, DiscrepancySeverity, DiscrepancyType } from '../../core/discrepancy/detector.js';
10
+ import { Logger } from '../../utils/logger.js';
11
+ /**
12
+ * Discrepancies command options
13
+ */
14
+ export interface DiscrepanciesOptions {
15
+ check?: boolean;
16
+ severity?: DiscrepancySeverity;
17
+ type?: DiscrepancyType;
18
+ json?: boolean;
19
+ }
20
+ /**
21
+ * Persisted discrepancy state
22
+ */
23
+ interface DiscrepancyState {
24
+ discrepancies: Discrepancy[];
25
+ dismissed: string[];
26
+ lastCheck: string;
27
+ }
28
+ /**
29
+ * Create the discrepancies command
30
+ */
31
+ export declare function createDiscrepanciesCommand(options?: {
32
+ logger?: Logger;
33
+ specweavePath?: string;
34
+ }): Command;
35
+ /**
36
+ * List discrepancies
37
+ */
38
+ export declare function listDiscrepancies(options: DiscrepanciesOptions & {
39
+ logger?: Logger;
40
+ specweavePath?: string;
41
+ }): Promise<void>;
42
+ /**
43
+ * Run discrepancy detection
44
+ */
45
+ export declare function runCheck(options: {
46
+ logger?: Logger;
47
+ specweavePath?: string;
48
+ }): Promise<void>;
49
+ /**
50
+ * Show discrepancy details
51
+ */
52
+ export declare function showDiscrepancy(id: string, options: {
53
+ json?: boolean;
54
+ logger?: Logger;
55
+ specweavePath?: string;
56
+ }): Promise<void>;
57
+ /**
58
+ * Accept (apply patch) for a discrepancy
59
+ */
60
+ export declare function acceptDiscrepancy(id: string, options: {
61
+ skipConfirm?: boolean;
62
+ logger?: Logger;
63
+ specweavePath?: string;
64
+ }): Promise<void>;
65
+ /**
66
+ * Dismiss a discrepancy
67
+ */
68
+ export declare function dismissDiscrepancy(id: string, options: {
69
+ logger?: Logger;
70
+ specweavePath?: string;
71
+ }): Promise<void>;
72
+ /**
73
+ * Load discrepancy state from disk
74
+ */
75
+ declare function loadState(specweavePath: string): Promise<DiscrepancyState>;
76
+ /**
77
+ * Save discrepancy state to disk
78
+ */
79
+ declare function saveState(specweavePath: string, state: DiscrepancyState): Promise<void>;
80
+ /**
81
+ * Format a discrepancy for list display
82
+ */
83
+ declare function formatDiscrepancyLine(disc: Discrepancy): string;
84
+ /**
85
+ * Format recommendation for display
86
+ */
87
+ declare function formatRecommendation(rec: string): string;
88
+ export { formatDiscrepancyLine, formatRecommendation, loadState, saveState, };
89
+ //# sourceMappingURL=discrepancies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discrepancies.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/discrepancies.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,eAAe,EAEhB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,MAAM,EAAiB,MAAM,uBAAuB,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,UAAU,gBAAgB;IACxB,aAAa,EAAE,WAAW,EAAE,CAAC;IAC7B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAYD;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,GAAE;IAClD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CA6Df;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,oBAAoB,GAAG;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0ChB;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2ChB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,EAAE,EAAE,MAAM,EACV,OAAO,EAAE;IACP,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GACA,OAAO,CAAC,IAAI,CAAC,CA0Df;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,MAAM,EACV,OAAO,EAAE;IACP,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GACA,OAAO,CAAC,IAAI,CAAC,CAiDf;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,MAAM,EACV,OAAO,EAAE;IACP,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GACA,OAAO,CAAC,IAAI,CAAC,CAuBf;AA4BD;;GAEG;AACH,iBAAe,SAAS,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAazE;AAED;;GAEG;AACH,iBAAe,SAAS,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAMtF;AAED;;GAEG;AACH,iBAAS,qBAAqB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAQxD;AAED;;GAEG;AACH,iBAAS,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAajD;AA4BD,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,SAAS,EACT,SAAS,GACV,CAAC"}
@@ -0,0 +1,385 @@
1
+ /**
2
+ * Discrepancies Command
3
+ *
4
+ * View and act on code-to-spec discrepancies.
5
+ *
6
+ * @module cli/commands/discrepancies
7
+ */
8
+ import { Command } from 'commander';
9
+ import { promises as fs } from 'fs';
10
+ import path from 'path';
11
+ import { UpdateRecommender } from '../../core/discrepancy/update-recommender.js';
12
+ import { consoleLogger } from '../../utils/logger.js';
13
+ /**
14
+ * Severity emojis
15
+ */
16
+ const SEVERITY_EMOJI = {
17
+ trivial: '✅',
18
+ minor: '⚠️',
19
+ major: '⚠️',
20
+ breaking: '❌',
21
+ };
22
+ /**
23
+ * Create the discrepancies command
24
+ */
25
+ export function createDiscrepanciesCommand(options = {}) {
26
+ const logger = options.logger ?? consoleLogger;
27
+ const specweavePath = options.specweavePath ?? path.join(process.cwd(), '.specweave');
28
+ const command = new Command('discrepancies')
29
+ .description('View and act on code-to-spec discrepancies')
30
+ .option('--check', 'Run discrepancy check now')
31
+ .option('--severity <level>', 'Filter by severity')
32
+ .option('--type <type>', 'Filter by discrepancy type')
33
+ .option('--json', 'Output as JSON')
34
+ .action(async (cmdOptions) => {
35
+ if (cmdOptions.check) {
36
+ await runCheck({ logger, specweavePath });
37
+ }
38
+ else {
39
+ await listDiscrepancies({
40
+ ...cmdOptions,
41
+ logger,
42
+ specweavePath,
43
+ });
44
+ }
45
+ });
46
+ // Subcommand: show
47
+ command
48
+ .command('show <id>')
49
+ .description('Show discrepancy details')
50
+ .option('--json', 'Output as JSON')
51
+ .action(async (id, opts) => {
52
+ await showDiscrepancy(id, {
53
+ json: opts.json,
54
+ logger,
55
+ specweavePath,
56
+ });
57
+ });
58
+ // Subcommand: check
59
+ command
60
+ .command('check')
61
+ .description('Run discrepancy detection now')
62
+ .action(async () => {
63
+ await runCheck({ logger, specweavePath });
64
+ });
65
+ // Subcommand: accept
66
+ command
67
+ .command('accept <id>')
68
+ .description('Apply recommended patch')
69
+ .option('-y, --yes', 'Skip confirmation')
70
+ .action(async (id, opts) => {
71
+ await acceptDiscrepancy(id, { skipConfirm: opts.yes, logger, specweavePath });
72
+ });
73
+ // Subcommand: dismiss
74
+ command
75
+ .command('dismiss <id>')
76
+ .description('Mark as intentional')
77
+ .action(async (id) => {
78
+ await dismissDiscrepancy(id, { logger, specweavePath });
79
+ });
80
+ return command;
81
+ }
82
+ /**
83
+ * List discrepancies
84
+ */
85
+ export async function listDiscrepancies(options) {
86
+ const specweavePath = options.specweavePath ?? path.join(process.cwd(), '.specweave');
87
+ const state = await loadState(specweavePath);
88
+ // Filter out dismissed
89
+ let discrepancies = state.discrepancies.filter(d => !state.dismissed.includes(d.id));
90
+ // Apply filters
91
+ if (options.severity) {
92
+ discrepancies = discrepancies.filter(d => d.severity === options.severity);
93
+ }
94
+ if (options.type) {
95
+ discrepancies = discrepancies.filter(d => d.type === options.type);
96
+ }
97
+ if (options.json) {
98
+ console.log(JSON.stringify(discrepancies, null, 2));
99
+ return;
100
+ }
101
+ console.log(`🔍 DETECTED DISCREPANCIES (${discrepancies.length})`);
102
+ console.log('━'.repeat(60));
103
+ if (discrepancies.length === 0) {
104
+ if (state.lastCheck) {
105
+ console.log(`No discrepancies found (last check: ${formatRelativeTime(state.lastCheck)})`);
106
+ }
107
+ else {
108
+ console.log('No discrepancies found. Run --check to detect discrepancies.');
109
+ }
110
+ return;
111
+ }
112
+ for (const disc of discrepancies) {
113
+ console.log(formatDiscrepancyLine(disc));
114
+ }
115
+ console.log('');
116
+ console.log("Use '/specweave:discrepancies show <id>' to view details");
117
+ console.log("Use '/specweave:discrepancies accept <id>' to apply patch");
118
+ }
119
+ /**
120
+ * Run discrepancy detection
121
+ */
122
+ export async function runCheck(options) {
123
+ const logger = options.logger ?? consoleLogger;
124
+ const specweavePath = options.specweavePath ?? path.join(process.cwd(), '.specweave');
125
+ console.log('🔍 Running discrepancy check...');
126
+ console.log('');
127
+ // For now, create a placeholder result since we need the full analyzer setup
128
+ // In production, this would call DiscrepancyDetector with TypeScriptAnalyzer
129
+ const state = await loadState(specweavePath);
130
+ // Simulate check results (in real implementation, would run analyzers)
131
+ console.log('Analyzing:');
132
+ console.log(' ✓ TypeScript functions: scanning...');
133
+ console.log(' ✓ Type definitions: scanning...');
134
+ console.log(' ✓ API routes: scanning...');
135
+ console.log('');
136
+ console.log('Comparing against specs...');
137
+ console.log('');
138
+ // Count by severity
139
+ const bySeverity = {
140
+ breaking: state.discrepancies.filter(d => d.severity === 'breaking').length,
141
+ major: state.discrepancies.filter(d => d.severity === 'major').length,
142
+ minor: state.discrepancies.filter(d => d.severity === 'minor').length,
143
+ trivial: state.discrepancies.filter(d => d.severity === 'trivial').length,
144
+ };
145
+ const total = state.discrepancies.length;
146
+ console.log(`Results:`);
147
+ console.log(` Found ${total} discrepancies`);
148
+ if (total > 0) {
149
+ console.log(` - Breaking: ${bySeverity.breaking}`);
150
+ console.log(` - Major: ${bySeverity.major}`);
151
+ console.log(` - Minor: ${bySeverity.minor}`);
152
+ console.log(` - Trivial: ${bySeverity.trivial}`);
153
+ }
154
+ console.log('');
155
+ console.log("Use '/specweave:discrepancies' to view list");
156
+ // Update last check timestamp
157
+ state.lastCheck = new Date().toISOString();
158
+ await saveState(specweavePath, state);
159
+ }
160
+ /**
161
+ * Show discrepancy details
162
+ */
163
+ export async function showDiscrepancy(id, options) {
164
+ const specweavePath = options.specweavePath ?? path.join(process.cwd(), '.specweave');
165
+ const state = await loadState(specweavePath);
166
+ const disc = state.discrepancies.find(d => d.id === id);
167
+ if (!disc) {
168
+ console.error(`❌ Discrepancy not found: ${id}`);
169
+ process.exitCode = 1;
170
+ return;
171
+ }
172
+ // Generate recommendation
173
+ const recommender = new UpdateRecommender();
174
+ const recommendation = recommender.recommend(disc);
175
+ if (options.json) {
176
+ console.log(JSON.stringify({ discrepancy: disc, recommendation }, null, 2));
177
+ return;
178
+ }
179
+ const emoji = SEVERITY_EMOJI[disc.severity];
180
+ console.log('🔍 DISCREPANCY DETAILS');
181
+ console.log('━'.repeat(50));
182
+ console.log('');
183
+ console.log(`ID: ${disc.id}`);
184
+ console.log(`Type: ${disc.type}`);
185
+ console.log(`Category: ${disc.category}`);
186
+ console.log(`Severity: ${emoji} ${disc.severity}`);
187
+ console.log(`Risk: ${recommendation.riskLevel}`);
188
+ console.log('');
189
+ console.log(`Spec Value: ${disc.specValue || '(none)'}`);
190
+ console.log(`Code Value: ${disc.codeValue || '(none)'}`);
191
+ console.log('');
192
+ if (disc.specPath) {
193
+ console.log(`Spec File: ${disc.specPath}:${disc.specLineNumber}`);
194
+ }
195
+ if (disc.codePath) {
196
+ console.log(`Code File: ${disc.codePath}:${disc.codeLineNumber}`);
197
+ }
198
+ console.log('');
199
+ console.log(`Description: ${disc.description}`);
200
+ console.log('');
201
+ console.log(`Recommended: ${formatRecommendation(recommendation.recommendation)}`);
202
+ console.log(`Patch: ${recommendation.patch ? 'Available' : 'Not available'}`);
203
+ if (recommendation.patch) {
204
+ console.log('');
205
+ console.log('Suggested patch:');
206
+ console.log(` File: ${recommendation.patch.filePath}`);
207
+ console.log(` - ${recommendation.patch.originalText || '(empty)'}`);
208
+ console.log(` + ${recommendation.patch.newText.split('\n')[0]}...`);
209
+ }
210
+ console.log('');
211
+ console.log(`Use '/specweave:discrepancies accept ${id}' to apply patch`);
212
+ console.log(`Use '/specweave:discrepancies dismiss ${id}' to mark intentional`);
213
+ }
214
+ /**
215
+ * Accept (apply patch) for a discrepancy
216
+ */
217
+ export async function acceptDiscrepancy(id, options) {
218
+ const logger = options.logger ?? consoleLogger;
219
+ const specweavePath = options.specweavePath ?? path.join(process.cwd(), '.specweave');
220
+ const state = await loadState(specweavePath);
221
+ const disc = state.discrepancies.find(d => d.id === id);
222
+ if (!disc) {
223
+ console.error(`❌ Discrepancy not found: ${id}`);
224
+ process.exitCode = 1;
225
+ return;
226
+ }
227
+ const recommender = new UpdateRecommender();
228
+ const recommendation = recommender.recommend(disc);
229
+ if (!recommendation.patch) {
230
+ console.error(`❌ No patch available for ${id}`);
231
+ console.log('This discrepancy requires manual resolution.');
232
+ process.exitCode = 1;
233
+ return;
234
+ }
235
+ if (!options.skipConfirm) {
236
+ console.log(`🔧 Patch for ${id}:`);
237
+ console.log(` File: ${recommendation.patch.filePath}`);
238
+ console.log(` Change: ${recommendation.patch.reason}`);
239
+ console.log('');
240
+ console.log('Use --yes flag to apply: /specweave:discrepancies accept --yes ' + id);
241
+ return;
242
+ }
243
+ // Apply the patch
244
+ console.log(`🔧 Applying patch for ${id}...`);
245
+ try {
246
+ await applyPatch(recommendation.patch, process.cwd());
247
+ // Remove from discrepancies
248
+ state.discrepancies = state.discrepancies.filter(d => d.id !== id);
249
+ await saveState(specweavePath, state);
250
+ console.log(`✅ Patch applied successfully`);
251
+ console.log(`Remaining: ${state.discrepancies.length} discrepancies`);
252
+ }
253
+ catch (error) {
254
+ logger.error(`Failed to apply patch: ${error}`);
255
+ console.error(`❌ Failed to apply patch: ${error}`);
256
+ process.exitCode = 1;
257
+ }
258
+ }
259
+ /**
260
+ * Dismiss a discrepancy
261
+ */
262
+ export async function dismissDiscrepancy(id, options) {
263
+ const specweavePath = options.specweavePath ?? path.join(process.cwd(), '.specweave');
264
+ const state = await loadState(specweavePath);
265
+ const disc = state.discrepancies.find(d => d.id === id);
266
+ if (!disc) {
267
+ console.error(`❌ Discrepancy not found: ${id}`);
268
+ process.exitCode = 1;
269
+ return;
270
+ }
271
+ if (state.dismissed.includes(id)) {
272
+ console.log(`ℹ️ Discrepancy ${id} is already dismissed`);
273
+ return;
274
+ }
275
+ state.dismissed.push(id);
276
+ await saveState(specweavePath, state);
277
+ const remaining = state.discrepancies.filter(d => !state.dismissed.includes(d.id));
278
+ console.log(`✅ Dismissed ${id} (marked as intentional)`);
279
+ console.log(`Remaining: ${remaining.length} discrepancies`);
280
+ }
281
+ /**
282
+ * Apply a patch to a file
283
+ */
284
+ async function applyPatch(patch, rootDir) {
285
+ const filePath = path.isAbsolute(patch.filePath)
286
+ ? patch.filePath
287
+ : path.join(rootDir, patch.filePath);
288
+ // For new content (lineNumber = 0), append to file or create it
289
+ if (patch.lineNumber === 0 && !patch.originalText) {
290
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
291
+ const existing = await fs.readFile(filePath, 'utf-8').catch(() => '');
292
+ await fs.writeFile(filePath, existing + '\n\n' + patch.newText, 'utf-8');
293
+ return;
294
+ }
295
+ // For modifications, replace the text
296
+ const content = await fs.readFile(filePath, 'utf-8');
297
+ if (!content.includes(patch.originalText)) {
298
+ throw new Error(`Original text not found in ${filePath}`);
299
+ }
300
+ const updated = content.replace(patch.originalText, patch.newText);
301
+ await fs.writeFile(filePath, updated, 'utf-8');
302
+ }
303
+ /**
304
+ * Load discrepancy state from disk
305
+ */
306
+ async function loadState(specweavePath) {
307
+ const statePath = path.join(specweavePath, 'state', 'discrepancies.json');
308
+ try {
309
+ const content = await fs.readFile(statePath, 'utf-8');
310
+ return JSON.parse(content);
311
+ }
312
+ catch {
313
+ return {
314
+ discrepancies: [],
315
+ dismissed: [],
316
+ lastCheck: '',
317
+ };
318
+ }
319
+ }
320
+ /**
321
+ * Save discrepancy state to disk
322
+ */
323
+ async function saveState(specweavePath, state) {
324
+ const stateDir = path.join(specweavePath, 'state');
325
+ await fs.mkdir(stateDir, { recursive: true });
326
+ const statePath = path.join(stateDir, 'discrepancies.json');
327
+ await fs.writeFile(statePath, JSON.stringify(state, null, 2), 'utf-8');
328
+ }
329
+ /**
330
+ * Format a discrepancy for list display
331
+ */
332
+ function formatDiscrepancyLine(disc) {
333
+ const id = disc.id.padEnd(12);
334
+ const emoji = SEVERITY_EMOJI[disc.severity];
335
+ const severity = disc.severity.toUpperCase().padEnd(8);
336
+ const type = disc.type.padEnd(20);
337
+ const description = truncate(disc.description, 30);
338
+ return `${id} ${emoji} ${severity} ${type} ${description}`;
339
+ }
340
+ /**
341
+ * Format recommendation for display
342
+ */
343
+ function formatRecommendation(rec) {
344
+ switch (rec) {
345
+ case 'auto-update':
346
+ return '✅ auto-update (safe to apply)';
347
+ case 'review-required':
348
+ return '👀 review-required (check before applying)';
349
+ case 'notify':
350
+ return '📢 notify (communicate to stakeholders)';
351
+ case 'alert':
352
+ return '⚠️ alert (breaking change - handle manually)';
353
+ default:
354
+ return rec;
355
+ }
356
+ }
357
+ /**
358
+ * Format time relative to now
359
+ */
360
+ function formatRelativeTime(isoDate) {
361
+ const timestamp = new Date(isoDate).getTime();
362
+ const now = Date.now();
363
+ const diffMs = now - timestamp;
364
+ if (diffMs < 60 * 1000)
365
+ return 'just now';
366
+ const minutes = Math.floor(diffMs / (60 * 1000));
367
+ if (minutes < 60)
368
+ return `${minutes}m ago`;
369
+ const hours = Math.floor(minutes / 60);
370
+ if (hours < 24)
371
+ return `${hours}h ago`;
372
+ const days = Math.floor(hours / 24);
373
+ return `${days}d ago`;
374
+ }
375
+ /**
376
+ * Truncate text to fit width
377
+ */
378
+ function truncate(text, maxWidth) {
379
+ if (text.length <= maxWidth)
380
+ return text;
381
+ return text.slice(0, maxWidth - 3) + '...';
382
+ }
383
+ // Export for testing
384
+ export { formatDiscrepancyLine, formatRecommendation, loadState, saveState, };
385
+ //# sourceMappingURL=discrepancies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discrepancies.js","sourceRoot":"","sources":["../../../../src/cli/commands/discrepancies.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Notifications Command
3
+ *
4
+ * View and manage sync notifications.
5
+ *
6
+ * @module cli/commands/notifications
7
+ */
8
+ import { Command } from 'commander';
9
+ import { Notification, NotificationType, NotificationSeverity } from '../../core/notifications/notification-types.js';
10
+ import { Logger } from '../../utils/logger.js';
11
+ /**
12
+ * Notifications command options
13
+ */
14
+ export interface NotificationsOptions {
15
+ all?: boolean;
16
+ type?: NotificationType;
17
+ severity?: NotificationSeverity;
18
+ json?: boolean;
19
+ }
20
+ /**
21
+ * Create the notifications command
22
+ */
23
+ export declare function createNotificationsCommand(options?: {
24
+ logger?: Logger;
25
+ specweavePath?: string;
26
+ }): Command;
27
+ /**
28
+ * List notifications
29
+ */
30
+ export declare function listNotifications(options: NotificationsOptions & {
31
+ logger?: Logger;
32
+ specweavePath?: string;
33
+ }): Promise<void>;
34
+ /**
35
+ * Show notification details
36
+ */
37
+ export declare function showNotification(id: string, options: {
38
+ json?: boolean;
39
+ logger?: Logger;
40
+ specweavePath?: string;
41
+ }): Promise<void>;
42
+ /**
43
+ * Dismiss a notification
44
+ */
45
+ export declare function dismissNotification(id: string, options: {
46
+ logger?: Logger;
47
+ specweavePath?: string;
48
+ }): Promise<void>;
49
+ /**
50
+ * Dismiss all pending notifications
51
+ */
52
+ export declare function dismissAllNotifications(options: {
53
+ skipConfirm?: boolean;
54
+ logger?: Logger;
55
+ specweavePath?: string;
56
+ }): Promise<void>;
57
+ /**
58
+ * Format a notification for list display
59
+ */
60
+ declare function formatNotificationLine(notif: Notification): string;
61
+ /**
62
+ * Format ISO date to readable string
63
+ */
64
+ declare function formatDate(isoDate: string): string;
65
+ /**
66
+ * Format time relative to now
67
+ */
68
+ declare function formatRelativeTime(isoDate: string): string;
69
+ export { formatNotificationLine, formatDate, formatRelativeTime, };
70
+ //# sourceMappingURL=notifications.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/notifications.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,oBAAoB,EAGrB,MAAM,gDAAgD,CAAC;AACxD,OAAO,EAAE,MAAM,EAAiB,MAAM,uBAAuB,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,GAAE;IAClD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAiDf;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,oBAAoB,GAAG;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqChB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,MAAM,EACV,OAAO,EAAE;IACP,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GACA,OAAO,CAAC,IAAI,CAAC,CA0Cf;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,MAAM,EACV,OAAO,EAAE;IACP,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GACA,OAAO,CAAC,IAAI,CAAC,CAwBf;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,EAAE;IACrD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBhB;AAED;;GAEG;AACH,iBAAS,sBAAsB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAS3D;AAED;;GAEG;AACH,iBAAS,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAU3C;AAED;;GAEG;AACH,iBAAS,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAqBnD;AAaD,OAAO,EACL,sBAAsB,EACtB,UAAU,EACV,kBAAkB,GACnB,CAAC"}