/page-clone
Building one page that looks like a page the course already has — copy the model page with `duplicate_scene`, then rewrite the copy's words with one `patch_stage` op per content slot. Use when a new page has to inherit an existing page's design, whether the model page came from
Claude Code
$ npx -y skills add thu-maic/openmaic --skill page-clone --agent claude-code
Codex
$ npx skills add thu-maic/openmaic --skill page-clone -a codex -y
Cursor
$ npx skills add thu-maic/openmaic --skill page-clone -a cursor -y
Gemini CLI
$ npx skills add thu-maic/openmaic --skill page-clone -a gemini-cli -y
GitHub Copilot
$ npx skills add thu-maic/openmaic --skill page-clone -a github-copilot -y
OpenCode
$ npx skills add thu-maic/openmaic --skill page-clone -a opencode -y
Windsurf
$ npx skills add thu-maic/openmaic --skill page-clone -a windsurf -y
SKILL.md
page-clone.SKILL.mdname: page-clone
title: "页面克隆"
description: Building one page that looks like a page the course already has — copy the model page with `duplicate_scene`, then rewrite the copy's words with one `patch_stage` op per content slot. Use when a new page has to inherit an existing page's design, whether the model page came from an imported deck or the course wrote it earlier. Not for revising a page that is already the page you want (that is `pro-editing`), and not for the course-level work of cataloguing layouts and assigning one per outline entry (that is `style-clone`).
Cloning one page's design
The design already exists on another page. Your job is to put **new content into that design** without redrawing it: copy the page, then swap what it says.
Copy-then-edit is the only clone path in this runtime. `generate_scene` always re-rolls a page from its outline entry — the model invents a fresh element tree every time — so calling it on a copied page destroys exactly the design you came for. Nothing here validates the shape of your result either: the design is preserved because you copied it, and the judgement about which elements are content and which are the skeleton is yours.
The sequence
1. **`duplicate_scene({ templateSceneId, targetOrder, title })`** — an exact copy of the model page at the position you want (`templateOrder` works too, but an id is safer). The copy carries the full content, no narration actions, and a new outline entry. Pass a `title` that names the NEW page; the entry inherits the model page's brief, and a copy still called 「第 3 章回顾」 misleads both the learner and the narration step. 2. **Read the copy with `read_stage`, `path:/scenes/<order|id>`, `detail:"source"`** — this is your address space and your fidelity source. It returns the whole page's persisted JSON, including raw content HTML, inline spans, fonts, colours, fills, shadows, geometry and z-order, and it is the root your patch paths are written against: a field you read at `/content/canvas/elements/2/content` is written back through that same path. Copy unchanged markup and style fields from this result; do not reconstruct them from stripped text. 3. **Decide, element by element, what each one is.** Content slots are the ones whose words belong to the old subject. Skeleton is everything else — rules, bands, page numbers, logos, decorative shapes, background art — and it stays untouched even when it holds text. 4. **Call `patch_stage` once per content slot**, with `op:"set"` on the exact path that holds that slot's words — `/content/canvas/elements/3/content` for a paragraph, `/content/canvas/elements/5/data/0/0/text` for a table cell. One leaf per call: everything you do not name keeps the value you copied. `slide-dsl` is the manual for which field holds the words in each element type. Do not patch geometry or style paths while cloning — they ARE the design you copied. 5. **Read the copy with `read_stage detail:"text"`** after the edits. It returns every text-bearing element as `{ path, id, type, text }` plus a page-wide `combinedText`, so you read the whole page's words in one call and get the pointer to fix with them. Search it for source-topic residue; the read reports, and you decide what is stale, then `set`, `remove`, or `delete_element` it. 6. **`generate_actions` on the copy** to give it narration (audio is on by default). A duplicated page arrives silent.
Work one page at a time and re-read before you edit. Every `patch_stage` result already carries the page's fresh inventory, so a run of edits on the same page needs one `read_stage` call at the start, not one per call.
Where a change goes
For a cloned slide, `patch_stage` uses `set`, `remove`, `str_replace`, `add_element`, and `delete_element`; for cloning the usual choice is `set` on the smallest content leaf. The only question is **which path** carries the change.
| Need | Call | What really happens | | ---------------------------- | ----------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | | New words in a text block | `set` `/content/canvas/elements/N/content` | Stores your HTML byte for byte — nothing filters it; preserve the source element's `<span>` marks and inline styles while changing the words | | New words in a shape's label | `set` `/content/canvas/elements/N/text/content` | Only the label's HTML moves; font, colour, vertical alignment, line height, shape fill and path all stay | | One table cell | `set` `/content/canvas/elements/N/data/0/0/text` | One cell's plain text; every other cell, id, `colspan`, `rowspan` and per-cell style is untouched | | One line of code | `set` `/content/canvas/elements/N/lines/1/content` | One line's text, with every line id kept — language, filename, font size and box survive | | A formula | `set` `/content/canvas/elements/N/latex` | Replaces the source and re-renders the cached KaTeX `html` the renderer actually paints | | A chart label or number | `set` `/content/canvas/elements/N/data/labels/2` | One entry; keep `labels`, `legends` and `series` dimensionally consistent | | A different image | `set` `/content/canvas/elements/N/src` | Points the element at another source. It never creates a picture — get a real `src` from `generate_image` first, and k
Read more
name: page-clone title: "页面克隆" description: Building one page that looks like a page the course already has — copy the model page with `duplicate_scene`, then rewrite the copy's words with one `patch_stage` op per content slot. Use when a new page has to inherit an existing page's design, whether the model page came from an imported deck or the course wrote it earlier. Not for revising a page that is already the page you want (that is `pro-editing`), and not for the course-level work of cataloguing layouts and assigning one per outline entry (that is `style-clone`).
Cloning one page's design
The design already exists on another page. Your job is to put **new content into that design** without redrawing it: copy the page, then swap what it says.
Copy-then-edit is the only clone path in this runtime. `generate_scene` always re-rolls a page from its outline entry — the model invents a fresh element tree every time — so calling it on a copied page destroys exactly the design you came for. Nothing here validates the shape of your result either: the design is preserved because you copied it, and the judgement about which elements are content and which are the skeleton is yours.
The sequence
1. **`duplicate_scene({ templateSceneId, targetOrder, title })`** — an exact copy of the model page at the position you want (`templateOrder` works too, but an id is safer). The copy carries the full content, no narration actions, and a new outline entry. Pass a `title` that names the NEW page; the entry inherits the model page's brief, and a copy still called 「第 3 章回顾」 misleads both the learner and the narration step. 2. **Read the copy with `read_stage`, `path:/scenes/<order|id>`, `detail:"source"`** — this is your address space and your fidelity source. It returns the whole page's persisted JSON, including raw content HTML, inline spans, fonts, colours, fills, shadows, geometry and z-order, and it is the root your patch paths are written against: a field you read at `/content/canvas/elements/2/content` is written back through that same path. Copy unchanged markup and style fields from this result; do not reconstruct them from stripped text. 3. **Decide, element by element, what each one is.** Content slots are the ones whose words belong to the old subject. Skeleton is everything else — rules, bands, page numbers, logos, decorative shapes, background art — and it stays untouched even when it holds text. 4. **Call `patch_stage` once per content slot**, with `op:"set"` on the exact path that holds that slot's words — `/content/canvas/elements/3/content` for a paragraph, `/content/canvas/elements/5/data/0/0/text` for a table cell. One leaf per call: everything you do not name keeps the value you copied. `slide-dsl` is the manual for which field holds the words in each element type. Do not patch geometry or style paths while cloning — they ARE the design you copied. 5. **Read the copy with `read_stage detail:"text"`** after the edits. It returns every text-bearing element as `{ path, id, type, text }` plus a page-wide `combinedText`, so you read the whole page's words in one call and get the pointer to fix with them. Search it for source-topic residue; the read reports, and you decide what is stale, then `set`, `remove`, or `delete_element` it. 6. **`generate_actions` on the copy** to give it narration (audio is on by default). A duplicated page arrives silent.
Work one page at a time and re-read before you edit. Every `patch_stage` result already carries the page's fresh inventory, so a run of edits on the same page needs one `read_stage` call at the start, not one per call.
Where a change goes
For a cloned slide, `patch_stage` uses `set`, `remove`, `str_replace`, `add_element`, and `delete_element`; for cloning the usual choice is `set` on the smallest content leaf. The only question is **which path** carries the change.
| Need | Call | What really happens | | ---------------------------- | ----------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | | New words in a text block | `set` `/content/canvas/elements/N/content` | Stores your HTML byte for byte — nothing filters it; preserve the source element's `<span>` marks and inline styles while changing the words | | New words in a shape's label | `set` `/content/canvas/elements/N/text/content` | Only the label's HTML moves; font, colour, vertical alignment, line height, shape fill and path all stay | | One table cell | `set` `/content/canvas/elements/N/data/0/0/text` | One cell's plain text; every other cell, id, `colspan`, `rowspan` and per-cell style is untouched | | One line of code | `set` `/content/canvas/elements/N/lines/1/content` | One line's text, with every line id kept — language, filename, font size and box survive | | A formula | `set` `/content/canvas/elements/N/latex` | Replaces the source and re-renders the cached KaTeX `html` the renderer actually paints | | A chart label or number | `set` `/content/canvas/elements/N/data/labels/2` | One entry; keep `labels`, `legends` and `series` dimensionally consistent | | A different image | `set` `/content/canvas/elements/N/src` | Points the element at another source. It never creates a picture — get a real `src` from `generate_image` first, and k
Open Multi-Agent Interactive Classroom — Get an immersive, multi-agent learning experience in just one click
Other skills on openmaic.
More skills from other plugins.
blueprint-figure
Draws static SVG figures for lessons, READMEs and manuals in the AI Engineering from Scratch look: paper panel, blueprint accent,…
concept-workflow
End-to-end workflow for creating complete JavaScript concept documentation, orchestrating all skills from research to final review
lesson-quiz
Test a learner on a single Claude Code tutorial lesson (01-10) with 10 questions, scoring answers and flagging weak spots. Use…
harness-creator
Build, audit, and improve harnesses that make AI coding agents reliable: AGENTS.md/CLAUDE.md instruction files, feature/state…
Questions about page-clone.
- Which coding agents can use page-clone?
- page-clone installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.

