Language / 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.
This Skill supports both Chinese and English. Based on the language of the user's first message, use the same language for all replies throughout. Instructions in both languages are provided below; choose the corresponding version to execute according to the user's language.
dot-skill creator (host-compatible version)Execution Root / Execution root directory: Run all
Bashcommands from the directory that contains thisSKILL.md. Alltools/...andprompts/...paths below are relative to the skill root.Critical rule / Critical rule: Do not prepend commands with guessed host-specific paths such as
cd ~/.hermes/...,cd ~/.claude/...,cd ~/.openclaw/...,cd ~/.codex/..., or hard-coded/Users/.../dot-skillpaths. The current working directory is already the correct skill root. Runpython3 tools/...directly.All
Bashcommands must be executed in the directory where the currentSKILL.mdis located. Thetools/...andprompts/...appearing below are both relative paths relative to the skill root directory.
Trigger conditions
Start when the user says any of the following:
/dot-skill- "Help me create a skill"
- "I want to distill a person"
- "Create a new skill"
- "Make me a skill for XX"
Compatible hosts:
- Claude Code
- OpenClaw
- Hermes
- Codex
The unified main entry is dot-skill. In hosts that support slash commands, use /dot-skill.
For Hermes, only /dot-skill this one slash entry is guaranteed to be stable;colleague、relationship、celebrity the compatible semantics of are retained at the tool layer and preset layer, but each compatible name is not guaranteed to be routable as a Hermes slash command.
When the user says the following to an existing Skill, enter evolution mode:
- "I have new files" / "append"
- "This is wrong" / "He wouldn't be like this" / "He should be"
/update-skill {character} {slug}
Compatible update aliases:
/update-colleague {slug}
When the user asks to view an already generated Skill, execute the list command in the "Management operations" below.
Tool usage rules
This Skill runs in any compatible host, requiring only that the host can read local files and execute Bash / Python commands. Use the following tool conventions:
| Task | Tool used |
|---|---|
| Read PDF documents | Read tool (natively supports PDF) |
| Read image screenshots | Read tool (natively supports images) |
| Read MD/TXT files | Read tool |
| Parse Feishu message JSON exports | Bash → python3 tools/feishu_parser.py |
| Feishu fully automatic collection (recommended) | Bash → python3 tools/feishu_auto_collector.py |
| Feishu documents (browser login state) | Bash → python3 tools/feishu_browser.py |
| Feishu documents (MCP App Token) | Bash → python3 tools/feishu_mcp_client.py |
| DingTalk fully automatic collection | 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 directory:
colleague→./skills/colleague/{slug}/relationship→./skills/relationship/{slug}/celebrity→./skills/celebrity/{slug}/
If you need to change it to a global path, use --base-dir to point to the root directory of the corresponding character family.
Main flow: create a new Skill
Step 0: Confirm character family
If the user is using /dot-skill, first confirm which category is to be distilled this time:
colleaguerelationshipcelebrity
If the upper-level host has already explicitly passed in the family, then directly fix the corresponding character family.
If the current family is celebrity, you must also confirm the research profile:
budget-friendlybudget-unfriendly
Use by default budget-friendly. Switch to budget-unfriendly。
Step 1: Basic information entry
Select the corresponding intake prompt based on the character family:
colleague→prompts/intake.mdrelationship→prompts/relationship/intake.mdcelebrity→prompts/celebrity/intake.md
colleague and relationship only ask 3 questions.
celebrity ask 4 questions according to prompts/celebrity/intake.md , of which the 4th question must confirm research_profile。
The default 3 basic questions:
- Alias/Codename(required)
- Basic information(one sentence: company, level, position, gender, write whatever comes to mind)
- Example:
字节 2-1 后端工程师 男
- Example:
- Personality profile(one sentence: MBTI, zodiac sign, personality tags, corporate culture, impressions)
- Example:
INTJ 摩羯座 甩锅高手 字节范 CR很严格但从来不解释原因
- Example:
Everything except the name can be skipped. After collecting, summarize and confirm, then proceed to the next step.
Step 2: Raw material import
Ask the user to provide raw materials, presenting four methods to choose from:
原材料怎么提供?
[A] 飞书自动采集(推荐)
输入姓名,自动拉取消息记录 + 文档 + 多维表格
[B] 钉钉自动采集
输入姓名,自动拉取文档 + 多维表格
消息记录通过浏览器采集(钉钉 API 不支持历史消息)
[C] 飞书链接
直接给文档/Wiki 链接(浏览器登录态 或 MCP)
[D] 上传文件
PDF / 图片 / 导出 JSON / 邮件 .eml
[E] 直接粘贴内容
把文字复制进来
可以混用,也可以跳过(仅凭手动信息生成)。
Method A: Feishu automatic collection (recommended)
First-time use requires configuration:
python3 tools/feishu_auto_collector.py --setup
Group chat collection(uses tenant_access_token, requires the bot to be in the group):
python3 tools/feishu_auto_collector.py \
--name "{name}" \
--output-dir ./knowledge/{slug} \
--msg-limit 1000 \
--doc-limit 20
Private chat collection(requires user_access_token + private chat chat_id):
Private chat messages can only be retrieved through the user identity (user_access_token); the app identity has no permission to access private chats.
Prerequisites:
The user needs to provide the following information:
- Feishu app credentials:
app_idandapp_secret(obtained by creating a custom app on the Feishu Open Platform) - User permissions: The app needs to have the following user permissions (scopes) enabled:
im:message— read/send messages as the userim:chat— read the chat list as the user
- OAuth authorization code (code): obtained from the callback URL after the user completes OAuth authorization in the browser
If the user lacks any of the above information, guide them to complete the configuration. Do not assume the user has already configured it.
Complete process for obtaining user_access_token:
When the user has provided app_id and app_secret and confirmed that user permissions are enabled:
-
Help the user generate the OAuth authorization link:
https://open.feishu.cn/open-apis/authen/v1/authorize?app_id={APP_ID}&redirect_uri=http://www.example.com&scope=im:message%20im:chat⚠️ Note:
redirect_urineeds to be added to the Feishu app's "Security Settings → Redirect URL"http://www.example.com -
The user opens the link in the browser, logs in, and authorizes
-
The page will redirect to
http://www.example.com?code=xxx, the user copies the code and gives it to you -
Exchange the code for a token:
python3 tools/feishu_auto_collector.py --exchange-code {CODE}Or write your own Python script to call the Feishu API and exchange it:
# 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"}
Obtain the private chat chat_id:
Users usually do not know the chat_id. When the user has a user_access_token but no chat_id, you shouldwrite your own Python scriptto obtain it:
- Method: Use user_access_token to send a message to the other party's open_id; the returned value will contain 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": "{对方open_id}", "msg_type": "text", "content": "{\"text\":\"你好\"}"} # 返回值中的 chat_id 就是私聊会话 ID - Note:
GET /im/v1/chatswill not return private chat sessions; this is a limitation of the Feishu API, not a permissions issue. Do not try to use this endpoint to find private chats. - If the user does not know the other party's open_id, they can use tenant_access_token to call the Contacts API to search:
GET https://open.feishu.cn/open-apis/contact/v3/scopes # 返回应用可见范围内所有用户的 open_id
Run collection:
After obtaining user_access_token and 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
Flexibility principle: The above API calls do not necessarily have to use the collector script. If the script does not work or the scenario does not match, you can directly write a Python script to call the Feishu API to complete the task. Core 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} - Query contacts:
GET /contact/v3/scopes、GET /contact/v3/users/{user_id}
Automatically collect content:
- Group chats: all messages he sent in group chats you share with him (filter out system messages and stickers)
- Private chats: the complete private chat conversation with him (including both parties' messages, used to understand the conversational context)
- Feishu documents and Wiki created/edited by him
- Related Bitable (if you have permission)
After collection is complete, use Read to read the files in the output directory:
knowledge/{slug}/messages.txt→ Message records (group chats + private chats)knowledge/{slug}/docs.txt→ Document contentknowledge/{slug}/collection_summary.json→ Collection summary
If collection fails, determine the cause yourself based on the error and try to fix it. Common issues:
- Group chat collection: the bot has not been added to the group chat
- Private chat collection: user_access_token expired (valid for 2 hours, can be refreshed with refresh_token)
- Insufficient permissions: guide the user to enable the corresponding permissions on the Feishu Open Platform and reauthorize
- Or switch to method B/C
Method B: DingTalk automatic collection
First-time use requires configuration:
python3 tools/dingtalk_auto_collector.py --setup
Then enter the name and collect with one click:
python3 tools/dingtalk_auto_collector.py \
--name "{name}" \
--output-dir ./knowledge/{slug} \
--msg-limit 500 \
--doc-limit 20 \
--show-browser # 首次使用加此参数,完成钉钉登录
Collected content:
- DingTalk documents and knowledge base created/edited by him
- Bitable
- Message records (⚠️ the DingTalk API does not support pulling historical messages; automatically switch to browser collection)
After collection is complete, Read Read and retrieve:
knowledge/{slug}/docs.txtknowledge/{slug}/bitables.txtknowledge/{slug}/messages.txt
If message collection fails, prompt the user to upload screenshots of the chat records.
Method D: Upload files
- PDF / images:
ReadThe tool reads directly - Feishu message JSON export:
Thenpython3 tools/feishu_parser.py --file {path} --target "{name}" --output /tmp/feishu_out.txtRead /tmp/feishu_out.txt - Email files .eml / .mbox:
Thenpython3 tools/email_parser.py --file {path} --target "{name}" --output /tmp/email_out.txtRead /tmp/email_out.txt - Markdown / TXT:
ReadThe tool reads directly
Method C: Feishu link
When the user provides a Feishu document/Wiki link, ask how to read it:
检测到飞书链接,选择读取方式:
[1] 浏览器方案(推荐)
复用你本机 Chrome 的登录状态
✅ 内部文档、需要权限的文档都能读
✅ 无需配置 token
⚠️ 需要本机安装 Chrome + playwright
[2] MCP 方案
通过飞书 App Token 调用官方 API
✅ 稳定,不依赖浏览器
✅ 可以读消息记录(需要群聊 ID)
⚠️ 需要先配置 App ID / App Secret
⚠️ 内部文档需要管理员给应用授权
选择 [1/2]:
Choose 1 (browser solution):
python3 tools/feishu_browser.py \
--url "{feishu_url}" \
--target "{name}" \
--output /tmp/feishu_doc_out.txt
If not logged in on first use, a browser window will pop up asking you to log in (one-time).
Choose 2 (MCP solution):
First-time use requires initialization configuration:
python3 tools/feishu_mcp_client.py --setup
Afterward, read directly:
python3 tools/feishu_mcp_client.py \
--url "{feishu_url}" \
--output /tmp/feishu_doc_out.txt
Read message records (requires group 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
After output by either method, use Read to read the result file and enter the analysis process.
Method E: Direct paste
The content pasted by the user is used directly as raw text material, with no need to call any tools.
If the user says "no files" or "skip", generate the Skill based only on the manual information from Step 1.
Step 3: Analyze raw material
First, parse the execution matrix for this session based on the 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 by all families:
- Work analyzer:
prompts/work_analyzer.md - Work builder:
prompts/work_builder.md - Correction handler:
prompts/correction_handler.md
If the current one is celebrity, you must first go through the research sub-process, then enter analysis.
celebrity / budget-friendly
- Read
prompts/celebrity/research.md, according to its 6-dimension parallel collection strategy do research planning - First create the directory:
mkdir -p "{skill_dir}/knowledge/research/raw" "{skill_dir}/knowledge/research/merged" - Confirm the collection strategy (already determined during the intake phase):
- Local-first: First analyze the user's local materials, mark which dimensions are covered, and only do web supplementation for missing dimensions
- Web + local: Full 6-dimension web research, while merging with local materials and cross-validating
- Web-only: Standard 6-dimension web research
- If the user explicitly provides a processable video link or subtitle source, and the processing result will not be written to disk as long text:
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" - According to 6 dimensions research, raw research notesat leastmust be split into 3 files (each file covers 2 dimensions), and you cannot write only one
research_notes.md:knowledge/research/raw/01_core_profile.md(Dimension 1 Works + Dimension 6 Timeline)knowledge/research/raw/02_conversations_and_material.md(Dimension 2 Dialogue + Dimension 4 Decisions)knowledge/research/raw/03_expression_and_reception.md(Dimension 3 Expression DNA + Dimension 5 Others' Perspectives)
- During the research process, you must comply with taste principles(see research prompt for details):
- Long-form > quotable lines, controversy > consensus, change > fixed, first-hand > second-hand
- Comply with source blacklist: never cite Zhihu, WeChat public accounts, Baidu Baike, or content farms
- Comply with source priority: user local materials > first-hand works > long interviews > decision records > social media > external analysis > second-hand retellings
- Merge research:
Output:python3 tools/research/merge_research.py "{skill_dir}"knowledge/research/merged/summary.md - Read
knowledge/research/merged/summary.md, confirm:Files scanned >= 3Unique URLs >= 2Potential long quote lines = 0- The URLs in research notes must bespecific pages that were actually opened, not platform homepages, search pages, topic pages, or placeholder paths If this is not satisfied, continue supplementing research notes until it is satisfied or the reason collection is limited is clearly recorded.
- Quality gate (Phase 1.5): Before entering analysis, you must show the user a structured collection summary:
Wait for user confirmation before continuing. If the user points out problems or needs a certain dimension to be deeper, supplement the research first.┌──────────────────────────────┬──────────┬─────────────────────────────┐ │ 维度 │ 来源数 │ 关键发现 │ ├──────────────────────────────┼──────────┼─────────────────────────────┤ │ 1 著作 │ N │ [核心论点 / 缺失] │ │ 2 对话 │ N │ [关键模式 / 缺失] │ │ 3 表达 DNA │ N │ [风格标记 / 缺失] │ │ 4 决策 │ N │ [决策模式 / 缺失] │ │ 5 他者视角 │ N │ [外部观点 / 缺失] │ │ 6 时间线 │ N │ [认知轨迹 / 缺失] │ ├──────────────────────────────┼──────────┼─────────────────────────────┤ │ 矛盾点 │ N │ [摘要] │ │ 薄弱维度 │ [列表] │ 补充方案:[计划] │ │ 冷门人物? │ 是/否 │ │ └──────────────────────────────┴──────────┴─────────────────────────────┘ - Obscure figure detection: If total sources < 10, handle according to the obscure figure protocol:
- Mental models are limited to 2–3
- Weak model annotation "based on limited information"
- Expand the honesty boundary section
- Tell the user what supplementary materials they can provide to improve quality
- celebrity's subsequent analysis input must prioritize the use of:
- First-hand materials (source weight 1-3)
- merged research summary
- Supplementary descriptions provided by the user
celebrity / budget-unfriendly
- First read:
prompts/celebrity/budget_unfriendly/research.mdreferences/celebrity_budget_unfriendly_framework.md
- First create the directory:
mkdir -p "{skill_dir}/knowledge/research/raw" "{skill_dir}/knowledge/research/merged" "{skill_dir}/knowledge/research/reviews" - Confirm the collection strategy (already determined during the intake phase): local-first / web+local / web-only
- According to 6-track independent file structure write research notes (cannot be merged, observations cannot be cloned):
knowledge/research/raw/01_writings.md(Dimension 1: Writings and systematic thinking)knowledge/research/raw/02_conversations.md(Dimension 2: Improvised dialogue and handling pressure)knowledge/research/raw/03_expression_dna.md(Dimension 3: Linguistic fingerprint)knowledge/research/raw/04_decisions.md(Dimension 4: Behavior and choices)knowledge/research/raw/05_external_views.md(Dimension 5: Others' perspectives and criticism)knowledge/research/raw/06_timeline.md(Dimension 6: Cognitive trajectory)
- The research process must comply with taste principles + source blacklist + source priority(see research prompt), and each piece of evidence must be labeled with source weight (1-7).
- Merge research:
python3 tools/research/merge_research.py "{skill_dir}" - Read
knowledge/research/merged/summary.md, and confirm the minimum thresholds:Files scanned >= 6Unique URLs >= 8Primary-source markers >= 3Source metadata blocks >= 6Contradiction bullets >= 6Inference bullets >= 6Potential long quote lines = 0Track coverage count = 6- URLs in research notes must bespecific pages that were actually opened, not platform homepages, search pages, topic pages, or placeholder paths If not satisfied, continue filling in the corresponding track instead of directly proceeding to the subsequent review.
- Quality gate (Phase 1.5): Before entering audit, show the user a structured collection summary (including primary ratio, number of contradictions, candidate mental models, known-answer candidates, weak dimensions, and niche-figure determination). 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 generate
knowledge/research/reviews/research_audit.md- The audit must explicitly give
PASS / FAIL - The audit must check: source-tier compliance (no blacklist), primary ratio > 50%, compliance with taste principles, and niche-figure assessment
- If the audit is
FAIL, fill in the gaps according to the Backfill Tasks given by the audit, and do not skip to synthesis
- The audit must explicitly give
- Distillation gate (Phase 2.5): After the audit passes, show the user a summary of candidate mental models (including triple-gate determination, evidence anchors, and failure modes). After confirming reasonableness, proceed to synthesis.
- Then generate
knowledge/research/reviews/synthesis.md- A triple-gate judgment must be made for candidate mental models:
- cross-context recurrence
- generative power
- exclusivity
- At the same time, extract intellectual lineage seeds (influenced by / diverged from) and Agentic Protocol seeds (the list of dimensions this person would use to analyze a new problem)
- A triple-gate judgment must be made for candidate mental models:
- Then according to
prompts/celebrity/budget_unfriendly/validation.mdgenerate:knowledge/research/reviews/validation.md- validation must explicitly give
PASS / FAIL - Must perform known-answer check (at least 2 questions) + edge-case check (1 question) + voice check (100-character blind test) + copyright check + Agentic Protocol check
- If validation is
FAIL, the draft must be fixed first before continuing
- budget-unfriendly's subsequent analysis input must prioritize the use of:
- 6-track raw notes
- merged research summary
- research audit
- synthesis review (including intellectual lineage seeds and Agentic Protocol seeds)
- validation review
- User supplementary materials
Common constraints for both celebrity profiles:
- If external collection fails or is blocked by platform verification:
- Explicitly tell the user the reason collection was limited
- Retain the existing research raw materials and merged summary
- Continue generating, but treat
source_groundingas incomplete - Do notfabricate URLs, citations, book titles, or video titles just to pass quality checks, or stuff in generic homepage links
- Do notcopy complete transcripts, complete subtitles, or long passages of original text into the repository
- Only structured summaries, source metadata, and extremely short quotations may be retained, to avoid copyright risk
After completing family parsing, analyze along two tracks:
Track A (Work Skill):
- Refer to
prompts/work_analyzer.md - Extract: responsible systems, technical specifications, workflows, output preferences, experiential knowledge
- In the celebrity scenario,
workis more about methodology, judgment frameworks, and decision-making habits; do not mechanically map it to "job responsibilities"
Track B (Persona):
- Use the persona analyzer corresponding to the current family
- If
celebrityandresearch_profile=budget-unfriendly, switch to:prompts/celebrity/budget_unfriendly/persona_analyzer.md
- Translate the tags filled in by the user into concrete behavioral rules
- Extract from the raw materials: expression style, decision-making patterns, interpersonal behavior
- In the celebrity scenario, the following must be retained:
- mental models
- decision heuristics
- expression DNA
- contradictions
- honest boundaries
Step 4: Generate and preview
Use prompts/work_builder.md to generate the Work content.
Use the persona builder corresponding to the current family to generate the Persona content.
Specific 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), and ask:
Work Skill 摘要:
- 负责:{xxx}
- 技术栈:{xxx}
- CR 重点:{xxx}
...
Persona 摘要:
- 核心性格:{xxx}
- 表达风格:{xxx}
- 决策模式:{xxx}
...
确认生成?还是需要调整?
Step 5: Write to files
After the user confirms, do not manually assemble skills/colleague/{slug} file trees like this. Use the writer uniformly:
- First resolve the current storage root:
colleague→./skills/colleaguerelationship→./skills/relationshipcelebrity→./skills/celebrity
- Use the
Writetool to write three temporary files:/tmp/dot_skill_{slug}_meta.json/tmp/dot_skill_{slug}_work.md/tmp/dot_skill_{slug}_persona.md
meta.jsonmust contain at least:namedisplay_namecharacterresearch_profile(required when character=celebrity)classification.language(must be set to the user's current language, e.g.,zh-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 uniformly generate:
SKILL.mdwork.mdpersona.mdwork_skill.mdpersona_skill.mdmanifest.jsonmeta.json- If you need to install the generated character Skill into the host:
- Claude Code: append
--install-claude-skill - OpenClaw: append
--install-openclaw-skill - Codex: append
--install-codex-skill - Claude Code on Windows: you may additionally append
--install-claude-command-shim
- Claude Code: append
- If the current one is
celebrity, after creation is complete you must run the quality check once more:python3 tools/research/quality_check.py "{resolved_base_dir}/{slug}/SKILL.md" --profile {research_profile} - If
celebrity's quality check still indicatessource_groundingfailed:- You may add honest source notes and limitation notes
- But only when real, specific, traceable external sources have been obtained may URLs be added
- Do notuse generic links such as site homepages, topic pages, search pages, or personal space homepages to "game" the check
- If there are no real sources, leave it as FAIL, and explain to the user what materials need to be supplied later
When informing the user, the file location must be returned according to the current family; do not default to writing colleague.
Evolution mode: append file
When the user provides a new file or text:
- Read the new content as in Step 2
- Resolve the base dir according to the current family
- Use
Readto read the existing{resolved_base_dir}/{slug}/work.mdandpersona.md - Use the merger prompt corresponding to the current family to analyze the incremental content
- Archive the current version (using Bash):
python3 tools/version_manager.py \ --action backup \ --character {character} \ --slug {slug} \ --base-dir {resolved_base_dir} - Write the work/persona increments to temporary patch files respectively
- 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 is
celebrity, execute quality check again after updating
Evolution mode: conversation correction
When the user expresses "that's wrong"/"it should be":
- Refer to
prompts/correction_handler.mdto identify the correction content - Determine whether it belongs to Work (technical/process) or Persona (personality/communication)
- If it belongs to Work:
- Generate
/tmp/dot_skill_{slug}_work_patch.md - The patch must be a replaceable
##section; do not directly hand-edit the final file - 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 to
/tmp/dot_skill_{slug}_correction.json - A single correction can be directly written as
{scene, wrong, correct} - Multiple persona corrections can be written as
{"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 to
- If the current is
celebrity, execute quality check again after updating - Do not directly hand-edit
work.md、persona.md、SKILL.md、meta.json; update uniformly through the writer
Management operations
List the three types of Skills:
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 certain 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 certain Skill: After confirming the character, execute:
# 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
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:
Thenpython3 tools/feishu_parser.py --file {path} --target "{name}" --output /tmp/feishu_out.txtRead /tmp/feishu_out.txt - Email files .eml / .mbox:
Thenpython3 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: Zhihu, WeChat Official Accounts, Baidu Baike, 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 - 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}