# Personal Growth

> 个人成长复盘 skill。把日常犯错变成可追踪、可分析、可成长的资产。当用户随手丢文字/截图/PDF，描述「我今天做错了一件事」「记一笔」「记录一下」「补一条犯错」「这事我又干砸了」时，自动结构化入库到长期总账 mistakes.md。当用户说「出周报」「本周复盘」「成长报告」「这周犯错总结」时，从总账提取本周条目；当用户说「出日报」「今日复盘」「今天复盘」「日报」时，从总账提取当天条目——都由 Claude 找通性、写总评和行动建议，生成简洁专业风 A4 PDF（周报存在 周报/ 目录、日报存在 日报/ 目录）。哪怕用户没明说"用 personal-growth skill"，只要场景是「日常错误的记录 + 周期性反思 + 找成长方向」，都用这个 skill。

- Skill: `b-bzy/personal-growth` (Agent Skill, multi-file: 9 files)
- Install (CLI): `npx skillmds@latest add b-bzy/personal-growth`
- Raw SKILL.md: https://api.skillmd.com/api/skills/b-bzy/personal-growth/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Marketing & Growth
- Author: b-bzy (https://skillmd.com/u/b-bzy)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/b-bzy/personal-growth

---


# personal-growth · 个人成长复盘

## 零、日期与周次约定（**最高优先级 · 强制 4 步 · 不可绕过**）

> ⚠️ **这一节是硬性流程，不是建议。** Claude 在本 skill 的**任何**流程（入库 / 出周报 / 出日报 / 任何用到"今天"或"本周"的地方）开头，**必须依次跑完下面 4 步**。
>
> **跳过任何一步 = 违反本 skill 协议。**
> 哪怕用户上一句话刚说"今天是 X"、哪怕 `<env>` 顶部明显写着 Today's date、哪怕你"非常确定"——**都不能跳过 Step 0.1 的 bash 校验**。

---

### Step 0.1 · 现场采集今天的真实日期（bash，强制）

**第一件事**就是执行下面这条 bash 命令，把输出原样记下来：

```bash
TZ='Asia/Dubai' date +"%Y-%m-%d %A"
```

输出示例：`2026-06-13 Saturday`。

把它存为本次流程的 `$TODAY`（格式 `YYYY-MM-DD`）和 `$DOW`（星期几）。

**禁止做的事情**（以下任何一种情形都视为违反协议）：
- ❌ 不跑 bash，直接读 `<env>` 顶部的 Today's date
- ❌ 引用对话历史里 `system-reminder: The date has changed. Today's date is now ...` 的旧值
- ❌ 凭"上次说今天是 X，所以现在应该是 X 或 X+1"做心算
- ❌ 把对话开头第一次校验的 `$TODAY` 一直缓存到对话结束——**每次新流程都要重新跑 bash**

---

### Step 0.2 · 交叉校验 + 异常处理

把 Step 0.1 的输出和 `<env>` 顶部 Today's date 对比：

| 情况 | 处理 |
|---|---|
| 完全一致 | 继续 Step 0.3 |
| 不一致 | **以 Step 0.1 的 bash 输出为准**；在回复里加一句「今天实际是 $TODAY $DOW，env 里的日期已过期」 |

---

### Step 0.3 · 用 Python 算出 Dubai Week，把它锁死

```bash
python3 -c "
from datetime import date
TODAY = date.fromisoformat('$TODAY')
ANCHOR = date(2026, 4, 19)        # 「城市」工作起始日（周日）
days = (TODAY - ANCHOR).days
dw = days // 7 + 1
start = ANCHOR.fromordinal(ANCHOR.toordinal() + (dw-1)*7)
end = ANCHOR.fromordinal(start.toordinal() + 6)
print(f'DW{dw} | {start} → {end} | day {days+1} in Dubai')
"
```

记下 `$DW`（如 `DW8`）、`$DW_START`、`$DW_END`。

**注意**：DW 周以**周日为第一天、周六为最后一天**（跟 ISO 周差一天）。

---

### Step 0.4 · 锁定本次流程的"时间快照"

完成 0.1-0.3 后，**把以下 4 个值视为本次流程的"事实"，不再二次修改**：

```
$TODAY        例如 2026-06-13
$DOW          例如 Saturday
$DW           例如 DW8
$DW_START / $DW_END   例如 2026-06-07 / 2026-06-13
```

后续任何用到「今天 / 本周 / 这周 / 周报范围 / 入库默认日期」的地方都**直接引用这 4 个变量**，不重新计算、不重新查 env、不重新查 reminder。

只有用户在对话中**明确说"用 X 日期"或"出 DW{X} 周报"**时，才覆盖这些默认值。

---

### 0.5 周次命名 / 文件路径

- 周报：`~/Desktop/工作报告/个人成长/周报/DW{N}-周报.pdf`
- 日报：`~/Desktop/工作报告/个人成长/日报/YYYY-MM-DD-日报.pdf`
- **永久禁用** ISO 周命名（`2026-Wxx` 不再出现在 skill 内任何输出里）

### 0.6 用户给出相对日期时的处理

| 用户说 | Claude 怎么做 |
|---|---|
| "今天" / 没给日期 | 用 `$TODAY` |
| "昨天" | `$TODAY - 1 day`（用 Python `timedelta` 算，不要心算） |
| "上周一" | 用 Python 从 `$TODAY` 反推上周的周一日期 |
| "0613" / "6/13" / "2026-06-13" | 按用户原值使用（不做"今天减一天"假设） |
| "上周" 出周报 | `$DW - 1` |
| "DW7 周报" | 直接用 7 |

---

## 数据存储位置（重要）

```
~/Desktop/工作报告/个人成长/
├── 犯错总账.md              ← 长期总账（实时追加，用户可直接打开看）
├── 周报/
│   ├── DW4-周报.pdf         ← Dubai Week 命名
│   ├── DW5-周报.pdf
│   └── ……
└── 日报/
    ├── 2026-06-02-日报.pdf
    └── ……
```

脚本默认就指向这里。**不要**写入到 skill 内置的 `data/` 文件夹——那只是打包时的占位。

## 一、何时触发

- **入库**：用户描述一件做错的事、要"记一笔"、粘贴文字/截图/PDF 让你"帮我记下"。
- **出周报**：用户说「出周报」「本周复盘」「周复盘」「成长报告」「这周犯错总结」。
- **出日报**：用户说「出日报」「今日复盘」「今天复盘」「日报」「写日报」「今天总结」。

## 二、字段定义（4 用户字段 + 2 自动字段）

每条犯错存为 `data/mistakes.md` 表格的一行。**用户只需要给 4 个内容**，其它由系统填：

| 字段 | 来源 | 说明 |
|------|------|------|
| `date` | 用户 | `YYYY-MM-DD`，犯错**发生**那天 |
| `context` | 用户 | 任务原文 / 背景描述（"今天叫我做 XX"）|
| `problem` | 用户 | 问题清单，多条用 ① ② ③ 分隔 |
| `experience` | 用户 | 经验 / 教训清单，多条用 ① ② ③ 分隔 |
| `id` | 脚本自动 | `YYYYMMDD-NNN` |
| `category` | Claude 自动判 | 5 选 1：`decision` / `execution` / `communication` / `self-mgmt` / `cognition`，标准见 `references/categories.md`。**用户不用关心**，Claude 看 problem+experience 内容自己定 |

**用户输入的典型格式**（直接发这种就行，Claude 会处理）：
```
date：0513
context：今天叫我做……
problem：①没问……②……③……
experience：①……②……
```

表格转义规则：`|` → `｜`（全角竖线），`\n` → `<br>`，脚本自动处理。

## 三、主流程 A：入库一条犯错

### Step A1 · 路由：识别输入形态

- **文字**：消息正文里就是描述。
- **图片**（PNG/JPG）：用 `Read` 工具直接读图——Claude 是多模态模型，能直接看图识别文字和场景，**不要去跑 OCR 脚本**。
- **PDF**：用 `Read` 工具，>10 页必须传 `pages` 参数。
- **混合**：文字 + 图，两个都看，以用户文字为准。
- **什么都没给**：问一句「这次要记什么？发文字、截图或 PDF 都行。」

### Step A2 · 结构化抽取

读完原始内容后填字段。**`category` 必须 `Read` `references/categories.md` 对照锚点判定**，不靠记忆。

- 日期没说就用今天。
- `context` / `problem` / `experience` 直接照用户原文走（语言润色在 Step A2.5）。

### Step A2.5 · 润色与表达打磨（默认开启，不主动询问）

用户的输入往往是「想到哪写到哪」——分点序号乱（"1.方便" 应是 "一方面"），措辞口语化（"按照常理" 改 "凭惯性"），同一个点重复啰嗦。**入库前对 problem / experience 做一次轻量润色**：

**润色范围（允许做的）**：
- ✅ 改错字 / 病句（"一方便" → "一方面"）。
- ✅ 把口语化措辞替换成更准确的词（"按照常理" → "凭惯性"）。
- ✅ 把分点序号统一成 ① ② ③ ④。
- ✅ 把同一点里的"两层意思"拆成更清晰的从句，让人一读就懂。

**润色边界（不要做的）**：
- ❌ 不擅自合并/拆分用户的分点数量（用户写 4 条就保留 4 条，不要并成 2 条）。
- ❌ 不增加用户没写的内容、不脑补根因或动作建议。
- ❌ 不改变用户的核心观点和具体细节（姓名、数字、专有名词、举例）。

**例：**

```
原：1.学历这块，我直接按照常理把3+1的两个学位读成了硕士+本科。
润：①看「3+1」学制结构时，凭惯性默认读成「硕士+本科」，没有验证两段学位的真实层级。
```

回执时**贴出润色后的 problem 和 experience**，让用户一眼能看到改写后的版本——如果改得不对，他会直接说"按我原话写"。

### Step A3 · 横跨分类时的二次确认

只在 `category` 真拿不准（明确横跨两类）时用 AskUserQuestion 单独问一次：

> 这条更像哪种？
> ① 决策判断 ② 执行落地 ③ 沟通协作 ④ 自我管理 ⑤ 认知盲区

否则按 `categories.md` 的优先级（cognition > self-mgmt > decision > communication > execution）直接归类。

### Step A4 · 调用入库脚本

```bash
python3 .../personal-growth/scripts/append_entry.py --json '<JSON 字符串>'
```

脚本自动生成 id、转义、写入 mistakes.md。

### Step A5 · 给用户的回执 + 展示既往 + 询问周报

**每次入库后必须依次完成 3 件事，不能跳。**

**① 入库回执（含润色版）**

```
已记录 · 20260513-002 · 认知盲区
长期总账：~/<你的目录>/犯错总账.md（已更新到 N 条）

润色后入库的版本（如润色幅度 > 0）：
problem：①…… ②…… ③……
experience：①…… ②……

透明说明（如有 borderline 扩展）：……
```

**不复述用户讲过的内容、不补充鸡汤**。

**② 展示本周既往案例（精简列表）**

跑 `analyze_weekly.py --week <本周>`，把本周所有条目按日期升序列出，格式：

```
📊 本周累计：N 条 · 触及 X 个分类（自我管理 a · 沟通协作 b · 认知盲区 c · ……）

· 20260512-001 · 认知盲区 · 看简历凭惯性把「3+1」读成硕士+本科
· 20260513-001 · 认知盲区 · 阿联酋号码任务的 5 个失误
· 20260513-002 · 沟通协作 · 真人测试 3.5 天耗时与多轮对齐
· 20260514-001 · 认知盲区 · 面试安排排序未从老板视角整理 ← 本次
```

「一句话标题」由 Claude 边写边从 `context` 或 `problem` 浓缩，不复述全文。当前刚入库的条目末尾加 `← 本次` 标记。

如果本周条目 > 8 条，分前 4 条 + 「…… 中间还有 X 条 ……」+ 最近 3 条 + 本次。

**③ 用 AskUserQuestion 问是否出周报**

固定两个选项：

```
question: 现在出 W20 周报 PDF 吗？
header: 出周报？
options:
  - "出（推荐）": 当累计 ≥ 3 条或触及 ≥ 2 个分类时建议出。会跑分析 + 生成 PDF 到 周报/ 文件夹
  - "不出，继续记录": 等下次再说
```

如果用户选「出」，直接走主流程 B（Step B2 → B5）。如果选「不出」，结束本轮交互，等下一次输入。

**注意**：第 ③ 步是真正调用 AskUserQuestion 工具，不是文字暗示。让用户能点选回答。

---

## 四、主流程 B：出周报

### Step B1 · 确认范围

默认本 ISO 周（周一至周日）。用户说「上周」「5 月那一周」等，用 AskUserQuestion 确认。

### Step B2 · 跑 analyze_weekly.py

**优先用 `--dubai-week N`**（DW 是本 skill 的官方周次命名）：

```bash
python3 .../scripts/analyze_weekly.py --dubai-week 8 --json-out /tmp/snap.json
```

默认（不传参数）= 今天所属的 Dubai Week。注意：「今天」必须按 0.1 节流程实时验证后再使用。

读 JSON。重点字段：
- `total`：本周条数；为 0 直接告诉用户本周无记录，跳过出 PDF。
- `by_category`：分类分布。
- `entries`：本周所有条目（Claude 直接读这个找通性）。
- `week`：周次标签（如 `"DW8"`）。

### Step B3 · Claude 找通性 + 写两段文字

**脚本只做机械统计**，通性识别和行动建议**由 Claude 边读 entries 边写**。

**找通性的三个角度**：
1. **同场景反复**：scenario 字段重复（如"公众号选题" 出现 3 次）。
2. **同情绪反复**：emotion 字段重复（如"焦虑" 出现 4 次）。
3. **隐藏共性**：detail 字段里出现的相同时间段（"凌晨""开会前"）、相同对象（"对家""甲方"）、相同动作模式（"立刻回""立刻改"）等——这是脚本看不出但 Claude 能识别的。

**summary-md（80 字左右总评）**：
- 看 entries 找一个**首要主题**。
- 不带情绪、不喊鸡汤、不写"加油"。
- ✗ 反例：「本周辛苦了，希望下周继续努力！」
- ✓ 正例：「本周犯错集中在自我管理（4/6），且 3 条均发生在 23 点后，反映出夜间状态管理是首要短板。」

**actions-md（≤3 条具体动作）**：
- 每条必须是「**一周内能验证做没做到**」的。
- ✗ 反例：「提升自我管理能力」
- ✓ 正例：「23 点后任何商务消息进『草稿』，明早再发」

### Step B4 · 跑 render_pdf.py 出 PDF

```bash
python3 .../scripts/render_pdf.py \
  --snapshot /tmp/snap.json \
  --summary-md "<你写的总评>" \
  --actions-md "1. xxx\n2. xxx\n3. xxx" \
  --out "~/Desktop/工作报告/个人成长/周报/2026-W20-周报.pdf"
```

依赖 weasyprint。跑失败时按报错装：`pip install weasyprint --break-system-packages`。

### Step B5 · 给用户 computer:// 链接

PDF 直接生成在 `~/Desktop/工作报告/个人成长/周报/<W>-周报.pdf`，用户能直接打开。

```bash
rm /tmp/snap.json   # 清理临时 JSON
```

回复时只写 3 件事：本周条数、首要主题、Top 1 行动建议 + computer:// 链接。**不复述整份 PDF**。

---

## 五、主流程 C：出日报

跟主流程 B（出周报）共用同一套渲染脚本，只是数据范围从「本 ISO 周」缩到「指定那一天」，PDF 标题、章节、stat 卡片文案自动切换成「日报」版。

### Step C1 · 确认日期

默认今天。用户说「昨天」「上周一」「5/30」等，用 AskUserQuestion 二次确认具体哪一天（`YYYY-MM-DD`）。

### Step C2 · 跑 analyze_daily.py

```bash
python3 .../scripts/analyze_daily.py --date 2026-06-02 --json-out /tmp/snap_daily.json
```

读 JSON。重点字段：
- `total`：当日条数；为 0 直接告诉用户「这一天无记录」，跳过出 PDF。
- `by_category`：分类分布。
- `entries`：当日所有条目。
- `report_type`：固定 `"daily"`——render_pdf.py 据此切日报排版。

### Step C3 · Claude 写总评 + 行动建议

**日报与周报的核心差异**：

- **summary-md（≤120 字）**：
    - 描述今天的"主轴"——做错了什么 / 吸收了什么方法 / 触及了哪几个分类。
    - **明确区分"实际失误"和"方法吸收"两种条目类型**——这是日报特有的判断：如果今天 N 条全是「整理别人建议 / 看书顿悟」类，要在总评里点出"今天是方法吸收日，没有实际失误复盘"，避免把方法吸收的数量等同于成长效果。
    - 不写鸡汤。
- **actions-md（≤3 条）**：
    - 每条必须是「**今晚或明天能验证做没做到**」的（不是"下周"）。
    - 优先把今天记下的方法 / 经验转化成一个明天能立即尝试的小动作。
    - ✗ 反例：「以后注意 XX」
    - ✓ 正例：「今晚 22:00 前拿张纸写明天 3 件最重要的事，明早第一件事看这张纸」

### Step C4 · 跑 render_pdf.py 出 PDF

```bash
python3 .../scripts/render_pdf.py \
  --snapshot /tmp/snap_daily.json \
  --summary-md "<总评>" \
  --actions-md "1. xxx\n2. xxx" \
  --out "~/Desktop/工作报告/个人成长/日报/2026-06-02-日报.pdf"
```

`report_type` 已写进 snapshot，标题/章节自动切换；**不需要额外传 --report-type**。

### Step C5 · 给用户 computer:// 链接

PDF 直接生成在 `~/Desktop/工作报告/个人成长/日报/<YYYY-MM-DD>-日报.pdf`。

```bash
rm /tmp/snap_daily.json
```

回复只写 3 件事：今日条数、首要主题（含"实际失误 vs 方法吸收"判断）、Top 1 行动建议 + computer:// 链接。

---

## 六、关键约束

1. **不擅自篡改用户原话**：`detail` 保留具体描述，不润色成"高大上"版。
2. **不脑补 response**：用户没想到的改进，就让 response 为空。
3. **分类不糊涂**：拿不准时打开 `categories.md` 再判，不靠记忆。
4. **不打断长期总账**：脚本永远追加，不允许重排已有行。
5. **每次入库后回执必须含 id**：方便用户后续修正某条。
6. **首周特殊处理**：总条数 < 5 时不强行做通性分析，照实写「数据量较少，暂未识别可靠模式」。

