@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.
- package/README.md +31 -0
- package/bin/datajaddah-course.js +238 -0
- package/lib/init.js +375 -0
- package/lib/preview.js +1617 -0
- package/lib/repo-contract.js +1291 -0
- package/lib/slide-markdown.js +505 -0
- package/package.json +41 -0
- package/preview-dist/assets/index-CJUgarn8.css +1 -0
- package/preview-dist/assets/index-CavDNP3d.js +49 -0
- package/preview-dist/index.html +13 -0
- package/scaffold/.agents/rules/general.md +91 -0
- package/scaffold/.agents/skills/course-coding-exercises/SKILL.md +22 -0
- package/scaffold/.agents/skills/course-coding-exercises/references/coding-exercises.md +111 -0
- package/scaffold/.agents/skills/course-platform-overview/SKILL.md +36 -0
- package/scaffold/.agents/skills/course-platform-overview/references/platform-overview.md +105 -0
- package/scaffold/.agents/skills/course-quizzes/SKILL.md +23 -0
- package/scaffold/.agents/skills/course-quizzes/references/quizzes.md +121 -0
- package/scaffold/.agents/skills/course-repo-contract/SKILL.md +24 -0
- package/scaffold/.agents/skills/course-repo-contract/references/repo-contract.md +169 -0
- package/scaffold/.agents/skills/course-slides-v2/SKILL.md +28 -0
- package/scaffold/.agents/skills/course-slides-v2/references/fit-guidance.md +31 -0
- package/scaffold/.agents/skills/course-slides-v2/references/slides-v2.md +138 -0
- package/scaffold/.agents/skills/course-spreadsheet-labs/SKILL.md +23 -0
- package/scaffold/.agents/skills/course-spreadsheet-labs/references/spreadsheet-labs.md +239 -0
- package/scaffold/.agents/skills/course-video-lessons/SKILL.md +22 -0
- 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
|
+
{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.
|