npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

nextcourse

v4.1.0

Published

An agent that designs courses — needs, positioning and learning outcomes first, then the Reveal.js deck and the full delivery pack (facilitator guide, workbook, rubric, assessment plan) derived from them.

Readme

NextCourse

一个先陪你设计课程,再把课件和整套交付包一起做出来的智能体。

License: MIT Node npm Dependencies: zero Output

English → · 在线看一门完整的 29 页课 ↗ · 在线看一套 8 份的交付包 ↗ · 主题展板 ↗


作为职业讲师,一年要交付几十场培训。真正花时间的从来不是讲台上那两小时,是备课:定位反复摇摆、 学习成果写成一句正确的废话、幻灯片改到半夜还是不像样。同一门课换个受众,又几乎从头再来一遍。

NextCourse 的大部分力气都花在幻灯片之前那一段: 课程定位、学习成果、知识架构。 那部分想通了,幻灯片只是顺手的事 —— 而且它是被大纲推导出来的,不是被套模板套出来的。

这不是一个 PPT 生成器

网上已经有太多把主题变成幻灯片的智能体和 skill 了。那是这件事里较小的一半, 也是 NextCourse 花力气最少的一半。

| | PPT 生成器 | NextCourse | |---|---|---| | 起点 | 「我已经想清楚了」 | 「我要设计一门课」 | | 输入 | 你写好的主题或提纲 | 一场对话,一次问一件事 | | 决定什么 | 排版 | 受众、成果、顺序 —— 然后才是排版 | | 教学设计 | 没有建模 | Bloom 分层成果、Merrill 第一性原理 | | 产物 | 一份课件 | 一份能审、能改、能进版本库的大纲,再由它推导出课件 |

PPT 生成器的前提是你已经知道这门课讲给谁、要让人学会什么、内容该怎么排。 可这恰恰是备课里最难、最耗时、也最容易糊弄过去的一段。

课程设计的判断仍然由你来做。它负责的是把这些判断一条条问清楚、记下来,然后严格地执行。

课程设计:一次问一件事

让 agent 帮你设计课程,nextcourse-design 就会接手。全程对话式,最后落成一份人能读、能改、 能进版本库的文件,而不是一个不透明的黑箱。

0 · 规格与需求诊断 —— 第一个问题是「这门课多长、什么场合」,因为它决定后面要问多少东西。 30 分钟的公开分享和一天的企业内训,需要的设计深度差一个量级,用同一套流程伺候两者, 不是把轻的搞重,就是把重的做浅(见下节「分档」)。 内训档还会追问一件很多人不问的事:本期明确不做什么——只问「要什么」不问「不要什么」, 课程一定会越做越胖。

1 · 定位 —— 受众是谁、在什么场景下用、为什么是这门课而不是别的。 它先问一两个问题就停下来等你,不会一口气吐出一整份方案让你被动接受。

2 · 学习成果 —— 3–5 条,每条用 Bloom 动词开头,并配一条成功标准。 这是整门课的地基,后面所有东西都从这里推导:

# course.meta.md
outcomes:
  - do:      "判断一项日常工作是否值得交给智能体"
    bloom:   analyze
    success: "对给定的 3 个工作场景说出该用聊天框、该用智能体、
              还是不该用 AI,并讲出理由"

do 是动词开头的可观察行为,bloom 是认知层级,success 是验收标准。 「让学员了解 AI 的应用」不是学习成果,是一句没法验收的话 —— 成果必须能写出考题。 三条成果如果全停在「记住 / 理解」,它会直接提醒你这门课可能太浅。 这是个质量闸门,不是建议。

3 · 知识架构 —— 拆模块,模块内部按 Hook → Concept → Demo → Practice → Takeaway (Merrill 第一性原理)排布,每个模块只留一句学员离场时说得出的话。

一条自己踩出来的规矩:骨架与案例分层

同一门课常常要讲给不同行业的人听。如果行业案例渗进了通用模块,换一次受众就等于重写一门课。 所以大纲里会写死一条约束:通用骨架的模块不许出现行业案例,案例集中在一个模块里 —— 换受众时只重写那一层。

分档:轻的保持轻,重的才上重装备

一门 60 分钟的公开分享,不需要柯氏评估、不需要考核量规、不需要学员手册。 硬套一整套企业内训的方法论,只会把工具变成负担。所以有三档:

| 档位 | 适用 | 产出 | |---|---|---| | S · 分享课(默认) | 30–90 分钟,公开课 / 内部分享 | course.meta.md + 课件 | | M · 内训课 | 半天 ~ 一天,企业内训 | +设计蓝图 +交付包 | | L · 培训项目 | 训练营 / 体系化项目 | +运营、TTT、实施路线图 |

nextcourse new <name> 不带参数就是 S 档,行为与升级前一字不差—— 这是硬约束,轻量场景不该为了别人的复杂度付费。要内训档加 --scale M。

企业内训:从大纲到交付包

真实的内训交付,课件只是其中一件。学员手册、练习数据包、评分量规、评估问卷、 行动承诺书——这些才是「这门课能不能落地」的分水岭。

nextcourse-delivery <课程名> 接着 nextcourse-design 往下做:教学互动设计、 柯氏评估方案(默认只做 L1 + L2,L3/L4 要先确认基线数据由谁提供)、内容开发计划。 然后一条命令交出整包:

nextcourse package <name> --render
package/
├── 1_facilitator-guide.md  讲师手册(逐模块讲授要点 / 活动指令 / 幻灯片备注)
├── 2_workbook.md           学员手册(练习任务 / 填写区 / 自检清单)
├── 3_rubric.md             考核量规(维度 × 等级,每格都是可观察行为)
├── 4_action-plan.md        学员 30 天行动承诺书
├── 5_assessment.md         评估方案(L1 问卷 + L2 考核)
├── 6_facilitation.md       教学设计(时间轴 / 分组 / 积分规则)
├── 7_alignment.md          对齐矩阵(由 check 生成)
├── 8_content-dev.md        内容开发计划(SME 访谈 / 案例库 / 脱敏规则 / 排期)
└── html/                   客户实际拿到的东西:双击即读,打印不掉样式,封面是 0_index.html

md 是源,HTML 是交付物 —— 和 deck.html 完全一样的心智模型:改内容一律改 md, 再重新渲染,HTML 永远不手改。渲染器是手写的受控子集(约 300 行), 因为这个项目零 npm 依赖是刻意的护城河,不会为了渲染 markdown 引一个包进来。

一个会报错的逆向设计

学习成果多写两个字段之后,「教了但不测、测了但没教」这件事就能被机器抓住:

outcomes:
  - id: LO3
    do:       "使用办公智能体完成一项真实工作任务"
    bloom:    apply
    success:  "成品无需返工可直接使用"
    module:   3                        # 在哪个模块教
    evidence: "结营作战包 A 项"          # 用什么证据判定达成

nextcourse check <name> 校验的不是样式,是教学逻辑:

  • 每条成果都有模块教到、有证据测到,缺一样就报错;
  • 蓝图的模块清单、大纲的页数、slides/ 的实际文件数三者对不上就报警;
  • Bloom 分布全落在「记住 / 理解」——警告这门课可能太浅;
  • 各模块时长之和超过声明总时长,直接报错;
  • 蓝图里写了教学活动的模块,幻灯片里必须有对应的活动指令页。

逆向设计(Backward Design)在多数课程里是句口号,因为没人查。这里它是个会报错的检查。

幻灯片:大纲定稿之后的事

nextcourse-slides <课程名>,中间有两道人审关卡 —— 因为内容问题在 plan 里改一行字, 在 HTML 里改要重排版。

  • 内容先过关。 先出逐页 slide-plan.md 交你审,确认了才开始写标记。不在错的内容上花排版时间。
  • 页型有语义。 每页先定它是 Hook、Concept、Demo、Practice 还是 Takeaway, 页型决定这页能用 24 个登记组件里的哪几个。
  • 机器能查的不留给眼睛。 行内样式、写死的色值、私自引入的 font-family、 没登记过的 class —— 五类违规直接让构建失败;再用无头 Chrome 逐页截图,检测内容有没有溢出屏幕。
  • 换视觉只改一行。 配色(8 套)与字体(8 套字体集)是独立的一层,换皮肤不动任何一页幻灯片。
  • 交付物是一个文件夹。 字体、脚本、图片、协议文本全打包在里面。 会议室网不通、客户电脑没装东西,双击也能开始讲。

为什么产出是 HTML 而不是 PPT

这一层是刻意选的,而且它是整个论证的另一半。

幻灯片写成 HTML,它才是AI Native 的产品:改一句话就只动那一句,全课换套配色只改一行, 每条排版规则都能被机器逐页检查 —— 上面那套 lint 和截图自查能存在,前提就是它是 HTML。 PPT 是个二进制包,模型只能隔着一层去猜,猜出来的既不够灵活,也没法被检查。

因为底座是 Reveal.js,投影真正需要的东西一样不少: 双屏讲师备注、PDF 导出、fragment 与转场、离线播放、方向键翻页、任意画幅比例。

代价是对习惯了 PPT 的讲师有一点学习成本:不再是拖文本框、调字号,而是把力气放回内容本身。 这笔交换还有一层更长远的理由:讲师的工作越来越多要经过 AI, 能被模型读取、比对、校验的文件格式才会产生复利。选 HTML 而不选 .pptx, 就是选择在一种你的工具真的能理解的格式里工作。不过讲师这一行,突破自己的舒适区应该已是家常便饭了。

发给学员:一份还是原样的 PDF

课件是 HTML,但课后发到学员手里的那一份,通常还是 PDF。一条命令, 一页一张幻灯片,配色、字体、版式与屏幕上完全一致:

nextcourse pdf <课程名>                       # → courses/<课程名>/pdf/deck.pdf
nextcourse pdf <课程名> --theme print-light   # 学员要打印到纸上的浅色版

别在浏览器里 Cmd+P。 reveal.js 自带一套「印在 A4 纸上」的打印样式:背景刷白、 正文 20pt 纯黑、装饰全隐藏。所有「打印出来跟课件完全不是一回事」都是它干的, 不是配色坏了。nextcourse pdf 绕开的正是这套样式 —— DOM 一个节点都不挪,只用 CSS 分页, 所以设计系统里那些 .slides > section 规则照常命中,纸上和屏幕上长得一样。

发出去的那一份通常还要两件事:

  • --theme print-light —— 一套按「纸」做的配色:底色压纯白、阴影全撤换成 1px 发丝线、 模块封面留白只剩标题、代码块翻成浅底深字。版式与字号一个像素不动,因为配色本来就是 独立的一层。它不要写进 course.meta.md 的 theme: —— 写了就等着在投影上讲一份白底课件。
  • <section> 上的 data-print="off" —— 现场演示页、客户敏感案例,凡是不该外发的页, 导出时整页摘掉。页码是 CSS 计数器,会自己连号;授课用的 deck 照常带着这一页。 真相只有一份,在 slides/ 里。

快速开始

需要 Node 20 或更高;截图自查那一步还需要本机装有 Chrome / Chromium / Edge。 NextCourse 自身零运行时依赖 —— 整套 CLI 只用 Node 内置模块。

装技能(Claude Code、Codex、Cursor、OpenCode、WorkBuddy 等七十多个 runtime 都吃同一份 Agent Skills 格式):

npx skills add skill-node/nextcourse

装引擎:

npm i -g nextcourse

四个技能就是 .claude/skills/ 下的四个普通目录,拷进你这套 runtime 放技能的地方,再装引擎即可:

git clone https://github.com/skill-node/nextcourse.git
cp -R nextcourse/.claude/skills/nextcourse* ~/.claude/skills/     # 目标目录按下表改
npm i -g nextcourse

| Runtime | 项目级 | 全局 | |---|---|---| | Claude Code | .claude/skills/ | ~/.claude/skills/ | | Codex | .agents/skills/ | ~/.codex/skills/ | | Cursor | .agents/skills/ | ~/.cursor/skills/ | | OpenCode | .agents/skills/ | ~/.config/opencode/skills/ |

技能本身只有提示词,真正干活的构建、校验、打包由 nextcourse 命令完成,两样都要装。 不想全局装引擎的,把命令换成 npx -y nextcourse <子命令> 一样能用。更多细节见 .claude/skills/README.md;装完跑一次 nextcourse doctor 复核,它会把课程将落在哪个目录报出来。

然后直接跟你的 agent 说话就行 —— 「帮我设计一门半天的 X 工作坊」。装好的四个技能, agent 会自己挑:

| 技能 | 干什么 | |---|---| | nextcourse | 总控台 —— 判断你卡在哪一环,路由到下面三个 | | nextcourse-design | 规格 → 定位 → 学习成果 → 整体设计 → 模块架构 | | nextcourse-delivery | 内训档:教学互动 → 评估方案 → 内容开发计划 → 交付包 | | nextcourse-slides | 内容计划 → 人审 → 幻灯片 → deck |

课程落在你当前所在的目录下 —— ./courses/<课程名>/。所以开工前先 cd 到你想放 课程的地方。想固定到一处就设 NEXTCOURSE_HOME。

CLI 你也可以直接用:

nextcourse doctor                 # 自检:Node / 引擎资产 / Chrome / 工作目录
nextcourse render <name>          # lint + 构建 deck.html(推荐)
nextcourse check  <name>          # 教学设计闭环校验(成果 × 模块 × 证据)
nextcourse package <name> --render        # 生成交付包 md + 客户 HTML(M/L 档)
nextcourse pdf    <name>          # 导出 PDF(一页一张幻灯片,配色版式原样保留)
                                  #   --theme print-light 出学员可打印的浅色版
nextcourse shot   <name>          # 溢出检测 + 逐页截图自查
nextcourse export <name> --with-package   # 打包为可离线演示文件夹
nextcourse docs   design-system   # 打印内置的组件参考

nextcourse 不带参数会列出全部命令,完整参考见 CLI_MANUAL.md。

npx -y nextcourse <命令> 效果一样 —— nextcourse 不在 PATH 上时,技能会自动退到这条路。

git clone https://github.com/skill-node/nextcourse.git
cd nextcourse
node nextcourse.js render <name>

在仓库根目录里跑,工作目录就是仓库根,课程照样待在 nextcourse/courses/, 跟 v4 之前一模一样。

跑一遍自带的示例课

examples/ 里带了同一个主题的两档样例,正好用来看分档到底差在哪:

| 样例 | 档位 | 内容 | |---|---|---| | ai-agent-insurance | S · 分享课 | 60 分钟,29 页,就是在线 demo 那一门 | | ai-agent-insurance-workshop | M · 内训课 | 1 天,31 页,另有设计蓝图 + 完整交付包,就是在线 demo 那一套 |

两门课的案例素材都已全部替换为虚构示例。拷进工作区跑一遍:

mkdir -p courses && cp -R "$(npm root -g)/nextcourse/examples/ai-agent-insurance-workshop" courses/
nextcourse check   ai-agent-insurance-workshop   # 教学设计闭环:0 error 0 warning
nextcourse render  ai-agent-insurance-workshop   # lint + 构建课件
nextcourse package ai-agent-insurance-workshop --render   # 交付包 HTML

建议先读 course.blueprint.md 和 course.meta.md —— 这个项目真正讲的是那两个文件,不是那份课件。 交付包里的 7_alignment.md(对齐矩阵)值得单独看一眼:成果 × 模块 × 活动 × 证据,一张表看完这门课的闭环。

仓库结构

nextcourse/
├── AGENTS.md                    ← agent 路牌:怎么装、然后该读哪一份
├── AGENT.md                     ← 完整文档(所有 Agent 入口)
├── CLI_MANUAL.md                ← CLI 操作手册(完整命令参考)
├── DESIGN-SYSTEM.md             ← 组件参考手册(24 个组件)
├── nextcourse.js                ← 统一 CLI 入口
├── build.js                     ← 课程组装
├── check.js                     ← 教学设计闭环校验
├── package.js                   ← 交付包生成
├── render-md.js                 ← 受控子集 md → html 渲染器(零依赖)
├── lint-slides.js               ← 样式闸(5 类违规检测)
├── animate-slides.js            ← 入场动画批量打入 / 剥离
├── export.js                    ← 离线打包
├── shot.js                      ← 溢出检测 + 逐页截图
├── templates/                   ← deck.html 母版 + 设计蓝图模板(M/L 档)
├── shared_styles/               ← 设计系统(8 套配色 · 8 套字体集 · 组件库)
├── lib/                         ← Reveal.js + 网络字体(vendored,离线可用)
├── .claude/skills/
│   ├── nextcourse/              ← 总控台:分诊与路由
│   ├── nextcourse-design/       ← + references/(Bloom、柯氏、输出模板)
│   ├── nextcourse-delivery/     ← + references/(柯氏、教学手法、内容开发)
│   └── nextcourse-slides/       ← + references/(组件选型)
├── examples/                    ← 自带示例课程
└── courses/                     ← 你的课程(gitignore)

语言

智能体跟随你的语言:用英文提问,整场对话、大纲和幻灯片都会是英文。

文档不对称,装作没这回事不诚实:

| 文档 | 语言 | |---|---| | README.md / README.zh-CN.md | 英文 + 中文 | | CLI_MANUAL.md | 中文,另有英文版 CLI_MANUAL.en.md | | AGENT.md、DESIGN-SYSTEM.md | 仅中文(约 1300 行,全译是另一个量级的工程) | | .claude/skills/*/SKILL.md | 中文提示词 —— 但里面明确要求智能体用用户的语言回话 |

一个已知的粗糙处:lint 的密度警告(标题 ≤15 字、列表条目 ≤20 字)是按中日韩全角字校准的, 在英文幻灯片上会误报。它只是警告,永远不会让构建失败,但在改成按书写系统区分之前会有噪音。

协议

MIT,见 LICENSE。随便用、随便 fork、用它备课、拿它做的培训去收费都可以。

NextCourse 为了让导出的课件能离线播放,打包了 Reveal.js、Font Awesome Free 和七套网络字体。 这些有各自的协议(MIT · CC BY 4.0 · SIL OFL 1.1),全部列在 THIRD-PARTY-NOTICES.md 里,并且会被拷进每一个导出文件夹。

状态

这个工具没有商业化打算。它在真实交付里每周被改, 开源是因为:如果你也靠讲课吃饭,它应该用得上。欢迎提 issue 和 fork,但不承诺 roadmap。

作者 Kurtlee —— 20 年 HR 总监,亲手把 AI 写成产品。更多见 nextskill.cc。