by titanwings
将冰冷的离别化为温暖的 Skill,欢迎加入数字生命1.0!Transforming cold farewells into warm skills? It's giving rebirth era. Welcome to Digital Life 1.0. 🫶
# Add to your Claude Code skills
git clone https://github.com/titanwings/colleague-skillGuides for using ai agents skills like colleague-skill.
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
Bashcommands from the directory that contains thisSKILL.md. Alltools/...andprompts/...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-skillpaths. The current working directory is already the correct skill root. Runpython3 tools/...directly.所有
Bash命令都必须在当前SKILL.md所在目录执行。下文出现的tools/...和prompts/...均为相对于 skill 根目录的相对路径。
当用户说以下任意内容时启动:
/dot-skill兼容宿主:
统一主入口是 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/.mbox | Bash → python3 tools/email_parser.py |
| 写入/更新 Skill 文件 | Write / Edit 工具 |
| 版本管理 | Bash → python3 tools/version_manager.py |
| 列出已有 Skill | Bash → python3 tools/skill_writer.py --action list |
基础目录:
colleague → ./skills/colleague/{slug}/relationship → ./skills/relationship/{slug}/celebrity → ./skills/celebrity/{slug}/如需改为全局路径,用 --base-dir 指向对应 character family 的根目录。
如果用户使用的是 /dot-skill,先确认本次要蒸馏的是哪一类:
colleaguerelationshipcelebrity如果上层宿主已经显式把 family 传进来,则直接固定对应的 character family。
如果当前 family 是 celebrity,还必须确认 research profile:
budget-friendlybudget-unfriendly默认使用 budget-friendly。只有当用户明确要求更深研究、更高置信度、或者愿意接受更慢更贵的蒸馏流程时,才切到 budget-unfriendly。
根据 character family 选择对应 intake prompt:
colleague → prompts/intake.mdrelationship → prompts/relationship/intake.mdcelebrity → prompts/celebrity/intake.mdcolleague 和 relationship 只问 3 个问题。
celebrity 按 prompts/celebrity/intake.md 问 4 个问题,其中第 4 个问题必须确认 research_profile。
默认的 3 个基础问题:
字节 2-1 后端工程师 男INTJ 摩羯座 甩锅高手 字节范 CR很严格但从来不解释原因除姓名外均可跳过。收集完后汇总确认,再进入下一步。
询问用户提供原材料,展示四种方式供选择:
原材料怎么提供?
[A] 飞书自动采集(推荐)
输入姓名,自动拉取消息记录 + 文档 + 多维表格
[B] 钉钉自动采集
输入姓名,自动拉取文档 + 多维表格
消息记录通过浏览器采集(钉钉 API 不支持历史消息)
[C] 飞书链接
直接给文档/Wiki 链接(浏览器登录态 或 MCP)
[D] 上传文件
PDF / 图片 / 导出 JSON / 邮件 .eml
[E] 直接粘贴内容
把文字复制进来
可以混用,也可以跳过(仅凭手动信息生成)。
首次使用需配置:
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)获取,应用身份无权访问私聊。
前置条件:
用户需要提供以下信息:
app_id 和 app_secret(在飞书开放平台创建自建应用获取)im:message — 以用户身份读取/发送消息im:chat — 以用户身份读取会话列表如果用户缺少以上任何信息,引导他们完成配置。不要假设用户已经配好了。
获取 user_access_token 的完整流程:
当用户提供了 app_id、app_secret,并确认已开通用户权限后:
帮用户生成 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
用户在浏览器打开链接,登录并授权
页面会跳转到 http://www.example.com?code=xxx,用户复制 code 给你
用 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 脚本来获取:
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 的限制,不是权限问题,不要尝试用这个接口找私聊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 参考:
POST /auth/v3/app_access_token/internal、POST /authen/v1/oidc/access_tokenPOST /im/v1/messages?receive_id_type=open_idGET /im/v1/messages?container_id_type=chat&container_id={chat_id}GET /contact/v3/scopes、GET /contact/v3/users/{user_id}自动采集内容:
采集完成后用 Read 读取输出目录下的文件:
knowledge/{slug}/messages.txt → 消息记录(群聊 + 私聊)knowledge/{slug}/docs.txt → 文档内容knowledge/{slug}/collection_summary.json → 采集摘要如果采集失败,根据报错自行判断原因并尝试修复,常见问题:
首次使用需配置:
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 # 首次使用加此参数,完成钉钉登录
采集内容:
采集完成后 Read 读取:
knowledge/{slug}/docs.txtknowledge/{slug}/bitables.txtknowledge/{slug}/messages.txt如消息采集失败,提示用户截图聊天记录后上传。
Read 工具直接读取python3 tools/feishu_parser.py --file {path} --target "{name}" --output /tmp/feishu_out.txt
然后 Read /tmp/feishu_out.txtpython3 tools/email_parser.py --file {path} --target "{name}" --output /tmp/email_out.txt
然后 Read /tmp/email_out.txtRead 工具直接读取用户提供飞书文档/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 读取结果文件,进入分析流程。
用户粘贴的内容直接作为文本原材料,无需调用任何工具。
如果用户说"没有文件"或"跳过",仅凭 Step 1 的手动信息生成 Skill。
先根据 character family 解析本次的执行矩阵:
| character | intake | persona analyzer | persona builder | merger | storage root |
|---|---|---|---|---|---|
colleague |
prompts/intake.md |
prompts/persona_analyzer.md |
prompts/persona_builder.md |
prompts/merger.md |
./skills/colleague/{slug} |
relationship |
prompts/relationship/intake.md |
prompts/relationship/persona_analyzer.md |
prompts/relationship/persona_builder.md |
prompts/relationship/merger.md |
./skills/relationship/{slug} |
celebrity |
prompts/celebrity/intake.md |
prompts/celebrity/persona_analyzer.md |
prompts/celebrity/persona_builder.md |
prompts/celebrity/merger.md |
./skills/celebrity/{slug} |
所有 family 共用:
prompts/work_analyzer.mdprompts/work_builder.mdprompts/correction_handler.md如果当前是 celebrity,必须先走 research 子流程,再进入分析。
prompts/celebrity/research.md,按其中的 6 维度并行采集策略 做 research planningmkdir -p "{skill_dir}/knowledge/research/raw" "{skill_dir}/knowledge/research/merged"
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"
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 他者视角)python3 tools/research/merge_research.py "{skill_dir}"
输出:knowledge/research/merged/summary.mdknowledge/research/merged/summary.md,确认:
Files scanned >= 3Unique URLs >= 2Potential long quote lines = 0┌──────────────────────────────┬──────────┬─────────────────────────────┐
│ 维度 │ 来源数 │ 关键发现 │
├──────────────────────────────┼──────────┼─────────────────────────────┤
│ 1 著作 │ N │ [核心论点 / 缺失] │
│ 2 对话 │ N │ [关键模式 / 缺失] │
│ 3 表达 DNA │ N │ [风格标记 / 缺失] │
│ 4 决策 │ N │ [决策模式 / 缺失] │
│ 5 他者视角 │ N │ [外部观点 / 缺失] │
│ 6 时间线 │ N │ [认知轨迹 / 缺失] │
├──────────────────────────────┼──────────┼─────────────────────────────┤
│ 矛盾点 │ N │ [摘要] │
│ 薄弱维度 │ [列表] │ 补充方案:[计划] │
│ 冷门人物? │ 是/否 │ │
└──────────────────────────────┴──────────┴─────────────────────────────┘
等待用户确认后再继续。如果用户指出问题或需要某个维度更深入,先补充研究。prompts/celebrity/budget_unfriendly/research.mdreferences/celebrity_budget_unfriendly_framework.mdmkdir -p "{skill_dir}/knowledge/research/raw" "{skill_dir}/knowledge/research/merged" "{skill_dir}/knowledge/research/reviews"
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:认知轨迹)python3 tools/research/merge_research.py "{skill_dir}"
knowledge/research/merged/summary.md,确认最低门槛:
Files scanned >= 6Unique URLs >= 8Primary-source markers >= 3Source metadata blocks >= 6Contradiction bullets >= 6Inference bullets >= 6Potential long quote lines = 0Track coverage count = 6prompts/celebrity/budget_unfriendly/audit.mdprompts/celebrity/budget_unfriendly/synthesis.mdreferences/celebrity_budget_unfriendly_template.mdknowledge/research/reviews/research_audit.md
PASS / FAILFAIL,按 audit 给出的 Backfill Tasks 补齐,不要跳到 synthesisknowledge/research/reviews/synthesis.md
prompts/celebrity/budget_unfriendly/validation.md 生成:
knowledge/research/reviews/validation.mdPASS / FAILFAIL,必须先修 draft 再继续两种 celebrity profile 的共同约束:
source_grounding 视为未完成完成 family 解析后,再按两条线分析:
线路 A(Work Skill):
prompts/work_analyzer.mdwork 更偏方法论、判断框架、决策习惯,不要机械套成“工作职责”线路 B(Persona):
celebrity 且 research_profile=budget-unfriendly,改用:
prompts/celebrity/budget_unfriendly/persona_analyzer.md使用 prompts/work_builder.md 生成 Work 内容。
使用当前 family 对应的 persona builder 生成 Persona 内容。
具体映射:
colleague → prompts/persona_builder.mdrelationship → prompts/relationship/persona_builder.mdcelebrity → prompts/celebrity/persona_builder.mdcelebrity + budget-unfriendly → prompts/celebrity/budget_unfriendly/persona_builder.md向用户展示摘要(各 5-8 行),询问:
Work Skill 摘要:
- 负责:{xxx}
- 技术栈:{xxx}
- CR 重点:{xxx}
...
Persona 摘要:
- 核心性格:{xxx}
- 表达风格:{xxx}
- 决策模式:{xxx}
...
确认生成?还是需要调整?
用户确认后,不要手工拼接 skills/colleague/{slug} 这类文件树。统一走 writer:
colleague → ./skills/colleaguerelationship → ./skills/relationshipcelebrity → ./skills/celebrityWrite 工具写三个临时文件:
/tmp/dot_skill_{slug}_meta.json/tmp/dot_skill_{slug}_work.md/tmp/dot_skill_{slug}_persona.mdmeta.json 至少包含:
namedisplay_namecharacterresearch_profile(当 character=celebrity 时必填)classification.language(必须设置为用户当前语言,例如 zh-CN 或 en)profiletagsknowledge_sourcespython3 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}
SKILL.mdwork.mdpersona.mdwork_skill.mdpersona_skill.mdmanifest.jsonmeta.json--install-claude-skill--install-openclaw-skill--install-codex-skill~/.dsh/skills/{character}-{slug} 或项目 .dsh/skills/{character}-{slug}--install-claude-command-shimcelebrity,创建完成后必须再跑一次质量检查:
python3 tools/research/quality_check.py "{resolved_base_dir}/{slug}/SKILL.md" --profile {research_profile}
celebrity 的质量检查仍然提示 source_grounding 失败:
告知用户时,文件位置必须按当前 family 返回,不要默认写成 colleague。
用户提供新文件或文本时:
Read 读取现有 {resolved_base_dir}/{slug}/work.md 和 persona.mdpython3 tools/version_manager.py \
--action backup \
--character {character} \
--slug {slug} \
--base-dir {resolved_base_dir}
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}
celebrity,更新后再次执行 quality check用户表达"不对"/"应该是"时:
prompts/correction_handler.md 识别纠正内容/tmp/dot_skill_{slug}_work_patch.md## 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}
/tmp/dot_skill_{slug}_correction.json{scene, wrong, correct}{"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}
celebrity,更新后再次执行 quality checkwork.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}
Activate when the user says any of the following:
/dot-skillCompatible hosts:
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:
/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.
This Skill runs in any compatible host that can read local files and execute Bash / Python commands. Use the following tool conventions:
| Task | Tool |
|---|---|
| Read PDF documents | Read tool (native PDF support) |
| Read image screenshots | Read tool (native image support) |
| Read MD/TXT files | Read tool |
| Parse Feishu message JSON export | Bash → 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-collect | Bash → python3 tools/dingtalk_auto_collector.py |
| Parse email .eml/.mbox | Bash → python3 tools/email_parser.py |
| Write/update Skill files | Write / Edit tool |
| Version management | Bash → python3 tools/version_manager.py |
| List existing Skills | Bash → 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.
If the user entered /dot-skill, first confirm which family should be distilled:
colleaguerelationshipcelebrityIf the host already passed an explicit family, lock the character family immediately.
If the current family is celebrity, also confirm the research profile:
budget-friendlybudget-unfriendlyDefault 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.
Choose the intake prompt by character family:
colleague → prompts/intake.mdrelationship → prompts/relationship/intake.mdcelebrity → prompts/celebrity/intake.mdFor 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:
ByteDance L2-1 backend engineer maleINTJ Capricorn blame-shifter ByteDance-style strict in CR but never explains whyEverything except the alias can be skipped. Summarize and confirm before moving to the next step.
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).
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:
app_id and app_secret (from Feishu Open Platform)im:message — read/send messages as userim:chat — read chat list as userIf 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:
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"
User opens URL, logs in, authorizes
Page redirects to http://www.example.com?code=xxx, user copies the code
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:
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
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.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:
POST /auth/v3/app_access_token/internal, POST /authen/v1/oidc/access_tokenPOST /im/v1/messages?receive_id_type=open_idGET /im/v1/messages?container_id_type=chat&container_id={chat_id}GET /contact/v3/scopes, GET /contact/v3/users/{user_id}Auto-collected content:
After collection, Read the output files:
knowledge/{slug}/messages.txt → messages (group + private)knowledge/{slug}/docs.txt → document contentknowledge/{slug}/collection_summary.json → collection summaryIf collection fails, diagnose the error and attempt to fix it. Common issues:
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:
After collection, Read:
knowledge/{slug}/docs.txtknowledge/{slug}/bitables.txtknowledge/{slug}/messages.txtIf message collection fails, prompt user to upload chat screenshots.
Read tool directlypython3 tools/feishu_parser.py --file {path} --target "{name}" --output /tmp/feishu_out.txt
Then Read /tmp/feishu_out.txtpython3 tools/email_parser.py --file {path} --target "{name}" --output /tmp/email_out.txt
Then Read /tmp/email_out.txtRead tool directlyWhen 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.
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.
First resolve the execution matrix for the selected character family:
| character | intake | persona analyzer | persona builder | merger | storage root |
|---|---|---|---|---|---|
colleague |
prompts/intake.md |
prompts/persona_analyzer.md |
prompts/persona_builder.md |
prompts/merger.md |
./skills/colleague/{slug} |
relationship |
prompts/relationship/intake.md |
prompts/relationship/persona_analyzer.md |
prompts/relationship/persona_builder.md |
prompts/relationship/merger.md |
./skills/relationship/{slug} |
celebrity |
prompts/celebrity/intake.md |
prompts/celebrity/persona_analyzer.md |
prompts/celebrity/persona_builder.md |
prompts/celebrity/merger.md |
./skills/celebrity/{slug} |
Shared across all families:
prompts/work_analyzer.mdprompts/work_builder.mdprompts/correction_handler.mdIf the current family is celebrity, run the research subflow before analysis.
prompts/celebrity/research.md and follow its 6-dimension parallel collection strategymkdir -p "{skill_dir}/knowledge/research/raw" "{skill_dir}/knowledge/research/merged"
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"
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)python3 tools/research/merge_research.py "{skill_dir}"
Output: knowledge/research/merged/summary.mdknowledge/research/merged/summary.md and confirm:
Files scanned >= 3Unique URLs >= 2Potential long quote lines = 0┌──────────────────────────────┬──────────┬─────────────────────────────┐
│ 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.prompts/celebrity/budget_unfriendly/research.mdreferences/celebrity_budget_unfriendly_framework.mdmkdir -p "{skill_dir}/knowledge/research/raw" "{skill_dir}/knowledge/research/merged" "{skill_dir}/knowledge/research/reviews"
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)python3 tools/research/merge_research.py "{skill_dir}"
knowledge/research/merged/summary.md and confirm the minimum floor:
Files scanned >= 6Unique URLs >= 8Primary-source markers >= 3Source metadata blocks >= 6Contradiction bullets >= 6Inference bullets >= 6Potential long quote lines = 0Track coverage count = 6prompts/celebrity/budget_unfriendly/audit.mdprompts/celebrity/budget_unfriendly/synthesis.mdreferences/celebrity_budget_unfriendly_template.mdknowledge/research/reviews/research_audit.md
PASS / FAILFAIL, follow the Backfill Tasks before synthesisknowledge/research/reviews/synthesis.md
prompts/celebrity/budget_unfriendly/validation.md to write:
knowledge/research/reviews/validation.mdPASS / FAILFAIL, revise the draft before continuingShared rules for both celebrity profiles:
source_grounding as incompleteOnce the family is resolved, analyze along two tracks:
Track A (Work Skill):
prompts/work_analyzer.mdcelebrity, interpret work as methods, judgment frameworks, and decision patterns rather than literal job scopeTrack B (Persona):
celebrity with research_profile=budget-unfriendly, use:
prompts/celebrity/budget_unfriendly/persona_analyzer.mdcelebrity, retain:
Use prompts/work_builder.md to generate Work content.
Use the family-specific persona builder to generate Persona content.
Mapping:
colleague → prompts/persona_builder.mdrelationship → prompts/relationship/persona_builder.mdcelebrity → prompts/celebrity/persona_builder.mdcelebrity + budget-unfriendly → prompts/celebrity/budget_unfriendly/persona_builder.mdShow 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?
After user confirmation, do not hand-build a skills/colleague/{slug}-style tree. Always go through the writer:
colleague → ./skills/colleaguerelationship → ./skills/relationshipcelebrity → ./skills/celebrityWrite tool to create three temporary files:
/tmp/dot_skill_{slug}_meta.json/tmp/dot_skill_{slug}_work.md/tmp/dot_skill_{slug}_persona.mdnamedisplay_namecharacterresearch_profile (required when character=celebrity)classification.language (must match the user's language, for example zh-CN or en)profiletagsknowledge_sourcespython3 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}
SKILL.mdwork.mdpersona.mdwork_skill.mdpersona_skill.mdmanifest.jsonmeta.json--install-claude-skill--install-openclaw-skill--install-codex-skill~/.dsh/skills/{character}-{slug} or the project's .dsh/skills/{character}-{slug}--install-claude-command-shimcelebrity, run a quality check after creation:
python3 tools/research/quality_check.py "{resolved_base_dir}/{slug}/SKILL.md" --profile {research_profile}
source_grounding still fails for a celebrity skill:
When reporting success, return the correct family-specific location instead of assuming colleague storage.
When user provides new files or text:
Read existing {resolved_base_dir}/{slug}/work.md and persona.mdpython3 tools/version_manager.py \
--action backup \
--character {character} \
--slug {slug} \
--base-dir {resolved_base_dir}
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}
celebrity, run the quality check again after the updateWhen user expresses "that's wrong" / "he should be":
prompts/correction_handler.md to identify correction content/tmp/dot_skill_{slug}_work_patch.md## sectionspython3 tools/skill_writer.py \
--action update \
--character {character} \
--slug {slug} \
--work-patch /tmp/dot_skill_{slug}_work_patch.md \
--base-dir {resolved_base_dir}
/tmp/dot_skill_{slug}_correction.json{scene, wrong, correct}{"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}
celebrity, run the quality check again after the updatework.md, persona.md, SKILL.md, or meta.json; always update through skill_writer.pyList 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}
Last scanned: 8/14/2026
{
"issues": [],
"status": "PASSED",
"scannedAt": "2026-08-14T05:36:50.105Z",
"npmAuditRan": true,
"pipAuditRan": false,
"promptInjectionRan": true
}🧑💼 Your colleague quit, your mentor graduated, your teammate transferred — taking their whole playbook and context with them? 💞 Your family, old friends, partner drifting apart — and you want to hold on to the way it felt to be with them? 🌟 Your favorite author, idol, thinker you'll never meet — but you want to know what they'd say about your question?
Upgraded from colleague.skill to dot-skill — not just colleagues, anyone can be distilled into a Skill
Colleagues · partners · family · old friends · idols · public figures · fictional characters — even yourself
Source material + your description → an AI Skill that genuinely thinks like them Thinks in their frame, speaks in their voice
🆕 What's new · 📦 Data Sources · ⚡ Install · 🚀 Usage · ✨ Demo · 📝 Citation · 💬 Discord
中文 · Español · Deutsch · 日本語 · Русский · Português · 한국어
Massive thanks to everyone who starred — we'll keep shipping, keep distilling.
🔷 2026.08.13 Update — dot-skill now supports DeepSeek Harness through its native filesystem Skill discovery. Install it globally at
~/.dsh/skills/dot-skillor per project at.dsh/skills/dot-skill, then invoke/dot-skilldirectly.
📝 2026.06.01 Update — COLLEAGUE.SKILL 技术报告 已上线;这次最开心的不只是发了篇 paper,而是社区一起把 gallery 推到 215 个 skills、165 位贡献者和 100k+ skill-card 累计 stars,论文 Acknowledgements 也专门收录并感谢了所有社区贡献者。
📢 2026.05.11 Update — WeChat group 12 is live! Come hang out with the dot-skill community — share skills, discuss features, trade tips.
QR refreshes every 7 days (expires 2026-05-18) — if expired, ping me on Discord.
🗺️ 2026.04.13 — dot-skill Roadmap is live! colleague.skill is evolving into dot-skill — distill anyone, not just colleagues. 👉 Full Roadmap · 💬 Discord
🌐 2026.04.07 — Community gallery is live! Any skill / meta-skill can drive traffic directly to your own GitHub repo. No middleman. 👉 titanwings.github.io/colleague-skill-site
Created by @titanwings · Powered by Shanghai AI Lab · AI Safety Center
No longer only built around the "colleague" scenario. A unified /dot-skill entrypoint sits on a general-purpose skill engine — one engine distills anyone, instead of being a colleague-specific script.
Each family has its own prompt pipeline, source-collection strategy, and generation template.
The old version only ran in Claude Code. Now it's cross-host across five: Compatible hosts:
| Host | Description |
|---|---|
| 🟣 Claude Code | Native slash-command support |
| 🟠 Hermes Agent | One-command install, /dot-skill works directly |
| 🔵 OpenClaw | Fully compatible |
| ⚫ Codex | Invoke by skill name |
| 🔷 DeepSeek Harness | Native filesystem skill discovery; /dot-skill works directly |
Generated character Skills can also be installed into any supported host.
| Source | Messages | Docs / Wiki | Spreadsheets | Notes |
|---|---|---|---|---|
| 🟢 Feishu (auto) | ✅ API | ✅ | ✅ | Just enter a name, fully automatic |
| 🟡 DingTalk (auto) | ⚠️ Browser | ✅ | ✅ | DingTalk API doesn't support message history |
| 🟣 Slack (auto) | ✅ API | — | — | Requires admin to install Bot; free plan limited to 90 days |
| 💬 WeChat chat history | ✅ SQLite | — | — | Export first with WeChatMsg / PyWxDump / 留痕 |
| 📄 PDF / Images / Screenshots | — | ✅ | — | Manual upload |
| 📦 Feishu JSON export | ✅ | ✅ | — | Manual upload |
✉️ Email .eml / .mbox |
✅ | — | — | Manual upload |
| 📝 Markdown / direct paste | ✅ | ✅ | — | Manual input |
It's 2026 — you have an Agent, let it install itself. Open your Claude Code / Hermes / OpenClaw / Codex / DeepSeek Harness and hand it this line:
Install the dot-skill skill for me:
https://github.com/titanwings/colleague-skill
The Agent will detect the current host's skills directory, clone the repo, and register the entrypoint. Once done, type /dot-skill in any host to launch.
git clone https://github.com/titanwings/colleague-skill <TARGET>
| Host | <TARGET> path |
|---|---|
| Claude Code | ~/.claude/skills/dot-skill |
| OpenClaw | ~/.openclaw/workspace/skills/dot-skill |
| Codex | ~/.codex/skills/dot-skill |
| DeepSeek Harness | ~/.dsh/skills/dot-skill (global) or .dsh/skills/dot-skill (project) |
| Hermes | After clone, run python3 tools/install_hermes_skill.py --force |
Generated character Skills can be published with tools/install_claude_generated_skill.py,
tools/install_openclaw_generated_skill.py, and tools/install_codex_generated_skill.py.
On DeepSeek Harness, place a generated Skill directory under ~/.dsh/skills/<skill-name> or the current project's .dsh/skills/<skill-name>; no host-specific wrapper is required.
For Feishu/DingTalk auto-collection credentials, publishing a generated character Skill to any host, Windows-specific handling, etc., see Detailed Install Guide (INSTALL.md)
In the host where dot-skill is installed, launch it — type /dot-skill, or just tell your Agent "start dot-skill".
It first asks which family you want to distill: colleague · relationship · celebrity.
Then enter alias, basic profile, personality tags, and pick a data source. All fields can be skipped — even a description alone can generate a Skill.
Once created, invoke the generated Skill with /{character}-{slug}.
| Command | Description |
|---|---|
/dot-skill |
Canonical unified entrypoint |
/{character}-{slug} |
Invoke full Skill (Persona + Work) |
/{character}-{slug}-work |
Work capabilities only |
/{character}-{slug}-persona |
Persona only |
python3 tools/skill_writer.py --action list ... |
List generated Skills across all three families |
python3 tools/version_manager.py --action rollback ... |
Roll back a Skill version |
The celebrity family ships with an end-to-end research toolchain, from subtitles to a finished draft:
# Download video subtitles
bash tools/research/download_subtitles.sh "<video-url>" "./tmp/subtitles"
# Subtitles → transcript
python3 tools/research/srt_to_transcript.py "./tmp/subtitles/example.srt"
# Merge research notes
python3 tools/research/merge
colleague-skill is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by titanwings. 将冰冷的离别化为温暖的 Skill,欢迎加入数字生命1.0!Transforming cold farewells into warm skills? It's giving rebirth era. Welcome to Digital Life 1.0. 🫶. It has 21,485 GitHub stars.
Yes. colleague-skill passed SkillsLLM's automated security scan — a dependency vulnerability audit plus prompt-injection heuristics — with no high-severity issues. You can read the full report in the Security Report section on this page.
Clone the repository with "git clone https://github.com/titanwings/colleague-skill" and add it to your Claude Code skills directory (see the Installation section above). colleague-skill ships a SKILL.md manifest, so compatible agents can discover and load it automatically.
colleague-skill is primarily written in Python. It is open-source under titanwings on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh colleague-skill against similar tools.
No comments yet. Be the first to share your thoughts!