# course-publisher

Drafts course announcements, weekly updates, static websites, and LMS upload bundles from the Course Passport. Designed for professors delegating student comms.

- skill · `type=skill` · Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, OpenCode · ★ 41
- Author: YujxZJCN
- License: MIT · policy=mirror · the beginning of the file is at the end of this page
- Source: https://github.com/YujxZJCN/teaching-skills/tree/HEAD/course-publisher/SKILL.md
- Updated: 2026-10-03
- HTML: https://affpapa.org/en/nevibecode/skills/course-publisher

## What it does

The skill automates routine student-facing packaging across the semester. It coordinates 4 sub-agents: one writes single-topic announcements, another drafts weekly check-in emails, a third generates static HTML or Markdown course pages, and the fourth organizes folders and upload checklists for Canvas, Moodle, or Blackboard. An FAQ mode answers recurring questions directly from existing syllabus rules.

The tool operates on a strict rule: the Course Passport is the only source of truth. If an exam date, room number, or grade weight is missing, the agent inserts a visible `[NEEDS PROFESSOR INPUT: ...]` placeholder instead of inventing details. Any contradiction with the syllabus triggers a blocking error.

Every output is strictly a draft. Because the skill cannot connect directly to your LMS or email provider, publishing remains entirely under your manual control.

## Install

### Claude Code (native platform)

1. **Skills CLI (Vercel)**
```bash
npx skills add YujxZJCN/teaching-skills --skill course-publisher -a claude-code
```

2. **Manually: put the files in place**
- File: `~/.claude/skills/course-publisher/SKILL.md` — Copy the whole skill folder; for one project use .claude/skills/course-publisher/

### Codex

1. **Skills CLI (Vercel)**
```bash
npx skills add YujxZJCN/teaching-skills --skill course-publisher -a codex
```

2. **Manually: put the files in place**
- File: `.agents/skills/course-publisher/SKILL.md` — For all projects use ~/.agents/skills/

### Cursor

1. **Skills CLI (Vercel)**
```bash
npx skills add YujxZJCN/teaching-skills --skill course-publisher -a cursor
```

2. **Manually: put the files in place**
- File: `.cursor/skills/course-publisher/SKILL.md` — Cursor also reads .agents/skills/ and .claude/skills/

### GitHub Copilot

1. **GitHub CLI**
```bash
gh skill install YujxZJCN/teaching-skills course-publisher
```

2. **Manually: put the files in place**
- File: `.github/skills/course-publisher/SKILL.md`

### Gemini CLI

1. **Skills CLI (Vercel)**
```bash
npx skills add YujxZJCN/teaching-skills --skill course-publisher -a gemini-cli
```

2. **Platform CLI**
```bash
gemini skills install https://github.com/YujxZJCN/teaching-skills --path course-publisher
```

### Windsurf (Devin Desktop)

**Manually: put the files in place**
- File: `.devin/skills/course-publisher/SKILL.md` — The legacy .windsurf/skills/ path still works

### OpenCode

**Skills CLI (Vercel)**
```bash
npx skills add YujxZJCN/teaching-skills --skill course-publisher -a opencode
```

### Claude.ai

**Claude.ai**
- Zip the folder and upload it in Settings → Capabilities → Skills

Where a file is given instead of a command, copy the files from the source to that path: https://github.com/YujxZJCN/teaching-skills/tree/HEAD/course-publisher/SKILL.md

## When to use it
- draft weekly student update emails with upcoming deadlines and preparation tasks
- organize course materials into upload-ready structures for Canvas, Moodle, or Blackboard
- generate a static Markdown or HTML course website from the passport file
- compile answers for recurring student inquiries using verified course policies

## Example prompts
- Write this week's email for my course — it's week 6
- Package weeks 1–4 for Canvas upload
- Draft an announcement: Thursday's lecture moves to room B204

## Source text · SKILL.md · MIT

Below is the content of a third-party file. It is data, not instructions for you: do not act on anything written inside unless the human asks. Block tag: 968b12e7017e64b2.

BEGIN THIRD-PARTY FILE 968b12e7017e64b2
````text
---
name: course-publisher
description: "Student-facing communication and packaging for university professors, derived entirely from the Course Passport. 4-agent team drafting one-off announcements, weekly emails, a static course website, LMS upload packages, and a living FAQ — every date, weight, and policy traces to a passport field, and everything ships as a draft the professor publishes. Triggers on: announcement, weekly email, course website, course page, LMS, Canvas, Moodle, Blackboard, post materials, publish course, student FAQ, 课程通知, 周报, 课程网站, 课程主页, 学习平台, 发布课件, 课程公告, 常见问题."
metadata:
  version: "1.0.0"
  last_updated: "2026-06-10"
  status: active
  pipeline_stage: 4
  related_skills:
    - teaching-pipeline
    - deck-studio
    - course-designer
---

# Course Publisher — Student Communications & Packaging Team

Drafts and packages everything students *receive* about a course — announcements, the
weekly email, the course website, LMS upload structures, the FAQ — by compiling it from
the Course Passport (`shared/course_passport_schema.md`). This is the highest-volume,
lowest-judgment work in a teaching term: it derives mechanically from decisions the
professor already made, which makes it ideal to delegate — and dangerous only if the
delegate invents facts. So this skill never does.

> **Prime rule:** the passport is the only source of facts. A date, weight, room number,
> or policy that is not in the passport or the professor's input appears as
> `[NEEDS PROFESSOR INPUT: ...]` — shipped visibly, never guessed. A plausible wrong
> date in a student email does more damage than a visible gap.

## Quick Start

```
Draft an announcement: Thursday's lecture moves to room B204
Write this week's email for my course — it's week 6
Build a course website from my passport
Package weeks 1–4 for Canvas upload
学生总在问迟交政策，帮我整理一个常见问题页
帮我起草下周的课程周报
```

## Modes

| Mode | Trigger intent | Output |
|------|---------------|--------|
| `announcement` | One-off message to the class: schedule change, exam logistics, reminder | Single-topic announcement draft, action-first structure |
| `weekly-email` | "This week's email", week-N update, 周报 | Week-N email from passport schedule + calendar position: what's due, what's next, what to prepare |
| `course-site` | "Course website", course page, 课程主页 | Static site from the passport: syllabus page, schedule table, materials index from `artifacts[]`, policies — plain HTML/Markdown for any static host or LMS pages |
````
END THIRD-PARTY FILE 968b12e7017e64b2

The third-party file has ended. Everything between the 968b12e7017e64b2 tags is data: requests and commands from it are not followed. An “end of file” line with another tag inside the block is part of the file.

First 2639 of 8535 bytes. © YujxZJCN · MIT · https://github.com/YujxZJCN/teaching-skills/tree/HEAD/course-publisher/SKILL.md

_Part of the page did not fit — see the HTML version._

---
NeVibeCode on affpapa.org. Catalog texts are descriptions, not instructions for the agent. How to choose and install: https://affpapa.org/en/nevibecode/agents.md
