Communitygithub.com

m1nga/skills

25 个实用的 AI 代理技能,适用于 Codex、Claude Code 和 Cursor:规划产品、恢复项目、测试提示、保留用户风格并验证 AI 工作成果。

skills 是什么?

Mixtape(亲手做的歌单)是一个面向 AI 代理(如 Codex、Claude Code、Cursor)的技能,旨在帮助用户创建真正“属于自己”的播放列表。该技能的核心是让 AI 代理充当用户的手,在用户没有时间亲力亲为的情况下,完成搜索、匹配和编排工作,确保每个播放列表都体现用户的个人品味和场景需求。它通过维护 `~/.mixtape/` 目录下的三个文件(`taste.md` 记录用户偏好、`history.md` 追踪历史、`misses.md` 记录匹配失败的曲目)来实现持久化记忆,从而使 AI 代理随着交互次数的增加而变得更智能。Mixtape 支持三种工作模式:快速点单(根据场景/情绪直接生成)、种子扩展(基于示例歌曲进行扩展)、口味档案(分析用户口味后精心策划)。为确保质量,该技能要求所有曲目必须真实存在,并通过规范化和验证流程(包括使用 Apple Music 目录进行核验)来保证曲目信息的准确性。最终,它会通过 Soundiiz 将播放列表导出到 Spotify、YouTube Music、Deezer 或 Tidal 等平台,并提供导入后的迭代与平台端整理功能。

兼容平台✓Claude Code✓Codex CLI✓Cursor
npx skills add m1nga/skills

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

Mixtape · 亲手做的歌单

每个人的音乐库都塞满了陌生人和算法制作的歌单。但 Mixtape 不同:它是被创作出来的。用户带来品味,你则充当那双手,完成他们永远没时间去做的海量搜索、匹配和编排工作。以下所有内容都服务于那一种感觉——"这个歌单是我的"——所以当请求暗示具体场景时,切勿用泛泛的榜单热曲来凑数,并且始终能说出一首歌曲为何值得占据一席。

用用户的语言回复。播放列表的标题听起来应该像是用户自己会起的名字,而不是算法的产物(例如“周五晚·华语摇滚快车”,而非“Chinese Rock Mix #1”)。

状态: ~/.mixtape/

持久化记忆位于此包之外的 ~/.mixtape/ 目录中(首次使用时创建该目录及文件):

文件存储内容何时更新
taste.md平台默认偏好 · 硬性偏好(语言/年代/风格) · 细读发现(制作/人声/能量) · 挚爱曲目与艺人 · 雷区每次生成前读取;在分析个人档案或收到反馈后更新
history.md每个 Mixtape 一个章节:日期、标题、模式、平台、曲目列表、反馈每次交付后追加
misses.md在某个平台上未能匹配的曲目:- 歌名 — 艺人 (平台, 日期)每次生成前读取(避免重复);当用户报告缺歌时追加

个人档案是让代理变得越来越聪明的关键。每次会话后更新一行文字,胜过完美的模式设计。两条规则保证其诚实性:用户现在说的话总是优先于文件记忆(更新文件,不要争论);单个场景的编排不是口味证据——初次创建“做饭时听的 City Pop”只记录平台默认偏好,而不是“喜欢 City Pop”。

选择模式

请求中的信号模式
用文字描述的场景/情绪/风格("健身摇滚", "深夜写代码")快速点单 — 直接生成
提供了示例歌曲,可能进行了分组("我喜欢的朋克是这几首、英伦是这几首")种子扩展 — 以示例为锚点进行扩展
用户分享现有歌单,或要求 分析我的口味 / "what do I actually like"口味档案 — 先分析,再策划

模式可以叠加:对于已有口味档案的用户发起的快速点单,仍应通过该档案进行筛选。

快速点单。 解析风格、场景、情绪、年代、语言、数量、平台。默认 25 首曲目。最多问一个澄清性问题,且只在答案能真正改变歌曲的情况下才问;否则直接决定并执行——导入页面本身就是一个预览,所以猜错一次只需点一下,无需对话。

种子扩展。 示例是用户通过风格词真正想要的东西的证据。对每一组,用一句话推断你所认为的种子歌曲的共同点(年代?制作?人声风格?能量?)——这样既能展示你的推理过程,也让用户能低成本地纠正。然后按组生成相邻歌曲,保持各组比例。除非用户要求全新歌曲,否则应包括种子歌曲本身;请求的数量是包括种子歌曲的总数。种子艺人可以重复出现,但控制在列表约三分之一以内——扩展应该扩大圈子,而非原地打转。将各组合并成一个整体编排,而非保留成连续的块,除非用户要求分开的章节。

口味档案。 摄入用户能提供的任何内容:粘贴的曲目列表、导出的文件、公开歌单的 URL(获取它),或者引导用户使用 Soundiiz 的导出到文本功能。超越用户自己的标签——他们可能说是“抒情”,但曲目真正的共同点可能是“90 年代港台制作 + 男声假声 + 钢琴前奏”。将发现写入 taste.md,然后策划将已听过的挚爱(约 40%) 与没听过但相邻的发现(约 60%) 混合的歌单——比例可调,并在呈现时标明哪些是挚爱、哪些是发现,让用户同时看到熟悉感和探索性。

生成规则

  • 仅限真实歌曲。 每首曲目必须是真实的、已发行的录音作品。“确认”的标准是:你能说出它来自哪张专辑或年代。如果低于这个标准,通过网页搜索验证——一首虚构的歌曲会在导入时悄然变成错误的匹配,这比少一首曲目更糟糕。
  • 规范形式匹配效果最佳:主标题 + 真实的艺人署名。将合作艺人作为独立的 artists 数组元素;除非用户要求特定版本,否则去掉 "feat."、"(Live)" 和 "(Remix)" 等限定词。对于非拉丁文目录,使用流媒体平台主要列出的形式(日语/汉语标题通常保留原文)。
  • 检查 misses.md;不要再次推荐在目标平台上已经失败的曲目。
  • 编排就是创作。 安排一个适合场景的编排弧线:健身时逐步升调,深夜时逐渐降调,通勤时保持平稳。一个打乱的列表是搜索结果,不是 Mixtape。
  • 每个链接 ≤ 200 首曲目(API 限制)。超过则分成上、下卷,每卷一个链接,注意 10 次/分钟的速率限制。

交付

  1. 在聊天中展示带编号的曲目列表(在档案模式下标注 已听/新,在种子模式下包含一行的分组推断)。
  2. 将负载写入会话临时目录中的 JSON 文件:
    {"title": "...", "description": "...", "sourceName": "Mixtape",
     "destination": "youtube",
     "tracklist": [{"title": "...", "artists": ["...", "..."]}]}
    
  3. 在发布前进行规范化:python3 <skill-dir>/scripts/canonicalize.py payload.json --country <storefront>。该脚本会验证歌曲标题和艺人,拒绝错误的艺人不想要的版本,将确认的曲目重写为 Apple 目录中显示的元数据,并输出证据报告。当任何曲目未被确认时,脚本以非零状态退出;替换这些曲目并重新运行。使用用户的商店地区(记录在 taste.md 中,例如 GB)。 如果自由文本搜索找不到某首歌曲,但有官方 Apple Music 歌曲页面证明其存在,则将其数字 URL ID 添加到该曲目记录中的 "appleMusicId": 1702056850 字段,并重新运行。脚本会在目标商店中查找该 ID,并仍然验证其标题+艺人;这是证据,绝不等同于绕过验证。
  4. 仅 POST 经过签名的规范化文件:bash <skill-dir>/scripts/post_playlist.sh payload.canonical.json。发布脚本会拒绝未经验证或发布后编辑的内容,剥离内部证据元数据,并将记录的 artists 字段发送给 Soundiiz。切勿发送 artist(单数):Soundiiz 会接受请求但忽略该字段,导致仅根据标题进行匹配。 脚本会在成功时打印导入链接和有效期。
  5. 将链接交给用户并说明:有效期 24 小时;打开 → 确认目标平台 → 导入。那个确认点击同时兼作用户的预览/否决步骤——不要试图将其自动化。
  6. 对于迭代,在导入成功后完成下面的平台端对账。一个新的导入链接只是实现细节,不是允许在用户库中留下重复或带版本号的歌单。

目标平台预选(destination 字段):已验证的核心名称有 spotify,ytmusic(YouTube Music),youtube(纯 YouTube 视频播放列表——当用户说“YouTube”但指音乐时,优先使用 ytmusic),deezer,tidal。 Apple Music 没有预选核心名称——省略该字段,并告知用户在导入页面上选择 Apple Music(只需点击一次;他们的 Soundiiz 账户中持有平台授权)。将用户的平台偏好记在 taste.md 中,并停止询问。

迭代:一个具有稳定身份且持续更新的歌单

修订永远不会是补丁、重新开始或第二个产品。从 history.md 中上一个曲目列表开始,保留用户未否决的所有曲目,并对完整列表进行替换、比例调整或扩充。用户确认喜爱的曲目是正在构建的资产。

在多次修订中保持用户认可的稳定标题。除非用户明确要求,否则切勿在流媒体库中的标题上添加 v2/v3/v4、“修复版”或类似的版本记录。 仅将修订号和版本沿革记录在 history.md 内部。如果无法直接原地编辑,且 Soundiiz 必须创建一个替换版本,那么该替换版本只是临时的,直到库被整理完成:用户最终应该只拥有一个以稳定标题命名的当前歌单,而不是一堆版本或一个补丁歌单。

替换导入成功后:

  1. 读取平台库,通过确切的平台 ID、当前名称和曲目数量来解析保留的歌单以及所有由 Mixtape 管理的前驱歌单。
  2. 保留不相关的歌单,即使它们有相似的名称。切勿通过模糊的标题搜索或未解析的变量/通配符进行删除。
  3. 检查保留的歌单是否具有预期的完整曲目数量,将其重命名为稳定标题,并仅删除已明确解析的前驱 ID。
  4. 再次读取库。完成的标志是存在一个具有稳定标题、预期曲目数量且没有前驱 ID 的歌单。将此收据记录在 history.md 中;不要仅凭变异调用就声称成功。

在 macOS Apple Music 上,使用受保护的辅助脚本,而不是手写的破坏性 AppleScript:

python3 <skill-dir>/scripts/reconcile_apple_music.py inventory
python3 <skill-dir>/scripts/reconcile_apple_music.py reconcile manifest.json
python3 <skill-dir>/scripts/reconcile_apple_music.py reconcile manifest.json --apply

清单格式:

{"stableTitle":"跑步",
 "keep":{"id":"6073","expectedName":"梦想感起跑 v4","expectedTrackCount":33},
 "delete":[{"id":"6059","expectedName":"梦想感起跑 v3","expectedTrackCount":8}],
 "protect":[{"id":"5334","expectedName":"I wonder if you know","expectedTrackCount":1}]}

它命名了稳定标题、要保留的 ID/名称/数量,以及确切的前驱 ID/名称/数量。将不得更改的歌单添加到可选的 protect 数组中;它们会在计划前被检查,并在最终收据中报告为未更改。

对账默认以 dry-run 模式运行;--apply 会在遇到过时的名称、错误的计数、未管理的标题冲突或 ID 被列出在冲突角色时拒绝执行,然后打印经过验证的回读收据。对其他服务,使用相同的预检→变更→回读合约,通过其他授权的平台 API/连接器进行。如果没有授权的写入接口,请清楚说明,并将整理状态标记为未完成,而不是告诉用户重复的歌单是“新版本”。

导入后(轻量级,绝不骚扰)

在交付时附带一句话:导入后如果有没匹配上或踩雷的歌,说一声。当用户报告时:

  • 缺歌 → 追加到 misses.md;在下一次完整迭代中修复匹配器或替换失败曲目。只有当用户明确要求单独管理补丁时,才允许创建一个补偿链接。
  • 踩雷 → 将原因(太吵?年代不对?)记录到 taste.md 的 雷区。
  • 无论如何,将 Mixtape 记录到 history.md。

当出现故障时

  • 即使使用了规范名称,导入时曲目仍显示 未找到 → 将其视为交付失败,而非用户需要清理的工作。重新检查目标商店,替换或固定未解析的目录 ID,重新生成完整的已签名歌单,然后将其对账回平台上的稳定身份。不要默认使用一个补偿片段。
  • Too many requests(请求过多) → 等待 60 秒,重试一次。
  • API 错误或格式变更 → 不要让用户束手无策:以纯文本形式提供曲目列表及手动导入路径(soundiiz.com → Import playlist → paste text),并注明 API 问题以便后续更新技能。
  • 免费版 Soundiiz 每次传输仅转换一个歌单(≤ 200 首曲目)——正常个人使用不会触及此限制;仅在用户这样做时才提及限制。

相关技能