源码解读⑤:自动渲染 SKILL.md 与中文拼音 slug——skill_writer.py 与 version_manager.py 深度剖析
发布时间:2026/10/4 20:48:24 作者:尧图编辑部 阅读量:1,286

源码解读⑤自动渲染 SKILL.md 与中文拼音 slug——skill_writer.py 与 version_manager.py 深度剖析【免费下载链接】ex-skill前任 skill项目地址: https://gitcode.com/gh_mirrors/exsk/ex-skill前言.skillex-skill是一个把前任聊天记录「蒸馏」成 AI Skill 的开源项目导入微信、iMessage、短信、照片后自动生成「像她一样说话」的 Claude Code 技能。本篇源码解读聚焦项目里最核心的两个工具脚本——skill_writer.py负责自动渲染 SKILL.md并把中文名转成中文拼音 slugversion_manager.py负责版本存档与一键回滚。读懂它们你就理解了整个「前任 Skill」的出生与进化机制 一、先看全貌一个 Skill 目录长什么样每次成功创建一位「前任」项目会在exes/{slug}/下生成一套标准文件。以仓库自带的示例 exes/example_xiaomei/ 为例文件/目录作用SKILL.md渲染后的完整技能共同记忆 人物性格 运行规则memories.md共同记忆正文关系时间线、日常仪式、重要时刻persona.md人物性格正文表达风格、情感逻辑、纠正记录memories_skill.md/persona_skill.md两个「单功能版」技能触发词分别是/{slug}-memories、/{slug}-personameta.json元数据昵称、slug、版本、纠正次数、更新时间versions/历史版本存档由版本管理器维护knowledge/存放原始资料chats / photos / social注意区分两个SKILL.md仓库根目录的 SKILL.md 是创建器技能教 AI 如何收集资料、分析、生成而exes/{slug}/SKILL.md是每个前任自动渲染出来的成品技能本篇主角就是负责渲染它的那段代码。二、中文拼音 slug从「小美」到xiaomei的目录命名术目录名不能直接用中文项目用了一个简洁的 slug 化方案代码见 slugify()优先使用 pypinyin若环境装了pypinyin直接取lazy_pinyin(name)并用下划线拼接「小美」→xiaomei降级兜底没装依赖时走 fallback——只保留 ASCII 字母数字和-_空格转下划线保证不报错统一清洗用正则把连续下划线压成一个、去掉首尾下划线如果最后结果为空比如名字全是纯符号兜底返回ex。这个 slug 贯穿全局目录名、meta.json里的字段、以及最终触发词/{slug}都来自它。所以示例中 meta.json 里才写着slug: example_xiaomei你用/example_xiaomei就能唤起这位示例前任。三、自动渲染 SKILL.md一份模板 元数据一次成型渲染的核心是 SKILL_MD_TEMPLATE 模板——一个带 YAML frontmatter 的固定骨架--- name: ex_{slug} description: {name}{identity} user-invocable: true --- # {name} ## PART A共同记忆 {memories_content} ## PART B人物性格 {persona_content} ## 运行规则 1. 先由 PART B 判断回不回、什么心情回 2. 再由 PART A 提供记忆 3. 输出时保持 PART B 的表达风格真正干活的是 create_skill()执行顺序非常「工程化」建目录一次性mkdir出versions/与knowledge/三件套写正文memories.md、persona.md原样落盘UTF-8渲染 SKILL.md把两份正文填进模板生成两个单功能技能memories_skill.md、persona_skill.md让用户可以只聊「记忆」或只聊「性格」写 meta.json补上slug、created_at、updated_at版本初始为v1corrections_count归零。其中身份描述由 build_identity_string() 拼装它从meta[profile]里取字段用逗号串成一句人话。以示例数据为例输入 meta.json 的档案输出的就是在一起 两年半大学同学分手 一年UI 设计师MBTI ENFP这句话会直接写进渲染后SKILL.md的description里——一句话让 AI 知道「你是谁、她是谁」。四、进化模式update_skill 的「先存档、后写入」原则前任 Skill 支持持续进化追加新聊天记录、纠正性格偏差。update_skill() 的做法堪称教科书版本号 1从meta.json读出v1解析成数字加 1 得到v2先存档把当前SKILL.md、memories.md、persona.md拷贝到versions/v1/——保证任何更新都「有退路」应用增量memories patch 直接追加persona 侧支持两种写法——普通追加或纠正记录correction会被精确插入到## Correction 记录小节下并顺手把corrections_count1重新渲染读完更新后的两份正文再套一次模板重写SKILL.md刷新 meta写入新版本号与 UTC 时间戳。配合 prompts/correction_handler.md 的纠正流程用户只要说一句「她不会这样」Skill 就会把自己越调越像。这套「模板即事实来源」的设计SKILL.md 永远由 memories persona 重新生成而不是手工维护是整个项目最值得借鉴的一点。✅五、version_manager.py版本清单、安全回滚与自动瘦身tools/version_manager.py 只有三个动作却把版本管理的三个痛点全解决了动作解决的问题关键实现list历史版本有哪些list_versions() 遍历versions/展示版本号、存档时间、文件清单rollback更新翻车了怎么办rollback()先把当前状态存成{版本}_before_rollback回滚本身也留退路再从目标版本恢复三个文件并把 meta 标记为目标版本_restored、记录rollback_fromcleanup存档越攒越多cleanup_old_versions() 按修改时间排序只保留最近MAX_VERSIONS 10份用户侧对应的就是根级 SKILL.md 里定义的管理命令/ex-rollback {slug} {version}直接触发回滚/list-exes则调用 skill_writer.py 的 list 动作以「slug、昵称、身份描述、版本、纠正次数、更新日期」的整齐格式列出所有前任。六、串联全链路从录入到回滚把两个脚本放回完整流程职责分工一目了然昵称「小美」 ──slugify()──▶ xiaomei目录名 / 触发词 原始资料 ──prompts 分析──▶ memories.md persona.md ──SKILL_MD_TEMPLATE 渲染──▶ exes/xiaomei/SKILL.md 追加/纠正 ──update_skill()──▶ 存档 versions/v1 → 写入 → 重渲染 → v2 翻车了 ──rollback()──▶ 先备份当前再恢复 v1全程可逆创建入口skill_writer.py 的 create 分支更新入口skill_writer.py 的 update 分支回滚入口version_manager.py 的 rollback 分支七、小结slug 是身份slugify()用 pypinyin 把中文名转成安全的拼音目录名并保留无依赖兜底一处生成、全局复用SKILL.md 是渲染产物模板 元数据一次成型更新时永远重新渲染避免多文件手工维护漂移进化必须可逆update_skill先存档后写入rollback连回滚本身都再备份一层最多保留 10 个版本自动瘦身。想动手验证的话安装依赖后在仓库根目录执行一次列表命令即可看到效果pip3 install -r requirements.txt python3 tools/skill_writer.py --action list --base-dir ./exes下一篇我们将拆解 prompts 目录下的分析提示词工程看看「共同记忆」与「人物性格」是如何被结构化提取出来的。【免费下载链接】ex-skill前任 skill项目地址: https://gitcode.com/gh_mirrors/exsk/ex-skill创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考