multiclone 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +9 -8
  2. package/agents/section-builder.md +5 -3
  3. package/commands/multiclone.md +3 -3
  4. package/dist/adapters/cli.js +14 -0
  5. package/dist/adapters/cli.js.map +1 -1
  6. package/dist/contracts/tools/method.js +12 -1
  7. package/dist/contracts/tools/method.js.map +1 -1
  8. package/dist/contracts/tools/session.js +9 -8
  9. package/dist/contracts/tools/session.js.map +1 -1
  10. package/dist/doctor.js +9 -0
  11. package/dist/doctor.js.map +1 -1
  12. package/dist/project/assets.js +15 -13
  13. package/dist/project/assets.js.map +1 -1
  14. package/dist/project/convert/attrs.js +318 -0
  15. package/dist/project/convert/attrs.js.map +1 -0
  16. package/dist/project/convert/convert.js +304 -0
  17. package/dist/project/convert/convert.js.map +1 -0
  18. package/dist/project/convert/css.js +299 -0
  19. package/dist/project/convert/css.js.map +1 -0
  20. package/dist/project/convert/html.js +425 -0
  21. package/dist/project/convert/html.js.map +1 -0
  22. package/dist/project/convert/jsx.js +335 -0
  23. package/dist/project/convert/jsx.js.map +1 -0
  24. package/dist/project/convert/locate.js +180 -0
  25. package/dist/project/convert/locate.js.map +1 -0
  26. package/dist/project/convert/scripts.js +214 -0
  27. package/dist/project/convert/scripts.js.map +1 -0
  28. package/dist/project/convert/styles.js +228 -0
  29. package/dist/project/convert/styles.js.map +1 -0
  30. package/dist/project/convert/write.js +142 -0
  31. package/dist/project/convert/write.js.map +1 -0
  32. package/dist/project/fonts.js +131 -0
  33. package/dist/project/fonts.js.map +1 -0
  34. package/dist/project/libraries.js +28 -0
  35. package/dist/project/libraries.js.map +1 -0
  36. package/dist/project/method.js +72 -6
  37. package/dist/project/method.js.map +1 -1
  38. package/dist/project/scaffold.js +33 -6
  39. package/dist/project/scaffold.js.map +1 -1
  40. package/dist/session/proc.js +29 -1
  41. package/dist/session/proc.js.map +1 -1
  42. package/dist/session/session.js +47 -4
  43. package/dist/session/session.js.map +1 -1
  44. package/dist/version.js +1 -1
  45. package/install.sh +3 -2
  46. package/package.json +4 -2
  47. package/scripts/postinstall.mjs +21 -0
  48. package/skills/multiclone/SKILL.md +17 -5
  49. package/templates/react-vite/index.html +1 -1
  50. package/templates/react-vite/src/main.tsx +2 -2
  51. package/templates/react-vite/src/styles/index.css +0 -1
  52. package/dist/project/draft.js +0 -860
  53. package/dist/project/draft.js.map +0 -1
  54. package/templates/react-vite/src/styles/draft.css +0 -1
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Free stand-ins for fonts the capture could not keep: the same family from Google Fonts when it
3
+ * exists there, otherwise the closest free Google family. The stand-in is registered under the
4
+ * original family name, so the site's own CSS picks it up without edits.
5
+ */
6
+ const SYSTEM = new Set([
7
+ 'serif',
8
+ 'sans-serif',
9
+ 'monospace',
10
+ 'cursive',
11
+ 'fantasy',
12
+ 'system-ui',
13
+ 'ui-sans-serif',
14
+ 'ui-serif',
15
+ 'ui-monospace',
16
+ 'ui-rounded',
17
+ 'emoji',
18
+ 'math',
19
+ 'inherit',
20
+ 'initial',
21
+ 'unset',
22
+ '-apple-system',
23
+ 'blinkmacsystemfont',
24
+ 'segoe ui',
25
+ 'roboto',
26
+ 'helvetica',
27
+ 'helvetica neue',
28
+ 'arial',
29
+ 'times',
30
+ 'times new roman',
31
+ 'georgia',
32
+ 'courier',
33
+ 'courier new',
34
+ 'verdana',
35
+ 'tahoma',
36
+ 'apple color emoji',
37
+ 'segoe ui emoji',
38
+ 'segoe ui symbol',
39
+ 'noto color emoji',
40
+ ].map((name) => name.toLowerCase()));
41
+ /** True for generic and system families that never need a web font. */
42
+ export function isSystemFamily(family) {
43
+ return SYSTEM.has(family.trim().toLowerCase());
44
+ }
45
+ /** First family of a font-family list, unquoted. */
46
+ export function primaryFamily(list) {
47
+ return (list.split(',')[0] ?? '')
48
+ .trim()
49
+ .replace(/^["']|["']$/g, '')
50
+ .trim();
51
+ }
52
+ /** Closest free Google family by the name's hints (mono, serif, display, grotesk...). */
53
+ export function closestGoogleFamily(family) {
54
+ const name = family.toLowerCase();
55
+ if (/mono|code|courier/.test(name))
56
+ return 'JetBrains Mono';
57
+ if (name.includes('sans'))
58
+ return /grotesk|grotesque/.test(name) ? 'Space Grotesk' : 'Inter';
59
+ if (/serif|garamond|times|tiempos|canela|caslon|baskerville|didot|bodoni|editorial|recoleta|playfair|freight|lyon|domaine|gt sectra|ogg/.test(name))
60
+ return /display|headline|bodoni|didot|canela|ogg|editorial/.test(name)
61
+ ? 'Playfair Display'
62
+ : 'Source Serif 4';
63
+ if (/grotesk|grotesque|neue|haas|akzidenz/.test(name))
64
+ return 'Space Grotesk';
65
+ if (/round|nunito|quicksand/.test(name))
66
+ return 'Nunito';
67
+ if (/condensed|narrow|compressed|oswald|bebas/.test(name))
68
+ return 'Oswald';
69
+ if (/hand|script|brush|marker/.test(name))
70
+ return 'Caveat';
71
+ return 'Inter';
72
+ }
73
+ /** Name the variable family the Google CSS2 API knows a family by (strips "Var", "VF" suffixes). */
74
+ function googleName(family) {
75
+ return family
76
+ .replace(/\s*(variable|var|vf)$/i, '')
77
+ .replace(/\s+/g, ' ')
78
+ .trim();
79
+ }
80
+ async function fetchGoogleCss(family, signal) {
81
+ const query = encodeURIComponent(family).replace(/%20/g, '+');
82
+ for (const axis of [':ital,wght@0,100..900;1,100..900', ':wght@100..900', '']) {
83
+ const url = `https://fonts.googleapis.com/css2?family=${query}${axis}&display=swap`;
84
+ try {
85
+ // A browser user agent makes Google answer with woff2 files.
86
+ const response = await fetch(url, {
87
+ signal,
88
+ headers: {
89
+ 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0 Safari/537.36',
90
+ },
91
+ });
92
+ if (response.ok)
93
+ return await response.text();
94
+ }
95
+ catch {
96
+ return null;
97
+ }
98
+ }
99
+ return null;
100
+ }
101
+ /**
102
+ * @font-face rules that register a Google stand-in under each missing family's own name.
103
+ * Never throws: an offline machine just gets no stand-ins (the site's fallback stack applies).
104
+ */
105
+ export async function googleFallbacks(families, timeoutMs = 8000) {
106
+ const signal = AbortSignal.timeout(timeoutMs);
107
+ const blocks = [];
108
+ const fallbacks = [];
109
+ const unique = [...new Set(families.map((family) => family.trim()).filter(Boolean))].sort();
110
+ for (const family of unique) {
111
+ if (isSystemFamily(family))
112
+ continue;
113
+ let standIn = googleName(family);
114
+ let css = await fetchGoogleCss(standIn, signal);
115
+ let exact = css !== null;
116
+ if (css === null && !signal.aborted) {
117
+ standIn = closestGoogleFamily(family);
118
+ css = await fetchGoogleCss(standIn, signal);
119
+ exact = false;
120
+ }
121
+ if (css === null) {
122
+ fallbacks.push({ family, standIn: null, exact: false });
123
+ continue;
124
+ }
125
+ const renamed = css.replace(/font-family:\s*(['"])[^'"]+\1/g, `font-family: '${family.replace(/['"\\]/g, '')}'`);
126
+ blocks.push(`/* ${family}: ${exact ? 'same family' : `closest free match (${standIn})`} from Google Fonts. */\n${renamed.trim()}`);
127
+ fallbacks.push({ family, standIn, exact });
128
+ }
129
+ return { css: blocks.join('\n\n'), fallbacks };
130
+ }
131
+ //# sourceMappingURL=fonts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fonts.js","sourceRoot":"","sources":["../../src/project/fonts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /** npm packages for the animation libraries a site uses, so the agent can port its scripts later. */
2
+ const PACKAGES = {
3
+ gsap: ['gsap'],
4
+ scrolltrigger: ['gsap'],
5
+ scrollsmoother: ['gsap'],
6
+ 'split-text': ['gsap'],
7
+ lenis: ['lenis'],
8
+ locomotive: ['locomotive-scroll'],
9
+ lottie: ['lottie-web'],
10
+ swiper: ['swiper'],
11
+ three: ['three', '@types/three'],
12
+ ogl: ['ogl'],
13
+ pixi: ['pixi.js'],
14
+ rive: ['@rive-app/canvas'],
15
+ anime: ['animejs'],
16
+ aos: ['aos'],
17
+ 'framer-motion': ['motion'],
18
+ spline: ['@splinetool/runtime'],
19
+ };
20
+ export function libraryPackages(stack, installed) {
21
+ const out = new Set();
22
+ for (const signal of stack)
23
+ for (const name of PACKAGES[signal.id] ?? [])
24
+ if (!installed.has(name))
25
+ out.add(name);
26
+ return [...out].sort();
27
+ }
28
+ //# sourceMappingURL=libraries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"libraries.js","sourceRoot":"","sources":["../../src/project/libraries.ts"],"names":[],"mappings":"AAEA,qGAAqG;AACrG,MAAM,QAAQ,GAAgD;IAC5D,IAAI,EAAE,CAAC,MAAM,CAAC;IACd,aAAa,EAAE,CAAC,MAAM,CAAC;IACvB,cAAc,EAAE,CAAC,MAAM,CAAC;IACxB,YAAY,EAAE,CAAC,MAAM,CAAC;IACtB,KAAK,EAAE,CAAC,OAAO,CAAC;IAChB,UAAU,EAAE,CAAC,mBAAmB,CAAC;IACjC,MAAM,EAAE,CAAC,YAAY,CAAC;IACtB,MAAM,EAAE,CAAC,QAAQ,CAAC;IAClB,KAAK,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC;IAChC,GAAG,EAAE,CAAC,KAAK,CAAC;IACZ,IAAI,EAAE,CAAC,SAAS,CAAC;IACjB,IAAI,EAAE,CAAC,kBAAkB,CAAC;IAC1B,KAAK,EAAE,CAAC,SAAS,CAAC;IAClB,GAAG,EAAE,CAAC,KAAK,CAAC;IACZ,eAAe,EAAE,CAAC,QAAQ,CAAC;IAC3B,MAAM,EAAE,CAAC,qBAAqB,CAAC;CAChC,CAAC;AAEF,MAAM,UAAU,eAAe,CAC7B,KAA6B,EAC7B,SAA8B;IAE9B,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,MAAM,IAAI,KAAK;QACxB,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE;YAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACxF,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC"}
@@ -1,9 +1,11 @@
1
- import { existsSync } from 'node:fs';
1
+ import { existsSync, readFileSync } from 'node:fs';
2
2
  import { copyFile, readFile, readdir, writeFile } from 'node:fs/promises';
3
+ import { homedir } from 'node:os';
3
4
  import { dirname, join, relative, resolve } from 'node:path';
4
5
  import { fileURLToPath } from 'node:url';
5
6
  import { ensureDir } from '../core/files.js';
6
7
  import { err, mcError, ok } from '../domain/result.js';
8
+ import { VERSION } from '../version.js';
7
9
  /** Package root: the folder holding `skills/`, `agents/`, `commands/` and `templates/`. */
8
10
  export const PACKAGE_ROOT = fileURLToPath(new URL('../../', import.meta.url));
9
11
  const SKILL_DIR = join(PACKAGE_ROOT, 'skills', 'multiclone');
@@ -106,7 +108,7 @@ export async function setupProject(options) {
106
108
  await put(join(dir, '.multiclone', 'GUIDE.md'), guide);
107
109
  await references(join(dir, '.multiclone', 'references'));
108
110
  await copy(AGENT_FILE, join(dir, '.multiclone', 'section-builder.md'));
109
- await put(join(dir, 'AGENTS.md'), await agentsBlock(join(dir, 'AGENTS.md')));
111
+ await put(join(dir, 'AGENTS.md'), await agentsBlock(join(dir, 'AGENTS.md'), '.multiclone'));
110
112
  }
111
113
  }
112
114
  return ok({ dir, agents, written: [...new Set(written)], skipped });
@@ -132,15 +134,17 @@ async function mergeMcpConfig(path) {
132
134
  config.mcpServers = { ...servers, multiclone: MCP_ENTRY };
133
135
  return `${JSON.stringify(config, null, 2)}\n`;
134
136
  }
135
- /** AGENTS.md with one marked multiclone block, replaced in place on later runs. */
136
- async function agentsBlock(path) {
137
+ /** An instructions file with one marked multiclone block, replaced in place on later runs. */
138
+ async function agentsBlock(path, guideDir) {
137
139
  const block = [
138
140
  START,
139
141
  '## Cloning websites (multiclone)',
140
142
  '',
141
- 'When asked to clone, copy or recreate a website, follow `.multiclone/GUIDE.md`. Its references are in `.multiclone/references/`.',
143
+ `When asked to clone, copy or recreate a website, use the multiclone CLI and follow \`${guideDir}/GUIDE.md\`. Its references are in \`${guideDir}/references/\`.`,
142
144
  '',
143
- 'Short version: ask the user whether to clone the landing page, specific pages or the whole site; run `multiclone start <url> --scope <answer>` and give the user the progress link; run `multiclone status --wait draft`; then polish the draft in `<workspace>/clone/src/sections`. Use `npx multiclone` if `multiclone` is not on the PATH.',
145
+ 'Short version: ask the user whether to clone the landing page, specific pages or the whole site; run `multiclone start <url> --scope <answer>` and give the user the progress link; run `multiclone status --wait draft`; then compare and polish the converted sections in `<workspace>/clone/src/sections` in place (they already use the original markup, CSS and scripts; never delete and redraw them). Use `npx multiclone` if `multiclone` is not on the PATH.',
146
+ '',
147
+ 'The result is always a React + Vite + TypeScript project with one component per section. Never hand over a downloaded copy of the original HTML, CSS and scripts as the clone. If multiclone cannot run, say so and stop instead of improvising.',
144
148
  END,
145
149
  ].join('\n');
146
150
  const existing = existsSync(path) ? await readFile(path, 'utf8') : '';
@@ -151,4 +155,66 @@ async function agentsBlock(path) {
151
155
  }
152
156
  return existing.trim() ? `${existing.trimEnd()}\n\n${block}\n` : `${block}\n`;
153
157
  }
158
+ const STAMP = join('.multiclone', 'installed.json');
159
+ /** True when this version already installed its method files into `home`. */
160
+ export function globalSetupCurrent(home = homedir()) {
161
+ try {
162
+ const stamp = JSON.parse(readFileSync(join(home, STAMP), 'utf8'));
163
+ return (typeof stamp === 'object' && stamp !== null && 'version' in stamp && stamp.version === VERSION);
164
+ }
165
+ catch {
166
+ return false;
167
+ }
168
+ }
169
+ /**
170
+ * Installs the method for every folder on this machine: Claude Code (user skill, agent and
171
+ * /multiclone command), Codex and Gemini CLI (their global instructions file, when installed)
172
+ * and a shared guide in ~/.multiclone for any other agent. Safe to run on every upgrade.
173
+ */
174
+ export async function setupGlobal(home = homedir()) {
175
+ if (!existsSync(home))
176
+ return err(mcError('not-found', `${home} does not exist`));
177
+ const written = [];
178
+ const agents = [];
179
+ const copy = async (from, to) => {
180
+ await ensureDir(dirname(to));
181
+ await copyFile(from, to);
182
+ written.push(relative(home, to));
183
+ };
184
+ const put = async (path, text) => {
185
+ await ensureDir(dirname(path));
186
+ await writeFile(path, text);
187
+ written.push(relative(home, path));
188
+ };
189
+ const references = async (target) => {
190
+ for (const name of (await readdir(join(SKILL_DIR, 'references'))).sort()) {
191
+ if (name.endsWith('.md'))
192
+ await copy(join(SKILL_DIR, 'references', name), join(target, name));
193
+ }
194
+ };
195
+ const claude = join(home, '.claude');
196
+ await copy(join(SKILL_DIR, 'SKILL.md'), join(claude, 'skills', 'multiclone', 'SKILL.md'));
197
+ await references(join(claude, 'skills', 'multiclone', 'references'));
198
+ await copy(AGENT_FILE, join(claude, 'agents', 'section-builder.md'));
199
+ await copy(COMMAND_FILE, join(claude, 'commands', 'multiclone.md'));
200
+ agents.push('Claude Code');
201
+ const shared = join(home, '.multiclone');
202
+ const guide = stripFrontmatter(await readFile(join(SKILL_DIR, 'SKILL.md'), 'utf8')).replace(/\]\(\.\.\/\.\.\/agents\//g, '](./');
203
+ await put(join(shared, 'GUIDE.md'), guide);
204
+ await references(join(shared, 'references'));
205
+ await copy(AGENT_FILE, join(shared, 'section-builder.md'));
206
+ const instructions = [
207
+ { agent: 'Codex', dir: join(home, '.codex'), file: 'AGENTS.md' },
208
+ { agent: 'Gemini CLI', dir: join(home, '.gemini'), file: 'GEMINI.md' },
209
+ ];
210
+ for (const target of instructions) {
211
+ if (!existsSync(target.dir))
212
+ continue;
213
+ const path = join(target.dir, target.file);
214
+ await put(path, await agentsBlock(path, '~/.multiclone'));
215
+ agents.push(target.agent);
216
+ }
217
+ await put(join(home, STAMP), `${JSON.stringify({ version: VERSION }, null, 2)}\n`);
218
+ return ok({ home, agents, written: [...new Set(written)] });
219
+ }
154
220
  //# sourceMappingURL=method.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"method.js","sourceRoot":"","sources":["../../src/project/method.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"method.js","sourceRoot":"","sources":["../../src/project/method.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,7 @@ import { log } from '../core/log.js';
7
7
  import { buildApiRoutes } from '../domain/routes.js';
8
8
  import { RunFolder } from '../store/run.js';
9
9
  import { exportAssets } from './assets.js';
10
+ import { googleFallbacks, primaryFamily } from './fonts.js';
10
11
  export const TEMPLATE_DIR = fileURLToPath(new URL('../../templates/react-vite', import.meta.url));
11
12
  /** Creates the strict React + Vite + TypeScript starter every rebuild begins from. */
12
13
  export async function scaffold(options) {
@@ -60,11 +61,16 @@ export async function seedProject(run, dir, mirrorPort) {
60
61
  }
61
62
  return { fonts, tokens: css !== null, media, proxied };
62
63
  }
63
- /** Copies captured font files to public/fonts and writes matching @font-face rules. */
64
+ /**
65
+ * Copies captured font files to public/fonts and writes matching @font-face rules. A font file
66
+ * that is missing or unreadable never fails the project: its family gets a Google Fonts stand-in.
67
+ */
64
68
  async function writeFonts(run, dir) {
65
- const { faces } = await run.fonts();
69
+ const { faces, usage } = await run.fonts();
66
70
  const rules = ['/* Captured by multiclone: the fonts the original page loaded. */'];
67
71
  const copied = new Map();
72
+ const kept = new Set();
73
+ const missing = new Set();
68
74
  let count = 0;
69
75
  for (const face of [...faces].sort(faceOrder)) {
70
76
  const sources = [];
@@ -74,15 +80,21 @@ async function writeFonts(run, dir) {
74
80
  let local = copied.get(source.file);
75
81
  if (!local) {
76
82
  const ext = extname(source.file) || '.woff2';
77
- local = `/fonts/${slug(face.family)}-${slug(face.weight)}-${slug(face.style)}-${String(copied.size + 1)}${ext}`;
83
+ const candidate = `/fonts/${slug(face.family)}-${slug(face.weight)}-${slug(face.style)}-${String(copied.size + 1)}${ext}`;
78
84
  await ensureDir(join(dir, 'public', 'fonts'));
79
- await copyFile(run.path(source.file), join(dir, 'public', local));
85
+ const ok = await copyFile(run.path(source.file), join(dir, 'public', candidate)).then(() => true, () => false);
86
+ if (!ok)
87
+ continue;
88
+ local = candidate;
80
89
  copied.set(source.file, local);
81
90
  }
82
91
  sources.push(`url('${local}')${source.format ? ` format('${source.format}')` : ''}`);
83
92
  }
84
- if (!sources.length)
93
+ if (!sources.length) {
94
+ missing.add(face.family);
85
95
  continue;
96
+ }
97
+ kept.add(face.family.toLowerCase());
86
98
  count++;
87
99
  const lines = [
88
100
  '@font-face {',
@@ -98,7 +110,22 @@ async function writeFonts(run, dir) {
98
110
  lines.push(` font-display: ${face.display && face.display !== 'auto' ? face.display : 'swap'};`, '}');
99
111
  rules.push(lines.join('\n'));
100
112
  }
101
- if (count)
113
+ for (const use of usage) {
114
+ const family = primaryFamily(use.family);
115
+ if (family && !kept.has(family.toLowerCase()))
116
+ missing.add(family);
117
+ }
118
+ const wanted = [...missing].filter((family) => !kept.has(family.toLowerCase()));
119
+ if (wanted.length) {
120
+ const { css, fallbacks } = await googleFallbacks(wanted);
121
+ if (css)
122
+ rules.push(css);
123
+ for (const fallback of fallbacks)
124
+ log(fallback.standIn
125
+ ? `font ${fallback.family}: not captured, using ${fallback.exact ? 'the same family' : fallback.standIn} from Google Fonts`
126
+ : `font ${fallback.family}: not captured and Google Fonts unreachable; the site's fallback font applies`);
127
+ }
128
+ if (rules.length > 1)
102
129
  await writeFile(join(dir, 'src', 'styles', 'fonts.css'), `${rules.join('\n\n')}\n`);
103
130
  return count;
104
131
  }
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/project/scaffold.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/project/scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC5F,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAiB,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE5D,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,4BAA4B,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAwBlG,sFAAsF;AACtF,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAwB;IACrD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,mCAAmC,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,GAAG,GAAqB,IAAI,CAAC;IACjC,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACtD,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC;IACrB,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC;IAClC,MAAM,WAAW,GAAG,IAAI,GAAG,IAAI,CAAC;IAChC,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACxF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,GAAG,EAAE,QAAQ,CAAC,KAAK,IAAI,IAAI,CAAC;IAC3D,MAAM,MAAM,GAA2B;QACrC,IAAI;QACJ,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;QAClC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC;KACjC,CAAC;IACF,MAAM,EAAE,CAAC,YAAY,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,4FAA4F;IAC5F,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC;IAC9D,MAAM,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAE9B,MAAM,MAAM,GAAG,GAAG;QAChB,CAAC,CAAC,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC;QACzD,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACvD,GAAG,CAAC,cAAc,GAAG,cAAc,MAAM,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACpF,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,EAAE,CAAC;AAC/C,CAAC;AASD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,GAAc,EACd,GAAW,EACX,UAAkB;IAElB,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACzC,IAAI,GAAG,KAAK,IAAI;QAAE,MAAM,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,CAAC,EAAE,GAAG,CAAC,CAAC;IACjF,MAAM,KAAK,GAAG,CAAC,MAAM,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;IACxD,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACtE,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,EAAE;YAC3C,MAAM,EAAE,oBAAoB,MAAM,CAAC,UAAU,CAAC,EAAE;YAChD,KAAK,EAAE,OAAO;SACf,CAAC,CAAC;IACL,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AACzD,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,UAAU,CAAC,GAAc,EAAE,GAAW;IACnD,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAa,CAAC,mEAAmE,CAAC,CAAC;IAC9F,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9C,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,IAAI,CAAC,MAAM,CAAC,IAAI;gBAAE,SAAS;YAC3B,IAAI,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC;gBAC7C,MAAM,SAAS,GAAG,UAAU,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC;gBAC1H,MAAM,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC9C,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CACnF,GAAG,EAAE,CAAC,IAAI,EACV,GAAG,EAAE,CAAC,KAAK,CACZ,CAAC;gBACF,IAAI,CAAC,EAAE;oBAAE,SAAS;gBAClB,KAAK,GAAG,SAAS,CAAC;gBAClB,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACjC,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,QAAQ,KAAK,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACvF,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACzB,SAAS;QACX,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QACpC,KAAK,EAAE,CAAC;QACR,MAAM,KAAK,GAAG;YACZ,cAAc;YACd,mBAAmB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI;YACvD,UAAU,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;YAC/B,kBAAkB,IAAI,CAAC,MAAM,IAAI,QAAQ,GAAG;YAC5C,iBAAiB,IAAI,CAAC,KAAK,IAAI,QAAQ,GAAG;SAC3C,CAAC;QACF,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,KAAK,QAAQ;YAAE,KAAK,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;QAC9F,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,KAAK,YAAY;YACzD,KAAK,CAAC,IAAI,CAAC,oBAAoB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACvD,KAAK,CAAC,IAAI,CACR,mBAAmB,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,GAAG,EACrF,GAAG,CACJ,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/B,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAChF,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC;QACzD,IAAI,GAAG;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzB,KAAK,MAAM,QAAQ,IAAI,SAAS;YAC9B,GAAG,CACD,QAAQ,CAAC,OAAO;gBACd,CAAC,CAAC,QAAQ,QAAQ,CAAC,MAAM,yBAAyB,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,oBAAoB;gBAC3H,CAAC,CAAC,QAAQ,QAAQ,CAAC,MAAM,+EAA+E,CAC3G,CAAC;IACN,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAClB,MAAM,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,CAAC,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtF,OAAO,KAAK,CAAC;AACf,CAAC;AAED,gGAAgG;AAChG,SAAS,WAAW,CAAC,OAA6C,EAAE,MAAc;IAChF,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,KAAK,MAAM,KAAK,IAAI,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM;YAAE,SAAS;QACtC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtD,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;AAC9B,CAAC;AAED,SAAS,SAAS,CAAC,CAAW,EAAE,CAAW;IACzC,OAAO,CACL,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC;QAChC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC;QAChC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAC/B,CAAC;AACJ,CAAC;AAED,SAAS,IAAI,CAAC,KAAa;IACzB,OAAO,CACL,KAAK;SACF,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CACvB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,GAAW,EAAE,MAA8B;IACnE,KAAK,MAAM,KAAK,IAAI,MAAM,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC9B,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YACrC,MAAM,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC/B,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,GAAW,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC;QAC5F,IAAI,MAAM,KAAK,IAAI;YAAE,MAAM,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACrD,CAAC;AACH,CAAC"}
@@ -58,7 +58,35 @@ export async function installDependencies(project) {
58
58
  if (existsSync(join(project, 'node_modules', 'vite', 'package.json'))) {
59
59
  return { ok: true, output: 'already installed' };
60
60
  }
61
- return runCommand(process.platform === 'win32' ? 'npm.cmd' : 'npm', ['install', '--no-audit', '--no-fund', '--loglevel=error'], project, 600_000);
61
+ return npmWithRetry(project, ['install', '--no-audit', '--no-fund', '--loglevel=error']);
62
+ }
63
+ /** Adds packages with exact versions (the clone pins everything). */
64
+ export async function addPackages(project, packages) {
65
+ if (!packages.length)
66
+ return { ok: true, output: 'nothing to add' };
67
+ return npmWithRetry(project, [
68
+ 'install',
69
+ '--save-exact',
70
+ '--no-audit',
71
+ '--no-fund',
72
+ '--loglevel=error',
73
+ ...packages,
74
+ ]);
75
+ }
76
+ /**
77
+ * npm with one recovery pass: a cache another npm process is writing (or a corrupt entry) fails
78
+ * the first try, so the retry verifies the cache and skips it with --prefer-online.
79
+ */
80
+ async function npmWithRetry(project, args) {
81
+ const npm = process.platform === 'win32' ? 'npm.cmd' : 'npm';
82
+ const first = await runCommand(npm, [...args], project, 600_000);
83
+ if (first.ok)
84
+ return first;
85
+ await runCommand(npm, ['cache', 'verify', '--loglevel=error'], project, 120_000);
86
+ const second = await runCommand(npm, [...args, '--prefer-online'], project, 600_000);
87
+ return second.ok
88
+ ? second
89
+ : { ok: false, output: `${first.output.slice(-400)}\n--- retry ---\n${second.output}` };
62
90
  }
63
91
  /** Starts `vite` for the clone in its own process group and waits until it answers. */
64
92
  export async function startDevServer(project, port, logTo) {
@@ -1 +1 @@
1
- {"version":3,"file":"proc.js","sourceRoot":"","sources":["../../src/session/proc.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"proc.js","sourceRoot":"","sources":["../../src/session/proc.ts"],"names":[],"mappings":"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"}
@@ -8,11 +8,12 @@ import { ensureDir, sleep, slugForUrl } from '../core/files.js';
8
8
  import { log } from '../core/log.js';
9
9
  import { DESKTOP, MOBILE } from '../domain/viewports.js';
10
10
  import { startMirror } from '../mirror/server.js';
11
- import { generateDraft } from '../project/draft.js';
11
+ import { convertPage } from '../project/convert/convert.js';
12
+ import { libraryPackages } from '../project/libraries.js';
12
13
  import { scaffold, seedProject } from '../project/scaffold.js';
13
14
  import { RunFolder } from '../store/run.js';
14
15
  import { discoverPages } from './discover.js';
15
- import { freePort, installDependencies, killGroup, startDevServer } from './proc.js';
16
+ import { addPackages, freePort, installDependencies, killGroup, startDevServer } from './proc.js';
16
17
  import { startProgressServer } from './progress.js';
17
18
  import { isAlive, logFile, readState, stateDir, writeState, } from './state.js';
18
19
  /** Sessions end on their own after this long so forgotten servers don't pile up. */
@@ -26,7 +27,14 @@ const FAILED_LINGER_MS = 10 * 60 * 1000;
26
27
  */
27
28
  export async function startSession(options) {
28
29
  const url = new URL(options.url).toString();
29
- const workspace = resolve(options.dir ?? `multiclone-${new URL(url).hostname.replace(/^www\./, '')}`);
30
+ const host = new URL(url).hostname.replace(/^www\./, '');
31
+ // Started again from inside a clone of the same site: reuse that workspace instead of nesting one.
32
+ const around = options.dir === undefined ? enclosingWorkspace(process.cwd()) : null;
33
+ const aroundState = around ? await readState(around) : null;
34
+ const reuse = around !== null &&
35
+ aroundState !== null &&
36
+ new URL(aroundState.url).hostname.replace(/^www\./, '') === host;
37
+ const workspace = reuse ? around : resolve(options.dir ?? `multiclone-${host}`);
30
38
  const existing = await readState(workspace);
31
39
  if (existing && isAlive(existing.pid) && existing.phase !== 'stopped')
32
40
  return existing;
@@ -277,6 +285,28 @@ export async function runSessionDaemon(workspace) {
277
285
  }
278
286
  state.phase = 'ready';
279
287
  await save();
288
+ // The clone already runs the site's own copies of these libraries; the npm packages are for
289
+ // porting its scripts to React later. Nothing imports them yet, so Vite is unaffected.
290
+ if ((await installed) !== null) {
291
+ const added = step('add the animation libraries', async () => {
292
+ const opened = await RunFolder.open(main.capture);
293
+ if (!opened.ok)
294
+ return 'no capture';
295
+ const manifest = JSON.parse(await readFile(join(project, 'package.json'), 'utf8'));
296
+ const have = new Set([
297
+ ...Object.keys(manifest.dependencies ?? {}),
298
+ ...Object.keys(manifest.devDependencies ?? {}),
299
+ ]);
300
+ const packages = libraryPackages(opened.value.manifest.stack, have);
301
+ if (!packages.length)
302
+ return 'none needed';
303
+ const result = await addPackages(project, packages);
304
+ if (!result.ok)
305
+ throw new Error(`npm install ${packages.join(' ')} failed: ${result.output.slice(-400)}`);
306
+ return packages.join(', ');
307
+ });
308
+ added.catch(() => undefined);
309
+ }
280
310
  if (state.scope === 'site') {
281
311
  await step('find the site pages', async () => {
282
312
  const opened = await RunFolder.open(main.capture);
@@ -384,7 +414,7 @@ export async function runSessionDaemon(workspace) {
384
414
  if (page.route === '/')
385
415
  await setTitle(state.project, opened.value.manifest.title);
386
416
  const aliases = page.route === '/' ? [new URL(opened.value.manifest.finalUrl || page.url).pathname] : [];
387
- return generateDraft({
417
+ return convertPage({
388
418
  capture: page.capture,
389
419
  project: state.project,
390
420
  route: page.route,
@@ -447,4 +477,17 @@ async function setTitle(project, title) {
447
477
  const safe = title.replace(/[<>&]/g, '');
448
478
  await writeFile(file, html.replace(/<title>[^<]*<\/title>/, `<title>${safe}</title>`));
449
479
  }
480
+ /** Nearest folder at or above `from` that holds a multiclone session. */
481
+ export function enclosingWorkspace(from) {
482
+ let dir = resolve(from);
483
+ for (let guard = 0; guard < 64; guard++) {
484
+ if (existsSync(join(dir, '.multiclone', 'session.json')))
485
+ return dir;
486
+ const parent = resolve(dir, '..');
487
+ if (parent === dir)
488
+ return null;
489
+ dir = parent;
490
+ }
491
+ return null;
492
+ }
450
493
  //# sourceMappingURL=session.js.map