multiclone 0.1.0 → 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 (66) hide show
  1. package/README.md +31 -41
  2. package/commands/multiclone.md +5 -10
  3. package/dist/adapters/cli.js +24 -1
  4. package/dist/adapters/cli.js.map +1 -1
  5. package/dist/capture/capture.js +189 -80
  6. package/dist/capture/capture.js.map +1 -1
  7. package/dist/capture/collectors/coverage.js +20 -18
  8. package/dist/capture/collectors/coverage.js.map +1 -1
  9. package/dist/capture/collectors/index.js +11 -0
  10. package/dist/capture/collectors/index.js.map +1 -1
  11. package/dist/capture/collectors/interactions.js +129 -130
  12. package/dist/capture/collectors/interactions.js.map +1 -1
  13. package/dist/capture/collectors/motion.js +14 -9
  14. package/dist/capture/collectors/motion.js.map +1 -1
  15. package/dist/capture/collectors/probes.js +3 -2
  16. package/dist/capture/collectors/probes.js.map +1 -1
  17. package/dist/capture/collectors/shots.js +38 -18
  18. package/dist/capture/collectors/shots.js.map +1 -1
  19. package/dist/capture/context.js +5 -0
  20. package/dist/capture/context.js.map +1 -1
  21. package/dist/compare/session.js +22 -16
  22. package/dist/compare/session.js.map +1 -1
  23. package/dist/compare/shoot.js +27 -9
  24. package/dist/compare/shoot.js.map +1 -1
  25. package/dist/contracts/catalog.js +5 -0
  26. package/dist/contracts/catalog.js.map +1 -1
  27. package/dist/contracts/tools/capture.js +22 -6
  28. package/dist/contracts/tools/capture.js.map +1 -1
  29. package/dist/contracts/tools/method.js +22 -7
  30. package/dist/contracts/tools/method.js.map +1 -1
  31. package/dist/contracts/tools/session.js +195 -0
  32. package/dist/contracts/tools/session.js.map +1 -0
  33. package/dist/core/page.js +39 -18
  34. package/dist/core/page.js.map +1 -1
  35. package/dist/doctor.js +9 -0
  36. package/dist/doctor.js.map +1 -1
  37. package/dist/domain/snapshot.js +1 -1
  38. package/dist/domain/snapshot.js.map +1 -1
  39. package/dist/project/assets.js +25 -4
  40. package/dist/project/assets.js.map +1 -1
  41. package/dist/project/draft.js +860 -0
  42. package/dist/project/draft.js.map +1 -0
  43. package/dist/project/method.js +74 -6
  44. package/dist/project/method.js.map +1 -1
  45. package/dist/project/scaffold.js +23 -21
  46. package/dist/project/scaffold.js.map +1 -1
  47. package/dist/session/discover.js +53 -0
  48. package/dist/session/discover.js.map +1 -0
  49. package/dist/session/proc.js +113 -0
  50. package/dist/session/proc.js.map +1 -0
  51. package/dist/session/progress.js +83 -0
  52. package/dist/session/progress.js.map +1 -0
  53. package/dist/session/session.js +450 -0
  54. package/dist/session/session.js.map +1 -0
  55. package/dist/session/state.js +47 -0
  56. package/dist/session/state.js.map +1 -0
  57. package/dist/version.js +1 -1
  58. package/install.sh +30 -0
  59. package/package.json +5 -2
  60. package/scripts/postinstall.mjs +21 -0
  61. package/skills/multiclone/SKILL.md +40 -17
  62. package/templates/react-vite/src/app/App.tsx +6 -1
  63. package/templates/react-vite/src/app/Page.tsx +9 -2
  64. package/templates/react-vite/src/app/routes.ts +7 -0
  65. package/templates/react-vite/src/styles/draft.css +1 -0
  66. package/templates/react-vite/src/styles/index.css +1 -0
@@ -2,35 +2,55 @@ import { join } from 'node:path';
2
2
  import { sleep, writeBytes } from '../../core/files.js';
3
3
  import { log } from '../../core/log.js';
4
4
  import { spreadPositions } from '../../core/page.js';
5
- /** Full-viewport screenshots at evenly spaced (or explicit) scroll offsets. */
5
+ /** Paint time after an instant scroll; scroll-linked effects catch up within a few frames. */
6
+ const SHOT_SETTLE_MS = 450;
7
+ /**
8
+ * The full-page screenshot first (section crops come from it), then viewport screenshots at
9
+ * evenly spaced (or explicit) offsets. Scrolling jumps instead of wheeling: wheel events can
10
+ * stall for a minute on heavy WebGL pages. Any failed shot is skipped with a warning.
11
+ */
6
12
  export function shotsCollector() {
7
13
  return {
8
14
  id: 'shots',
15
+ timeLimitMs: 120_000,
9
16
  async shots(context) {
10
- const { page, viewport, settings } = context;
11
- const max = await page.maxScroll();
12
- const positions = settings.positions ?? spreadPositions(max, settings.shots);
13
- const shots = [];
14
- for (const y of positions) {
15
- await page.scrollTo(y, viewport);
16
- await sleep(1500);
17
- const file = join('shots', `${viewport.name}-${String(y)}.png`);
18
- await writeBytes(join(context.dir, file), await page.screenshot());
19
- shots.push({ y, file });
20
- context.run.output('shots', file);
21
- }
22
- context.run.shots.set(viewport.name, shots);
23
- await page.scrollTo(0, viewport);
24
- await sleep(800);
17
+ const { page, viewport, settings, stop } = context;
18
+ await page.jumpTo(0).catch(() => 0);
19
+ await sleep(300);
25
20
  try {
26
21
  const full = await page.fullPageScreenshot();
27
22
  const file = join('shots', `${viewport.name}-full.png`);
28
23
  await writeBytes(join(context.dir, file), full.png);
29
24
  context.run.output('shots', file);
30
25
  }
31
- catch {
32
- context.run.warn(`shots: full-page screenshot failed on ${viewport.name}`);
26
+ catch (error) {
27
+ context.run.warn(`shots: full-page screenshot failed on ${viewport.name}: ${error instanceof Error ? error.message : String(error)}`);
33
28
  }
29
+ const max = await page.maxScroll().catch(() => 0);
30
+ const positions = settings.positions ?? spreadPositions(max, settings.shots);
31
+ const shots = [];
32
+ let failed = 0;
33
+ for (const y of positions) {
34
+ if (stop.aborted)
35
+ break;
36
+ try {
37
+ await page.jumpTo(y);
38
+ await sleep(SHOT_SETTLE_MS);
39
+ const file = join('shots', `${viewport.name}-${String(y)}.png`);
40
+ await writeBytes(join(context.dir, file), await page.screenshot());
41
+ shots.push({ y, file });
42
+ context.run.output('shots', file);
43
+ }
44
+ catch {
45
+ failed++;
46
+ }
47
+ }
48
+ context.run.shots.set(viewport.name, shots);
49
+ if (failed)
50
+ context.run.warn(`shots: ${String(failed)} ${viewport.name} screenshots failed`);
51
+ if (shots.length < positions.length && !failed)
52
+ context.run.warn(`shots: stopped at ${String(shots.length)}/${String(positions.length)} on ${viewport.name}`);
53
+ await page.jumpTo(0).catch(() => 0);
34
54
  log(` ${String(shots.length)} screenshots`);
35
55
  },
36
56
  };
@@ -1 +1 @@
1
- {"version":3,"file":"shots.js","sourceRoot":"","sources":["../../../src/capture/collectors/shots.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGrD,+EAA+E;AAC/E,MAAM,UAAU,cAAc;IAC5B,OAAO;QACL,EAAE,EAAE,OAAO;QACX,KAAK,CAAC,KAAK,CAAC,OAAO;YACjB,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;YAC7C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YACnC,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,IAAI,eAAe,CAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC7E,MAAM,KAAK,GAAkC,EAAE,CAAC;YAChD,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;gBAC1B,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;gBACjC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;gBAClB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;gBAChE,MAAM,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;gBACnE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACpC,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC5C,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YACjC,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;YACjB,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,IAAI,WAAW,CAAC,CAAC;gBACxD,MAAM,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;gBACpD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACpC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,yCAAyC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;YAC7E,CAAC;YACD,GAAG,CAAC,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QACjD,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"shots.js","sourceRoot":"","sources":["../../../src/capture/collectors/shots.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,10 @@
1
1
  /** Facts collectors publish for later collectors, the manifest and the report. */
2
2
  export class CaptureRun {
3
+ secondary;
4
+ /** A side browser capturing extra viewports: run-wide facts belong to the main run. */
5
+ constructor(secondary = false) {
6
+ this.secondary = secondary;
7
+ }
3
8
  /** Sources every new document (root and attached iframes) must run before page code. */
4
9
  initScripts = [];
5
10
  sessionInitializers = [];
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/capture/context.ts"],"names":[],"mappings":"AAmCA,kFAAkF;AAClF,MAAM,OAAO,UAAU;IACrB,wFAAwF;IAC/E,WAAW,GAAa,EAAE,CAAC;IAC3B,mBAAmB,GAAyB,EAAE,CAAC;IAC/C,QAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC;IACnD,QAAQ,GAAG,EAAE,CAAC;IACd,QAAQ,GAAG,EAAE,CAAC;IACd,WAAW,GAA2B,IAAI,CAAC;IAClC,UAAU,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC9C,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,KAAK,GAAG,IAAI,GAAG,EAAyC,CAAC;IACzD,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IACjC,UAAU,GAAgB,EAAE,CAAC;IACtC,OAAO,GAAmB,EAAE,CAAC;IAC7B,MAAM,GAAkB,EAAE,CAAC;IAClB,OAAO,GAAmB,EAAE,CAAC;IACtC,+FAA+F;IACtF,UAAU,GAAG,IAAI,GAAG,EAA2C,CAAC;IACzE,+EAA+E;IACtE,QAAQ,GAAG,IAAI,GAAG,EAAkC,CAAC;IAC9D,oFAAoF;IAC3E,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAC;IACtC,QAAQ,GAAa,EAAE,CAAC;IAEjC,MAAM,CAAC,SAAiB,EAAE,IAAY;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,CAAC,OAAe;QAClB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;CACF;AAyCD,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,gBAAgB,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,CAAU,CAAC"}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/capture/context.ts"],"names":[],"mappings":"AAmCA,kFAAkF;AAClF,MAAM,OAAO,UAAU;IAEA;IADrB,uFAAuF;IACvF,YAAqB,YAAY,KAAK;QAAjB,cAAS,GAAT,SAAS,CAAQ;IAAG,CAAC;IAE1C,wFAAwF;IAC/E,WAAW,GAAa,EAAE,CAAC;IAC3B,mBAAmB,GAAyB,EAAE,CAAC;IAC/C,QAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC;IACnD,QAAQ,GAAG,EAAE,CAAC;IACd,QAAQ,GAAG,EAAE,CAAC;IACd,WAAW,GAA2B,IAAI,CAAC;IAClC,UAAU,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC9C,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,KAAK,GAAG,IAAI,GAAG,EAAyC,CAAC;IACzD,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IACjC,UAAU,GAAgB,EAAE,CAAC;IACtC,OAAO,GAAmB,EAAE,CAAC;IAC7B,MAAM,GAAkB,EAAE,CAAC;IAClB,OAAO,GAAmB,EAAE,CAAC;IACtC,+FAA+F;IACtF,UAAU,GAAG,IAAI,GAAG,EAA2C,CAAC;IACzE,+EAA+E;IACtE,QAAQ,GAAG,IAAI,GAAG,EAAkC,CAAC;IAC9D,oFAAoF;IAC3E,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAC;IACtC,QAAQ,GAAa,EAAE,CAAC;IAEjC,MAAM,CAAC,SAAiB,EAAE,IAAY;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,CAAC,OAAe;QAClB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;CACF;AA2CD,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,gBAAgB,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,CAAU,CAAC"}
@@ -43,9 +43,9 @@ export async function runSession(request) {
43
43
  if (!request.intro)
44
44
  await page.goto(request.url, 0);
45
45
  await page.settle(request.settleMs, request.signal);
46
- await page.autoScroll(request.viewport);
47
- await page.scrollTo(0, request.viewport);
48
- await sleep(800);
46
+ await page.autoScroll(request.viewport, 30_000);
47
+ await page.jumpTo(0);
48
+ await sleep(500);
49
49
  const structure = await page.runWith(structureForCompare, request.knownSections);
50
50
  const maxScroll = await page.maxScroll();
51
51
  const tracks = {};
@@ -58,10 +58,15 @@ export async function runSession(request) {
58
58
  path: track.path,
59
59
  props: track.props,
60
60
  }));
61
+ const deadline = Date.now() + 90_000;
61
62
  for (const y of offsets) {
62
- await page.scrollTo(y, request.viewport);
63
+ if (Date.now() > deadline)
64
+ break;
65
+ await page.scrollTo(y, request.viewport, 6_000);
63
66
  await sleep(250);
64
- const values = await page.run(sampleTracks, { tracks: wanted, clone: request.clone });
67
+ const values = await page
68
+ .run(sampleTracks, { tracks: wanted, clone: request.clone })
69
+ .catch(() => ({}));
65
70
  for (const [id, props] of Object.entries(values)) {
66
71
  const track = (tracks[id] ??= {});
67
72
  for (const [prop, value] of Object.entries(props))
@@ -72,12 +77,17 @@ export async function runSession(request) {
72
77
  const frames = [];
73
78
  for (const offset of request.offsets) {
74
79
  const y = request.relative ? Math.round(offset * maxScroll) : offset;
75
- const actualY = await page.scrollTo(y, request.viewport);
76
- await sleep(1200);
77
- frames.push({ y, actualY, png: await page.screenshot() });
80
+ const actualY = await page.scrollTo(y, request.viewport, 10_000);
81
+ await sleep(900);
82
+ const png = await page.screenshot().catch(() => null);
83
+ if (png)
84
+ frames.push({ y, actualY, png });
78
85
  }
79
86
  const hovers = {};
87
+ const hoverDeadline = Date.now() + 60_000;
80
88
  for (const hover of request.hovers.slice(0, 40)) {
89
+ if (Date.now() > hoverDeadline)
90
+ break;
81
91
  const rest = await page.run(readStates, {
82
92
  selector: hover.selector,
83
93
  props: [...STATE_PROPS],
@@ -89,24 +99,20 @@ export async function runSession(request) {
89
99
  if (!rect)
90
100
  continue;
91
101
  await sleep(300);
92
- await browser.cdp.send('Input.dispatchMouseEvent', {
93
- type: 'mouseMoved',
94
- x: rect.x + rect.w / 2,
95
- y: rect.y + rect.h / 2,
96
- });
102
+ await page.pointer(rect.x + rect.w / 2, rect.y + rect.h / 2);
97
103
  await sleep(600);
98
104
  const active = await page.run(readStates, {
99
105
  selector: hover.selector,
100
106
  props: [...STATE_PROPS],
101
107
  maxDescendants: 30,
102
108
  });
103
- await browser.cdp.send('Input.dispatchMouseEvent', { type: 'mouseMoved', x: 1, y: 1 });
109
+ await page.pointer(1, 1);
104
110
  await sleep(300);
105
111
  if (active)
106
112
  hovers[hover.key] = diffStates(rest, active);
107
113
  }
108
- await page.scrollTo(0, request.viewport);
109
- await sleep(800);
114
+ await page.jumpTo(0).catch(() => 0);
115
+ await sleep(500);
110
116
  let full = null;
111
117
  try {
112
118
  full = (await page.fullPageScreenshot()).png;
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/compare/session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/compare/session.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,11 @@ import { launchBrowser } from '../core/chrome.js';
3
3
  import { sleep, writeBytes } from '../core/files.js';
4
4
  import { log } from '../core/log.js';
5
5
  import { Page, spreadPositions } from '../core/page.js';
6
- /** Screenshots a page at fixed scroll offsets per viewport, scrolling like a real visitor. */
6
+ /**
7
+ * Screenshots a page at fixed scroll offsets per viewport, scrolling like a real visitor. Never
8
+ * fails as a whole once the page opened: a slow load, a stuck scroll or a failed shot becomes a
9
+ * warning and the run returns whatever it got.
10
+ */
7
11
  export async function shoot(options) {
8
12
  const browser = await launchBrowser();
9
13
  const sets = [];
@@ -12,28 +16,42 @@ export async function shoot(options) {
12
16
  await page.init();
13
17
  for (const viewport of options.viewports) {
14
18
  log(` shoot ${options.url} @ ${viewport.name}`);
19
+ const warnings = [];
15
20
  await page.setViewport(viewport);
16
- await page.goto(options.url, options.settleMs ?? 5000);
17
- const maxScroll = await page.maxScroll();
18
- const pageHeight = await page.pageHeight();
21
+ const { loaded } = await page.goto(options.url, 0);
22
+ if (!loaded)
23
+ warnings.push(`${viewport.name}: page did not finish loading in 30s; shot anyway`);
24
+ await page.settle(options.settleMs ?? 5000);
25
+ const maxScroll = await page.maxScroll().catch(() => 0);
26
+ const pageHeight = await page.pageHeight().catch(() => 0);
19
27
  const raw = options.positions ?? spreadPositions(maxScroll, options.count ?? 6);
20
28
  const positions = options.relative ? raw.map((p) => Math.round(p * maxScroll)) : raw;
21
29
  const shots = [];
22
30
  const probes = [];
23
31
  for (const y of positions) {
24
- const actualY = await page.scrollTo(y, viewport);
25
- await sleep(1500);
32
+ const actualY = await page.scrollTo(y, viewport, 10_000).catch(() => {
33
+ warnings.push(`${viewport.name}: scroll to ${String(y)} failed`);
34
+ return -1;
35
+ });
36
+ await sleep(700);
26
37
  if (options.probe) {
27
- probes.push({ y, value: await page.evaluate(options.probe) });
38
+ const value = await page.evaluate(options.probe).catch((error) => ({
39
+ error: error instanceof Error ? error.message : String(error),
40
+ }));
41
+ probes.push({ y, value });
42
+ }
43
+ const png = await page.screenshot().catch(() => null);
44
+ if (!png) {
45
+ warnings.push(`${viewport.name}: screenshot at ${String(y)} failed`);
46
+ continue;
28
47
  }
29
- const png = await page.screenshot();
30
48
  shots.push({ y, actualY, png });
31
49
  if (options.out) {
32
50
  const name = `${options.prefix ?? 'shot'}-${viewport.name}-${y}.png`;
33
51
  await writeBytes(join(resolve(options.out), name), png);
34
52
  }
35
53
  }
36
- sets.push({ url: options.url, viewport, pageHeight, maxScroll, shots, probes });
54
+ sets.push({ url: options.url, viewport, pageHeight, maxScroll, shots, probes, warnings });
37
55
  }
38
56
  }
39
57
  finally {
@@ -1 +1 @@
1
- {"version":3,"file":"shoot.js","sourceRoot":"","sources":["../../src/compare/shoot.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shoot.js","sourceRoot":"","sources":["../../src/compare/shoot.ts"],"names":[],"mappings":"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"}
@@ -6,16 +6,21 @@ import { inspectTool } from './tools/inspect.js';
6
6
  import { guideTool, setupTool } from './tools/method.js';
7
7
  import { serveMirrorTool, stopMirrorTool } from './tools/mirror.js';
8
8
  import { assetsTool, scaffoldTool } from './tools/project.js';
9
+ import { draftTool, startTool, statusTool, stopTool } from './tools/session.js';
9
10
  /** Every public tool, in the order shown in help and MCP listings. */
10
11
  export const CATALOG = [
11
12
  guideTool,
12
13
  setupTool,
14
+ startTool,
15
+ statusTool,
16
+ stopTool,
13
17
  captureTool,
14
18
  analyzeTool,
15
19
  inspectTool,
16
20
  serveMirrorTool,
17
21
  stopMirrorTool,
18
22
  scaffoldTool,
23
+ draftTool,
19
24
  assetsTool,
20
25
  shootTool,
21
26
  compareTool,
@@ -1 +1 @@
1
- {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/contracts/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAG9D,sEAAsE;AACtE,MAAM,CAAC,MAAM,OAAO,GAA2B;IAC7C,SAAS;IACT,SAAS;IACT,WAAW;IACX,WAAW;IACX,WAAW;IACX,eAAe;IACf,cAAc;IACd,YAAY;IACZ,UAAU;IACV,SAAS;IACT,WAAW;IACX,UAAU;CACX,CAAC"}
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/contracts/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAGhF,sEAAsE;AACtE,MAAM,CAAC,MAAM,OAAO,GAA2B;IAC7C,SAAS;IACT,SAAS;IACT,SAAS;IACT,UAAU;IACV,QAAQ;IACR,WAAW;IACX,WAAW;IACX,WAAW;IACX,eAAe;IACf,cAAc;IACd,YAAY;IACZ,SAAS;IACT,UAAU;IACV,SAAS;IACT,WAAW;IACX,UAAU;CACX,CAAC"}
@@ -9,15 +9,29 @@ import { positionsField, settleField, viewportsField } from '../fields.js';
9
9
  export const captureTool = defineTool({
10
10
  name: 'capture',
11
11
  title: 'Capture a website',
12
- description: 'Record a live page with Chrome: network, every frame, scripts and source maps, styled DOM snapshot, runtime animation data (GSAP/ScrollTrigger, WAAPI, WebGL shaders), intro filmstrip, scroll motion, hover/click states and fonts, then split it into per-section bundles. Returns a short summary (run id = folder, stack, sections, counts); page through details with `inspect`. Takes 2–8 minutes.',
12
+ description: 'Record a live page with Chrome: network, every frame, scripts and source maps, styled DOM snapshot, runtime animation data (GSAP/ScrollTrigger, WAAPI, WebGL shaders), intro filmstrip, scroll motion, hover/click states and fonts, then split it into per-section bundles. depth=quick (1–2 min) records what a first draft needs; depth=full (default, 3–8 min) adds motion, hovers, clicks, coverage and source maps. Prefer `start`, which does quick + draft + live link + deep pass for you. Returns a short summary; page through details with `inspect`.',
13
13
  input: z.object({
14
14
  url: z.url().describe('Page to clone.'),
15
15
  out: z.string().optional().describe('Output folder; default multiclone-captures/<site>.'),
16
16
  viewports: viewportsField,
17
17
  positions: positionsField,
18
- shots: z.number().int().min(1).max(40).default(8).describe('Evenly spaced screenshots.'),
18
+ depth: z
19
+ .enum(['quick', 'full'])
20
+ .default('full')
21
+ .describe('quick: draft essentials in 1–2 min. full: everything.'),
22
+ shots: z
23
+ .number()
24
+ .int()
25
+ .min(1)
26
+ .max(40)
27
+ .optional()
28
+ .describe('Evenly spaced screenshots (default 4 quick, 8 full).'),
19
29
  settleMs: settleField,
20
- motion: z.boolean().default(true).describe('Sample scroll-linked motion.'),
30
+ motion: z.boolean().optional().describe('Sample scroll-linked motion (default: full only).'),
31
+ parallel: z
32
+ .boolean()
33
+ .optional()
34
+ .describe('Capture extra viewports in a second browser at the same time (default: quick).'),
21
35
  headed: z.boolean().default(false).describe('Show the browser window (helps with bot checks).'),
22
36
  skip: z
23
37
  .array(z.string())
@@ -46,9 +60,11 @@ export const captureTool = defineTool({
46
60
  viewports: parseViewports(input.viewports),
47
61
  autoViewports: wantsAutoViewports(input.viewports),
48
62
  positions: input.positions ?? null,
49
- shots: input.shots,
50
- settleMs: input.settleMs ?? 5000,
51
- motion: input.motion,
63
+ depth: input.depth,
64
+ ...(input.shots === undefined ? {} : { shots: input.shots }),
65
+ ...(input.settleMs === undefined ? {} : { settleMs: input.settleMs }),
66
+ ...(input.motion === undefined ? {} : { motion: input.motion }),
67
+ ...(input.parallel === undefined ? {} : { parallel: input.parallel }),
52
68
  headless: !input.headed,
53
69
  ...(input.profile === undefined ? {} : { profile: input.profile }),
54
70
  signal: context.signal,
@@ -1 +1 @@
1
- {"version":3,"file":"capture.js","sourceRoot":"","sources":["../../../src/contracts/tools/capture.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"capture.js","sourceRoot":"","sources":["../../../src/contracts/tools/capture.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { z } from 'zod';
2
2
  import { ok } from '../../domain/result.js';
3
- import { AGENTS, MCP_ENTRY, readGuide, setupProject, TOPICS } from '../../project/method.js';
3
+ import { AGENTS, MCP_ENTRY, readGuide, setupGlobal, setupProject, TOPICS, } from '../../project/method.js';
4
4
  import { defineTool } from '../types.js';
5
5
  export const guideTool = defineTool({
6
6
  name: 'guide',
@@ -20,19 +20,31 @@ export const guideTool = defineTool({
20
20
  export const setupTool = defineTool({
21
21
  name: 'setup',
22
22
  title: 'Install multiclone into a project',
23
- description: 'Install the cloning method and the multiclone MCP server entry into a project folder: claude (.claude/skills, agents, commands and .mcp.json), cursor (.cursor/rules and .cursor/mcp.json) and agents (.multiclone/GUIDE.md plus a block in AGENTS.md, for any agent that reads AGENTS.md). Method files are refreshed on every run; existing MCP configs are merged.',
23
+ description: 'Install the cloning method into a project folder so the agent knows how to use the multiclone CLI: claude (.claude/skills, agents and the /multiclone command), cursor (.cursor/rules) and agents (.multiclone/GUIDE.md plus a block in AGENTS.md). With mcp it also registers the MCP server (.mcp.json, .cursor/mcp.json); the CLI works without it. Method files are refreshed on every run; existing MCP configs are merged.',
24
24
  input: z.object({
25
25
  dir: z.string().default('.').describe('Project folder (default: the current folder).'),
26
26
  agents: z
27
27
  .array(z.enum(AGENTS))
28
28
  .default([...AGENTS])
29
29
  .describe('Which agents to set up: claude, cursor, agents (default all).'),
30
+ mcp: z.boolean().default(false).describe('Also register the MCP server (optional).'),
31
+ global: z
32
+ .boolean()
33
+ .default(false)
34
+ .describe('Install for every folder on this machine instead (Claude Code, Codex, Gemini CLI, ~/.multiclone). Installing the package does this already.'),
30
35
  }),
31
36
  cli: { command: 'setup', positionals: ['dir'] },
32
37
  readOnly: false,
33
38
  openWorld: false,
34
39
  run: async (input) => {
35
- const result = await setupProject({ dir: input.dir, agents: input.agents });
40
+ if (input.global) {
41
+ const global = await setupGlobal();
42
+ if (!global.ok)
43
+ return global;
44
+ const text = `Installed multiclone for every folder on this machine: ${global.value.agents.join(', ')} (${String(global.value.written.length)} files). Cursor reads project rules only: run \`multiclone setup\` in a folder to add one.`;
45
+ return ok({ data: global.value, text });
46
+ }
47
+ const result = await setupProject({ dir: input.dir, agents: input.agents, mcp: input.mcp });
36
48
  if (!result.ok)
37
49
  return result;
38
50
  const { dir, agents, written, skipped } = result.value;
@@ -42,14 +54,17 @@ export const setupTool = defineTool({
42
54
  ...skipped.map((file) => `Left ${file} alone: it is not valid JSON. Add this by hand: ${entry}`),
43
55
  '',
44
56
  'Next:',
45
- ' npx multiclone doctor check Chrome and WebGL',
57
+ ' multiclone doctor check Chrome and WebGL',
46
58
  ];
47
59
  if (agents.includes('claude'))
48
- lines.push(' Claude Code: start `claude` here, approve the multiclone MCP server, then run /multiclone <url>.');
60
+ lines.push(' Claude Code: start `claude` here and run /multiclone <url>.');
49
61
  if (agents.includes('cursor'))
50
- lines.push(' Cursor: open this folder, enable multiclone under Settings → MCP, then ask the agent to clone <url>.');
62
+ lines.push(' Cursor: open this folder and ask the agent to clone <url>.');
51
63
  if (agents.includes('agents'))
52
- lines.push(` Other agents: add this MCP server in their settings: ${entry}`, ' then ask the agent to clone <url> (it reads AGENTS.md).');
64
+ lines.push(' Other agents: ask the agent to clone <url> (it reads AGENTS.md).');
65
+ lines.push(input.mcp
66
+ ? ' MCP server registered; agents can use the CLI or the MCP tools.'
67
+ : ' Agents drive the `multiclone` CLI. Add --mcp to also register the MCP server.');
53
68
  return ok({ data: result.value, text: lines.join('\n') });
54
69
  },
55
70
  });
@@ -1 +1 @@
1
- {"version":3,"file":"method.js","sourceRoot":"","sources":["../../../src/contracts/tools/method.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"method.js","sourceRoot":"","sources":["../../../src/contracts/tools/method.ts"],"names":[],"mappings":"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"}