@datajaddah/course 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/README.md +31 -0
  2. package/bin/datajaddah-course.js +238 -0
  3. package/lib/init.js +375 -0
  4. package/lib/preview.js +1617 -0
  5. package/lib/repo-contract.js +1291 -0
  6. package/lib/slide-markdown.js +505 -0
  7. package/package.json +41 -0
  8. package/preview-dist/assets/index-CJUgarn8.css +1 -0
  9. package/preview-dist/assets/index-CavDNP3d.js +49 -0
  10. package/preview-dist/index.html +13 -0
  11. package/scaffold/.agents/rules/general.md +91 -0
  12. package/scaffold/.agents/skills/course-coding-exercises/SKILL.md +22 -0
  13. package/scaffold/.agents/skills/course-coding-exercises/references/coding-exercises.md +111 -0
  14. package/scaffold/.agents/skills/course-platform-overview/SKILL.md +36 -0
  15. package/scaffold/.agents/skills/course-platform-overview/references/platform-overview.md +105 -0
  16. package/scaffold/.agents/skills/course-quizzes/SKILL.md +23 -0
  17. package/scaffold/.agents/skills/course-quizzes/references/quizzes.md +121 -0
  18. package/scaffold/.agents/skills/course-repo-contract/SKILL.md +24 -0
  19. package/scaffold/.agents/skills/course-repo-contract/references/repo-contract.md +169 -0
  20. package/scaffold/.agents/skills/course-slides-v2/SKILL.md +28 -0
  21. package/scaffold/.agents/skills/course-slides-v2/references/fit-guidance.md +31 -0
  22. package/scaffold/.agents/skills/course-slides-v2/references/slides-v2.md +138 -0
  23. package/scaffold/.agents/skills/course-spreadsheet-labs/SKILL.md +23 -0
  24. package/scaffold/.agents/skills/course-spreadsheet-labs/references/spreadsheet-labs.md +239 -0
  25. package/scaffold/.agents/skills/course-video-lessons/SKILL.md +22 -0
  26. package/scaffold/.agents/skills/course-video-lessons/references/video-lessons.md +83 -0
@@ -0,0 +1,13 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>Datajaddah Course Preview</title>
7
+ <script type="module" crossorigin src="/assets/index-CavDNP3d.js"></script>
8
+ <link rel="stylesheet" crossorigin href="/assets/index-CJUgarn8.css">
9
+ </head>
10
+ <body>
11
+ <div id="root"></div>
12
+ </body>
13
+ </html>
@@ -0,0 +1,91 @@
1
+ # General Rules
2
+
3
+ ## Mission
4
+
5
+ - This repository exists to author one Datajaddah course.
6
+ - Keep the repository focused on course content, course metadata, assets, and `.agents`.
7
+ - Do not add application code, package manifests, build tooling, CI files, database files, or unrelated documentation.
8
+
9
+ ## Non-Goals
10
+
11
+ - Do not create or maintain `course.json` in this repository.
12
+ - Do not reintroduce legacy root files such as `AGENT.md` or `AI_AUTHORING.md`.
13
+ - Do not invent lesson kinds beyond `slides`, `video`, `quiz`, `coding_exercise`, and `spreadsheet_lab`.
14
+ - Do not add platform-only metadata that is not represented by the GitHub course contract.
15
+
16
+ ## Default Workflow
17
+
18
+ 1. Identify the smallest scope that satisfies the request:
19
+ - course metadata
20
+ - chapter or lesson structure
21
+ - slides v2
22
+ - video lesson
23
+ - quiz
24
+ - coding exercise
25
+ - spreadsheet lab
26
+ 2. Edit the minimum number of files needed.
27
+ 3. Preserve ordering, slugs, and folder layout unless the user explicitly asks to reorder or rename content.
28
+ 4. Keep learner-facing content in markdown bodies and supported frontmatter fields only.
29
+ 5. Validate with `npx @datajaddah/course validate .` before finishing.
30
+ 6. Use `npx @datajaddah/course preview .` when slide, video, quiz, or exercise rendering needs a visual check.
31
+
32
+ ## Repository Contract
33
+
34
+ - The repository uses the markdown-first `repo_tree_v1` contract.
35
+ - `course.md` is the root source of truth for course metadata and overview.
36
+ - `chapters/NN-slug/chapter.md` stores chapter metadata and chapter summary.
37
+ - `chapters/NN-slug/lessons/NN-slug/lesson.md` declares the lesson kind.
38
+ - Each lesson has exactly one supported resource location:
39
+ - `slides/NN-slug.md`
40
+ - `video.md`
41
+ - `quiz/quiz.md` and `quiz/questions/NN-slug.md`
42
+ - `exercise/exercise.md`, `starter.*`, `solution.*`
43
+ - `spreadsheet/exercise.md`, `workbook.json`, `solution.json`, `checks.json`
44
+ - Ordered folders and files must use contiguous `NN-slug` naming.
45
+
46
+ ## Platform Interpretation
47
+
48
+ - Slides authored from GitHub become slides v2 content in the platform.
49
+ - Slide markdown becomes HTML content; `@script` content becomes narration text.
50
+ - Slides can use the markdown slide DSL for `@layout`, `@column`, reveal attrs such as `{delay=2 highlight=2}`, and image slots like `slot:diagram-name`.
51
+ - Most explainer videos are produced later on the platform from slide decks plus narration audio.
52
+ - In the repo, author those explainer videos as `slides` with strong `@script` content.
53
+ - Slide audio, generated video, timing, and step markers are platform-owned and are not authored in this repo.
54
+ - Use `video.md` only for a real standalone external video URL that already exists or was explicitly requested.
55
+ - Never invent placeholder `video_url` values such as `example.com` or `replace-me`.
56
+ - Quiz prompts and choice bodies render as HTML in the platform.
57
+ - For quizzes, the learner-visible answer text comes from the choice body, not the choice title.
58
+ - Use `feedback` and `correct_feedback` for explanations; keep choice bodies as the actual answer options.
59
+ - A quiz becomes multi-select automatically when more than one choice is marked correct.
60
+ - Coding exercises must keep `## Context` and `## Instructions` as separate sections in `exercise/exercise.md`.
61
+ - Coding exercise `language` must be only `python` or `r`, and starter/solution files must match that language.
62
+ - Spreadsheet labs use a Univerjs-powered spreadsheet in the platform; the learner edits `workbook.json` data live and checks are evaluated as a requirements checklist.
63
+ - Spreadsheet lab exercises must keep `## Context` and `## Instructions` as separate sections in `spreadsheet/exercise.md`.
64
+
65
+ ## Content Quality
66
+
67
+ - Prefer incremental edits over broad rewrites.
68
+ - Keep course copy concise, explicit, and learner-facing.
69
+ - Keep learner-facing material anchored to the requested course subject and the current lesson objective.
70
+ - Make titles short enough to scan in course navigation.
71
+ - Write slides for presentation, quizzes for assessment, and exercises for hands-on practice.
72
+ - Keep slide text lighter than the spoken script; use reveal steps, columns, and planned image slots to structure the visual explanation.
73
+ - Treat repository structure, filenames, `.agents`, validation commands, sync behavior, and platform mechanics as authoring infrastructure. Do not turn them into slides, quiz questions, video notes, or exercises unless the user explicitly asks for a course about Datajaddah authoring.
74
+ - Avoid placeholders unless the user explicitly asks for scaffolding or examples.
75
+
76
+ ## Skills In This Repository
77
+
78
+ - Use `.agents/skills/course-platform-overview` for commands, sync behavior, and platform model knowledge.
79
+ - Use `.agents/skills/course-repo-contract` for structure, naming, and validation rules.
80
+ - Use `.agents/skills/course-slides-v2` for slide lessons.
81
+ - Use `.agents/skills/course-video-lessons` for video lessons.
82
+ - Use `.agents/skills/course-quizzes` for quizzes.
83
+ - Use `.agents/skills/course-coding-exercises` for coding exercises.
84
+ - Use `.agents/skills/course-spreadsheet-labs` for spreadsheet labs.
85
+
86
+ ## Done Criteria
87
+
88
+ - The repository still validates.
89
+ - The changed lesson kind and file layout match the contract.
90
+ - New content is placed in the correct ordered location.
91
+ - No unrelated files were introduced.
@@ -0,0 +1,22 @@
1
+ ---
2
+ name: course-coding-exercises
3
+ description: Author Datajaddah coding exercise lessons in a GitHub course repository. Use this skill when creating or editing coding exercise prompts, language metadata, starter files, solution files, or exercise structure.
4
+ ---
5
+
6
+ # Course Coding Exercises
7
+
8
+ Use this skill when the request is about hands-on coding exercises in the GitHub course repo.
9
+
10
+ ## Workflow
11
+
12
+ 1. Read `references/coding-exercises.md`.
13
+ 2. Ensure `lesson.md` declares `kind: coding_exercise`.
14
+ 3. Keep the prompt in `exercise/exercise.md` with explicit `## Context` and `## Instructions` sections.
15
+ 4. Keep code in exactly one `starter.*` file and one `solution.*` file, using only Python or R.
16
+ 5. Validate with `npx @datajaddah/course validate .`.
17
+
18
+ ## Boundaries
19
+
20
+ - Do not add hidden test files to the repo contract unless the platform contract is extended first.
21
+ - Keep the learner prompt in markdown and code in code files.
22
+ - Keep exercises aligned with the requested lesson topic, not repository mechanics or platform workflows.
@@ -0,0 +1,111 @@
1
+ # Coding Exercises
2
+
3
+ ## Files
4
+
5
+ Inside a coding exercise lesson:
6
+
7
+ ```text
8
+ lesson.md
9
+ exercise/
10
+ exercise.md
11
+ starter.py
12
+ solution.py
13
+ ```
14
+
15
+ `lesson.md` must contain:
16
+
17
+ ```md
18
+ ---
19
+ kind: coding_exercise
20
+ title: "Lesson Title"
21
+ ---
22
+ Optional lesson summary.
23
+ ```
24
+
25
+ `exercise/exercise.md` must contain:
26
+
27
+ ```md
28
+ ---
29
+ title: "Exercise Title"
30
+ language: "python"
31
+ ---
32
+ ## Context
33
+
34
+ Brief problem setup in markdown.
35
+
36
+ ## Instructions
37
+
38
+ Exact task in markdown.
39
+ ```
40
+
41
+ ## Required Constraints
42
+
43
+ - `language` is required.
44
+ - `language` must be `python` or `r`.
45
+ - `exercise.md` must contain `## Context` followed by `## Instructions`.
46
+ - The exercise directory must contain exactly one `starter.*` file.
47
+ - The exercise directory must contain exactly one `solution.*` file.
48
+ - `starter.*` and `solution.*` must use the same extension.
49
+
50
+ ## Supported Language To Extension Mapping
51
+
52
+ - `python` -> `.py`
53
+ - `r` -> `.r`
54
+
55
+ ## Platform Behavior
56
+
57
+ - The repo contract stores coding exercise context and instructions in explicit markdown sections.
58
+ - The platform stores those sections in separate `context_description` and `instructions` fields.
59
+ - Student code is executed through Judge0 and the platform can attach AI-generated feedback to submissions.
60
+ - The repo contract does not currently include test fixtures or hidden grader files.
61
+
62
+ ## Writing Guidance
63
+
64
+ - State the task in concrete, verifiable terms.
65
+ - Keep the function signature, entrypoint, or expected output explicit.
66
+ - Make the starter code compile or run in the declared language whenever practical.
67
+ - Keep the solution file correct, minimal, and aligned with the prompt.
68
+ - Prefer exercises that can be checked from code behavior, not subjective style.
69
+ - Keep the exercise on the requested lesson topic. Use repo-contract details only for file placement and validation.
70
+
71
+ ## Good Prompt Structure
72
+
73
+ 1. `## Context`
74
+ 2. `## Instructions`
75
+ 3. Constraints
76
+ 4. Edge cases
77
+ 5. What file the learner should edit
78
+
79
+ ## Example
80
+
81
+ ```md
82
+ ---
83
+ title: "Sum Values"
84
+ language: "python"
85
+ ---
86
+ ## Context
87
+
88
+ You are given a helper function that should add all values in a list.
89
+
90
+ ## Instructions
91
+
92
+ Implement `sum_values` in `starter.py`.
93
+
94
+ - Keep the function signature unchanged.
95
+ - Return `0` for an empty list.
96
+ - Compare your answer with `solution.py` after you finish.
97
+ ```
98
+
99
+ Starter example:
100
+
101
+ ```py
102
+ def sum_values(values: list[int]) -> int:
103
+ return 0
104
+ ```
105
+
106
+ Solution example:
107
+
108
+ ```py
109
+ def sum_values(values: list[int]) -> int:
110
+ return sum(values)
111
+ ```
@@ -0,0 +1,36 @@
1
+ ---
2
+ name: course-platform-overview
3
+ description: Datajaddah course platform overview for markdown-first GitHub course repositories. Use this skill when creating or editing a course repo, when a user asks how the platform interprets course files, what commands to run, how GitHub sync works, or how lessons map to platform resources.
4
+ ---
5
+
6
+ # Course Platform Overview
7
+
8
+ Use this skill before making broad course-authoring changes or when the request depends on platform behavior rather than a single resource type.
9
+
10
+ ## What this skill covers
11
+
12
+ - The markdown-first GitHub course contract
13
+ - The supported lesson/resource types
14
+ - Platform-owned versus repo-authored data
15
+ - Core authoring commands
16
+ - GitHub sync behavior and current limitations
17
+
18
+ ## Workflow
19
+
20
+ 1. Read `references/platform-overview.md`.
21
+ 2. If the task is about repository shape, also use `../course-repo-contract/SKILL.md`.
22
+ 3. If the task is resource-specific, use the matching skill:
23
+ - `../course-slides-v2/SKILL.md`
24
+ - `../course-video-lessons/SKILL.md`
25
+ - `../course-quizzes/SKILL.md`
26
+ - `../course-coding-exercises/SKILL.md`
27
+ 4. Validate with `npx @datajaddah/course validate .`.
28
+
29
+ ## Output Expectations
30
+
31
+ - Keep course repos markdown-first and course-only.
32
+ - Do not invent platform fields that are not represented in the repository contract.
33
+ - Use repository and platform details to shape files, not to choose learner-facing lesson topics.
34
+ - Do not copy `course.md`, `lesson.md`, `.agents`, validation commands, or sync behavior into course material unless the requested course is about Datajaddah authoring.
35
+ - When the user wants explainer video content and no external URL exists yet, author `slides` plus `@script` instead of a standalone `video.md`.
36
+ - Keep implementation notes inside `.agents`, not in learner-facing files.
@@ -0,0 +1,105 @@
1
+ # Platform Overview
2
+
3
+ ## Purpose
4
+
5
+ This repository format is the GitHub authoring contract for Datajaddah courses. The repository is not an application project. It is a structured content tree that the platform parses and syncs.
6
+
7
+ ## Scope Boundary
8
+
9
+ - Use this reference to decide file placement, commands, and platform-owned data.
10
+ - Treat these mechanics as authoring infrastructure, not learner curriculum.
11
+ - Do not turn repository or platform details into course content unless the course itself is about Datajaddah authoring.
12
+
13
+ ## Core Commands
14
+
15
+ - Initialize a new course repo: `npx @datajaddah/course init ./my-course`
16
+ - Validate a repo: `npx @datajaddah/course validate .`
17
+ - Preview a repo locally: `npx @datajaddah/course preview .`
18
+
19
+ Use `validate` as the default final check. Use `preview` when the request changes rendered learner content.
20
+
21
+ ## Supported Lesson Types
22
+
23
+ - `slides`
24
+ - `video`
25
+ - `quiz`
26
+ - `coding_exercise`
27
+
28
+ Every lesson maps to exactly one of those resource types.
29
+
30
+ ## How The Platform Interprets Repo Content
31
+
32
+ ### Course
33
+
34
+ - `course.md` becomes course title, description, duration, thumbnail, and tags.
35
+
36
+ ### Chapters
37
+
38
+ - Each ordered chapter folder becomes one chapter in the platform.
39
+ - `chapter.md` body becomes the chapter description.
40
+
41
+ ### Lessons
42
+
43
+ - Each ordered lesson folder becomes one lesson in the platform.
44
+ - `lesson.md` declares the kind.
45
+ - The lesson folder title and order drive course navigation.
46
+
47
+ ### Slides
48
+
49
+ - GitHub-authored slides become slides v2 content.
50
+ - Slide markdown is rendered to HTML.
51
+ - `@script` becomes slide narration text.
52
+ - Most course explainer videos are later rendered on the platform from slide content plus narration audio.
53
+ - In the repo, author those future videos as render-ready slides with strong `@script` blocks.
54
+ - Audio blobs, generated video, delay metadata, and step markers are not authored in the repo contract.
55
+
56
+ ### Video Lessons
57
+
58
+ - `video.md` is for standalone externally hosted videos, not the default explainer flow.
59
+ - `video.md` must provide a real external `video_url`.
60
+ - The platform stores that URL and renders it as the lesson video source.
61
+ - This contract does not represent uploaded binaries or slide-generated videos.
62
+ - Do not invent placeholder URLs such as `example.com` or `replace-me`.
63
+
64
+ ### Quizzes
65
+
66
+ - Quiz prompts and choices are authored in markdown and rendered to HTML.
67
+ - A question is treated as multi-select when more than one choice is marked correct.
68
+ - The repository contract stores content and correctness, not learner attempts.
69
+
70
+ ### Coding Exercises
71
+
72
+ - The repo stores coding exercise `## Context` and `## Instructions` sections plus starter and solution files.
73
+ - The platform stores those sections separately as `context_description` and `instructions`.
74
+ - Coding exercise `language` is restricted to `python` or `r`.
75
+
76
+ ## GitHub Sync Status
77
+
78
+ - Pull from GitHub: supported
79
+ - Push to GitHub: supported for non-destructive updates on the managed sync branch
80
+ - Reorders, moves, and deletes: still blocked in the managed sync flow
81
+
82
+ ## Platform-Owned Versus Repo-Owned
83
+
84
+ ### Repo-Owned
85
+
86
+ - Course, chapter, lesson titles and summaries
87
+ - Slide markdown and narration script
88
+ - Video title, URL, and notes
89
+ - Quiz prompt, choice bodies, correctness, and feedback
90
+ - Coding exercise context, instructions, language, starter code, and solution code
91
+
92
+ ### Platform-Owned
93
+
94
+ - Slide audio blobs
95
+ - Slide timing and step markers
96
+ - Generated slide videos
97
+ - Quiz attempts and learner progress
98
+ - Coding exercise submissions, execution output, and AI-generated feedback
99
+
100
+ ## Operational Guardrails
101
+
102
+ - Stay inside the documented lesson/resource formats.
103
+ - Avoid broad rewrites when the user asked for a small change.
104
+ - Keep new files ordered and contiguous.
105
+ - Run `npx @datajaddah/course validate .` after structural edits.
@@ -0,0 +1,23 @@
1
+ ---
2
+ name: course-quizzes
3
+ description: Author Datajaddah quiz lessons in a GitHub course repository. Use this skill when creating or editing quiz lessons, quiz descriptions, quiz questions, choice blocks, feedback, or correctness rules.
4
+ ---
5
+
6
+ # Course Quizzes
7
+
8
+ Use this skill when the request is about assessments in the GitHub course repo.
9
+
10
+ ## Workflow
11
+
12
+ 1. Read `references/quizzes.md`.
13
+ 2. Ensure `lesson.md` declares `kind: quiz`.
14
+ 3. Keep quiz metadata in `quiz/quiz.md`.
15
+ 4. Keep each question in its own ordered markdown file under `quiz/questions/`.
16
+ 5. Validate with `npx @datajaddah/course validate .`.
17
+
18
+ ## Boundaries
19
+
20
+ - Do not split one question across multiple files.
21
+ - Do not invent quiz metadata outside the documented frontmatter and choice-block format.
22
+ - Keep every question aligned with the lesson topic and learning objective.
23
+ - Treat repo or platform examples as format references only. Do not quiz learners on `course.md`, `lesson.md`, `.agents`, validation commands, or sync behavior unless the course is explicitly about Datajaddah authoring.
@@ -0,0 +1,121 @@
1
+ # Quizzes
2
+
3
+ ## Files
4
+
5
+ Inside a quiz lesson:
6
+
7
+ ```text
8
+ lesson.md
9
+ quiz/
10
+ quiz.md
11
+ questions/
12
+ 01-first-question.md
13
+ 02-second-question.md
14
+ ```
15
+
16
+ `lesson.md` must contain:
17
+
18
+ ```md
19
+ ---
20
+ kind: quiz
21
+ title: "Lesson Title"
22
+ ---
23
+ Optional lesson summary.
24
+ ```
25
+
26
+ `quiz/quiz.md` contains:
27
+
28
+ - optional `title` frontmatter
29
+ - markdown body for quiz description
30
+
31
+ ## Question File Format
32
+
33
+ Each question file supports:
34
+
35
+ - optional `title`
36
+ - optional `correct_feedback`
37
+ - optional `randomize_choices: true|false`
38
+
39
+ The question prompt is the markdown before the first `@choice` block.
40
+
41
+ Each choice must use this structure:
42
+
43
+ ```text
44
+ @choice
45
+ title: Choice label
46
+ correct: true
47
+ feedback: Optional feedback
48
+
49
+ Choice body markdown
50
+ @endchoice
51
+ ```
52
+
53
+ The platform imports the choice body as the learner-visible answer text.
54
+ Treat `title` as optional metadata or a plain-text fallback only.
55
+ Do not put the answer in `title` and an explanation in the body.
56
+ Put the actual answer in the body, and put explanations in `feedback` or `correct_feedback`.
57
+
58
+ ## Validation Rules
59
+
60
+ - Every question must include at least one `@choice` block.
61
+ - Every question must have at least one correct choice.
62
+ - Choice metadata must appear before the blank line in the block.
63
+ - All content after the first `@choice` must stay inside choice blocks.
64
+ - `randomize_choices` must be a boolean when present.
65
+
66
+ ## Platform Behavior
67
+
68
+ - Question prompt markdown becomes HTML.
69
+ - Choice body markdown becomes HTML.
70
+ - `correct_feedback` becomes the success message for a correct answer.
71
+ - A question becomes multi-select automatically when more than one choice is correct.
72
+ - Learner answers are checked against the exact set of correct choices.
73
+
74
+ ## Writing Guidance
75
+
76
+ - Ask one clear thing per question.
77
+ - Use distractors that are plausible but clearly wrong for someone who understands the concept.
78
+ - Keep feedback corrective and specific.
79
+ - Keep each choice body short and learner-facing. Use feedback for explanations, not the visible answer body.
80
+ - Avoid trick questions unless the user explicitly wants them.
81
+ - Prefer concrete behaviors from the lesson topic over vague theory.
82
+ - When the request is topical, keep every question and distractor inside that topic.
83
+ - Use repo or platform mechanics only when the course itself is about Datajaddah authoring.
84
+
85
+ ## Multiline Feedback
86
+
87
+ Use YAML block syntax when the feedback needs multiple lines:
88
+
89
+ ```text
90
+ feedback: |
91
+ First line.
92
+ Second line with more detail.
93
+ ```
94
+
95
+ ## Example
96
+
97
+ This example demonstrates the file shape only. Replace the prompt and choices with the actual lesson concept instead of copying the sample wording into the course.
98
+
99
+ ```md
100
+ ---
101
+ title: "Key Concept Check"
102
+ correct_feedback: "Correct. This option matches the concept taught in the lesson."
103
+ randomize_choices: false
104
+ ---
105
+ Which answer best matches the concept taught in this lesson?
106
+
107
+ @choice
108
+ title: The statement supported by the lesson content
109
+ correct: true
110
+
111
+ The statement supported by the lesson content
112
+ @endchoice
113
+
114
+ @choice
115
+ title: A plausible misconception
116
+ correct: false
117
+ feedback: Use a near-miss from the same topic so the learner feedback can correct the misunderstanding.
118
+
119
+ A plausible misconception
120
+ @endchoice
121
+ ```
@@ -0,0 +1,24 @@
1
+ ---
2
+ name: course-repo-contract
3
+ description: Repository structure and validation rules for Datajaddah GitHub course repositories. Use this skill when creating or reorganizing course.md, chapters, lessons, resource folders, filenames, frontmatter, or when fixing validation errors in a course repo.
4
+ ---
5
+
6
+ # Course Repo Contract
7
+
8
+ Use this skill when the task is about repository shape, filenames, frontmatter, or validation.
9
+
10
+ ## Workflow
11
+
12
+ 1. Read `references/repo-contract.md`.
13
+ 2. Edit the smallest structural surface that satisfies the request.
14
+ 3. Preserve contiguous ordering unless the user explicitly asks to reorder.
15
+ 4. Validate with `npx @datajaddah/course validate .`.
16
+
17
+ ## Scope
18
+
19
+ - `course.md`
20
+ - `chapters/`
21
+ - lesson folders and resource locations
22
+ - root `.agents` guidance files
23
+
24
+ For resource-specific authoring (slides, video, quizzes, coding exercises, spreadsheet labs), use the matching resource skill after applying the contract rules.