A BMad-Method-powered, multi-agent AI assistant for structured course development with LiaScript
Teaching-Agent helps educators design, structure, and author complete courses through guided, iterative workflows β from initial concept to published, interactive materials. It coordinates four specialized agents (teaching, visual design, learner review, and publishing) around a single project file, journal.md, that holds the entire course state.
It is editor-agnostic: the same specs build into configurations for Claude Code, GitHub Copilot, OpenAI Codex, Cursor, Windsurf, and any web chat.
- How It Works
- The Four Agents
journal.mdβ the Single Source of Truth- The Workflow
- Installation
- Usage
- Commands Reference
- Project Structure
- Example Session
- License
Teaching-Agent follows Spec-Driven Development: you define what the course should achieve before writing any content.
- Define first, write later β start with learning objectives, audience, and scope
- Design didactics deliberately β choose teaching methods, style, and persona before materials
- Plan the structure β build a complete agenda with clear per-session goals
- Create iteratively β develop materials session-by-session, with validation gates at each step
The result is consistency, traceability, and quality across the whole course. This implements the BMad Method (Behavior-Model-Agnostic Design): defined personas, task-driven workflows, template-based outputs, and built-in validation.
Learn more:
- BMad-Method Framework β the core methodology
specs/β the complete technical specification (agents, tasks, templates, workflow)
The Teaching-Agent is the coordinator. It knows when to hand off to the other three via :agent {name}. Each agent has its own persona and command set, but they all read and write the same journal.md.
| Agent | Icon | Role | Activate with |
|---|---|---|---|
| Teaching | π | Pedagogical structure & content (default) | active on start |
| Artist | π¨ | Visual identity, logos, image prompts | :agent artist |
| Learner | π§βπ | Persona-based, learner-perspective review | :agent learner |
| Development | π οΈ | Git, publishing, GitHub Pages | :agent development |
The Teaching-Agent proactively suggests a handoff at the right moments β e.g. :agent artist after didactics are done, :agent learner after a session is validated, or :agent development once the course passes validation.
All planning, state, reviews, and notes live in one file: journal.md. It is itself a valid LiaScript document, so the project state is also a viewable course outline. Only final teaching materials (materials/), visual assets (assets/), and publishing files (project.yaml, .github/workflows/) stay separate.
journal.md is divided into fixed sections, each owned by a task:
| Section | Filled by | Contents |
|---|---|---|
## Dashboard |
:update-dashboard (auto) |
Derived progress overview |
## Course Context |
:init-course |
Course type, terminology, conventions |
## Outline |
:create-outline |
Title, audience, learning objectives |
## Didactics |
:create-didactics |
Teaching concept, persona, difficulty |
## Visual Identity |
:create-visuals |
Colors, logo & image style |
## Templates |
:manage-templates |
LiaScript template imports & usage |
## Agenda |
:create-agenda |
Session structure |
## Sessions |
:create-session β¦ |
Per-session skeletons, validation & persona reviews |
## Agents |
:configure-agent, :create-learner-persona |
Agent customizations, learner personas |
## Validation |
:validate-course |
Latest validation summary (publishing gate) |
## Analysis Status |
:analyze-existing |
Gap analysis for existing courses |
## Notes Backup |
:save-notes, :save-decision |
Summaries, research, decision records |
flowchart TD
INIT["**INIT** Β· :init-course<br/>β Course Context"]
OUTLINE["**FOUNDATION** Β· :create-outline<br/>β Outline"]
DID["**DIDACTICS** Β· :create-didactics<br/>β Didactics"]
PERSONA["π§βπ :create-learner-persona<br/>(optional)"]
VIS["π¨ :create-visuals Β· :create-logo<br/>β Visual Identity"]
AGENDA["**PLANNING** Β· :create-agenda<br/>β Agenda"]
DEV["**SESSIONS** (iterative or batch)<br/>:create-session β :promote-session<br/>:coauthor-materials β :validate-course<br/>π§βπ :review-as-persona (optional)"]
VAL["**VALIDATION** Β· :validate-course<br/>β Validation (PASS / FAIL gate)"]
PUB["π οΈ :create-project Β· :manage-git<br/>(optional, gated on PASS)"]
BUNDLE["**BUNDLE** Β· :assemble-bundle<br/>β course-bundle/"]
INIT --> OUTLINE --> DID --> VIS --> AGENDA --> DEV --> VAL
DID -.->|optional| PERSONA -.-> VIS
VAL -->|PASS| PUB
VAL -->|PASS| BUNDLE
INIT -.->|improve-existing| ANALYZE[":analyze-existing"] -.-> DEV
style INIT fill:#0B6E75,color:#fff
style BUNDLE fill:#FF8C42,color:#fff
style VIS fill:#6B4E9B,color:#fff
style PERSONA fill:#6B4E9B,color:#fff
style PUB fill:#2E7D32,color:#fff
:init-course first asks for a course type, which sets terminology, persona, pacing, and whether an agenda is required:
| Type | Terminology | Persona | Agenda |
|---|---|---|---|
lecture-series |
session / lecture | professor | required |
self-paced |
unit / module | coach | optional |
workshop |
block / activity | facilitator | required |
single-lesson |
lesson | tutor | optional |
improve-existing |
(from existing) | (from existing) | runs :analyze-existing |
- Iterative β fully develop one session (create β promote β coauthor β validate β review), then move to the next. Focused.
- Batch β create all skeletons, then promote all, then coauthor all. Overview-first.
If you already know what you want, :scaffold replaces :init-course β :create-outline β :create-didactics β :create-agenda β :create-session with a single intake interview followed by automatic generation of the whole structure. Co-authoring stays interactive afterward.
Publishing (:create-project, :update-project) and bundling (:assemble-bundle) are blocked until :validate-course records Mode: course + Result: PASS in ## Validation. This keeps half-finished courses from being shipped.
git clone <your-repo-url> teaching-agent
cd teaching-agentThe source of truth lives in specs/. The build script renders it into the right format for each environment:
# Requires Python 3 (+ PyYAML for the navigation targets)
pip install pyyaml
python specs/build.py # build all targets
python specs/build.py claude # only Claude Code β CLAUDE.md
python specs/build.py copilot # only Copilot β .github/copilot-instructions.md
python specs/build.py nav # all "navigation" editors (claude, codex, cursor, windsurf)
python specs/build.py bundle # all "bundle" targets (copilot, web)| Target | Output file | Environment |
|---|---|---|
claude |
CLAUDE.md |
Claude Code CLI |
copilot |
.github/copilot-instructions.md |
GitHub Copilot (VS Code / Web) |
codex |
.codex/AGENTS.md |
OpenAI Codex CLI |
cursor |
.cursor/rules/agent.md |
Cursor IDE |
windsurf |
.windsurfrules |
Windsurf IDE |
web |
dist/web-bundle.md |
Web chat (paste manually) |
There are two build modes:
- Navigation (
claude,codex,cursor,windsurf): a lightweight pointer file. The agent reads each task file fromspecs/on demand β keeps context small. - Bundle (
copilot,web): one self-contained Markdown with all specs inlined, for environments without filesystem access. Pastedist/web-bundle.mdinto any chat.
The generated files are committed, so for the supported editors you can often skip the build and just open the project.
Open the project β CLAUDE.md is picked up automatically. Then issue commands directly:
:help
:init-course
.github/copilot-instructions.md is loaded automatically. In Copilot Chat:
:help
:scaffold
Open the project; the respective rules file (.cursor/rules/agent.md, .windsurfrules, .codex/AGENTS.md) is read at startup. Issue the same : commands.
Paste the contents of dist/web-bundle.md as the first message, then start with :help.
In every environment the agent introduces itself, reads journal.md if it exists, and tells you which step comes next.
| Command | Purpose |
|---|---|
:init-course |
Initialize project; choose course type; create Course Context |
:scaffold {course-type?} |
Fast-track: one interview β full structure |
:analyze-existing |
Scan an existing course and fill gaps (improve-existing) |
:create-outline |
Title, audience, 3β5 learning objectives |
:create-didactics |
Teaching concept, instructor persona, difficulty |
:create-learner-persona {name?} |
Build an evidence-based learner persona |
:create-agenda |
Structure sessions / modules |
:manage-templates {name?} |
Add & document LiaScript template imports |
:update-dashboard |
Regenerate the derived ## Dashboard |
:create-session {n} {type} {title?} |
Create a session skeleton |
:promote-session {n} {type} |
Expand skeleton into materials/{n}-{type}.md |
:coauthor-materials |
Interactive content co-authoring in persona |
:quick-fix {n} {type} {description} |
Targeted single-issue correction |
:validate-course [{n} {type}] |
Full course check, or single-session check |
:assemble-bundle |
Package everything into course-bundle/ |
:save-notes {type?} {title?} |
Save a summary / research / decision note |
:save-decision {title} |
Save a structured decision record (ADR) |
:configure-agent {agent} |
Customize an agent's behavior in journal.md |
:agent {character} Β· :list-agents |
Switch persona Β· list available agents |
:help Β· :exit |
Show actions Β· leave persona |
| Command | Purpose |
|---|---|
:create-visuals |
Define colors, logo & image style β Visual Identity |
:create-logo |
Generate a detailed logo prompt |
:create-image {description} |
Create an image prompt on demand |
| Command | Purpose |
|---|---|
:review-as-persona {name} {n} {type} |
Review a material as a specific learner persona |
:list-learners |
List defined learner personas |
| Command | Purpose |
|---|---|
:manage-git |
Stage, commit, push, diff, resolve conflicts |
:create-project |
Generate project.yaml + GitHub Pages workflow |
:update-project |
Update publishing config & redeploy |
specs/
main.md β web-bundle header
build.py β config generator (run this to (re)build)
project.yaml β example LiaScript publishing config
agents/ β agent personas (teaching, artist, learner, development)
tasks/ β one task definition per command
templates/ β YAML templates for journal.md sections
checklists/ β quality checks (used by :validate-course)
data/ β LiaScript cheat-sheet & workflow reference
workflows/ β course-development.yaml (the master workflow)
journal.md β project state (single source of truth)
materials/ β generated LiaScript course materials
assets/ β generated visual assets & prompts
CLAUDE.md β generated: Claude Code config
.github/copilot-instructions.md β generated: Copilot config
.codex/AGENTS.md β generated: Codex config
.cursor/rules/agent.md β generated: Cursor config
.windsurfrules β generated: Windsurf config
dist/web-bundle.md β generated: paste-anywhere bundle
:init-course
β Choose "lecture-series", title "Databases Unlocked",
audience "CS undergraduates (3rdβ5th semester)", language de, Sie-form
:create-outline
β 5 learning objectives, abstract on database paradigms
:create-didactics
β Persona: "practical professor, hands-on, browser-based examples"
:agent artist β :create-visuals
β Teal/orange palette, consistent course image style
:agent teaching β :create-agenda
β Blocks: file formats β key-value β document β relational SQL
:create-session 1 lecture "Data & Serialization"
:promote-session 1 lecture
:coauthor-materials
β Add interactive DuckDB-Wasm examples and a quiz
:validate-course 1 lecture
:agent learner β :review-as-persona alex 1 lecture
β Check cognitive load and assumed prior knowledge
:agent teaching β :validate-course # full course β PASS
:agent development β :create-project # publish to GitHub Pages
:assemble-bundle # distributable package
Boost Software License 1.0 β a permissive license allowing free use, modification, and distribution.
Ready to build your course? Start with:
:help