Skip to main content
ClaudeWave
Skill105 repo starsupdated yesterday

wjs-distilling-style

Use when the user wants to capture a writer's voice from a few sample articles and rewrite text to sound like that author — "蒸馏文风", "提炼XX的风格", "把这篇改成XX的味儿", "学某某笔法改写", "mimic this writer", "match this author's style", "style transfer". Works for any author, 王建硕 included.

Install in Claude Code
Copy
git clone --depth 1 https://github.com/jianshuo/claude-skills /tmp/wjs-distilling-style && cp -r /tmp/wjs-distilling-style/wjs-distilling-style ~/.claude/skills/wjs-distilling-style
Then start a new Claude Code session; the skill loads automatically.

SKILL.md

# 蒸馏文风 · Style Fingerprint

## 核心原则

> 风格不是形容词,是指纹。能照着复现的,才叫蒸馏出来了。

裸模型做这件事会犯三个错(已实测):(1) 风格观察临时拼凑、混入内容立场、不可复用;(2) 改写后没人盲测,自己既当运动员又当裁判,悄悄滑回平庸 AI 腔;(3) 改写时擅自加料删料,把原文事实改没了。这个 skill 用**结构化指纹 + 独立判官盲测 + 事实骨架纪律**钉死这三点。

两个模式:**蒸馏**(样本 → Style Card 文件)和**改写**(目标文章 + Style Card → 改写稿,带盲测闭环)。

## 何时用

- 用户给几篇某作者的文章,想提炼他怎么写
- 用户想把一段话 / 一篇稿 / 一份 AI 生成的文本改成某作者的味儿
- 不适用:用户要的是这个人**怎么思考**(心智模型、世界观、角色扮演)→ 那是 `huashu-nuwa`,不是这里;本 skill 只管**怎么写**。

## 存储(独立库,不进公开 repo)

```
~/code/style-cards/<author-slug>/
  samples/          # 喂进来的原始样本
  style-card.md     # 蒸馏出的 Style Fingerprint(真源,人可读可手改)
  rewrites/         # 历史改写稿(可选)
```
wjs-* skill 会自动同步到公开 repo,所以别人的稿子和卡片放这个独立库,不外泄。库或作者目录不存在就先建。

## Style Fingerprint — 9 轴

每一轴写三件事:**观察**(样本里看到什么)、**可执行规则**(改写时怎么照做)、**锚点原句**(从样本摘 2–3 句真实原句)。规则会骗人,原句不会——没有锚点的轴等于没蒸馏。

| # | 轴 | 抓什么 |
|---|---|---|
| 1 | 句子节奏 | 长短句分布、长短交替的拍子、标点签名(破折号/省略号/问句/感叹) |
| 2 | 段落长度 | 平均段长、有没有单句成段、长段密度 |
| 3 | 词汇 | 高频词、口头禅、自造词、人称、成语/网络语倾向、中英混用、用词雅俗 |
| 4 | 语气腔调 | 自信度、距离感(亲密 vs 客观)、正式度、幽默 |
| 5 | 论证结构 | 断言先行 vs 层层铺垫、是否用小标题/列表/表格、推进路径 |
| 6 | 比喻运用 | 家常 vs 抽象、频率、抽象↔具体之间怎么架梯子 |
| 7 | 情绪强度 | 情绪温度、克制 vs 喷发、感叹密度 |
| 8 | 开头与收尾 | 怎么起(断言/场景/钩子)、怎么落地收束 |
| 9 | 雷区 | 他绝不会做的事(如不用小白提问钩子、不写没验证过的、不用某类书面词) |

模板见 `references/style-card-template.md`,直接照着填。

**别把内容立场写进指纹**:「他爱唱反调」「他三观是 X」是*想法*不是*文风*。指纹只抓「怎么写」——同一个观点换了他来写会长什么样。

**「调料不是公式」校准注(写进每张卡)**:签名动作(造词 / 家常比喻 / 单句成段 / 破折号)是**工具**不是**清单**。短内容就短写,别把每个签名动作都堆满——堆满就是拙劣模仿,不是那个人。

**9 轴 → 几十个细颗粒维度(推荐成卡形态)**:9 轴是起手拆解的脚手架。成卡时拆成 ~30–45 个**细颗粒可执行维度**,分组放表格(句子与标点 / 段落 / 词汇 / 语气 / 论证 / 比喻 / 开头 / 结尾 / 锚点纪律 / 雷区…),**每维一句「怎么样的」规则**。蒸馏过程靠锚点原句校准(必须,否则规则空转),但**成卡里例子要精简**——例子不一定典型、容易被当公式照搬,规则才有通用性。这是给「别的模型批量照着写」用的形态。

## 蒸馏流程

1. 样本入库 `samples/`。建议 3–6 篇,覆盖不同主题 / 长度。**少于 3 篇要明确提示用户:指纹会不稳、容易把一篇的偶然写法当成签名。**
2. 长样本起一个 subagent 做 9 轴拆解,避免污染主上下文,只回收结构化结果。
3. 逐轴分析,每轴**必须摘锚点原句**。
4. 写出 `style-card.md`(照模板),让用户过目 / 手改。

## 改写流程(带盲测闭环)

```dot
digraph rewrite {
  "抽事实骨架" [shape=box];
  "按9轴改写" [shape=box];
  "独立判官盲测" [shape=box];
  "达标?" [shape=diamond];
  "拿判官具体意见回炉" [shape=box];
  "对照骨架查事实" [shape=box];
  "交稿" [shape=box];
  "抽事实骨架" -> "按9轴改写" -> "独立判官盲测" -> "达标?";
  "达标?" -> "拿判官具体意见回炉" [label="否, 最多2-3轮"];
  "拿判官具体意见回炉" -> "独立判官盲测";
  "达标?" -> "对照骨架查事实" [label="是"];
  "对照骨架查事实" -> "交稿";
}
```

1. **抽事实骨架**:先把目标文章的论点 / 信息 / 结论列成几条 bullet。这是「保事实」的锚——改写**不增不减**这些事实,只换怎么说。
2. **按 9 轴改写**:允许调开头 / 收尾 / 节奏 / 小标题 / 段落切分,但事实骨架原样保留。
3. **独立判官盲测(必做,不可跳)**:起一个 subagent,**只给它 Style Card 的锚点 + 改写稿,不给原文、不告诉它这是 AI 改的**。判官 prompt 见 `references/judge-prompt.md`。它输出:逐轴相似度评分(1–5)、具体出戏句列表、缺失/过载的签名动作。
4. **不达标回炉**:默认阈值平均 ≥4/5 且无单轴 ≤2。不过标就拿判官的**具体出戏句**回炉重改,再测,最多 2–3 轮。
   - **判官报「缺某签名动作」≠ 授权加料**。常见的是判官说「缺他招牌的『带数字亲历账』」——如果原文事实骨架里没有这个事实,**绝不能为了凑分替作者编一段**。那一轴宁可拿 4 不拿 5。风格满分和事实纪律冲突时,事实纪律赢。能补的只有「换说法」,不能补「新事实」。
5. **对照骨架查事实**:交稿前比对第 1 步的骨架,有没有篡改 / 丢失 / 新增事实。改写可以换说法,不能换事实。

判官子 agent 是「同一个模型既当运动员又当裁判」的唯一解药。**自己读一遍觉得挺像 ≠ 像**——这正是裸模型滑回平庸的入口。

## 强校验:图灵判别盲测(验卡到底硬不硬)

上面的相似度判官问「像不像」;要量化验证整张卡,再上一关**图灵判别盲测**:把 AI 仿写混进真迹里,让一个**崭新、不同模型**的判官盲猜每篇是「真迹」还是「AI 仿的」,正确率 **≤ 50%(瞎猜)算过**。完整操作(选样 / 只给标题+30字从零写 / 剥光元信息归一化 / 异模型判官读整批 / 算分回炉 / 部署到 jianshuo.dev profile)见 **`references/turing-blindtest.md`**。

跑这一关前,先读 **`references/ai-tells.md`**——9 轮实测逼出的 **AI 最易露馅的 6 处**(缺真实专名 / 结尾太圆 / 推进太顺 / 鸡汤教科书化 / 批次指纹 / 文章原型不匹配)+ 逐条反制。**把这 6 条反制写进每张风格卡的尾部**(裸模型照 9 轴写仍会稳定踩这 6 个坑)。

**诚实的天花板(别给用户画大饼)**:平衡盘里判官对真迹召回近 100%,正确率地板就是 50%,「稳定压到 50% 以下」基本做不到。但**单篇经常蒙混**(纯记叙/观察型常 4/6 骗过很毒的判官,一点题落金句就被抓)。所以卡的主场是**润色/改写作者已有真实素材**,不是凭空批量伪造整本文集。

## 红旗——出现就是要回到正轨

- 「这段我自己看挺像的,不用再起判官了」→ 自评不算数,盲测必做
- 「直接列几条风格特点就开始改」→ 没填 9 轴模板、没摘锚点 = 没蒸馏
- 「原文这句不够味儿,我给它补一句」→ 停,事实骨架不增不减,加料是改内容不是改风格
- 「判官说缺他招牌的某个动作,我加段亲历账/数字凑上去」→ 停,原文没这事实就不能编,那一轴拿 4 也认
- 「把造词、比喻、小标题全用上更像」→ 堆满是拙劣模仿,看调料校准注
- 「样本就两篇,够了」→ 提示用户指纹会不稳
- 「给 AI 详细骨架/多句要点让它改写」→ 那是复述原文,等于作弊;图灵测从零生成只给标题+30字(turing-blindtest.md)
- 「拿 AI 润色过的稿当真迹基准」→ 人/AI 界限糊了,测了白测;要纯手写真迹
- 「盲测直接把文章丢给判官」→ 没剥元信息/没抹 markdown/段间空行没统一 = 判官靠格式取胜,无效
- 「6 篇 AI 都用同一个招牌崩裂/收尾」→ 批次指纹,判官一锅端;每篇换花样
- 「向用户保证能压到 50% 以下」→ 平衡盘地板就是 50%,别承诺,讲清单篇能蒙混即可

## 常见错误

| 错误 | 后果 | 修正 |
|------|------|------|
| 指纹只有抽象规则,没锚点原句 | 改写时规则空转,套不出味儿 | 每轴强制摘 2–3 句真实原句 |
| 把内容立场当文风 | 改写跑偏成换观点 | 指纹只问「怎么写」 |
| 跳过判官盲测 | 滑回平庸 AI 腔自己不知道 | 判官必做,盲、独立 |
| 改写顺手加料删料 | 原意被改 | 先抽事实骨架,改写不增不减 |
| 签名动作堆满 | 拙劣模仿 | 短内容短写,调料不是公式 |
| 图灵测给写手太多信息 | AI 复述原文,测了个寂寞 | 只给标题 + ≤30 字中心思想,从零写 |
| 盲测不归一化格式 | 判官靠格式而非文风取胜 | 剥元信息 + 抹 markdown + 统一段间空行 |
| 一批 AI 同款签名动作 | 批次指纹被一锅端 | 每篇换不同的崩裂/收尾,原型与真迹对齐 |
| AI 文末非要升华点题 | 落「可迁移金句」最招判官 | 纯记叙不点题,结尾散开不收口 |
skill-quality-reviewerSubagent

Repo-wide drift detector for the wjs-* Claude Code skills in this marketplace. Sweeps every SKILL.md, scores it against the repo's own conventions (V-ing naming, trigger-phrase density, companion files, description shape), and returns a grouped punch list ordered by severity. Read-only — never edits files. Use before pushing a batch of skill changes, or whenever you wonder "are these skills still internally consistent?

wangjianshuo-perspectiveSkill

|

wjs-auditing-projectSkill

Use when the user asks to audit what's wrong with a project, "make it right", "看看项目出了什么问题", "为什么用户的需求还没上线", "为什么没提交App Store", "为什么没新build", or wants a holistic state-of-the-project check covering unmerged branches, stalled PRs, failed GitHub Actions, stale builds, plan drift (TODOS.md / ROADMAP), unreleased commits, and log errors. Runs read-only investigation, presents a grouped checklist, fixes only after explicit user confirmation. Aware of the Cathier iOS app workflow (Xcode + fastlane + auto-merge @claude PRs from in-app feedback).

wjs-burning-subtitlesSkill

Use when the user has a video + an SRT and wants the subtitles either burned into the pixels (libass, always-visible) or soft-muxed as a togglable track. Also handles the final composite step for the localization pipeline — burn subs, mix a dub track, and keep the original audio as a low-volume bed, all in ONE ffmpeg encode (no cascade). Verifies libass availability and auto-downloads a static evermeet ffmpeg build when Homebrew's stripped binary lacks it. Triggers — "烧字幕", "硬字幕", "burn subtitles", "burn-in subs", "embed subtitle", "soft mux SRT", "把字幕烧进视频", "做最终合成".

wjs-cleaning-spamSkill

Use when the user complains about spam on his X/Twitter posts — 同城面付 / 寻固炮 / 线下上门 / 免费破处 这类引流号在他推文下刷的 emoji 垃圾回复 — and wants them removed. Covers the last 7 days (X recent-search window). Triggers — "把这些spam删掉", "清理X垃圾回复", "推文下面好多引流号", "clean spam replies", "/wjs-cleaning-spam".

wjs-converting-text-to-videoSkill

Use when the user wants a 王建硕-style WeChat article (article.md) turned into a narrated short MP4 video — TTS voiceover via 火山引擎 Volcano TTS, HyperFrames CSS/GSAP animation per scene, subtle SFX, abstract watercolor background, full pipeline rendering to 1080×1920 portrait MP4 (30-90s). Triggers — "把这篇文章做成视频", "做一个解说视频", "讲解视频", "/wjs-converting-text-to-video".

wjs-converting-wp-to-hugoSkill

Use when migrating a WordPress site to a Hugo static site on GitHub Pages from a WXR export (.xml) plus the wp-content/uploads folder — preserving /archives/<id>/ URLs, localizing images, and deploying via GitHub Actions. Triggers — "把 WordPress 迁成 Hugo", "wordpress 转静态站", "migrate WordPress to Hugo", "WXR to Hugo", "publish WordPress to GitHub Pages", "/wjs-converting-wp-to-hugo".

wjs-dubbing-videoSkill

Use when the user has a video + a target-language SRT and wants the video to actually speak that language — generates a time-aligned TTS voice dub. Routes by voice ID — Volcano (豆包) TTS for Chinese, edge-tts neural for any language. Defaults to one voice (single-speaker); opt-in multi-speaker via visual diarization. Outputs `*_<lang>_dub.mp4` with the dub audio in place of the original. Final mixing (audio bed + burn-in) is handed off to `/wjs-burning-subtitles`. Triggers — "配音", "中文配音", "Chinese dub", "voice over this", "dub the video", "TTS this SRT", "different voice for each speaker".