Pro Editing logo

Pro Editing

OrganizationPopular
THU-MAIC
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 building a new course from scratch.

Overview

PublisherTHU-MAIC
RepositoryOpenMAIC
Skill namepro-editing
Stars
37.6K
Forks
5.9K
Bundled files
1
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 1 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by THU-MAIC on GitHub. Read the source before you install it.

Installation

Install the Pro Editing AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/THU-MAIC/OpenMAIC.git /tmp/OpenMAIC
mkdir -p .claude/skills
cp -r /tmp/OpenMAIC/skills/agent-runtime/pro-editing .claude/skills/pro-editing
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Pro Editing in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Pro Editing on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Pro Editing is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

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.

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. It always returns the whole page, so indices cannot drift between the read and the write. 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.

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 intentToolOperation
Fix or rewrite text on a slidepatch_stageset 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 overlappatch_stageset on /content/canvas/elements/N/left (or top / width / height / rotate), one number per op
Recolor or restyle an elementpatch_stageset on the renderer-owned style path — …/defaultColor, …/fill, …/text/defaultColor, …/color
Drop an optional fieldpatch_stageremove on that path
Swap an image or media sourcepatch_stageset on /content/canvas/elements/N/src
Restack slide elementspatch_stageset on /content/canvas/elements — the whole array, reordered, same ids and types
Add or remove a slide elementpatch_stageadd_element (complete JSON, no id) / delete_element
Fix quiz questions, options, answers, scoringpatch_stageset / remove against /content/questions/...; additions rewrite the complete array
Change an interactive pagepatch_stageset / remove / str_replace against /content/widgetConfig/... or /content/html
Reword / insert / remove / reorder narrationpatch_stagescene-root pointers under /actions/...; rewrite a complete array for insertion/reorder
Edit a PBL brief, roles, milestones, microtaskspatch_stageset / remove against /content/projectV2/...
Rename / insert / delete / reorder whole pagesedit_deckretitle / insert / delete / reorder
Rewrite one page from scratchgenerate_scene + instructiononly on explicit user intent for a full-page rewrite

Rules of the matrix:

  • One intent → one operation. Do not bundle changes you cannot individually name.
  • Address the leaf. The smallest path that isolates your change is the correct one; writing a whole object back is how a neighbouring style field disappears.
  • A patch_stage op cannot change identity — not the canvas id, not the element id set, not an element's type. Those go through add_element / delete_element, and a type change is a delete plus an add. Content itself is unchecked — it is stored exactly as written, so slide-dsl is the only thing standing between your markup and a broken page.
  • A rejected patch changed nothing. A bad path, an out-of-bounds index, an unknown field, a wrong type or an invalid resulting page fails loud with the page as it was. Re-read and resubmit; never force.
  • add_element takes one complete element JSON without id — the server validates the same structure contract as a patch, assigns the id, and inserts at afterId or index (one or the other).
  • Nothing normalises your values. No colour, font or theme is rewritten toward a house style, so an edit that looks wrong is your value, not the tool's.
  • edit_deck insert creates an empty stub; fill it with generate_scene using that new page's explicit type and brief, or patch an already valid scene.
  • generate_scene with instruction discards the page and regenerates it. That is a rewrite, not an edit: reserve it for the moment the user plainly wants a page rebuilt, never as a shortcut around careful editing.
  • If the session has attached materials or web access, use them to ground the content of your edits — never as an excuse to rebuild pages nobody asked about.

Minimum-edit discipline

  • Change exactly what was asked for. Do not restyle untouched elements, do not reword narration nobody complained about, do not "improve" adjacent pages while you are on one page.
  • Keep the course's own voice: match its existing terminology, register and visual language. An edit should not be visible as an edit.
  • Prefer fine per-field patch_stage ops over generate_scene whenever the target is narrower than a whole page.
  • For any slide edit that touches geometry, colour, text length or rich-text structure, load slide-craft: it carries the design law the page was drawn under — the text height table, the type scale, contrast pairs, spacing rhythm, and which field on which element type actually reaches the screen.
  • When you need the field itself — its name, its legal values, the path that addresses it, which of two fields the renderer reads — that is slide-dsl.

Look → edit → look, on a budget

For layout-sensitive changes (positioning, density, new elements, alignment), verify with render_scene_preview when it is available: look at the render, edit, look once more. Budget at most two preview rounds per page — each render costs a tool call and the whole run has a hard call cap. Do not preview pages you did not touch, and do not loop past the budget: if two rounds have not converged, stop and tell the user what remains instead of burning the rest of the run on one page.

Narration audio follows text

Setting a speech action's /actions/N/text with patch_stage clears the audio of a reworded line, and inserted lines have none. After any speech wording change, call generate_tts on that page before moving on — its default mode synthesizes only the lines missing audio, which is exactly what you need. Reworded text without regenerated audio ships a silent page.

Close with a consistency pass

Before telling the user the work is done:

  1. list_scenes — confirm the page list matches what you intended: count, order, titles.
  2. Each edit result already carried the fresh inventory of its page; verify against it, and re-read with read_stage only where a result left doubt.
  3. Sweep the pages you touched for cross-page drift your edits could have introduced: the same concept named the same way, uniform units and terminology, a style you introduced applied everywhere it belongs.
  4. Every speech action on a touched page must have an audioId (read_stage shows it); any page missing audio gets generate_tts.

Share the course with human editors

Saves are last-write-wins per page, and a human authoring in the browser at the same time can overwrite you as easily as you can overwrite them. Treat the course as shared ground:

  • Read fresh, then write. The read_stage call immediately before an edit is not a formality — it is how you avoid writing over a change the user made since you last looked.
  • Small, incremental writes. Every tool call persists its change automatically as it lands; a sequence of small writes loses less to a conflict than one sweeping rewrite. Never accumulate a batch "prepared but not written" — write as you go.
  • Yield when the user is editing. If the user says they are changing the same page, or a fresh read shows content you did not write, stop, re-read, and reconcile before writing again. Never overwrite a human's fresher version with your stale snapshot.

Budget

There is no hard tool-call cap, but every extra call is latency the user watches. Spend calls on edits, not ceremony: one list_scenes at entry, one read_stage per page before its edits, the edits themselves, generate_tts where wording changed, a preview round only where layout is genuinely at risk. If the request is large, do the highest-value edits first and tell the user what remains.

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Pro Editing AI skill do?

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.

Why use Pro Editing on TypingMind?

Because you install it once and use it with any model. Pro Editing is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Pro Editing in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/THU-MAIC/OpenMAIC/tree/main/skills/agent-runtime/pro-editing. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Pro Editing?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Pro Editing?

As many as you like. As long as a model supports skills, you can use Pro Editing with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Pro Editing AI skill free?

Yes. It is published on GitHub by THU-MAIC under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇