diff --git a/.claude/skills/learn-tidy/SKILL.md b/.claude/skills/learn-tidy/SKILL.md new file mode 100644 index 0000000..0bca275 --- /dev/null +++ b/.claude/skills/learn-tidy/SKILL.md @@ -0,0 +1,102 @@ +--- +name: learn-tidy +description: > + 整理用户在 js_notes/ 学习练习里刚写完或改完的代码 —— 跑真实输出、把错法整理成 + ❌/✅ 对照痕迹、修正写错的结果注释、把有教益的新错误吸收进 my-mistakes.md。 + 当用户说「整理」「整理一下」「tidy」「收拾干净」「帮我整理这段/这题」,或刚做完一章练习、 + 刚改完一段试验代码、留下了对错混杂的多版尝试时,主动用这个 skill。它是这个学习仓库 + 反复要做的收尾动作,专门服务 js_notes/ 的教学约定,别用内置 code-review 代替。 +--- + +# learn-tidy · 整理学习练习代码 + +把用户刚写/改的练习或试验代码"收拾干净",让它成为将来复习时**看得懂、可追溯、能跑**的 +学习痕迹。这是本仓库(30-Days-Of-JavaScript)`js_notes/` 反复要做的收尾动作。 + +先读 `CLAUDE.md` 与 `js_notes/README.md` 里的辅导规则(它们是**具有约束力的**),本 skill +是那套规则在"整理"这个动作上的具体落地,不得与之冲突。 + +## 什么时候用 + +- 用户说「整理」「整理一下 / 这段 / 这题」「tidy」「收拾干净」 +- 用户刚做完一章练习(A–F 之类)、或刚改完一段 `// 试验 / 探索` 代码 +- 文件里留下了**对错混杂的多版尝试**(比如 3 行 reduce、2 个同名 const) + +## 核心原则(为什么这么做) + +成品是**文件**,不是聊天:将来的用户只会翻文件,不会翻对话记录。所以整理的目标是让文件 +**自解释**——一眼看到"错在哪、为什么错、正解是什么"。而且**绝不留能跑的坏代码**:错的要么 +删、要么注释成对照,活代码必须是对的。 + +## 流程(按顺序做,别跳步) + +### 1. 先读,再跑真实输出(绝不凭记忆) + +- Read 目标文件相关段落,搞清哪些是用户的练习答案、哪些是试验、哪些是还没动的「轮到你」。 +- **跑 `node js_notes/NN-topic.js`** 拿到**真实输出**。需要只查语法时先 `node --check`。 +- 临时验证可写 `/tmp/*.js` 跑,但**结论必须落进正式文件**,别把只存在于 /tmp 或聊天里的 + 结果当交付。 +- 用真实输出对照用户写的"预期注释"——**注释写错的结果要改对**(这是高频问题,例如用户 + 写 `// "修改y的name"` 但实跑是 `fn`)。 + +### 2. 把错法整理成 ❌ / ✅ 对照(留学习痕迹) + +对用户犯过的错、或对错混杂的多版尝试: + +- **错的那版注释掉**(绝不留能跑的坏代码),放在**正解上方**。 +- 加一行简短 `// ❌ 原因` 说清*为什么*错;正解用 `// ✅` 标出、留作**活代码**。 +- 多版尝试(如 3 行 reduce)收敛成:错的都注释成 ❌ 对照,最优的一版留活代码。 +- 若某版"能救回来但不优雅",可用 `// 🔸` 标注中间方案,但活代码留最干净的那版。 + +风格对齐用户已在 `06-arrays.js` / `07-objects.js` / `10-functions.js` 用的写法: + +```js +// ❌ ^ 在 JS 是"按位异或"不是乘方:8^2=10、和平方无关 +// console.log(nums.filter(n => n % 2 === 0).map(n => n^2)) +// ✅ 乘方用 **(或 n*n) +console.log(nums.filter(n => n % 2 === 0).map(n => n ** 2)) // [ 64, 100 ] +``` + +### 3. 决定要不要吸收进 my-mistakes.md(关键判断,别做流水账) + +**不是所有错误都记。** `my-mistakes.md` 是"复习时值得回看的坑",不是错误日志。三档处理: + +| 情况 | 怎么办 | +|---|---| +| 新的、有教益的坑(尤其"能跑不报错"的概念坑) | ✅ 新开一条 | +| 已有条目的重演 / 变体 | 🔸 不新开,在原条目**补一句**新情境 | +| 纯手误 / 已被现有条目覆盖 / 用户已自己改好且无新东西可学 | ❌ 不记 | + +新开条目沿用现有格式:**错法 → 现象 → 正解/根源 → 教训**,并带 `📍来源`(文件 + 练习号)。 +能跑不报错的坑标 ⭐,概念性推错(非手误)可标 ⭐⭐ 并注明"概念推错,非手滑"。若坑对应某个 +报错信息,顺手更新末尾的「高频报错 → 秒查表」。 + +**拿不准值不值得记时,问用户。**(用户明确说过:记流水账他会反驳。) + +### 4. 不碰用户还没做的练习 + +「轮到你」里用户**还没动手**的题,**绝不**往里写解答(哪怕注释掉也不行,会剧透)。整理只针对 +用户**已经写了**的答案/试验。 + +### 5. 跑一遍验证 + 收尾 + +- 改完后再 `node js_notes/NN-topic.js`(或 `node --check`)确认整章能跑、输出符合预期。 +- 如果这次整理正好是"一章练习全部做完",可按 `CLAUDE.md` 的「一章收尾必做清单」把 README + 进度勾选也带上。 + +### 6. commit —— 灵活判断,别默认执行 + +**不要每次整理都自动 commit。** 由具体情形决定: + +- 若这次整理是一个**逻辑完整的收尾**(一章做完、或一段独立讲解落定),且工作区就这些改动 + → 可以提议 commit,并给出 Angular 风格 message(`docs(js_notes): ...`),**先说清要提交什么**。 +- 若还在**中途**(用户可能马上继续改)、或工作区混着其它未完成改动 → **先别 commit**, + 只把整理做好、告诉用户"整理完了,要提交时说一声"。 +- 拿不准时,问用户要不要提交,而不是擅自 commit。 + +commit 前遵守 `CLAUDE.md` 的 Git 约定:干净拆分、绝不提交私密内容、不丢弃用户工作。 + +## 结束时给用户的话 + +简短汇报:跑出来的真实输出、留了哪些 ❌/✅ 痕迹、有没有(以及为什么)动 my-mistakes、 +要不要 commit。别长篇复述文件内容——用户会自己翻文件。