Skill Learning

scaffold-exercises

1. Bilingual SKILL.md

左右滑动可直接切换英文版与中文版;两种语言按段落自动对齐。英文中的蓝色虚线词语可点击查看解释。共标记 13 处。

入口 skill:scaffold-exercises左右滑动切换语言 · 段落位置自动对齐
#
Create exercise directory structures that pass `pnpm ai-hero-cli internal lint`, then commit with `git commit`.
## Directory naming
- **Sections**: `XX-section-name/` inside `exercises/` (e.g., `01-retrieval-skill-building`) - **Exercises**: `XX.YY-exercise-name/` inside a section (e.g., `01.03-retrieval-with-bm25`) - Section number = `XX`, exercise number = `XX.YY` - Names are dash-case (lowercase, hyphens)
## Exercise variants
Each exercise needs at least one of these subfolders:
- `problem/` - - `solution/` - - `explainer/` - conceptual material, no TODOs
When stubbing, default to `explainer/` .
## Required files
Each subfolder (`problem/`, `solution/`, `explainer/`) needs a `readme.md` that:
- Is **not empty** (must have , even a single title line works) - Has no broken links
When stubbing, create a minimal readme with a title and a description:
```md # Exercise Title Description here ```
If the subfolder has code, it also needs a `main.ts` (>1 line). But for stubs, .
## Workflow
1. **** - extract section names, exercise names, and variant types 2. **Create directories** - `mkdir -p` for each path 3. **Create stub readmes** - one `readme.md` per variant folder with a title 4. **Run lint** - `pnpm ai-hero-cli internal lint` to validate 5. **Fix any errors** -
## Lint rules summary
The linter (`pnpm ai-hero-cli internal lint`) checks:
- Each exercise has subfolders (`problem/`, `solution/`, `explainer/`) - At least one of `problem/`, `explainer/`, or `explainer.1/` exists - `readme.md` exists and is non-empty in the - No `.gitkeep` files - No `speaker-notes.md` files - No broken links in readmes - No `pnpm run exercise` commands in readmes - `main.ts` required per subfolder unless it's readme-only
## Moving/renaming exercises
When renumbering or moving exercises:
1. Use `git mv` (not `mv`) to rename directories - 2. Update the numeric prefix to 3. Re-run lint after moves
Example:
```bash git mv exercises/01-retrieval/01.03-embeddings exercises/01-retrieval/01.04-embeddings ```
## Example: stubbing from a plan
Given a plan like:
``` Section 05: Memory Skill Building - 05.01 Introduction to Memory - 05.02 Short-term Memory (explainer + problem + solution) - 05.03 Long-term Memory ```
Create:
```bash mkdir -p exercises/05-memory-skill-building/05.01-introduction-to-memory/explainer mkdir -p exercises/05-memory-skill-building/05.02-short-term-memory/{explainer,problem,solution} mkdir -p exercises/05-memory-skill-building/05.03-long-term-memory/explainer ```
Then create readme stubs:
``` exercises/05-memory-skill-building/05.01-introduction-to-memory/explainer/readme.md -> "# Introduction to Memory" exercises/05-memory-skill-building/05.02-short-term-memory/explainer/readme.md -> "# Short-term Memory" exercises/05-memory-skill-building/05.02-short-term-memory/problem/readme.md -> "# Short-term Memory" exercises/05-memory-skill-building/05.02-short-term-memory/solution/readme.md -> "# Short-term Memory" exercises/05-memory-skill-building/05.03-long-term-memory/explainer/readme.md -> "# Long-term Memory" ```
# 搭建练习框架
创建能通过 `pnpm ai-hero-cli internal lint` 的练习目录结构,然后用 `git commit` 提交。
## 目录命名
- **章节**:位于 `exercises/` 内的 `XX-section-name/`(例如 `01-retrieval-skill-building`) - **练习**:位于章节内的 `XX.YY-exercise-name/`(例如 `01.03-retrieval-with-bm25`) - 章节编号 = `XX`,练习编号 = `XX.YY` - 名称采用 dash-case(小写字母、连字符)
## 练习变体
每个练习至少需要以下一种子文件夹:
- `problem/`——带 TODO 的学生工作区 - `solution/`——参考实现 - `explainer/`——概念讲解材料,不含 TODO
创建练习桩时,除非计划另有规定,否则默认使用 `explainer/`。
## 必需文件
每个子文件夹(`problem/`、`solution/`、`explainer/`)都需要一个 `readme.md`,并且:
- **不能为空**(必须有真实内容,即使只有一行标题也可以) - 不含失效链接
创建练习桩时,用标题和描述创建一个最小 readme:
```md # 练习标题 在此填写描述 ```
如果子文件夹里有代码,它还需要一个 `main.ts`(>1 行)。但对练习桩而言,只有 readme 的练习也可以。
## 工作流
1. **解析计划**——提取章节名称、练习名称和变体类型 2. **创建目录**——对每个路径执行 `mkdir -p` 3. **创建 readme 桩**——每个变体文件夹放一个带标题的 `readme.md` 4. **运行 lint**——执行 `pnpm ai-hero-cli internal lint` 进行验证 5. **修复所有错误**——持续迭代,直到 lint 通过
## Lint 规则摘要
linter(`pnpm ai-hero-cli internal lint`)会检查:
- 每个练习都有子文件夹(`problem/`、`solution/`、`explainer/`) - `problem/`、`explainer/` 或 `explainer.1/` 至少存在一个 - 主子文件夹中存在非空的 `readme.md` - 不存在 `.gitkeep` 文件 - 不存在 `speaker-notes.md` 文件 - readme 中没有失效链接 - readme 中没有 `pnpm run exercise` 命令 - 除非该子文件夹只有 readme,否则每个子文件夹都必须有 `main.ts`
## 移动 / 重命名练习
重新编号或移动练习时:
1. 使用 `git mv`(而不是 `mv`)重命名目录,以保留 Git 历史 2. 更新数字前缀,维持顺序 3. 移动后重新运行 lint
示例:
```bash git mv exercises/01-retrieval/01.03-embeddings exercises/01-retrieval/01.04-embeddings ```
## 示例:根据计划创建练习桩
给定如下计划:
``` 章节 05:记忆技能构建 - 05.01 记忆简介 - 05.02 短期记忆(explainer + problem + solution) - 05.03 长期记忆 ```
创建:
```bash mkdir -p exercises/05-memory-skill-building/05.01-introduction-to-memory/explainer mkdir -p exercises/05-memory-skill-building/05.02-short-term-memory/{explainer,problem,solution} mkdir -p exercises/05-memory-skill-building/05.03-long-term-memory/explainer ```
然后创建 readme 桩:
``` exercises/05-memory-skill-building/05.01-introduction-to-memory/explainer/readme.md -> "# 记忆简介" exercises/05-memory-skill-building/05.02-short-term-memory/explainer/readme.md -> "# 短期记忆" exercises/05-memory-skill-building/05.02-short-term-memory/problem/readme.md -> "# 短期记忆" exercises/05-memory-skill-building/05.02-short-term-memory/solution/readme.md -> "# 短期记忆" exercises/05-memory-skill-building/05.03-long-term-memory/explainer/readme.md -> "# 长期记忆" ```

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;这不改变其来源内容。

信息架构 / 执行顺序

  1. 先把课程结构编码进名称。 section 用 XX-...,exercise 用 XX.YY-...,顺序直接进入路径。
  2. 再区分教学角色。 problem/、solution/、explainer/ 分别承载学生任务、参考实现和概念讲解。
  3. 提供最小可行默认值。 没有显式变体时用 explainer/,stub 可以只有非空 readme.md。
  4. 从 plan 批量映射到目录。 先解析名称与变体,再创建路径和 readme 桩。
  5. 用 lint 收束生成结果。 创建后运行仓库检查器,修复所有错误直到通过。
  6. 移动时保护演化历史。 使用 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 历史、课程顺序和结构校验放进同一流程,减少局部重命名造成的全局破坏。

防失败机制与显式不变量

Trade-off、可移植性与假设

可迁移原则

  1. 让目录命名同时表达层级、顺序和可读语义,减少额外索引文件。
  2. 用角色目录隔离学习者输入、参考答案与概念材料,让工具和人共享同一信息架构。
  3. 为不完整输入提供最少承诺的默认值,并明确允许显式计划覆盖。
  4. 不要生成虚假代码来满足形式;为 stub 设计诚实而可验证的最低内容契约。
  5. 把脚手架完成标准交给机器检查,并把修复循环和停止条件写进 workflow。
  6. 将移动、重编号、链接更新与复检视为一个原子化维护动作。

今日实践题

如果要在 05.01 与 05.02 之间插入一个只含概念讲解的新练习,你会选择重编号、使用小数式中间编号,还是调整原计划?请说明你的方案怎样同时保持路径顺序、Git 历史和 lint 通过。

Evidence note

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