build-personal-skill
Evidence-based creation of a reusable personal course-making Skill from the user's own classroom and chat history. Use when the user asks to summarize,…
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
$ npx -y skills add thu-maic/openmaic --skill page-clone --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/page-cloneContext preview
The summary Claude sees to decide when to auto-load this skill.
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
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`).
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.
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.
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
Repo: thu-maic/openmaic
Evidence-based creation of a reusable personal course-making Skill from the user's own classroom and chat history. Use when the user asks to summarize,…
Multi-stage series — a request for several classrooms that belong together, like 「7 天学 Python」, a four-week onboarding track, a semester unit split across…
Deep Interactive courses. Plans the course so the learner manipulates something on most pages — simulations, diagrams they explore, code they run, games, 3D…
Courses whose content rests on current, external or real-world facts that must be verified against live sources before being taught — recent events, market or…
Improve factual reliability while creating or reviewing a course or supplied content. Use when the user asks to fact-check, verify accuracy, reduce…
Turn any concept, lesson, slide deck, or source material into a Feynman learning cycle in which learners explain first, expose the smallest gap, rebuild the…