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
|
@@ -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
|
-
/**
|
|
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
|
-
|
|
12
|
-
|
|
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
|
|
1
|
+
{"version":3,"file":"shots.js","sourceRoot":"","sources":["../../../src/capture/collectors/shots.ts"],"names":[],"mappings":"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"}
|
package/dist/capture/context.js
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/compare/session.js
CHANGED
|
@@ -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.
|
|
48
|
-
await sleep(
|
|
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
|
-
|
|
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
|
|
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(
|
|
77
|
-
|
|
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
|
|
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
|
|
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.
|
|
109
|
-
await sleep(
|
|
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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"}
|
package/dist/compare/shoot.js
CHANGED
|
@@ -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
|
-
/**
|
|
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,
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;
|
|
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;
|
|
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.
|
|
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
|
-
|
|
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().
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE3E,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC;IACpC,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,mBAAmB;IAC1B,WAAW,EACT,
|
|
1
|
+
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../../../src/contracts/tools/capture.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,19 +20,20 @@ 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
|
|
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).'),
|
|
30
31
|
}),
|
|
31
32
|
cli: { command: 'setup', positionals: ['dir'] },
|
|
32
33
|
readOnly: false,
|
|
33
34
|
openWorld: false,
|
|
34
35
|
run: async (input) => {
|
|
35
|
-
const result = await setupProject({ dir: input.dir, agents: input.agents });
|
|
36
|
+
const result = await setupProject({ dir: input.dir, agents: input.agents, mcp: input.mcp });
|
|
36
37
|
if (!result.ok)
|
|
37
38
|
return result;
|
|
38
39
|
const { dir, agents, written, skipped } = result.value;
|
|
@@ -42,14 +43,17 @@ export const setupTool = defineTool({
|
|
|
42
43
|
...skipped.map((file) => `Left ${file} alone: it is not valid JSON. Add this by hand: ${entry}`),
|
|
43
44
|
'',
|
|
44
45
|
'Next:',
|
|
45
|
-
'
|
|
46
|
+
' multiclone doctor check Chrome and WebGL',
|
|
46
47
|
];
|
|
47
48
|
if (agents.includes('claude'))
|
|
48
|
-
lines.push(' Claude Code: start `claude` here
|
|
49
|
+
lines.push(' Claude Code: start `claude` here and run /multiclone <url>.');
|
|
49
50
|
if (agents.includes('cursor'))
|
|
50
|
-
lines.push(' Cursor: open this folder
|
|
51
|
+
lines.push(' Cursor: open this folder and ask the agent to clone <url>.');
|
|
51
52
|
if (agents.includes('agents'))
|
|
52
|
-
lines.push(
|
|
53
|
+
lines.push(' Other agents: ask the agent to clone <url> (it reads AGENTS.md).');
|
|
54
|
+
lines.push(input.mcp
|
|
55
|
+
? ' MCP server registered; agents can use the CLI or the MCP tools.'
|
|
56
|
+
: ' Agents drive the `multiclone` CLI. Add --mcp to also register the MCP server.');
|
|
53
57
|
return ok({ data: result.value, text: lines.join('\n') });
|
|
54
58
|
},
|
|
55
59
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"method.js","sourceRoot":"","sources":["../../../src/contracts/tools/method.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAC7F,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,MAAM,SAAS,GAAG,UAAU,CAAC;IAClC,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,yBAAyB;IAChC,WAAW,EACT,gWAAgW;IAClW,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;KACxC,CAAC;IACF,GAAG,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,OAAO,CAAC,EAAE;IACjD,QAAQ,EAAE,IAAI;IACd,SAAS,EAAE,KAAK;IAChB,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QACnB,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1C,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,SAAS,GAAG,UAAU,CAAC;IAClC,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,mCAAmC;IAC1C,WAAW,EACT,
|
|
1
|
+
{"version":3,"file":"method.js","sourceRoot":"","sources":["../../../src/contracts/tools/method.ts"],"names":[],"mappings":"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"}
|