@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,169 @@
1
+ # Repository Contract
2
+
3
+ ## Top-Level Shape
4
+
5
+ ```text
6
+ .agents/
7
+ rules/
8
+ general.md
9
+ skills/
10
+ course-platform-overview/
11
+ course-repo-contract/
12
+ course-slides-v2/
13
+ course-video-lessons/
14
+ course-quizzes/
15
+ course-coding-exercises/
16
+ course-spreadsheet-labs/
17
+ course.md
18
+ chapters/
19
+ 01-intro/
20
+ chapter.md
21
+ lessons/
22
+ 01-welcome/
23
+ lesson.md
24
+ slides/
25
+ 01-cover.md
26
+ assets/
27
+ ```
28
+
29
+ ## Naming Rules
30
+
31
+ - Ordered folders and files must use `NN-slug` names.
32
+ - Ordering must be contiguous inside each folder.
33
+ - Examples:
34
+ - `01-intro`
35
+ - `02-data-cleaning`
36
+ - `01-cover.md`
37
+ - `03-checkpoint-quiz`
38
+
39
+ ## Root Files
40
+
41
+ ### `course.md`
42
+
43
+ Required frontmatter:
44
+
45
+ - `schema_version: 1`
46
+ - `title`
47
+
48
+ Optional frontmatter:
49
+
50
+ - `duration`
51
+ - `tags`
52
+ - `thumbnail`
53
+
54
+ Body:
55
+
56
+ - course overview markdown
57
+
58
+ ### `.agents/rules/general.md`
59
+
60
+ - repository-local guidance for the AI working in this course repo
61
+
62
+ ### `.agents/skills/*`
63
+
64
+ - detailed skill docs for resource-specific authoring
65
+
66
+ ## Chapter Contract
67
+
68
+ Each chapter folder must contain:
69
+
70
+ - `chapter.md`
71
+ - `lessons/`
72
+
73
+ `chapter.md` supports:
74
+
75
+ - optional `title` frontmatter
76
+ - markdown body for chapter summary
77
+
78
+ ## Lesson Contract
79
+
80
+ Each lesson folder must contain:
81
+
82
+ - `lesson.md`
83
+ - exactly one resource location matching `lesson.md` frontmatter `kind`
84
+
85
+ Allowed lesson kinds:
86
+
87
+ - `slides`
88
+ - `video`
89
+ - `quiz`
90
+ - `coding_exercise`
91
+ - `spreadsheet_lab`
92
+
93
+ `lesson.md` supports:
94
+
95
+ - required `kind`
96
+ - optional `title`
97
+ - markdown body for lesson summary
98
+
99
+ ## Resource Locations
100
+
101
+ ### Slides
102
+
103
+ - `slides/NN-slug.md`
104
+
105
+ ### Video
106
+
107
+ - `video.md`
108
+ - Use this only for standalone external videos with a real `video_url`.
109
+ - Placeholder URLs such as `example.com` or `replace-me` are invalid.
110
+
111
+ ### Quiz
112
+
113
+ - `quiz/quiz.md`
114
+ - `quiz/questions/NN-slug.md`
115
+
116
+ ### Coding Exercise
117
+
118
+ - `exercise/exercise.md`
119
+ - exactly one `starter.*`
120
+ - exactly one `solution.*`
121
+ - `exercise.md` must contain `## Context` followed by `## Instructions`
122
+ - coding exercise `language` must be `python` or `r`
123
+
124
+ ### Spreadsheet Lab
125
+
126
+ - `spreadsheet/exercise.md`
127
+ - `spreadsheet/workbook.json`
128
+ - `spreadsheet/solution.json`
129
+ - `spreadsheet/checks.json`
130
+ - `exercise.md` must contain `## Context` followed by `## Instructions`
131
+ - `engine` is optional (defaults to `univer`)
132
+
133
+ ## Validation Rules That Commonly Fail
134
+
135
+ - missing required files
136
+ - non-contiguous ordering
137
+ - unsupported lesson `kind`
138
+ - invalid frontmatter types
139
+ - malformed quiz `@choice` blocks
140
+ - quiz with no correct choice
141
+ - slide with broken `@script` block
142
+ - coding exercise missing `starter.*` or `solution.*`
143
+ - coding exercise missing `## Context` or `## Instructions`
144
+ - coding exercise language and file extension mismatch
145
+ - spreadsheet lab missing `workbook.json`, `solution.json`, or `checks.json`
146
+ - spreadsheet checks with invalid type or missing required fields
147
+ - spreadsheet `exercise.md` missing `## Context` or `## Instructions`
148
+
149
+ ## Safe Editing Patterns
150
+
151
+ - Rename or reorder only when the user explicitly asks.
152
+ - When adding a new chapter or lesson, insert it with the next contiguous number.
153
+ - Prefer updating existing files over creating alternative parallel files.
154
+ - Keep learner content in markdown bodies, not in extra metadata fields.
155
+ - Treat repository contract examples as authoring mechanics only. Keep learner-facing content on the requested course topic unless the user explicitly asks for repository-authoring instruction.
156
+
157
+ ## Final Check
158
+
159
+ Run:
160
+
161
+ ```bash
162
+ npx @datajaddah/course validate .
163
+ ```
164
+
165
+ If the change affects learner-facing rendering, also run:
166
+
167
+ ```bash
168
+ npx @datajaddah/course preview .
169
+ ```
@@ -0,0 +1,28 @@
1
+ ---
2
+ name: course-slides-v2
3
+ description: Author Datajaddah slides v2 lessons in a GitHub course repository. Use this skill when creating or editing slide lessons, slide decks, slide markdown, or narration scripts. This skill assumes the markdown-first repo contract and only the slides v2 model, not legacy slides v1 layouts.
4
+ ---
5
+
6
+ # Course Slides V2
7
+
8
+ Use this skill when the request is specifically about slide lessons, or when the lesson should later become a platform-rendered explainer video based on slides and narration.
9
+
10
+ ## Workflow
11
+
12
+ 1. Read `references/slides-v2.md`.
13
+ 2. Read `references/fit-guidance.md` when drafting or revising slide density.
14
+ 3. Ensure `lesson.md` declares `kind: slides`.
15
+ 4. Edit ordered slide markdown files inside `slides/`.
16
+ 5. Use the slide DSL for layout, image slots, and reveal steps when it improves the lesson.
17
+ 6. Keep visible slide content in markdown and narration in one optional `@script` block.
18
+ 7. Validate with `npx @datajaddah/course validate .`.
19
+
20
+ ## Boundaries
21
+
22
+ - Author only slides v2 content.
23
+ - Do not add legacy slides v1 fields such as `parts`, `layout`, or `hideTitle`.
24
+ - Do not try to author audio blobs, timing metadata, or generated videos from the repo.
25
+ - When no real external video URL exists yet, prefer slides plus `@script` over a standalone `video.md`.
26
+ - Most slides should be concise, visual, and reveal-driven. Do not dump full narration into visible slide text.
27
+ - Use `slot:` image references for planned visuals when the real uploaded asset does not exist yet.
28
+ - Use block attrs like `{delay=2}` or `{highlight=2}` for full elements, and `==inline phrase=={highlight=2}` when only part of a sentence should reveal-highlight.
@@ -0,0 +1,31 @@
1
+ # Slide Fit Guidance
2
+
3
+ Use this reference when drafting or revising slides.
4
+
5
+ ## Default Workflow
6
+
7
+ 1. Draft the slide around one teaching move, not the full narration.
8
+ 2. Use `@script` for explanation and transitions.
9
+ 3. Use reveal steps before adding more visible text:
10
+ - `delay` for staged appearance
11
+ - `highlight` for the active block
12
+ 4. Run validation and preview.
13
+ 5. If a slide still feels dense, split it into two slides instead of shrinking the idea into unreadable text.
14
+
15
+ ## Conservative Heuristics
16
+
17
+ - Aim for one heading plus a short paragraph, or one heading plus 3 to 5 concise bullets.
18
+ - In column layouts, keep each column lighter than a normal single-column slide.
19
+ - Prefer one image plus one short text block over image + paragraph + long list in the same frame.
20
+ - Code blocks should be short enough to read at presentation size; move explanation into `@script`.
21
+ - If the slide needs several reveals, the final revealed state still has to fit in one 16:9 frame.
22
+
23
+ ## Split Triggers
24
+
25
+ Split the slide when any of these are true:
26
+
27
+ - the visible text reads like a script paragraph instead of slide copy
28
+ - both columns need multiple paragraphs to make the point
29
+ - the image would be too small to stay legible beside the text
30
+ - the slide needs more than one code block or table
31
+ - the slide would still feel crowded after adding reveal steps
@@ -0,0 +1,138 @@
1
+ # Slides V2
2
+
3
+ ## Files
4
+
5
+ Inside a slides lesson:
6
+
7
+ ```text
8
+ lesson.md
9
+ slides/
10
+ 01-cover.md
11
+ 02-overview.md
12
+ 03-example.md
13
+ ```
14
+
15
+ `lesson.md` must contain:
16
+
17
+ ```md
18
+ ---
19
+ kind: slides
20
+ title: "Lesson Title"
21
+ ---
22
+ Optional lesson summary.
23
+ ```
24
+
25
+ ## Slide File Shape
26
+
27
+ Each slide file is markdown with optional frontmatter:
28
+
29
+ ```md
30
+ ---
31
+ title: "Slide Title"
32
+ ---
33
+ # Visible slide content
34
+
35
+ Optional markdown body.
36
+
37
+ @script
38
+ Optional Text for the narration for the presenter voiceover, this is what the presenter will say when they are presenting the slide.
39
+ @endscript
40
+ ```
41
+
42
+ ## Slide DSL
43
+
44
+ Use these directives only when they improve the slide:
45
+
46
+ ```md
47
+ @layout: two-column
48
+
49
+ @column: 1
50
+ ## Concept
51
+ - Short point {delay=1}
52
+ - Another point {delay=2 highlight=2}
53
+
54
+ Use ==print()=={highlight=3} to call the function.
55
+
56
+ @column: 2
57
+ ![Python logo](slot:python-logo "Add the official logo"){width=40% align=center}
58
+ ```
59
+
60
+ - `@layout:` supports `default`, `two-column`, `sidebar-left`, and `sidebar-right`.
61
+ - Non-default layouts must include exactly one `@column: 1` section and one `@column: 2` section.
62
+ - Trailing `{delay=N highlight=N}` can be added to headings, paragraphs, list items, and standalone image lines.
63
+ - Inline phrase highlights use `==selected text=={highlight=N}` and map to the slide viewer's inline reveal highlight.
64
+ - Images can use a real URL or a planned image slot such as `slot:python-logo`.
65
+ - Image attribute blocks can include `width=...`, `height=...`, and `align=left|center|right`.
66
+
67
+ ## What The Platform Does
68
+
69
+ - The markdown body becomes slides v2 HTML content.
70
+ - The optional `@script` block becomes narration text.
71
+ - Slide content plus narration is the authorable input for the platform's slide-based video rendering flow.
72
+ - Slide title comes from frontmatter or falls back to the filename slug.
73
+
74
+ ## What Not To Author In The Repo
75
+
76
+ - `parts`
77
+ - `layout`
78
+ - `hideTitle`
79
+ - `audioRef`
80
+ - `audioData`
81
+ - `stepMarkers`
82
+ - generated video metadata
83
+
84
+ Those are not part of the markdown repo contract.
85
+
86
+ ## Writing Guidance
87
+
88
+ - One core idea per slide.
89
+ - Prefer short headings and concise bullet lists.
90
+ - Use examples, comparisons, and diagrams only when they sharpen the teaching point.
91
+ - Keep on-slide text lighter than the spoken script.
92
+ - Use the script to explain, transition, and add nuance instead of repeating the visible text verbatim.
93
+ - If the lesson is meant to feel like an explainer video, put the spoken teaching detail in `@script` and keep the slide body concise.
94
+ - Prefer this slides-plus-script pattern over `video.md` unless the user already has a real external video URL.
95
+ - Prefer reveal steps over overcrowding: let `delay` and `highlight` stage the explanation instead of stacking every detail on screen at once.
96
+ - Use block highlight for whole bullets or paragraphs, and inline highlight only for the exact term or phrase that should light up.
97
+ - Use `slot:` image references only for planned visuals. Do not invent uploaded URLs.
98
+
99
+ ## Good Patterns
100
+
101
+ - opener slide: topic, promise, why it matters
102
+ - concept slide: definition plus one example
103
+ - walkthrough slide: numbered steps
104
+ - comparison slide: two options with tradeoffs
105
+ - checkpoint slide: short recap or reflection prompt
106
+
107
+ ## Constraints
108
+
109
+ - Exactly one optional `@script` block per slide file.
110
+ - The slide body outside `@script` must remain valid markdown.
111
+ - Keep slide filenames ordered and contiguous.
112
+ - Keep non-default layouts one slide wide: do not mix freeform blocks above or below `@column` sections in the same slide file.
113
+
114
+ ## Example
115
+
116
+ ```md
117
+ ---
118
+ title: "Event Loop Mental Model"
119
+ ---
120
+ ## Event Loop
121
+
122
+ - Call stack runs synchronous work first
123
+ - Queues hold deferred work
124
+ - The loop keeps pulling the next runnable task
125
+
126
+ @script
127
+ Use this slide to replace vague intuition with a simple execution model. Emphasize that the event loop is about ordering work, not making JavaScript multithreaded.
128
+ @endscript
129
+ ```
130
+
131
+ ## Validation Reminder
132
+
133
+ After editing slides:
134
+
135
+ ```bash
136
+ npx @datajaddah/course validate .
137
+ npx @datajaddah/course preview .
138
+ ```
@@ -0,0 +1,23 @@
1
+ ---
2
+ name: course-spreadsheet-labs
3
+ description: Author Datajaddah spreadsheet lab lessons in a GitHub course repository. Use this skill when creating or editing spreadsheet exercises, workbook data, solution data, or check rules.
4
+ ---
5
+
6
+ # Course Spreadsheet Labs
7
+
8
+ Use this skill when the request is about hands-on spreadsheet lab exercises in the GitHub course repo.
9
+
10
+ ## Workflow
11
+
12
+ 1. Read `references/spreadsheet-labs.md`.
13
+ 2. Ensure `lesson.md` declares `kind: spreadsheet_lab`.
14
+ 3. Keep the prompt in `spreadsheet/exercise.md` with explicit `## Context` and `## Instructions` sections.
15
+ 4. Author starter data in `spreadsheet/workbook.json` and the expected answer in `spreadsheet/solution.json`.
16
+ 5. Define requirement checks in `spreadsheet/checks.json`.
17
+ 6. Validate with `npx @datajaddah/course validate .`.
18
+
19
+ ## Boundaries
20
+
21
+ - Do not add application code or Univerjs configuration to the repo; the platform owns the spreadsheet runtime.
22
+ - Keep the learner prompt in markdown and data in JSON files.
23
+ - Keep exercises aligned with the requested lesson topic, not repository mechanics or platform workflows.
@@ -0,0 +1,239 @@
1
+ # Spreadsheet Labs
2
+
3
+ ## Files
4
+
5
+ Inside a spreadsheet lab lesson:
6
+
7
+ ```text
8
+ lesson.md
9
+ spreadsheet/
10
+ exercise.md
11
+ workbook.json
12
+ solution.json
13
+ checks.json
14
+ ```
15
+
16
+ `lesson.md` must contain:
17
+
18
+ ```md
19
+ ---
20
+ kind: spreadsheet_lab
21
+ title: "Lesson Title"
22
+ ---
23
+ Optional lesson summary.
24
+ ```
25
+
26
+ `spreadsheet/exercise.md` must contain:
27
+
28
+ ```md
29
+ ---
30
+ title: "Exercise Title"
31
+ engine: "univer"
32
+ ---
33
+ ## Context
34
+
35
+ Brief problem setup in markdown.
36
+
37
+ ## Instructions
38
+
39
+ Exact task in markdown.
40
+ ```
41
+
42
+ ## Required Constraints
43
+
44
+ - `exercise.md` must contain `## Context` followed by `## Instructions`.
45
+ - `engine` is optional and defaults to `univer`.
46
+ - All four files (`exercise.md`, `workbook.json`, `solution.json`, `checks.json`) are required.
47
+
48
+ ## Workbook and Solution Format
49
+
50
+ Both `workbook.json` and `solution.json` use the same structure:
51
+
52
+ ```json
53
+ {
54
+ "sheets": {
55
+ "SheetName": {
56
+ "name": "SheetName",
57
+ "cellData": {
58
+ "0": {
59
+ "0": { "v": "Header A" },
60
+ "1": { "v": "Header B" }
61
+ },
62
+ "1": {
63
+ "0": { "v": 100 },
64
+ "1": { "v": 200 }
65
+ }
66
+ }
67
+ }
68
+ }
69
+ }
70
+ ```
71
+
72
+ - `cellData` keys are zero-based row indexes, and nested keys are zero-based column indexes.
73
+ - Each cell object may contain `v` (value), `f` (formula), `s` (style reference), or `t` (type).
74
+ - `workbook.json` is the starter state the learner sees.
75
+ - `solution.json` is the expected completed state.
76
+
77
+ ## Checks Format
78
+
79
+ `checks.json` is a JSON array of check objects:
80
+
81
+ ```json
82
+ [
83
+ {
84
+ "id": "total-revenue",
85
+ "label": "Total revenue is correct",
86
+ "type": "value_equals",
87
+ "cell": "D2",
88
+ "value": 42
89
+ }
90
+ ]
91
+ ```
92
+
93
+ ### Required Fields
94
+
95
+ - `id` — unique string identifier for this check
96
+ - `label` — human-readable description shown to the learner
97
+ - `type` — one of the supported check types below
98
+ - `cell` — cell reference like `A1`, `D2`, `B10`
99
+
100
+ ### Optional Fields
101
+
102
+ - `sheet_name` — which sheet to check (defaults to the first sheet)
103
+ - `formula` — expected formula string (for formula-based checks)
104
+ - `details` — additional explanation shown on failure
105
+ - `value` — expected value (for value-based checks)
106
+ - `values` — array of acceptable values (for `one_of` checks)
107
+ - `tolerance` — numeric tolerance (for `value_with_tolerance` checks)
108
+
109
+ ### Supported Check Types
110
+
111
+ | Type | Purpose | Key Fields |
112
+ |------|---------|------------|
113
+ | `value_equals` | Cell value must equal expected value | `value` |
114
+ | `text_equals` | Cell text must equal expected string | `value` |
115
+ | `has_formula` | Cell must contain any formula | — |
116
+ | `formula_equals` | Cell formula must match exactly | `formula` |
117
+ | `one_of` | Cell value must be one of several options | `values` |
118
+ | `value_with_tolerance` | Numeric value within tolerance | `value`, `tolerance` |
119
+
120
+ ## Platform Behavior
121
+
122
+ - The platform renders spreadsheet labs using a Univerjs-powered spreadsheet component.
123
+ - The learner sees `workbook.json` as the starting state and edits it in the browser.
124
+ - Checks are evaluated against the learner's current spreadsheet state.
125
+ - Requirements are displayed as a checklist the learner works through.
126
+ - The solution workbook is available to the learner after submission or as a hint.
127
+
128
+ ## Writing Guidance
129
+
130
+ - State the task in concrete, verifiable terms.
131
+ - Pre-fill headers and static data in `workbook.json` so the learner focuses on the analytical task.
132
+ - Keep checks focused on the learning objective, not formatting or cosmetics.
133
+ - Make each check independently verifiable when possible.
134
+ - Use `details` to give the learner a hint about what went wrong.
135
+ - Keep the exercise on the requested lesson topic.
136
+
137
+ ## Example
138
+
139
+ ```md
140
+ ---
141
+ title: "Revenue Summary"
142
+ ---
143
+ ## Context
144
+
145
+ You have a spreadsheet with monthly revenue data for Q1.
146
+
147
+ ## Instructions
148
+
149
+ - In cell `D2`, enter a SUM formula to calculate the total revenue for January through March.
150
+ - Ensure the result equals `4500`.
151
+ ```
152
+
153
+ Workbook example (`workbook.json`):
154
+
155
+ ```json
156
+ {
157
+ "sheets": {
158
+ "Revenue": {
159
+ "name": "Revenue",
160
+ "cellData": {
161
+ "0": {
162
+ "0": { "v": "Month" },
163
+ "1": { "v": "Revenue" }
164
+ },
165
+ "1": {
166
+ "0": { "v": "January" },
167
+ "1": { "v": 1200 }
168
+ },
169
+ "2": {
170
+ "0": { "v": "February" },
171
+ "1": { "v": 1500 }
172
+ },
173
+ "3": {
174
+ "0": { "v": "March" },
175
+ "1": { "v": 1800 }
176
+ },
177
+ "4": {
178
+ "0": { "v": "Total" },
179
+ "1": {}
180
+ }
181
+ }
182
+ }
183
+ }
184
+ }
185
+ ```
186
+
187
+ Solution example (`solution.json`):
188
+
189
+ ```json
190
+ {
191
+ "sheets": {
192
+ "Revenue": {
193
+ "name": "Revenue",
194
+ "cellData": {
195
+ "0": {
196
+ "0": { "v": "Month" },
197
+ "1": { "v": "Revenue" }
198
+ },
199
+ "1": {
200
+ "0": { "v": "January" },
201
+ "1": { "v": 1200 }
202
+ },
203
+ "2": {
204
+ "0": { "v": "February" },
205
+ "1": { "v": 1500 }
206
+ },
207
+ "3": {
208
+ "0": { "v": "March" },
209
+ "1": { "v": 1800 }
210
+ },
211
+ "4": {
212
+ "0": { "v": "Total" },
213
+ "1": { "v": 4500, "f": "=SUM(B2:B4)" }
214
+ }
215
+ }
216
+ }
217
+ }
218
+ }
219
+ ```
220
+
221
+ Checks example (`checks.json`):
222
+
223
+ ```json
224
+ [
225
+ {
226
+ "id": "total-formula",
227
+ "label": "Total cell uses a SUM formula",
228
+ "type": "has_formula",
229
+ "cell": "B5"
230
+ },
231
+ {
232
+ "id": "total-value",
233
+ "label": "Total equals 4500",
234
+ "type": "value_equals",
235
+ "cell": "B5",
236
+ "value": 4500
237
+ }
238
+ ]
239
+ ```
@@ -0,0 +1,22 @@
1
+ ---
2
+ name: course-video-lessons
3
+ description: Author Datajaddah video lessons in a GitHub course repository. Use this skill when creating or editing lessons whose primary resource is a standalone externally hosted video with a real URL, including lesson summaries, video titles, URLs, and follow-up notes.
4
+ ---
5
+
6
+ # Course Video Lessons
7
+
8
+ Use this skill only when the lesson resource is a standalone external video that already exists or was explicitly requested.
9
+
10
+ ## Workflow
11
+
12
+ 1. Read `references/video-lessons.md`.
13
+ 2. If no real external video URL exists yet, use the slides skill instead and author `@script` for the platform video flow.
14
+ 3. Ensure `lesson.md` declares `kind: video`.
15
+ 4. Edit `video.md` for the video title, URL, and learner notes.
16
+ 5. Validate with `npx @datajaddah/course validate .`.
17
+
18
+ ## Boundaries
19
+
20
+ - This skill is for lesson videos represented by `video.md`.
21
+ - Generated videos attached to slide decks are platform-managed and are not authored here.
22
+ - Do not invent placeholder URLs or create `video.md` just to stand in for a future slide-rendered video.