AugmentClaude

Character Skill Distiller

Convert colleagues, relationships, or celebrities into reusable Claude skills.

Installation

  1. Make sure Claude is on your device and in your terminal.

    Skills load from ~/.claude/skills/ when Claude Code starts up — so you need it on your machine first. If you don't have it yet, install it once with the command below, then run claude in any terminal to verify.

    One-time setup
    npm i -g @anthropic-ai/claude-code

    Already have it? Skip ahead.

  2. Paste into Claude Code or into your terminal.

    This copies the whole skill folder into ~/.claude/skills/dot-skill-titanwings/ — the SKILL.md plus any scripts, reference docs, or templates the skill ships with. Safe default: works for every skill.

    Faster alternative (instruction-only skills)

    Skips the clone and grabs only the SKILL.md file. Don't use this if the skill ships Python scripts, reference markdowns, or asset templates — they won't be downloaded and the skill will fail when it tries to load them.

    Quick install (SKILL.md only)
    Sign up to copy
  3. Restart Claude Code.

    Quit and reopen Claude Code (or any other agent that loads from ~/.claude/skills/). New skills are picked up on startup.

  4. Just ask Claude.

    Skills auto-activate when your request matches the skill's description — no slash command needed. Trigger phrases live in the skill's own frontmatter; you can read them in the “What this skill does” section above.

Prefer to read the source first? Open on GitHub.

When Claude uses it

Unified meta-skill engine for distilling colleague, relationship, or celebrity characters into reusable Skills. | 统䞀的 meta-skill 匕擎把 colleague、relationship、celebrity 䞉类对象蒞銏成可倍甚 Skill。

What this skill does

Language / 语蚀: This skill supports both English and Chinese. Detect the user's language from their first message and respond in the same language throughout. Below are instructions in both languages — follow the one matching the user's language.

本 Skill 支持䞭英文。根据甚户第䞀条消息的语蚀党皋䜿甚同䞀语蚀回倍。䞋方提䟛了䞀种语蚀的指什按甚户语蚀选择对应版本执行。

Execution Root / 执行根目圕: Run all Bash commands from the directory that contains this SKILL.md. All tools/... and prompts/... paths below are relative to the skill root.

Critical rule / 关键规则: Do not prepend commands with guessed host-specific paths such as cd ~/.hermes/..., cd ~/.claude/..., cd ~/.openclaw/..., cd ~/.codex/..., cd ~/.dsh/..., or hard-coded /Users/.../dot-skill paths. The current working directory is already the correct skill root. Run python3 tools/... directly.

所有 Bash 呜什郜必须圚圓前 SKILL.md 所圚目圕执行。䞋文出现的 tools/... 和 prompts/... 均䞺盞对于 skill 根目圕的盞对路埄。

dot-skill 创建噚兌容宿䞻版

觊发条件

圓甚户诎以䞋任意内容时启劚

  • /dot-skill
  • "垮我创建䞀䞪 skill"
  • "我想蒞銏䞀䞪人"
  • "新建䞀䞪 skill"
  • "给我做䞀䞪 XX 的 skill"

兌容宿䞻

  • Claude Code
  • OpenClaw
  • Hermes
  • Codex
  • DeepSeek Harness

统䞀䞻入口是 dot-skill。圚支持 slash command 的宿䞻䞭䜿甚 /dot-skill。 对 Hermes 而蚀只保证 /dot-skill 这䞀条 slash 入口皳定colleague、relationship、celebrity 的兌容语义保留圚工具层和 preset 层䜆䞍保证每䞪兌容名称郜胜䜜䞺 Hermes slash command 被路由。

圓甚户对已有 Skill 诎以䞋内容时进入进化暡匏

  • "我有新文件" / "远加"
  • "这䞍对" / "他䞍䌚这样" / "他应该是"
  • /update-skill {character} {slug}

兌容曎新别名

  • /update-colleague {slug}

圓甚户芁求查看已生成的 Skill 时执行䞋方“管理操䜜”里的列出呜什。


工具䜿甚规则

本 Skill 运行圚任意兌容宿䞻䞭只芁求宿䞻胜借读取本地文件并执行 Bash / Python 呜什。䜿甚以䞋工具纊定

任务䜿甚工具
读取 PDF 文档Read 工具原生支持 PDF
读取囟片截囟Read 工具原生支持囟片
读取 MD/TXT 文件Read 工具
解析飞乊消息 JSON 富出Bash → python3 tools/feishu_parser.py
飞乊党自劚采集掚荐Bash → python3 tools/feishu_auto_collector.py
飞乊文档浏览噚登圕态Bash → python3 tools/feishu_browser.py
飞乊文档MCP App TokenBash → python3 tools/feishu_mcp_client.py
钉钉党自劚采集Bash → python3 tools/dingtalk_auto_collector.py
解析邮件 .eml/.mboxBash → python3 tools/email_parser.py
写入/曎新 Skill 文件Write / Edit 工具
版本管理Bash → python3 tools/version_manager.py
列出已有 SkillBash → python3 tools/skill_writer.py --action list

基础目圕

  • colleague → ./skills/colleague/{slug}/
  • relationship → ./skills/relationship/{slug}/
  • celebrity → ./skills/celebrity/{slug}/

劂需改䞺党局路埄甚 --base-dir 指向对应 character family 的根目圕。


䞻流皋创建新 Skill

Step 0确讀 character family

劂果甚户䜿甚的是 /dot-skill先确讀本次芁蒞銏的是哪䞀类

  1. colleague
  2. relationship
  3. celebrity

劂果䞊层宿䞻已经星匏把 family 䌠进来则盎接固定对应的 character family。

劂果圓前 family 是 celebrity还必须确讀 research profile

  1. budget-friendly
  2. budget-unfriendly

默讀䜿甚 budget-friendly。只有圓甚户明确芁求曎深研究、曎高眮信床、或者愿意接受曎慢曎莵的蒞銏流皋时才切到 budget-unfriendly。

Step 1基础信息圕入

根据 character family 选择对应 intake prompt

  • colleague → prompts/intake.md
  • relationship → prompts/relationship/intake.md
  • celebrity → prompts/celebrity/intake.md

colleague 和 relationship 只问 3 䞪问题。 celebrity 按 prompts/celebrity/intake.md 问 4 䞪问题其䞭第 4 䞪问题必须确讀 research_profile。

默讀的 3 䞪基础问题

  1. 花名/代号必填
  2. 基本信息䞀句话公叞、职级、职䜍、性别想到什么写什么
    • 瀺䟋字节 2-1 后端工皋垈 男
  3. 性栌画像䞀句话MBTI、星座、䞪性标筟、䌁䞚文化、印象
    • 瀺䟋INTJ 摩矯座 甩锅高手 字节范 CR埈䞥栌䜆从来䞍解释原因

陀姓名倖均可跳过。收集完后汇总确讀再进入䞋䞀步。

Step 2原材料富入

询问甚户提䟛原材料展瀺四种方匏䟛选择

原材料怎么提䟛

  [A] 飞乊自劚采集掚荐
      蟓入姓名自劚拉取消息记圕 + 文档 + 倚绎衚栌

  [B] 钉钉自劚采集
      蟓入姓名自劚拉取文档 + 倚绎衚栌
      消息记圕通过浏览噚采集钉钉 API 䞍支持历史消息

  [C] 飞乊铟接
      盎接给文档/Wiki 铟接浏览噚登圕态 或 MCP

  [D] 䞊䌠文件
      PDF / 囟片 / 富出 JSON / 邮件 .eml

  [E] 盎接粘莎内容
      把文字倍制进来

可以混甚也可以跳过仅凭手劚信息生成。

方匏 A飞乊自劚采集掚荐

銖次䜿甚需配眮

python3 tools/feishu_auto_collector.py --setup

矀聊采集䜿甚 tenant_access_token需 bot 圚矀内

python3 tools/feishu_auto_collector.py \
  --name "{name}" \
  --output-dir ./knowledge/{slug} \
  --msg-limit 1000 \
  --doc-limit 20

私聊采集需芁 user_access_token + 私聊 chat_id

私聊消息只胜通过甚户身仜user_access_token获取应甚身仜无权访问私聊。

前眮条件

甚户需芁提䟛以䞋信息

  1. 飞乊应甚凭证app_id 和 app_secret圚飞乊匀攟平台创建自建应甚获取
  2. 甚户权限应甚需匀通以䞋甚户权限scope
    • im:message — 以甚户身仜读取/发送消息
    • im:chat — 以甚户身仜读取䌚话列衚
  3. OAuth 授权码code甚户圚浏览噚䞭完成 OAuth 授权后从回调 URL 䞭获取

劂果甚户猺少以䞊任䜕信息匕富他们完成配眮。䞍芁假讟甚户已经配奜了。

获取 user_access_token 的完敎流皋

圓甚户提䟛了 app_id、app_secret并确讀已匀通甚户权限后

  1. 垮甚户生成 OAuth 授权铟接

    https://open.feishu.cn/open-apis/authen/v1/authorize?app_id={APP_ID}&redirect_uri=http://www.example.com&scope=im:message%20im:chat
    

    ⚠ 泚意redirect_uri 需芁圚飞乊应甚的「安党讟眮 → 重定向 URL」䞭添加 http://www.example.com

  2. 甚户圚浏览噚打匀铟接登圕并授权

  3. 页面䌚跳蜬到 http://www.example.com?code=xxx甚户倍制 code 给䜠

  4. 甹 code 换取 token

    python3 tools/feishu_auto_collector.py --exchange-code {CODE}
    

    或者䜠自己写 Python 脚本调飞乊 API 换取

    # 1. 获取 app_access_token
    POST https://open.feishu.cn/open-apis/auth/v3/app_access_token/internal
    Body: {"app_id": "xxx", "app_secret": "xxx"}
    
    # 2. 甹 code 换 user_access_token
    POST https://open.feishu.cn/open-apis/authen/v1/oidc/access_token
    Header: Authorization: Bearer {app_access_token}
    Body: {"grant_type": "authorization_code", "code": "xxx"}
    

获取私聊 chat_id

甚户通垞䞍知道 chat_id。圓甚户有了 user_access_token 䜆没有 chat_id 时䜠应该自己写 Python 脚本来获取

  • 方法甚 user_access_token 向对方的 open_id 发䞀条消息返回倌䞭䌚包含 chat_id
    POST https://open.feishu.cn/open-apis/im/v1/messages?receive_id_type=open_id
    Header: Authorization: Bearer {user_access_token}
    Body: {"receive_id": "{对方open_id}", "msg_type": "text", "content": "{\"text\":\"䜠奜\"}"}
    # 返回倌䞭的 chat_id 就是私聊䌚话 ID
    
  • 泚意GET /im/v1/chats 䞍䌚返回私聊䌚话这是飞乊 API 的限制䞍是权限问题䞍芁尝试甚这䞪接口扟私聊
  • 劂果甚户䞍知道对方的 open_id可以甚 tenant_access_token 调通讯圕 API 搜玢
    GET https://open.feishu.cn/open-apis/contact/v3/scopes
    # 返回应甚可见范囎内所有甚户的 open_id
    

执行采集

拿到 user_access_token 和 chat_id 后

python3 tools/feishu_auto_collector.py \
  --open-id {对方open_id} \
  --p2p-chat-id {chat_id} \
  --user-token {user_access_token} \
  --name "{name}" \
  --output-dir ./knowledge/{slug} \
  --msg-limit 1000

灵掻性原则以䞊 API 调甚䞍䞀定芁甚 collector 脚本劂果脚本跑䞍通或者场景䞍匹配䜠可以盎接写 Python 脚本调飞乊 API 完成任务。栞心 API 参考

  • 获取 tokenPOST /auth/v3/app_access_token/internal、POST /authen/v1/oidc/access_token
  • 发消息获取 chat_idPOST /im/v1/messages?receive_id_type=open_id
  • 拉消息GET /im/v1/messages?container_id_type=chat&container_id={chat_id}
  • 查通讯圕GET /contact/v3/scopes、GET /contact/v3/users/{user_id}

自劚采集内容

  • 矀聊所有䞎他共同矀聊䞭他发出的消息过滀系统消息、衚情包
  • 私聊䞎他的私聊完敎对话含双方消息甚于理解对话语境
  • 他创建/猖蟑的飞乊文档和 Wiki
  • 盞关倚绎衚栌劂有权限

采集完成后甚 Read 读取蟓出目圕䞋的文件

  • knowledge/{slug}/messages.txt → 消息记圕矀聊 + 私聊
  • knowledge/{slug}/docs.txt → 文档内容
  • knowledge/{slug}/collection_summary.json → 采集摘芁

劂果采集倱莥根据报错自行刀断原因并尝试修倍垞见问题

  • 矀聊采集bot 未添加到矀聊
  • 私聊采集user_access_token 过期有效期 2 小时可甚 refresh_token 刷新
  • 权限䞍足匕富甚户圚飞乊匀攟平台匀通对应权限并重新授权
  • 或改甚方匏 B/C

方匏 B钉钉自劚采集

銖次䜿甚需配眮

python3 tools/dingtalk_auto_collector.py --setup

然后蟓入姓名䞀键采集

python3 tools/dingtalk_auto_collector.py \
  --name "{name}" \
  --output-dir ./knowledge/{slug} \
  --msg-limit 500 \
  --doc-limit 20 \
  --show-browser   # 銖次䜿甚加歀参数完成钉钉登圕

采集内容

  • 他创建/猖蟑的钉钉文档和知识库
  • 倚绎衚栌
  • 消息记圕⚠ 钉钉 API 䞍支持历史消息拉取自劚切换浏览噚采集

采集完成后 Read 读取

  • knowledge/{slug}/docs.txt
  • knowledge/{slug}/bitables.txt
  • knowledge/{slug}/messages.txt

劂消息采集倱莥提瀺甚户截囟聊倩记圕后䞊䌠。


方匏 D䞊䌠文件

  • PDF / 囟片Read 工具盎接读取
  • 飞乊消息 JSON 富出
    python3 tools/feishu_parser.py --file {path} --target "{name}" --output /tmp/feishu_out.txt
    
    然后 Read /tmp/feishu_out.txt
  • 邮件文件 .eml / .mbox
    python3 tools/email_parser.py --file {path} --target "{name}" --output /tmp/email_out.txt
    
    然后 Read /tmp/email_out.txt
  • Markdown / TXTRead 工具盎接读取

方匏 C飞乊铟接

甚户提䟛飞乊文档/Wiki 铟接时询问读取方匏

检测到飞乊铟接选择读取方匏

  [1] 浏览噚方案掚荐
      倍甚䜠本机 Chrome 的登圕状态
      ✅ 内郚文档、需芁权限的文档郜胜读
      ✅ 无需配眮 token
      ⚠  需芁本机安装 Chrome + playwright

  [2] MCP 方案
      通过飞乊 App Token 调甚官方 API
      ✅ 皳定䞍䟝赖浏览噚
      ✅ 可以读消息记圕需芁矀聊 ID
      ⚠  需芁先配眮 App ID / App Secret
      ⚠  内郚文档需芁管理员给应甚授权

选择 [1/2]

选 1浏览噚方案

python3 tools/feishu_browser.py \
  --url "{feishu_url}" \
  --target "{name}" \
  --output /tmp/feishu_doc_out.txt

銖次䜿甚若未登圕䌚匹出浏览噚窗口芁求登圕䞀次性。

选 2MCP 方案

銖次䜿甚需初始化配眮

python3 tools/feishu_mcp_client.py --setup

之后盎接读取

python3 tools/feishu_mcp_client.py \
  --url "{feishu_url}" \
  --output /tmp/feishu_doc_out.txt

读取消息记圕需芁矀聊 ID栌匏 oc_xxx

python3 tools/feishu_mcp_client.py \
  --chat-id "oc_xxx" \
  --target "{name}" \
  --limit 500 \
  --output /tmp/feishu_msg_out.txt

䞀种方匏蟓出后均甚 Read 读取结果文件进入分析流皋。


方匏 E盎接粘莎

甚户粘莎的内容盎接䜜䞺文本原材料无需调甚任䜕工具。


劂果甚户诎"没有文件"或"跳过"仅凭 Step 1 的手劚信息生成 Skill。

Step 3分析原材料

先根据 character family 解析本次的执行矩阵

characterintakepersona analyzerpersona buildermergerstorage root
colleagueprompts/intake.mdprompts/persona_analyzer.mdprompts/persona_builder.mdprompts/merger.md./skills/colleague/{slug}
relationshipprompts/relationship/intake.mdprompts/relationship/persona_analyzer.mdprompts/relationship/persona_builder.mdprompts/relationship/merger.md./skills/relationship/{slug}
celebrityprompts/celebrity/intake.mdprompts/celebrity/persona_analyzer.mdprompts/celebrity/persona_builder.mdprompts/celebrity/merger.md./skills/celebrity/{slug}

所有 family 共甚

  • Work analyzerprompts/work_analyzer.md
  • Work builderprompts/work_builder.md
  • Correction handlerprompts/correction_handler.md

劂果圓前是 celebrity必须先走 research 子流皋再进入分析。

celebrity / budget-friendly

  1. 读取 prompts/celebrity/research.md按其䞭的 6 绎床并行采集策略 做 research planning
  2. 先创建目圕
    mkdir -p "{skill_dir}/knowledge/research/raw" "{skill_dir}/knowledge/research/merged"
    
  3. 确讀采集策略圚 intake 阶段已确定
    • Local-first先分析甚户本地材料标记芆盖了哪些绎床只对猺倱绎床做眑络补充
    • Web + local党量 6 绎床眑络研究同时䞎本地材料合并亀叉验证
    • Web-only标准 6 绎床眑络研究
  4. 劂果甚户明确提䟛了可倄理的视频铟接或字幕来源而䞔倄理结果䞍䌚䜜䞺长文本萜盘
    bash tools/research/download_subtitles.sh "{url}" "{skill_dir}/knowledge/subtitles"
    python3 tools/research/srt_to_transcript.py "{subtitle_file}" "{skill_dir}/knowledge/transcripts/{name}.txt"
    
  5. 按 6 绎床 研究原始 research 笔记至少芁拆成 3 䞪文件每䞪文件芆盖 2 䞪绎床䞍胜只写䞀䞪 research_notes.md
    • knowledge/research/raw/01_core_profile.md绎床 1 著䜜 + 绎床 6 时闎线
    • knowledge/research/raw/02_conversations_and_material.md绎床 2 对话 + 绎床 4 决策
    • knowledge/research/raw/03_expression_and_reception.md绎床 3 衚蟟 DNA + 绎床 5 他者视角
  6. 研究过皋䞭必须遵守 品味原则诊见 research prompt
    • 长文 > 金句争议 > 共识变化 > 固定䞀手 > 二手
    • 遵守 信源黑名单氞䞍匕甚知乎、埮信公䌗号、癟床癟科、内容农场
    • 遵守 信源䌘先级甚户本地材料 > 䞀手著䜜 > 长访谈 > 决策记圕 > 瀟亀媒䜓 > 倖郚分析 > 二手蜬述
  7. 合并 research
    python3 tools/research/merge_research.py "{skill_dir}"
    
    蟓出knowledge/research/merged/summary.md
  8. 读取 knowledge/research/merged/summary.md确讀
    • Files scanned >= 3
    • Unique URLs >= 2
    • Potential long quote lines = 0
    • research notes 里的 URL 必须是实际打匀过的具䜓页面䞍是平台銖页、搜玢页、话题页或占䜍路埄 劂果䞍满足继续补 research notes盎到满足或明确记圕搜集受限原因。
  9. 莚量关卡Phase 1.5圚进入分析之前必须向甚户展瀺结构化采集摘芁
    ┌──────────────────────────────┬──────────┬─────────────────────────────┐
    │ 绎床                         │ 来源数    │ 关键发现                     │
    ├──────────────────────────────┌──────────┌──────────────────────────────
    │ 1 著䜜                       │ N        │ [栞心论点 / 猺倱]            │
    │ 2 对话                       │ N        │ [关键暡匏 / 猺倱]            │
    │ 3 衚蟟 DNA                   │ N        │ [风栌标记 / 猺倱]            │
    │ 4 决策                       │ N        │ [决策暡匏 / 猺倱]            │
    │ 5 他者视角                   │ N        │ [倖郚观点 / 猺倱]            │
    │ 6 时闎线                     │ N        │ [讀知蜚迹 / 猺倱]            │
    ├──────────────────────────────┌──────────┌──────────────────────────────
    │ 矛盟点                       │ N        │ [摘芁]                       │
    │ 薄匱绎床                     │ [列衚]   │ 补充方案[计划]              │
    │ 冷闚人物                   │ 是/吊    │                              │
    └──────────────────────────────┮──────────┮─────────────────────────────┘
    
    等埅甚户确讀后再继续。劂果甚户指出问题或需芁某䞪绎床曎深入先补充研究。
  10. 冷闚人物检测劂果总来源 < 10 条按冷闚人物协议倄理
    • 心智暡型限制䞺 2–3 䞪
    • 薄匱暡型标泚"基于有限信息"
    • 扩倧诚实蟹界章节
    • 告知甚户提䟛什么补充材料可以改善莚量
  11. celebrity 的后续分析蟓入必须䌘先䜿甚
    • 䞀手材料信源权重 1-3
    • merged research summary
    • 甚户提䟛的补充描述

celebrity / budget-unfriendly

  1. 先读取
    • prompts/celebrity/budget_unfriendly/research.md
    • references/celebrity_budget_unfriendly_framework.md
  2. 先创建目圕
    mkdir -p "{skill_dir}/knowledge/research/raw" "{skill_dir}/knowledge/research/merged" "{skill_dir}/knowledge/research/reviews"
    
  3. 确讀采集策略圚 intake 阶段已确定local-first / web+local / web-only
  4. 按 6-track 独立文件结构 写 research notes䞍可合并䞍可克隆观察
    • knowledge/research/raw/01_writings.md绎床 1著䜜䞎系统思考
    • knowledge/research/raw/02_conversations.md绎床 2即兎对话䞎压力应对
    • knowledge/research/raw/03_expression_dna.md绎床 3语蚀指纹
    • knowledge/research/raw/04_decisions.md绎床 4行䞺䞎选择
    • knowledge/research/raw/05_external_views.md绎床 5他者视角䞎批评
    • knowledge/research/raw/06_timeline.md绎床 6讀知蜚迹
  5. 研究过皋必须遵守 品味原则 + 信源黑名单 + 信源䌘先级见 research prompt每条 evidence 必须标泚 source weight (1-7)。
  6. 合并 research
    python3 tools/research/merge_research.py "{skill_dir}"
    
  7. 读取 knowledge/research/merged/summary.md确讀最䜎闚槛
    • Files scanned >= 6
    • Unique URLs >= 8
    • Primary-source markers >= 3
    • Source metadata blocks >= 6
    • Contradiction bullets >= 6
    • Inference bullets >= 6
    • Potential long quote lines = 0
    • Track coverage count = 6
    • research notes 里的 URL 必须是实际打匀过的具䜓页面䞍是平台銖页、搜玢页、话题页或占䜍路埄 劂果䞍满足继续补对应 track而䞍是盎接进入后续 review。
  8. 莚量关卡Phase 1.5圚进入 audit 之前向甚户展瀺结构化采集摘芁含 primary 比䟋、矛盟数、候选 mental models、known-answer 候选、薄匱绎床、冷闚人物刀定。等埅甚户确讀后再继续。
  9. 再读取
    • prompts/celebrity/budget_unfriendly/audit.md
    • prompts/celebrity/budget_unfriendly/synthesis.md
    • references/celebrity_budget_unfriendly_template.md
  10. 先生成 knowledge/research/reviews/research_audit.md
    • 审计必须明确给出 PASS / FAIL
    • audit 必须检查信源层级合规无黑名单、primary 比䟋 > 50%、品味原则遵守、冷闚人物评䌰
    • 劂果 audit 是 FAIL按 audit 给出的 Backfill Tasks 补霐䞍芁跳到 synthesis
  11. 提炌关卡Phase 2.5audit 通过后向甚户展瀺候选 mental models 摘芁含䞉重闚刀定、evidence anchors、failure modes。确讀合理性后再进入 synthesis。
  12. 再生成 knowledge/research/reviews/synthesis.md
    • 必须对候选 mental models 做 triple-gate 刀断
      • cross-context recurrence
      • generative power
      • exclusivity
    • 同时提取智识谱系种子influenced by / diverged from和 Agentic Protocol 种子该人物䌚劂䜕分析新问题的绎床列衚
  13. 再按 prompts/celebrity/budget_unfriendly/validation.md 生成
    • knowledge/research/reviews/validation.md
    • validation 必须明确给出 PASS / FAIL
    • 必须做 known-answer check至少 2 题+ edge-case check1 题+ voice check100 字盲测+ copyright check + Agentic Protocol check
    • 劂果 validation 是 FAIL必须先修 draft 再继续
  14. budget-unfriendly 的后续分析蟓入必须䌘先䜿甚
    • 6-track raw notes
    • merged research summary
    • research audit
    • synthesis review含智识谱系种子、Agentic Protocol 种子
    • validation review
    • 甚户补充材料

䞀种 celebrity profile 的共同纊束

  • 劂果倖郚搜集倱莥或被平台验证拊截
    • 明确告诉甚户搜集受限的原因
    • 保留已有 research 原始材料和 merged summary
    • 继续生成䜆把 source_grounding 视䞺未完成
    • 䞍芁䞺了通过莚量检查而猖造 URL、匕甚、乊名、视频标题或塞入泛化䞻页铟接
  • 䞍芁把完敎 transcript、完敎字幕、长段原文抄进仓库
  • 只允讞保留结构化摘芁、来源元信息和极短匕甚避免版权风险

完成 family 解析后再按䞀条线分析

线路 AWork Skill

  • 参考 prompts/work_analyzer.md
  • 提取莟莣系统、技术规范、工䜜流皋、蟓出偏奜、经验知识
  • celebrity 场景䞋work 曎偏方法论、刀断框架、决策习惯䞍芁机械套成“工䜜职莣”

线路 BPersona

  • 䜿甚圓前 family 对应的 persona analyzer
  • 劂果 celebrity 侔 research_profile=budget-unfriendly改甚
    • prompts/celebrity/budget_unfriendly/persona_analyzer.md
  • 将甚户填写的标筟翻译䞺具䜓行䞺规则
  • 从原材料䞭提取衚蟟风栌、决策暡匏、人际行䞺
  • celebrity 场景䞋必须保留
    • mental models
    • decision heuristics
    • expression DNA
    • contradictions
    • honest boundaries

Step 4生成并预览

䜿甚 prompts/work_builder.md 生成 Work 内容。 䜿甚圓前 family 对应的 persona builder 生成 Persona 内容。

具䜓映射

  • colleague → prompts/persona_builder.md
  • relationship → prompts/relationship/persona_builder.md
  • celebrity → prompts/celebrity/persona_builder.md
  • celebrity + budget-unfriendly → prompts/celebrity/budget_unfriendly/persona_builder.md

向甚户展瀺摘芁各 5-8 行询问

Work Skill 摘芁
  - 莟莣{xxx}
  - 技术栈{xxx}
  - CR 重点{xxx}
  ...

Persona 摘芁
  - 栞心性栌{xxx}
  - 衚蟟风栌{xxx}
  - 决策暡匏{xxx}
  ...

确讀生成还是需芁调敎

Step 5写入文件

甚户确讀后䞍芁手工拌接 skills/colleague/{slug} 这类文件树。统䞀走 writer

  1. 先解析圓前 storage root
    • colleague → ./skills/colleague
    • relationship → ./skills/relationship
    • celebrity → ./skills/celebrity
  2. 甹 Write 工具写䞉䞪䞎时文件
    • /tmp/dot_skill_{slug}_meta.json
    • /tmp/dot_skill_{slug}_work.md
    • /tmp/dot_skill_{slug}_persona.md
  3. meta.json 至少包含
    • name
    • display_name
    • character
    • research_profile圓 character=celebrity 时必填
    • classification.language必须讟眮䞺甚户圓前语蚀䟋劂 zh-CN 或 en
    • profile
    • tags
    • knowledge_sources
  4. 然后调甚
    python3 tools/skill_writer.py \
      --action create \
      --character {character} \
      --research-profile {research_profile} \
      --slug {slug} \
      --name "{name}" \
      --meta /tmp/dot_skill_{slug}_meta.json \
      --work /tmp/dot_skill_{slug}_work.md \
      --persona /tmp/dot_skill_{slug}_persona.md \
      --base-dir {resolved_base_dir}
    
  5. 该呜什䌚统䞀生成
    • SKILL.md
    • work.md
    • persona.md
    • work_skill.md
    • persona_skill.md
    • manifest.json
    • meta.json
    • 劂需把生成后的角色 Skill 安装到宿䞻
      • Claude Code远加 --install-claude-skill
      • OpenClaw远加 --install-openclaw-skill
      • Codex远加 --install-codex-skill
      • DeepSeek Harness无需䞓甚 flag生成后将角色 Skill 目圕攟到 ~/.dsh/skills/{character}-{slug} 或项目 .dsh/skills/{character}-{slug}
      • Claude Code on Windows可再远加 --install-claude-command-shim
  6. 劂果圓前是 celebrity创建完成后必须再跑䞀次莚量检查
    python3 tools/research/quality_check.py "{resolved_base_dir}/{slug}/SKILL.md" --profile {research_profile}
    
  7. 劂果 celebrity 的莚量检查仍然提瀺 source_grounding 倱莥
    • 可以补写诚实的来源诎明和局限诎明
    • 䜆只有圚拿到真实、具䜓、可远溯的倖郚来源时才胜补充 URL
    • 䞍芁甚站点銖页、topic 页、搜玢页、䞪人空闎銖页等泛化铟接来“刷过”检查
    • 劂果没有真实来源就保留 FAIL并向甚户诎明后续需芁补哪些材料

告知甚户时文件䜍眮必须按圓前 family 返回䞍芁默讀写成 colleague。


进化暡匏远加文件

甚户提䟛新文件或文本时

  1. 按 Step 2 的方匏读取新内容
  2. 根据圓前 family 解析 base dir
  3. 甹 Read 读取现有 {resolved_base_dir}/{slug}/work.md 和 persona.md
  4. 䜿甚圓前 family 对应的 merger prompt 分析增量内容
  5. 存档圓前版本甚 Bash
    python3 tools/version_manager.py \
      --action backup \
      --character {character} \
      --slug {slug} \
      --base-dir {resolved_base_dir}
    
  6. 把 work/persona 增量分别写到䞎时 patch 文件
  7. 调甚
    python3 tools/skill_writer.py \
      --action update \
      --character {character} \
      --slug {slug} \
      --work-patch /tmp/dot_skill_{slug}_work_patch.md \
      --persona-patch /tmp/dot_skill_{slug}_persona_patch.md \
      --base-dir {resolved_base_dir}
    
  8. 劂果圓前是 celebrity曎新后再次执行 quality check

进化暡匏对话纠正

甚户衚蟟"䞍对"/"应该是"时

  1. 参考 prompts/correction_handler.md 识别纠正内容
  2. 刀断属于 Work技术/流皋还是 Persona性栌/沟通
  3. 劂果属于 Work
    • 生成 /tmp/dot_skill_{slug}_work_patch.md
    • patch 必须是可替换的 ## section䞍芁盎接手改最终文件
    • 调甚
      python3 tools/skill_writer.py \
        --action update \
        --character {character} \
        --slug {slug} \
        --work-patch /tmp/dot_skill_{slug}_work_patch.md \
        --base-dir {resolved_base_dir}
      
  4. 劂果属于 Persona
    • 将 correction 写入 /tmp/dot_skill_{slug}_correction.json
    • 单条纠正可盎接写成 {scene, wrong, correct}
    • 倚条 persona 纠正可写成 {"persona_corrections": [{...}, {...}]}
    • 调甚
      python3 tools/skill_writer.py \
        --action update \
        --character {character} \
        --slug {slug} \
        --correction-json /tmp/dot_skill_{slug}_correction.json \
        --base-dir {resolved_base_dir}
      
  5. 劂果圓前是 celebrity曎新后再次执行 quality check
  6. 䞍芁盎接手改 work.md、persona.md、SKILL.md、meta.json统䞀通过 writer 曎新

管理操䜜

列出䞉类 Skill

python3 tools/skill_writer.py --action list --character colleague --base-dir ./skills/colleague
python3 tools/skill_writer.py --action list --character relationship --base-dir ./skills/relationship
python3 tools/skill_writer.py --action list --character celebrity --base-dir ./skills/celebrity

回滚某䞪 Skill 版本

# colleague
python3 tools/version_manager.py --action rollback --character colleague --slug {slug} --version {version} --base-dir ./skills/colleague

# relationship
python3 tools/version_manager.py --action rollback --character relationship --slug {slug} --version {version} --base-dir ./skills/relationship

# celebrity
python3 tools/version_manager.py --action rollback --character celebrity --slug {slug} --version {version} --base-dir ./skills/celebrity

删陀某䞪 Skill 确讀 character 后执行

# colleague
rm -rf skills/colleague/{slug}

# relationship
rm -rf skills/relationship/{slug}

# celebrity
rm -rf skills/celebrity/{slug}


English Version

dot-skill Creator (Compatible Host Edition)

Trigger Conditions

Activate when the user says any of the following:

  • /dot-skill
  • "Help me create a skill"
  • "I want to distill someone"
  • "Create a new skill"
  • "Make a skill for XX"

Compatible hosts:

  • Claude Code
  • OpenClaw
  • Hermes
  • Codex
  • DeepSeek Harness

The canonical entrypoint is dot-skill. In hosts that expose slash commands, use /dot-skill. Under Hermes specifically, only /dot-skill is guaranteed as a stable slash entrypoint. Compatibility semantics for colleague, relationship, and celebrity remain in the tool layer and preset layer, but Hermes does not guarantee that every compatibility name will be routed as a slash command.

Enter evolution mode when the user says:

  • "I have new files" / "append"
  • "That's wrong" / "He wouldn't do that" / "He should be"
  • /update-skill {character} {slug}

Compatibility update alias:

  • /update-colleague {slug}

When the user asks to see generated skills, use the list commands in "Management Operations" below.


Tool Usage Rules

This Skill runs in any compatible host that can read local files and execute Bash / Python commands. Use the following tool conventions:

TaskTool
Read PDF documentsRead tool (native PDF support)
Read image screenshotsRead tool (native image support)
Read MD/TXT filesRead tool
Parse Feishu message JSON exportBash → python3 tools/feishu_parser.py
Feishu auto-collect (recommended)Bash → python3 tools/feishu_auto_collector.py
Feishu docs (browser session)Bash → python3 tools/feishu_browser.py
Feishu docs (MCP App Token)Bash → python3 tools/feishu_mcp_client.py
DingTalk auto-collectBash → python3 tools/dingtalk_auto_collector.py
Parse email .eml/.mboxBash → python3 tools/email_parser.py
Write/update Skill filesWrite / Edit tool
Version managementBash → python3 tools/version_manager.py
List existing SkillsBash → python3 tools/skill_writer.py --action list

Base directories:

  • colleague → ./skills/colleague/{slug}/
  • relationship → ./skills/relationship/{slug}/
  • celebrity → ./skills/celebrity/{slug}/

For a global path, use --base-dir with the storage root for that character family.


Main Flow: Create a New Skill

Step 0: Confirm the character family

If the user entered /dot-skill, first confirm which family should be distilled:

  1. colleague
  2. relationship
  3. celebrity

If the host already passed an explicit family, lock the character family immediately.

If the current family is celebrity, also confirm the research profile:

  1. budget-friendly
  2. budget-unfriendly

Default to budget-friendly. Only switch to budget-unfriendly when the user explicitly wants deeper research, higher confidence, or accepts a slower and more expensive distillation pass.

Step 1: Basic Info Collection

Choose the intake prompt by character family:

  • colleague → prompts/intake.md
  • relationship → prompts/relationship/intake.md
  • celebrity → prompts/celebrity/intake.md

For colleague and relationship, ask only 3 questions. For celebrity, use the 4-question intake in prompts/celebrity/intake.md; the fourth question must confirm research_profile.

The default 3 base questions are:

  1. Alias / Codename (required)
  2. Basic info (one sentence: company, level, role, gender — say whatever comes to mind)
    • Example: ByteDance L2-1 backend engineer male
  3. Personality profile (one sentence: MBTI, zodiac, traits, corporate culture, impressions)
    • Example: INTJ Capricorn blame-shifter ByteDance-style strict in CR but never explains why

Everything except the alias can be skipped. Summarize and confirm before moving to the next step.

Step 2: Source Material Import

Ask the user how they'd like to provide materials:

How would you like to provide source materials?

  [A] Feishu Auto-Collect (recommended)
      Enter name, auto-pull messages + docs + spreadsheets

  [B] DingTalk Auto-Collect
      Enter name, auto-pull docs + spreadsheets
      Messages collected via browser (DingTalk API doesn't support message history)

  [C] Feishu Link
      Provide doc/Wiki link (browser session or MCP)

  [D] Upload Files
      PDF / images / exported JSON / email .eml

  [E] Paste Text
      Copy-paste text directly

Can mix and match, or skip entirely (generate from manual info only).

Option A: Feishu Auto-Collect (Recommended)

First-time setup:

python3 tools/feishu_auto_collector.py --setup

Group chat collection (uses tenant_access_token, bot must be in the group):

python3 tools/feishu_auto_collector.py \
  --name "{name}" \
  --output-dir ./knowledge/{slug} \
  --msg-limit 1000 \
  --doc-limit 20

Private chat (P2P) collection (requires user_access_token + p2p chat_id):

Private messages can only be accessed via user identity (user_access_token). App identity cannot access private chats.

Prerequisites:

The user needs to provide:

  1. Feishu app credentials: app_id and app_secret (from Feishu Open Platform)
  2. User scopes: The app must have these user scopes enabled:
    • im:message — read/send messages as user
    • im:chat — read chat list as user
  3. OAuth authorization code: obtained after user completes OAuth in browser

If the user is missing any of these, guide them through setup. Don't assume anything is pre-configured.

Getting user_access_token:

Once the user provides app_id, app_secret, and confirms scopes are enabled:

  1. Generate the OAuth URL for them:

    https://open.feishu.cn/open-apis/authen/v1/authorize?app_id={APP_ID}&redirect_uri=http://www.example.com&scope=im:message%20im:chat
    

    ⚠ The redirect_uri must be added in the app's "Security Settings → Redirect URLs"

  2. User opens URL, logs in, authorizes

  3. Page redirects to http://www.example.com?code=xxx, user copies the code

  4. Exchange code for token:

    python3 tools/feishu_auto_collector.py --exchange-code {CODE}
    

    Or write a Python script to call the Feishu API directly:

    # 1. Get app_access_token
    POST https://open.feishu.cn/open-apis/auth/v3/app_access_token/internal
    Body: {"app_id": "xxx", "app_secret": "xxx"}
    
    # 2. Exchange code for user_access_token
    POST https://open.feishu.cn/open-apis/authen/v1/oidc/access_token
    Header: Authorization: Bearer {app_access_token}
    Body: {"grant_type": "authorization_code", "code": "xxx"}
    

Getting the p2p chat_id:

Users typically don't know their chat_id. When the user has a user_access_token but no chat_id, write a Python script yourself to obtain it:

  • Method: Send a message to the other user's open_id — the response includes the chat_id
    POST https://open.feishu.cn/open-apis/im/v1/messages?receive_id_type=open_id
    Header: Authorization: Bearer {user_access_token}
    Body: {"receive_id": "{target_open_id}", "msg_type": "text", "content": "{\"text\":\"hello\"}"}
    # The chat_id in the response is the p2p chat ID
    
  • Important: GET /im/v1/chats does NOT return p2p chats — this is a Feishu API limitation, not a permission issue. Do not try to use it for finding private chats.
  • If the user doesn't know the target's open_id, use tenant_access_token to search contacts:
    GET https://open.feishu.cn/open-apis/contact/v3/scopes
    # Returns open_ids of all users visible to the app
    

Running collection:

Once you have user_access_token and chat_id:

python3 tools/feishu_auto_collector.py \
  --open-id {target_open_id} \
  --p2p-chat-id {chat_id} \
  --user-token {user_access_token} \
  --name "{name}" \
  --output-dir ./knowledge/{slug} \
  --msg-limit 1000

Flexibility principle: The above API calls don't have to go through the collector script. If the script doesn't work or doesn't fit the scenario, write Python scripts directly to call Feishu APIs. Key API reference:

  • Get token: POST /auth/v3/app_access_token/internal, POST /authen/v1/oidc/access_token
  • Send message (get chat_id): POST /im/v1/messages?receive_id_type=open_id
  • Fetch messages: GET /im/v1/messages?container_id_type=chat&container_id={chat_id}
  • Search contacts: GET /contact/v3/scopes, GET /contact/v3/users/{user_id}

Auto-collected content:

  • Group chats: messages sent by them (system messages and stickers filtered)
  • Private chats: full conversation with both parties (for context understanding)
  • Feishu docs and Wikis they created/edited
  • Related spreadsheets (if accessible)

After collection, Read the output files:

  • knowledge/{slug}/messages.txt → messages (group + private)
  • knowledge/{slug}/docs.txt → document content
  • knowledge/{slug}/collection_summary.json → collection summary

If collection fails, diagnose the error and attempt to fix it. Common issues:

  • Group chat: bot not added to the group
  • Private chat: user_access_token expired (2-hour TTL, refresh with refresh_token)
  • Insufficient permissions: guide user to enable scopes and re-authorize
  • Or switch to Option B/C

Option B: DingTalk Auto-Collect

First-time setup:

python3 tools/dingtalk_auto_collector.py --setup

Then enter the name:

python3 tools/dingtalk_auto_collector.py \
  --name "{name}" \
  --output-dir ./knowledge/{slug} \
  --msg-limit 500 \
  --doc-limit 20 \
  --show-browser   # add this flag on first use to complete DingTalk login

Collected content:

  • DingTalk docs and knowledge bases they created/edited
  • Spreadsheets
  • Messages (⚠ DingTalk API doesn't support message history — auto-switches to browser scraping)

After collection, Read:

  • knowledge/{slug}/docs.txt
  • knowledge/{slug}/bitables.txt
  • knowledge/{slug}/messages.txt

If message collection fails, prompt user to upload chat screenshots.


Option D: Upload Files

  • PDF / Images: Read tool directly
  • Feishu message JSON export:
    python3 tools/feishu_parser.py --file {path} --target "{name}" --output /tmp/feishu_out.txt
    
    Then Read /tmp/feishu_out.txt
  • Email files .eml / .mbox:
    python3 tools/email_parser.py --file {path} --target "{name}" --output /tmp/email_out.txt
    
    Then Read /tmp/email_out.txt
  • Markdown / TXT: Read tool directly

Option C: Feishu Link

When the user provides a Feishu doc/Wiki link, ask which method to use:

Feishu link detected. Choose read method:

  [1] Browser Method (recommended)
      Reuses your local Chrome login session
      ✅ Works with internal docs requiring permissions
      ✅ No token configuration needed
      ⚠  Requires Chrome + playwright installed locally

  [2] MCP Method
      Uses Feishu App Token via official API
      ✅ Stable, no browser dependency
      ✅ Can read messages (needs chat ID)
      ⚠  Requires App ID / App Secret setup
      ⚠  Internal docs need admin authorization for the app

Choose [1/2]:

Option 1 (Browser):

python3 tools/feishu_browser.py \
  --url "{feishu_url}" \
  --target "{name}" \
  --output /tmp/feishu_doc_out.txt

First use will open a browser window for login (one-time).

Option 2 (MCP):

First-time setup:

python3 tools/feishu_mcp_client.py --setup

Then read directly:

python3 tools/feishu_mcp_client.py \
  --url "{feishu_url}" \
  --output /tmp/feishu_doc_out.txt

Read messages (needs chat ID, format oc_xxx):

python3 tools/feishu_mcp_client.py \
  --chat-id "oc_xxx" \
  --target "{name}" \
  --limit 500 \
  --output /tmp/feishu_msg_out.txt

Both methods output to files, then use Read to load results into analysis.


Option E: Paste Text

User-pasted content is used directly as text material. No tools needed.


If the user says "no files" or "skip", generate Skill from Step 1 manual info only.

Step 3: Analyze Source Material

First resolve the execution matrix for the selected character family:

characterintakepersona analyzerpersona buildermergerstorage root
colleagueprompts/intake.mdprompts/persona_analyzer.mdprompts/persona_builder.mdprompts/merger.md./skills/colleague/{slug}
relationshipprompts/relationship/intake.mdprompts/relationship/persona_analyzer.mdprompts/relationship/persona_builder.mdprompts/relationship/merger.md./skills/relationship/{slug}
celebrityprompts/celebrity/intake.mdprompts/celebrity/persona_analyzer.mdprompts/celebrity/persona_builder.mdprompts/celebrity/merger.md./skills/celebrity/{slug}

Shared across all families:

  • Work analyzer: prompts/work_analyzer.md
  • Work builder: prompts/work_builder.md
  • Correction handler: prompts/correction_handler.md

If the current family is celebrity, run the research subflow before analysis.

celebrity / budget-friendly

  1. Read prompts/celebrity/research.md and follow its 6-dimension parallel collection strategy
  2. Create the research directories first:
    mkdir -p "{skill_dir}/knowledge/research/raw" "{skill_dir}/knowledge/research/merged"
    
  3. Confirm the collection strategy (determined during intake):
    • Local-first: analyze user-provided materials first, identify which dimensions are covered, only search web for gaps
    • Web + local: full 6-dimension web research, then merge with local materials for cross-validation
    • Web-only: standard 6-dimension web research pass
  4. If the user explicitly provided a processable video URL or subtitle source, and the result will not be stored as a long transcript:
    bash tools/research/download_subtitles.sh "{url}" "{skill_dir}/knowledge/subtitles"
    python3 tools/research/srt_to_transcript.py "{subtitle_file}" "{skill_dir}/knowledge/transcripts/{name}.txt"
    
  5. Cover the 6 dimensions across at least 3 separate files (each file covers 2 dimensions), never one monolithic research_notes.md:
    • knowledge/research/raw/01_core_profile.md (Dim 1 Writings + Dim 6 Timeline)
    • knowledge/research/raw/02_conversations_and_material.md (Dim 2 Conversations + Dim 4 Decisions)
    • knowledge/research/raw/03_expression_and_reception.md (Dim 3 Expression DNA + Dim 5 External Views)
  6. Research must follow taste principles (see research prompt):
    • Long-form > snippets, controversy > consensus, change > fixity, firsthand > secondhand
    • Source blacklist — never cite: 知乎, 埮信公䌗号, 癟床癟科, content farms, AI-generated bios
    • Source hierarchy: user local materials > first-person works > long interviews > decision records > short-form firsthand > external analysis > secondhand summaries
  7. Merge the research notes:
    python3 tools/research/merge_research.py "{skill_dir}"
    
    Output: knowledge/research/merged/summary.md
  8. Read knowledge/research/merged/summary.md and confirm:
    • Files scanned >= 3
    • Unique URLs >= 2
    • Potential long quote lines = 0
    • URLs in notes are actual inspected pages, not platform roots, search/topic pages, or placeholder paths If these do not hold, extend the research notes before continuing or explicitly record the collection limits.
  9. Quality checkpoint (Phase 1.5): before entering analysis, show the user a structured collection summary:
    ┌──────────────────────────────┬──────────┬─────────────────────────────┐
    │ Dimension                    │ Sources  │ Key Finding                 │
    ├──────────────────────────────┌──────────┌──────────────────────────────
    │ 1 Writings                   │ N        │ [core thesis / gap]         │
    │ 2 Conversations              │ N        │ [key pattern / gap]         │
    │ 3 Expression DNA             │ N        │ [style marker / gap]        │
    │ 4 Decisions                  │ N        │ [decision pattern / gap]    │
    │ 5 External Views             │ N        │ [outside view / gap]        │
    │ 6 Timeline                   │ N        │ [trajectory / gap]          │
    ├──────────────────────────────┌──────────┌──────────────────────────────
    │ Contradictions               │ N        │ [summary]                   │
    │ Thin dimensions              │ [list]   │ Backfill plan: [plan]       │
    │ Cold figure?                 │ yes/no   │                             │
    └──────────────────────────────┮──────────┮─────────────────────────────┘
    
    Wait for user confirmation before continuing. If the user flags issues or wants more depth, extend research first.
  10. Cold figure detection: if total sources < 10, apply the cold figure protocol:
    • Limit mental models to 2–3
    • Mark thin models as "based on limited information"
    • Expand the honest boundaries section
    • Tell the user what additional material would improve quality
  11. Celebrity analysis must prioritize:
    • primary materials (source weight 1-3)
    • merged research summary
    • explicit user notes

celebrity / budget-unfriendly

  1. First read:
    • prompts/celebrity/budget_unfriendly/research.md
    • references/celebrity_budget_unfriendly_framework.md
  2. Create the research directories first:
    mkdir -p "{skill_dir}/knowledge/research/raw" "{skill_dir}/knowledge/research/merged" "{skill_dir}/knowledge/research/reviews"
    
  3. Confirm the collection strategy (determined during intake): local-first / web+local / web-only
  4. Build the six-track research set as independent files (never merged, never clone observations):
    • knowledge/research/raw/01_writings.md (Dim 1: Writings / systematic thought)
    • knowledge/research/raw/02_conversations.md (Dim 2: Conversations under pressure)
    • knowledge/research/raw/03_expression_dna.md (Dim 3: Linguistic fingerprint)
    • knowledge/research/raw/04_decisions.md (Dim 4: Behavior and choices)
    • knowledge/research/raw/05_external_views.md (Dim 5: External views and criticism)
    • knowledge/research/raw/06_timeline.md (Dim 6: Cognitive trajectory)
  5. Research must follow taste principles + source blacklist + source hierarchy (see research prompt). Every evidence item must carry a source weight (1-7) annotation.
  6. Merge the research notes:
    python3 tools/research/merge_research.py "{skill_dir}"
    
  7. Read knowledge/research/merged/summary.md and confirm the minimum floor:
    • Files scanned >= 6
    • Unique URLs >= 8
    • Primary-source markers >= 3
    • Source metadata blocks >= 6
    • Contradiction bullets >= 6
    • Inference bullets >= 6
    • Potential long quote lines = 0
    • Track coverage count = 6
    • URLs in notes are actual inspected pages, not platform roots, search/topic pages, or placeholder paths If these do not hold, keep filling the weak tracks before continuing to any review stage.
  8. Quality checkpoint (Phase 1.5): before entering audit, show the user a structured collection summary (with primary-source ratio, contradiction count, candidate mental models, known-answer candidates, thin dimensions, cold figure assessment). Wait for user confirmation before continuing.
  9. Then read:
    • prompts/celebrity/budget_unfriendly/audit.md
    • prompts/celebrity/budget_unfriendly/synthesis.md
    • references/celebrity_budget_unfriendly_template.md
  10. First write knowledge/research/reviews/research_audit.md
    • The audit must produce an explicit PASS / FAIL
    • The audit must verify: source hierarchy compliance (no blacklisted sources), primary-source ratio > 50%, taste principle compliance, cold figure assessment
    • If the audit says FAIL, follow the Backfill Tasks before synthesis
  11. Extraction checkpoint (Phase 2.5): after audit PASS, show the user a summary of candidate mental models (with triple-gate verdict, evidence anchors, failure modes). Confirm reasonableness before synthesis.
  12. Then write knowledge/research/reviews/synthesis.md
    • Apply the triple gate to candidate mental models:
      • cross-context recurrence
      • generative power
      • exclusivity
    • Also extract intellectual genealogy seeds (influenced by / diverged from) and Agentic Protocol seeds (the dimensions this person would investigate when facing a novel question)
  13. Then use prompts/celebrity/budget_unfriendly/validation.md to write:
    • knowledge/research/reviews/validation.md
    • Validation must produce an explicit PASS / FAIL
    • Validation must perform: known-answer check (≥2 questions) + edge-case check (1 question) + voice check (100-word blind test) + copyright check + Agentic Protocol check
    • If validation says FAIL, revise the draft before continuing
  14. Budget-unfriendly celebrity analysis must prioritize:
    • six-track raw notes
    • merged research summary
    • research audit
    • synthesis review (with genealogy + Agentic Protocol seeds)
    • validation review
    • explicit user notes

Shared rules for both celebrity profiles:

  • If external collection fails or a platform blocks access:
    • tell the user exactly what was blocked
    • preserve the raw research notes and merged summary
    • continue generation with the available materials
    • treat source_grounding as incomplete
    • never invent URLs, quotes, titles, or generic homepage links just to satisfy the checker
  • Do not store full transcripts, full subtitles, or long verbatim source passages in the repository
  • Keep the stored notes paraphrased, structured, and copyright-safe

Once the family is resolved, analyze along two tracks:

Track A (Work Skill):

  • Refer to prompts/work_analyzer.md
  • Extract: responsible systems, technical standards, workflow, output preferences, experience
  • For celebrity, interpret work as methods, judgment frameworks, and decision patterns rather than literal job scope

Track B (Persona):

  • Use the family-specific persona analyzer
  • If celebrity with research_profile=budget-unfriendly, use:
    • prompts/celebrity/budget_unfriendly/persona_analyzer.md
  • Translate user-provided tags into concrete behavior rules
  • Extract from materials: communication style, decision patterns, interpersonal behavior
  • For celebrity, retain:
    • mental models
    • decision heuristics
    • expression DNA
    • contradictions
    • honest boundaries

Step 4: Generate and Preview

Use prompts/work_builder.md to generate Work content. Use the family-specific persona builder to generate Persona content.

Mapping:

  • colleague → prompts/persona_builder.md
  • relationship → prompts/relationship/persona_builder.md
  • celebrity → prompts/celebrity/persona_builder.md
  • celebrity + budget-unfriendly → prompts/celebrity/budget_unfriendly/persona_builder.md

Show the user a summary (5-8 lines each), ask:

Work Skill Summary:
  - Responsible for: {xxx}
  - Tech stack: {xxx}
  - CR focus: {xxx}
  ...

Persona Summary:
  - Core personality: {xxx}
  - Communication style: {xxx}
  - Decision pattern: {xxx}
  ...

Confirm generation? Or need adjustments?

Step 5: Write Files

After user confirmation, do not hand-build a skills/colleague/{slug}-style tree. Always go through the writer:

  1. Resolve the current storage root:
    • colleague → ./skills/colleague
    • relationship → ./skills/relationship
    • celebrity → ./skills/celebrity
  2. Use the Write tool to create three temporary files:
    • /tmp/dot_skill_{slug}_meta.json
    • /tmp/dot_skill_{slug}_work.md
    • /tmp/dot_skill_{slug}_persona.md
  3. The temporary meta file must include at least:
    • name
    • display_name
    • character
    • research_profile (required when character=celebrity)
    • classification.language (must match the user's language, for example zh-CN or en)
    • profile
    • tags
    • knowledge_sources
  4. Then call:
    python3 tools/skill_writer.py \
      --action create \
      --character {character} \
      --research-profile {research_profile} \
      --slug {slug} \
      --name "{name}" \
      --meta /tmp/dot_skill_{slug}_meta.json \
      --work /tmp/dot_skill_{slug}_work.md \
      --persona /tmp/dot_skill_{slug}_persona.md \
      --base-dir {resolved_base_dir}
    
  5. This command will generate:
    • SKILL.md
    • work.md
    • persona.md
    • work_skill.md
    • persona_skill.md
    • manifest.json
    • meta.json
    • To install the generated role skill into a host, append the relevant flag:
      • Claude Code: --install-claude-skill
      • OpenClaw: --install-openclaw-skill
      • Codex: --install-codex-skill
      • DeepSeek Harness: no host-specific flag is needed; after generation, place the role Skill directory under ~/.dsh/skills/{character}-{slug} or the project's .dsh/skills/{character}-{slug}
      • Claude Code on Windows: optionally add --install-claude-command-shim
  6. If the current family is celebrity, run a quality check after creation:
    python3 tools/research/quality_check.py "{resolved_base_dir}/{slug}/SKILL.md" --profile {research_profile}
    
  7. If source_grounding still fails for a celebrity skill:
    • you may add honest limitation notes and a grounded source summary
    • only add URLs when they are real, specific, and traceable sources
    • never use site roots, topic pages, search pages, or other generic links as fake grounding
    • if no verified external sources exist, keep the FAIL state and explain what source material is still missing

When reporting success, return the correct family-specific location instead of assuming colleague storage.


Evolution Mode: Append Files

When user provides new files or text:

  1. Read new content using Step 2 methods
  2. Resolve the base dir for the current family
  3. Read existing {resolved_base_dir}/{slug}/work.md and persona.md
  4. Use the family-specific merger prompt for incremental analysis
  5. Archive current version (Bash):
    python3 tools/version_manager.py \
      --action backup \
      --character {character} \
      --slug {slug} \
      --base-dir {resolved_base_dir}
    
  6. Write work/persona delta into temporary patch files
  7. Call:
    python3 tools/skill_writer.py \
      --action update \
      --character {character} \
      --slug {slug} \
      --work-patch /tmp/dot_skill_{slug}_work_patch.md \
      --persona-patch /tmp/dot_skill_{slug}_persona_patch.md \
      --base-dir {resolved_base_dir}
    
  8. If the current family is celebrity, run the quality check again after the update

Evolution Mode: Conversation Correction

When user expresses "that's wrong" / "he should be":

  1. Refer to prompts/correction_handler.md to identify correction content
  2. Determine if it belongs to Work (technical/workflow) or Persona (personality/communication)
  3. If it belongs to Work:
    • Generate /tmp/dot_skill_{slug}_work_patch.md
    • The patch must be one or more replaceable ## sections
    • Call:
      python3 tools/skill_writer.py \
        --action update \
        --character {character} \
        --slug {slug} \
        --work-patch /tmp/dot_skill_{slug}_work_patch.md \
        --base-dir {resolved_base_dir}
      
  4. If it belongs to Persona:
    • Write the correction record to /tmp/dot_skill_{slug}_correction.json
    • For a single correction, write {scene, wrong, correct}
    • For multiple persona corrections, write {"persona_corrections": [{...}, {...}]}
    • Call:
      python3 tools/skill_writer.py \
        --action update \
        --character {character} \
        --slug {slug} \
        --correction-json /tmp/dot_skill_{slug}_correction.json \
        --base-dir {resolved_base_dir}
      
  5. If the current family is celebrity, run the quality check again after the update
  6. Do not hand-edit work.md, persona.md, SKILL.md, or meta.json; always update through skill_writer.py

Management Operations

List skills across the three families:

python3 tools/skill_writer.py --action list --character colleague --base-dir ./skills/colleague
python3 tools/skill_writer.py --action list --character relationship --base-dir ./skills/relationship
python3 tools/skill_writer.py --action list --character celebrity --base-dir ./skills/celebrity

Roll back a specific skill version:

# colleague
python3 tools/version_manager.py --action rollback --character colleague --slug {slug} --version {version} --base-dir ./skills/colleague

# relationship
python3 tools/version_manager.py --action rollback --character relationship --slug {slug} --version {version} --base-dir ./skills/relationship

# celebrity
python3 tools/version_manager.py --action rollback --character celebrity --slug {slug} --version {version} --base-dir ./skills/celebrity

Delete a specific skill: After confirming the character family:

# colleague
rm -rf skills/colleague/{slug}

# relationship
rm -rf skills/relationship/{slug}

# celebrity
rm -rf skills/celebrity/{slug}

Related skills