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
package/README.md CHANGED
@@ -6,39 +6,24 @@ It runs on your own machine: your Chrome, your CPU and your Claude Code. Nothing
6
6
 
7
7
  ## Quick start
8
8
 
9
- You need Node 22.12 or newer and Google Chrome (Chromium, Edge or Brave also work). Nothing to clone or build: npm downloads it ready to run.
9
+ You need Node 22.12 or newer and Google Chrome (Chromium, Edge or Brave also work).
10
10
 
11
- In the folder where you want the clone:
11
+ 1. Install once: `npm i -g multiclone` (or download `install.sh` from this repo, read it, and run `sh install.sh`; it also checks Chrome). That's all the setup: it also installs the Claude Code skill, the `/multiclone` command and the section-builder agent for every folder, adds a block to Codex's and Gemini CLI's global instructions when they're installed, and puts the guide in `~/.multiclone`.
12
+ 2. Open your agent in any folder and ask: "clone https://example.com" (or `/multiclone https://example.com` in Claude Code). Or run it yourself: `multiclone start https://example.com`.
12
13
 
13
- 1. `npx multiclone setup` installs the cloning method and the MCP server for Claude Code, Cursor and any agent that reads `AGENTS.md`. Limit it with `--agents claude`, `--agents cursor` or `--agents agents`.
14
- 2. `npx multiclone doctor` checks Chrome and WebGL.
15
- 3. Open your agent in that folder and ask it: "clone https://example.com".
14
+ Cursor only reads project rules, so for Cursor run `multiclone setup` once in the project folder. Add `--mcp` there if you also want the MCP server; the CLI works without it.
16
15
 
17
- ### Claude Code
18
-
19
- - After `setup`, start `claude` in the folder and approve the multiclone server when asked. Then type `/multiclone https://example.com` or just ask for a clone.
20
- - To have it in every project instead: `claude mcp add --scope user multiclone -- npx -y multiclone mcp`. The server tells the agent how to use it, and the `guide` tool holds the full method.
21
-
22
- ### Cursor
23
-
24
- - After `setup`, open the folder and turn on multiclone under Settings → MCP. The method lives in `.cursor/rules/multiclone.mdc`.
25
- - Or add it for every project in `~/.cursor/mcp.json`: `{ "mcpServers": { "multiclone": { "command": "npx", "args": ["-y", "multiclone", "mcp"] } } }`.
26
-
27
- ### Any other agent (GG Coder, Codex, Windsurf, Cline and others)
28
-
29
- - Add an MCP server with the command `npx -y multiclone mcp` in the agent's settings.
30
- - `setup` also writes `.multiclone/GUIDE.md` and a short block in `AGENTS.md` so the agent finds the method.
31
- - No MCP support? The agent can run every tool from the terminal: `npx multiclone --help` lists them and `npx multiclone guide` prints the method.
16
+ No global install? Put `npx` in front of every command.
32
17
 
33
18
  ## Use it
34
19
 
35
- Ask your agent to clone a URL. It then:
20
+ 1. The agent asks one question: the landing page only, specific pages, or the whole site.
21
+ 2. `multiclone start <url> --scope …` returns in seconds with a **progress link** (for example `http://127.0.0.1:4300/`). Open it: it shows each step live, then the clone itself.
22
+ 3. In about 2–3 minutes the first draft is live: a quick capture (desktop and mobile at the same time), a React project with the real fonts, colours and media, and one component per section with the real text, links, images and video. The clone runs on localhost next to an offline copy of the original.
23
+ 4. While the agent polishes the draft, multiclone captures the other pages and a deep pass (scroll motion, hovers, clicks, the code that animates) in the background. `multiclone status` shows where it is.
24
+ 5. The agent compares the clone with the original per section, motion track and hover, fixes the worst first, and finishes with a localhost link and a score.
36
25
 
37
- 1. **Captures** the page on desktop and mobile and analyses it into one bundle per section.
38
- 2. **Reads** `REPORT.md` and the section briefs: stack, tokens, fonts, motion, animation code, hover states.
39
- 3. **Scaffolds** a React project with the captured fonts, design tokens, media and a mock API.
40
- 4. **Rebuilds** it section by section (the `section-builder` agent can take independent sections).
41
- 5. **Compares** the clone with the capture per section, motion track and hover, fixes the worst first, and finishes with a localhost link and a score.
26
+ Run `start` again after a crash or restart: finished captures are reused and drafted pages are never overwritten. `multiclone stop` ends the servers; the files stay.
42
27
 
43
28
  ## What's inside
44
29
 
@@ -59,21 +44,26 @@ Ask your agent to clone a URL. It then:
59
44
 
60
45
  ## CLI
61
46
 
62
- Everything also works from the terminal (`npx multiclone <command>`, or `multiclone <command>` after `npm i -g multiclone`). Flags are the tool fields in kebab case; `multiclone <command> --help` lists them.
63
-
64
- | Command | What it does |
65
- | ---------------------------------------------------------------------------------------------------- | -------------------------------- |
66
- | `multiclone setup [dir] [--agents claude,cursor,agents]` | Install the method and MCP entry |
67
- | `multiclone guide [topic]` | Print the method |
68
- | `multiclone capture <url> [--out dir] [--viewports desktop,mobile\|auto] [--headed] [--profile dir]` | Record and analyse the page |
69
- | `multiclone analyze <capture-dir>` | Rebuild the derived files |
70
- | `multiclone inspect <capture-dir> section [03-pricing]` | Page through a capture |
71
- | `multiclone serve <capture-dir> [--port 4400] [--mode live\|snapshot]` | Offline mirror and mock API |
72
- | `multiclone scaffold <dir> [--capture capture-dir] [--port 5180]` | New React project |
73
- | `multiclone assets <capture-dir> <project-dir>` | Copy media in |
74
- | `multiclone shoot <url> [--positions 0,900] [--probe js]` | Screenshots and measurements |
75
- | `multiclone compare <capture-dir\|url> <clone-url> [--intro] [--positions]` | Score the clone |
76
- | `multiclone doctor` | Check the setup |
47
+ `multiclone <command>` (or `npx multiclone <command>`). Flags are the tool fields in kebab case; `multiclone <command> --help` lists them.
48
+
49
+ | Command | What it does |
50
+ | ---------------------------------------------------------------------------------------------- | ------------------------------------------ |
51
+ | `multiclone start <url> [--scope landing\|pages\|site] [--pages /a,/b] [--dir folder]` | Capture, draft and serve in the background |
52
+ | `multiclone status [dir] [--wait draft\|pages\|deep]` | Where the session is, with its links |
53
+ | `multiclone stop [dir]` | Stop the session's servers |
54
+ | `multiclone setup [dir] [--agents claude,cursor,agents] [--mcp] [--global]` | Teach your agent the method |
55
+ | `multiclone guide [topic]` | Print the method |
56
+ | `multiclone capture <url> [--depth quick\|full] [--viewports desktop,mobile\|auto] [--headed]` | Record and analyse the page |
57
+ | `multiclone draft <capture-dir> <project-dir> [--route /pricing]` | Write section components from a capture |
58
+ | `multiclone analyze <capture-dir>` | Rebuild the derived files |
59
+ | `multiclone inspect <capture-dir> section [03-pricing]` | Page through a capture |
60
+ | `multiclone serve <capture-dir> [--port 4400] [--mode live\|snapshot]` | Offline mirror and mock API |
61
+ | `multiclone scaffold <dir> [--capture capture-dir] [--port 5180]` | New React project |
62
+ | `multiclone assets <capture-dir> <project-dir>` | Copy media in |
63
+ | `multiclone shoot <url> [--positions 0,900] [--probe js]` | Screenshots and measurements |
64
+ | `multiclone compare <capture-dir\|url> <clone-url> [--intro] [--positions]` | Score the clone |
65
+ | `multiclone doctor` | Check the setup |
66
+ | `multiclone mcp` | Optional MCP server with the same tools |
77
67
 
78
68
  Add `--json` for machine-readable output. Set `MULTICLONE_CHROME` to use a specific browser.
79
69
 
@@ -5,16 +5,11 @@ argument-hint: <url> [project folder]
5
5
 
6
6
  Clone this website with the multiclone method: $ARGUMENTS
7
7
 
8
- Follow the `multiclone` skill end to end:
8
+ 1. Ask the user one short question first: clone just the landing page, specific pages (which ones), or the whole site?
9
+ 2. Run `multiclone start <url> --scope <answer>` (add `--pages /a,/b` for specific pages, `--dir <folder>` if a project folder was given). Give the user the progress link it prints right away.
10
+ 3. Run `multiclone status --wait draft`. When the first draft is live, give the user the clone link.
11
+ 4. Follow the `multiclone` skill (or `multiclone guide`) to polish the draft section by section, then compare and fix.
9
12
 
10
- 1. Capture (it analyses into section bundles too)
11
- 2. Understand: `REPORT.md`, then each `sections/<id>/section.md`
12
- 3. Scaffold from the capture (fonts, tokens, media, mock API)
13
- 4. Rebuild section by section with the `data-mc-*` markers; use the `section-builder` agent for independent sections
14
- 5. Compare against the capture folder and fix
15
-
16
- If no project folder is given, use `./<site-name>-clone` in the current directory, with the capture in `./<site-name>-capture`.
17
-
18
- If the multiclone MCP tools are not available, run the same tools from the terminal with `npx multiclone <command>` and tell the user to add the server with `claude mcp add multiclone -- npx -y multiclone mcp`, then restart.
13
+ If `multiclone` isn't on the PATH, use `npx -y multiclone` instead. The result must be the React + Vite project with one component per section; never hand over a downloaded copy of the original site as the clone. If multiclone can't run, say what failed and stop.
19
14
 
20
15
  Keep progress updates short and in plain words. Finish with the localhost link, the final compare score, and an honest list of what is approximated.
@@ -36,7 +36,7 @@ function usage(tool) {
36
36
  }
37
37
  function help() {
38
38
  const tools = CATALOG.filter((tool) => tool.cli !== null).map(usage);
39
- return `multiclone ${VERSION} — clone any website from a link\n\nStart: multiclone setup, then ask your agent to clone a URL. Read the method: multiclone guide.\n\nUsage\n${tools.join('\n')}\n multiclone mcp\n Run the MCP server (for Claude Code, Cursor or any MCP agent)\n\nGlobal\n${GLOBAL_HELP}\n`;
39
+ return `multiclone ${VERSION} — clone any website from a link\n\nStart: multiclone start <url> --scope landing|pages|site (prints a live progress link), then multiclone status --wait draft. Read the method: multiclone guide.\n\nUsage\n${tools.join('\n')}\n multiclone mcp\n Run the MCP server (for Claude Code, Cursor or any MCP agent)\n\nGlobal\n${GLOBAL_HELP}\n`;
40
40
  }
41
41
  function fail(message) {
42
42
  process.stderr.write(`multiclone: ${message}\n`);
@@ -94,6 +94,18 @@ async function runTool(tool, argv) {
94
94
  if (binding.longRunning)
95
95
  process.stderr.write('Running. Ctrl+C to stop.\n');
96
96
  }
97
+ /** Installs the agent method on first run when the npm install hook was skipped. */
98
+ async function ensureGlobalSetup() {
99
+ if (process.env.MULTICLONE_NO_GLOBAL_SETUP === '1')
100
+ return;
101
+ const { globalSetupCurrent, setupGlobal } = await import('../project/method.js');
102
+ if (globalSetupCurrent())
103
+ return;
104
+ const result = await setupGlobal().catch(() => null);
105
+ if (result?.ok === true) {
106
+ process.stderr.write(`multiclone: installed the cloning method for ${result.value.agents.join(', ')}.\n`);
107
+ }
108
+ }
97
109
  async function main() {
98
110
  const [command, ...rest] = process.argv.slice(2);
99
111
  if (command === '--version' || command === '-v')
@@ -101,8 +113,18 @@ async function main() {
101
113
  if (command === undefined || command === 'help' || command === '--help' || command === '-h') {
102
114
  return void process.stdout.write(help());
103
115
  }
116
+ if (command === '__session') {
117
+ // Background process behind `multiclone start`; not a public command.
118
+ const { runSessionDaemon } = await import('../session/session.js');
119
+ const workspace = rest[0];
120
+ if (workspace === undefined)
121
+ fail('__session needs a workspace');
122
+ await runSessionDaemon(workspace);
123
+ return;
124
+ }
104
125
  if (command === 'mcp') {
105
126
  setQuiet(true);
127
+ await ensureGlobalSetup();
106
128
  const { runMcpServer } = await import('./mcp.js');
107
129
  await runMcpServer();
108
130
  return;
@@ -110,6 +132,7 @@ async function main() {
110
132
  const tool = CATALOG.find((entry) => entry.cli?.command === command);
111
133
  if (!tool)
112
134
  fail(`unknown command "${command}"\n\n${help()}`);
135
+ await ensureGlobalSetup();
113
136
  await runTool(tool, rest);
114
137
  }
115
138
  main().catch((error) => {
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/adapters/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/adapters/cli.ts"],"names":[],"mappings":"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"}
@@ -10,99 +10,91 @@ import { detectStack } from '../domain/stack.js';
10
10
  import { extractBreakpoints, majorBreakpoints } from '../domain/breakpoints.js';
11
11
  import { breakpointViewports, DESKTOP } from '../domain/viewports.js';
12
12
  import { VERSION } from '../version.js';
13
- import { defaultCollectors } from './collectors/index.js';
13
+ import { defaultCollectors, viewportOnlyCollectors } from './collectors/index.js';
14
14
  import { CaptureRun, } from './context.js';
15
15
  import { renderReport } from './report.js';
16
+ /** Collectors a quick capture leaves for the deep pass. */
17
+ export const QUICK_SKIP = [
18
+ 'intro',
19
+ 'listeners',
20
+ 'motion',
21
+ 'coverage',
22
+ 'interactions',
23
+ 'a11y',
24
+ 'sourcemaps',
25
+ ];
16
26
  const DEFAULT_TIME_LIMIT_MS = 120_000;
17
27
  /** Runs every collector per viewport and writes the run folder. */
18
28
  export async function capture(options) {
19
29
  const url = new URL(options.url).toString();
20
30
  const dir = resolve(options.out ?? join('multiclone-captures', slugForUrl(url)));
31
+ const quick = options.depth === 'quick';
21
32
  const viewports = [...(options.viewports ?? [DESKTOP])];
22
33
  const first = viewports[0];
34
+ const disabled = new Set([...(options.skip ?? []), ...(quick ? QUICK_SKIP : [])]);
23
35
  const settings = {
24
36
  url,
25
37
  viewports,
26
38
  positions: options.positions ?? null,
27
- shots: options.shots ?? 8,
28
- settleMs: options.settleMs ?? 5000,
29
- motion: options.motion ?? true,
30
- disabled: new Set(options.skip ?? []),
31
- deepViewports: new Set(options.deepViewports ?? (first ? [first.name] : [])),
39
+ shots: options.shots ?? (quick ? 4 : 8),
40
+ settleMs: options.settleMs ?? (quick ? 2500 : 5000),
41
+ motion: options.motion ?? !quick,
42
+ disabled,
43
+ deepViewports: quick
44
+ ? new Set()
45
+ : new Set(options.deepViewports ?? (first ? [first.name] : [])),
32
46
  };
47
+ const scrollBudgetMs = quick ? 25_000 : 60_000;
48
+ // Two Chromes can't share one profile folder, and breakpoint viewports are only known later.
49
+ const parallel = (options.parallel ?? quick) &&
50
+ viewports.length > 1 &&
51
+ options.profile === undefined &&
52
+ options.autoViewports !== true;
33
53
  await ensureDir(dir);
34
- log(`multiclone capture ${url}\n → ${dir}`);
54
+ log(`multiclone capture ${url} (${quick ? 'quick' : 'full'})\n → ${dir}`);
35
55
  const signal = options.signal ?? new AbortController().signal;
36
- const browser = await launchBrowser({
56
+ const launch = () => launchBrowser({
37
57
  headless: options.headless ?? true,
38
58
  ...(options.profile === undefined ? {} : { profile: options.profile }),
39
59
  signal,
40
60
  });
61
+ const browser = await launch();
41
62
  const budgets = new Map();
42
63
  const run = new CaptureRun();
43
64
  let captured;
44
65
  try {
45
- const page = new Page(browser.cdp, browser.version);
46
- await page.init();
47
- const context = {
48
- dir,
49
- settings,
50
- cdp: browser.cdp,
51
- page,
52
- browserVersion: browser.version,
53
- run,
54
- signal,
55
- addInitScript: async (source) => {
56
- run.initScripts.push(source);
57
- await page.addInitScript(source);
58
- },
59
- budget: (name) => {
60
- let budget = budgets.get(name);
61
- if (!budget) {
62
- const limits = DEFAULT_BUDGETS[name] ??
63
- DEFAULT_BUDGETS.runtime;
64
- budget = new ByteBudget(name, limits);
65
- budgets.set(name, budget);
66
- }
67
- return budget;
68
- },
69
- };
66
+ const context = await openContext(browser, run, dir, settings, signal, budgets);
70
67
  const collectors = defaultCollectors().filter((c) => !settings.disabled.has(c.id));
71
68
  for (const collector of collectors)
72
- await guarded(collector, 'setup', run, () => collector.setup?.(context));
73
- let autoPending = options.autoViewports === true;
74
- // for-of visits viewports appended during iteration (breakpoint viewports).
75
- for (const viewport of viewports) {
76
- signal.throwIfAborted();
77
- const vp = {
78
- ...context,
79
- viewport,
80
- primary: viewport === first,
81
- deep: settings.deepViewports.has(viewport.name),
82
- };
83
- log(` ${viewport.name} ${String(viewport.width)}×${String(viewport.height)}: loading`);
84
- await page.setViewport(viewport);
85
- await runHook(collectors, 'beforeNavigate', vp);
86
- await page.goto(url, 0);
87
- run.finalUrl = await page.evaluate('location.href');
88
- await runHook(collectors, 'loaded', vp);
89
- await page.settle(settings.settleMs, signal);
90
- log(' scrolling the whole page to trigger lazy content');
91
- run.pageHeights.set(viewport.name, await page.autoScroll(viewport));
92
- await runHook(collectors, 'top', vp);
93
- await runHook(collectors, 'explore', vp);
94
- await runHook(collectors, 'shots', vp);
95
- if (autoPending) {
96
- autoPending = false;
97
- const extra = breakpointViewports(await majorBreakpointsSoFar(page), viewports);
98
- if (extra.length)
99
- log(` adding breakpoint viewports: ${extra.map((v) => v.name).join(', ')}`);
100
- viewports.push(...extra);
69
+ await guarded(collector, 'setup', run, (stop) => collector.setup?.({ ...context, stop }));
70
+ if (parallel && first) {
71
+ const others = viewports.slice(1);
72
+ const side = captureSideViewports(others, launch, dir, settings, signal, scrollBudgetMs);
73
+ await visitViewport(context, collectors, first, true, scrollBudgetMs);
74
+ const sideRun = await side;
75
+ if (sideRun)
76
+ mergeSideRun(run, sideRun);
77
+ else
78
+ run.warn(`parallel capture of ${others.map((v) => v.name).join(', ')} failed`);
79
+ }
80
+ else {
81
+ let autoPending = options.autoViewports === true;
82
+ // for-of visits viewports appended during iteration (breakpoint viewports).
83
+ for (const viewport of viewports) {
84
+ signal.throwIfAborted();
85
+ await visitViewport(context, collectors, viewport, viewport === first, scrollBudgetMs);
86
+ if (autoPending) {
87
+ autoPending = false;
88
+ const extra = breakpointViewports(await majorBreakpointsSoFar(context.page), viewports);
89
+ if (extra.length)
90
+ log(` adding breakpoint viewports: ${extra.map((v) => v.name).join(', ')}`);
91
+ viewports.push(...extra);
92
+ }
101
93
  }
102
94
  }
103
95
  for (const collector of collectors)
104
- await guarded(collector, 'finish', run, () => collector.finish?.(context));
105
- captured = await writeManifest(dir, run, settings, browser.version, budgets);
96
+ await guarded(collector, 'finish', run, (stop) => collector.finish?.({ ...context, stop }));
97
+ captured = await writeManifest(dir, run, settings, browser.version, budgets, quick);
106
98
  }
107
99
  finally {
108
100
  await browser.close();
@@ -115,14 +107,113 @@ export async function capture(options) {
115
107
  log(` ! analysis: ${analysis.error.message}`);
116
108
  const report = await readFile(join(dir, 'REPORT.md'), 'utf8').catch(() => captured.report);
117
109
  return { ...captured, report, analysis };
118
- async function runHook(list, hook, vp) {
119
- for (const collector of list) {
120
- if (collector[hook] === undefined)
121
- continue;
122
- await guarded(collector, hook, vp.run, () => collector[hook]?.(vp));
110
+ }
111
+ async function openContext(browser, run, dir, settings, signal, budgets) {
112
+ const page = new Page(browser.cdp, browser.version);
113
+ await page.init();
114
+ return {
115
+ dir,
116
+ settings,
117
+ cdp: browser.cdp,
118
+ page,
119
+ browserVersion: browser.version,
120
+ run,
121
+ signal,
122
+ stop: new AbortController().signal,
123
+ addInitScript: async (source) => {
124
+ run.initScripts.push(source);
125
+ await page.addInitScript(source);
126
+ },
127
+ budget: (name) => {
128
+ let budget = budgets.get(name);
129
+ if (!budget) {
130
+ const limits = DEFAULT_BUDGETS[name] ??
131
+ DEFAULT_BUDGETS.runtime;
132
+ budget = new ByteBudget(name, limits);
133
+ budgets.set(name, budget);
134
+ }
135
+ return budget;
136
+ },
137
+ };
138
+ }
139
+ /** Loads the page at one viewport and runs every viewport hook in order. */
140
+ async function visitViewport(context, collectors, viewport, primary, scrollBudgetMs) {
141
+ const { page, run, settings, signal } = context;
142
+ signal.throwIfAborted();
143
+ const vp = {
144
+ ...context,
145
+ viewport,
146
+ primary,
147
+ deep: settings.deepViewports.has(viewport.name),
148
+ };
149
+ log(` ${viewport.name} ${String(viewport.width)}×${String(viewport.height)}: loading`);
150
+ await page.setViewport(viewport);
151
+ await runHook(collectors, 'beforeNavigate', vp);
152
+ const { loaded } = await page.goto(settings.url, 0);
153
+ if (!loaded)
154
+ run.warn(`${viewport.name}: the load event never fired (30s); captured anyway`);
155
+ if (primary || !run.finalUrl)
156
+ run.finalUrl = await page.evaluate('location.href');
157
+ await runHook(collectors, 'loaded', vp);
158
+ await page.settle(settings.settleMs, signal);
159
+ log(' scrolling the whole page to trigger lazy content');
160
+ run.pageHeights.set(viewport.name, await page.autoScroll(viewport, scrollBudgetMs));
161
+ await runHook(collectors, 'top', vp);
162
+ await runHook(collectors, 'explore', vp);
163
+ await runHook(collectors, 'shots', vp);
164
+ }
165
+ async function runHook(list, hook, vp) {
166
+ for (const collector of list) {
167
+ if (collector[hook] === undefined)
168
+ continue;
169
+ await guarded(collector, hook, vp.run, (stop) => collector[hook]?.({ ...vp, stop }));
170
+ }
171
+ }
172
+ /**
173
+ * The non-primary viewports in their own browser, with only the per-viewport collectors, so they
174
+ * run alongside the first viewport instead of after it. Returns null when the browser failed.
175
+ */
176
+ async function captureSideViewports(viewports, launch, dir, settings, signal, scrollBudgetMs) {
177
+ let browser = null;
178
+ try {
179
+ browser = await launch();
180
+ const run = new CaptureRun(true);
181
+ const context = await openContext(browser, run, dir, settings, signal, new Map());
182
+ const collectors = viewportOnlyCollectors().filter((c) => !settings.disabled.has(c.id));
183
+ for (const viewport of viewports) {
184
+ signal.throwIfAborted();
185
+ await visitViewport(context, collectors, viewport, false, scrollBudgetMs);
123
186
  }
187
+ return run;
188
+ }
189
+ catch (error) {
190
+ if (error instanceof Error && error.name === 'AbortError')
191
+ throw error;
192
+ log(` ! parallel viewports: ${error instanceof Error ? error.message : String(error)}`);
193
+ return null;
194
+ }
195
+ finally {
196
+ await browser?.close();
124
197
  }
125
198
  }
199
+ /** Folds the per-viewport facts of the side browser into the main run before finish hooks. */
200
+ function mergeSideRun(run, side) {
201
+ for (const [key, value] of side.pageHeights)
202
+ run.pageHeights.set(key, value);
203
+ for (const [key, value] of side.shots)
204
+ run.shots.set(key, value);
205
+ for (const [key, value] of side.doms)
206
+ run.doms.set(key, value);
207
+ for (const [key, value] of side.structures)
208
+ run.structures.set(key, value);
209
+ for (const [key, value] of side.sections)
210
+ run.sections.set(key, value);
211
+ for (const [collector, files] of side.outputs)
212
+ for (const file of files)
213
+ run.output(collector, file);
214
+ for (const warning of side.warnings)
215
+ run.warn(warning);
216
+ }
126
217
  /** Media-query widths from the stylesheets the page has loaded so far (same-origin rules). */
127
218
  async function majorBreakpointsSoFar(page) {
128
219
  const css = await page
@@ -130,19 +221,35 @@ async function majorBreakpointsSoFar(page) {
130
221
  .catch(() => '');
131
222
  return majorBreakpoints(extractBreakpoints(css));
132
223
  }
133
- /** A failing or slow collector costs a warning, never the whole capture. */
224
+ /** Time a hook gets to wrap up after its soft stop before the capture moves on without it. */
225
+ const STOP_GRACE_MS = 15_000;
226
+ /**
227
+ * A failing or slow collector costs a warning, never the whole capture. At the time limit the
228
+ * hook gets a soft stop so it can save partial results; one that ignores it is abandoned.
229
+ */
134
230
  async function guarded(collector, hook, run, fn) {
135
231
  const limit = collector.timeLimitMs ?? DEFAULT_TIME_LIMIT_MS;
136
- let timer;
137
- const timeout = new Promise((done) => {
138
- timer = setTimeout(() => {
139
- done('timeout');
140
- }, limit);
232
+ const stop = new AbortController();
233
+ const timers = [];
234
+ const abandoned = new Promise((done) => {
235
+ timers.push(setTimeout(() => {
236
+ stop.abort();
237
+ timers.push(setTimeout(() => {
238
+ done('abandoned');
239
+ }, STOP_GRACE_MS));
240
+ }, limit));
141
241
  });
142
242
  try {
143
- const outcome = await Promise.race([Promise.resolve(fn()).then(() => 'ok'), timeout]);
144
- if (outcome === 'timeout')
145
- run.warn(`${collector.id}.${hook} exceeded ${String(limit)}ms`);
243
+ const outcome = await Promise.race([
244
+ Promise.resolve(fn(stop.signal)).then(() => 'ok'),
245
+ abandoned,
246
+ ]);
247
+ if (outcome === 'abandoned') {
248
+ run.warn(`${collector.id}.${hook} ignored its ${String(limit)}ms limit and was abandoned`);
249
+ }
250
+ else if (stop.signal.aborted) {
251
+ run.warn(`${collector.id}.${hook} hit its ${String(limit)}ms limit; kept partial results`);
252
+ }
146
253
  }
147
254
  catch (error) {
148
255
  const message = error instanceof Error ? error.message : String(error);
@@ -152,10 +259,11 @@ async function guarded(collector, hook, run, fn) {
152
259
  log(` ! ${collector.id}.${hook}: ${message}`);
153
260
  }
154
261
  finally {
155
- clearTimeout(timer);
262
+ for (const timer of timers)
263
+ clearTimeout(timer);
156
264
  }
157
265
  }
158
- async function writeManifest(dir, run, settings, browserVersion, budgets) {
266
+ async function writeManifest(dir, run, settings, browserVersion, budgets, quick) {
159
267
  const network = run.network;
160
268
  const texts = new Map();
161
269
  for (const entry of network) {
@@ -195,6 +303,7 @@ async function writeManifest(dir, run, settings, browserVersion, budgets) {
195
303
  outputs: Object.fromEntries([...run.outputs].sort(([a], [b]) => a.localeCompare(b))),
196
304
  budgets: [...budgets.values()].map((budget) => budget.report()),
197
305
  warnings: run.warnings,
306
+ depth: quick ? 'quick' : 'full',
198
307
  };
199
308
  const report = renderReport({
200
309
  manifest,
@@ -1 +1 @@
1
- {"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/capture/capture.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/capture/capture.ts"],"names":[],"mappings":"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"}