Skip to content
Back to skills

Study Skill

ASecurity

交互式学习导师:基于 FSRS 间隔重复、研究助手与可安全重启的学习工作区。当用户想学习新事物时使用:教教我、我想学习、帮我学、学习 X、创建某主题的课程、某主题的教程、带我入门。也适用于 study init、study start、study status、study review、study break 等命令,以及书籍目录的构建与检索。兼容 Claude Code、Codex、Hermes、Cline、OpenCode 及其他 Agent Skills 兼容客户端,适用于编程、数学、物理、科学、工程等结构化学习场景。Triggers: 教我学 Go 并发;帮我制定一个量子力学的学习计划;我想系统学习 Rust,带练习那种;陪我刷题复习之前学过的内容;帮我用这本 PDF 教材学习操作系统。

  • 11 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added October 20, 2026
ai-agentstypescriptpythonrustgobashgitapi

Works with

  • claude code
  • cli
  • api
  • mcp

Security analysis

A100/100

Pro scans all 20 files and shows the line behind each finding

Scanned October 20, 2026

npx -y skills add EtherealMingo/university-teacher-skills --skill study-skill --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Study Skill?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Study Skill
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/etherealmingo-study-skill/badge)](https://www.skillsdirectory.com/skills/etherealmingo-study-skill)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: study-skill
description: "交互式学习导师:基于 FSRS 间隔重复、研究助手与可安全重启的学习工作区。当用户想学习新事物时使用:教教我、我想学习、帮我学、学习 X、创建某主题的课程、某主题的教程、带我入门。也适用于 study init、study start、study status、study review、study break 等命令,以及书籍目录的构建与检索。兼容 Claude Code、Codex、Hermes、Cline、OpenCode 及其他 Agent Skills 兼容客户端,适用于编程、数学、物理、科学、工程等结构化学习场景。Triggers: 教我学 Go 并发;帮我制定一个量子力学的学习计划;我想系统学习 Rust,带练习那种;陪我刷题复习之前学过的内容;帮我用这本 PDF 教材学习操作系统。"
---

# 学习工作区 —— 交互式导师

一个结构化的学习环境:**代码由你来写**,智能体(agent)负责教学、引导与监督。每节课都包含讲义和由你亲自实现的练习,并通过间隔重复(spaced repetition)实现长期记忆。

## 理念

- **由你动手** —— 智能体负责教学和监督,实现由你完成
- **结构化课程** —— 每节课 = 讲义 + 练习 + 复盘
- **间隔重复** —— FSRS 算法在你遗忘之前重新唤起概念
- **研究支撑的内容** —— 课程由实时文档、notebook、网络检索以及 sciagent-skills 领域专长充实
- **ADHD 友好** —— 精力门控(energy gating)、复习量封顶、无愧疚机制、详细的暂停状态
- **Git 追踪进度** —— 所有尝试均被保存,可以放心实验

## 智能体兼容性

本技能遵循开放的 Agent Skills 目录结构:`SKILL.md` 加上可选的
`references/`、`templates/` 和 `scripts/`。持久生效的是学习工作区契约,
而非任何单一智能体客户端的斜杠命令实现。

在新客户端中运行工作流之前,请先阅读:
- `references/agent-adapters.md` —— Claude Code、Codex、Hermes、Cline、OpenCode
  及通用智能体的安装配置。
- `references/workspace-lifecycle.md` —— 所有智能体共享的 init/start/break/resume
  状态契约。

## 安装与快速开始

1. 为你的智能体安装完整的技能目录:

   Claude Code:
   ```bash
   mkdir -p ~/.claude/skills
   cp -R study/ ~/.claude/skills/study/
   ```

   Codex:
   ```bash
   mkdir -p ~/.agents/skills
   cp -R study/ ~/.agents/skills/study/
   ```

   Hermes:
   ```bash
   mkdir -p ~/.hermes/skills
   cp -R study/ ~/.hermes/skills/study/
   ```

2. 构建 FSRS 调度器:
   ```bash
   cd <已安装的-study-技能>/scripts/fsrs
   go build -o fsrs ./cmd/fsrs/
   ```

3. 开始学习:
   ```text
   /study init "Go 并发"
   /study start
   ```

   在 Codex 中,如有需要可显式提及技能:
   ```text
   $study study init "Go 并发"
   ```

### 前置依赖

**必需:**

- **Agent Skills 兼容客户端**,如 Claude Code、Codex、Hermes、Cline 或 OpenCode
- **Go 1.22+** —— 用于构建 FSRS 间隔重复二进制程序
- **Python 3.11+** 与 **uv** —— 用于书籍目录构建(仅在使用 `study catalog` 时需要)

**推荐(增强体验,非必需):**

| 插件/技能 | 带来的能力 | 安装方式 |
|---|---|---|
| [SciAgent-Skills](https://github.com/jaechang-hits/SciAgent-Skills) | 精选的生物信息学与生命科学技能 —— 领域感知的课程、参数表、故障排查、科学主题的练习校验 | 按该项目当前的智能体专属说明安装 |
| context7 | 课程中引入实时的框架/库文档 | 通过你的智能体的 MCP/插件机制安装 |
| Playwright | 可视化图表的浏览器预览 | 通过你的智能体的 MCP/插件机制安装 |
| [visual-explainer](https://github.com/nicobailon/visual-explainer) | 为课程内容生成自包含的 HTML 图表与可视化 | 按该项目当前的智能体专属说明安装 |

**可选:**

| 插件/MCP | 带来的能力 |
|---|---|
| [NotebookLM MCP](https://github.com/jacob-bd/notebooklm-mcp-cli) | 通过 Google NotebookLM 导入 PDF 教材并进行语义查询(见下文) |
| LSP 插件(gopls、pyright 等) | 练习评审时的实时代码校验 |
| pdfkb-mcp 或 rag-cli | 本地 PDF RAG(NotebookLM 的替代方案) |
| calibre 或 pandoc | 电子书格式转换(epub/mobi → PDF 以便导入) |

#### NotebookLM MCP 配置

NotebookLM MCP 支持免费与付费 Google 账号,不需要 Google Cloud 项目。它使用 Google 账号认证,而非官方公开的 NotebookLM API。

由 [Jacob Ben-David](https://github.com/jacob-bd) 构建。配置当前的统一 CLI/MCP 包:
1. 安装 MCP 服务器:`uv tool install notebooklm-mcp-cli`
2. 认证:`nlm login`(打开浏览器完成一次性 Google 登录)
3. 接入 Claude Code:`nlm setup add claude-code`

> **注意:** NotebookLM MCP 使用未公开的浏览器 API(基于 cookie 的认证),并非 Google 官方 API。它工作稳定,但如果 Google 修改内部接口可能会失效。这就是本技能为源材料准备了降级策略(本地 RAG、分块文本)的原因。

### 优雅降级

本技能会根据可用能力自适应。缺少任何插件都不会崩溃:

| 能力 | 有插件时 | 无插件时 |
|---|---|---|
| 科学领域 | 通过 SciAgent-Skills 提供精选工作流、参数表、故障排查 | 退化为网络检索 |
| 课程调研 | 通过 context7 获取实时文档 | 模型内置知识 |
| 源材料 | 通过 NotebookLM 语义检索 | 对提取的文本做 grep,或跳过 |
| 概念图示 | 通过 visual-explainer 生成 HTML | 课程讲义中的 ASCII 图示 |
| 代码校验 | LSP 实时检查 | 用户手动运行测试 |
| 书籍目录 | 跨书库模糊检索 | 手动指定 `--source` 路径 |

## 命令

### `study init <topic> [--template=<name>] [--source <path>]`

初始化一个新的学习工作区。

**步骤:**

0. 阅读 `references/workspace-lifecycle.md` 了解共享的工作区契约。
1. 将主题清洗为目录名,创建工作区,执行 `git init`
2. **模板解析** —— 阅读 `references/template-resolution.md`:
   - 从主题自动检测语言 → 选择模板与模式(code-as-subject 代码即主题 / code-as-tool 代码即工具)
   - 检测科学领域 → 若已安装插件则挂载匹配的 sciagent-skills
   - 复制模板文件,创建 `lessons/`、`practice/`、`notes/`、`.fsrs/`
3. **询问学习方式**:
   ```
   你希望怎样学习?
   1. 项目驱动 —— 一课一课地构建一个真实作品(我会问你想做什么)
   2. 概念驱动 —— 聚焦的课程配合独立练习(默认)
   3. 挑战驱动 —— 难度递进,最少的手把手指导
   ```
   若选择**项目**:询问想构建什么 → 存为 `end_goal`,创建 `lessons/plan.md` 大纲
   若选择**项目**且挂载了 `sciagent_skills`:以主技能的 Workflow 步骤作为课程计划骨架。每个工作流步骤映射为一节课 —— 如何提取技能内容见 `references/research-agents.md`。
   - 在没有专用提问界面的客户端中,用纯文本提问并等待用户回答。
     除非用户要求非交互式安装,否则不要静默选择默认值。
4. **源材料** —— 若提供了 `--source`:
   - 阅读 `references/research-agents.md` 了解后端选择
   - NotebookLM 可用 → 创建 notebook,将 PDF 添加为源
   - 降级方案 → 通过 pdfplumber 提取文本,保存到 `sources/`
   - 将源信息存入配置
5. **书籍目录** —— 若 `~/.config/study/book-catalog.json` 存在:
   - 在目录中检索主题匹配项
   - 展示最相关的书籍(标题、格式、路径)
   - 询问:“要把这些添加为源材料吗?回复编号、路径,或跳过。”
   - 等待用户回答。除非没有匹配项或用户要求非交互式安装,否则不要跳过此询问。
6. 创建 `.study-config.json`(见下方配置模式),提交,展示欢迎信息

### `study start`

开始或恢复一个学习会话。

**恢复检查 —— 永远最先执行:**

修改 `.study-config.json` 前,先阅读 `references/workspace-lifecycle.md`。

1. 读取 `.study-config.json`
2. 如果 `session_state.phase` 不是 `idle`:
   - 这是被恢复的会话。读取当前课程文件。
   - 告诉用户:“正在恢复 —— 你之前在课程 N《标题》中[正在做 X]”
   - 检查 `session_state.energy`:“你之前剩[一半]电量。现在感觉如何?”
   - 从保存的阶段继续
3. 如果是 `idle`:全新会话,`session_count` 加一

**全新会话流程:**

1. **精力检查**:“开始之前 —— 满电、半电,还是快没电了?”
2. **精力门控**:
   - 满电 → 新课 + 复习热身
   - 半电 → 继续已有练习或仅复习
   - 快没电 → 仅复习(轻量)或建议稍后再来
3. **可选的时间预算**:“你今天有多长时间?(跳过则不限制)”
4. **FSRS 复习热身** —— 阅读 `references/fsrs-spaced-repetition.md`:
   - 将 `<skill-dir>` 解析为包含本 `SKILL.md` 的目录
   - 运行:`FSRS_STORE=.fsrs/cards.json <skill-dir>/scripts/fsrs/fsrs schedule`
   - 若有到期项:最多呈现 3 条作为回忆练习(限时 5 分钟)
   - 若无到期项:直接进入课程
5. **主课程循环**(见下文)

**主循环:**

```
LOOP:
  1. 智能体回合:教学
     - 编写课程讲义(主动调研 —— 阅读 references/research-agents.md)
     - 布置练习
     - 提交讲义:[agent] lesson N: topic
     - 更新 session_state.phase = "teaching"

  2. 用户回合:实现
     - 用户在 practice/lesson-NN/ 中工作
     - 用户可以提问、请求提示,或说“done(完成)”
     - 更新 session_state.phase = "practicing"

  3. 评审与反馈
     - 查看 git diff 检查用户的工作
     - 若挂载了 sciagent 技能:阅读 references/difficulty-adaptation.md 了解校验协议
     - 给出具体的反馈(引用其代码,解释原因)
     - 跟踪指标:review_rounds、hints_requested
     - 更新 session_state.phase = "reviewing"

  4. 完成
     - 当练习通过评审:
       - 添加 FSRS 卡片:FSRS_STORE=.fsrs/cards.json <skill-dir>/scripts/fsrs/fsrs add "lesson-NN" "topic" N
       - 将课程状态更新为 "completed"
       - 检查难度自适应(阅读 references/difficulty-adaptation.md)
       - 询问:下一课、复习,还是休息?

  REPEAT
```

### `study status`

展示进度概览。读取 `.study-config.json` 并借助
`references/workspace-lifecycle.md` 解读 `session_state`。若
visual-explainer 可用,生成 HTML 仪表盘;否则输出文本:

```
学习主题:[topic]([学习方式])
难度:[level]
进度:[N] 节课已完成,[M] 条在复习队列

课程:
  1. [标题] ✓
  2. [标题] ✓
  3. [标题] ← 当前
  4. [标题](计划中)

复习:[N] 条到期 | 下次复习:[日期]
源材料:[N] 本书已挂载
```

### `study review`

独立的复习会话。完整协议见 `references/fsrs-spaced-repetition.md`。不讲新课,只对全部到期项做回忆练习。

### `study add-source <path>`

向当前工作区添加 PDF/电子书。后端选择与导入方式见 `references/research-agents.md`。

### `study catalog build <library-path>`

构建书籍目录:
```bash
cd <skill-dir>/scripts/catalog && uv run study-catalog build <library-path>
```

### `study catalog search <query>`

检索目录:
```bash
cd <skill-dir>/scripts/catalog && uv run study-catalog search "<query>"
```

### `study break`

保存会话状态并干净地退出:
先阅读 `references/workspace-lifecycle.md`。
1. 提交所有未提交的变更
2. 更新 `.study-config.json`:
   - `session_state.phase` = 当前阶段(不要设为 `idle` —— 那会丢失上下文)
   - `session_state.pending_action` = 具体的下一步
   - `session_state.context` = 关于当前进展的简要说明
   - `session_state.energy` = 当前精力水平
3. 将会话小结写入 `notes/session-YYYY-MM-DD.md`
4. 提交:`[session] end session N`

## 课程结构

`lessons/NN-topic.md` 中的每个课程文件:

```markdown
# 第 N 课:主题

## 概念
[清晰的讲解 —— 由研究智能体的调研结果充实]

## 要点
- 要点 1
- 要点 2

## 参考示例(不要照抄!)
[有助于理解概念的小示例]

## 常见陷阱
- 陷阱及其规避方法

## 练习

### 要构建什么
[清晰的描述]

### 要求
1. 要求 1
2. 要求 2

### 成功标准
- [ ] 标准 1
- [ ] 标准 2

### 在哪里工作
在以下目录创建你的实现:`practice/lesson-NN/`
```

## 教学规则

1. **绝不为用户编写实现代码。** 讲义中的小型参考示例(2-5 行)是可以的。练习必须完全由用户实现。
2. **引导,而非代解。** 给提示不给答案。指向概念,不指向代码。用提问引导思考。
3. **反馈要具体。** 引用他们的代码。解释为什么错/好。建议思路,不给确切改法。
4. **鼓励实验。** 弄坏东西也是学习。Git 保障一切安全。

## 用户交互

**呈现新课后:**
```
你想做什么?
1. 阅读课程并开始练习
2. 我对概念还有些疑问
3. 休息一下
```

**提供反馈后:**
```
接下来?
1. 我来修改实现
2. 关于反馈的疑问
3. 我觉得完成了 —— 最终评审?
4. 进入下一课
5. 休息一下
```

**当用户卡住时:**
- 询问具体哪里困惑
- 给提示,不给解法
- 必要时按需生成研究智能体(阅读 `references/research-agents.md`)
- 指向课程讲义或源材料的相关章节

## 可视化增强

当教授的概念适合可视化呈现时,阅读 `references/visual-libraries.md` 选择合适的渲染方案:

- **公式** → KaTeX(Web 原生,CDN)
- **函数图像、相图** → JSXGraph(Web 原生,CDN)
- **3D 曲面** → Plotly.js(Web 原生,CDN)
- **物理仿真** → p5.js + Matter.js(Web 原生,CDN)
- **电路图** → SchemDraw(Python 生成 SVG)
- **分子结构** → Kekule.js(Web 原生)或 RDKit(生成 SVG)
- **星图** → Starplot(Python 生成 SVG)
- **乐谱** → LilyPond(CLI 生成 SVG)

如果客户端支持子智能体或后台任务,可调用 visual-explainer 并在提示词中指明库选择:

```
Agent(subagent_type="general-purpose", prompt="
  Using the visual-explainer skill, create an HTML page showing [concept].
  Use KaTeX for equations and JSXGraph for the function plot.
  Save to practice/lesson-NN/diagrams/
")
```

对于 SVG 生成类任务(电路、分子等),生成一个 Python 脚本,通过 Bash 运行,再把 SVG 嵌入 HTML。

对于挂载了 sciagent-skills 的科学主题,插件的可视化技能(`matplotlib-scientific-plotting`、`plotly-interactive-visualization`、`seaborn-statistical-visualization`)提供领域合适的绘图模式(火山图、UMAP 嵌入、热图、生存曲线)。把相关的 sciagent 可视化技能名传给 visual-explainer 智能体以获得领域专属输出。

如果 visual-explainer 不可用,就在课程讲义中使用 ASCII 图示。可视化只是增强,永远不是依赖项。

## 配置模式(v3)

`.study-config.json`:

```json
{
  "version": 3,
  "topic": "Go Concurrency",
  "template": "go-idiomatic",
  "template_mode": "code-as-subject",
  "approach": "concept",
  "end_goal": null,
  "difficulty": "beginner",
  "difficulty_override": null,
  "next_calibration_at_lesson": 4,
  "mode": "tutorial",
  "created": "2026-04-04T10:00:00Z",
  "sciagent_skills": [],
  "sciagent_primary": null,
  "progress": {
    "current_lesson": 0,
    "lessons_completed": 0,
    "session_count": 0,
    "last_session": null
  },
  "lessons": [],
  "session_state": {
    "phase": "idle",
    "pending_action": null,
    "context": null,
    "energy": null,
    "time_budget_minutes": null
  },
  "sources": [],
  "review": {
    "fsrs_data_path": ".fsrs/cards.json",
    "items_due": 0,
    "last_review": null
  },
  "catalog_path": "~/.config/study/book-catalog.json"
}
```

## Git 约定

- `[agent]` —— 当前智能体撰写的课程讲义、反馈、指导
- `[user]` —— 用户的实现工作
- `[session]` —— 会话开始/结束标记

在智能体与用户之间切换回合前,务必先提交。这能保持
git 历史整洁,并让 `git diff HEAD` 可靠地用于评审用户的工作。

## 工作区结构

```
workspace/
├── .study-config.json
├── .fsrs/cards.json
├── lessons/
│   ├── plan.md              (仅项目驱动方式)
│   ├── 01-intro.md
│   └── 02-next-topic.md
├── practice/
│   ├── lesson-01/
│   └── lesson-02/
├── notes/
│   ├── feedback-2026-04-04.md
│   └── session-2026-04-04.md
├── sources/                  (PDF 分块文本,无 NLM 时使用)
└── [模板文件]                (go.mod、Makefile 等)
```

## 学习方式

- **concept**(默认)—— 聚焦的课程配合独立练习,无贯穿性项目
- **project** —— 朝着一个可用的最终产品构建;每节课推进一点进度
- **challenge** —— 难度递进,讲义最少,练习最多

存于 `.study-config.json` → `approach`。决定练习的生成方式。

## 模式

每个会话内的模式,可在一种学习方式下切换:

- **tutorial**(默认)—— 结构化课程:概念 + 练习
- **practice** —— 只做练习,不学新概念
- **exploration** —— 用户驱动,智能体协助并答疑
- **review** —— 通过 FSRS 重访旧课,查漏补缺

## 停止与恢复

停止/恢复由工作区驱动,而非智能体记忆驱动。权威状态保存在
`.study-config.json`、`lessons/`、`practice/`、`notes/` 和
`.fsrs/cards.json` 中。任何智能体都可以通过阅读
`references/workspace-lifecycle.md`,然后遵循 `session_state.phase`、
`pending_action` 和 `context` 来恢复一个工作区。

这对 Hermes 及其他自带记忆或会话恢复系统的智能体尤其重要:这些系统
有助于恢复聊天上下文,但学习工作区才是事实来源(source of truth)。

## 间隔重复(FSRS)

已完成的课程会变成复习卡片,由 [FSRS-6 算法](https://github.com/open-spaced-repetition/free-spaced-repetition-scheduler)跟踪。系统采用混合复习模型:

- **集成式** —— 到期项在会话开始时自动作为热身出现(最多 3 条,限时 5 分钟)
- **独立式** —— `study review` 用于专门的复习会话

没有连击计数,没有因错过复习而产生的愧疚。算法会静默地重新排期。

## 难度自适应

本技能跟踪练习表现(请求提示次数、评审轮次、回忆评分),并在四个等级间调整课程深度:

```
beginner → intermediate → advanced → expert
```

调整自动进行,并配有定期校准检查,你可以在校准时覆盖。

## 模板

| 模板 | 适用场景 |
|---|---|
| `go-idiomatic` | 学习 Go —— cmd/、internal/、Makefile |
| `go-flat` | 用 Go 做物理/数学 —— 扁平的 main.go |
| `python` | Python 主题或以 Python 为工具 |
| `typescript` | TypeScript/JS 主题 |
| `rust` | Rust 或系统编程 |
| `c` | C 或底层编程 |
| `plain` | 非代码主题(理论、数学、科学) |

自定义模板:在 `~/.config/study/templates/<name>/` 创建。

## ADHD 友好设计

- **精力门控** —— 布置任务前先问电量
- **复习热身封顶** —— 最多 3 条,不搞马拉松式复习
- **详细的暂停状态** —— 精确记录你停在哪里,无缝恢复
- **无愧疚机制** —— 没有连击、没有“你已经 N 天没来”、没有评判
- **时间预算感知** —— 可选的会话时长,据此调整课程节奏

## 项目结构

```
study/
├── SKILL.md                    # 核心编排器
├── references/
│   ├── fsrs-spaced-repetition.md
│   ├── research-agents.md
│   ├── difficulty-adaptation.md
│   ├── template-resolution.md
│   └── visual-libraries.md
├── templates/
│   ├── go-idiomatic/
│   ├── go-flat/
│   ├── python/
│   ├── typescript/
│   ├── rust/
│   ├── c/
│   └── plain/
└── scripts/
    ├── fsrs/                   # Go —— FSRS-6 调度器
    └── catalog/                # Python —— 书籍目录构建工具
```

## 开发

在仓库根目录运行检查:
```bash
make setup
make test
make lint
make typecheck
make coverage
```

Python 目录工具是一个嵌套的 uv 项目,锁文件位于
`scripts/catalog/uv.lock`。Go FSRS 调度器是位于 `scripts/fsrs` 的嵌套 Go 模块。

确定性的生命周期冒烟测试会创建一个临时学习工作区,
写入一节课、添加一张 FSRS 卡片、记录一次暂停状态,并验证另一个
智能体可以凭 `.study-config.json` 恢复会话:

```bash
scripts/e2e/study-lifecycle-smoke.sh
```

## 来源与许可

- 上游仓库:[mordor-forge/study-skill](https://github.com/mordor-forge/study-skill),MIT 许可证。
- 原文为英文,本包已译为简体中文;代码与配置文件保持原样。
- 上游仓库的 CI 配置(`.github/`、`.pre-commit-config.yaml` 等)未收录。

Files in this skill

  • .gitignore246 B
  • Makefile1.6 KB
  • SKILL.md20.9 KB
  • docs/adr/0001-repository-structure.md854 B
  • docs/adr/0002-workspace-independent-fsrs.md692 B
  • docs/adr/0003-catalog-extension-normalization.md736 B
  • docs/adr/template.md312 B
  • pyrightconfig.json187 B
  • references/agent-adapters.md5 KB
  • references/difficulty-adaptation.md5.8 KB
  • references/fsrs-spaced-repetition.md3.8 KB
  • references/research-agents.md7.1 KB
  • references/template-resolution.md5.8 KB
  • references/visual-libraries.md7.3 KB
  • references/workspace-lifecycle.md3.8 KB
  • scripts/catalog/pyproject.toml763 B
  • scripts/catalog/src/catalog/__init__.py71 B
  • scripts/catalog/src/catalog/cli.py3 KB
  • scripts/catalog/src/catalog/converter.py4.9 KB
  • scripts/catalog/src/catalog/matcher.py2.4 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.