scaffold-exercises
1. Bilingual SKILL.md
左右滑动可直接切换英文版与中文版;两种语言按段落自动对齐。英文中的蓝色虚线词语可点击查看解释。共标记 13 处。
Entry SHA-256: 75f5c9d771606fb9762f16522efc954df11c324f87148d8ff069bce166257de9
2. Why This Skill Is Clever
一句话核心机制
把课程计划规范化为带编号的 section / exercise / variant 目录骨架,并用仓库 linter 驱动修复闭环,再以 Git 感知的提交方式保存结果。
触发与调用边界
直接来源。 frontmatter 将触发场景限定为:用户要 scaffold exercises、创建 exercise stubs,或建立新的 course section。它解决的是特定课程仓库的目录搭建,不是通用脚手架生成器。
直接来源。 所选 skill 自己定义了命名、变体、最低文件、lint 规则、移动规则和完整示例,因此不是纯 wrapper。本报告只展示 skills/misc/scaffold-exercises/SKILL.md,不会把 linter 实现或仓库说明冒充第二份原文。
支持性背景。 skills/misc/README.md 将它归类为“保留但很少使用、未由插件推广”的 misc 工具。因此报告标注为 Misc / Non-promoted;这不改变其来源内容。
信息架构 / 执行顺序
- 先把课程结构编码进名称。 section 用
XX-...,exercise 用XX.YY-...,顺序直接进入路径。 - 再区分教学角色。
problem/、solution/、explainer/分别承载学生任务、参考实现和概念讲解。 - 提供最小可行默认值。 没有显式变体时用
explainer/,stub 可以只有非空readme.md。 - 从 plan 批量映射到目录。 先解析名称与变体,再创建路径和 readme 桩。
- 用 lint 收束生成结果。 创建后运行仓库检查器,修复所有错误直到通过。
- 移动时保护演化历史。 使用
git mv、维护数字前缀并重新 lint,最后提交。
最巧妙的设计点
1. 用路径同时承载排序与语义
Section number = XX, exercise number = XX.YY
直接来源。 两级数字前缀把章节顺序和章节内顺序写进目录名,dash-case 又让名称可读、稳定且适合命令行。
解释。 这避免依赖额外清单才能知道教学顺序。文件树本身就是课程导航;代价是插入或移动内容可能引发连续重命名。
2. 把内容角色变成互斥清晰的目录
student workspace with TODOs
直接来源。 problem/、solution/、explainer/ 的职责通过 TODO、有无答案、是否只讲概念来区分。
解释。 与把所有内容塞进一个目录再靠文件名猜角色相比,目录边界让学生入口、答案入口和纯讲解入口更容易被工具与人同时识别。
3. 默认值追求“最少承诺”
default to explainer/ unless the plan specifies otherwise
直接来源。 未指定变体时不会凭空制造 problem 和 solution,而是只建立一个 explainer 桩。
解释。 这是很稳妥的默认:概念材料不暗示已有可执行题目或标准答案;一旦计划显式要求完整三件套,再扩展结构。默认行为可预测,又保留覆盖权。
4. 允许 readme-only stub,避免伪代码噪声
a readme-only exercise is fine
直接来源。 有代码才要求 main.ts 超过一行;纯 stub 只需带真实内容的 readme。
解释。 如果脚手架为了满足结构而生成空 main.ts,仓库会积累没有教学价值的文件。这里把“尚未实现”诚实表达为文档骨架,同时禁止空 readme 和 .gitkeep 这类形式占位。
5. 把 lint 作为循环的停止条件
iterate until lint passes
直接来源。 工作流不是“创建一次就结束”,而是明确运行检查、修复错误、反复验证。
解释。 目录生成容易出现编号、缺文件、断链和禁用文件等细碎错误。用可执行检查器定义完成,比靠人工目测更可复现,也让批量搭建具备清晰验收门槛。
6. 重命名也必须重新验证
Use git mv (not mv)
直接来源。 移动不仅要保留版本控制意图,还必须维护数字前缀并再次运行 lint。
解释。 这承认“移动”会影响顺序和链接,不是无害的文件系统操作。将 Git 历史、课程顺序和结构校验放进同一流程,减少局部重命名造成的全局破坏。
防失败机制与显式不变量
- 至少一个教学变体(直接来源): 每个 exercise 至少有一个指定子文件夹。
- 非空入口(直接来源): primary subfolder 必须存在非空
readme.md,且链接不能失效。 - 代码与文件匹配(直接来源): 有代码的子文件夹需要超过一行的
main.ts;readme-only stub 例外。 - 禁止伪占位和遗留材料(直接来源):
.gitkeep与speaker-notes.md被明确排除。 - 禁止错误运行指令(直接来源): readme 不能包含
pnpm run exercise。 - 移动后复检(直接来源): 重编号、维护顺序并再次 lint。
- 计划歧义风险(解释): plan 若缺少变体或名称重复,默认
explainer/能继续生成,但不一定符合教学意图;执行前应记录默认决策。 - 提交边界风险(解释): 原文要求最终
git commit,但未规定检查当前工作树或限定暂存范围;在混合改动仓库中必须避免提交无关文件。
Trade-off、可移植性与假设
- 结构清晰 vs. 重编号成本(解释): 数字路径天然有序,但中途插入练习可能产生大范围 rename 和链接更新。
- 最小 stub vs. 教学完整度(直接来源 + 解释): 一行标题能通过最低规则,却不能证明练习可学;lint 只验证结构与部分内容卫生。
- 仓库专用工具链(直接来源):
pnpm ai-hero-cli internal lint、pnpm、main.ts和固定目录名绑定特定 TypeScript 课程仓库。 - Shell 假设(直接来源):
mkdir -p与 brace expansion 依赖类 Unix shell;Windows 原生环境需要等价实现。 - Git 行为表述(解释):
git mv能清楚暂存删除与新增,但 Git 的历史追踪和 rename 展示仍由内容相似度检测决定,不能把命令本身理解为不可破坏的历史绑定。 - 证据边界(支持性背景): 本报告只用 misc README 证明分类,未检查
ai-hero-cli的源码,因此 lint 行为以所选 skill 的摘要为准。
可迁移原则
- 让目录命名同时表达层级、顺序和可读语义,减少额外索引文件。
- 用角色目录隔离学习者输入、参考答案与概念材料,让工具和人共享同一信息架构。
- 为不完整输入提供最少承诺的默认值,并明确允许显式计划覆盖。
- 不要生成虚假代码来满足形式;为 stub 设计诚实而可验证的最低内容契约。
- 把脚手架完成标准交给机器检查,并把修复循环和停止条件写进 workflow。
- 将移动、重编号、链接更新与复检视为一个原子化维护动作。
今日实践题
如果要在 05.01 与 05.02 之间插入一个只含概念讲解的新练习,你会选择重编号、使用小数式中间编号,还是调整原计划?请说明你的方案怎样同时保持路径顺序、Git 历史和 lint 通过。
Evidence note
- 直接来源: 触发条件、目录编号、三类变体、最小 readme、workflow、lint 摘要、移动规则与示例均来自本次选择的
skills/misc/scaffold-exercises/SKILL.md。 - 支持性背景:
skills/misc/README.md只用于确认 Misc / Non-promoted 分类,不属于所选原文。 - 解释: “最少承诺默认值”“诚实 stub”、重编号成本、混合工作树提交风险和 Git rename 检测说明是根据来源结构作出的工程判断。
Source & provenance
- Repository path
- skills/misc/scaffold-exercises/SKILL.md
- Generated
- 2026-08-28 13:12 Asia/Shanghai
- Upstream commit
- 6654f6b60cd9d5be8b54c6fafe44346dabeb3b76
- Source
- View on GitHub