@klarocards/cli 1.0.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 (166) hide show
  1. package/README.md +125 -0
  2. package/dist/commands/cheatsheet.d.ts +3 -0
  3. package/dist/commands/cheatsheet.d.ts.map +1 -0
  4. package/dist/commands/cheatsheet.js +80 -0
  5. package/dist/commands/cheatsheet.js.map +1 -0
  6. package/dist/commands/completion.d.ts +3 -0
  7. package/dist/commands/completion.d.ts.map +1 -0
  8. package/dist/commands/completion.js +191 -0
  9. package/dist/commands/completion.js.map +1 -0
  10. package/dist/commands/config.d.ts +3 -0
  11. package/dist/commands/config.d.ts.map +1 -0
  12. package/dist/commands/config.js +77 -0
  13. package/dist/commands/config.js.map +1 -0
  14. package/dist/commands/create.d.ts +3 -0
  15. package/dist/commands/create.d.ts.map +1 -0
  16. package/dist/commands/create.js +121 -0
  17. package/dist/commands/create.js.map +1 -0
  18. package/dist/commands/del.d.ts +3 -0
  19. package/dist/commands/del.d.ts.map +1 -0
  20. package/dist/commands/del.js +49 -0
  21. package/dist/commands/del.js.map +1 -0
  22. package/dist/commands/describe.d.ts +3 -0
  23. package/dist/commands/describe.d.ts.map +1 -0
  24. package/dist/commands/describe.js +105 -0
  25. package/dist/commands/describe.js.map +1 -0
  26. package/dist/commands/edit.d.ts +3 -0
  27. package/dist/commands/edit.d.ts.map +1 -0
  28. package/dist/commands/edit.js +91 -0
  29. package/dist/commands/edit.js.map +1 -0
  30. package/dist/commands/fetch.d.ts +3 -0
  31. package/dist/commands/fetch.d.ts.map +1 -0
  32. package/dist/commands/fetch.js +129 -0
  33. package/dist/commands/fetch.js.map +1 -0
  34. package/dist/commands/init.d.ts +3 -0
  35. package/dist/commands/init.d.ts.map +1 -0
  36. package/dist/commands/init.js +122 -0
  37. package/dist/commands/init.js.map +1 -0
  38. package/dist/commands/login.d.ts +7 -0
  39. package/dist/commands/login.d.ts.map +1 -0
  40. package/dist/commands/login.js +101 -0
  41. package/dist/commands/login.js.map +1 -0
  42. package/dist/commands/logout.d.ts +3 -0
  43. package/dist/commands/logout.d.ts.map +1 -0
  44. package/dist/commands/logout.js +34 -0
  45. package/dist/commands/logout.js.map +1 -0
  46. package/dist/commands/ls.d.ts +3 -0
  47. package/dist/commands/ls.d.ts.map +1 -0
  48. package/dist/commands/ls.js +174 -0
  49. package/dist/commands/ls.js.map +1 -0
  50. package/dist/commands/read.d.ts +3 -0
  51. package/dist/commands/read.d.ts.map +1 -0
  52. package/dist/commands/read.js +64 -0
  53. package/dist/commands/read.js.map +1 -0
  54. package/dist/commands/set.d.ts +3 -0
  55. package/dist/commands/set.d.ts.map +1 -0
  56. package/dist/commands/set.js +61 -0
  57. package/dist/commands/set.js.map +1 -0
  58. package/dist/commands/sync.d.ts +3 -0
  59. package/dist/commands/sync.d.ts.map +1 -0
  60. package/dist/commands/sync.js +157 -0
  61. package/dist/commands/sync.js.map +1 -0
  62. package/dist/commands/update.d.ts +4 -0
  63. package/dist/commands/update.d.ts.map +1 -0
  64. package/dist/commands/update.js +68 -0
  65. package/dist/commands/update.js.map +1 -0
  66. package/dist/commands/use.d.ts +3 -0
  67. package/dist/commands/use.d.ts.map +1 -0
  68. package/dist/commands/use.js +29 -0
  69. package/dist/commands/use.js.map +1 -0
  70. package/dist/commands/whoami.d.ts +3 -0
  71. package/dist/commands/whoami.d.ts.map +1 -0
  72. package/dist/commands/whoami.js +30 -0
  73. package/dist/commands/whoami.js.map +1 -0
  74. package/dist/completions/bash.d.ts +2 -0
  75. package/dist/completions/bash.d.ts.map +1 -0
  76. package/dist/completions/bash.js +134 -0
  77. package/dist/completions/bash.js.map +1 -0
  78. package/dist/completions/commands.d.ts +18 -0
  79. package/dist/completions/commands.d.ts.map +1 -0
  80. package/dist/completions/commands.js +173 -0
  81. package/dist/completions/commands.js.map +1 -0
  82. package/dist/completions/fish.d.ts +2 -0
  83. package/dist/completions/fish.d.ts.map +1 -0
  84. package/dist/completions/fish.js +84 -0
  85. package/dist/completions/fish.js.map +1 -0
  86. package/dist/completions/zsh.d.ts +2 -0
  87. package/dist/completions/zsh.d.ts.map +1 -0
  88. package/dist/completions/zsh.js +113 -0
  89. package/dist/completions/zsh.js.map +1 -0
  90. package/dist/index.d.ts +3 -0
  91. package/dist/index.d.ts.map +1 -0
  92. package/dist/index.js +158 -0
  93. package/dist/index.js.map +1 -0
  94. package/dist/lib/api.d.ts +34 -0
  95. package/dist/lib/api.d.ts.map +1 -0
  96. package/dist/lib/api.js +146 -0
  97. package/dist/lib/api.js.map +1 -0
  98. package/dist/lib/completion-cache.d.ts +34 -0
  99. package/dist/lib/completion-cache.d.ts.map +1 -0
  100. package/dist/lib/completion-cache.js +99 -0
  101. package/dist/lib/completion-cache.js.map +1 -0
  102. package/dist/lib/config.d.ts +12 -0
  103. package/dist/lib/config.d.ts.map +1 -0
  104. package/dist/lib/config.js +111 -0
  105. package/dist/lib/config.js.map +1 -0
  106. package/dist/lib/connector.d.ts +17 -0
  107. package/dist/lib/connector.d.ts.map +1 -0
  108. package/dist/lib/connector.js +2 -0
  109. package/dist/lib/connector.js.map +1 -0
  110. package/dist/lib/defaults.d.ts +9 -0
  111. package/dist/lib/defaults.d.ts.map +1 -0
  112. package/dist/lib/defaults.js +58 -0
  113. package/dist/lib/defaults.js.map +1 -0
  114. package/dist/lib/trace.d.ts +4 -0
  115. package/dist/lib/trace.d.ts.map +1 -0
  116. package/dist/lib/trace.js +13 -0
  117. package/dist/lib/trace.js.map +1 -0
  118. package/dist/lib/types.d.ts +70 -0
  119. package/dist/lib/types.d.ts.map +1 -0
  120. package/dist/lib/types.js +2 -0
  121. package/dist/lib/types.js.map +1 -0
  122. package/dist/utils/content.d.ts +26 -0
  123. package/dist/utils/content.d.ts.map +1 -0
  124. package/dist/utils/content.js +52 -0
  125. package/dist/utils/content.js.map +1 -0
  126. package/dist/utils/dimensions.d.ts +17 -0
  127. package/dist/utils/dimensions.d.ts.map +1 -0
  128. package/dist/utils/dimensions.js +41 -0
  129. package/dist/utils/dimensions.js.map +1 -0
  130. package/dist/utils/editor.d.ts +14 -0
  131. package/dist/utils/editor.d.ts.map +1 -0
  132. package/dist/utils/editor.js +56 -0
  133. package/dist/utils/editor.js.map +1 -0
  134. package/dist/utils/format.d.ts +17 -0
  135. package/dist/utils/format.d.ts.map +1 -0
  136. package/dist/utils/format.js +27 -0
  137. package/dist/utils/format.js.map +1 -0
  138. package/dist/utils/markdown.d.ts +24 -0
  139. package/dist/utils/markdown.d.ts.map +1 -0
  140. package/dist/utils/markdown.js +50 -0
  141. package/dist/utils/markdown.js.map +1 -0
  142. package/dist/utils/objects.d.ts +12 -0
  143. package/dist/utils/objects.d.ts.map +1 -0
  144. package/dist/utils/objects.js +31 -0
  145. package/dist/utils/objects.js.map +1 -0
  146. package/dist/utils/slugify.d.ts +10 -0
  147. package/dist/utils/slugify.d.ts.map +1 -0
  148. package/dist/utils/slugify.js +18 -0
  149. package/dist/utils/slugify.js.map +1 -0
  150. package/dist/utils/story-editor.d.ts +15 -0
  151. package/dist/utils/story-editor.d.ts.map +1 -0
  152. package/dist/utils/story-editor.js +43 -0
  153. package/dist/utils/story-editor.js.map +1 -0
  154. package/dist/utils/story-markdown.d.ts +36 -0
  155. package/dist/utils/story-markdown.d.ts.map +1 -0
  156. package/dist/utils/story-markdown.js +114 -0
  157. package/dist/utils/story-markdown.js.map +1 -0
  158. package/dist/utils/table.d.ts +18 -0
  159. package/dist/utils/table.d.ts.map +1 -0
  160. package/dist/utils/table.js +57 -0
  161. package/dist/utils/table.js.map +1 -0
  162. package/dist/utils/validation.d.ts +8 -0
  163. package/dist/utils/validation.d.ts.map +1 -0
  164. package/dist/utils/validation.js +17 -0
  165. package/dist/utils/validation.js.map +1 -0
  166. package/package.json +45 -0
@@ -0,0 +1,157 @@
1
+ import { Command } from 'commander';
2
+ import { readFileSync, unlinkSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { createClient, KlaroApiError } from '../lib/api.js';
5
+ import { requireProject, requireToken } from '../lib/config.js';
6
+ import { resolveBoard } from '../lib/defaults.js';
7
+ import { parseStoryMarkdown } from '../utils/story-markdown.js';
8
+ import { getContentDir, listContentFiles, extractIdentifierFromFilename } from '../utils/content.js';
9
+ async function syncAction(options, command) {
10
+ try {
11
+ const globalOpts = command.optsWithGlobals();
12
+ const project = requireProject(globalOpts.project);
13
+ const token = requireToken();
14
+ const board = resolveBoard(globalOpts.board ?? options.board, project);
15
+ // Find content directory
16
+ const contentDir = getContentDir(project);
17
+ const files = listContentFiles(project);
18
+ if (files.length === 0) {
19
+ console.log('Nothing to sync.');
20
+ return;
21
+ }
22
+ // Parse all files and build updates
23
+ const results = [];
24
+ const updates = [];
25
+ const fileMap = new Map(); // identifier -> filename
26
+ for (const filename of files) {
27
+ const identifier = extractIdentifierFromFilename(filename);
28
+ if (identifier === null) {
29
+ results.push({
30
+ filename,
31
+ identifier: 0,
32
+ synced: false,
33
+ deleted: false,
34
+ error: 'Invalid filename format (expected {id}-{title}.md)',
35
+ });
36
+ continue;
37
+ }
38
+ const filepath = join(contentDir, filename);
39
+ try {
40
+ const content = readFileSync(filepath, 'utf-8');
41
+ const parsed = parseStoryMarkdown(content);
42
+ const update = {
43
+ identifier,
44
+ title: parsed.title,
45
+ specification: parsed.specification ?? '',
46
+ };
47
+ // Add dimensions if present
48
+ if (parsed.dimensions) {
49
+ for (const [key, value] of Object.entries(parsed.dimensions)) {
50
+ if (typeof value === 'string' || typeof value === 'number') {
51
+ update[key] = value;
52
+ }
53
+ }
54
+ }
55
+ updates.push(update);
56
+ fileMap.set(identifier, filename);
57
+ results.push({
58
+ filename,
59
+ identifier,
60
+ synced: false, // Will be set to true after API call
61
+ deleted: false,
62
+ });
63
+ }
64
+ catch (error) {
65
+ const message = error instanceof Error ? error.message : 'Failed to parse file';
66
+ results.push({
67
+ filename,
68
+ identifier,
69
+ synced: false,
70
+ deleted: false,
71
+ error: message,
72
+ });
73
+ }
74
+ }
75
+ if (updates.length === 0) {
76
+ console.log('No valid cards to sync.');
77
+ return;
78
+ }
79
+ // Dry run: show what would be synced
80
+ if (options.dryRun) {
81
+ console.log('Dry run - would sync:');
82
+ for (const update of updates) {
83
+ const filename = fileMap.get(update.identifier);
84
+ console.log(` ${filename} (card ${update.identifier})`);
85
+ }
86
+ if (!options.keep) {
87
+ console.log(`Would delete ${updates.length} file(s) after sync.`);
88
+ }
89
+ return;
90
+ }
91
+ // Submit updates to API
92
+ const api = createClient(project, token);
93
+ await api.updateStories(board, updates);
94
+ // Mark successful syncs
95
+ for (const update of updates) {
96
+ const result = results.find(r => r.identifier === update.identifier);
97
+ if (result) {
98
+ result.synced = true;
99
+ }
100
+ }
101
+ // Delete files (unless --keep)
102
+ if (!options.keep) {
103
+ for (const result of results) {
104
+ if (result.synced) {
105
+ try {
106
+ const filepath = join(contentDir, result.filename);
107
+ unlinkSync(filepath);
108
+ result.deleted = true;
109
+ }
110
+ catch {
111
+ // Ignore delete errors
112
+ }
113
+ }
114
+ }
115
+ }
116
+ // Report results
117
+ const synced = results.filter(r => r.synced);
118
+ const errors = results.filter(r => r.error);
119
+ if (errors.length > 0) {
120
+ for (const r of errors) {
121
+ console.error(`Error with ${r.filename}: ${r.error}`);
122
+ }
123
+ }
124
+ if (synced.length === 0) {
125
+ console.log('No cards synced.');
126
+ }
127
+ else if (synced.length === 1) {
128
+ const msg = options.keep ? 'synced' : 'synced and deleted';
129
+ console.log(`Card ${synced[0].identifier} ${msg}.`);
130
+ }
131
+ else {
132
+ const msg = options.keep ? 'synced' : 'synced and deleted';
133
+ console.log(`${synced.length} cards ${msg}.`);
134
+ }
135
+ }
136
+ catch (error) {
137
+ if (error instanceof KlaroApiError) {
138
+ console.error(`Error: ${error.message}`);
139
+ }
140
+ else if (error instanceof Error) {
141
+ console.error(`Error: ${error.message}`);
142
+ }
143
+ else {
144
+ console.error('An unexpected error occurred');
145
+ }
146
+ process.exit(1);
147
+ }
148
+ }
149
+ export function createSyncCommand() {
150
+ return new Command('sync')
151
+ .description('Upload local card changes and delete synced files')
152
+ .option('-b, --board <board>', 'Board identifier (default: "all")')
153
+ .option('--keep', 'Keep local files after syncing')
154
+ .option('--dry-run', 'Show what would be synced without making changes')
155
+ .action(syncAction);
156
+ }
157
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE5D,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,6BAA6B,EAAE,MAAM,qBAAqB,CAAC;AAgBrG,KAAK,UAAU,UAAU,CAAC,OAAoB,EAAE,OAAgB;IAC9D,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,cAAc,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,YAAY,CAAC,UAAU,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAEvE,yBAAyB;QACzB,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAExC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;QAED,oCAAoC;QACpC,MAAM,OAAO,GAAiB,EAAE,CAAC;QACjC,MAAM,OAAO,GAAuB,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAC,yBAAyB;QAEpE,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;YAC7B,MAAM,UAAU,GAAG,6BAA6B,CAAC,QAAQ,CAAC,CAAC;YAC3D,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;gBACxB,OAAO,CAAC,IAAI,CAAC;oBACX,QAAQ;oBACR,UAAU,EAAE,CAAC;oBACb,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,oDAAoD;iBAC5D,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAE5C,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAChD,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;gBAE3C,MAAM,MAAM,GAAqB;oBAC/B,UAAU;oBACV,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,EAAE;iBAC1C,CAAC;gBAEF,4BAA4B;gBAC5B,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;oBACtB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;wBAC7D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;4BAC3D,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;wBACtB,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACrB,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;gBAClC,OAAO,CAAC,IAAI,CAAC;oBACX,QAAQ;oBACR,UAAU;oBACV,MAAM,EAAE,KAAK,EAAE,qCAAqC;oBACpD,OAAO,EAAE,KAAK;iBACf,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB,CAAC;gBAChF,OAAO,CAAC,IAAI,CAAC;oBACX,QAAQ;oBACR,UAAU;oBACV,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,OAAO;iBACf,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;YACvC,OAAO;QACT,CAAC;QAED,qCAAqC;QACrC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YACrC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;gBAChD,OAAO,CAAC,GAAG,CAAC,KAAK,QAAQ,UAAU,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC;YAC3D,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBAClB,OAAO,CAAC,GAAG,CAAC,gBAAgB,OAAO,CAAC,MAAM,sBAAsB,CAAC,CAAC;YACpE,CAAC;YACD,OAAO;QACT,CAAC;QAED,wBAAwB;QACxB,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACzC,MAAM,GAAG,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAExC,wBAAwB;QACxB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,MAAM,CAAC,UAAU,CAAC,CAAC;YACrE,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC;YACvB,CAAC;QACH,CAAC;QAED,+BAA+B;QAC/B,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;oBAClB,IAAI,CAAC;wBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;wBACnD,UAAU,CAAC,QAAQ,CAAC,CAAC;wBACrB,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;oBACxB,CAAC;oBAAC,MAAM,CAAC;wBACP,uBAAuB;oBACzB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,iBAAiB;QACjB,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAE5C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;gBACvB,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAClC,CAAC;aAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,oBAAoB,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,QAAQ,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,GAAG,GAAG,CAAC,CAAC;QACtD,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,oBAAoB,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;YACnC,OAAO,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3C,CAAC;aAAM,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAClC,OAAO,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;SACvB,WAAW,CAAC,mDAAmD,CAAC;SAChE,MAAM,CAAC,qBAAqB,EAAE,mCAAmC,CAAC;SAClE,MAAM,CAAC,QAAQ,EAAE,gCAAgC,CAAC;SAClD,MAAM,CAAC,WAAW,EAAE,kDAAkD,CAAC;SACvE,MAAM,CAAC,UAAU,CAAC,CAAC;AACxB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Command } from 'commander';
2
+ export declare function createUpdateCommand(): Command;
3
+ export declare function createUpdCommand(): Command;
4
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8DpC,wBAAgB,mBAAmB,IAAI,OAAO,CAM7C;AAED,wBAAgB,gBAAgB,IAAI,OAAO,CAM1C"}
@@ -0,0 +1,68 @@
1
+ import { Command } from 'commander';
2
+ import { createClient, KlaroApiError } from '../lib/api.js';
3
+ import { requireProject, requireToken } from '../lib/config.js';
4
+ import { resolveBoard } from '../lib/defaults.js';
5
+ import { splitArgs, parseDimensions } from '../utils/dimensions.js';
6
+ import { printTable } from '../utils/table.js';
7
+ async function updateAction(args, options, command) {
8
+ try {
9
+ // Split args into identifiers and key=value dimensions
10
+ const { regularArgs, dimensionArgs } = splitArgs(args);
11
+ if (regularArgs.length === 0) {
12
+ console.error('Error: At least one identifier is required');
13
+ process.exit(1);
14
+ return;
15
+ }
16
+ const numericIds = regularArgs.map(id => {
17
+ const num = parseInt(id, 10);
18
+ if (isNaN(num)) {
19
+ throw new Error(`Invalid identifier "${id}": must be a number`);
20
+ }
21
+ return num;
22
+ });
23
+ const dimensions = parseDimensions(dimensionArgs);
24
+ if (Object.keys(dimensions).length === 0) {
25
+ console.error('Error: At least one dimension is required (key=value)');
26
+ process.exit(1);
27
+ return;
28
+ }
29
+ const globalOpts = command.optsWithGlobals();
30
+ const project = requireProject(globalOpts.project);
31
+ const token = requireToken();
32
+ const board = resolveBoard(globalOpts.board ?? options.board, project);
33
+ const api = createClient(project, token);
34
+ const updates = numericIds.map(identifier => ({ identifier, ...dimensions }));
35
+ const stories = await api.updateStories(board, updates);
36
+ if (stories.length > 0) {
37
+ const columns = ['identifier', 'title', ...Object.keys(dimensions)];
38
+ printTable(stories, columns);
39
+ }
40
+ }
41
+ catch (error) {
42
+ if (error instanceof KlaroApiError) {
43
+ console.error(`Error: ${error.message}`);
44
+ }
45
+ else if (error instanceof Error) {
46
+ console.error(`Error: ${error.message}`);
47
+ }
48
+ else {
49
+ console.error('An unexpected error occurred');
50
+ }
51
+ process.exit(1);
52
+ }
53
+ }
54
+ export function createUpdateCommand() {
55
+ return new Command('update')
56
+ .description('Update one or more cards by identifier')
57
+ .argument('<args...>', 'Card identifier(s) followed by key=value dimension(s)')
58
+ .option('-b, --board <board>', 'Board identifier (default: "all")')
59
+ .action(updateAction);
60
+ }
61
+ export function createUpdCommand() {
62
+ return new Command('upd')
63
+ .description('Update one or more cards by identifier')
64
+ .argument('<args...>', 'Card identifier(s) followed by key=value dimension(s)')
65
+ .option('-b, --board <board>', 'Board identifier (default: "all")')
66
+ .action(updateAction);
67
+ }
68
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createUseCommand(): Command;
3
+ //# sourceMappingURL=use.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use.d.ts","sourceRoot":"","sources":["../../src/commands/use.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwBpC,wBAAgB,gBAAgB,IAAI,OAAO,CAK1C"}
@@ -0,0 +1,29 @@
1
+ import { Command } from 'commander';
2
+ import { readConfig, writeConfig } from '../lib/config.js';
3
+ import { validateSubdomain } from '../utils/validation.js';
4
+ function useAction(subdomain) {
5
+ try {
6
+ validateSubdomain(subdomain);
7
+ }
8
+ catch (error) {
9
+ console.error(error.message);
10
+ process.exit(1);
11
+ }
12
+ const config = readConfig();
13
+ const oldProject = config.project;
14
+ config.project = subdomain;
15
+ writeConfig(config);
16
+ if (oldProject) {
17
+ console.log(`Switched from "${oldProject}" to "${subdomain}"`);
18
+ }
19
+ else {
20
+ console.log(`Default project set to "${subdomain}"`);
21
+ }
22
+ }
23
+ export function createUseCommand() {
24
+ return new Command('use')
25
+ .description('Set the default Klaro project')
26
+ .argument('<subdomain>', 'Project subdomain')
27
+ .action(useAction);
28
+ }
29
+ //# sourceMappingURL=use.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use.js","sourceRoot":"","sources":["../../src/commands/use.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,SAAS,SAAS,CAAC,SAAiB;IAClC,IAAI,CAAC;QACH,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC;IAClC,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC;IAC3B,WAAW,CAAC,MAAM,CAAC,CAAC;IAEpB,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,kBAAkB,UAAU,SAAS,SAAS,GAAG,CAAC,CAAC;IACjE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,2BAA2B,SAAS,GAAG,CAAC,CAAC;IACvD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC;SACtB,WAAW,CAAC,+BAA+B,CAAC;SAC5C,QAAQ,CAAC,aAAa,EAAE,mBAAmB,CAAC;SAC5C,MAAM,CAAC,SAAS,CAAC,CAAC;AACvB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createWhoamiCommand(): Command;
3
+ //# sourceMappingURL=whoami.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyBpC,wBAAgB,mBAAmB,IAAI,OAAO,CAI7C"}
@@ -0,0 +1,30 @@
1
+ import { Command } from 'commander';
2
+ import { KlaroApi, KlaroApiError } from '../lib/api.js';
3
+ import { getToken } from '../lib/config.js';
4
+ async function whoamiAction() {
5
+ const token = getToken();
6
+ if (!token) {
7
+ console.error('Not logged in. Run "klaro login" first.');
8
+ process.exit(1);
9
+ }
10
+ try {
11
+ const api = new KlaroApi('app', token);
12
+ const me = await api.getMe();
13
+ console.log(me.nickname ? `${me.email} (${me.nickname})` : me.email);
14
+ }
15
+ catch (error) {
16
+ if (error instanceof KlaroApiError) {
17
+ console.error(`Failed to get user info: ${error.message}`);
18
+ }
19
+ else {
20
+ console.error('Failed to get user info: An unexpected error occurred');
21
+ }
22
+ process.exit(1);
23
+ }
24
+ }
25
+ export function createWhoamiCommand() {
26
+ return new Command('whoami')
27
+ .description('Show the currently logged in user')
28
+ .action(whoamiAction);
29
+ }
30
+ //# sourceMappingURL=whoami.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,KAAK,UAAU,YAAY;IACzB,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;QACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACvC,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IACvE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;YACnC,OAAO,CAAC,KAAK,CAAC,4BAA4B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC;SACzB,WAAW,CAAC,mCAAmC,CAAC;SAChD,MAAM,CAAC,YAAY,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function generateBashCompletion(): string;
2
+ //# sourceMappingURL=bash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../src/completions/bash.ts"],"names":[],"mappings":"AAaA,wBAAgB,sBAAsB,IAAI,MAAM,CA6H/C"}
@@ -0,0 +1,134 @@
1
+ import { COMMANDS, GLOBAL_OPTIONS } from './commands.js';
2
+ function formatOptions(options) {
3
+ return options
4
+ .flatMap(o => [o.short, o.long].filter(Boolean))
5
+ .join(' ');
6
+ }
7
+ function getCommandOptions(cmd) {
8
+ const opts = [...GLOBAL_OPTIONS, ...(cmd.options ?? [])];
9
+ return formatOptions(opts);
10
+ }
11
+ export function generateBashCompletion() {
12
+ const commandNames = COMMANDS.map(c => c.name).join(' ');
13
+ // Build case statements for subcommands
14
+ const subcommandCases = COMMANDS
15
+ .filter(c => c.subcommands)
16
+ .map(cmd => {
17
+ const subNames = cmd.subcommands.map(s => s.name).join(' ');
18
+ return ` ${cmd.name})
19
+ COMPREPLY=($(compgen -W "${subNames}" -- "\${cur}"))
20
+ return
21
+ ;;`;
22
+ })
23
+ .join('\n');
24
+ // Build case statements for command options
25
+ const optionCases = COMMANDS
26
+ .map(cmd => {
27
+ const opts = getCommandOptions(cmd);
28
+ return ` ${cmd.name})
29
+ opts="${opts}"
30
+ ;;`;
31
+ })
32
+ .join('\n');
33
+ return `# Bash completion for klaro CLI
34
+ # Add to ~/.bashrc: eval "$(klaro completion bash)"
35
+
36
+ _klaro_completions() {
37
+ local cur prev words cword
38
+ if type _init_completion &>/dev/null; then
39
+ _init_completion || return
40
+ else
41
+ cur="\${COMP_WORDS[COMP_CWORD]}"
42
+ prev="\${COMP_WORDS[COMP_CWORD-1]}"
43
+ words=("\${COMP_WORDS[@]}")
44
+ cword=$COMP_CWORD
45
+ fi
46
+
47
+ local commands="${commandNames}"
48
+ local global_opts="${formatOptions(GLOBAL_OPTIONS)}"
49
+
50
+ # Handle option arguments that need dynamic completion
51
+ case "\${prev}" in
52
+ -p|--project|use)
53
+ local projects
54
+ projects="$(klaro completion --list-projects 2>/dev/null)"
55
+ COMPREPLY=($(compgen -W "\${projects}" -- "\${cur}"))
56
+ return
57
+ ;;
58
+ -b|--board)
59
+ local boards
60
+ boards="$(klaro completion --list-boards 2>/dev/null)"
61
+ COMPREPLY=($(compgen -W "\${boards}" -- "\${cur}"))
62
+ return
63
+ ;;
64
+ esac
65
+
66
+ # Find the command (first non-option argument after klaro)
67
+ local cmd=""
68
+ local i=1
69
+ while [[ $i -lt $cword ]]; do
70
+ local word="\${words[$i]}"
71
+ if [[ "\${word}" != -* ]]; then
72
+ cmd="\${word}"
73
+ break
74
+ fi
75
+ # Skip option arguments
76
+ case "\${word}" in
77
+ -p|--project|--board|--dims)
78
+ ((i++))
79
+ ;;
80
+ esac
81
+ ((i++))
82
+ done
83
+
84
+ # No command yet - complete commands or global options
85
+ if [[ -z "\${cmd}" ]]; then
86
+ if [[ "\${cur}" == -* ]]; then
87
+ COMPREPLY=($(compgen -W "\${global_opts}" -- "\${cur}"))
88
+ else
89
+ COMPREPLY=($(compgen -W "\${commands}" -- "\${cur}"))
90
+ fi
91
+ return
92
+ fi
93
+
94
+ # Find subcommand position
95
+ local subcmd=""
96
+ ((i++))
97
+ while [[ $i -lt $cword ]]; do
98
+ local word="\${words[$i]}"
99
+ if [[ "\${word}" != -* ]]; then
100
+ subcmd="\${word}"
101
+ break
102
+ fi
103
+ ((i++))
104
+ done
105
+
106
+ # Complete subcommands if command has them and no subcommand yet
107
+ if [[ -z "\${subcmd}" ]] && [[ "\${cur}" != -* ]]; then
108
+ case "\${cmd}" in
109
+ ${subcommandCases}
110
+ esac
111
+ fi
112
+
113
+ # Complete options based on command
114
+ if [[ "\${cur}" == -* ]]; then
115
+ local opts=""
116
+ case "\${cmd}" in
117
+ ${optionCases}
118
+ esac
119
+ COMPREPLY=($(compgen -W "\${opts}" -- "\${cur}"))
120
+ return
121
+ fi
122
+
123
+ # Default: complete files for commands that accept file arguments
124
+ case "\${cmd}" in
125
+ create)
126
+ COMPREPLY=($(compgen -f -- "\${cur}"))
127
+ ;;
128
+ esac
129
+ }
130
+
131
+ complete -F _klaro_completions klaro
132
+ `;
133
+ }
134
+ //# sourceMappingURL=bash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/completions/bash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAmC,MAAM,eAAe,CAAC;AAE1F,SAAS,aAAa,CAAC,OAAoB;IACzC,OAAO,OAAO;SACX,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;SAC/C,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAe;IACxC,MAAM,IAAI,GAAG,CAAC,GAAG,cAAc,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;IACzD,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEzD,wCAAwC;IACxC,MAAM,eAAe,GAAG,QAAQ;SAC7B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;SAC1B,GAAG,CAAC,GAAG,CAAC,EAAE;QACT,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,SAAS,GAAG,CAAC,IAAI;mCACK,QAAQ;;WAEhC,CAAC;IACR,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,4CAA4C;IAC5C,MAAM,WAAW,GAAG,QAAQ;SACzB,GAAG,CAAC,GAAG,CAAC,EAAE;QACT,MAAM,IAAI,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACpC,OAAO,SAAS,GAAG,CAAC,IAAI;gBACd,IAAI;WACT,CAAC;IACR,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO;;;;;;;;;;;;;;oBAcW,YAAY;uBACT,aAAa,CAAC,cAAc,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6DlD,eAAe;;;;;;;;EAQf,WAAW;;;;;;;;;;;;;;;CAeZ,CAAC;AACF,CAAC"}
@@ -0,0 +1,18 @@
1
+ export interface CommandDef {
2
+ name: string;
3
+ description: string;
4
+ subcommands?: CommandDef[];
5
+ options?: OptionDef[];
6
+ takesArgs?: 'projects' | 'boards' | 'identifiers' | 'files' | 'none';
7
+ }
8
+ export interface OptionDef {
9
+ short?: string;
10
+ long: string;
11
+ description: string;
12
+ takesArg?: 'projects' | 'boards' | 'files' | 'string' | 'none';
13
+ }
14
+ export declare const GLOBAL_OPTIONS: OptionDef[];
15
+ export declare const COMMANDS: CommandDef[];
16
+ export declare function getCommandNames(): string[];
17
+ export declare function getSubcommandNames(command: string): string[];
18
+ //# sourceMappingURL=commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/completions/commands.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,aAAa,GAAG,OAAO,GAAG,MAAM,CAAC;CACtE;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;CAChE;AAGD,eAAO,MAAM,cAAc,EAAE,SAAS,EAMrC,CAAC;AAGF,eAAO,MAAM,QAAQ,EAAE,UAAU,EAwJhC,CAAC;AAGF,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAE1C;AAGD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAG5D"}