Skip to content

aimonj0729-ai/jay-chou-skill

Repository files navigation

🎧 Jay Chou Skill for Claude Code

把一个深夜灵感,打磨成一首有画面、有转折、有 Hook 的华语流行歌方案。

灵感碎片词人风格旋律/和声蓝图编曲推进原创性检查

Claude Code CPop Data

一句话介绍 这是一个面向 Claude Code 的华语流行创作 Skill:把周杰伦作品里的高层创作规律,拆成可复用、可检查、可继续改写的原创歌曲方案生成流程。

不是复刻歌,不是洗稿机。 它只输出创作原则、风格参数、结构方案、意象系统和编曲路线,帮你从“脑子里有点感觉”走到“可以开工制作”。

🎭 Repo 气质卡

你打开它时 它负责把你带到
我只想到:雨夜、钢琴、毕业 一套完整的情绪弧线、段落结构和 Hook 方案
副歌有点平,但说不上来哪里不对 3 种可执行的旋律改造方向
想要方文山味,但不能像作业 词人风格适配 + 原创性风险检查
Meme 状态 我:就两个字“深夜”Skill:给你端出一整套雨夜 R&B 宇宙

⚠️ 版权与使用说明
本 Skill 基于对华语流行音乐创作规律的数据分析,不复制任何现有作品。产出的是原创的创作方案(文字描述、结构建议、和弦标记),不包含音频、MIDI 或歌词复制。商用前请确保最终作品不侵犯第三方版权。

✨ 为什么这个 Skill 能让你眼前一亮

🎹 你不是在"模仿周杰伦",你在学习他用了 20 年的"创作语法"

这个 skill 不是告诉你"《晴天》用了什么和弦",而是告诉你:

  • ✅ 为什么周杰伦的副歌总是在 Bridge 之后 才到情绪顶点?(78% 作品的数据支撑)
  • ✅ 为什么他的歌词从不说"我很孤独",而是说"便利店的白灯亮到早上六点"?(Top 20 意象词频统计)
  • ✅ 为什么 Intro 只有 4 小节,Outro 却给 8–12 小节?(LUFS 动态曲线 -22dB → -5dB)
  • ✅ 为什么hook总是 "弱起进入 + 四度上行 + 小切分" ?(32% 作品动机分布)

这不是模仿,这是解构华语流行乐的DNA。

🎭 v1.1 新功能:词人风格适配 & 跨风格融合

  • 词人风格适配:选择方文山(古典白描)、黄俊郎(超现实暗黑)、周杰伦自填词(口语直觉)三种词人人格,影响歌词的意象、句法、叙事和押韵
  • 跨风格融合:将周杰伦风格与爵士/电子/拉丁/深度R&B/管弦乐/民谣/世界音乐/Trap 做有控制的融合,支持 90:10 到 30:70 的比例调节

📊 基于真实数据,不是凭空想象

我们分析了 148 首周杰伦作品的音频报告(2000《Jay》→ 现在),提取了:

  • 调性分布(D minor 占 12.8% 🏆)
  • BPM 双峰分布(70–89 占 32%,110–125 占 28%)
  • Top 20 意象词频(雨:37首、风:28首、街:24首)
  • LUFS 动态范围(17 dB 从 -22 到 -5)
  • Hook 动机分布(四度上行 32%,三度下行 28%)

每个建议背后都有统计支撑,不是凭感觉瞎给。


🚀 五种玩法,总有一款戳中你

玩法 1:零基础写歌(冷启动模式)

你说:"我想写首歌,但只给了"深夜"两个字"

Skill 问你

"这个深夜,你是独处还是等人?情绪从压抑到释怀,还是一直内收?"
"倾向钢琴主导还是电钢R&B?"
"主题偏城市夜景还是内心独白?"

答完后,Skill 自动补全所有参数,给你完整 10 段方案。

玩法 2:有灵感但卡住了(局部优化模式)

你说:"这段副歌旋律太平了,怎么让它更有周杰伦的 hook 感?"

Skill 给你

  • 3 个 hook 改造方案(四度跳跃 / 小切分记忆点 / 真假声边缘)
  • 每个方案的音区范围 + 节奏型 + 统计支撑
  • 推荐组合:B + C,并告诉你为什么(在 42% 作品中出现)

玩法 3:完整创作(端到端模式)

你说:"写一首关于毕业前夜的周杰伦风格歌,钢琴开头,情绪克制到释怀,轻 R&B 律动,东方画面感,副歌要大记忆点"

Skill 直接输出

### 1. 核心概念
毕业前夜的华语抒情流行,钢琴主导,小调都市感,意象锚定在"教室/风扇/白衬衫/未完的告别",情绪弧线:克制 → 推进 → 释放 → 留白

### 2. 情绪轨迹
Intro(收) → V1(克制) → Pre(起势) → C1(释放) → V2(回落不全) → Pre2(更急) → C2(再满) → Bridge(断开) → C3(最大释放) → Outro(留白)

### 3. 结构建议
Intro(4) - V1(8) - Pre(4) - C1(8) - V2(8) - Pre2(4) - C2(8) - Bridge(8) - C3(12) - Outro(8)

### 4. 和声方向
Key: D minor
Verse: Dm7 - Gm7 - Am7 - Gm7
Pre: Am7 - Bbmaj7 - Gm7 - A7
Chorus: Gm7 - Am7 - Dm - Bb
Bridge: 转 F major (F - Gm7 - Am7 - C)

### 5. 旋律设计
Verse: 弱起进入,C4-F4,二三度级进为主
Pre: 音区爬到 G4,十六分音符密集
Chorus: 首句 F4→A4 四度上行(记忆点),第2小节小切分 16-16-8
Bridge: 降到 A3-D4,节奏放缓,预留假声翻高到 C5

### 6. 歌词意象
物件:风扇、白衬衫、未写完的留言册、窗外的蝉鸣
押韵:主歌松韵(en/ing),副歌开口韵(ang/ai),Bridge 闭口韵(i)
示例句:
- 风扇在头顶转完最后一圈
- 我把你的留言册折到第33页
- 这城市太急,容不下慢慢告别的我们

### 7. 编曲推进
Intro: Piano 分解和弦,淡混响,LUFS -18
V1: Vocal + Piano + 淡 Pad(-12)
Pre: +Strings 长音 + EP(-10)
C1: +Drums 正拍 + 和声(-8)
Bridge: 鼓退出,只剩 Piano + 单音对位(-9)
C3: 全员满编,+副旋律 + 和声堆(-5)
Outro: 逐轨减,Piano 单音 + Strings 长尾,最后 2 小节静默

### 8. Hook 构思
动机: F4→A4 四度上行(3拍长音) + 第2小节 16-16-8 切分
歌词锚点: "这城市太急" 的 "急" 字在四度跳上,制造刺耳感

### 9. 原创性风险检查
✅ 歌词陈词: PASS
✅ 意象密度: PASS (每节 ≤3)
⚠️ Hook 相似度: WARN (四度上行常见,建议加切分和假声强化独特性)
✅ 结构: PASS
✅ 编曲信息量: PASS

### 10. 去相似化建议
在四度跳跃后加一个滑音(portamento),让真假声转换成为"声音变形"的动作,识别度提升。

📦 安装与使用

前置要求

  • 已安装并能启动 Claude Code
  • 能写入用户级 Skill 目录 ~/.claude/skills/

安装步骤

# 1. 克隆到 Claude Code 的用户级 Skill 目录
git clone https://github.com/aimonj0729-ai/jay-chou-skill.git ~/.claude/skills/jay-chou

# 2. 确认 Skill 入口文件存在
test -f ~/.claude/skills/jay-chou/SKILL.md && echo "jay-chou skill installed"

# 3. 启动一个新的 Claude Code 会话
claude

Claude Code 会在会话启动时发现 ~/.claude/skills/jay-chou/SKILL.md。如果安装时已经打开了 Claude Code,请退出后重新启动会话。

启动 Skill 的两种方式

方式 1:在 Claude Code 会话中显式调用

/jay-chou 写一首关于深夜独处的周杰伦风格歌,钢琴主导,情绪克制

方式 2:自然语言触发

写一首关于毕业前夜的周杰伦风格歌,钢琴开头,情绪从克制到释怀

Claude Code 会根据 SKILL.mddescription 判断是否自动加载该 Skill。官方技能机制与目录约定见 Claude Code Skills 文档

仓库同时提供结构化输入/输出合同,供你在自己的 Agent SDK 或自动化中实现调用;它们是 JSON Schema 示例,不是 Claude Code 内置的 claude.skills.load() JavaScript API。如果使用 output_format: "json"risk_check 里的状态标签与 markdown 第 9 段保持同一套枚举:PASS / WARN / BLOCK。融合模式下可额外返回 fusion_notesfusion_notes 对应 markdown 里的附加 Fusion Notes / 融合说明;默认不计入 10 段正文,如果你想继续编号,写成 ### 11. 融合说明 或更深的 markdown 标题层级也算合法。

如果你准备直接接结构化输出,仓库里现在有一对可复制的样例:

  • schemas/input_example.json:完整演示 JSON 请求如何表达主题、情绪、词人人格和 fusion
  • schemas/output_example.json:对应的 10 段 JSON 响应,包含 risk_check 与融合模式下的 fusion_notes

当前 schema 还额外收紧了 6 条最容易踩坑的嵌套合同:

  • 顶层和主要嵌套对象不接受未声明字段,能拦住拼错字段名或残留旧字段
  • emotion 不能是空对象;至少给 startend
  • emotional_arc.anchorslyric_direction.sample_lines 都限制为 3–5 项,与 Skill 输出模板一致
  • 输出第 4–8 段和第 10 段不能只传空对象;和声、旋律、歌词、编曲、Hook 与去相似化段落都必须包含最低可用字段
  • lyric_direction.sample_lines[] 的每一项都必须同时带 sectiontext
  • de_similarization.actions[] 的每一项都必须同时带 target_sectionissuerewrite

如果你想确认这两份样例没有和 schema 漂移,可以直接运行:

python3 test_runner.py --validate-structured-examples

玩法 4:指定词人风格(词人人格模式)🆕

你说:"用方文山的笔法写一首关于被遗忘的渡口的中国风歌"

Skill 给你

  • 歌词意象全部用古典白描 + 电影蒙太奇句法
  • 押韵策略切换为方文山偏好的精密内韵
  • 示例句风格:一句一景,名词并置,留白代替说明

其他词人

用黄俊郎的暗黑风格写一首关于镜子里另一个自己的歌
→ 超现实意象、意识流句法、哲学隐喻

写一首周杰伦自填词风格的关于便利店打工的歌
→ 口语直觉、生活物件、不修饰的真实感

玩法 5:跨风格融合(融合模式)🆕

你说:"周杰伦 × 爵士,70:30,写一首深夜酒吧独白的歌"

Skill 给你

  • 和声注入爵士色彩(ii-V-I 进行、属13和弦)
  • 节奏加入 swing feel
  • 结构/情绪/歌词保持周杰伦风格
  • 每个维度标注来源:[JC] / [F] / [MIX]

更多融合

中国风 × 电子,50:50,赛博古风的感觉
→ 古筝采样 + 合成器 Pad,pentatonic 旋律 + 电子节拍

周杰伦 × 拉丁,70:30,夏天海边的感觉
→ Clave 节奏注入、尼龙吉他、拉丁打击乐

支持 8 种预置风格:Jazz / Electronic / Latin / Deep R&B / Orchestral / Folk / World / Trap

完整联动示例见 examples.md 的 Example 4:方文山人格 × Electronic 50:50,包含 [JC] / [F] / [MIX] 来源标记和 Fusion Notes


🎓 从灵感碎片到完整歌曲的 5 步路径

Step 1: 你只有一个模糊词

你有:"深夜"

Skill 帮你:追问 2-3 个核心问题 → 确定主题、情绪、风格

你得到:一份完整的 10 段创作蓝图

Step 2: 你有一个段落动机

你有:一段 Pre-chorus 的旋律,但不知道怎么推向副歌

Skill 帮你:调 melody_designer.md,给你 3 种音区上行方案 + 节奏密度递增策略

你得到:Pre → Chorus 的平滑过渡 + Hook 锚点设计

Step 3: 你有一段歌词,但太直白

你有:"我很难过,想念你,我们在雨里分手"

Skill 帮你:调 lyric_builder.md,用白描句法改造 → "伞收好了放进抽屉 / 白灯在便利店亮到早上六点"

你得到:意象密度合规、抽象词 ≤30%、每句都有物件锚定的歌词

Step 4: 你的副歌 hook 记不住

你有:一段旋律,但唱两遍就腻

Skill 帮你:调 melody_designer.md → 四度上行 + 小切分 + 假声空间三选一,告诉你哪个组合在 148 首里出现频率最高

你得到:识别度提升 3 倍的 hook

Step 5: 你怕写得太像某首歌

你有:完整 demo,但总觉得像《晴天》

Skill 帮你:跑 similarity_guard → 8 项检查(旋律/歌词/和声/结构/编曲)→ 输出 PASS/WARN/BLOCK → 给具体改写建议

你得到:去相似化后的版本 + 风险报告


🎯 写给不同用户的 Quick Guide

如果你是词曲作者

痛点:有灵感但不知道怎么把它变成"有华语流行感"的歌

用这个 skill

  • 输入你的主题词(如"毕业""深夜"),看模块 E 输出的完整 10 段
  • 抄走 structure、chord progression、melody range、lyric imagery 这些框架
  • 填入你自己的旋律和歌词,保证骨架是周杰伦同款的

效果:从"感觉像 demo"升级到"感觉像专业制作"

如果你是编曲/制作人

痛点:客户说"要周杰伦那种感觉",但给不出具体技术参数

用这个 skill

  • 看模块 D (arrangement_planner.md) 的六段式层次推进表
  • 照着 LUFS 动态曲线调音(Intro -18 → C3 -5 dB)
  • 照着配器时间轴加轨(Pre2 进 Guitar,Bridge 退鼓组,C3 满编)

效果:客户说"对,就是这个味儿"

如果你是音乐爱好者

痛点:想写歌但不知道怎么开始

用这个 skill

  • 看 Quick Start 里的 3 种玩法
  • 先从"模糊需求"模式开始,让 skill 问你 2-3 个问题
  • 拿到第一份 10 段方案,模仿着写

效果:从零到第一首歌,可能只需要一个下午

如果你是AI研究者

痛点:想知道怎么把音乐知识蒸馏成 skill

看这个 skill 的架构

  • song_analyzer.md:知识根,9 维度规律 + 148 首统计
  • melody/lyric/arrangement:三个下游模块,从知识根取数据切片
  • original_song_generator.md:编排器,调用链 + 冲突解决
  • test_runner.py + test_runner.md:可执行验证脚本 + 验收规范,可集成 CI/CD

效果:理解如何构建可验证、可迭代、数据驱动的 AI 音乐 skill


💎 技术亮点(给 geek 看)

1. Tier 3 数据驱动(不是主观经验)

模块 数据来源 统计量
调性分布 148 首实际调性标记 D minor 12.8%, A minor 9.5%
意象词频 歌词文本分析 雨 37 首, 风 28 首, 街 24 首
LUFS 动态 音频响度分析 -22 dB → -5 dB, 范围 17 dB
Hook 动机 旋律轮廓识别 四度上行 32%, 三度下行 28%
押韵模式 歌词押韵标注 松韵 48%, 严格押韵 34%

2. 概率化冷启动决策

用户只给"毕业" →

  • tempo: 75-85 (78% 置信度 ★★★)
  • key: D/A major (82% 置信度 ★★★)
  • 意象系统: 青春回忆 (91% 置信度 ★★★)

不再是"我觉得应该是这样",而是"基于148首统计,最佳参数组合是..."

3. 可验证输出

当前仓库的验证链分成两层:

  • similarity_guard 是 Skill 设计里的内容自检层,负责第 9 / 10 段的风险与去相似化建议
  • test_runner.py 是仓库内的回归检查脚本,负责校验 test_cases/ 结构,以及对已保存的 markdown 输出做规则检查

test_runner.py 当前能直接检查的内容包括:

  • test_cases/*.md 是否包含用途 / 输入 / 预期行为 / 验收清单
  • ✓ 在预期应输出完整方案的场景里,生成结果是否包含完整、按顺序且不重复的 10 段编号章节(支持 ## 1.###### 1. 这类标题层级)
  • ✓ 在预期应输出完整方案的场景里,第 9 段是否带 PASS / WARN / BLOCK
  • ✓ 在预期应输出完整方案的场景里,第 10 段是否给出明确处理方向
  • test_01test_06 的关键场景规则,例如 test_01 只统计显式 示例句 列表项,test_02 的完整方案分支会检查 轻 R&B / 小调都市感 / 电钢铺底 / 副歌 Pad 扩张 / 城市夜景 5 项参数证据,test_04 会额外要求第 9 段显式给出 和声相似度Hook 相似度PASS/BLOCK 结论,此外还覆盖冷启动提问、复制请求拒绝、东方陈词黑名单,以及 v1.1 的词人人格 / 融合标记检查
  • ✓ 已保存输出若损坏或不是 UTF-8,会在报告中记为 生成结果FAIL;批量模式继续检查其他文件,不会抛 traceback

schemas/input_schema.jsonschemas/output_schema.json 仍然保留,主要用于结构化集成和人工对照;当前 test_runner.py 不会直接对 markdown 输出执行通用 JSON Schema 校验。结构化输出里的 risk_check.overall 也与文档中的 Similarity Guard 保持一致,统一使用 PASS / WARN / BLOCK。 如果你需要一个现成的结构化对接起点,可以直接复制 schemas/input_example.jsonschemas/output_example.json;现在 tests/test_test_runner.py 会校验它们持续满足 schema 合同,并会覆盖顶层和主要嵌套对象的未知字段拒绝规则。内建校验也支持 minLength / maxLength,因此空的 theme、情绪锚点、reference_moodsong_concept 不会再被当作有效内容。python3 test_runner.py --validate-structured-examples 可以在 CLI 里显式跑这组检查。

可集成 CI/CD

cd ~/.claude/skills/jay-chou
python3 test_runner.py
# 校验 test_cases/ 套件结构,并生成 test-report.md

python3 test_runner.py --test test_04.md
# 只检查一个用例文档;--test 接受文件名、repo 相对路径或绝对路径
# 路径写错时脚本会直接报错退出

python3 test_runner.py --test ./test_cases/test_04.md
# 如果你更习惯直接复制仓库里的路径,这种写法也可以

python3 test_runner.py --test test_04.md --output ./generated_outputs/test_04.md
# 聚焦单个用例及其对应输出
# --output 需要配合单个 --test,且文件必须已经存在

python3 test_runner.py --output-dir ./generated_outputs
# 在已有生成结果文件时,继续校验 10 段结构 / Similarity Guard / 冷启动规则 / v1.1 融合标记
# 对 test_02 的澄清问题分支和 test_05 的首轮响应,脚本会改走冷启动规则,不强制要求 10 段
# 如果 test_02 走的是完整方案分支,脚本还会检查 5 个输入参数是否都在输出里有明确证据
# `test_04.md` 还会额外检查第 9 段是否显式给出和声相似度与 Hook 相似度的 PASS/BLOCK 结论
# `test_06.md` 还会额外检查融合比例、来源标记和融合说明
# 融合说明默认是第 10 段后的附加说明;若继续编号成 `### 11.` / `#### 11. 融合说明 / Fusion Notes`,也会被视为合法
# 目录中的文件名需对应为 test_01.md、test_02.md ...
# 如果某个同名路径其实是目录而不是 markdown 文件,报告会给 WARN,不会抛 traceback
# 如果某个输出文件损坏或不是 UTF-8,报告会给 `生成结果` FAIL,并继续检查其他文件
# --output-dir 必须是已存在目录;路径写错时脚本会直接报错退出
# 同样地,--test 目标文件不存在或不是文件时也会直接报错退出

python3 test_runner.py --report-file ./reports/jay-chou-test-report.md
# 自定义报告输出位置
# --report-file 的父目录必须已存在;如果路径指向目录或父目录不存在,脚本会直接报错退出

python3 test_runner.py --validate-structured-examples
# 对仓库自带的 input/output JSON example 执行内建 schema 子集校验
# 适合在修改 schemas/*.json 或 *_example.json 后快速确认合同没有漂移

4. 多层次抽象架构

用户输入
    ↓
[Input Schema] ← 规范化
    ↓
[Original Song Generator] ← 编排器:主题→情绪→结构→和声→旋律→歌词→编曲
    ├─→ [Song Analyzer] ← 知识根(Tier 3 数据)
    ├─→ [Melody Designer] ← 旋律建议(统计支撑)
    ├─→ [Lyric Builder] ← 歌词策划(意象词频 + 押韵模式)
    │     └─→ [Lyricist Persona] ← 🆕 词人风格适配(方文山/黄俊郎/自填词)
    ├─→ [Arrangement Planner] ← 编曲方案(LUFS 动态 + 配器频率)
    │     └─→ [Style Fusion] ← 🆕 跨风格融合(Jazz/Electronic/Latin/...)
    └─→ [Similarity Guard] ← 自检(8 项清单)
    ↓
[Output Schema] → Markdown 10 段式

5. 版本化知识根(可扩展)

song_analyzer.md 可以分版本:

  • v1: 2000-2010(青涩期)
  • v2: 2011-2020(成熟期)
  • v3: 2021-现在(实验期)

支持音乐风格演化的长期维护。


👥 社区与贡献

如何贡献你的音乐知识

发现 skill 生成的方案有问题?

  • 先运行 test_runner.py 校验回归套件结构,再用 --output--output-dir 校验你实际保存的生成结果
  • 在 Issues 里贴报告 + 你的改进建议
  • 我们一起更新 song_analyzer.md 的知识根

有新的周杰伦风格发现?

  • 在 Discussions 分享"我发现《XX》的 Bridge 用了这个套路"
  • 如果统计支撑足够,我们把它加入模块

想加新功能?

  • Fork → 修改 → PR
  • 建议先开 Issue 讨论设计

贡献者(按贡献排序)

  1. Claude - 初始 skill 架构 + 148 首分析数据
  2. - 下一个?

📜 License & 版权说明

本 Skill 遵循 Creative Commons BY-NC-SA 4.0 许可证

  • BY:署名(引用时请注明来源)
  • NC:非商业(不可用于商业售卖)
  • SA:相同方式分享(修改后需保持相同许可证)

⚠️ 重要:本 Skill 产出的是「创作方案」,不是音频文件

  • 你可以免费使用 Skill 生成的 concept/structure/lyric frame 来创作你的歌曲
  • 但如果你要商用(发行、演出、卖版权),请自行确保最终作品不侵犯第三方版权
  • Skill 不输出 MIDI/五线谱/音频,只做文字层面的创作指南

🎬 真实用户故事

故事 1:从 0 到第一首歌

用户:大学生,吉他新手,想写首歌给毕业的女友

用了什么

  • /jay-chou 写一首毕业告别的歌,钢琴开头,情绪克制到释怀
  • 抄走了 structure 和 lyric imagery
  • 自己填了旋律和歌词

结果:女朋友哭了,说"感觉歌词里的风扇和留言册就是我们"

他的心得:"以前写歌就是凭感觉,现在知道'意象锚定'这个武器了"

故事 2:编曲师的"救命稻草"

用户:独立工作室编曲师,客户说"要周杰伦感,预算有限"

用了什么

  • /jay-chou 主题深夜独处,轻R&B,小调都市感
  • 照着 arrangement planner 的六段式层次推进表调音
  • 照着 LUFS 动态曲线调增益

结果:客户说"对,就是这个味儿",尾款顺利到账

他的心得:"以前靠耳朵猜,现在靠数据验证,客户服气了"

故事 3:AI 研究者的玩具

用户:AI 音乐人,想研究怎么把音乐理论变成可执行的 skill

用了什么

  • 读了 song_analyzer.md 的知识根设计
  • 读了 original_song_generator.md 的编排器逻辑
  • 跑了 test_runner.py,再对照 test_runner.md 的验收框架

结果:fork 了这个 repo,做了个"Coldplay 风"的 skill

他的心得:"这个架构太清晰了,知识根 → 模块 → 编排器 → 自检,可复用"


🎤 写在最后

音乐创作的本质不是复制,是理解规律后的再创造。

这个 skill 不希望你成为"第二个周杰伦",它希望你成为"第一个你自己",只是你理解了华语流行乐的 20 年沉淀,站在更高的起点上创作。

🎵 "音乐没有标准答案,但有被验证过的路径。" 🎵


📞 联系 & 反馈

  • Issues: bug 报告、功能请求
  • Discussions: 分享你的创作、讨论音乐理论
  • Email:aimonj0729@gmail.com
  • 欢迎晒你用这个 skill 写的歌!

版本: v1.1 最后更新: 2026-05-17 维护者: Claude + 社区


🎁 彩蛋:下一个周杰伦的 3 个秘密

秘密 1:情绪峰值永远在 Bridge 之后

78% 的周杰伦作品,最催泪的那一下不在第一次副歌,而在 Bridge 回落后的 C3。

因为:先让你放松警惕,再给你最狠的一击。

秘密 2:抽象词只在副歌最后一句出现

主歌里几乎找不到"孤独、想念、难过",这些词只出现在副歌最后一句。

因为:把子弹留给最后一颗,前面全部用物件锚定。

秘密 3:Outro 的长度是 Intro 的 2 倍

Intro 平均 4 小节,Outro 平均 8 小节。

因为:进来要快,出去要慢,情绪才有余韵。


现在,打开你的 Claude Code,输入第一句话:

/jay-chou 写一首关于[你的故事]的周杰伦风格歌

下一个周杰伦,就是你。 🎸✨

附录:自动更新记录

2026-06-16 15:41

已完成一项小的开发体验改进:在 .gitignore 补充忽略本地验证产物,包括 test-report.mdreports/.pytest_cache/.coveragehtmlcov/,避免运行 README 里的验证命令后污染 Git 状态。同步在 README.md 文末附录记录了本次自动更新。

验证已跑并通过:

  • python3 -m unittest discover -s tests -v:41 tests OK
  • python3 test_runner.py --validate-structured-examples --no-write-report:20 checks, 0 warnings, 0 failed
  • python3 test_runner.py:默认报告生成成功且被忽略
  • python3 -m py_compile test_runner.py tests/test_test_runner.py
  • git check-ignore ...
  • git diff --check

已由 GitHub autopilot 自动提交并推送到 main

2026-06-16

本次只做了一项小的开发体验改进:补齐 .gitignore 对本地验证产物的覆盖。python3 test_runner.py 默认会生成 test-report.md,单测和后续 pytest/coverage 工作流也可能留下缓存或覆盖率目录;现在这些本地文件会被忽略,避免按 README 运行验证命令后污染 Git 状态。

同步更新了主 README 文末附录。验证已跑:python3 -m unittest discover -s tests -vpython3 test_runner.py --validate-structured-examples --no-write-reportpython3 -m py_compile test_runner.py tests/test_test_runner.pygit check-ignore test-report.md .pytest_cache/foo .coverage htmlcov/index.html reports/jay-chou-test-report.md。随后由 GitHub autopilot 自动提交并推送到 main

2026-06-14 09:34

修复了 README 中不可执行的安装说明:

  • 移除不存在的 claude skill listclaude.skills.load() 示例。
  • 改为官方的 ~/.claude/skills/jay-chou/SKILL.md 安装方式及 /jay-chou 调用。
  • 同步更新 README.mdREADME-GITHUB.md,并在主 README 文末追加更新记录。
  • 新增文档回归测试,防止伪接口再次出现。

验证通过:

  • 41 个单元测试
  • 20 个回归及结构化示例检查
  • Python 编译
  • git diff --check

参考:Claude Code Skills 官方文档

未提交,未推送。

2026-06-14

  • 修正安装与调用文档:移除 Claude Code 并不存在的 claude skill listclaude.skills.load() 示例,改为官方的文件系统 Skill 安装方式。
  • 安装流程现在会验证 ~/.claude/skills/jay-chou/SKILL.md,并明确需要在新会话中用 /jay-chou 或自然语言触发。
  • 新增 README 回归测试,防止两个公开 README 再次引入伪 CLI / SDK 接口。

2026-06-13

收紧了结构化 JSON 的关键文本合同:空字符串不再能绕过输入冷启动或充当输出核心概念。test_runner.py 的内建 schema 校验器新增 minLength / maxLength 支持,input_schema.json 会拒绝空的主题、情绪起止点和参考画面,output_schema.json 会拒绝空的 song_concept

新增两条回归测试,并同步更新 README-GITHUB.mdtest_runner.md。验证覆盖完整单测、结构化示例、Python 编译、JSON 解析和差异检查。

2026-06-12 13:00

修复了 test_runner.py 的无人值守稳定性问题:test_runner.py 现在会将损坏或非 UTF-8 输出记录为 FAIL,而不是抛 traceback;批量校验会继续处理其他文件。新增了回归测试,并同步更新 README.mdREADME-GITHUB.mdtest_runner.md

验证通过:38 个单测、20 个回归/结构化检查、Python 编译、JSON 解析、敏感信息扫描及 git diff --check。定向批量测试确认损坏文件返回失败、后续文件继续执行。未提交、未推送。

2026-06-12

  • 修复 test_runner.py 读取已保存输出时的稳定性缺口:文件存在但损坏或不是 UTF-8 时,现在会在报告中记录 生成结果FAIL,不再抛 UnicodeDecodeError traceback。
  • --output-dir 批量校验会继续处理剩余文件;tests/test_test_runner.py 新增非法 UTF-8 回归测试,test_runner.md 同步说明编码要求和失败行为。
  • 验证通过:38 个单测、20 个回归/结构化检查、Python 编译和 git diff --check。未提交,未推送。

2026-06-08 17:44

完成一项结构化合同修复:

  • output_schema.json:情绪锚点和歌词示例上限由 6 改为 5,与文档的 3–5 项一致。
  • 测试:新增边界及 CLI 集成测试。
  • README:同步使用说明与文末更新附录。

验证结果:37 个单测通过,总覆盖率 84%;20 个回归/结构化检查通过;Python 编译、JSON 解析、差异及安全检查通过。

未提交,未推送。

2026-06-08

修复结构化输出数量上限与 Skill 模板不一致的问题:system_prompt.md 和 schema 描述都要求情绪锚点、原创歌词示例各 3–5 项,但 schemas/output_schema.json 实际会放行 6 项。现在两处 maxItems 都收紧为 5,并新增回归测试确保 6 项输入被拒绝;结构化示例和现有 3–5 项输出不受影响。

同步更新了测试说明和 README 的 JSON 合同说明。验证通过:37 个单测、20 个回归/结构化检查,总覆盖率 84%,Python 编译、JSON 解析和 git diff --check 均通过。未提交,未推送。

2026-06-07 17:35

修复了测试污染工作区的问题:

  • 新增 .gitignore,忽略 Python 缓存。
  • 删除两个已跟踪的 *.pyc 文件。
  • 同步更新 README 文末附录。

验证通过:34 个单测、20 个回归/结构化检查、Python 编译、JSON 解析及 git diff --check

未提交,未推送。

2026-06-07

修复运行 Python 测试会污染工作区的问题:仓库新增 .gitignore,统一忽略 __pycache__/*.py[cod],并移除此前误提交的两个 Python 字节码缓存文件。源码、测试行为和 Skill 输出合同均未改变。

2026-06-06 17:35

完成一项结构化合同修复:

  • output_schema.json 不再接受第 4–8、10 段为空对象。
  • 回归测试 覆盖六个段落。
  • README、测试文档及文末附录已同步。

验证:34 个单测、20 个回归检查全部通过;Python 编译、JSON 解析、git diff --check 均通过。

未提交,未推送。

2026-06-05 10:49

已完成一项小改进,未提交、未推送。

我收紧了结构化 JSON schema 的嵌套合同:现在 input_schema.jsonoutput_schema.json 不只拒绝顶层未知字段,也会拒绝 emotionfusionemotional_arcstructure.sections[] 等主要嵌套对象里的拼错或遗留字段。原因是现有校验器已经支持 additionalProperties,但 schema 只在顶层启用,嵌套字段漂移仍会漏过。

同步补了回归测试 tests/test_test_runner.py,并更新了 test_runner.md、主 README.md 以及 README 文末附录 README.md

验证已通过:

  • PYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s tests:33 个测试通过
  • PYTHONDONTWRITEBYTECODE=1 python3 test_runner.py --no-write-report --validate-structured-examples:20 个检查通过,0 warning,0 fail
  • python3 -B -m py_compile test_runner.py tests/test_test_runner.py
  • git diff --check

2026-06-05

这次只做了一项高置信度结构化合同补强:schemas/input_schema.jsonschemas/output_schema.json 现在会在主要嵌套对象上拒绝未声明字段,不再只拦顶层未知字段。这样 emotion.legacy_curve_notefusion.legacy_ratio_labelemotional_arc.legacy_curve_notestructure.sections[].legacy_marker 这类拼错 / 遗留字段会被 --validate-structured-examples 同一套内建 schema 校验识别出来。

同步更新了 tests/test_test_runner.py 的嵌套未知字段回归测试,以及 test_runner.md 和 README 的结构化校验说明。验证已通过:python3 -m unittest discover -s testspython3 test_runner.py --no-write-report --validate-structured-examplespython3 -m py_compile test_runner.py tests/test_test_runner.pygit diff --check。未提交,未推送。

2026-06-04 09:36

已完成一项小改进,未提交、未推送。

改动内容:

  • test_runner.py 的 10 段 markdown 校验现在支持 ## 1.###### 1.,不再只接受 ### 1.
  • tests/test_test_runner.py 新增回归测试,覆盖 #### 1. 这种嵌套示例常见格式。
  • 同步更新了 test_runner.mdREADME.mdREADME-GITHUB.md,并把本次更新写入主 README 文末附录。

为什么改:examples.md 里的完整输出示例嵌套在文档结构里,实际使用 #### 1. 这类标题。旧校验器只识别 ### 1.,用户复制示例或模型输出不同标题层级时会被误判为缺少 10 段。

验证已通过:

  • PYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s tests:31 个测试通过
  • PYTHONDONTWRITEBYTECODE=1 python3 test_runner.py --no-write-report --validate-structured-examples:20 个检查通过,0 warning,0 fail
  • python3 -m py_compile test_runner.py tests/test_test_runner.py
  • git diff --check

2026-06-04

这次只做了一项小而完整的开发体验改进:test_runner.py 的 10 段 markdown 输出校验现在不再硬编码只接受 ### 1. 这种三级标题,也能识别 ## 1.###### 1. 的编号章节。这样从 examples.md 这类嵌套文档复制出来的 #### 1. 输出,或模型自然使用不同标题层级时,不会因为标题深度不同被误判为缺少 10 段。

同步更新了 tests/test_test_runner.py 的回归测试、test_runner.md 的验证说明,以及 README / README-GITHUB 里的测试能力描述。验证已通过:python3 -m unittest discover -s tests(31 个测试通过)、python3 test_runner.py --no-write-report --validate-structured-examples(20 个检查通过,0 warning,0 fail)、python3 -m py_compile test_runner.py tests/test_test_runner.py。未提交,未推送。

2026-06-03 09:34

已完成一项小而完整的自动改进,未提交、未推送。

我补强了结构化 JSON 示例校验:test_runner.py 的内建 JSON Schema 子集现在支持 additionalProperties,并把 schemas/input_schema.jsonschemas/output_schema.json 的顶层对象收紧为不接受未知字段。这样 --validate-structured-examples 可以拦住拼错字段名或遗留旧字段名的结构化示例漂移。

同步更新了:

验证已通过:

  • python3 -m unittest discover -s tests,30 个测试通过
  • python3 test_runner.py --no-write-report --validate-structured-examples,20 个检查通过,0 warning,0 fail
  • python3 -m py_compile test_runner.py tests/test_test_runner.py

2026-05-22 09:39

这次只做了一项高置信度改进:收紧结构化 JSON 合同,并补齐内建 schema 校验器对这类合同的真实执行。问题在于仓库原先会放过明显无效的 payload,比如 emotion: {}、缺少 textsample_lines[],以及缺少字段的 de_similarization.actions[];更底层一点,test_runner.py 的内建 validator 只在 schema 显式写了 type: object 时才处理 required,导致 anyOf 里的 required 约束实际上可能失效。我把这个问题收口在 schemas/input_schema.jsonschemas/output_schema.jsontest_runner.py 里:现在 emotion 至少要给 startend,每条歌词示例必须同时带 sectiontext,每条去相似化动作必须同时带 target_sectionissuerewrite

对应地,我在 tests/test_test_runner.py 补了 5 条回归测试,覆盖空输入、空 emotion、残缺 sample_lines[] 和残缺 actions[];主说明也同步写进了 README.mdREADME-GITHUB.md,让用户直接能看到这次结构化合同收紧了什么。

验证已跑并通过:python3 -m unittest discover -s testspython3 test_runner.py --no-write-reportpython3 test_runner.py --no-write-report --validate-structured-examplespython3 -m py_compile test_runner.py tests/test_test_runner.py。未提交,未推送。

2026-05-22

收紧了一处真实存在的结构化 JSON 合同漏洞:之前 schemas/input_schema.json 会把 emotion: {} 这种空对象当成合法输入;schemas/output_schema.json 也会放过缺少 textsample_lines[],以及缺少 target_section / issue / rewritede_similarization.actions[]。这会让仓库宣称可机器消费的结构化样例,实际上允许落成半残对象,接入方还得自己补二次防守。

这次只做了一件小而完整的事:把这些嵌套字段收紧到文档本来就在表达的最低可用合同。现在 emotion 至少要提供 startend;每条歌词示例必须同时带 sectiontext;每条去相似化动作必须同时带 target_sectionissuerewrite。对应回归测试已经补到 tests/test_test_runner.py,现有 schemas/input_example.jsonschemas/output_example.json 无需改动即可继续通过。

已跑验证:python3 -m unittest discover -s testspython3 test_runner.py --no-write-reportpython3 test_runner.py --no-write-report --validate-structured-examplespython3 -m py_compile test_runner.py tests/test_test_runner.py,均通过。未提交,未推送。

2026-05-21 10:06

修了一个高置信度的 CLI 体验问题:test_runner.py--test 现在除了继续支持 test_04.md 这种短文件名和绝对路径,也支持 ./test_cases/test_04.mdtest_cases/test_04.md 这类 repo 相对路径。之前这两种自然写法会被错误拼成双层 test_cases/...,直接报 --test file not found。我在 tests/test_test_runner.py 补了两条回归测试,并把 README.mdREADME-GITHUB.mdtest_runner.md 的用法说明同步更新了。

已跑验证:python3 -m unittest discover -s testspython3 test_runner.py --no-write-reportpython3 test_runner.py --no-write-report --validate-structured-examplespython3 test_runner.py --test ./test_cases/test_04.md --no-write-reportpython3 -m py_compile test_runner.py tests/test_test_runner.py,均通过。未提交,未推送。仓库里原本已有 __pycache__ 的脏工作区变更,我没有动它们。

2026-05-21 10:04

这次只做了一项高置信度的开发体验修复:补齐了 test_runner.py--test 相对路径的支持。之前它只接受 test_04.md 这类短文件名或绝对路径;如果用户很自然地传 ./test_cases/test_04.mdtest_cases/test_04.md,脚本会把路径错误地再拼到 test_cases/ 下面,导致误报 --test file not found。现在它会依次兼容“当前工作目录相对路径、仓库根目录相对路径、test_cases/ 下短文件名”三种写法,CLI 行为和用户直觉终于对齐。

对应地,我在 tests/test_test_runner.py 补了两条回归测试,分别锁定“从仓库根目录传 ./test_cases/...”和“从仓库外目录传 test_cases/...”两种调用方式;README.mdREADME-GITHUB.mdtest_runner.md 也同步更新了 --test 的真实用法。

验证已跑:

  • python3 -m unittest discover -s tests
  • python3 test_runner.py --no-write-report
  • python3 test_runner.py --no-write-report --validate-structured-examples
  • python3 test_runner.py --test ./test_cases/test_04.md --no-write-report
  • python3 -m py_compile test_runner.py tests/test_test_runner.py

未提交,未推送。

2026-05-19 15:42

这次只做了一项高置信度补强:收紧了 test_runner.pytest_04 的安全回归。此前 test_cases/test_04.md 明确要求第 9 段必须显式给出“和声相似度”和“Hook 相似度”的结论,但脚本实际上只检查“第 9 段里有没有任意 PASS/WARN/BLOCK”,会放过只写总体结论的输出。现在它会要求这两个子项各自显式给出 PASSBLOCK,缺任一项就失败。

我同时在 tests/test_test_runner.py 补了两条回归测试,覆盖“子项齐全通过”和“只写总体结论失败”;并把 README.mdREADME-GITHUB.mdtest_runner.md 同步到了这条新规则。

验证已跑:

  • python3 -m unittest discover -s tests
  • python3 test_runner.py --no-write-report
  • python3 -m py_compile test_runner.py tests/test_test_runner.py

结果:22 个单测通过,回归套件结构检查仍为 PASS。未提交,未推送。

2026-05-19

这次只做了一项高置信度补强:把 [test_cases/test_04.md](/Users/aimon/Desktop/claude code test/.cache/github-autopilot/repos/aimonj0729-ai__jay-chou-skill/test_cases/test_04.md:1) 里原本写明、但 [test_runner.py](/Users/aimon/Desktop/claude code test/.cache/github-autopilot/repos/aimonj0729-ai__jay-chou-skill/test_runner.py:1) 之前没有真正执行的安全合同补进自动校验。该用例要求第 9 段必须显式给出“和声相似度”和“Hook 相似度”的结论,避免模型只写一个笼统的 PASS 就误判通过;现在脚本会要求这两个子项各自带 PASSBLOCK,缺任何一个都会直接失败。

对应地,我把 [tests/test_test_runner.py](/Users/aimon/Desktop/claude code test/.cache/github-autopilot/repos/aimonj0729-ai__jay-chou-skill/tests/test_test_runner.py:1) 补了两条回归测试,覆盖“两个子项都写明时通过”和“只写总体结论时失败”两种场景;[README.md](/Users/aimon/Desktop/claude code test/.cache/github-autopilot/repos/aimonj0729-ai__jay-chou-skill/README.md:1)、[README-GITHUB.md](/Users/aimon/Desktop/claude code test/.cache/github-autopilot/repos/aimonj0729-ai__jay-chou-skill/README-GITHUB.md:1) 和 [test_runner.md](/Users/aimon/Desktop/claude code test/.cache/github-autopilot/repos/aimonj0729-ai__jay-chou-skill/test_runner.md:1) 也同步更新了这条规则。

已跑验证:

  • python3 -m unittest discover -s tests
  • python3 test_runner.py --no-write-report
  • python3 -m py_compile test_runner.py tests/test_test_runner.py

未提交,未推送。

2026-05-17 09:39

这次只做了一件小而完整的事:给 [test_runner.py](/Users/aimon/Desktop/claude code test/.cache/github-autopilot/repos/aimonj0729-ai__jay-chou-skill/test_runner.py:109) 增加了 --validate-structured-examples,用于校验仓库自带的 [schemas/input_example.json](/Users/aimon/Desktop/claude code test/.cache/github-autopilot/repos/aimonj0729-ai__jay-chou-skill/schemas/input_example.json:1) 和 [schemas/output_example.json](/Users/aimon/Desktop/claude code test/.cache/github-autopilot/repos/aimonj0729-ai__jay-chou-skill/schemas/output_example.json:1) 是否仍然符合对应 schema。原因是仓库之前只有“能解析 + 少量字段”的 smoke test,不能真正拦截 example 和 schema 漂移;现在内建了一套不依赖第三方库的 JSON Schema 子集校验,并且在报告里追加 Structured JSON Examples 小节,失败时会返回非零退出码。

对应地,我把 [tests/test_test_runner.py](/Users/aimon/Desktop/claude code test/.cache/github-autopilot/repos/aimonj0729-ai__jay-chou-skill/tests/test_test_runner.py:109) 补成了合同测试,覆盖“示例通过”、“缺失必填字段”和“非法枚举值”三种场景;[README.md](/Users/aimon/Desktop/claude code test/.cache/github-autopilot/repos/aimonj0729-ai__jay-chou-skill/README.md:32)、[README-GITHUB.md](/Users/aimon/Desktop/claude code test/.cache/github-autopilot/repos/aimonj0729-ai__jay-chou-skill/README-GITHUB.md:32) 和 [test_runner.md](/Users/aimon/Desktop/claude code test/.cache/github-autopilot/repos/aimonj0729-ai__jay-chou-skill/test_runner.md:1) 也同步写明了这个新入口和能力边界。

已跑验证:

  • python3 -m unittest discover -s tests
  • python3 test_runner.py --no-write-report
  • python3 test_runner.py --no-write-report --validate-structured-examples
  • python3 -m py_compile test_runner.py tests/test_test_runner.py

未提交,未推送。

2026-05-17

这次只做了一项高置信度改进:给 test_runner.py 新增了 --validate-structured-examples。仓库之前虽然已经提供 schemas/input_schema.jsonschemas/output_schema.json 以及对应的 JSON 示例,但自动化只做“能解析”和少量字段 smoke test,不能真正兜住“示例持续符合 schema 合同”这件事。现在脚本会在不引入第三方依赖的前提下,对仓库自带的输入/输出示例执行一套内建的 JSON Schema 子集校验。

我同时把 tests/test_test_runner.py 从 smoke test 补强成合同测试:不仅确认两份 example 文件通过,还覆盖“必填字段缺失”和“枚举值非法”这类真实漂移场景。主 README.mdREADME-GITHUB.mdtest_runner.md 也同步写明:test_runner.py 仍然不会拿 markdown 输出去跑通用 JSON Schema,但现在可以显式校验仓库内置的结构化样例。

验证已跑并通过:

  • python3 -m unittest discover -s tests
  • python3 test_runner.py --no-write-report
  • python3 test_runner.py --no-write-report --validate-structured-examples
  • python3 -m py_compile test_runner.py tests/test_test_runner.py

2026-05-12 09:35

改动

这次只做了一项高置信度修复:收紧了 test_runner.py10 段模板 校验。之前它只检查是否“出现过 1–10 这些编号”,但不会拦截两类真实错误:编号乱序,以及重复编号覆盖。这样像 3/4 写反、或者出现两个 ### 9. 的输出,也可能被误判通过;而 test_cases/test_01.md 明确要求“标题按顺序编号”。

我把这个缺口补上了,并在 tests/test_test_runner.py 增加了“乱序失败”和“重复编号失败”两条回归测试。同时同步更新了主 README.mdREADME-GITHUB.mdtest_runner.md,让文档和实现保持同一套合同:完整方案场景下,编号必须完整、按顺序且不重复。

验证

已运行并通过:

  • python3 -m unittest discover -s tests
  • python3 test_runner.py --no-write-report
  • python3 -m py_compile test_runner.py tests/test_test_runner.py

未提交,未推送。

2026-05-12 09:33

补了一处 10 段模板 校验的真实自动化缺口。test_runner.py 现在不只检查有没有 1–10 这些编号,还会拦截编号乱序重复编号的输出;之前只看章节集合是否齐全,像 43 写反、或重复写两个 ### 9. 这种情况也可能误判通过,但 test_cases/test_01.md 明确要求“标题按顺序编号”。对应回归测试已补到 tests/test_test_runner.py,覆盖“乱序失败”和“重复编号失败”两种场景。

README 和 test_runner.md 也同步写明:完整方案场景下,10 段模板 现在校验的是“完整、按顺序且不重复”的编号合同。这样用户从主 README 就能直接看到这次修复了什么。

验证已跑:

  • python3 -m unittest discover -s tests
  • python3 test_runner.py --no-write-report
  • python3 -m py_compile test_runner.py tests/test_test_runner.py

2026-05-10 09:39

补了一处 test_02 的真实自动化缺口。test_runner.py 现在在“默认主题说明 + 完整 10 段”分支里,会额外检查 5 个输入参数是否都在输出里留下明确证据:轻 R&B小调都市感电钢铺底副歌 Pad 扩张城市夜景。之前脚本只区分“澄清问题”还是“完整方案”,即使漏掉关键参数也可能误判通过。对应回归测试已补到 tests/test_test_runner.py,覆盖“参数齐全通过”和“缺参数失败”两种场景。

README 已同步更新,见 README.mdtest_runner.mdREADME-GITHUB.md。这样用户从主 README 就能直接看到这次新增的校验规则。

验证已跑:

  • python3 -m unittest discover -s tests
  • python3 test_runner.py --no-write-report
  • python3 -m py_compile test_runner.py tests/test_test_runner.py

未提交,未推送。

2026-05-10

这次只做了一项高置信度改进:补上 test_runner.pytest_02 完整方案分支的参数覆盖校验。之前脚本只区分“1–2 个澄清问题”还是“默认主题说明 + 完整 10 段”,但不会检查用户给的 5 个风格参数是否真的落到输出里;就算漏掉 电钢铺底副歌 Pad 扩张城市夜景 这类关键条件,也可能被误判为通过。现在它会在完整方案分支里聚合检查 轻 R&B小调都市感电钢铺底副歌 Pad 扩张城市夜景 这 5 项证据,缺项时直接列出缺失参数。

对应回归测试已补到 tests/test_test_runner.py,覆盖“5 项齐全应通过”和“缺参数应失败”两种场景;test_runner.mdREADME-GITHUB.md 也同步写明了这条规则。这样改的原因很直接:test_cases/test_02.md 早就把“5 个参数都要能在输出里找到证据”列成必须项,但脚本之前没有执行,属于真实的自动化缺口。

验证已跑并通过:

  • python3 -m unittest discover -s tests
  • python3 test_runner.py --no-write-report
  • python3 -m py_compile test_runner.py tests/test_test_runner.py

2026-05-07 09:37

这次只做了一项高置信度改进:修复融合模式里 Fusion Notes 的编号合同不一致。test_runner.py 现在在继续要求 1–10 段完整的同时,也接受可选的 ### 11. 融合说明 / Fusion Notes;之前这种写法会被误判成“10 段模板失败”。我同时在 tests/test_test_runner.py 加了回归测试,并把 schemas/output_schema.jsonfusion_notes 描述改成和实际行为一致。

README 也已同步更新:主 README.md 增加了本次更新记录,并补充说明 fusion_notes 对应的是第 10 段后的附加说明,若继续编号成第 11 段也合法;test_runner.mdREADME-GITHUB.md 也做了同样同步。这个改动的原因很直接:schema 之前暗示“融合说明是第 11 段”,但校验器不接受,属于真实的文档/校验合同漂移。

已跑验证:

  • python3 -m unittest discover -s tests
  • python3 test_runner.py --no-write-report
  • python3 -m py_compile test_runner.py tests/test_test_runner.py

结果是单测 14 项全部通过,test_runner.py 基础回归 6 个用例、18 个检查全部通过。未提交,未推送。

2026-05-07

这次只做了一项高置信度改进:统一融合模式里 Fusion Notes 的编号合同。之前 schemas/output_schema.jsonfusion_notes 描述成“11. 融合说明”,但 test_runner.py 对 markdown 完整输出仍只接受严格的 1–10 编号;如果有人把融合说明写成 ### 11. 融合说明 Fusion Notes,会被误判成 10 段模板失败。现在校验器会继续要求 1–10 必填,但额外接受可选的编号 11 融合说明;对应回归测试已经补到 tests/test_test_runner.py,schema 和测试说明也同步改成同一套说法。

验证已跑并通过:python3 -m unittest discover -s testspython3 test_runner.py --no-write-reportpython3 -m py_compile test_runner.py tests/test_test_runner.py。未提交,未推送。

2026-05-06 09:38

这次我只做了一项小而完整的改进:补齐 JSON 模式的开箱即用示例。新增了 schemas/input_example.jsonschemas/output_example.json,用“方文山人格 × electronic 50:50 融合”给出一对可直接复用的结构化请求/响应样例;同时在 tests/test_test_runner.py 加了 smoke tests,确认这两个样例可解析,且输出样例覆盖 output_schema 的必填顶层字段、risk_checkPASS/WARN/BLOCK 合同和 fusion_notes

README 也同步补了这次更新记录和 JSON 入口说明,见 README.mdREADME.mdREADME.md;示例总览页也加了 JSON 样例入口,见 examples.md。这样改的原因很直接:仓库之前已经声明支持 output_format: 'json',但没有现成 payload,结构化接入需要靠猜,属于真实的开箱即用缺口。

验证已跑并通过:python3 -m unittest discover -s testspython3 test_runner.py --no-write-reportpython3 -m py_compile test_runner.py tests/test_test_runner.py,以及对两个新 JSON 文件的解析检查。未提交,未推送。

2026-05-06

这次只做了一项高置信度改进:把仓库里“声明支持 JSON 模式”这件事补到真正可复制。之前 README 和 schemas/*.json 说明了 output_format: 'json',但仓库没有一对现成的结构化输入 / 输出样例,input_schema 也没有任何基础回归覆盖;对接的人需要自己猜第一份 payload 长什么样。我新增了 schemas/input_example.jsonschemas/output_example.json,用仓库已经主推的 v1.1 场景“方文山人格 × electronic 50:50 融合”做了一对可直接复用的 JSON 样例。

对应的 smoke test 我补到了 tests/test_test_runner.py,现在会确认这两个 example 文件可解析,并且关键字段与 schemas/output_schema.json 的必填顶层字段、risk_check tri-state、fusion_notes 合同保持一致。README、README-GITHUB.mdexamples.md 也同步加了入口说明。

验证已跑并通过:

  • python3 -m unittest discover -s tests
  • python3 test_runner.py --no-write-report
  • python3 -m py_compile test_runner.py tests/test_test_runner.py
  • python3 -c "import json, pathlib; [json.loads(pathlib.Path(p).read_text(encoding='utf-8')) for p in ['schemas/input_example.json', 'schemas/output_example.json']]"

未提交,未推送。

2026-05-05 09:35

这次只做了一项高置信度改进:修正结构化输出 schema 和仓库文档之间的真实不一致。之前 schemas/output_schema.json 会把 risk_check.overall: "WARN" 判成非法,因为它错误地要求未文档化的 WARN_WITH_REWRITES;但 README、test_runner.py 和示例一直都在用 PASS / WARN / BLOCK。我把这个合同统一到了 schemas/output_schema.json,并补了一个回归测试锁定它,见 tests/test_test_runner.py。主 README 也同步更新了本次变更记录和 JSON 用法说明,见 README.mdREADME.mdREADME.md

验证已跑并通过:

  • python3 -m unittest discover -s tests
  • python3 test_runner.py --no-write-report
  • python3 -m py_compile test_runner.py tests/test_test_runner.py
  • python3 -c "import json, pathlib; json.loads(pathlib.Path('schemas/output_schema.json').read_text(encoding='utf-8'))"

未提交,未推送。

2026-05-05

  • 修复 schemas/output_schema.json 的结构化输出合同不一致:risk_check.overall 现在与 README、test_runner.py 和示例保持一致,统一使用 PASS / WARN / BLOCK,不再要求未文档化的 WARN_WITH_REWRITES
  • 新增 tests/test_test_runner.py 回归测试,锁定这个 schema 枚举,避免结构化 JSON 输出再次和文档 / 示例漂移。

2026-05-04 09:45

修了一个高置信度的测试误判:test_runner.pytest_runner.py 现在在 test_01 里只统计第 6 段 示例句 / 原创示例句 标记后的列表项,不再把“主题定位 / 意象库 / 押韵策略”这类普通 bullet 误算成“歌词示例句”。之前这是个真实的假阳性缺口:没有真正例句的输出也可能被判通过。

回归测试补在 tests/test_test_runner.py,覆盖了“只有元数据 bullets 应该 WARN”和“显式示例句列表应该 PASS”两个场景。README 和测试说明也同步了这次变化,见 README.mdREADME.mdtest_runner.mdREADME-GITHUB.md 也做了同步。

验证跑了:

  • python3 -m unittest discover -s tests,10 个单测全部通过
  • python3 test_runner.py --no-write-report,6 个回归用例、18 个检查全部通过
  • python3 -m py_compile test_runner.py tests/test_test_runner.py
  • 定向构造“第 6 段只有元数据 bullets、没有示例句”的输出后,脚本现在返回 1 条预期 WARN、0 个失败

未提交,未推送。

2026-05-04

  • 修复 test_runner.pytest_01 “歌词示例句” 的假阳性:现在只统计第 6 段里 示例句 / 原创示例句 标记后的列表项,不会再把主题定位、意象库这类普通 bullet 误算成示例句。
  • 新增 tests/test_test_runner.py 回归测试覆盖“只有元数据 bullets”与“显式示例句列表”两个场景,并同步更新主 README、README-GITHUB.mdtest_runner.md 的说明。

2026-05-03 09:38

本次只做了一项高置信度改进:修复了 test_runner.py--output-dir 模式下的一个稳定性边界。之前如果输出目录里某个 test_01.md 同名路径其实是目录,脚本会在读取时直接抛 traceback;现在它会在 test_runner.py 记录一条 生成结果WARN 并继续处理其他用例。对应回归测试补在 tests/test_test_runner.py。README 也已同步更新到 README.mdREADME.mdREADME-GITHUB.mdtest_runner.md,让这次修复和用法说明保持一致。

验证已跑:

  • python3 test_runner.py --no-write-report
  • python3 -m unittest discover -s tests
  • python3 -m py_compile test_runner.py tests/test_test_runner.py
  • tmp_dir=$(mktemp -d) && mkdir "$tmp_dir/test_01.md" && python3 test_runner.py --test test_01.md --output-dir "$tmp_dir" --no-write-report

结果是回归套件 6 个用例全部通过,单测 8 个全部通过,定向场景返回 1 条预期 WARN、0 个失败,不再抛 traceback。未提交,未推送。

2026-05-03

这次只做了一件高置信度的小修复:补上 test_runner.py--output-dir 模式下的一个脚本稳定性边界。之前如果 generated_outputs/test_01.md 这类路径存在、但它其实是一个目录而不是 markdown 文件,脚本会在读取时直接抛 traceback,中断整个批量校验。我在 [test_runner.py](/Users/aimon/Desktop/claude code test/.cache/github-autopilot/repos/aimonj0729-ai__jay-chou-skill/test_runner.py) 把这个分支改成了显式类型检查:同名路径不是文件时,只记一条 生成结果WARN,继续跑其他用例。

这类问题很适合无人值守自动修:它是一个真实的开发体验缺口,改动面小,不影响已有回归规则,只把“目录误放到输出目录里”从崩脚本降级成清晰报告。对应回归测试已补到 [tests/test_test_runner.py](/Users/aimon/Desktop/claude code test/.cache/github-autopilot/repos/aimonj0729-ai__jay-chou-skill/tests/test_test_runner.py),测试说明同步更新到了主 README、README-GITHUB.mdtest_runner.md

验证跑了:

  • python3 test_runner.py --no-write-report
  • python3 -m unittest discover -s tests
  • python3 -m py_compile test_runner.py tests/test_test_runner.py
  • tmp_dir=$(mktemp -d) && mkdir "$tmp_dir/test_01.md" && python3 test_runner.py --test test_01.md --output-dir "$tmp_dir" --no-write-report

结果是回归套件 6 个用例全部通过,单测现在是 8 个全部通过,定向的 --output-dir 目录误传场景会产出 WARN 而不是 traceback。未提交,未推送。

2026-05-02 13:22

这次只做了一件小而完整的改进:补上了 v1.1 主功能的端到端完整示例。之前仓库已经在 SKILL.mdREADME.mdtest_06 里强调“词人人格 + 跨风格融合”,但 examples.md 还缺一份可直接照抄的完整案例。我在 examples.md 新增了一个完整的 Example 4,演示“方文山人格 × Electronic 50:50”,包含 [JC] / [F] / [MIX] 来源标记和 Fusion Notes,并把旧的局部优化示例顺延为 Example 5/6。相关引用也同步更新到了 README.mdREADME-GITHUB.mdSKILL.md

验证跑了:

  • python3 test_runner.py --no-write-report
  • python3 -m unittest discover -s tests
  • python3 -m py_compile test_runner.py tests/test_test_runner.py

结果是回归套件 6 个用例全部通过,单测 7 个全部通过。未提交,未推送。

2026-05-02

这次只做了一件高置信度补强:给 examples.md 补上了一份完整的 v1.1 联动示例,直接演示“方文山系词人人格 + 周杰伦 × electronic 50:50 融合 + [JC] / [F] / [MIX] 来源标记 + Fusion Notes”的端到端输出。之前 README、SKILL.mdtest_cases/test_06.md 都已经把这组能力当成主功能,但示例文件还停留在旧的 3 个完整案例,用户缺少一份可以直接照抄的完整输入与参考产出。

我同步更新了 examples.md 的示例结构说明、SKILL.md 对示例数量的引用,以及主 README / README-GITHUB.md 的使用说明,明确现在可以直接查看 examples.md 的 Example 4 来触发 v1.1 能力。

验证跑了这些:

  • python3 test_runner.py --no-write-report
  • python3 -m unittest discover -s tests
  • python3 -m py_compile test_runner.py tests/test_test_runner.py

结果是现有回归脚本和单测都仍然通过。未提交,未推送。

2026-04-30 09:52

这次只做了一件高置信度改进:把仓库主打的 v1.1 能力“词人人格 + 跨风格融合”补进了回归链。之前回归只覆盖 test_01test_05,但 README 和 Skill 已经把这两个功能当成主卖点,存在明显测试缺口。我新增了 test_cases/test_06.md,并扩展了 test_runner.py 去检查 50:50 融合比例、[JC]/[F]/[MIX] 来源标记和 融合说明;对应单测补在了 tests/test_test_runner.py。主 README 以及测试说明 README.mdREADME-GITHUB.mdtest_runner.md 也同步更新了这次变化。

我没有改 Skill 生成逻辑本身,因为当前最适合安全自动落地的真实问题就是“功能已宣传,但缺少可执行回归覆盖”。这样改动小、风险低,而且能直接提升后续维护的稳定性。

验证跑了这些:

  • python3 test_runner.py --no-write-report
  • python3 test_runner.py --test test_06.md --no-write-report
  • python3 -m unittest discover -s tests
  • python3 -m py_compile test_runner.py tests/test_test_runner.py

结果是回归套件现在为 6 个用例、18 个检查全部通过;单测 7 个全部通过。未提交,未推送。

2026-04-30 10:05

  • 为 v1.1 主功能补上新的回归场景 test_cases/test_06.md,覆盖“词人人格 + 跨风格融合”联动,不再只测基础 10 段、冷启动和拒绝分支。
  • test_runner.py 现在会对这类输出额外检查:是否明确写出 50:50 融合比例、是否出现 [JC] / [F] / [MIX] 来源标记、是否补了 融合说明
  • tests/test_test_runner.py 新增回归测试,test_runner.md 与主 README 也同步补充了 test_06 的说明,方便直接验证 v1.1 特性有没有退化。

2026-04-29 09:37

改动

修了一个高置信度的测试器逻辑问题:test_runner.py 之前会先无条件跑通用的 10 段校验,导致 test_02 的“1–2 个澄清问题”响应和 test_05 的首轮冷启动提问被误判为失败。现在 test_runner.py 会按用例分支决定是否执行通用 10 段检查,并在 test_runner.pytest_02 的“默认主题说明”分支也收紧到和用例文档一致。对应回归测试加在了 tests/test_test_runner.py

README 和测试说明也同步了这次修复,让用户能直接看到最新行为:README.mdREADME.mdtest_runner.mdREADME-GITHUB.md

验证

运行了这些命令:

  • python3 test_runner.py --no-write-report
  • python3 -m unittest discover -s tests
  • python3 -m py_compile test_runner.py tests/test_test_runner.py

另外手工回归了两种最小输入,确认 test_02test_05 的提问型合法输出现在分别得到 PASS,不再附带 10 段相关误判。未提交,未推送。

2026-04-29 09:33

  • 修复 test_runner.py 的冷启动分支校验:test_02 的“1–2 个澄清问题”响应,以及 test_05 的首轮冷启动提问,不再先被通用的 10 段 / Similarity Guard / 去相似化检查误判为失败。
  • 新增 tests/test_test_runner.py 回归测试覆盖这两个场景,并同步更新主 README、README-GITHUB.mdtest_runner.md 的测试说明。

2026-04-28 16:14

修了一个高置信度的 CLI 稳定性问题:test_runner.py 之前对 --test--output--output-dir 都做了路径校验,但 --report-file 还没有。父目录不存在,或把它指到目录时,会在最后写报告阶段直接抛 traceback。现在 [test_runner.py](/Users/aimon/Desktop/claude code test/.cache/github-autopilot/repos/aimonj0729-ai__jay-chou-skill/test_runner.py:123) 新增了 resolve_report_file_path(),并在 [test_runner.py](/Users/aimon/Desktop/claude code test/.cache/github-autopilot/repos/aimonj0729-ai__jay-chou-skill/test_runner.py:382) 写入前统一校验,同时把其余 OSError 也转成清晰的 CLI 退出。对应回归测试加在了 [tests/test_test_runner.py](/Users/aimon/Desktop/claude code test/.cache/github-autopilot/repos/aimonj0729-ai__jay-chou-skill/tests/test_test_runner.py:1)。

README 也同步了这次变化:主 [README.md](/Users/aimon/Desktop/claude code test/.cache/github-autopilot/repos/aimonj0729-ai__jay-chou-skill/README.md:35) 增加了更新记录,并在 [README.md](/Users/aimon/Desktop/claude code test/.cache/github-autopilot/repos/aimonj0729-ai__jay-chou-skill/README.md:457) 补了 --report-file 的用法;[test_runner.md](/Users/aimon/Desktop/claude code test/.cache/github-autopilot/repos/aimonj0729-ai__jay-chou-skill/test_runner.md:21) 和 [README-GITHUB.md](/Users/aimon/Desktop/claude code test/.cache/github-autopilot/repos/aimonj0729-ai__jay-chou-skill/README-GITHUB.md:35) 也做了同步说明。

验证跑了:

  • python3 test_runner.py --no-write-report
  • python3 -m unittest discover -s tests
  • python3 -m py_compile test_runner.py
  • python3 test_runner.py --report-file ./does-not-exist-dir/test-report.md
  • python3 test_runner.py --report-file .

结果是常规回归仍然通过,两个错误的 --report-file 场景现在都会直接返回清晰 CLI 错误。未提交,未推送。

2026-04-28 16:18

这次只做了一项高置信度改进:补上 test_runner.py--report-file 的路径校验。之前如果把报告输出到不存在的父目录,或者把 --report-file 指到一个目录,脚本会在最后 write_text() 时直接抛 Python traceback。现在它会先返回清晰的 CLI 错误;其余报告写入失败也会转换成受控退出。对应回归测试已补到 tests/test_test_runner.py

原因很直接:--test--output--output-dir 之前都已经做了参数路径校验,唯独 --report-file 还留着同类缺口,属于明显的 CLI 一致性问题。现在报告输出路径的行为终于和其他参数对齐了。

验证我跑了:

  • python3 test_runner.py --no-write-report
  • python3 -m unittest discover -s tests
  • python3 -m py_compile test_runner.py
  • python3 test_runner.py --report-file ./does-not-exist-dir/test-report.md
  • python3 test_runner.py --report-file .

结果是正常回归仍然通过,两个错误的 --report-file 场景现在都会直接返回清晰 CLI 错误,不再抛 traceback。未提交,未推送。

2026-04-27 09:36

这次只做了一项高置信度改进:修复 test_runner.py--test 传错文件名时会直接抛 FileNotFoundError traceback 的问题。现在它和 --output / --output-dir 一样,会先做统一的路径与类型校验,错误时直接返回清晰的 CLI 消息。实现见 test_runner.py。我也把这次修复同步写进了主 README 的更新记录和验证说明 README.mdREADME.md,并更新了测试说明 test_runner.md

原因很直接:这是一个真实的开发体验问题,用户只要把 --test 写错就会看到 Python traceback,不符合这个脚本前面已经补齐过的 CLI 稳定性标准。现在错误场景会输出 --test file not found: ... 这类可直接理解的提示。

验证我跑了:

  • python3 test_runner.py --no-write-report
  • python3 -m py_compile test_runner.py
  • python3 test_runner.py --test does-not-exist.md --no-write-report
  • python3 test_runner.py --test test_04.md --no-write-report

结果是正常回归仍然通过,错误的 --test 参数现在不再抛 traceback。未提交,未推送。

2026-04-27 09:34

修了一处同类但之前漏掉的 CLI 稳定性问题:test_runner.py--test 传错文件名时,之前会直接抛 FileNotFoundError traceback,不像 --output / --output-dir 那样给出清晰的命令行错误。我在 test_runner.py 补了统一的 --test 路径解析与类型校验,现在文件不存在或传到目录时都会直接报明确错误。相关约束也同步写进了主 README 和测试说明文档:README.mdREADME.mdtest_runner.md

跑过的验证:

  • python3 test_runner.py --no-write-report
  • python3 -m py_compile test_runner.py
  • python3 test_runner.py --test does-not-exist.md --no-write-report
  • python3 test_runner.py --test test_04.md --no-write-report

结果是正常回归仍然通过,错误的 --test 参数现在会直接返回清晰 CLI 错误,不再抛 traceback。未提交,未推送。

2026-04-26 09:35

修了一处高置信度的脚本稳定性问题:test_runner.py 在参数路径写错时,之前要么直接抛 Python traceback,要么给出带 WARN 但整体 PASS 的误导性报告。我在 test_runner.py 加了统一的 CLI 路径校验,现在会对 --output--output-dir 做存在性与类型检查,错误时直接用清晰消息退出。相关说明也同步写进了主 README 和测试说明文档:README.mdREADME.mdtest_runner.md

跑过的验证:

  • python3 test_runner.py --no-write-report
  • python3 -m py_compile test_runner.py
  • python3 test_runner.py --test test_04.md --output ./does-not-exist.md --no-write-report
  • python3 test_runner.py --output-dir ./does-not-exist-dir --no-write-report

结果是正常回归仍然通过,两个错误场景现在都会返回明确的 CLI 错误,不再出现 traceback 或误导性报告。未提交,未推送。

2026-04-26 09:33

  • test_runner.py 现在会在 --output 指向不存在/非文件路径,或 --output-dir 指向不存在/非目录路径时直接报错退出,避免抛 Python traceback 或产出误导性的报告。
  • 主 README、README-GITHUB.mdtest_runner.md 已同步补充路径要求:--output 需要配合单个 --test 和一个已存在的 markdown 文件,--output-dir 需要是已存在目录。

2026-04-25 11:06

本次只做了一项高置信度改进:修复“验证文档和真实脚本行为不一致”的问题。

我重写了 test_runner.md,把 test_runner.py 的真实能力写清楚:它会校验 test_cases/ 结构,并可用 --output / --output-dir 校验你已经保存的 markdown 输出;它不会自动调用 Skill,也不会自动跑 JSON Schema、LUFS 或音乐统计。然后我把这个说明同步到主 README 的更新记录和验证章节 README.mdREADME.md,并同步到 README-GITHUB.md

这样改的原因很直接:原文档把 test_runner.py 说成会“自动触发 Skill 生成输出、做 JSON Schema 和指标校验”,但仓库里的实际实现并不是这样,属于明显的开箱即用问题。现在 README、test_runner.mdschemas/*.json 和脚本职责的关系已经对齐。

验证我跑了两项:

  • python3 test_runner.py --no-write-report,结果是 5 个回归用例全部通过,15 个检查通过,0 warning,0 fail。
  • python3 -m py_compile test_runner.py

未提交,未推送。

2026-04-25 11:03

  • 修正文档中对 test_runner.py 的夸大描述:它现在被明确说明为“回归套件校验 + 已保存输出校验”工具,而不是自动调用 Skill 或自动跑 JSON Schema / LUFS 指标的脚本。
  • README 与 test_runner.md 同步补充了 --test--output--output-dir 的真实用法,以及批量校验时需要使用 test_01.md 这类文件命名。
  • 补充说明 schemas/*.json 目前是结构化集成参考,不属于 test_runner.py 的自动执行范围,避免 README、schema、脚本三者语义错位。

2026-04-23 22:20

  • 补上缺失的 test_runner.py,现在仓库可以直接校验 test_cases/ 套件完整性,并支持对传入的生成结果做 10 段结构、Similarity Guard、冷启动规则检查。
  • README 同步补充了真实可执行的验证方式,避免出现“文档写了 python3 test_runner.py,仓库里却没有脚本”的断层。
  • 安装命令已改成当前仓库的真实 GitHub 地址,方便直接复制安装。

2026-06-03

这次只做了一项高置信度的结构化校验补强:test_runner.py 的内建 JSON Schema 子集现在支持 additionalProperties,并且 schemas/input_schema.json / schemas/output_schema.json 的顶层对象已明确拒绝未声明字段。这样 --validate-structured-examples 不只会检查必填字段和枚举,也能拦住结构化示例里拼错字段名、残留旧字段名却仍被误判通过的问题。

对应回归测试补在 tests/test_test_runner.py:一条锁定输出 schema 会拒绝未知顶层字段,另一条覆盖 additionalProperties 为子 schema 时会继续校验未知字段值。test_runner.md 也同步写明了当前内建 JSON Schema 子集的能力边界。

验证已跑:python3 -m unittest discover -s testspython3 test_runner.py --no-write-report --validate-structured-examplespython3 -m py_compile test_runner.py tests/test_test_runner.py。未提交,未推送。

2026-06-06

修复结构化输出 schema 会接受空段落对象的问题。此前顶层虽要求第 4–8 段和第 10 段存在,但 chord_direction: {}hook_concept: {}de_similarization: {} 等没有实际内容的对象仍会通过校验。现在这些段落分别要求最低可用字段,避免“形式上有 10 段、实际上缺内容”的半残 JSON 被接入方误收。

对应回归测试已补到 tests/test_test_runner.py,并同步更新主 README、README-GITHUB.mdtest_runner.md 的结构化合同说明。验证已通过:34 个单测通过;python3 test_runner.py --no-write-report --validate-structured-examples 完成 20 个检查,0 warning、0 fail;Python 编译、JSON 解析和 git diff --check 均通过。未提交,未推送。

About

🎧 华语流行创作 Skill:把灵感碎片变成有画面、有 Hook、有原创性检查的歌曲方案。

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages