/pro-editing
Professional editing of a course that already exists. Use when the user wants to revise, improve, restructure or polish pages the course already has — fix a page, tune a layout, repair a quiz, reword narration, reorder the deck, or raise the quality of the whole course. Not for
Claude Code
$ npx -y skills add thu-maic/openmaic --skill pro-editing --agent claude-code
Codex
$ npx skills add thu-maic/openmaic --skill pro-editing -a codex -y
Cursor
$ npx skills add thu-maic/openmaic --skill pro-editing -a cursor -y
Gemini CLI
$ npx skills add thu-maic/openmaic --skill pro-editing -a gemini-cli -y
GitHub Copilot
$ npx skills add thu-maic/openmaic --skill pro-editing -a github-copilot -y
OpenCode
$ npx skills add thu-maic/openmaic --skill pro-editing -a opencode -y
Windsurf
$ npx skills add thu-maic/openmaic --skill pro-editing -a windsurf -y
SKILL.md
pro-editing.SKILL.mdname: pro-editing
title: "专业编辑"
description: Professional editing of a course that already exists. Use when the user wants to revise, improve, restructure or polish pages the course already has — fix a page, tune a layout, repair a quiz, reword narration, reorder the deck, or raise the quality of the whole course. Not for building a new course from scratch.
Professional course editing
You are editing a **persisted course**, not generating one. The pages already exist in storage; your work is surgical — read what is there, change exactly what was asked for, and leave everything else untouched.
Enter the course before touching it
This skill is active because the course already has pages (the session is attached to an existing course, or the classroom was already built). Before any edit:
1. Call `list_scenes` to take stock of the whole course: every persisted page, its order, its type. This list — not your assumption — is the map you edit by. 2. Do not plan a replacement stage. The course has a structure; you are not replanning it. 3. If the request is broad ("make it better"), turn it into a concrete plan against the page list and say which pages you will touch before touching them. 4. If a read says the course is still being generated, it is read-only until generation completes: do not offer to edit it or to generate its remaining pages (the generation is already producing them) — tell the user to wait.
Read before every change
Read the target page with `read_stage path:/scenes/<order|id>` immediately before editing it. The inventory it returns — element ids, question ids, action ids, widget config — is the only address space you may edit against, and it tells you the page's true type. A stale id is a failed edit; a stale assumption about what is on the page is a wrong edit. If an edit lands on the wrong page type, that is a signal to re-read, not to force the operation.
`read_stage` has three levels, and a slide edit uses the deep one. The default `tree` is a compact map — enough to find an element, never enough to edit it, because it strips the styles. Before any slide write, read the page with **`detail:"source"`**: it returns the page's exact persisted JSON (all style fields, raw content HTML with inline marks and line breaks, exact geometry, z-order), and it is the root your patch paths address — a field read at `/content/canvas/elements/2/left` is written back through that same path. Source output paginates after 12,000 characters; follow `nextOffset` until the target field and its exact anchor are available. Do not reconstruct omitted text. **`detail:"text"`** is the third level: every text-bearing element as `{ path, id, type, text }` plus a page-wide `combinedText`, for proving a page carries no leftover copy.
For `str_replace`, copy the **decoded field value**, not the JSON serialization: actual newlines and literal backslash+n are different characters. Preserve HTML marks, whitespace and quotes exactly in `oldText`; never invent styles from the visible-text view. Supply the field's explicit `path`. The same rule applies to `newText`: preserve the intended code's escaping, not the surrounding JSON's. After an anchor rejection, use the returned diagnostic and re-read source where needed; correct the anchor rather than repeating the same failed patch.
Choose the smallest operation
A slide edit is one of three operations, and the first one is a single JSON Pointer write against what `detail:"source"` just returned.
| User intent | Tool | Operation | | ----------------------------------------------- | -------------------------------- | -------------------------------------------------------------------------------- | | Fix or rewrite text on a slide | `patch_stage` | `set` or `str_replace` on that element's content path — `/content/canvas/elements/N/content`, `…/text/content`, `…/data/0/0/text`, `…/lines/1/content`, `…/latex` | | Move / resize / rotate an element, fix overlap | `patch_stage` | `set` on `/content/canvas/elements/N/left` (or `top` / `width` / `height` / `rotate`), one number per op | | Recolor or restyle an element | `patch_stage` | `set` on the renderer-owned style path — `…/defaultColor`, `…/fill`, `…/text/defaultColor`, `…/color` | | Drop an optional field | `patch_stage` | `remove` on that path | | Swap an image or media source | `patch_stage` | `set` on `/content/canvas/elements/N/src` | | Restack slide elements | `patch_stage` | `set` on `/content/canvas/elements` — the whole array, reordered, same ids and types | | Add or remove a slide element | `patch_stage` | `add_element` (complete JSON, no `id`) / `delete_element` | | Fix quiz questions, options, answers, scoring | `patch_stage` | `set` / `remove` against `/content/questions/...`; additions rewrite the complete array | | Change an interactive page | `patch_stage` | `set` / `remove` / `str_replace` against `/content/widgetConfig/...` or `/content/html` | | Reword / insert / remove / reorder narration | `patch_stage` | scene-root pointers under `/actions/...`; rewrite a complete array for insertion/reorder | | Edit a PBL brief, roles, milestones, microtasks | `patch_stage` | `set` / `remove` against `/content/projectV2/...` | | Rename / insert / delete / reorder whole pages | `edit_deck` | `retitle` / `insert` / `delete` / `reorder` | | Rewrite one page from scratch | `generate_scene` + `instruction` | **only** on explicit user intent for a full-page
Read more
name: pro-editing title: "专业编辑" description: Professional editing of a course that already exists. Use when the user wants to revise, improve, restructure or polish pages the course already has — fix a page, tune a layout, repair a quiz, reword narration, reorder the deck, or raise the quality of the whole course. Not for building a new course from scratch.
Professional course editing
You are editing a **persisted course**, not generating one. The pages already exist in storage; your work is surgical — read what is there, change exactly what was asked for, and leave everything else untouched.
Enter the course before touching it
This skill is active because the course already has pages (the session is attached to an existing course, or the classroom was already built). Before any edit:
1. Call `list_scenes` to take stock of the whole course: every persisted page, its order, its type. This list — not your assumption — is the map you edit by. 2. Do not plan a replacement stage. The course has a structure; you are not replanning it. 3. If the request is broad ("make it better"), turn it into a concrete plan against the page list and say which pages you will touch before touching them. 4. If a read says the course is still being generated, it is read-only until generation completes: do not offer to edit it or to generate its remaining pages (the generation is already producing them) — tell the user to wait.
Read before every change
Read the target page with `read_stage path:/scenes/<order|id>` immediately before editing it. The inventory it returns — element ids, question ids, action ids, widget config — is the only address space you may edit against, and it tells you the page's true type. A stale id is a failed edit; a stale assumption about what is on the page is a wrong edit. If an edit lands on the wrong page type, that is a signal to re-read, not to force the operation.
`read_stage` has three levels, and a slide edit uses the deep one. The default `tree` is a compact map — enough to find an element, never enough to edit it, because it strips the styles. Before any slide write, read the page with **`detail:"source"`**: it returns the page's exact persisted JSON (all style fields, raw content HTML with inline marks and line breaks, exact geometry, z-order), and it is the root your patch paths address — a field read at `/content/canvas/elements/2/left` is written back through that same path. Source output paginates after 12,000 characters; follow `nextOffset` until the target field and its exact anchor are available. Do not reconstruct omitted text. **`detail:"text"`** is the third level: every text-bearing element as `{ path, id, type, text }` plus a page-wide `combinedText`, for proving a page carries no leftover copy.
For `str_replace`, copy the **decoded field value**, not the JSON serialization: actual newlines and literal backslash+n are different characters. Preserve HTML marks, whitespace and quotes exactly in `oldText`; never invent styles from the visible-text view. Supply the field's explicit `path`. The same rule applies to `newText`: preserve the intended code's escaping, not the surrounding JSON's. After an anchor rejection, use the returned diagnostic and re-read source where needed; correct the anchor rather than repeating the same failed patch.
Choose the smallest operation
A slide edit is one of three operations, and the first one is a single JSON Pointer write against what `detail:"source"` just returned.
| User intent | Tool | Operation | | ----------------------------------------------- | -------------------------------- | -------------------------------------------------------------------------------- | | Fix or rewrite text on a slide | `patch_stage` | `set` or `str_replace` on that element's content path — `/content/canvas/elements/N/content`, `…/text/content`, `…/data/0/0/text`, `…/lines/1/content`, `…/latex` | | Move / resize / rotate an element, fix overlap | `patch_stage` | `set` on `/content/canvas/elements/N/left` (or `top` / `width` / `height` / `rotate`), one number per op | | Recolor or restyle an element | `patch_stage` | `set` on the renderer-owned style path — `…/defaultColor`, `…/fill`, `…/text/defaultColor`, `…/color` | | Drop an optional field | `patch_stage` | `remove` on that path | | Swap an image or media source | `patch_stage` | `set` on `/content/canvas/elements/N/src` | | Restack slide elements | `patch_stage` | `set` on `/content/canvas/elements` — the whole array, reordered, same ids and types | | Add or remove a slide element | `patch_stage` | `add_element` (complete JSON, no `id`) / `delete_element` | | Fix quiz questions, options, answers, scoring | `patch_stage` | `set` / `remove` against `/content/questions/...`; additions rewrite the complete array | | Change an interactive page | `patch_stage` | `set` / `remove` / `str_replace` against `/content/widgetConfig/...` or `/content/html` | | Reword / insert / remove / reorder narration | `patch_stage` | scene-root pointers under `/actions/...`; rewrite a complete array for insertion/reorder | | Edit a PBL brief, roles, milestones, microtasks | `patch_stage` | `set` / `remove` against `/content/projectV2/...` | | Rename / insert / delete / reorder whole pages | `edit_deck` | `retitle` / `insert` / `delete` / `reorder` | | Rewrite one page from scratch | `generate_scene` + `instruction` | **only** on explicit user intent for a full-page
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 pro-editing.
- Which coding agents can use pro-editing?
- pro-editing 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.

