Grove turns Strata research artifacts into a complete learning curriculum: a structured course outline, lesson content, a flashcard deck, and assessments. Use when: converting research into a course, building lessons from a Strata project, creating a learning plan, making flashcards from research, or any prompt containing "make a course", "create lessons", "learning plan", "study this", "teach me", "flashcards for", "quiz me on", "curriculum", or "grove". The single entry point for all Grove curriculum generation.
Grove reads Strata research artifacts and produces a complete, structured curriculum that can be studied with or without an LLM.
/grove [topic-slug]
Strata artifacts → course map → lessons → flashcards → assessments
(your research) (outline) (content) (recall) (testing)
Look for the Strata project at research/[topic-slug]/.
Required files (all must exist and be non-empty):
03-synthesis/claims.md — the conclusions to teach03-synthesis/narrative.md — the explanatory prose02-analysis/themes.md — the module structurestate.json — phase must be completeIf any are missing or incomplete: tell the user which files need to be finished in Strata first. Do not proceed with incomplete research.
Check for an existing Grove project at curriculum/[topic-slug]/state.json:
Before generating anything, ask these three questions together:
Goal: What do you want to be able to do after completing this course? (understand broadly / apply practically / teach others / pass an exam)
Background: How familiar are you with this topic already? (complete beginner / some exposure / intermediate / deep expert in adjacent area)
Time: How much time can you commit per session? (15 min / 30 min / 1 hour / flexible)
Store answers in curriculum/[topic-slug]/learner.json. These drive:
Load .github/skills/grove-map/SKILL.md and follow its instructions.
This produces curriculum/[topic-slug]/course.json — the master outline.
Tell the user: "Course map created — N modules, N lessons. Review before continuing?" Show the module list and wait for confirmation.
Load .github/skills/grove-lessons/SKILL.md and follow its instructions.
Generate lessons one module at a time. After each module, checkpoint state.
Load .github/skills/grove-cards/SKILL.md and follow its instructions.
Produces curriculum/[topic-slug]/cards.json.
Load .github/skills/grove-assess/SKILL.md and follow its instructions.
Produces curriculum/[topic-slug]/assessments/ with one quiz per module.
After generating quizzes, create a short retention check for every module.
Write one file per module: curriculum/[topic-slug]/assessments/modcheck-[MID].json.
Each file must follow this schema:
{
"module": "M01",
"title": "[Module Title] — Quick Check",
"questions": [
{ "id": "MC01-1", "q": "...", "a": "..." },
{ "id": "MC01-2", "q": "...", "a": "..." },
{ "id": "MC01-3", "q": "...", "a": "..." }
]
}
Rules:
MC[module-num]-[question-num], e.g. MC01-2course.jsonquiz-*.jsonAfter all content is generated, run the bundler to produce a single v3 bundle:
node build-bundle.mjs [topic-slug]
The bundler reads course.json, all lesson .md files, cards.json,
assessments/, and the three v3 adaptive artifacts (if present), then writes
curriculum/[topic-slug]/bundle.json.
The v3 bundle shape:
{
"version": "3.0",
"slug": "[topic-slug]",
"bundled": "<ISO timestamp>",
"course": { /* course.json contents */ },
"learner": { /* learner.json contents */ },
"lessons": {
"L01": "# full markdown content of L01",
"L02": "# full markdown content of L02"
},
"cards": [ /* enriched cards (concepts, cognitive_level, weight, reviewable added) */ ],
"quizzes": {
"M01": { /* quiz-M01.json with enriched questions */ }
},
"modchecks": {
"M01": { /* modcheck-M01.json */ }
},
"concepts": { /* concepts.json contents — empty shell if file missing */ },
"adaptiveRules": { /* adaptive-rules.json — empty object if file missing */ },
"learningPaths": { /* learning-paths.json — {paths:[]} if file missing */ }
}
Also update (or create) curriculum/index.json — the bundler handles this automatically.
If the v3 adaptive artifacts are missing, generate them before running the bundler:
concepts.jsonCreate curriculum/[topic-slug]/concepts.json:
{
"slug": "[topic-slug]",
"concepts": [
{
"id": "concept-id",
"title": "Human-readable title",
"depends_on": ["other-concept-id"],
"introduced_in": ["L01"],
"reinforced_in": ["L03", "L05"],
"assessment_sources": ["M01"]
}
]
}
Derive one concept per distinct teaches_concepts entry across all lessons.
Use the concepts.schema.json in schemas/ for reference.
learning-paths.jsonCreate curriculum/[topic-slug]/learning-paths.json:
{
"slug": "[topic-slug]",
"generated": "YYYY-MM-DD",
"paths": [
{
"id": "default-path",
"title": "Complete Course",
"description": "All lessons in recommended order.",
"lessons": ["L01", "L02", "..."],
"focus_areas": []
}
]
}
Always include a default-path with all lessons. Add 1–3 tailored paths based on
the learner's stated goal (e.g. fast-track, teach-others, security-focus).
adaptive-rules.jsonCreate curriculum/[topic-slug]/adaptive-rules.json:
{
"slug": "[topic-slug]",
"progression_rules": {
"unlock_threshold": 0.75,
"remediation_trigger": { "consecutive_failures": 2 }
},
"review_policy": {
"intervals_days": [1, 3, 7, 14],
"max_daily_reviews": 20,
"decay_after_days": 21
},
"mastery_defaults": {
"core": 0.80,
"applied": 0.80,
"debate": 0.75,
"gap": 0.75
},
"remediation_policy": {
"suggest_lessons": true,
"suggest_flashcard_review": true
}
}
Every lesson in course.json must have:
prerequisites, teaches_concepts, reinforces_concepts, mastery_threshold,
difficulty (1–5), unlock_rule, review_after_days.
If any are missing, run the migration script first:
node scripts/migrate-course-v2-to-v3.mjs [topic-slug]
Update curriculum/[topic-slug]/state.json to phase: complete.
Show the completion summary:
Grove curriculum complete
────────────────────────────────────────
Topic: [topic]
Source: Strata project research/[slug]/
Learner: [goal] · [background] · [time/session]
Curriculum:
Modules: N
Lessons: N (avg N min each)
Flashcards: N cards
Assessments: N quizzes (N questions total)
Mod checks: N retention checks (3–5 questions each)
Concepts: N adaptive concepts
Paths: N learning paths
Files:
→ curriculum/[slug]/course.json
→ curriculum/[slug]/lessons/L01.md … L0N.md
→ curriculum/[slug]/cards.json
→ curriculum/[slug]/assessments/quiz-*.json
→ curriculum/[slug]/assessments/modcheck-*.json
→ curriculum/[slug]/learner.json
→ curriculum/[slug]/concepts.json ← adaptive concept graph
→ curriculum/[slug]/learning-paths.json ← learner paths
→ curriculum/[slug]/adaptive-rules.json ← progression rules
→ curriculum/[slug]/bundle.json ← single-file v3 app bundle
→ curriculum/index.json ← course registry
To study:
1. cd grove/
2. npx serve .
3. Open http://localhost:3000
4. Click "Load bundle.json" and select curriculum/[slug]/bundle.json
────────────────────────────────────────
curriculum/
├── index.json ← course registry (all courses)
└── [topic-slug]/
├── state.json ← Grove session state
├── learner.json ← learner profile
├── course.json ← master outline + learning plan (v3 lesson fields)
├── bundle.json ← single-file v3 bundle for the app
├── concepts.json ← adaptive concept graph (v3)
├── learning-paths.json ← learner path definitions (v3)
├── adaptive-rules.json ← progression + review rules (v3)
├── lessons/
│ ├── L01-[slug].md ← source markdown (also embedded in bundle)
│ └── L0N-[slug].md
├── cards.json ← full flashcard deck (also embedded in bundle)
└── assessments/
├── quiz-M01.json ← one full quiz per module (also embedded in bundle)
├── quiz-M0N.json
├── modcheck-M01.json ← 3–5 short retention Qs per module
└── modcheck-M0N.json