pro-editing 是一个面向已有课程的专业编辑技能,属于 thu-maic/openmaic 项目。它的核心定位是:你编辑的是一门已经持久化存储的课程,而不是从零生成课程。页面已经存在于存储中,你的工作是精确的——读取现有内容,只修改被要求修改的部分,其余一切保持原样。
用途 该技能适用于用户希望修订、改进、重构或润色课程已有页面的场景。它强调“最小编辑纪律”:只改被要求的内容,不重新设计未被触及的元素,不重写没人抱怨的旁白,不在编辑某一页时顺手“改进”相邻页面。编辑应当保持课程自身的术语、语域和视觉语言,让修改看起来不像修改。
进入课程前的准备 在触碰课程之前,技能要求先调用 list_scenes 盘点整个课程:每一页持久化页面、其顺序、其类型。这份列表——而不是你的假设——是你编辑所依据的地图。不要规划替换阶段,课程已有结构,你不是在重新规划它。如果请求比较宽泛(例如“让它更好”),需要把它转化为针对页面列表的具体计划,并在动手前说明将触碰哪些页面。
每次修改前先读取 在编辑目标页面之前,必须立即用 read_stage path:/scenes/<order|id> 读取该页面。它返回的清单——元素 id、题目 id、动作 id、组件配置——是你唯一可以编辑的地址空间,同时告诉你页面的真实类型。过期的 id 会导致编辑失败;对页面内容的过期假设会导致错误编辑。如果编辑落在了错误的页面类型上,这是重新读取的信号,而不是强行操作的理由。
read_stage 有三个级别,幻灯片编辑使用最深的一级。默认的 tree 是紧凑地图,足以找到元素,但绝不足以编辑它,因为它剥离了样式。在任何幻灯片写入之前,用 detail:"source" 读取页面:它返回页面精确持久化的 JSON(所有样式字段、带内联标记和换行的原始内容 HTML、精确几何、z 顺序),并且它是你的补丁路径所寻址的根——在 /content/canvas/elements/2/left 读取的字段,会通过同一路径写回。它总是返回整个页面,因此索引不会在读取和写入之间漂移。detail:"text" 是第三级:每个承载文本的元素以 { path, id, type, text } 形式返回,外加页面级 combinedText,用于证明页面没有遗留文案。
选择最小操作 幻灯片编辑是三种操作之一,第一种是针对 detail:"source" 刚返回的内容做单次 JSON Pointer 写入。技能提供了一张意图到工具与操作的矩阵,例如:修复或重写幻灯片文本用 patch_stage 对元素内容路径做 set 或 str_replace;移动、缩放、旋转元素或修复重叠用 patch_stage 对 left/top/width/height/rotate 做 set,每次一个数字;重新着色或重新样式化元素用 patch_stage 对渲染器拥有的样式路径做 set;删除可选字段用 patch_stage 做 remove;替换图片或媒体源用 patch_stage 对 src 做 set;重排幻灯片元素用 patch_stage 对整个数组做 set,保持相同 id 和类型;添加或删除幻灯片元素用 patch_stage 的 add_element(完整 JSON,无 id)或 delete_element;修复测验题、选项、答案、评分用 patch_stage 对 /content/questions/... 做 set/remove,新增则重写完整数组;修改交互页面用 patch_stage 对 /content/widgetConfig/... 或 /content/html 做 set/remove/str_replace;改写、插入、删除或重排旁白用 patch_stage 对 /actions/... 下的场景根指针操作,插入或重排需重写完整数组;编辑 PBL 简报、角色、里程碑、微任务用 patch_stage 对 /content/projectV2/... 做 set/remove;重命名、插入、删除或重排整页用 edit_deck 的 retitle/insert/delete/reorder;从零重写一页用 generate_scene + instruction,仅在用户明确要求整页重写时使用。
矩阵规则包括:一个意图对应一个操作,不要捆绑无法单独命名的更改;寻址到叶子节点,能隔离更改的最小路径才是正确路径,写回整个对象会导致相邻样式字段消失;patch_stage 操作不能改变身份——不能改画布 id、元素 id 集合或元素类型,这些要通过 add_element/delete_element,类型变更等于删除加添加;内容本身不受检查,按原样存储,因此 slide-dsl 是标记与损坏页面之间唯一的屏障;被拒绝的补丁不会改变任何东西,错误路径、越界索引、未知字段、错误类型或无效结果页面都会大声失败并保持页面原样,应重新读取并重新提交,绝不强行;add_element 接受一个完整的元素 JSON(无 id),服务器验证与补丁相同的结构契约,分配 id,并在 afterId 或 index 处插入;没有任何东西会规范化你的值,颜色、字体或主题不会被改写为统一风格,因此看起来错误的编辑是你的值,不是工具的问题;edit_deck insert 创建空存根,需用该新页面的明确类型和简报通过 generate_scene 填充,或补丁一个已有效的场景;generate_scene 带 instruction 会丢弃页面并重新生成,那是重写而非编辑,只保留给用户明确想要重建页面的时刻,绝不作为绕过仔细编辑的捷径;如果会话附带了材料或网络访问,用它们来为编辑内容提供依据,绝不作为重建没人要求页面的借口。
最小编辑纪律 只改被要求的内容。不要重新样式化未触及的元素,不要重写没人抱怨的旁白,不要在某一页时“改进”相邻页面。保持课程自身的语气:匹配其现有术语、语域和视觉语言。当目标比整页更窄时,优先使用细粒度的逐字段 patch_stage 操作,而不是 generate_scene。对于任何触及几何、颜色、文本长度或富文本结构的幻灯片编辑,加载 slide-craft:它承载页面绘制时所依据的设计法则——文本高度表、类型比例、对比度配对、间距节奏,以及元素类型上哪个字段真正到达屏幕。当需要字段本身——其名称、合法值、寻址路径、渲染器读取两个字段中的哪一个——那就是 slide-dsl。
看→编辑→看,有预算 对于布局敏感的更改(定位、密度、新元素、对齐),在可用时用 render_scene_preview 验证:看渲染、编辑、再看一次。每页最多两轮预览——每次渲染消耗一次工具调用,整个运行有硬性调用上限。不要预览未触碰的页面,不要超过预算循环:如果两轮未收敛,停下来告诉用户还剩什么,而不是把剩余运行烧在一页上。
旁白音频跟随文本 用 patch_stage 设置语音动作的 /actions/N/text 会清除改写行的音频,插入的行没有音频。在任何语音措辞更改后,继续之前对该页面调用 generate_tts——其默认模式只合成缺少音频的行,这正是你需要的。改写文本而未重新生成音频会发布一个静音页面。
以一致性检查收尾 在告诉用户工作完成之前:用 list_scenes 确认页面列表符合意图——数量、顺序、标题;每个编辑结果已经携带其页面的最新清单,据此验证,仅在结果存疑处用 read_stage 重新读取;扫查你触碰过的页面,检查编辑可能引入的跨页漂移:同一概念命名一致、单位和术语统一、你引入的样式应用到所有应属之处;被触碰页面上每个语音动作必须有 audioId(read_stage 会显示),任何缺少音频的页面都要 generate_tts。
与人类编辑共享课程 保存是按页最后写入胜出,同时在浏览器中创作的人类作者可以像你覆盖他们一样容易地覆盖你。把课程视为共享地面:先新鲜读取再写入,编辑前立即调用 read_stage 不是形式,而是避免覆盖用户自你上次查看后所做更改的方式;小而增量的写入,每次工具调用落地时自动持久化其更改,一系列小写入比一次大重写因冲突丢失的更少,绝不要积累“已准备但未写入”的批次,边写边做;当用户正在编辑时让路,如果用户说他们正在改同一页,或新鲜读取显示了你未写入的内容,停下来,重新读取,在再次写入前协调,绝不用你的过期快照覆盖人类更新的版本。
预算 没有硬性工具调用上限,但每次额外调用都是用户看着的延迟。把调用花在编辑上,而不是仪式上:进入时一次 list_scenes,每页编辑前一次 read_stage,编辑本身,措辞更改处 generate_tts,仅在布局真正有风险时一轮预览。如果请求很大,先做最高价值的编辑,并告诉用户还剩什么。