multiclone 0.1.0 → 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.
- package/README.md +31 -42
- package/commands/multiclone.md +5 -10
- package/dist/adapters/cli.js +10 -1
- package/dist/adapters/cli.js.map +1 -1
- package/dist/capture/capture.js +189 -80
- package/dist/capture/capture.js.map +1 -1
- package/dist/capture/collectors/coverage.js +20 -18
- package/dist/capture/collectors/coverage.js.map +1 -1
- package/dist/capture/collectors/index.js +11 -0
- package/dist/capture/collectors/index.js.map +1 -1
- package/dist/capture/collectors/interactions.js +129 -130
- package/dist/capture/collectors/interactions.js.map +1 -1
- package/dist/capture/collectors/motion.js +14 -9
- package/dist/capture/collectors/motion.js.map +1 -1
- package/dist/capture/collectors/probes.js +3 -2
- package/dist/capture/collectors/probes.js.map +1 -1
- package/dist/capture/collectors/shots.js +38 -18
- package/dist/capture/collectors/shots.js.map +1 -1
- package/dist/capture/context.js +5 -0
- package/dist/capture/context.js.map +1 -1
- package/dist/compare/session.js +22 -16
- package/dist/compare/session.js.map +1 -1
- package/dist/compare/shoot.js +27 -9
- package/dist/compare/shoot.js.map +1 -1
- package/dist/contracts/catalog.js +5 -0
- package/dist/contracts/catalog.js.map +1 -1
- package/dist/contracts/tools/capture.js +22 -6
- package/dist/contracts/tools/capture.js.map +1 -1
- package/dist/contracts/tools/method.js +10 -6
- package/dist/contracts/tools/method.js.map +1 -1
- package/dist/contracts/tools/session.js +195 -0
- package/dist/contracts/tools/session.js.map +1 -0
- package/dist/core/page.js +39 -18
- package/dist/core/page.js.map +1 -1
- package/dist/domain/snapshot.js +1 -1
- package/dist/domain/snapshot.js.map +1 -1
- package/dist/project/assets.js +25 -4
- package/dist/project/assets.js.map +1 -1
- package/dist/project/draft.js +860 -0
- package/dist/project/draft.js.map +1 -0
- package/dist/project/method.js +4 -2
- package/dist/project/method.js.map +1 -1
- package/dist/project/scaffold.js +23 -21
- package/dist/project/scaffold.js.map +1 -1
- package/dist/session/discover.js +53 -0
- package/dist/session/discover.js.map +1 -0
- package/dist/session/proc.js +113 -0
- package/dist/session/proc.js.map +1 -0
- package/dist/session/progress.js +83 -0
- package/dist/session/progress.js.map +1 -0
- package/dist/session/session.js +450 -0
- package/dist/session/session.js.map +1 -0
- package/dist/session/state.js +47 -0
- package/dist/session/state.js.map +1 -0
- package/dist/version.js +1 -1
- package/install.sh +29 -0
- package/package.json +3 -2
- package/skills/multiclone/SKILL.md +38 -17
- package/templates/react-vite/src/app/App.tsx +6 -1
- package/templates/react-vite/src/app/Page.tsx +9 -2
- package/templates/react-vite/src/app/routes.ts +7 -0
- package/templates/react-vite/src/styles/draft.css +1 -0
- package/templates/react-vite/src/styles/index.css +1 -0
package/README.md
CHANGED
|
@@ -6,39 +6,23 @@ 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).
|
|
9
|
+
You need Node 22.12 or newer and Google Chrome (Chromium, Edge or Brave also work).
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
1. Install the CLI once: `npm i -g multiclone` (or download `install.sh` from this repo, read it, and run `sh install.sh`; it also checks Chrome).
|
|
12
|
+
2. In the folder where you want the clone: `multiclone setup`. It teaches your agent the method (Claude Code skill and `/multiclone` command, a Cursor rule, and a block in `AGENTS.md` for every other agent). Add `--mcp` if you also want the MCP server; the CLI works without it.
|
|
13
|
+
3. Ask your agent: "clone https://example.com". Or run it yourself: `multiclone start https://example.com`.
|
|
12
14
|
|
|
13
|
-
|
|
14
|
-
2. `npx multiclone doctor` checks Chrome and WebGL.
|
|
15
|
-
3. Open your agent in that folder and ask it: "clone https://example.com".
|
|
16
|
-
|
|
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.
|
|
15
|
+
No global install? Put `npx` in front of every command.
|
|
32
16
|
|
|
33
17
|
## Use it
|
|
34
18
|
|
|
35
|
-
|
|
19
|
+
1. The agent asks one question: the landing page only, specific pages, or the whole site.
|
|
20
|
+
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.
|
|
21
|
+
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.
|
|
22
|
+
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.
|
|
23
|
+
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
24
|
|
|
37
|
-
|
|
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.
|
|
25
|
+
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
26
|
|
|
43
27
|
## What's inside
|
|
44
28
|
|
|
@@ -59,21 +43,26 @@ Ask your agent to clone a URL. It then:
|
|
|
59
43
|
|
|
60
44
|
## CLI
|
|
61
45
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
| Command
|
|
65
|
-
|
|
|
66
|
-
| `multiclone
|
|
67
|
-
| `multiclone
|
|
68
|
-
| `multiclone
|
|
69
|
-
| `multiclone
|
|
70
|
-
| `multiclone
|
|
71
|
-
| `multiclone
|
|
72
|
-
| `multiclone
|
|
73
|
-
| `multiclone
|
|
74
|
-
| `multiclone
|
|
75
|
-
| `multiclone
|
|
76
|
-
| `multiclone
|
|
46
|
+
`multiclone <command>` (or `npx multiclone <command>`). Flags are the tool fields in kebab case; `multiclone <command> --help` lists them.
|
|
47
|
+
|
|
48
|
+
| Command | What it does |
|
|
49
|
+
| ---------------------------------------------------------------------------------------------- | ------------------------------------------ |
|
|
50
|
+
| `multiclone start <url> [--scope landing\|pages\|site] [--pages /a,/b] [--dir folder]` | Capture, draft and serve in the background |
|
|
51
|
+
| `multiclone status [dir] [--wait draft\|pages\|deep]` | Where the session is, with its links |
|
|
52
|
+
| `multiclone stop [dir]` | Stop the session's servers |
|
|
53
|
+
| `multiclone setup [dir] [--agents claude,cursor,agents] [--mcp]` | Teach your agent the method |
|
|
54
|
+
| `multiclone guide [topic]` | Print the method |
|
|
55
|
+
| `multiclone capture <url> [--depth quick\|full] [--viewports desktop,mobile\|auto] [--headed]` | Record and analyse the page |
|
|
56
|
+
| `multiclone draft <capture-dir> <project-dir> [--route /pricing]` | Write section components from a capture |
|
|
57
|
+
| `multiclone analyze <capture-dir>` | Rebuild the derived files |
|
|
58
|
+
| `multiclone inspect <capture-dir> section [03-pricing]` | Page through a capture |
|
|
59
|
+
| `multiclone serve <capture-dir> [--port 4400] [--mode live\|snapshot]` | Offline mirror and mock API |
|
|
60
|
+
| `multiclone scaffold <dir> [--capture capture-dir] [--port 5180]` | New React project |
|
|
61
|
+
| `multiclone assets <capture-dir> <project-dir>` | Copy media in |
|
|
62
|
+
| `multiclone shoot <url> [--positions 0,900] [--probe js]` | Screenshots and measurements |
|
|
63
|
+
| `multiclone compare <capture-dir\|url> <clone-url> [--intro] [--positions]` | Score the clone |
|
|
64
|
+
| `multiclone doctor` | Check the setup |
|
|
65
|
+
| `multiclone mcp` | Optional MCP server with the same tools |
|
|
77
66
|
|
|
78
67
|
Add `--json` for machine-readable output. Set `MULTICLONE_CHROME` to use a specific browser.
|
|
79
68
|
|
package/commands/multiclone.md
CHANGED
|
@@ -5,16 +5,11 @@ argument-hint: <url> [project folder]
|
|
|
5
5
|
|
|
6
6
|
Clone this website with the multiclone method: $ARGUMENTS
|
|
7
7
|
|
|
8
|
-
|
|
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
|
-
|
|
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 multiclone` instead.
|
|
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.
|
package/dist/adapters/cli.js
CHANGED
|
@@ -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
|
|
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`);
|
|
@@ -101,6 +101,15 @@ async function main() {
|
|
|
101
101
|
if (command === undefined || command === 'help' || command === '--help' || command === '-h') {
|
|
102
102
|
return void process.stdout.write(help());
|
|
103
103
|
}
|
|
104
|
+
if (command === '__session') {
|
|
105
|
+
// Background process behind `multiclone start`; not a public command.
|
|
106
|
+
const { runSessionDaemon } = await import('../session/session.js');
|
|
107
|
+
const workspace = rest[0];
|
|
108
|
+
if (workspace === undefined)
|
|
109
|
+
fail('__session needs a workspace');
|
|
110
|
+
await runSessionDaemon(workspace);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
104
113
|
if (command === 'mcp') {
|
|
105
114
|
setQuiet(true);
|
|
106
115
|
const { runMcpServer } = await import('./mcp.js');
|
package/dist/adapters/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/adapters/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAkC,MAAM,WAAW,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAoB,MAAM,yBAAyB,CAAC;AAE3E,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAiB,MAAM,cAAc,CAAC;AAEjE,MAAM,WAAW,GAAG;;mCAEe,CAAC;AAEpC,SAAS,SAAS,CAAC,KAAe;IAChC,MAAM,KAAK,GACT,KAAK,CAAC,IAAI,KAAK,SAAS;QACtB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM;YACrB,CAAC,CAAC,KAAK,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG;YACjC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAC3B,CAAC,CAAC,UAAU;gBACZ,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,GAAG,CAAC;IAC7B,MAAM,QAAQ,GACZ,KAAK,CAAC,YAAY,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;QAC1D,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,aAAa,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC;IACzD,MAAM,MAAM,GACV,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,WAAW,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1F,OAAO,WAAW,KAAK,CAAC,IAAI,GAAG,KAAK,GAAG,MAAM,KAAK,KAAK,CAAC,WAAW,GAAG,QAAQ,EAAE,CAAC;AACnF,CAAC;AAED,SAAS,KAAK,CAAC,IAAiB;IAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC;IACzB,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3E,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC;SAC7B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SAC3D,GAAG,CAAC,SAAS,CAAC;SACd,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO,gBAAgB,OAAO,CAAC,OAAO,IAAI,WAAW,WAAW,IAAI,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;AAC3F,CAAC;AAED,SAAS,IAAI;IACX,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACrE,OAAO,cAAc,OAAO,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/adapters/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/capture/capture.js
CHANGED
|
@@ -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 ??
|
|
30
|
-
disabled
|
|
31
|
-
deepViewports:
|
|
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
|
|
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
|
|
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
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
const
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
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
|
-
/**
|
|
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
|
-
|
|
137
|
-
const
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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([
|
|
144
|
-
|
|
145
|
-
|
|
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
|
-
|
|
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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"}
|