From cc-course
Start a Claude Code course module. Usage: /cc-course:start 1 (modules 1-5)
How this skill is triggered — by the user, by Claude, or both
Slash command
/cc-course:startThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Start module **$ARGUMENTS** of the Claude Code Developer Course.
Start module $ARGUMENTS of the Claude Code Developer Course.
progress.json to check learner stateBefore proceeding with any module, verify cclogviewer MCP is available:
# Check if binary exists
command -v cclogviewer-mcp &> /dev/null
If the binary is not found, display this message and stop:
The cclogviewer MCP server is required but not installed.
Run /cc-course:setup to install it automatically.
Or install manually:
1. Download from: https://github.com/SeleznovIvan/cclogviewer/releases
2. Or with Go 1.21+: go install github.com/SeleznovIvan/cclogviewer/cmd/cclogviewer-mcp@latest
3. Add to Claude: claude mcp add cclogviewer cclogviewer-mcp
If the binary exists, test that it responds to JSON-RPC:
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | cclogviewer-mcp 2>/dev/null | head -c 100
If this fails, warn but allow continuing with degraded session tracking.
On first /cc-course:start, create the student data directory structure:
PROGRESS DISCOVERY (works after
/clear):
Readthe file{cwd}/.claude/claude-course/progress.jsonwhere{cwd}is your current working directory — this is the student's project repo- If not found, run
Bash: git rev-parse --show-toplevelto get the git root, thenRead{git-root}/.claude/claude-course/progress.json- If neither exists (first time), use cwd as
student_repo(or git root if in a subdirectory)- If not in a git repo, ask the user for their repository path
NEVER read a
progress.jsonfrom any path containingplugins/orcache/— those are blank templates, not student data.
course_data_dir = f"{student_repo}/.claude/claude-course"
if not os.path.exists(course_data_dir):
initialize_student_data(student_repo)
Create the following structure in the student's repository:
{student-repo}/.claude/claude-course/
├── progress.json # Copy from plugin template and initialize
├── sessions/ # Empty directory for session exports
└── submissions/ # Empty directory for homework archives
Copy the template from the plugin's progress.json
Set initial student info:
{
"student": {
"name": null,
"role": null,
"repository": "{student-repo}",
"started_at": "{ISO timestamp}"
}
}
Ask the user for their name and role (if not already set)
Ask the user for their teaching mode (if not already set). Use AskUserQuestion with these options:
Question: "Choose your learning style:" Options:
Save the selection to student.teaching_mode in progress.json as "sensei", "coach", or "copilot".
Using Bash:
mkdir -p {student-repo}/.claude/claude-course/sessions
mkdir -p {student-repo}/.claude/claude-course/submissions
After initialization, always read/write progress from:
{student-repo}/.claude/claude-course/progress.json
NOT from the plugin's template progress.json.
On first start (when student.mcp_project_name is null), detect and save the MCP project name for reliable session tracking:
if progress["student"]["mcp_project_name"] is None:
detect_mcp_project_name(progress, student_repo)
Call MCP to list available projects:
mcp__cclogviewer__list_projects(sort_by="last_modified")
Match student's repository path to a project name:
student.repository path against project names/pathsSave matched name to progress.json:
{
"student": {
"mcp_project_name": "/Users/student/my-project"
}
}
Fallback: If MCP is unavailable or no match found, use the repository path:
progress["student"]["mcp_project_name"] = student_repo
After detection, always use mcp_project_name for MCP calls instead of auto-detecting from cwd:
project_name = progress["student"]["mcp_project_name"]
# Example: list sessions
mcp__cclogviewer__list_sessions(project=project_name, days=1, limit=1)
# Example: search logs
mcp__cclogviewer__search_logs(project=project_name, query="...")
This ensures consistent session tracking even if the student's working directory changes between sessions.
Before proceeding with the module start, check if the student's progress.json needs migration.
For the complete migration logic, see migration.md.
CURRENT_VERSION = "1.1" # Plugin's current schema version
def check_and_migrate(progress, progress_path):
"""Check schema version and run migrations if needed."""
student_version = progress.get("schema_version", "1.0")
if student_version == CURRENT_VERSION:
# Same version, no migration needed
return progress, None
if is_newer(student_version, CURRENT_VERSION):
# Student has newer version than plugin
return None, "plugin_outdated"
# Student has older version, run migrations
backup_path = create_backup(progress_path)
try:
progress, migrations_run = run_migrations(
progress,
from_version=student_version,
to_version=CURRENT_VERSION
)
save_progress(progress, progress_path)
return progress, migrations_run
except Exception as e:
return None, f"migration_failed: {e}"
result = check_and_migrate(progress, progress_path)
if result[1] == "plugin_outdated":
# Show warning
print(f"""
Warning: Your progress file uses schema v{student_version},
but this plugin only supports up to v{CURRENT_VERSION}.
Please update the plugin:
claude plugin update cc-course
""")
# Allow continuing but warn about potential issues
elif result[1] and result[1].startswith("migration_failed"):
# Show error and recovery options
print(f"""
Migration failed: {result[1]}
Your original progress has been backed up to:
{progress_path}.backup
Options:
1. Restore backup and try again
2. Report issue at https://github.com/SeleznovIvan/claude-code-course-plugin/issues
""")
return # Stop execution
elif result[1]: # migrations_run list
# Show success message
print(f"""
Welcome back! The course plugin has been updated.
Migrating your progress from v{student_version} to v{CURRENT_VERSION}...
""")
for migration in result[1]:
print(f"✓ Migration {migration}")
print("\nYour progress is preserved. Continuing...")
progress = result[0]
else:
# No migration needed
progress = result[0]
For students who started before versioning was added:
schema_version field is missing, treat as "1.0"schema_version field after migrationWhen this command is invoked:
Get current session ID using MCP cclogviewer:
mcp__cclogviewer__list_sessions(project=progress["student"]["mcp_project_name"], days=1, limit=1)
Create session record in progress.json:
{
"session_id": "<uuid>",
"started_at": "<ISO timestamp>",
"ended_at": null,
"tasks_completed": []
}
Update progress.json:
modules[module].sessionscurrent_session_idcurrent_modulecurrent_task to the first incomplete task in the module's tasks object (the first key with value false)status = "in_progress" if was "not_started"| Argument | Module | Directory |
|---|---|---|
| 1 | Foundations & Commands | 1-foundations-and-commands |
| 2 | Skills | 2-skills |
| 3 | Extensions | 3-extensions |
| 4 | Agents | 4-agents |
| 5 | Workflows | 5-workflows |
For the complete teaching methodology and instructor persona, read teaching.md.
Read lesson-modules/$ARGUMENTS-*/SCRIPT.md for the teaching script.
Follow each chapter in order, running verification after each section.
Update progress.json per progress-tracking.md.
If the requested module is locked:
Module $ARGUMENTS is locked. Complete Module [previous] first.
Run /cc-course:start [previous] to continue.
If the previous module has status in_progress (tasks may be done but validate wasn't run):
Module $ARGUMENTS requires Module [previous] to be validated first.
Run /cc-course:validate to check your work, then try again.
If the previous module is completed (validated) but has no submission (submission is null):
Use AskUserQuestion:
/cc-course:submit [previous], then stopIf $ARGUMENTS is not 1-5:
Invalid module number. Usage: /cc-course:start 1 (modules 1-5)
If cclogviewer MCP is not available:
npx claudepluginhub seleznovivan/claude-code-education --plugin cc-courseProvides personalized coding tutorials using your codebase examples, with learner profiling, progress tracking, spaced repetition, and quizzes via /teach-me /quiz-me.
Guides project-based programming instruction with modular curriculum, structured steps including goals/concepts/actions/verification/checkpoints, and strict code quality standards for runnable examples.
Builds a structured, topic-focused lesson from canonical Entire checkpoints when a developer asks to learn about a specific concept in the repo (e.g., auth, billing webhooks).