Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,8 @@ knowledge/
# 环境
.env
venv/

.spec-workflow
.claude
.cache
logs/
79 changes: 79 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
# CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

## 项目概述

ex-skill(原名 ex-partner-skill)是一个 Claude Code 元技能(meta-skill),用于将过往恋爱关系的原始素材(微信/QQ 聊天记录、照片、社交媒体帖子、个人叙述)转化为可独立运行的 AI Skill,模拟前任的说话风格、情感模式和共同记忆。用于个人情感反思与疗愈,内置安全边界。

## 项目上下文

本项目使用 Kontext 生成了结构化上下文,存放在 `.kontext/` 目录中。开始任务前请先阅读以下制品:

- `.kontext/PROJECT_MANIFEST.json` — 项目清单(定位、技术栈、核心流程)
- `.kontext/ARCHITECTURE_MAP.json` — 架构分层与模块归属
- `.kontext/CONVENTIONS.json` — 编码规范与约束
- `.kontext/module_contracts/` — 各模块的职责边界与接口契约

请基于这些上下文理解项目结构后再进行开发。

## 运行方式

这不是传统应用程序,没有构建步骤。项目作为 Claude Code Skill 运行,入口文件是 `SKILL.md`。

**安装到项目:**
```bash
mkdir -p .claude/skills
git clone <repo> .claude/skills/create-ex
pip3 install -r requirements.txt # 可选,仅 Pillow 用于照片 EXIF 读取
```

**触发命令:**
- `/create-ex` — 创建新的前任技能(5 步流程)
- `/list-exes` — 列出所有已生成的前任技能
- `/{slug}` — 与生成的前任技能对话(完整模式)
- `/update-ex {slug}` — 进入演化模式(追加素材)
- `/ex-rollback {slug} {version}` — 回滚到历史版本
- `/delete-ex {slug}` — 删除已生成的技能

Comment on lines +31 to +38

Copilot AI Apr 1, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

“触发命令”列表尚未包含本 PR 新增的 /reflect {slug};同时后文“生成产物层”输出文件列表也未包含 exes/{slug}/lessons.md。建议补齐这两处,使 CLAUDE.md 与当前功能/目录结构一致,方便后续开发和排查问题。

Copilot uses AI. Check for mistakes.
**单独运行 Python 工具:**
```bash
python3 tools/wechat_parser.py --file <path> --target <name> --output <output_path>
python3 tools/qq_parser.py --file <path> --target <name> --output <output_path>
python3 tools/social_parser.py --dir <dir> --output <output_path>
python3 tools/photo_analyzer.py --dir <dir> --output <output_path>
python3 tools/skill_writer.py --action list --base-dir ./exes
python3 tools/version_manager.py --action backup --slug <slug> --base-dir ./exes
```

## 架构

项目采用 6 层架构,层间单向依赖:

1. **入口编排层**(`SKILL.md`)— 主控制器,定义触发条件、5 步创建流程、演化模式、管理命令和安全边界。Claude Code 直接解释执行此文件。
2. **提示词模板层**(`prompts/`)— 7 个无状态 Markdown 文件,定义各阶段的 LLM 提示词模板,通过 `${CLAUDE_SKILL_DIR}/prompts/xxx.md` 引用。

Copilot AI Apr 1, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

架构描述中仍写“prompts/ — 7 个无状态 Markdown 文件”,但当前 prompts 目录已包含 10 个模板(新增 lessons_analyzer/lessons_builder/reflection_coach)。建议更新数量/描述,避免后续开发者依赖此处信息产生误解。

Suggested change
2. **提示词模板层**`prompts/`)— 7 个无状态 Markdown 文件,定义各阶段的 LLM 提示词模板,通过 `${CLAUDE_SKILL_DIR}/prompts/xxx.md` 引用。
2. **提示词模板层**`prompts/`)— 10 个无状态 Markdown 文件,定义各阶段的 LLM 提示词模板(包含 lessons_analyzer / lessons_builder / reflection_coach 等),通过 `${CLAUDE_SKILL_DIR}/prompts/xxx.md` 引用。

Copilot uses AI. Check for mistakes.
3. **数据解析工具层**(`tools/wechat_parser.py`、`qq_parser.py`、`social_parser.py`、`photo_analyzer.py`)— 独立 Python CLI 工具,将原始素材解析为结构化数据,输出到 `/tmp/`。
4. **文件管理工具层**(`tools/skill_writer.py`、`version_manager.py`)— 管理 `exes/{slug}/` 下的生成文件,包括目录初始化、文件合并、版本备份和回滚。
5. **生成产物层**(`exes/{slug}/`)— 运行时输出:`SKILL.md`、`memory.md`、`persona.md`、`meta.json`、`versions/`、`memories/`。
6. **文档层**(`docs/`、`README.md`)— 产品规格和文档,无运行时作用。

## 核心设计模式

- **双部件架构**:每个生成的技能包含 Part A(关系记忆,事实性)和 Part B(人设,行为性),可独立或组合使用。
- **5 层人设优先级**:Layer 0(硬规则)> Layer 1(身份)> Layer 2(说话方式)> Layer 3(情感模式)> Layer 4(关系行为)。高层不可被低层覆盖。
- **演化机制**:记忆追加(不覆盖)、对话修正(Correction 记录跟踪)、自动版本归档与回滚。
- **标签翻译模式**:`persona_analyzer.md` 中将抽象人格标签(如"话痨"、"冷暴力")翻译为具体行为规则。
- **优雅降级**:可选依赖 Pillow 使用 try/except 导入,格式自动检测失败时回退到纯文本。

## 依赖说明

- Python 3.9+,核心功能仅使用标准库(`argparse`、`json`、`re`、`os`、`pathlib`、`datetime`、`shutil`)
- `Pillow>=9.0.0` — 唯一外部依赖,可选,用于照片 EXIF 读取
- 所有 Python 工具为独立 CLI,模块间零耦合

## 未完成功能

- 微信 HTML/CSV 格式解析(格式检测已实现,解析函数未实现)
- PyWxDump SQLite 格式解析(格式检测已实现,解析函数缺失)
- 示例技能 `exes/example_xiaoming/` 尚未创建
- 无测试套件、无 CI/CD 管线
47 changes: 46 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@ pip3 install -r requirements.txt
| `/{slug}` | 调用完整 Skill(像ta一样跟你聊天) |
| `/{slug}-memory` | 回忆模式(帮你回忆那些事) |
| `/{slug}-persona` | 仅人物性格 |
| `/reflect {slug}` | 关系反思模式(复盘经验教训) |
| `/update-ex {slug}` | 追加素材或纠正性格 |
| `/ex-rollback {slug} {version}` | 回滚到历史版本 |
| `/delete-ex {slug}` | 删除 |
| `/let-go {slug}` | 放下(delete 的温柔别名) |
Expand Down Expand Up @@ -114,6 +116,25 @@ pip3 install -r requirements.txt
算了不想吵
```

**场景五:关系反思**

```
用户 ❯ /reflect xx

前任.skill ❯ 已加载 xx 的关系反思报告。

你们的核心冲突是「焦虑-回避」追逃模式:
你越追问确认,她越需要空间退后;
她越退后沉默,你越焦虑追问。

想聊哪个维度?
- 沟通模式:你们的「翻译错误」在哪里
- 冲突循环:每次吵架的升级路径
- 课题清单:7 条可行动的成长建议

也可以说「从TA的角度看」切换视角。
```

---

## 功能特性
Expand All @@ -130,12 +151,13 @@ pip3 install -r requirements.txt

### 生成的 Skill 结构

每个前任 Skill 由两部分组成,共同驱动输出:
每个前任 Skill 由三部分组成,共同驱动输出:

| 部分 | 内容 |
|------|------|
| **Part A — Relationship Memory** | 共同经历、约会地点、inside jokes、争吵模式、甜蜜瞬间、关系时间线 |
| **Part B — Persona** | 5 层性格结构:硬规则 → 身份 → 说话风格 → 情感模式 → 关系行为 |
| **Part C — Lessons** | 7 维度关系反思:性格画像、沟通模式、冲突循环、需求错配、边界、成长轨迹、分手复盘 + 可行动课题清单 |

运行逻辑:`收到消息 → Persona 判断ta会怎么回 → Memory 补充共同记忆 → 用ta的方式输出`
Comment on lines +154 to 162

Copilot AI Apr 1, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

此处将 Skill 结构描述为“三部分共同驱动输出”,但紧接着的“运行逻辑”仍只描述 Persona+Memory 的常规对话生成链路;Lessons 更像是 /reflect 的独立报告/教练模式产物而非每条聊天输出都参与。建议澄清 Lessons 的作用范围(例如“Part C 用于 /reflect 反思模式”),避免读者误解。

Copilot uses AI. Check for mistakes.

Expand All @@ -157,6 +179,26 @@ pip3 install -r requirements.txt
* **对话纠正** → 说「ta不会这样说」→ 写入 Correction 层,立即生效
* **版本管理** → 每次更新自动存档,支持回滚

### 关系反思(`/reflect`)

除了模拟对话,前任.skill 还提供**关系反思**功能——帮你从这段关系中学到东西。

输入 `/reflect {slug}` 进入反思模式,系统会基于聊天记录自动生成一份 7 维度的关系反思报告(`lessons.md`):

| 维度 | 分析内容 |
|------|----------|
| 性格画像 | 双方各自的 MBTI/依恋类型/情绪特征,以及组合效应 |
| 沟通模式 | 各自的沟通风格、不匹配之处、「翻译错误」 |
| 冲突循环 | 反复出现的争吵模式、升级路径、收尾方式 |
| 需求错配 | 双方核心需求是什么、哪些没被满足、怎么互相踩雷 |
| 边界与自我 | 谁在过度迁就、哪些边界被突破 |
| 成长轨迹 | 关系期间双方各自的变化 |
| 分手复盘 | 根本原因、被忽略的信号、如果能重来 |

最后提炼 5-10 条**可行动的成长课题**,每条包含:现象 → 根因 → 下段关系中怎么做。

反思模式支持对话式深入探讨——你可以说「从TA的角度看」切换视角,也可以提供新素材重新分析。对话中产生的感悟会自动追加到报告中。

---

## 项目结构
Expand All @@ -170,8 +212,11 @@ create-ex/
│ ├── intake.md # 对话式信息录入
│ ├── memory_analyzer.md # 关系记忆提取
│ ├── persona_analyzer.md # 性格行为提取(含标签翻译表)
│ ├── lessons_analyzer.md # 关系反思 7 维度分析
│ ├── memory_builder.md # memory.md 生成模板
│ ├── persona_builder.md # persona.md 五层结构模板
│ ├── lessons_builder.md # lessons.md 反思报告模板
│ ├── reflection_coach.md # /reflect 对话式反思指引
│ ├── merger.md # 增量 merge 逻辑
│ └── correction_handler.md # 对话纠正处理
├── tools/ # Python 工具
Expand Down
45 changes: 43 additions & 2 deletions SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ allowed-tools: Read, Write, Edit, Bash
* "不对" / "ta不会这样说" / "ta应该是这样的"
* `/update-ex {slug}`

当用户说 `/reflect {slug}` 时进入关系反思对话模式。

当用户说 `/list-exes` 时列出所有已生成的前任。

---
Expand Down Expand Up @@ -223,6 +225,12 @@ python3 ${CLAUDE_SKILL_DIR}/tools/photo_analyzer.py \
* 将用户填写的标签翻译为具体行为规则(参见标签翻译表)
* 从原材料中提取:说话风格、情感表达模式、依恋类型、爱的语言

**线路 C(Relationship Lessons)**:

* 参考 `${CLAUDE_SKILL_DIR}/prompts/lessons_analyzer.md` 中的 7 个分析维度
* 从双方视角分析:性格画像、沟通模式、冲突循环、情感需求、边界问题、成长轨迹、分手复盘
* 提炼 5-10 条可行动的成长课题
Comment on lines +228 to +232

Copilot AI Apr 1, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

新增线路 C 后,Step 3 开头仍写“按以下两条线分析”,与现在的 A/B/C 三路不一致,容易误导执行者漏做 Lessons 分析。建议把“两条线”改为“三条线”(或改成“按以下多条线分析”以便未来扩展)。

Copilot uses AI. Check for mistakes.

### Step 4:生成并预览

参考 `${CLAUDE_SKILL_DIR}/prompts/memory_builder.md` 生成 Relationship Memory 内容。
Expand All @@ -245,6 +253,12 @@ Persona 摘要:
- 口头禅:{xxx}
...

关系反思摘要:
- 性格组合:{xxx}
- 核心冲突模式:{xxx}
- 最大的课题:{xxx}
...
Comment on lines +256 to +260

Copilot AI Apr 1, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Step 4 里新增了“关系反思摘要”,但本节说明仍只提到参考 memory_builder/persona_builder 生成内容,没有说明 lessons 的生成来源/模板(例如 lessons_builder)以及摘要应基于 lessons 分析结果。建议在 Step 4 明确加入 lessons 的生成与预览说明,避免执行者遗漏或摘要无从而来。

Copilot uses AI. Check for mistakes.

确认生成?还是需要调整?
```

Expand All @@ -267,7 +281,11 @@ mkdir -p exes/{slug}/memories/social
**3. 写入 persona.md**(用 Write 工具):
路径:`exes/{slug}/persona.md`

**4. 写入 meta.json**(用 Write 工具):
**4. 写入 lessons.md**(用 Write 工具):
路径:`exes/{slug}/lessons.md`
参考 `${CLAUDE_SKILL_DIR}/prompts/lessons_builder.md` 模板生成关系反思报告。

**5. 写入 meta.json**(用 Write 工具):
路径:`exes/{slug}/meta.json`
内容:

Expand Down Expand Up @@ -297,7 +315,7 @@ mkdir -p exes/{slug}/memories/social
}
```

**5. 生成完整 SKILL.md**(用 Write 工具):
**6. 生成完整 SKILL.md**(用 Write 工具):
路径:`exes/{slug}/SKILL.md`

SKILL.md 结构:
Expand Down Expand Up @@ -349,8 +367,10 @@ user-invocable: true
触发词:/{slug}(完整版 — 像ta一样跟你聊天)
/{slug}-memory(回忆模式 — 帮你回忆那些事)
/{slug}-persona(性格模式 — 仅人物性格)
/reflect {slug}(反思模式 — 聊聊经验教训)

想聊就聊,觉得哪里不像ta,直接说"ta不会这样",我来更新。
想反思这段关系,用 /reflect {slug} 进入反思模式。
不想聊了也没关系。
```

Expand Down Expand Up @@ -388,6 +408,26 @@ user-invocable: true

## 管理命令

### `/reflect {slug}` — 关系反思对话

进入与指定前任相关的反思对话模式:

1. 用 `Read` 工具读取 `exes/{slug}/memory.md` 和 `exes/{slug}/persona.md`
2. 尝试读取 `exes/{slug}/lessons.md`——如果文件不存在,则自动生成:
- 以已有的 memory.md + persona.md 作为分析素材
- 参考 `${CLAUDE_SKILL_DIR}/prompts/lessons_analyzer.md` 进行 7 维度分析
- 参考 `${CLAUDE_SKILL_DIR}/prompts/lessons_builder.md` 生成 lessons.md
- 用 `Write` 工具写入 `exes/{slug}/lessons.md`
- 告知用户:"已基于现有数据生成了关系反思报告,我们可以开始聊了。"
3. 参考 `${CLAUDE_SKILL_DIR}/prompts/reflection_coach.md` 的对话指引
4. 开始对话式反思,支持:
- 深入探讨报告中的任何维度
- 说"从 TA 的角度看"切换视角
- 对话中产生的感悟自动追加到 lessons.md
- 说"重新分析"并提供新素材重新生成报告

---

`/list-exes`:

```bash
Expand Down Expand Up @@ -497,6 +537,7 @@ Same flow as Chinese version above. Generates:
| `/{slug}` | Full Skill (chat like them) |
| `/{slug}-memory` | Memory mode (recall shared experiences) |
| `/{slug}-persona` | Persona only |
| `/reflect {slug}` | Reflection mode (relationship lessons & coaching) |
| `/ex-rollback {slug} {version}` | Rollback to historical version |
| `/delete-ex {slug}` | Delete |
| `/let-go {slug}` | Gentle alias for delete |
Loading
Loading