@braingrid/cli 0.1.3 → 0.2.1

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 (243) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/README.md +54 -39
  3. package/dist/chunk-KNVWIF3L.js +401 -0
  4. package/dist/chunk-KNVWIF3L.js.map +1 -0
  5. package/dist/cli.js +6229 -290
  6. package/dist/cli.js.map +1 -1
  7. package/dist/gh-installer-B65ZOOC4.js +13 -0
  8. package/dist/gh-installer-B65ZOOC4.js.map +1 -0
  9. package/package.json +40 -13
  10. package/dist/build-config.d.ts +0 -26
  11. package/dist/build-config.d.ts.map +0 -1
  12. package/dist/build-config.js +0 -45
  13. package/dist/build-config.js.map +0 -1
  14. package/dist/cli.d.ts +0 -3
  15. package/dist/cli.d.ts.map +0 -1
  16. package/dist/handlers/agent.handlers.d.ts +0 -12
  17. package/dist/handlers/agent.handlers.d.ts.map +0 -1
  18. package/dist/handlers/agent.handlers.js +0 -130
  19. package/dist/handlers/agent.handlers.js.map +0 -1
  20. package/dist/handlers/auth.handlers.d.ts +0 -19
  21. package/dist/handlers/auth.handlers.d.ts.map +0 -1
  22. package/dist/handlers/auth.handlers.js +0 -177
  23. package/dist/handlers/auth.handlers.js.map +0 -1
  24. package/dist/handlers/index.d.ts +0 -14
  25. package/dist/handlers/index.d.ts.map +0 -1
  26. package/dist/handlers/index.js +0 -14
  27. package/dist/handlers/index.js.map +0 -1
  28. package/dist/handlers/init.handlers.d.ts +0 -10
  29. package/dist/handlers/init.handlers.d.ts.map +0 -1
  30. package/dist/handlers/init.handlers.js +0 -638
  31. package/dist/handlers/init.handlers.js.map +0 -1
  32. package/dist/handlers/project.handlers.d.ts +0 -36
  33. package/dist/handlers/project.handlers.d.ts.map +0 -1
  34. package/dist/handlers/project.handlers.js +0 -309
  35. package/dist/handlers/project.handlers.js.map +0 -1
  36. package/dist/handlers/requirement.handlers.d.ts +0 -32
  37. package/dist/handlers/requirement.handlers.d.ts.map +0 -1
  38. package/dist/handlers/requirement.handlers.js +0 -264
  39. package/dist/handlers/requirement.handlers.js.map +0 -1
  40. package/dist/handlers/status.handlers.d.ts +0 -12
  41. package/dist/handlers/status.handlers.d.ts.map +0 -1
  42. package/dist/handlers/status.handlers.js +0 -212
  43. package/dist/handlers/status.handlers.js.map +0 -1
  44. package/dist/handlers/task.handlers.d.ts +0 -29
  45. package/dist/handlers/task.handlers.d.ts.map +0 -1
  46. package/dist/handlers/task.handlers.js +0 -326
  47. package/dist/handlers/task.handlers.js.map +0 -1
  48. package/dist/handlers/types.d.ts +0 -10
  49. package/dist/handlers/types.d.ts.map +0 -1
  50. package/dist/handlers/types.js +0 -5
  51. package/dist/handlers/types.js.map +0 -1
  52. package/dist/handlers/update.handlers.d.ts +0 -16
  53. package/dist/handlers/update.handlers.d.ts.map +0 -1
  54. package/dist/handlers/update.handlers.js +0 -119
  55. package/dist/handlers/update.handlers.js.map +0 -1
  56. package/dist/rpc/registry.d.ts +0 -97
  57. package/dist/rpc/registry.d.ts.map +0 -1
  58. package/dist/rpc/registry.js +0 -119
  59. package/dist/rpc/registry.js.map +0 -1
  60. package/dist/rpc/server.d.ts +0 -78
  61. package/dist/rpc/server.d.ts.map +0 -1
  62. package/dist/rpc/server.js +0 -437
  63. package/dist/rpc/server.js.map +0 -1
  64. package/dist/rpc/transport.d.ts +0 -84
  65. package/dist/rpc/transport.d.ts.map +0 -1
  66. package/dist/rpc/transport.js +0 -296
  67. package/dist/rpc/transport.js.map +0 -1
  68. package/dist/services/__mocks__/utils.d.ts +0 -16
  69. package/dist/services/__mocks__/utils.d.ts.map +0 -1
  70. package/dist/services/__mocks__/utils.js +0 -21
  71. package/dist/services/__mocks__/utils.js.map +0 -1
  72. package/dist/services/agent-service.d.ts +0 -29
  73. package/dist/services/agent-service.d.ts.map +0 -1
  74. package/dist/services/agent-service.js +0 -273
  75. package/dist/services/agent-service.js.map +0 -1
  76. package/dist/services/auth.d.ts +0 -59
  77. package/dist/services/auth.d.ts.map +0 -1
  78. package/dist/services/auth.js +0 -549
  79. package/dist/services/auth.js.map +0 -1
  80. package/dist/services/claude.d.ts +0 -18
  81. package/dist/services/claude.d.ts.map +0 -1
  82. package/dist/services/claude.js +0 -164
  83. package/dist/services/claude.js.map +0 -1
  84. package/dist/services/credential-store.d.ts +0 -47
  85. package/dist/services/credential-store.d.ts.map +0 -1
  86. package/dist/services/credential-store.js +0 -89
  87. package/dist/services/credential-store.js.map +0 -1
  88. package/dist/services/internal/github-service.d.ts +0 -67
  89. package/dist/services/internal/github-service.d.ts.map +0 -1
  90. package/dist/services/internal/github-service.js +0 -81
  91. package/dist/services/internal/github-service.js.map +0 -1
  92. package/dist/services/internal/repository-service.d.ts +0 -79
  93. package/dist/services/internal/repository-service.d.ts.map +0 -1
  94. package/dist/services/internal/repository-service.js +0 -88
  95. package/dist/services/internal/repository-service.js.map +0 -1
  96. package/dist/services/oauth2-auth.d.ts +0 -76
  97. package/dist/services/oauth2-auth.d.ts.map +0 -1
  98. package/dist/services/oauth2-auth.js +0 -451
  99. package/dist/services/oauth2-auth.js.map +0 -1
  100. package/dist/services/project-service.d.ts +0 -24
  101. package/dist/services/project-service.d.ts.map +0 -1
  102. package/dist/services/project-service.js +0 -60
  103. package/dist/services/project-service.js.map +0 -1
  104. package/dist/services/requirement-service.d.ts +0 -32
  105. package/dist/services/requirement-service.d.ts.map +0 -1
  106. package/dist/services/requirement-service.js +0 -91
  107. package/dist/services/requirement-service.js.map +0 -1
  108. package/dist/services/task-service.d.ts +0 -22
  109. package/dist/services/task-service.d.ts.map +0 -1
  110. package/dist/services/task-service.js +0 -52
  111. package/dist/services/task-service.js.map +0 -1
  112. package/dist/types/api.d.ts +0 -16
  113. package/dist/types/api.d.ts.map +0 -1
  114. package/dist/types/api.js +0 -5
  115. package/dist/types/api.js.map +0 -1
  116. package/dist/types/auth.d.ts +0 -73
  117. package/dist/types/auth.d.ts.map +0 -1
  118. package/dist/types/auth.js +0 -2
  119. package/dist/types/auth.js.map +0 -1
  120. package/dist/types/claude.d.ts +0 -22
  121. package/dist/types/claude.d.ts.map +0 -1
  122. package/dist/types/claude.js +0 -2
  123. package/dist/types/claude.js.map +0 -1
  124. package/dist/types/github.d.ts +0 -105
  125. package/dist/types/github.d.ts.map +0 -1
  126. package/dist/types/github.js +0 -6
  127. package/dist/types/github.js.map +0 -1
  128. package/dist/types/local-project.d.ts +0 -30
  129. package/dist/types/local-project.d.ts.map +0 -1
  130. package/dist/types/local-project.js +0 -24
  131. package/dist/types/local-project.js.map +0 -1
  132. package/dist/types/project.d.ts +0 -56
  133. package/dist/types/project.d.ts.map +0 -1
  134. package/dist/types/project.js +0 -5
  135. package/dist/types/project.js.map +0 -1
  136. package/dist/types/requirement.d.ts +0 -69
  137. package/dist/types/requirement.d.ts.map +0 -1
  138. package/dist/types/requirement.js +0 -5
  139. package/dist/types/requirement.js.map +0 -1
  140. package/dist/types/task.d.ts +0 -44
  141. package/dist/types/task.d.ts.map +0 -1
  142. package/dist/types/task.js +0 -5
  143. package/dist/types/task.js.map +0 -1
  144. package/dist/utils/axios-retry.d.ts +0 -25
  145. package/dist/utils/axios-retry.d.ts.map +0 -1
  146. package/dist/utils/axios-retry.js +0 -174
  147. package/dist/utils/axios-retry.js.map +0 -1
  148. package/dist/utils/axios-with-auth.d.ts +0 -10
  149. package/dist/utils/axios-with-auth.d.ts.map +0 -1
  150. package/dist/utils/axios-with-auth.js +0 -118
  151. package/dist/utils/axios-with-auth.js.map +0 -1
  152. package/dist/utils/cli-tools.d.ts +0 -30
  153. package/dist/utils/cli-tools.d.ts.map +0 -1
  154. package/dist/utils/cli-tools.js +0 -199
  155. package/dist/utils/cli-tools.js.map +0 -1
  156. package/dist/utils/command-execution.d.ts +0 -30
  157. package/dist/utils/command-execution.d.ts.map +0 -1
  158. package/dist/utils/command-execution.js +0 -264
  159. package/dist/utils/command-execution.js.map +0 -1
  160. package/dist/utils/command-parser.d.ts +0 -85
  161. package/dist/utils/command-parser.d.ts.map +0 -1
  162. package/dist/utils/command-parser.js +0 -287
  163. package/dist/utils/command-parser.js.map +0 -1
  164. package/dist/utils/config.d.ts +0 -10
  165. package/dist/utils/config.d.ts.map +0 -1
  166. package/dist/utils/config.js +0 -77
  167. package/dist/utils/config.js.map +0 -1
  168. package/dist/utils/error-formatter.d.ts +0 -17
  169. package/dist/utils/error-formatter.d.ts.map +0 -1
  170. package/dist/utils/error-formatter.js +0 -115
  171. package/dist/utils/error-formatter.js.map +0 -1
  172. package/dist/utils/formatting.d.ts +0 -10
  173. package/dist/utils/formatting.d.ts.map +0 -1
  174. package/dist/utils/formatting.js +0 -122
  175. package/dist/utils/formatting.js.map +0 -1
  176. package/dist/utils/gh-installer.d.ts +0 -31
  177. package/dist/utils/gh-installer.d.ts.map +0 -1
  178. package/dist/utils/gh-installer.js +0 -296
  179. package/dist/utils/gh-installer.js.map +0 -1
  180. package/dist/utils/git-installer.d.ts +0 -31
  181. package/dist/utils/git-installer.d.ts.map +0 -1
  182. package/dist/utils/git-installer.js +0 -290
  183. package/dist/utils/git-installer.js.map +0 -1
  184. package/dist/utils/git.d.ts +0 -60
  185. package/dist/utils/git.d.ts.map +0 -1
  186. package/dist/utils/git.js +0 -144
  187. package/dist/utils/git.js.map +0 -1
  188. package/dist/utils/github-repo.d.ts +0 -43
  189. package/dist/utils/github-repo.d.ts.map +0 -1
  190. package/dist/utils/github-repo.js +0 -113
  191. package/dist/utils/github-repo.js.map +0 -1
  192. package/dist/utils/id-normalization.d.ts +0 -26
  193. package/dist/utils/id-normalization.d.ts.map +0 -1
  194. package/dist/utils/id-normalization.js +0 -45
  195. package/dist/utils/id-normalization.js.map +0 -1
  196. package/dist/utils/jwt.d.ts +0 -45
  197. package/dist/utils/jwt.d.ts.map +0 -1
  198. package/dist/utils/jwt.js +0 -64
  199. package/dist/utils/jwt.js.map +0 -1
  200. package/dist/utils/local-store.d.ts +0 -36
  201. package/dist/utils/local-store.d.ts.map +0 -1
  202. package/dist/utils/local-store.js +0 -94
  203. package/dist/utils/local-store.js.map +0 -1
  204. package/dist/utils/logger.d.ts +0 -36
  205. package/dist/utils/logger.d.ts.map +0 -1
  206. package/dist/utils/logger.js +0 -176
  207. package/dist/utils/logger.js.map +0 -1
  208. package/dist/utils/package-manager-installer.d.ts +0 -36
  209. package/dist/utils/package-manager-installer.d.ts.map +0 -1
  210. package/dist/utils/package-manager-installer.js +0 -106
  211. package/dist/utils/package-manager-installer.js.map +0 -1
  212. package/dist/utils/package-manager.d.ts +0 -31
  213. package/dist/utils/package-manager.d.ts.map +0 -1
  214. package/dist/utils/package-manager.js +0 -133
  215. package/dist/utils/package-manager.js.map +0 -1
  216. package/dist/utils/projects.d.ts +0 -23
  217. package/dist/utils/projects.d.ts.map +0 -1
  218. package/dist/utils/projects.js +0 -36
  219. package/dist/utils/projects.js.map +0 -1
  220. package/dist/utils/repository-access.d.ts +0 -89
  221. package/dist/utils/repository-access.d.ts.map +0 -1
  222. package/dist/utils/repository-access.js +0 -132
  223. package/dist/utils/repository-access.js.map +0 -1
  224. package/dist/utils/requirements.d.ts +0 -43
  225. package/dist/utils/requirements.d.ts.map +0 -1
  226. package/dist/utils/requirements.js +0 -79
  227. package/dist/utils/requirements.js.map +0 -1
  228. package/dist/utils/spinner.d.ts +0 -47
  229. package/dist/utils/spinner.d.ts.map +0 -1
  230. package/dist/utils/spinner.js +0 -101
  231. package/dist/utils/spinner.js.map +0 -1
  232. package/dist/utils/status-parser.d.ts +0 -95
  233. package/dist/utils/status-parser.d.ts.map +0 -1
  234. package/dist/utils/status-parser.js +0 -205
  235. package/dist/utils/status-parser.js.map +0 -1
  236. package/dist/utils/tasks.d.ts +0 -21
  237. package/dist/utils/tasks.d.ts.map +0 -1
  238. package/dist/utils/tasks.js +0 -63
  239. package/dist/utils/tasks.js.map +0 -1
  240. package/dist/utils/workspace-manager.d.ts +0 -65
  241. package/dist/utils/workspace-manager.d.ts.map +0 -1
  242. package/dist/utils/workspace-manager.js +0 -98
  243. package/dist/utils/workspace-manager.js.map +0 -1
@@ -1,79 +0,0 @@
1
- import { normalizeId } from './id-normalization.js';
2
- /**
3
- * Format a requirement with friendly REQ-<number> format
4
- * Note: short_id already contains "REQ-123" format
5
- */
6
- export function formatRequirementId(requirement) {
7
- return requirement.short_id || `REQ-${requirement.req_id || 0}`;
8
- }
9
- /**
10
- * Normalize requirement ID from various formats to API-compatible format:
11
- * - "REQ-123" -> "REQ-123" (already normalized)
12
- * - "req-123" -> "REQ-123" (uppercase)
13
- * - "REQ 123" -> "REQ-123" (add dash, uppercase)
14
- * - "req 123" -> "REQ-123" (add dash, uppercase)
15
- * - "123" -> "REQ-123" (add prefix)
16
- * - "uuid-string" -> "uuid-string" (UUID, return as-is)
17
- *
18
- * This function takes user input and returns the ID that should be used in API calls
19
- */
20
- export function normalizeRequirementId(input) {
21
- return normalizeId('REQ', input);
22
- }
23
- /**
24
- * Parse a requirement ID from various formats:
25
- * - "REQ-123" -> { type: 'req_id', value: 123 }
26
- * - "req-123" -> { type: 'req_id', value: 123 }
27
- * - "REQ 123" -> { type: 'req_id', value: 123 }
28
- * - "req 123" -> { type: 'req_id', value: 123 }
29
- * - "123" -> { type: 'req_id', value: 123 }
30
- * - "uuid-string" -> { type: 'uuid', value: 'uuid-string' }
31
- */
32
- export function parseRequirementId(input) {
33
- // Trim whitespace
34
- const trimmed = input.trim();
35
- // Handle "REQ-123" or "req-123" format (with dash)
36
- const reqDashMatch = trimmed.match(/^REQ-(\d+)$/i);
37
- if (reqDashMatch) {
38
- return { type: 'req_id', value: parseInt(reqDashMatch[1], 10) };
39
- }
40
- // Handle "REQ 123" or "req 123" format (with space)
41
- const reqSpaceMatch = trimmed.match(/^REQ\s+(\d+)$/i);
42
- if (reqSpaceMatch) {
43
- return { type: 'req_id', value: parseInt(reqSpaceMatch[1], 10) };
44
- }
45
- // Handle plain number format
46
- const numberMatch = trimmed.match(/^\d+$/);
47
- if (numberMatch) {
48
- return { type: 'req_id', value: parseInt(trimmed, 10) };
49
- }
50
- // Assume it's a UUID
51
- return { type: 'uuid', value: trimmed };
52
- }
53
- /**
54
- * Find a requirement by either req_id or UUID
55
- */
56
- export function findRequirementById(requirements, identifier) {
57
- const parsed = parseRequirementId(identifier);
58
- if (parsed.type === 'req_id') {
59
- return requirements.find(req => req.short_id === `REQ-${parsed.value}`);
60
- }
61
- else {
62
- return requirements.find(req => req.id === parsed.value);
63
- }
64
- }
65
- /**
66
- * Get query parameters for API calls based on identifier type
67
- * Note: API doesn't support req_id parameter, so we only return id for UUIDs
68
- */
69
- export function getRequirementQueryParams(identifier) {
70
- const parsed = parseRequirementId(identifier);
71
- if (parsed.type === 'uuid') {
72
- return { id: parsed.value };
73
- }
74
- else {
75
- // For req_id, we'll need to search differently
76
- return {};
77
- }
78
- }
79
- //# sourceMappingURL=requirements.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"requirements.js","sourceRoot":"","sources":["../../src/utils/requirements.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAAwB;IAC3D,OAAO,WAAW,CAAC,QAAQ,IAAI,OAAO,WAAW,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;AACjE,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAa;IACnD,OAAO,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAClC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAI/C,kBAAkB;IAClB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAE7B,mDAAmD;IACnD,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IACnD,IAAI,YAAY,EAAE,CAAC;QAClB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IACjE,CAAC;IAED,oDAAoD;IACpD,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACtD,IAAI,aAAa,EAAE,CAAC;QACnB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IAClE,CAAC;IAED,6BAA6B;IAC7B,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,WAAW,EAAE,CAAC;QACjB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;IACzD,CAAC;IAED,qBAAqB;IACrB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAClC,YAA2B,EAC3B,UAAkB;IAElB,MAAM,MAAM,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAE9C,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,KAAK,OAAO,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IACzE,CAAC;SAAM,CAAC;QACP,OAAO,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,UAAkB;IAC3D,MAAM,MAAM,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAE9C,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC5B,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,KAAe,EAAE,CAAC;IACvC,CAAC;SAAM,CAAC;QACP,+CAA+C;QAC/C,OAAO,EAAE,CAAC;IACX,CAAC;AACF,CAAC"}
@@ -1,47 +0,0 @@
1
- /**
2
- * Spinner Utility
3
- *
4
- * Provides a simple polling spinner for async operations with user feedback.
5
- * Shows an animated spinner while waiting for a condition to become true.
6
- */
7
- /**
8
- * Wait for a condition with animated spinner
9
- *
10
- * Polls an async check function and displays a spinner while waiting.
11
- * Clears the spinner on completion or timeout.
12
- *
13
- * @param message - Message to display next to spinner
14
- * @param checkFn - Async function that returns true when condition is met
15
- * @param intervalMs - Polling interval in milliseconds (default: 3000)
16
- * @param maxAttempts - Maximum number of attempts (default: 60 = 3 minutes at 3s interval)
17
- * @returns Promise that resolves to true if condition met, false if timeout
18
- *
19
- * @example
20
- * ```typescript
21
- * const success = await waitWithSpinner(
22
- * 'Waiting for repository access',
23
- * async () => await checkAccess(),
24
- * 3000,
25
- * 60
26
- * );
27
- * ```
28
- */
29
- export declare function waitWithSpinner(message: string, checkFn: () => Promise<boolean>, intervalMs?: number, maxAttempts?: number): Promise<boolean>;
30
- /**
31
- * Simple one-time spinner display
32
- *
33
- * Shows a spinner without polling. Useful for operations that manage their own timing.
34
- * Returns a cleanup function to clear the spinner.
35
- *
36
- * @param message - Message to display
37
- * @returns Cleanup function to stop and clear the spinner
38
- *
39
- * @example
40
- * ```typescript
41
- * const stop = showSpinner('Loading');
42
- * await doWork();
43
- * stop();
44
- * ```
45
- */
46
- export declare function showSpinner(message: string): () => void;
47
- //# sourceMappingURL=spinner.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../src/utils/spinner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,eAAe,CACpC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,EAC/B,UAAU,GAAE,MAAa,EACzB,WAAW,GAAE,MAAW,GACtB,OAAO,CAAC,OAAO,CAAC,CA4ClB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,IAAI,CAYvD"}
@@ -1,101 +0,0 @@
1
- /**
2
- * Spinner Utility
3
- *
4
- * Provides a simple polling spinner for async operations with user feedback.
5
- * Shows an animated spinner while waiting for a condition to become true.
6
- */
7
- import chalk from 'chalk';
8
- const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
9
- /**
10
- * Wait for a condition with animated spinner
11
- *
12
- * Polls an async check function and displays a spinner while waiting.
13
- * Clears the spinner on completion or timeout.
14
- *
15
- * @param message - Message to display next to spinner
16
- * @param checkFn - Async function that returns true when condition is met
17
- * @param intervalMs - Polling interval in milliseconds (default: 3000)
18
- * @param maxAttempts - Maximum number of attempts (default: 60 = 3 minutes at 3s interval)
19
- * @returns Promise that resolves to true if condition met, false if timeout
20
- *
21
- * @example
22
- * ```typescript
23
- * const success = await waitWithSpinner(
24
- * 'Waiting for repository access',
25
- * async () => await checkAccess(),
26
- * 3000,
27
- * 60
28
- * );
29
- * ```
30
- */
31
- export async function waitWithSpinner(message, checkFn, intervalMs = 3000, maxAttempts = 60) {
32
- let frameIndex = 0;
33
- let spinnerInterval = null;
34
- // Function to update spinner
35
- const updateSpinner = () => {
36
- const frame = SPINNER_FRAMES[frameIndex];
37
- frameIndex = (frameIndex + 1) % SPINNER_FRAMES.length;
38
- // Clear current line and write new spinner
39
- process.stdout.write(`\r${chalk.cyan(frame)} ${message}...`);
40
- };
41
- // Start spinner animation (update every 100ms for smooth animation)
42
- spinnerInterval = setInterval(updateSpinner, 100);
43
- try {
44
- // Poll with the specified interval
45
- for (let attempt = 0; attempt < maxAttempts; attempt++) {
46
- const result = await checkFn();
47
- if (result) {
48
- // Success! Clear spinner and return
49
- if (spinnerInterval)
50
- clearInterval(spinnerInterval);
51
- process.stdout.write('\r' + ' '.repeat(message.length + 10) + '\r'); // Clear line
52
- return true;
53
- }
54
- // Wait before next attempt (unless this was the last attempt)
55
- if (attempt < maxAttempts - 1) {
56
- await new Promise(resolve => setTimeout(resolve, intervalMs));
57
- }
58
- }
59
- // Timeout - clear spinner and return false
60
- if (spinnerInterval)
61
- clearInterval(spinnerInterval);
62
- process.stdout.write('\r' + ' '.repeat(message.length + 10) + '\r'); // Clear line
63
- return false;
64
- }
65
- catch (error) {
66
- // Error during polling - clean up and rethrow
67
- if (spinnerInterval)
68
- clearInterval(spinnerInterval);
69
- process.stdout.write('\r' + ' '.repeat(message.length + 10) + '\r'); // Clear line
70
- throw error;
71
- }
72
- }
73
- /**
74
- * Simple one-time spinner display
75
- *
76
- * Shows a spinner without polling. Useful for operations that manage their own timing.
77
- * Returns a cleanup function to clear the spinner.
78
- *
79
- * @param message - Message to display
80
- * @returns Cleanup function to stop and clear the spinner
81
- *
82
- * @example
83
- * ```typescript
84
- * const stop = showSpinner('Loading');
85
- * await doWork();
86
- * stop();
87
- * ```
88
- */
89
- export function showSpinner(message) {
90
- let frameIndex = 0;
91
- const interval = setInterval(() => {
92
- const frame = SPINNER_FRAMES[frameIndex];
93
- frameIndex = (frameIndex + 1) % SPINNER_FRAMES.length;
94
- process.stdout.write(`\r${chalk.cyan(frame)} ${message}...`);
95
- }, 100);
96
- return () => {
97
- clearInterval(interval);
98
- process.stdout.write('\r' + ' '.repeat(message.length + 10) + '\r');
99
- };
100
- }
101
- //# sourceMappingURL=spinner.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/utils/spinner.ts"],"names":[],"mappings":"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"}
@@ -1,95 +0,0 @@
1
- import type { RequirementStatus } from '../types/requirement.js';
2
- import type { TaskStatus } from '../types/task.js';
3
- export type Status = RequirementStatus | TaskStatus;
4
- /**
5
- * Maps natural language keywords to Status enum values
6
- */
7
- export declare const StatusKeywordMap: Record<string, Status>;
8
- /**
9
- * Result of status parsing operation
10
- */
11
- export interface StatusParsingResult {
12
- /**
13
- * Successfully parsed status values
14
- */
15
- statuses: Status[];
16
- /**
17
- * Invalid keywords that couldn't be parsed
18
- */
19
- invalid: string[];
20
- /**
21
- * Whether parsing encountered any errors
22
- */
23
- hasErrors: boolean;
24
- /**
25
- * Error message if any invalid keywords were found
26
- */
27
- errorMessage?: string;
28
- }
29
- /**
30
- * Parses a comma-separated string of status keywords into Status values
31
- *
32
- * @param input - Comma-separated status keywords (e.g., "todo,doing" or "done")
33
- * @returns Array of Status values
34
- *
35
- * @example
36
- * parseStatusKeywords("todo,doing") // Returns ["PLANNED", "IN_PROGRESS"]
37
- * parseStatusKeywords("done") // Returns ["COMPLETED"]
38
- * parseStatusKeywords("") // Returns [] (all statuses)
39
- */
40
- export declare function parseStatusKeywords(input: string): Status[];
41
- /**
42
- * Validates status keywords and returns both valid and invalid ones
43
- *
44
- * @param keywords - Array of status keywords to validate
45
- * @returns Object containing valid statuses and invalid keywords
46
- *
47
- * @example
48
- * validateStatusKeywords(["todo", "invalid"])
49
- * // Returns { valid: ["PLANNED"], invalid: ["invalid"] }
50
- */
51
- export declare function validateStatusKeywords(keywords: string[]): {
52
- valid: Status[];
53
- invalid: string[];
54
- };
55
- /**
56
- * Formats an error message for invalid status keywords
57
- *
58
- * @param invalidKeywords - Array of invalid keywords
59
- * @returns Formatted error message with suggestions
60
- *
61
- * @example
62
- * formatStatusError(["invalid", "unknown"])
63
- * // Returns detailed error message with valid keyword suggestions
64
- */
65
- export declare function formatStatusError(invalidKeywords: string[]): string;
66
- /**
67
- * Parses and validates status keywords, returning a complete result
68
- *
69
- * @param input - Comma-separated status keywords
70
- * @returns StatusParsingResult with parsed statuses and any errors
71
- *
72
- * @example
73
- * parseAndValidateStatus("todo,invalid")
74
- * // Returns {
75
- * // statuses: ["PLANNED"],
76
- * // invalid: ["invalid"],
77
- * // hasErrors: true,
78
- * // errorMessage: "Invalid status keyword: \"invalid\"..."
79
- * // }
80
- */
81
- export declare function parseAndValidateStatus(input: string): StatusParsingResult;
82
- /**
83
- * Gets all valid status keywords grouped by their Status value
84
- *
85
- * @returns Object mapping Status to array of keywords
86
- */
87
- export declare function getStatusKeywordsByValue(): Record<Status, string[]>;
88
- /**
89
- * Checks if a given string is a valid status keyword
90
- *
91
- * @param keyword - The keyword to check
92
- * @returns true if the keyword is valid, false otherwise
93
- */
94
- export declare function isValidStatusKeyword(keyword: string): boolean;
95
- //# sourceMappingURL=status-parser.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"status-parser.d.ts","sourceRoot":"","sources":["../../src/utils/status-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGnD,MAAM,MAAM,MAAM,GAAG,iBAAiB,GAAG,UAAU,CAAC;AAEpD;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA+CnD,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,mBAAmB;IACnC;;OAEG;IACH,QAAQ,EAAE,MAAM,EAAE,CAAC;IAEnB;;OAEG;IACH,OAAO,EAAE,MAAM,EAAE,CAAC;IAElB;;OAEG;IACH,SAAS,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CA4B3D;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAoBjG;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,eAAe,EAAE,MAAM,EAAE,GAAG,MAAM,CAoBnE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,CAgCzE;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAWnE;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE7D"}
@@ -1,205 +0,0 @@
1
- /**
2
- * Maps natural language keywords to Status enum values
3
- */
4
- export const StatusKeywordMap = {
5
- // IDEA status keywords
6
- idea: 'IDEA',
7
- ideas: 'IDEA',
8
- ideation: 'IDEA',
9
- brainstorm: 'IDEA',
10
- concept: 'IDEA',
11
- // PLANNED status keywords
12
- todo: 'PLANNED',
13
- planned: 'PLANNED',
14
- plan: 'PLANNED',
15
- pending: 'PLANNED',
16
- backlog: 'PLANNED',
17
- // IN_PROGRESS status keywords
18
- doing: 'IN_PROGRESS',
19
- active: 'IN_PROGRESS',
20
- wip: 'IN_PROGRESS',
21
- 'in-progress': 'IN_PROGRESS',
22
- inprogress: 'IN_PROGRESS',
23
- in_progress: 'IN_PROGRESS',
24
- working: 'IN_PROGRESS',
25
- started: 'IN_PROGRESS',
26
- // REVIEW status keywords
27
- review: 'REVIEW',
28
- reviewing: 'REVIEW',
29
- 'in-review': 'REVIEW',
30
- inreview: 'REVIEW',
31
- in_review: 'REVIEW',
32
- pending_review: 'REVIEW',
33
- 'pending-review': 'REVIEW',
34
- // COMPLETED status keywords
35
- done: 'COMPLETED',
36
- complete: 'COMPLETED',
37
- completed: 'COMPLETED',
38
- finished: 'COMPLETED',
39
- closed: 'COMPLETED',
40
- // CANCELLED status keywords
41
- cancelled: 'CANCELLED',
42
- canceled: 'CANCELLED',
43
- cancel: 'CANCELLED',
44
- abandoned: 'CANCELLED',
45
- dropped: 'CANCELLED',
46
- };
47
- /**
48
- * Parses a comma-separated string of status keywords into Status values
49
- *
50
- * @param input - Comma-separated status keywords (e.g., "todo,doing" or "done")
51
- * @returns Array of Status values
52
- *
53
- * @example
54
- * parseStatusKeywords("todo,doing") // Returns ["PLANNED", "IN_PROGRESS"]
55
- * parseStatusKeywords("done") // Returns ["COMPLETED"]
56
- * parseStatusKeywords("") // Returns [] (all statuses)
57
- */
58
- export function parseStatusKeywords(input) {
59
- // If no input or empty string, return empty array (show all statuses)
60
- if (!input || input.trim() === '') {
61
- return [];
62
- }
63
- // Split by comma and clean up whitespace
64
- const keywords = input
65
- .split(',')
66
- .map(k => k.trim().toLowerCase())
67
- .filter(k => k.length > 0);
68
- // Remove duplicates while preserving order
69
- const uniqueKeywords = [...new Set(keywords)];
70
- // Map keywords to statuses
71
- const statuses = [];
72
- const seenStatuses = new Set();
73
- for (const keyword of uniqueKeywords) {
74
- const status = StatusKeywordMap[keyword];
75
- if (status && !seenStatuses.has(status)) {
76
- statuses.push(status);
77
- seenStatuses.add(status);
78
- }
79
- }
80
- return statuses;
81
- }
82
- /**
83
- * Validates status keywords and returns both valid and invalid ones
84
- *
85
- * @param keywords - Array of status keywords to validate
86
- * @returns Object containing valid statuses and invalid keywords
87
- *
88
- * @example
89
- * validateStatusKeywords(["todo", "invalid"])
90
- * // Returns { valid: ["PLANNED"], invalid: ["invalid"] }
91
- */
92
- export function validateStatusKeywords(keywords) {
93
- const valid = [];
94
- const invalid = [];
95
- const seenStatuses = new Set();
96
- for (const keyword of keywords) {
97
- const normalizedKeyword = keyword.trim().toLowerCase();
98
- const status = StatusKeywordMap[normalizedKeyword];
99
- if (status) {
100
- if (!seenStatuses.has(status)) {
101
- valid.push(status);
102
- seenStatuses.add(status);
103
- }
104
- }
105
- else if (normalizedKeyword) {
106
- invalid.push(keyword);
107
- }
108
- }
109
- return { valid, invalid };
110
- }
111
- /**
112
- * Formats an error message for invalid status keywords
113
- *
114
- * @param invalidKeywords - Array of invalid keywords
115
- * @returns Formatted error message with suggestions
116
- *
117
- * @example
118
- * formatStatusError(["invalid", "unknown"])
119
- * // Returns detailed error message with valid keyword suggestions
120
- */
121
- export function formatStatusError(invalidKeywords) {
122
- const categorizedKeywords = {
123
- IDEA: ['idea', 'ideas', 'ideation', 'brainstorm', 'concept'],
124
- PLANNED: ['todo', 'planned', 'plan', 'pending', 'backlog'],
125
- IN_PROGRESS: ['doing', 'active', 'wip', 'in-progress', 'working'],
126
- REVIEW: ['review', 'reviewing', 'in-review', 'pending-review'],
127
- COMPLETED: ['done', 'complete', 'completed', 'finished'],
128
- CANCELLED: ['cancelled', 'canceled', 'cancel', 'abandoned'],
129
- };
130
- let errorMsg = `Invalid status keyword${invalidKeywords.length > 1 ? 's' : ''}: ${invalidKeywords.map(k => `"${k}"`).join(', ')}\n\n`;
131
- errorMsg += 'Valid status keywords:\n';
132
- for (const [status, keywords] of Object.entries(categorizedKeywords)) {
133
- errorMsg += ` ${status}: ${keywords.join(', ')}\n`;
134
- }
135
- errorMsg += '\nExample: braingrid list --status idea,todo,doing';
136
- return errorMsg;
137
- }
138
- /**
139
- * Parses and validates status keywords, returning a complete result
140
- *
141
- * @param input - Comma-separated status keywords
142
- * @returns StatusParsingResult with parsed statuses and any errors
143
- *
144
- * @example
145
- * parseAndValidateStatus("todo,invalid")
146
- * // Returns {
147
- * // statuses: ["PLANNED"],
148
- * // invalid: ["invalid"],
149
- * // hasErrors: true,
150
- * // errorMessage: "Invalid status keyword: \"invalid\"..."
151
- * // }
152
- */
153
- export function parseAndValidateStatus(input) {
154
- // Handle empty input
155
- if (!input || input.trim() === '') {
156
- return {
157
- statuses: [],
158
- invalid: [],
159
- hasErrors: false,
160
- };
161
- }
162
- // Split and normalize keywords
163
- const keywords = input
164
- .split(',')
165
- .map(k => k.trim())
166
- .filter(k => k.length > 0);
167
- // Validate keywords
168
- const { valid, invalid } = validateStatusKeywords(keywords);
169
- // Build result
170
- const result = {
171
- statuses: valid,
172
- invalid,
173
- hasErrors: invalid.length > 0,
174
- };
175
- // Add error message if there are invalid keywords
176
- if (result.hasErrors) {
177
- result.errorMessage = formatStatusError(invalid);
178
- }
179
- return result;
180
- }
181
- /**
182
- * Gets all valid status keywords grouped by their Status value
183
- *
184
- * @returns Object mapping Status to array of keywords
185
- */
186
- export function getStatusKeywordsByValue() {
187
- const grouped = {};
188
- for (const [keyword, status] of Object.entries(StatusKeywordMap)) {
189
- if (!grouped[status]) {
190
- grouped[status] = [];
191
- }
192
- grouped[status].push(keyword);
193
- }
194
- return grouped;
195
- }
196
- /**
197
- * Checks if a given string is a valid status keyword
198
- *
199
- * @param keyword - The keyword to check
200
- * @returns true if the keyword is valid, false otherwise
201
- */
202
- export function isValidStatusKeyword(keyword) {
203
- return keyword.toLowerCase() in StatusKeywordMap;
204
- }
205
- //# sourceMappingURL=status-parser.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"status-parser.js","sourceRoot":"","sources":["../../src/utils/status-parser.ts"],"names":[],"mappings":"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"}
@@ -1,21 +0,0 @@
1
- import { RequirementTask as Task } from '../types/requirement.js';
2
- export declare function formatTaskId(task: Task): string;
3
- /**
4
- * Normalize task ID from various formats to API-compatible format:
5
- * - "TASK-123" -> "TASK-123" (already normalized)
6
- * - "task-123" -> "TASK-123" (uppercase)
7
- * - "TASK 123" -> "TASK-123" (add dash, uppercase)
8
- * - "task 123" -> "TASK-123" (add dash, uppercase)
9
- * - "123" -> "TASK-123" (add prefix)
10
- * - "uuid-string" -> "uuid-string" (UUID, return as-is)
11
- *
12
- * This function takes user input and returns the ID that should be used in API calls
13
- */
14
- export declare function normalizeTaskId(input: string): string;
15
- export declare function parseTaskId(input: string): {
16
- type: 'number' | 'uuid';
17
- value: string | number;
18
- };
19
- export declare function findTaskById(tasks: Task[], identifier: string): Task | null;
20
- export declare function getTaskStatusIcon(status: string): string;
21
- //# sourceMappingURL=tasks.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/utils/tasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,IAAI,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAGlE,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAE/C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,CAwB9F;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAQ3E;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAaxD"}
@@ -1,63 +0,0 @@
1
- import { normalizeId } from './id-normalization.js';
2
- export function formatTaskId(task) {
3
- return `TASK-${task.number}`;
4
- }
5
- /**
6
- * Normalize task ID from various formats to API-compatible format:
7
- * - "TASK-123" -> "TASK-123" (already normalized)
8
- * - "task-123" -> "TASK-123" (uppercase)
9
- * - "TASK 123" -> "TASK-123" (add dash, uppercase)
10
- * - "task 123" -> "TASK-123" (add dash, uppercase)
11
- * - "123" -> "TASK-123" (add prefix)
12
- * - "uuid-string" -> "uuid-string" (UUID, return as-is)
13
- *
14
- * This function takes user input and returns the ID that should be used in API calls
15
- */
16
- export function normalizeTaskId(input) {
17
- return normalizeId('TASK', input);
18
- }
19
- export function parseTaskId(input) {
20
- // Trim whitespace
21
- const trimmed = input.trim();
22
- // Handle "TASK-123" or "task-123" format (with dash)
23
- const taskDashMatch = trimmed.match(/^TASK-(\d+)$/i);
24
- if (taskDashMatch) {
25
- return { type: 'number', value: parseInt(taskDashMatch[1], 10) };
26
- }
27
- // Handle "TASK 123" or "task 123" format (with space)
28
- const taskSpaceMatch = trimmed.match(/^TASK\s+(\d+)$/i);
29
- if (taskSpaceMatch) {
30
- return { type: 'number', value: parseInt(taskSpaceMatch[1], 10) };
31
- }
32
- // Handle plain number format
33
- const numberMatch = trimmed.match(/^\d+$/);
34
- if (numberMatch) {
35
- return { type: 'number', value: parseInt(trimmed, 10) };
36
- }
37
- // Assume it's a UUID
38
- return { type: 'uuid', value: trimmed };
39
- }
40
- export function findTaskById(tasks, identifier) {
41
- const parsed = parseTaskId(identifier);
42
- if (parsed.type === 'number') {
43
- return tasks.find(task => task.number === parsed.value) || null;
44
- }
45
- else {
46
- return tasks.find(task => task.id === parsed.value) || null;
47
- }
48
- }
49
- export function getTaskStatusIcon(status) {
50
- switch (status) {
51
- case 'PLANNED':
52
- return '📋';
53
- case 'IN_PROGRESS':
54
- return '🔄';
55
- case 'COMPLETED':
56
- return '✅';
57
- case 'CANCELLED':
58
- return '❌';
59
- default:
60
- return '📋';
61
- }
62
- }
63
- //# sourceMappingURL=tasks.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/utils/tasks.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,MAAM,UAAU,YAAY,CAAC,IAAU;IACtC,OAAO,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;AAC9B,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa;IAC5C,OAAO,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa;IACxC,kBAAkB;IAClB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAE7B,qDAAqD;IACrD,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IACrD,IAAI,aAAa,EAAE,CAAC;QACnB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IAClE,CAAC;IAED,sDAAsD;IACtD,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACxD,IAAI,cAAc,EAAE,CAAC;QACpB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC;IAED,6BAA6B;IAC7B,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,WAAW,EAAE,CAAC;QACjB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;IACzD,CAAC;IAED,qBAAqB;IACrB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,UAAkB;IAC7D,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;IAEvC,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;IACjE,CAAC;SAAM,CAAC;QACP,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;IAC7D,CAAC;AACF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC/C,QAAQ,MAAM,EAAE,CAAC;QAChB,KAAK,SAAS;YACb,OAAO,IAAI,CAAC;QACb,KAAK,aAAa;YACjB,OAAO,IAAI,CAAC;QACb,KAAK,WAAW;YACf,OAAO,GAAG,CAAC;QACZ,KAAK,WAAW;YACf,OAAO,GAAG,CAAC;QACZ;YACC,OAAO,IAAI,CAAC;IACd,CAAC;AACF,CAAC"}