Character Skill Distiller
Convert colleagues, relationships, or celebrities into reusable Claude skills.
Installation
- 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 runclaudein any terminal to verify.One-time setupnpm i -g @anthropic-ai/claude-codeAlready have it? Skip ahead.
- 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 - Restart Claude Code.
Quit and reopen Claude Code (or any other agent that loads from
~/.claude/skills/). New skills are picked up on startup. - 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
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- "åž®æå建äžäžª 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/.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 çæ ¹ç®åœã
äž»æµçšïŒåå»ºæ° Skill
Step 0ïŒç¡®è®€ character family
åŠæçšæ·äœ¿çšçæ¯ /dot-skillïŒå
ç¡®è®€æ¬æ¬¡èŠèžéŠçæ¯åªäžç±»ïŒ
colleaguerelationshipcelebrity
åŠæäžå±å®¿äž»å·²ç»æŸåŒæ family äŒ è¿æ¥ïŒåçŽæ¥åºå®å¯¹åºç character familyã
åŠæåœå family æ¯ celebrityïŒè¿å¿
须确讀 research profileïŒ
budget-friendlybudget-unfriendly
é»è®€äœ¿çš budget-friendlyãåªæåœçšæ·æç¡®èŠæ±æŽæ·±ç ç©¶ãæŽé«çœ®ä¿¡åºŠãæè
æ¿ææ¥åæŽæ
¢æŽè޵çèžéŠæµçšæ¶ïŒæåå° budget-unfriendlyã
Step 1ïŒåºç¡ä¿¡æ¯åœå ¥
æ ¹æ® character family éæ©å¯¹åº intake promptïŒ
colleagueâprompts/intake.mdrelationshipâprompts/relationship/intake.mdcelebrityâprompts/celebrity/intake.md
colleague å relationship åªé® 3 䞪é®é¢ã
celebrity æ prompts/celebrity/intake.md é® 4 䞪é®é¢ïŒå
¶äžç¬¬ 4 䞪é®é¢å¿
须确讀 research_profileã
é»è®€ç 3 䞪åºç¡é®é¢ïŒ
- è±å/代å·ïŒå¿ å¡«ïŒ
- åºæ¬ä¿¡æ¯ïŒäžå¥è¯ïŒå
¬åžãè级ãèäœãæ§å«ïŒæ³å°ä»ä¹åä»ä¹ïŒ
- 瀺äŸïŒ
åè 2-1 å端工çšåž ç·
- 瀺äŸïŒ
- æ§æ Œç»åïŒäžå¥è¯ïŒ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ïŒè·åïŒåºçšèº«ä»œæ æè®¿é®ç§èã
å眮æ¡ä»¶ïŒ
çšæ·éèŠæäŸä»¥äžä¿¡æ¯ïŒ
- é£ä¹Šåºçšåè¯ïŒ
app_idåapp_secretïŒåšé£ä¹ŠåŒæŸå¹³å°å建èªå»ºåºçšè·åïŒ - çšæ·æéïŒåºçšéåŒé以äžçšæ·æéïŒscopeïŒïŒ
im:messageâ ä»¥çšæ·èº«ä»œè¯»å/åéæ¶æ¯im:chatâ ä»¥çšæ·èº«ä»œè¯»åäŒè¯å衚
- OAuth ææç ïŒcodeïŒïŒçšæ·åšæµè§åšäžå®æ OAuth ææåïŒä»åè° URL äžè·å
åŠæçšæ·çŒºå°ä»¥äžä»»äœä¿¡æ¯ïŒåŒå¯Œä»ä»¬å®æé 眮ãäžèŠåè®Ÿçšæ·å·²ç»é 奜äºã
è·å 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 èæ¬æ¥è·åïŒ
- æ¹æ³ïŒçš 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.txtknowledge/{slug}/bitables.txtknowledge/{slug}/messages.txt
åŠæ¶æ¯ééå€±èŽ¥ïŒæç€ºçšæ·æªåŸè倩记åœåäžäŒ ã
æ¹åŒ DïŒäžäŒ æä»¶
- PDF / åŸçïŒ
Readå·¥å ·çŽæ¥è¯»å - é£ä¹Šæ¶æ¯ JSON 富åºïŒ
ç¶å
python3 tools/feishu_parser.py --file {path} --target "{name}" --output /tmp/feishu_out.txtRead /tmp/feishu_out.txt - é®ä»¶æä»¶ .eml / .mboxïŒ
ç¶å
python3 tools/email_parser.py --file {path} --target "{name}" --output /tmp/email_out.txtRead /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 è§£ææ¬æ¬¡çæ§è¡ç©éµïŒ
| 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 å ±çšïŒ
- Work analyzerïŒ
prompts/work_analyzer.md - Work builderïŒ
prompts/work_builder.md - Correction handlerïŒ
prompts/correction_handler.md
åŠæåœåæ¯ celebrityïŒå¿
é¡»å
èµ° research åæµçšïŒåè¿å
¥åæã
celebrity / budget-friendly
- 读å
prompts/celebrity/research.mdïŒæå ¶äžç 6 绎床并è¡ééçç¥ å research planning - å
å建ç®åœïŒ
mkdir -p "{skill_dir}/knowledge/research/raw" "{skill_dir}/knowledge/research/merged" - 确讀ééçç¥ïŒåš intake é¶æ®µå·²ç¡®å®ïŒïŒ
- Local-firstïŒå åæçšæ·æ¬å°ææïŒæ è®°èŠçäºåªäºç»ŽåºŠïŒåªå¯¹çŒºå€±ç»ŽåºŠåçœç»è¡¥å
- Web + localïŒå šé 6 绎床çœç»ç ç©¶ïŒåæ¶äžæ¬å°ææåå¹¶ïŒäº€åéªè¯
- Web-onlyïŒæ å 6 绎床çœç»ç ç©¶
- åŠæçšæ·æç¡®æäŸäºå¯å€ççè§é¢éŸæ¥æå广¥æºïŒèäžå€çç»æäžäŒäœäžºé¿ææ¬èœçïŒ
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" - æ 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 ä»è è§è§ïŒ
- ç ç©¶è¿çšäžå¿
é¡»éµå® åå³ååïŒè¯Šè§ research promptïŒïŒ
- é¿æ > éå¥ïŒäºè®® > å ±è¯ïŒåå > åºå®ïŒäžæ > äºæ
- éµå® ä¿¡æºé»ååïŒæ°žäžåŒçšç¥ä¹ãåŸ®ä¿¡å ¬äŒå·ãçŸåºŠçŸç§ãå 容ååº
- éµå® ä¿¡æºäŒå 级ïŒçšæ·æ¬å°ææ > äžæèäœ > é¿è®¿è° > å³çè®°åœ > 瀟亀åªäœ > å€éšåæ > äºæèœ¬è¿°
- åå¹¶ researchïŒ
èŸåºïŒ
python3 tools/research/merge_research.py "{skill_dir}"knowledge/research/merged/summary.md - 读å
knowledge/research/merged/summary.mdïŒç¡®è®€ïŒFiles scanned >= 3Unique URLs >= 2Potential long quote lines = 0- research notes éç URL å¿ é¡»æ¯å®é æåŒè¿çå ·äœé¡µé¢ïŒäžæ¯å¹³å°éŠé¡µãæçޢ页ãè¯é¢é¡µæå äœè·¯åŸ åŠæäžæ»¡è¶³ïŒç»§ç»è¡¥ research notesïŒçŽå°æ»¡è¶³ææç¡®è®°åœæéåéåå ã
- 莚éå
³å¡ïŒPhase 1.5ïŒïŒåšè¿å
¥åæä¹åïŒå¿
é¡»åçšæ·å±ç€ºç»æåééæèŠïŒ
çåŸ çšæ·ç¡®è®€ååç»§ç»ãåŠæçšæ·æåºé®é¢æéèŠæäžªç»ŽåºŠæŽæ·±å ¥ïŒå è¡¥å ç ç©¶ã
ââââââââââââââââââââââââââââââââ¬âââââââââââ¬ââââââââââââââââââââââââââââââ â 绎床 â æ¥æºæ° â å ³é®åç° â ââââââââââââââââââââââââââââââââŒâââââââââââŒâââââââââââââââââââââââââââââ†â 1 èäœ â N â [æ žå¿è®ºç¹ / 猺倱] â â 2 å¯¹è¯ â N â [å ³é®æš¡åŒ / 猺倱] â â 3 衚蟟 DNA â N â [飿 Œæ è®° / 猺倱] â â 4 å³ç â N â [å³çæš¡åŒ / 猺倱] â â 5 ä»è è§è§ â N â [å€éšè§ç¹ / 猺倱] â â 6 æ¶éŽçº¿ â N â [讀ç¥èœšè¿¹ / 猺倱] â ââââââââââââââââââââââââââââââââŒâââââââââââŒâââââââââââââââââââââââââââââ†â ççŸç¹ â N â [æèŠ] â â è匱绎床 â [å衚] â è¡¥å æ¹æ¡ïŒ[计å] â â å·éšäººç©ïŒ â æ¯/åŠ â â ââââââââââââââââââââââââââââââââŽâââââââââââŽââââââââââââââââââââââââââââââ - å·éšäººç©æ£æµïŒåŠææ»æ¥æº < 10 æ¡ïŒæå·éšäººç©åè®®å€çïŒ
- å¿æºæš¡åéå¶äžº 2â3 䞪
- èåŒ±æš¡åæ æ³š"åºäºæéä¿¡æ¯"
- æ©å€§è¯å®èŸ¹çç« è
- åç¥çšæ·æäŸä»ä¹è¡¥å ææå¯ä»¥æ¹å莚é
- celebrity çåç»åæèŸå
¥å¿
é¡»äŒå
䜿çšïŒ
- äžæææïŒä¿¡æºæé 1-3ïŒ
- merged research summary
- çšæ·æäŸçè¡¥å æè¿°
celebrity / budget-unfriendly
- å
读åïŒ
prompts/celebrity/budget_unfriendly/research.mdreferences/celebrity_budget_unfriendly_framework.md
- å
å建ç®åœïŒ
mkdir -p "{skill_dir}/knowledge/research/raw" "{skill_dir}/knowledge/research/merged" "{skill_dir}/knowledge/research/reviews" - 确讀ééçç¥ïŒåš intake é¶æ®µå·²ç¡®å®ïŒïŒlocal-first / web+local / web-only
- æ 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ïŒè®€ç¥èœšè¿¹ïŒ
- ç ç©¶è¿çšå¿ é¡»éµå® åå³åå + ä¿¡æºé»åå + ä¿¡æºäŒå 级ïŒè§ research promptïŒïŒæ¯æ¡ evidence å¿ é¡»æ æ³š source weight (1-7)ã
- åå¹¶ researchïŒ
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 = 6- research notes éç URL å¿ é¡»æ¯å®é æåŒè¿çå ·äœé¡µé¢ïŒäžæ¯å¹³å°éŠé¡µãæçޢ页ãè¯é¢é¡µæå äœè·¯åŸ åŠæäžæ»¡è¶³ïŒç»§ç»è¡¥å¯¹åº trackïŒèäžæ¯çŽæ¥è¿å ¥åç» reviewã
- 莚éå ³å¡ïŒPhase 1.5ïŒïŒåšè¿å ¥ audit ä¹åïŒåçšæ·å±ç€ºç»æåééæèŠïŒå« primary æ¯äŸãççŸæ°ãåé mental modelsãknown-answer åéãè匱绎床ãå·éšäººç©å€å®ïŒãçåŸ çšæ·ç¡®è®€ååç»§ç»ã
- å读åïŒ
prompts/celebrity/budget_unfriendly/audit.mdprompts/celebrity/budget_unfriendly/synthesis.mdreferences/celebrity_budget_unfriendly_template.md
- å
çæ
knowledge/research/reviews/research_audit.md- 审计å¿
é¡»æç¡®ç»åº
PASS / FAIL - audit å¿ é¡»æ£æ¥ïŒä¿¡æºå±çº§åè§ïŒæ é»ååïŒãprimary æ¯äŸ > 50%ãåå³ååéµå®ãå·éšäººç©è¯äŒ°
- åŠæ audit æ¯
FAILïŒæ audit ç»åºç Backfill Tasks è¡¥éœïŒäžèŠè·³å° synthesis
- 审计å¿
é¡»æç¡®ç»åº
- æçŒå ³å¡ïŒPhase 2.5ïŒïŒaudit éè¿åïŒåçšæ·å±ç€ºåé mental models æèŠïŒå«äžééšå€å®ãevidence anchorsãfailure modesïŒã确讀åçæ§ååè¿å ¥ synthesisã
- åçæ
knowledge/research/reviews/synthesis.md- å¿
须对åé mental models å triple-gate 倿ïŒ
- cross-context recurrence
- generative power
- exclusivity
- åæ¶æåæºè¯è°±ç³»ç§åïŒinfluenced by / diverged fromïŒå Agentic Protocol ç§åïŒè¯¥äººç©äŒåŠäœåææ°é®é¢ç绎床å衚ïŒ
- å¿
须对åé mental models å triple-gate 倿ïŒ
- åæ
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 åç»§ç»
- 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.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}
...
确讀çæïŒè¿æ¯éèŠè°æŽïŒ
Step 5ïŒåå ¥æä»¶
çšæ·ç¡®è®€åïŒäžèŠæå·¥æŒæ¥ skills/colleague/{slug} è¿ç±»æä»¶æ ãç»äžèµ° writerïŒ
- å
è§£æåœå storage rootïŒ
colleagueâ./skills/colleaguerelationshipâ./skills/relationshipcelebrityâ./skills/celebrity
- çš
Writeå·¥å ·åäžäžªäžŽæ¶æä»¶ïŒ/tmp/dot_skill_{slug}_meta.json/tmp/dot_skill_{slug}_work.md/tmp/dot_skill_{slug}_persona.md
meta.jsonè³å°å å«ïŒnamedisplay_namecharacterresearch_profileïŒåœ character=celebrityæ¶å¿ å¡«ïŒclassification.languageïŒå¿ é¡»è®Ÿçœ®äžºçšæ·åœåè¯èšïŒäŸåŠzh-CNæenïŒprofiletagsknowledge_sources
- ç¶åè°çšïŒ
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} - 该åœä»€äŒç»äžçæïŒ
SKILL.mdwork.mdpersona.mdwork_skill.mdpersona_skill.mdmanifest.jsonmeta.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
- Claude CodeïŒè¿œå
- åŠæåœåæ¯
celebrityïŒåå»ºå®æåå¿ é¡»åè·äžæ¬¡èŽšéæ£æ¥ïŒpython3 tools/research/quality_check.py "{resolved_base_dir}/{slug}/SKILL.md" --profile {research_profile} - åŠæ
celebrityçèŽšéæ£æ¥ä»ç¶æç€ºsource_grounding倱莥ïŒ- å¯ä»¥è¡¥åè¯å®çæ¥æºè¯Žæåå±é诎æ
- äœåªæåšæ¿å°çå®ãå ·äœãå¯è¿œæº¯çå€é𿥿ºæ¶ïŒæèœè¡¥å URL
- äžèŠçšç«ç¹éŠé¡µãtopic 页ãæçޢ页ã䞪人空éŽéŠé¡µçæ³åéŸæ¥æ¥âå·è¿âæ£æ¥
- åŠææ²¡æç宿¥æºïŒå°±ä¿ç FAILïŒå¹¶åçšæ·è¯Žæåç»éèŠè¡¥åªäºææ
åç¥çšæ·æ¶ïŒæä»¶äœçœ®å¿ é¡»æåœå family è¿åïŒäžèŠé»è®€åæ colleagueã
è¿åæš¡åŒïŒè¿œå æä»¶
çšæ·æäŸæ°æä»¶æææ¬æ¶ïŒ
- æ Step 2 çæ¹åŒè¯»åæ°å 容
- æ ¹æ®åœå family è§£æ base dir
- çš
Read读åç°æ{resolved_base_dir}/{slug}/work.mdåpersona.md - 䜿çšåœå family 对åºç merger prompt åæå¢éå 容
- åæ¡£åœåçæ¬ïŒçš BashïŒïŒ
python3 tools/version_manager.py \ --action backup \ --character {character} \ --slug {slug} \ --base-dir {resolved_base_dir} - æ work/persona å¢éåå«åå°äžŽæ¶ patch æä»¶
- è°çšïŒ
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è¯å«çº æ£å 容 - 倿å±äº WorkïŒææ¯/æµçšïŒè¿æ¯ PersonaïŒæ§æ Œ/æ²éïŒ
- åŠæå±äº 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}
- çæ
- åŠæå±äº 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}
- å° correction åå
¥
- åŠæåœåæ¯
celebrityïŒæŽæ°å忬¡æ§è¡ quality check - äžèŠçŽæ¥ææ¹
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:
| 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.
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:
colleaguerelationshipcelebrity
If 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-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.mdrelationshipâprompts/relationship/intake.mdcelebrityâ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:
- Alias / Codename (required)
- Basic info (one sentence: company, level, role, gender â say whatever comes to mind)
- Example:
ByteDance L2-1 backend engineer male
- Example:
- Personality profile (one sentence: MBTI, zodiac, traits, corporate culture, impressions)
- Example:
INTJ Capricorn blame-shifter ByteDance-style strict in CR but never explains why
- Example:
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:
- Feishu app credentials:
app_idandapp_secret(from Feishu Open Platform) - User scopes: The app must have these user scopes enabled:
im:messageâ read/send messages as userim:chatâ read chat list as user
- 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:
-
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:
- 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/chatsdoes 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 contentknowledge/{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.txtknowledge/{slug}/bitables.txtknowledge/{slug}/messages.txt
If message collection fails, prompt user to upload chat screenshots.
Option D: Upload Files
- PDF / Images:
Readtool directly - Feishu message JSON export:
Then
python3 tools/feishu_parser.py --file {path} --target "{name}" --output /tmp/feishu_out.txtRead /tmp/feishu_out.txt - Email files .eml / .mbox:
Then
python3 tools/email_parser.py --file {path} --target "{name}" --output /tmp/email_out.txtRead /tmp/email_out.txt - Markdown / TXT:
Readtool 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:
| 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:
- 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
- Read
prompts/celebrity/research.mdand follow its 6-dimension parallel collection strategy - Create the research directories first:
mkdir -p "{skill_dir}/knowledge/research/raw" "{skill_dir}/knowledge/research/merged" - 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
- 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" - 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)
- 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
- Merge the research notes:
Output:
python3 tools/research/merge_research.py "{skill_dir}"knowledge/research/merged/summary.md - Read
knowledge/research/merged/summary.mdand confirm:Files scanned >= 3Unique URLs >= 2Potential 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.
- Quality checkpoint (Phase 1.5): before entering analysis, show the user a structured collection summary:
Wait for user confirmation before continuing. If the user flags issues or wants more depth, extend research first.
ââââââââââââââââââââââââââââââââ¬âââââââââââ¬ââââââââââââââââââââââââââââââ â 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 â â ââââââââââââââââââââââââââââââââŽâââââââââââŽââââââââââââââââââââââââââââââ - 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
- Celebrity analysis must prioritize:
- primary materials (source weight 1-3)
- merged research summary
- explicit user notes
celebrity / budget-unfriendly
- First read:
prompts/celebrity/budget_unfriendly/research.mdreferences/celebrity_budget_unfriendly_framework.md
- Create the research directories first:
mkdir -p "{skill_dir}/knowledge/research/raw" "{skill_dir}/knowledge/research/merged" "{skill_dir}/knowledge/research/reviews" - Confirm the collection strategy (determined during intake): local-first / web+local / web-only
- 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)
- Research must follow taste principles + source blacklist + source hierarchy (see research prompt). Every evidence item must carry a source weight (1-7) annotation.
- Merge the research notes:
python3 tools/research/merge_research.py "{skill_dir}" - Read
knowledge/research/merged/summary.mdand 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 = 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.
- 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.
- Then read:
prompts/celebrity/budget_unfriendly/audit.mdprompts/celebrity/budget_unfriendly/synthesis.mdreferences/celebrity_budget_unfriendly_template.md
- 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
- The audit must produce an explicit
- 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.
- 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)
- Apply the triple gate to candidate mental models:
- Then use
prompts/celebrity/budget_unfriendly/validation.mdto 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
- 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_groundingas 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, interpretworkas methods, judgment frameworks, and decision patterns rather than literal job scope
Track B (Persona):
- Use the family-specific persona analyzer
- If
celebritywithresearch_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.mdrelationshipâprompts/relationship/persona_builder.mdcelebrityâprompts/celebrity/persona_builder.mdcelebrity+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:
- Resolve the current storage root:
colleagueâ./skills/colleaguerelationshipâ./skills/relationshipcelebrityâ./skills/celebrity
- Use the
Writetool to create three temporary files:/tmp/dot_skill_{slug}_meta.json/tmp/dot_skill_{slug}_work.md/tmp/dot_skill_{slug}_persona.md
- The temporary meta file must include at least:
namedisplay_namecharacterresearch_profile(required whencharacter=celebrity)classification.language(must match the user's language, for examplezh-CNoren)profiletagsknowledge_sources
- 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} - This command will generate:
SKILL.mdwork.mdpersona.mdwork_skill.mdpersona_skill.mdmanifest.jsonmeta.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
- Claude Code:
- 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} - If
source_groundingstill fails for acelebrityskill:- 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:
- Read new content using Step 2 methods
- Resolve the base dir for the current family
Readexisting{resolved_base_dir}/{slug}/work.mdandpersona.md- Use the family-specific merger prompt for incremental analysis
- Archive current version (Bash):
python3 tools/version_manager.py \ --action backup \ --character {character} \ --slug {slug} \ --base-dir {resolved_base_dir} - Write work/persona delta into temporary patch files
- 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} - 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":
- Refer to
prompts/correction_handler.mdto identify correction content - Determine if it belongs to Work (technical/workflow) or Persona (personality/communication)
- 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}
- Generate
- 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}
- Write the correction record to
- If the current family is
celebrity, run the quality check again after the update - Do not hand-edit
work.md,persona.md,SKILL.md, ormeta.json; always update throughskill_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
Word Document Editor
anthropics
Create, edit, and format Word documents with tables, images, and tracked changes.
Skill Template
anthropics
A template for creating and configuring new Claude skills.
Kanban TUI
Zaloog
Manage tasks, boards, and workflows in your terminal with a CLI kanban tool.
AgentPostage
AgentPostage
Send PDFs as physical US mail for bank disputes, cancellations and notices. Free skill, paid mailing with your own API key.