multiclone 0.0.0-stage → 0.2.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 (240) hide show
  1. package/README.md +78 -2
  2. package/agents/section-builder.md +37 -0
  3. package/commands/multiclone.md +15 -0
  4. package/dist/adapters/cli.js +129 -0
  5. package/dist/adapters/cli.js.map +1 -0
  6. package/dist/adapters/cliArgs.js +63 -0
  7. package/dist/adapters/cliArgs.js.map +1 -0
  8. package/dist/adapters/mcp.js +83 -0
  9. package/dist/adapters/mcp.js.map +1 -0
  10. package/dist/analyze/analyze.js +85 -0
  11. package/dist/analyze/analyze.js.map +1 -0
  12. package/dist/analyze/animations.js +340 -0
  13. package/dist/analyze/animations.js.map +1 -0
  14. package/dist/analyze/ast.js +182 -0
  15. package/dist/analyze/ast.js.map +1 -0
  16. package/dist/analyze/chunks.js +160 -0
  17. package/dist/analyze/chunks.js.map +1 -0
  18. package/dist/analyze/jobs/code.js +117 -0
  19. package/dist/analyze/jobs/code.js.map +1 -0
  20. package/dist/analyze/jobs/sections.js +356 -0
  21. package/dist/analyze/jobs/sections.js.map +1 -0
  22. package/dist/analyze/pretty.js +20 -0
  23. package/dist/analyze/pretty.js.map +1 -0
  24. package/dist/analyze/report.js +101 -0
  25. package/dist/analyze/report.js.map +1 -0
  26. package/dist/analyze/worker.js +71 -0
  27. package/dist/analyze/worker.js.map +1 -0
  28. package/dist/capture/capture.js +340 -0
  29. package/dist/capture/capture.js.map +1 -0
  30. package/dist/capture/collectors/a11y.js +92 -0
  31. package/dist/capture/collectors/a11y.js.map +1 -0
  32. package/dist/capture/collectors/animations.js +113 -0
  33. package/dist/capture/collectors/animations.js.map +1 -0
  34. package/dist/capture/collectors/breakpoints.js +31 -0
  35. package/dist/capture/collectors/breakpoints.js.map +1 -0
  36. package/dist/capture/collectors/consent.js +39 -0
  37. package/dist/capture/collectors/consent.js.map +1 -0
  38. package/dist/capture/collectors/coverage.js +121 -0
  39. package/dist/capture/collectors/coverage.js.map +1 -0
  40. package/dist/capture/collectors/dom.js +16 -0
  41. package/dist/capture/collectors/dom.js.map +1 -0
  42. package/dist/capture/collectors/fonts.js +154 -0
  43. package/dist/capture/collectors/fonts.js.map +1 -0
  44. package/dist/capture/collectors/frames.js +93 -0
  45. package/dist/capture/collectors/frames.js.map +1 -0
  46. package/dist/capture/collectors/index.js +61 -0
  47. package/dist/capture/collectors/index.js.map +1 -0
  48. package/dist/capture/collectors/interactions.js +207 -0
  49. package/dist/capture/collectors/interactions.js.map +1 -0
  50. package/dist/capture/collectors/intro.js +84 -0
  51. package/dist/capture/collectors/intro.js.map +1 -0
  52. package/dist/capture/collectors/listeners.js +84 -0
  53. package/dist/capture/collectors/listeners.js.map +1 -0
  54. package/dist/capture/collectors/motion.js +91 -0
  55. package/dist/capture/collectors/motion.js.map +1 -0
  56. package/dist/capture/collectors/network.js +288 -0
  57. package/dist/capture/collectors/network.js.map +1 -0
  58. package/dist/capture/collectors/probes.js +34 -0
  59. package/dist/capture/collectors/probes.js.map +1 -0
  60. package/dist/capture/collectors/runtime.js +38 -0
  61. package/dist/capture/collectors/runtime.js.map +1 -0
  62. package/dist/capture/collectors/scripts.js +98 -0
  63. package/dist/capture/collectors/scripts.js.map +1 -0
  64. package/dist/capture/collectors/sections.js +17 -0
  65. package/dist/capture/collectors/sections.js.map +1 -0
  66. package/dist/capture/collectors/shots.js +58 -0
  67. package/dist/capture/collectors/shots.js.map +1 -0
  68. package/dist/capture/collectors/snapshot.js +47 -0
  69. package/dist/capture/collectors/snapshot.js.map +1 -0
  70. package/dist/capture/collectors/sourcemaps.js +153 -0
  71. package/dist/capture/collectors/sourcemaps.js.map +1 -0
  72. package/dist/capture/collectors/storage.js +72 -0
  73. package/dist/capture/collectors/storage.js.map +1 -0
  74. package/dist/capture/context.js +40 -0
  75. package/dist/capture/context.js.map +1 -0
  76. package/dist/capture/hooks/candidates.js +104 -0
  77. package/dist/capture/hooks/candidates.js.map +1 -0
  78. package/dist/capture/hooks/consent.js +82 -0
  79. package/dist/capture/hooks/consent.js.map +1 -0
  80. package/dist/capture/hooks/recorders.js +507 -0
  81. package/dist/capture/hooks/recorders.js.map +1 -0
  82. package/dist/capture/hooks/sections.js +62 -0
  83. package/dist/capture/hooks/sections.js.map +1 -0
  84. package/dist/capture/hooks/styles.js +86 -0
  85. package/dist/capture/hooks/styles.js.map +1 -0
  86. package/dist/capture/probes.js +491 -0
  87. package/dist/capture/probes.js.map +1 -0
  88. package/dist/capture/report.js +115 -0
  89. package/dist/capture/report.js.map +1 -0
  90. package/dist/compare/compare.js +391 -0
  91. package/dist/compare/compare.js.map +1 -0
  92. package/dist/compare/image.js +105 -0
  93. package/dist/compare/image.js.map +1 -0
  94. package/dist/compare/probes.js +129 -0
  95. package/dist/compare/probes.js.map +1 -0
  96. package/dist/compare/report.js +99 -0
  97. package/dist/compare/report.js.map +1 -0
  98. package/dist/compare/session.js +139 -0
  99. package/dist/compare/session.js.map +1 -0
  100. package/dist/compare/shoot.js +62 -0
  101. package/dist/compare/shoot.js.map +1 -0
  102. package/dist/contracts/catalog.js +29 -0
  103. package/dist/contracts/catalog.js.map +1 -0
  104. package/dist/contracts/context.js +19 -0
  105. package/dist/contracts/context.js.map +1 -0
  106. package/dist/contracts/fields.js +16 -0
  107. package/dist/contracts/fields.js.map +1 -0
  108. package/dist/contracts/tools/analyze.js +38 -0
  109. package/dist/contracts/tools/analyze.js.map +1 -0
  110. package/dist/contracts/tools/capture.js +87 -0
  111. package/dist/contracts/tools/capture.js.map +1 -0
  112. package/dist/contracts/tools/compare.js +142 -0
  113. package/dist/contracts/tools/compare.js.map +1 -0
  114. package/dist/contracts/tools/doctor.js +23 -0
  115. package/dist/contracts/tools/doctor.js.map +1 -0
  116. package/dist/contracts/tools/inspect.js +41 -0
  117. package/dist/contracts/tools/inspect.js.map +1 -0
  118. package/dist/contracts/tools/method.js +60 -0
  119. package/dist/contracts/tools/method.js.map +1 -0
  120. package/dist/contracts/tools/mirror.js +53 -0
  121. package/dist/contracts/tools/mirror.js.map +1 -0
  122. package/dist/contracts/tools/project.js +61 -0
  123. package/dist/contracts/tools/project.js.map +1 -0
  124. package/dist/contracts/tools/session.js +195 -0
  125. package/dist/contracts/tools/session.js.map +1 -0
  126. package/dist/contracts/types.js +20 -0
  127. package/dist/contracts/types.js.map +1 -0
  128. package/dist/core/cdp.js +146 -0
  129. package/dist/core/cdp.js.map +1 -0
  130. package/dist/core/chrome.js +185 -0
  131. package/dist/core/chrome.js.map +1 -0
  132. package/dist/core/files.js +31 -0
  133. package/dist/core/files.js.map +1 -0
  134. package/dist/core/inpage.js +24 -0
  135. package/dist/core/inpage.js.map +1 -0
  136. package/dist/core/log.js +10 -0
  137. package/dist/core/log.js.map +1 -0
  138. package/dist/core/page.js +269 -0
  139. package/dist/core/page.js.map +1 -0
  140. package/dist/doctor.js +37 -0
  141. package/dist/doctor.js.map +1 -0
  142. package/dist/domain/breakpoints.js +47 -0
  143. package/dist/domain/breakpoints.js.map +1 -0
  144. package/dist/domain/budget.js +38 -0
  145. package/dist/domain/budget.js.map +1 -0
  146. package/dist/domain/compare.js +138 -0
  147. package/dist/domain/compare.js.map +1 -0
  148. package/dist/domain/coverage.js +96 -0
  149. package/dist/domain/coverage.js.map +1 -0
  150. package/dist/domain/motion.js +142 -0
  151. package/dist/domain/motion.js.map +1 -0
  152. package/dist/domain/paths.js +55 -0
  153. package/dist/domain/paths.js.map +1 -0
  154. package/dist/domain/result.js +38 -0
  155. package/dist/domain/result.js.map +1 -0
  156. package/dist/domain/routes.js +160 -0
  157. package/dist/domain/routes.js.map +1 -0
  158. package/dist/domain/sections.js +94 -0
  159. package/dist/domain/sections.js.map +1 -0
  160. package/dist/domain/snapshot.js +268 -0
  161. package/dist/domain/snapshot.js.map +1 -0
  162. package/dist/domain/sourcemap.js +95 -0
  163. package/dist/domain/sourcemap.js.map +1 -0
  164. package/dist/domain/stack.js +342 -0
  165. package/dist/domain/stack.js.map +1 -0
  166. package/dist/domain/tokens.js +183 -0
  167. package/dist/domain/tokens.js.map +1 -0
  168. package/dist/domain/types.js +2 -0
  169. package/dist/domain/types.js.map +1 -0
  170. package/dist/domain/viewports.js +45 -0
  171. package/dist/domain/viewports.js.map +1 -0
  172. package/dist/mirror/rewrite.js +56 -0
  173. package/dist/mirror/rewrite.js.map +1 -0
  174. package/dist/mirror/server.js +191 -0
  175. package/dist/mirror/server.js.map +1 -0
  176. package/dist/mirror/store.js +86 -0
  177. package/dist/mirror/store.js.map +1 -0
  178. package/dist/project/assets.js +69 -0
  179. package/dist/project/assets.js.map +1 -0
  180. package/dist/project/draft.js +860 -0
  181. package/dist/project/draft.js.map +1 -0
  182. package/dist/project/method.js +154 -0
  183. package/dist/project/method.js.map +1 -0
  184. package/dist/project/scaffold.js +142 -0
  185. package/dist/project/scaffold.js.map +1 -0
  186. package/dist/session/discover.js +53 -0
  187. package/dist/session/discover.js.map +1 -0
  188. package/dist/session/proc.js +113 -0
  189. package/dist/session/proc.js.map +1 -0
  190. package/dist/session/progress.js +83 -0
  191. package/dist/session/progress.js.map +1 -0
  192. package/dist/session/session.js +450 -0
  193. package/dist/session/session.js.map +1 -0
  194. package/dist/session/state.js +47 -0
  195. package/dist/session/state.js.map +1 -0
  196. package/dist/store/inspect.js +212 -0
  197. package/dist/store/inspect.js.map +1 -0
  198. package/dist/store/run.js +112 -0
  199. package/dist/store/run.js.map +1 -0
  200. package/dist/store/summary.js +69 -0
  201. package/dist/store/summary.js.map +1 -0
  202. package/dist/version.js +2 -0
  203. package/dist/version.js.map +1 -0
  204. package/install.sh +29 -0
  205. package/package.json +67 -4
  206. package/skills/multiclone/SKILL.md +123 -0
  207. package/skills/multiclone/references/capture-format.md +73 -0
  208. package/skills/multiclone/references/fidelity.md +54 -0
  209. package/skills/multiclone/references/quality.md +47 -0
  210. package/skills/multiclone/references/stacks.md +156 -0
  211. package/templates/react-vite/.prettierignore +5 -0
  212. package/templates/react-vite/.prettierrc.json +6 -0
  213. package/templates/react-vite/eslint.config.js +38 -0
  214. package/templates/react-vite/gitignore +4 -0
  215. package/templates/react-vite/index.html +12 -0
  216. package/templates/react-vite/package.json +36 -0
  217. package/templates/react-vite/src/app/App.tsx +15 -0
  218. package/templates/react-vite/src/app/Page.tsx +11 -0
  219. package/templates/react-vite/src/app/routes.ts +7 -0
  220. package/templates/react-vite/src/components/README.md +7 -0
  221. package/templates/react-vite/src/content/README.md +2 -0
  222. package/templates/react-vite/src/hooks/useActiveSection.ts +37 -0
  223. package/templates/react-vite/src/hooks/useInView.ts +45 -0
  224. package/templates/react-vite/src/hooks/useMediaQuery.ts +15 -0
  225. package/templates/react-vite/src/lib/cn.ts +4 -0
  226. package/templates/react-vite/src/lib/math.ts +21 -0
  227. package/templates/react-vite/src/lib/mc.ts +13 -0
  228. package/templates/react-vite/src/lib/media.ts +4 -0
  229. package/templates/react-vite/src/main.tsx +13 -0
  230. package/templates/react-vite/src/providers/SmoothScroll.tsx +24 -0
  231. package/templates/react-vite/src/styles/base.css +42 -0
  232. package/templates/react-vite/src/styles/draft.css +1 -0
  233. package/templates/react-vite/src/styles/fonts.css +1 -0
  234. package/templates/react-vite/src/styles/index.css +4 -0
  235. package/templates/react-vite/src/styles/tokens.css +3 -0
  236. package/templates/react-vite/src/vite-env.d.ts +1 -0
  237. package/templates/react-vite/tsconfig.app.json +29 -0
  238. package/templates/react-vite/tsconfig.json +4 -0
  239. package/templates/react-vite/tsconfig.node.json +19 -0
  240. package/templates/react-vite/vite.config.ts +37 -0
@@ -0,0 +1,212 @@
1
+ import { err, mcError, ok } from '../domain/result.js';
2
+ import { nodeStyles } from '../domain/snapshot.js';
3
+ import { pathWithin } from '../domain/sections.js';
4
+ import { runSummary } from './summary.js';
5
+ export const FACETS = [
6
+ 'summary',
7
+ 'section',
8
+ 'dom',
9
+ 'styles',
10
+ 'network',
11
+ 'motion',
12
+ 'animations',
13
+ 'runtime',
14
+ 'interactions',
15
+ 'code',
16
+ 'fonts',
17
+ 'tokens',
18
+ ];
19
+ const page = (facet, run, rows, query, note) => {
20
+ const items = rows.slice(query.offset, query.offset + query.limit);
21
+ const next = query.offset + items.length;
22
+ return {
23
+ facet,
24
+ run: run.dir,
25
+ total: rows.length,
26
+ offset: query.offset,
27
+ limit: query.limit,
28
+ nextOffset: next < rows.length ? next : null,
29
+ items,
30
+ ...(note === undefined ? {} : { note }),
31
+ };
32
+ };
33
+ const matches = (row, text) => text === undefined ||
34
+ text === '' ||
35
+ JSON.stringify(row).toLowerCase().includes(text.toLowerCase());
36
+ async function findSection(run, selector) {
37
+ const sections = await run.json('sections/index.json', []);
38
+ if (!sections.length)
39
+ return err(mcError('not-found', 'No section bundles in this run', 'Run `analyze` on the capture.'));
40
+ if (selector === undefined)
41
+ return err(mcError('invalid-input', 'Pass a section id as selector', `Sections: ${sections.map((s) => s.id).join(', ')}`));
42
+ const found = sections.find((section) => section.id === selector) ??
43
+ sections.find((section) => section.id.startsWith(selector) || section.label === selector);
44
+ return found
45
+ ? ok(found)
46
+ : err(mcError('not-found', `No section "${selector}"`, `Sections: ${sections.map((s) => s.id).join(', ')}`));
47
+ }
48
+ /** Element rows for the dom/styles facets, optionally limited to a path prefix or a section. */
49
+ async function elementRows(run, query, withStyles) {
50
+ const viewport = query.viewport ?? run.viewports[0] ?? 'desktop';
51
+ const snapshot = await run.snapshot(viewport);
52
+ if (!snapshot)
53
+ return err(mcError('not-found', `No snapshot for ${viewport}`));
54
+ let prefix = query.selector;
55
+ if (prefix && /^\d{2}-/.test(prefix)) {
56
+ const section = await findSection(run, prefix);
57
+ if (!section.ok)
58
+ return section;
59
+ prefix = section.value.viewports[viewport]?.path ?? prefix;
60
+ }
61
+ const doc = snapshot.documents[0];
62
+ const rows = [];
63
+ for (const node of doc?.nodes ?? []) {
64
+ if (node.t !== 1 || !node.path)
65
+ continue;
66
+ if (prefix && !pathWithin(node.path, prefix))
67
+ continue;
68
+ const row = elementRow(snapshot, node, withStyles);
69
+ if (matches(row, query.query))
70
+ rows.push(row);
71
+ }
72
+ return ok(rows);
73
+ }
74
+ function elementRow(snapshot, node, withStyles) {
75
+ const doc = snapshot.documents[0];
76
+ const text = doc?.nodes
77
+ .filter((child) => child.p === node.i && child.t === 3 && child.text?.trim())
78
+ .map((child) => child.text?.trim())
79
+ .join(' ')
80
+ .slice(0, 200);
81
+ const style = nodeStyles(snapshot, node);
82
+ const trimmed = withStyles
83
+ ? Object.fromEntries(Object.entries(style).filter(([, value]) => value && !/^(none|normal|auto|0px|static|visible|rgba\(0, 0, 0, 0\))$/.test(value)))
84
+ : undefined;
85
+ return {
86
+ path: node.path,
87
+ tag: node.name.toLowerCase(),
88
+ ...(node.box ? { box: node.box } : {}),
89
+ ...(node.attrs ? { attrs: node.attrs } : {}),
90
+ ...(text ? { text } : {}),
91
+ ...(trimmed ? { style: trimmed } : {}),
92
+ };
93
+ }
94
+ /** Answers one inspect query from the run folder, one page at a time. */
95
+ export async function inspect(run, query) {
96
+ const viewport = query.viewport ?? run.viewports[0] ?? 'desktop';
97
+ switch (query.facet) {
98
+ case 'summary':
99
+ return ok(page('summary', run, [await runSummary(run)], query));
100
+ case 'section': {
101
+ if (query.selector === undefined) {
102
+ const sections = await run.json('sections/index.json', []);
103
+ return ok(page('section', run, sections.filter((s) => matches(s, query.query)), query, 'Pass selector=<id> for one bundle.'));
104
+ }
105
+ const found = await findSection(run, query.selector);
106
+ if (!found.ok)
107
+ return found;
108
+ const brief = await run.text(`${found.value.dir}/section.md`);
109
+ const files = await run.list(found.value.dir);
110
+ return ok(page('section', run, [{ ...found.value, files: files.map((file) => `${found.value.dir}/${file}`), brief }], query));
111
+ }
112
+ case 'dom':
113
+ case 'styles': {
114
+ const rows = await elementRows(run, query, query.facet === 'styles');
115
+ return rows.ok ? ok(page(query.facet, run, rows.value, query)) : rows;
116
+ }
117
+ case 'network': {
118
+ const rows = (await run.network())
119
+ .filter((entry) => matches(entry, query.query))
120
+ .map((entry) => ({
121
+ url: entry.url,
122
+ status: entry.status,
123
+ type: entry.resourceType,
124
+ mime: entry.mimeType,
125
+ bytes: entry.bytes,
126
+ file: entry.file,
127
+ viewport: entry.viewport,
128
+ }));
129
+ return ok(page('network', run, rows, query));
130
+ }
131
+ case 'motion': {
132
+ let rows = await run.motion();
133
+ if (query.selector) {
134
+ const prefix = /^\d{2}-/.test(query.selector)
135
+ ? await sectionPath(run, query.selector, viewport)
136
+ : query.selector;
137
+ if (prefix === null)
138
+ return err(mcError('not-found', `No section "${query.selector}"`));
139
+ rows = rows.filter((track) => track.id === query.selector || pathWithin(track.path, prefix));
140
+ }
141
+ return ok(page('motion', run, rows.filter((row) => matches(row, query.query)), query));
142
+ }
143
+ case 'animations': {
144
+ const css = (await run.animations()).filter((row) => row.viewport === viewport);
145
+ const code = await run.json('animations-code.json', []);
146
+ const rows = [
147
+ ...css.map((row) => ({ source: 'chrome', ...row })),
148
+ ...code.map((row) => ({ source: 'code', ...row })),
149
+ ];
150
+ return ok(page('animations', run, rows.filter((row) => matches(row, query.selector) && matches(row, query.query)), query));
151
+ }
152
+ case 'runtime': {
153
+ const runtime = await run.runtime(viewport);
154
+ if (!query.selector) {
155
+ const buckets = Object.entries(runtime)
156
+ .filter(([key]) => key !== '_count')
157
+ .map(([key, value]) => ({
158
+ bucket: key,
159
+ entries: Array.isArray(value) ? value.length : 1,
160
+ }));
161
+ return ok(page('runtime', run, buckets, query, 'Pass selector=<bucket> (gsap, waapi, intersection, shaders, three, lottie, rive…) for entries.'));
162
+ }
163
+ const value = runtime[query.selector];
164
+ const rows = Array.isArray(value) ? value : value === undefined ? [] : [value];
165
+ return ok(page('runtime', run, rows.filter((row) => matches(row, query.query)), query));
166
+ }
167
+ case 'interactions': {
168
+ const rows = (await run.interactions(viewport)).filter((row) => (query.selector ? pathWithin(row.path, query.selector) : true) &&
169
+ matches(row, query.query));
170
+ return ok(page('interactions', run, rows, query));
171
+ }
172
+ case 'code': {
173
+ if (query.selector) {
174
+ const text = await run.text(query.selector);
175
+ if (text === null)
176
+ return err(mcError('not-found', `No file ${query.selector} in the run`));
177
+ const lines = text.split('\n');
178
+ return ok(page('code', run, lines.map((line, index) => `${String(index + 1)}: ${line}`), query, 'Lines of the file; page with offset/limit.'));
179
+ }
180
+ const index = await run.json('code/index.json', {
181
+ vendors: [],
182
+ entries: [],
183
+ });
184
+ const hot = await run.json('motion-code/index.json', []);
185
+ const sources = await run.json('sources/index.json', { files: [] });
186
+ const rows = [
187
+ ...hot.map((row) => ({ kind: 'hot', ...row })),
188
+ ...sources.files.map((row) => ({ kind: 'source', ...row })),
189
+ ...index.entries.map((row) => ({ kind: 'app', ...row })),
190
+ ].filter((row) => matches(row, query.query));
191
+ return ok(page('code', run, rows, query, `Vendor libraries skipped: ${index.vendors.join(', ') || 'none'}. Pass selector=<file> to read one.`));
192
+ }
193
+ case 'fonts': {
194
+ const fonts = await run.fonts();
195
+ return ok(page('fonts', run, [
196
+ ...fonts.faces.map((face) => ({ kind: 'face', ...face })),
197
+ ...fonts.usage.map((usage) => ({ kind: 'usage', ...usage })),
198
+ ].filter((row) => matches(row, query.query)), query));
199
+ }
200
+ case 'tokens': {
201
+ const tokens = await run.json('tokens.json', null);
202
+ if (!tokens)
203
+ return err(mcError('not-found', 'No tokens.json', 'Run `analyze` on the capture.'));
204
+ return ok(page('tokens', run, Object.entries(tokens).map(([scale, values]) => ({ scale, values })), query));
205
+ }
206
+ }
207
+ }
208
+ async function sectionPath(run, id, viewport) {
209
+ const found = await findSection(run, id);
210
+ return found.ok ? (found.value.viewports[viewport]?.path ?? null) : null;
211
+ }
212
+ //# sourceMappingURL=inspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../src/store/inspect.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,UAAU,EAA2C,MAAM,uBAAuB,CAAC;AAC5F,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,SAAS;IACT,SAAS;IACT,KAAK;IACL,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,YAAY;IACZ,SAAS;IACT,cAAc;IACd,MAAM;IACN,OAAO;IACP,QAAQ;CACA,CAAC;AAyBX,MAAM,IAAI,GAAG,CACX,KAAY,EACZ,GAAc,EACd,IAAwB,EACxB,KAAmB,EACnB,IAAa,EACA,EAAE;IACf,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IACnE,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IACzC,OAAO;QACL,KAAK;QACL,GAAG,EAAE,GAAG,CAAC,GAAG;QACZ,KAAK,EAAE,IAAI,CAAC,MAAM;QAClB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,UAAU,EAAE,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;QAC5C,KAAK;QACL,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;KACxC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,OAAO,GAAG,CAAC,GAAY,EAAE,IAAwB,EAAW,EAAE,CAClE,IAAI,KAAK,SAAS;IAClB,IAAI,KAAK,EAAE;IACX,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;AAEjE,KAAK,UAAU,WAAW,CACxB,GAAc,EACd,QAA4B;IAE5B,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,CAAmB,qBAAqB,EAAE,EAAE,CAAC,CAAC;IAC7E,IAAI,CAAC,QAAQ,CAAC,MAAM;QAClB,OAAO,GAAG,CACR,OAAO,CAAC,WAAW,EAAE,gCAAgC,EAAE,+BAA+B,CAAC,CACxF,CAAC;IACJ,IAAI,QAAQ,KAAK,SAAS;QACxB,OAAO,GAAG,CACR,OAAO,CACL,eAAe,EACf,+BAA+B,EAC/B,aAAa,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACpD,CACF,CAAC;IACJ,MAAM,KAAK,GACT,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,QAAQ,CAAC;QACnD,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC;IAC5F,OAAO,KAAK;QACV,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACX,CAAC,CAAC,GAAG,CACD,OAAO,CACL,WAAW,EACX,eAAe,QAAQ,GAAG,EAC1B,aAAa,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACpD,CACF,CAAC;AACR,CAAC;AAED,gGAAgG;AAChG,KAAK,UAAU,WAAW,CACxB,GAAc,EACd,KAAmB,EACnB,UAAmB;IAEnB,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;IACjE,MAAM,QAAQ,GAA2B,MAAM,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACtE,IAAI,CAAC,QAAQ;QAAE,OAAO,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,mBAAmB,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC/E,IAAI,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC;IAC5B,IAAI,MAAM,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC/C,IAAI,CAAC,OAAO,CAAC,EAAE;YAAE,OAAO,OAAO,CAAC;QAChC,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,IAAI,IAAI,MAAM,CAAC;IAC7D,CAAC;IACD,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,IAAI,GAAc,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,SAAS;QACzC,IAAI,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC;YAAE,SAAS;QACvD,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;QACnD,IAAI,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,UAAU,CAAC,QAAyB,EAAE,IAAkB,EAAE,UAAmB;IACpF,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,GAAG,EAAE,KAAK;SACpB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;SAC5E,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;SAClC,IAAI,CAAC,GAAG,CAAC;SACT,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACjB,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,UAAU;QACxB,CAAC,CAAC,MAAM,CAAC,WAAW,CAChB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAC1B,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CACZ,KAAK,IAAI,CAAC,4DAA4D,CAAC,IAAI,CAAC,KAAK,CAAC,CACrF,CACF;QACH,CAAC,CAAC,SAAS,CAAC;IACd,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;QAC5B,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5C,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACvC,CAAC;AACJ,CAAC;AAED,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAc,EAAE,KAAmB;IAC/D,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;IACjE,QAAQ,KAAK,CAAC,KAAK,EAAE,CAAC;QACpB,KAAK,SAAS;YACZ,OAAO,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;QAClE,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;gBACjC,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,CAAmB,qBAAqB,EAAE,EAAE,CAAC,CAAC;gBAC7E,OAAO,EAAE,CACP,IAAI,CACF,SAAS,EACT,GAAG,EACH,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAC/C,KAAK,EACL,oCAAoC,CACrC,CACF,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;YACrD,IAAI,CAAC,KAAK,CAAC,EAAE;gBAAE,OAAO,KAAK,CAAC;YAC5B,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,aAAa,CAAC,CAAC;YAC9D,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC9C,OAAO,EAAE,CACP,IAAI,CACF,SAAS,EACT,GAAG,EACH,CAAC,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EACrF,KAAK,CACN,CACF,CAAC;QACJ,CAAC;QACD,KAAK,KAAK,CAAC;QACX,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC;YACrE,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACxE,CAAC;QACD,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC;iBAC/B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;iBAC9C,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACf,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,IAAI,EAAE,KAAK,CAAC,YAAY;gBACxB,IAAI,EAAE,KAAK,CAAC,QAAQ;gBACpB,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;aACzB,CAAC,CAAC,CAAC;YACN,OAAO,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;QAC/C,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,IAAI,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;YAC9B,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACnB,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;oBAC3C,CAAC,CAAC,MAAM,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC;oBAClD,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;gBACnB,IAAI,MAAM,KAAK,IAAI;oBAAE,OAAO,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,eAAe,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;gBACxF,IAAI,GAAG,IAAI,CAAC,MAAM,CAChB,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,QAAQ,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CACzE,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,CACP,IAAI,CACF,QAAQ,EACR,GAAG,EACH,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAC/C,KAAK,CACN,CACF,CAAC;QACJ,CAAC;QACD,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;YAChF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAY,sBAAsB,EAAE,EAAE,CAAC,CAAC;YACnE,MAAM,IAAI,GAAG;gBACX,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;gBACnD,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,GAAI,GAAc,EAAE,CAAC,CAAC;aAC/D,CAAC;YACF,OAAO,EAAE,CACP,IAAI,CACF,YAAY,EACZ,GAAG,EACH,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAC/E,KAAK,CACN,CACF,CAAC;QACJ,CAAC;QACD,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC5C,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACpB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;qBACpC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,QAAQ,CAAC;qBACnC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;oBACtB,MAAM,EAAE,GAAG;oBACX,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;iBACjD,CAAC,CAAC,CAAC;gBACN,OAAO,EAAE,CACP,IAAI,CACF,SAAS,EACT,GAAG,EACH,OAAO,EACP,KAAK,EACL,gGAAgG,CACjG,CACF,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAC/E,OAAO,EAAE,CACP,IAAI,CACF,SAAS,EACT,GAAG,EACH,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAC/C,KAAK,CACN,CACF,CAAC;QACJ,CAAC;QACD,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CACpD,CAAC,GAAG,EAAE,EAAE,CACN,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC9D,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,CAC5B,CAAC;YACF,OAAO,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;QACpD,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACnB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAC5C,IAAI,IAAI,KAAK,IAAI;oBAAE,OAAO,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,WAAW,KAAK,CAAC,QAAQ,aAAa,CAAC,CAAC,CAAC;gBAC5F,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC/B,OAAO,EAAE,CACP,IAAI,CACF,MAAM,EACN,GAAG,EACH,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,EAC3D,KAAK,EACL,4CAA4C,CAC7C,CACF,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,IAAI,CAA4C,iBAAiB,EAAE;gBACzF,OAAO,EAAE,EAAE;gBACX,OAAO,EAAE,EAAE;aACZ,CAAC,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAY,wBAAwB,EAAE,EAAE,CAAC,CAAC;YACpE,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,CAAuB,oBAAoB,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;YAC1F,MAAM,IAAI,GAAG;gBACX,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAI,GAAc,EAAE,CAAC,CAAC;gBAC1D,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAI,GAAc,EAAE,CAAC,CAAC;gBACvE,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAI,GAAc,EAAE,CAAC,CAAC;aACrE,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YAC7C,OAAO,EAAE,CACP,IAAI,CACF,MAAM,EACN,GAAG,EACH,IAAI,EACJ,KAAK,EACL,6BAA6B,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,qCAAqC,CACrG,CACF,CAAC;QACJ,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;YAChC,OAAO,EAAE,CACP,IAAI,CACF,OAAO,EACP,GAAG,EACH;gBACE,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;gBACzD,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;aAC7D,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAC5C,KAAK,CACN,CACF,CAAC;QACJ,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAiC,aAAa,EAAE,IAAI,CAAC,CAAC;YACnF,IAAI,CAAC,MAAM;gBACT,OAAO,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,gBAAgB,EAAE,+BAA+B,CAAC,CAAC,CAAC;YACtF,OAAO,EAAE,CACP,IAAI,CACF,QAAQ,EACR,GAAG,EACH,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,EACpE,KAAK,CACN,CACF,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,GAAc,EAAE,EAAU,EAAE,QAAgB;IACrE,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACzC,OAAO,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3E,CAAC"}
@@ -0,0 +1,112 @@
1
+ import { readFile, readdir, stat } from 'node:fs/promises';
2
+ import { join, resolve } from 'node:path';
3
+ import { mcError, err, ok } from '../domain/result.js';
4
+ /**
5
+ * Read-only view of a capture folder. Every accessor tolerates missing files (a skipped or failed
6
+ * collector), returning an empty value instead of throwing.
7
+ */
8
+ export class RunFolder {
9
+ dir;
10
+ manifest;
11
+ #cache = new Map();
12
+ constructor(dir, manifest) {
13
+ this.dir = dir;
14
+ this.manifest = manifest;
15
+ }
16
+ static async open(dir) {
17
+ const root = resolve(dir);
18
+ try {
19
+ const parsed = JSON.parse(await readFile(join(root, 'capture.json'), 'utf8'));
20
+ if (!isManifest(parsed)) {
21
+ return err(mcError('invalid-input', `${root} is not a multiclone capture`));
22
+ }
23
+ return ok(new RunFolder(root, parsed));
24
+ }
25
+ catch {
26
+ return err(mcError('not-found', `No capture.json in ${root}`, 'Run `multiclone capture <url>` first.'));
27
+ }
28
+ }
29
+ get id() {
30
+ return this.dir;
31
+ }
32
+ get viewports() {
33
+ return this.manifest.viewports.map((viewport) => viewport.viewport);
34
+ }
35
+ path(relative) {
36
+ return join(this.dir, relative);
37
+ }
38
+ async exists(relative) {
39
+ try {
40
+ await stat(this.path(relative));
41
+ return true;
42
+ }
43
+ catch {
44
+ return false;
45
+ }
46
+ }
47
+ async json(relative, fallback) {
48
+ if (this.#cache.has(relative))
49
+ return this.#cache.get(relative);
50
+ try {
51
+ const value = JSON.parse(await readFile(this.path(relative), 'utf8'));
52
+ this.#cache.set(relative, value);
53
+ return value;
54
+ }
55
+ catch {
56
+ return fallback;
57
+ }
58
+ }
59
+ async text(relative) {
60
+ try {
61
+ return await readFile(this.path(relative), 'utf8');
62
+ }
63
+ catch {
64
+ return null;
65
+ }
66
+ }
67
+ async list(relative) {
68
+ try {
69
+ return (await readdir(this.path(relative))).sort();
70
+ }
71
+ catch {
72
+ return [];
73
+ }
74
+ }
75
+ network() {
76
+ return this.json('network.json', []);
77
+ }
78
+ scripts() {
79
+ return this.json('scripts/index.json', []);
80
+ }
81
+ motion() {
82
+ return this.json('motion.json', []);
83
+ }
84
+ animations() {
85
+ return this.json('animations.json', []);
86
+ }
87
+ snapshot(viewport) {
88
+ return this.json(`snapshot/${viewport}.json`, null);
89
+ }
90
+ sections(viewport) {
91
+ return this.json(`sections-raw/${viewport}.json`, []);
92
+ }
93
+ interactions(viewport) {
94
+ return this.json(`interactions/${viewport}.json`, []);
95
+ }
96
+ runtime(viewport) {
97
+ return this.json(`runtime/${viewport}.json`, {});
98
+ }
99
+ storage() {
100
+ return this.json('storage.json', null);
101
+ }
102
+ fonts() {
103
+ return this.json('fonts.json', { faces: [], usage: [] });
104
+ }
105
+ }
106
+ function isManifest(value) {
107
+ return (typeof value === 'object' &&
108
+ value !== null &&
109
+ value.tool === 'multiclone' &&
110
+ Array.isArray(value.viewports));
111
+ }
112
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/store/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /** The capture result agents see first: small, with pointers into the run folder. */
2
+ export async function runSummary(run) {
3
+ const manifest = run.manifest;
4
+ const sections = await run.json('sections/index.json', []);
5
+ const fonts = await run.fonts();
6
+ const scripts = await run.scripts();
7
+ const sources = await run.json('sources/index.json', { files: [] });
8
+ const runtime = await run.runtime(run.viewports[0] ?? 'desktop');
9
+ const runtimeCounts = runtime._count ?? {};
10
+ const findings = await run.json('animations-code.json', []);
11
+ return {
12
+ run: run.dir,
13
+ url: manifest.finalUrl,
14
+ title: manifest.title,
15
+ viewports: manifest.viewports.map((viewport) => ({
16
+ name: viewport.viewport,
17
+ width: viewport.width,
18
+ height: viewport.height,
19
+ pageHeight: viewport.pageHeight,
20
+ })),
21
+ stack: manifest.stack.map((signal) => ({
22
+ label: signal.label,
23
+ kind: signal.kind,
24
+ advice: signal.advice,
25
+ })),
26
+ sections: sections.map((section) => ({
27
+ id: section.id,
28
+ label: section.label,
29
+ brief: `${section.dir}/section.md`,
30
+ counts: section.counts,
31
+ })),
32
+ counts: {
33
+ responses: manifest.network.entries,
34
+ scripts: scripts.length,
35
+ originalSources: sources.files.length,
36
+ motionTracks: (await run.motion()).length,
37
+ cssAnimations: (await run.animations()).length,
38
+ codeAnimations: findings.length,
39
+ waapi: runtimeCounts.waapi ?? 0,
40
+ shaders: runtimeCounts.shaders ?? 0,
41
+ interactions: (await run.interactions(run.viewports[0] ?? 'desktop')).length,
42
+ },
43
+ fonts: [...new Set(fonts.faces.map((face) => face.family))].sort(),
44
+ report: run.path('REPORT.md'),
45
+ warnings: manifest.warnings,
46
+ };
47
+ }
48
+ export function renderSummary(summary) {
49
+ const lines = [
50
+ `Run: ${summary.run}`,
51
+ `Page: ${summary.title || summary.url}`,
52
+ `Viewports: ${summary.viewports.map((v) => `${v.name} ${String(v.width)}×${String(v.height)} (${String(v.pageHeight)}px tall)`).join(', ')}`,
53
+ `Stack: ${summary.stack.map((signal) => signal.label).join(', ') || 'plain HTML/CSS/JS'}`,
54
+ `Fonts: ${summary.fonts.join(', ') || 'system'}`,
55
+ `Counts: ${Object.entries(summary.counts)
56
+ .map(([key, value]) => `${key} ${String(value)}`)
57
+ .join(', ')}`,
58
+ '',
59
+ `Sections (${String(summary.sections.length)}):`,
60
+ ...summary.sections.map((section) => ` ${section.id} motion ${String(section.counts.motion)}, anim ${String(section.counts.animations + section.counts.codeAnimations)}, interact ${String(section.counts.interactions)} → ${section.brief}`),
61
+ '',
62
+ `Overview: ${summary.report}`,
63
+ 'Next: read REPORT.md, then inspect facets/sections, then scaffold and build the shell before sections.',
64
+ ];
65
+ if (summary.warnings.length)
66
+ lines.push('', 'Warnings:', ...summary.warnings.map((w) => ` - ${w}`));
67
+ return lines.join('\n');
68
+ }
69
+ //# sourceMappingURL=summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary.js","sourceRoot":"","sources":["../../src/store/summary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export const VERSION = '0.2.0';
2
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC"}
package/install.sh ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env sh
2
+ # multiclone installer: puts the `multiclone` CLI on your PATH and checks Chrome.
3
+ # Download this file, read it, then run: sh install.sh
4
+ # Optional: MULTICLONE_VERSION=0.2.0 to pin a version.
5
+ set -eu
6
+
7
+ version="${MULTICLONE_VERSION:-latest}"
8
+ say() { printf '%s\n' "$*"; }
9
+ fail() { printf 'multiclone install: %s\n' "$*" >&2; exit 1; }
10
+
11
+ command -v node >/dev/null 2>&1 || fail "Node.js 22.12 or newer is required: https://nodejs.org"
12
+ node -e 'const [a,b]=process.versions.node.split(".").map(Number);process.exit(a>22||(a===22&&b>=12)?0:1)' \
13
+ || fail "Node.js 22.12 or newer is required (found $(node -v))."
14
+ command -v npm >/dev/null 2>&1 || fail "npm is required (it ships with Node.js)."
15
+
16
+ say "Installing multiclone@${version}…"
17
+ # --min-release-age=0: some setups hold back packages published in the last days.
18
+ if ! npm install -g "multiclone@${version}" --no-audit --no-fund --loglevel=error --min-release-age=0 2>/dev/null; then
19
+ npm install -g "multiclone@${version}" --no-audit --no-fund --loglevel=error \
20
+ || fail "npm install -g failed. For a permissions error, set an npm prefix you own: https://docs.npmjs.com/resolving-eacces-permissions-errors-when-installing-packages-globally"
21
+ fi
22
+
23
+ command -v multiclone >/dev/null 2>&1 \
24
+ || fail "installed, but \`multiclone\` is not on your PATH. Add \"$(npm prefix -g)/bin\" to PATH."
25
+
26
+ multiclone doctor || say "doctor found a problem above; multiclone is still installed."
27
+ say ""
28
+ say "Done. In your project folder run: multiclone setup"
29
+ say "Then ask your agent to clone a site, or run: multiclone start <url>"
package/package.json CHANGED
@@ -1,6 +1,69 @@
1
1
  {
2
2
  "name": "multiclone",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.2.0",
4
+ "description": "Clone any website from a link into a React + Vite + TypeScript project with the same design, animations and interactions. Works with Claude Code, Cursor and any MCP agent.",
5
+ "keywords": [
6
+ "clone",
7
+ "website",
8
+ "react",
9
+ "vite",
10
+ "animation",
11
+ "scroll",
12
+ "gsap",
13
+ "capture",
14
+ "mcp",
15
+ "claude-code",
16
+ "cursor",
17
+ "agent"
18
+ ],
19
+ "type": "module",
20
+ "bin": {
21
+ "multiclone": "dist/adapters/cli.js"
22
+ },
23
+ "files": [
24
+ "dist",
25
+ "templates",
26
+ "skills",
27
+ "commands",
28
+ "agents",
29
+ "README.md",
30
+ "install.sh"
31
+ ],
32
+ "engines": {
33
+ "node": ">=22.12"
34
+ },
35
+ "scripts": {
36
+ "build": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\" && tsc -p tsconfig.build.json && node scripts/chmod-bin.mjs",
37
+ "prepare": "npm run build",
38
+ "dev": "tsx src/adapters/cli.ts",
39
+ "typecheck": "tsc --noEmit",
40
+ "lint": "eslint .",
41
+ "format": "prettier --write .",
42
+ "format:check": "prettier --check .",
43
+ "test": "vitest run",
44
+ "e2e": "npm run build && node scripts/e2e.mjs",
45
+ "check": "npm run typecheck && npm run lint && npm run format:check && npm test && npm run build",
46
+ "prepublishOnly": "npm run typecheck && npm run lint && npm run build"
47
+ },
48
+ "dependencies": {
49
+ "@babel/parser": "8.0.10",
50
+ "@babel/types": "8.0.10",
51
+ "@jridgewell/trace-mapping": "0.3.31",
52
+ "@modelcontextprotocol/sdk": "1.32.2",
53
+ "pixelmatch": "8.0.0",
54
+ "pngjs": "7.0.0",
55
+ "prettier": "3.9.10",
56
+ "zod": "4.6.7"
57
+ },
58
+ "devDependencies": {
59
+ "@eslint/js": "10.0.1",
60
+ "@types/node": "26.6.6",
61
+ "@types/pngjs": "6.0.5",
62
+ "eslint": "10.14.0",
63
+ "globals": "17.13.0",
64
+ "tsx": "4.23.15",
65
+ "typescript": "6.0.3",
66
+ "typescript-eslint": "8.72.1",
67
+ "vitest": "4.1.12"
68
+ }
69
+ }