@kidsinai/kids-opencode-plugin 0.0.1
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/course-packs/README.md +38 -0
- package/course-packs/portfolio-site/mission-1/acceptance.yml +57 -0
- package/course-packs/portfolio-site/mission-1/brief.md +83 -0
- package/course-packs/portfolio-site/mission-2/acceptance.yml +53 -0
- package/course-packs/portfolio-site/mission-2/brief.md +77 -0
- package/course-packs/portfolio-site/mission-3/acceptance.yml +66 -0
- package/course-packs/portfolio-site/mission-3/brief.md +89 -0
- package/course-packs/portfolio-site/pack.yml +82 -0
- package/package.json +43 -0
- package/src/acceptance.ts +386 -0
- package/src/check-runner.ts +131 -0
- package/src/course-pack.ts +119 -0
- package/src/index.ts +262 -0
- package/src/system-prompt.ts +64 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Course Packs
|
|
2
|
+
|
|
3
|
+
> Bundled missions distributed with `kids-opencode`. Loaded by the plugin when `KIDS_COURSE_PACK=<pack-id>` is set in the environment (typically via `kids-opencode --course <pack-id>`).
|
|
4
|
+
|
|
5
|
+
## V0 pack
|
|
6
|
+
|
|
7
|
+
| ID | Title | Age | Missions | Stars budget | Status |
|
|
8
|
+
|---|---|---|---|---|---|
|
|
9
|
+
| `portfolio-site` | My personal portfolio website | 12+ | 3 | ~40โญ | ๐ก content drafted, not workshop-tested |
|
|
10
|
+
|
|
11
|
+
## Structure
|
|
12
|
+
|
|
13
|
+
Each pack lives in `<pack-id>/` and has:
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
<pack-id>/
|
|
17
|
+
โโโ pack.yml # Metadata: title, age band, missions, system_prompt overlay
|
|
18
|
+
โโโ mission-1/
|
|
19
|
+
โ โโโ brief.md # What the kid reads
|
|
20
|
+
โ โโโ acceptance.yml # Auto-check rules for completion
|
|
21
|
+
โโโ mission-2/
|
|
22
|
+
โ โโโ brief.md
|
|
23
|
+
โ โโโ acceptance.yml
|
|
24
|
+
โโโ mission-3/
|
|
25
|
+
โโโ brief.md
|
|
26
|
+
โโโ acceptance.yml
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Content authoring: see [`docs/course-pack-authoring.md`](../docs/course-pack-authoring.md) (TODO).
|
|
30
|
+
|
|
31
|
+
## V1+ candidate packs
|
|
32
|
+
|
|
33
|
+
- `arduino-on-mbot` โ Robotics Bridge first pack (V1+ depends on hardware tooling)
|
|
34
|
+
- `simple-game` โ A small JavaScript game (Snake, Pong, or kid-designed)
|
|
35
|
+
- `data-story` โ Pyodide-powered first data-vis story (V1+ depends on Pyodide integration)
|
|
36
|
+
- `class-website` โ Group project, multi-kid, shared schools setting
|
|
37
|
+
|
|
38
|
+
Curriculum team owns the priority order.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Acceptance criteria for Mission 1.
|
|
2
|
+
# Evaluated by kids-opencode-plugin after session end, against the kid's project folder.
|
|
3
|
+
|
|
4
|
+
mission_id: mission-1
|
|
5
|
+
title: "Project setup + first HTML page"
|
|
6
|
+
|
|
7
|
+
# Each check is an independent boolean. All must pass for the Mission to be marked complete.
|
|
8
|
+
checks:
|
|
9
|
+
- id: index_html_exists
|
|
10
|
+
description: "An index.html file exists in the project folder"
|
|
11
|
+
type: file_exists
|
|
12
|
+
path: "index.html"
|
|
13
|
+
|
|
14
|
+
- id: index_html_has_html_tag
|
|
15
|
+
description: "index.html is a real HTML document (has the html element)"
|
|
16
|
+
type: file_contains_regex
|
|
17
|
+
path: "index.html"
|
|
18
|
+
pattern: "(?i)<html"
|
|
19
|
+
|
|
20
|
+
- id: index_html_has_body
|
|
21
|
+
description: "index.html has a body section"
|
|
22
|
+
type: file_contains_regex
|
|
23
|
+
path: "index.html"
|
|
24
|
+
pattern: "(?i)<body"
|
|
25
|
+
|
|
26
|
+
- id: index_html_has_heading
|
|
27
|
+
description: "index.html has at least one heading (the kid's name)"
|
|
28
|
+
type: file_contains_regex
|
|
29
|
+
path: "index.html"
|
|
30
|
+
pattern: "(?i)<h[1-6][^>]*>"
|
|
31
|
+
|
|
32
|
+
- id: index_html_has_substance
|
|
33
|
+
description: "index.html has at least 50 characters of actual content in its body"
|
|
34
|
+
# Heuristic: html minus tags should have >= 50 non-whitespace characters
|
|
35
|
+
type: file_text_length_min
|
|
36
|
+
path: "index.html"
|
|
37
|
+
min_chars: 100 # rough proxy; tag-stripped check is done in plugin
|
|
38
|
+
|
|
39
|
+
- id: file_in_project_only
|
|
40
|
+
description: "All files written in this session are inside the project folder (no path traversal)"
|
|
41
|
+
type: audit_log_check
|
|
42
|
+
audit_rule: "all_writes_within_cwd"
|
|
43
|
+
|
|
44
|
+
# What the kid sees on completion
|
|
45
|
+
completion_message: |
|
|
46
|
+
Mission 1 complete! ๐
|
|
47
|
+
|
|
48
|
+
You made a real web page from scratch. Your name is now on a thing you can show people.
|
|
49
|
+
|
|
50
|
+
Ready for Mission 2 โ making it look like *you*?
|
|
51
|
+
|
|
52
|
+
# What gets logged for the parent dashboard
|
|
53
|
+
parent_summary_fields:
|
|
54
|
+
- "Mission 1 completed at [timestamp]"
|
|
55
|
+
- "Total Stars used: [stars]"
|
|
56
|
+
- "Number of file edits: [count]"
|
|
57
|
+
- "Total session time: [duration]"
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# Mission 1 โ Project setup + first HTML page
|
|
2
|
+
|
|
3
|
+
> **Estimated time**: 30 minutes ยท **Estimated Stars**: 10 ยท **Goal**: see your name on a real web page in your browser within 5 minutes.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## What you're going to build
|
|
8
|
+
|
|
9
|
+
A single file called `index.html` that has your name in big text, and a few sentences about you. Open it in your browser. Refresh the page when you change something. Show it to a parent or a friend at the end.
|
|
10
|
+
|
|
11
|
+
That's it for Mission 1. We'll make it pretty in Mission 2 and add interactivity in Mission 3.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## How this works (read once)
|
|
16
|
+
|
|
17
|
+
You're going to ask the AI mentor to help you. The AI won't just write the code for you โ it'll ask what you want, then propose what to write, then ask **you** to approve before it writes anything.
|
|
18
|
+
|
|
19
|
+
You'll see prompts like:
|
|
20
|
+
|
|
21
|
+
> "I'm about to create a file called `index.html` with your name as the heading. OK to write?"
|
|
22
|
+
|
|
23
|
+
Type **y** to approve, **n** to say no.
|
|
24
|
+
|
|
25
|
+
If you don't know what something means, ask. The AI's job is to teach you, not just to crank out code.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Steps (you'll go through these with the AI)
|
|
30
|
+
|
|
31
|
+
1. **Get a project folder ready.** You should already be in one. If you don't know, type `pwd` (Mac/Linux) and see what folder you're in. The AI will help.
|
|
32
|
+
|
|
33
|
+
2. **Start the agent.** From this folder:
|
|
34
|
+
```
|
|
35
|
+
kids-opencode --course portfolio-site --mission mission-1
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
3. **Talk to the AI about what you want.** When it asks, tell it your name (whatever you want to put on the page โ a nickname is fine), and a sentence or two about you. Examples:
|
|
39
|
+
- "I'm Mia, I'm 12, and I love making animations."
|
|
40
|
+
- "My name is Alex. I want to be a game designer when I grow up."
|
|
41
|
+
- "I'm into chess and origami and my dog Maple."
|
|
42
|
+
|
|
43
|
+
4. **Approve the file create.** The AI will say "I'm going to make `index.html` with [your text]". Approve it.
|
|
44
|
+
|
|
45
|
+
5. **Open the file in your browser.** On Mac: `open index.html`. On Linux: `xdg-open index.html`. Or just drag the file into a browser window.
|
|
46
|
+
|
|
47
|
+
6. **Look at it!** Your text should appear in big letters. That's a real web page. You made it.
|
|
48
|
+
|
|
49
|
+
7. **Show it.** Show a parent, a sibling, or a friend. Then come back and start Mission 2.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## When you get stuck
|
|
54
|
+
|
|
55
|
+
- **The AI says it's going to do something I don't understand.** Ask it: "what does that mean?" Its job is to explain. If it doesn't explain well, ask again.
|
|
56
|
+
- **My page is blank in the browser.** Tell the AI. It can read your `index.html` and check what's there.
|
|
57
|
+
- **I made a typo and now nothing works.** Tell the AI. It will help you find the typo. Don't delete the whole file in panic.
|
|
58
|
+
- **The AI is going too fast.** Tell it: "slow down" or "explain that step by step."
|
|
59
|
+
- **I want to quit and come back later.** Press Ctrl+D or type `/quit`. Your file stays where it is. Run `kids-opencode --course portfolio-site --mission mission-1` again to come back.
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## What you'll learn in this mission
|
|
64
|
+
|
|
65
|
+
- HTML files are just text files with tags like `<h1>` (big heading) and `<p>` (paragraph)
|
|
66
|
+
- A web browser reads an HTML file and shows it
|
|
67
|
+
- Coding is mostly typing the right text in the right place
|
|
68
|
+
- Working with an AI mentor means proposing, approving, and watching the result
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## What's next
|
|
73
|
+
|
|
74
|
+
Mission 2 โ make it look beautiful with CSS. You'll pick your colours, your fonts, your layout.
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## For parents / teachers
|
|
79
|
+
|
|
80
|
+
This Mission targets:
|
|
81
|
+
- **AU Digital Technologies F-10 curriculum** โ knowledge & understanding of digital systems (ACTDIK023), production of digital solutions (ACTDIP030 / ACTDIP031), implementation of programs (ACTDIP031)
|
|
82
|
+
- **Plan/approve UX habituation** โ every Mission reinforces the kid's role as approver, not just consumer of AI output
|
|
83
|
+
- **Concrete output for fridge-display** โ within 30 minutes, a kid has produced and viewed real artifact on their own device. Fast positive feedback is critical for return engagement.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
mission_id: mission-2
|
|
2
|
+
title: "Style your page with CSS"
|
|
3
|
+
|
|
4
|
+
checks:
|
|
5
|
+
- id: style_css_exists
|
|
6
|
+
description: "A style.css file exists in the project folder"
|
|
7
|
+
type: file_exists
|
|
8
|
+
path: "style.css"
|
|
9
|
+
|
|
10
|
+
- id: index_links_to_style_css
|
|
11
|
+
description: "index.html includes a link to style.css"
|
|
12
|
+
type: file_contains_regex
|
|
13
|
+
path: "index.html"
|
|
14
|
+
pattern: '<link\s+[^>]*href=["'']style\.css["'']'
|
|
15
|
+
|
|
16
|
+
- id: style_css_has_rules
|
|
17
|
+
description: "style.css has at least 5 CSS rules"
|
|
18
|
+
# Crude heuristic: each rule has a `{`. 5 opening braces โ 5 rules.
|
|
19
|
+
type: file_contains_count_min
|
|
20
|
+
path: "style.css"
|
|
21
|
+
pattern: '\{'
|
|
22
|
+
min_count: 5
|
|
23
|
+
|
|
24
|
+
- id: style_css_uses_colour
|
|
25
|
+
description: "style.css uses at least one colour property"
|
|
26
|
+
type: file_contains_regex
|
|
27
|
+
path: "style.css"
|
|
28
|
+
pattern: '(color|background|background-color)\s*:'
|
|
29
|
+
|
|
30
|
+
- id: style_css_uses_font
|
|
31
|
+
description: "style.css makes some choice about typography"
|
|
32
|
+
type: file_contains_regex
|
|
33
|
+
path: "style.css"
|
|
34
|
+
pattern: '(font-family|font-size|font-weight)\s*:'
|
|
35
|
+
|
|
36
|
+
- id: project_still_intact
|
|
37
|
+
description: "index.html from Mission 1 still has heading + body + content"
|
|
38
|
+
type: file_contains_regex
|
|
39
|
+
path: "index.html"
|
|
40
|
+
pattern: "(?i)<h[1-6]"
|
|
41
|
+
|
|
42
|
+
completion_message: |
|
|
43
|
+
Mission 2 complete! ๐จ
|
|
44
|
+
|
|
45
|
+
Your page looks like *you* now. That's design.
|
|
46
|
+
|
|
47
|
+
One more thing โ let's make something happen when you click. Ready for Mission 3?
|
|
48
|
+
|
|
49
|
+
parent_summary_fields:
|
|
50
|
+
- "Mission 2 completed at [timestamp]"
|
|
51
|
+
- "Total Stars used (this mission): [stars]"
|
|
52
|
+
- "Number of style changes proposed: [count]"
|
|
53
|
+
- "Total session time: [duration]"
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Mission 2 โ Style your page with CSS
|
|
2
|
+
|
|
3
|
+
> **Estimated time**: 45 minutes ยท **Estimated Stars**: 15 ยท **Goal**: your page reflects you. Your colours, your fonts, your layout choices.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## What you're going to add
|
|
8
|
+
|
|
9
|
+
CSS โ Cascading Style Sheets. The rules that decide how things on your page **look**: colours, fonts, sizes, spacing.
|
|
10
|
+
|
|
11
|
+
You'll create a new file called `style.css` and link it from your `index.html`.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Steps
|
|
16
|
+
|
|
17
|
+
1. **Continue from Mission 1.** Your `index.html` is sitting in your folder. Open it in the browser once to remind yourself what it looks like now.
|
|
18
|
+
|
|
19
|
+
2. **Start the agent.**
|
|
20
|
+
```
|
|
21
|
+
kids-opencode --course portfolio-site --mission mission-2
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
3. **Tell the agent your vibe.** What do you want your page to **feel** like?
|
|
25
|
+
- Calm? Warm? Cool? Bright? Soft? Bold? Retro? Modern?
|
|
26
|
+
- What colours do you like? (Pick 2-3. The AI can suggest some combinations if you're stuck.)
|
|
27
|
+
- What font feels right? Handwritten? Tech? Serif (like books)? Sans-serif (clean)?
|
|
28
|
+
|
|
29
|
+
4. **Let the AI propose a style.** It will draft `style.css` and propose changes to `index.html` to link to it. You'll see the changes before they happen.
|
|
30
|
+
|
|
31
|
+
5. **Approve, look, iterate.** Refresh your browser. Don't like it? Tell the AI what to change. "Make the heading bigger." "I want the background a bit warmer โ more peach, less pink." "The font feels too formal."
|
|
32
|
+
|
|
33
|
+
6. **Spend max 5 minutes on each round.** Don't get stuck. If something feels close-enough, move on. You can always come back.
|
|
34
|
+
|
|
35
|
+
7. **Show it.** When it feels like *yours*, that's done.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Examples to inspire (you don't have to copy any of these)
|
|
40
|
+
|
|
41
|
+
- A nature lover: olive-green background, cream cards, serif font like Georgia
|
|
42
|
+
- A gamer: dark background, bright accent colours, monospace font
|
|
43
|
+
- A poet: cream background, dark serif, lots of breathing room
|
|
44
|
+
- A maker: white background, primary colours, bold sans-serif headlines
|
|
45
|
+
- A musician: deep purple, neon accents, an italic display font
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## When you get stuck
|
|
50
|
+
|
|
51
|
+
- **All my colours look bad together.** Ask the AI: "give me 3 colour palettes I can try" and pick one.
|
|
52
|
+
- **The font won't change.** The AI is using web-safe fonts (Arial, Georgia, Helvetica). If you want fancier ones, that's a V1+ feature โ we don't fetch fonts from the web in V0.
|
|
53
|
+
- **My text is unreadable on my background.** Tell the AI. "Make the text darker / lighter so it stands out."
|
|
54
|
+
- **I keep undoing my own changes.** That's OK. Ask the AI: "show me a diff of what we did this session" so you can compare.
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## What you'll learn
|
|
59
|
+
|
|
60
|
+
- CSS rules โ selectors and properties
|
|
61
|
+
- The cascade โ how CSS layers on top of HTML
|
|
62
|
+
- That "design" is choosing, not magic. You can change anything.
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## What's next
|
|
67
|
+
|
|
68
|
+
Mission 3 โ a button that does something. A little bit of JavaScript.
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## For parents / teachers
|
|
73
|
+
|
|
74
|
+
This Mission targets:
|
|
75
|
+
- **AU Digital Technologies F-10** โ design thinking, iteration, evaluation against the user's intent (the kid is the user)
|
|
76
|
+
- **Self-expression as motivator** โ Mission 2 is the kid's chance to assert taste; that ownership is what brings them back for Mission 3
|
|
77
|
+
- **Beware of perfectionism** โ kids will spend 30 minutes on colour-picking if you let them. The 5-minute-per-round guidance is intentional.
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
mission_id: mission-3
|
|
2
|
+
title: "Add an interactive button"
|
|
3
|
+
|
|
4
|
+
checks:
|
|
5
|
+
- id: script_js_exists
|
|
6
|
+
description: "A script.js file exists in the project folder"
|
|
7
|
+
type: file_exists
|
|
8
|
+
path: "script.js"
|
|
9
|
+
|
|
10
|
+
- id: index_links_to_script_js
|
|
11
|
+
description: "index.html includes a <script> tag referencing script.js"
|
|
12
|
+
type: file_contains_regex
|
|
13
|
+
path: "index.html"
|
|
14
|
+
pattern: '<script\s+[^>]*src=["'']script\.js["'']'
|
|
15
|
+
|
|
16
|
+
- id: index_has_a_button
|
|
17
|
+
description: "index.html has at least one <button> element"
|
|
18
|
+
type: file_contains_regex
|
|
19
|
+
path: "index.html"
|
|
20
|
+
pattern: '(?i)<button[^>]*>'
|
|
21
|
+
|
|
22
|
+
- id: script_has_event_listener
|
|
23
|
+
description: "script.js wires up an event listener (or onclick) so the button does something"
|
|
24
|
+
# Allow either modern (addEventListener) or simple (onclick) wiring; both are valid
|
|
25
|
+
type: file_contains_any_regex
|
|
26
|
+
path: "script.js"
|
|
27
|
+
patterns:
|
|
28
|
+
- 'addEventListener'
|
|
29
|
+
- 'onclick'
|
|
30
|
+
- 'onClick'
|
|
31
|
+
|
|
32
|
+
- id: portfolio_pages_intact
|
|
33
|
+
description: "Mission 1 + Mission 2 outputs still present"
|
|
34
|
+
type: all_must_exist
|
|
35
|
+
paths:
|
|
36
|
+
- "index.html"
|
|
37
|
+
- "style.css"
|
|
38
|
+
- "script.js"
|
|
39
|
+
|
|
40
|
+
completion_message: |
|
|
41
|
+
Mission 3 complete! ๐
|
|
42
|
+
|
|
43
|
+
You built a real interactive web page from scratch. Content, style, and behaviour.
|
|
44
|
+
|
|
45
|
+
Open `index.html` in your browser one more time. Click your button. That's something you made.
|
|
46
|
+
|
|
47
|
+
๐ Your project lives in this folder. You can keep editing it any time.
|
|
48
|
+
๐ You finished the Personal Portfolio Course Pack.
|
|
49
|
+
|
|
50
|
+
Want to keep going? Ask the AI: "What should I learn next?"
|
|
51
|
+
|
|
52
|
+
parent_summary_fields:
|
|
53
|
+
- "Mission 3 completed at [timestamp]"
|
|
54
|
+
- "Course Pack 'portfolio-site' completed"
|
|
55
|
+
- "Total Stars used across pack: [stars_total]"
|
|
56
|
+
- "Final file count: [count]"
|
|
57
|
+
- "Total time across pack: [duration_total]"
|
|
58
|
+
|
|
59
|
+
# Pack-level summary (emitted on Mission 3 completion)
|
|
60
|
+
pack_completion_message: |
|
|
61
|
+
๐ You finished the whole Course Pack.
|
|
62
|
+
|
|
63
|
+
What you built: a personal portfolio website with HTML, CSS, and JavaScript.
|
|
64
|
+
What you learned: how a web page works, how to design, how to debug.
|
|
65
|
+
|
|
66
|
+
Show your family. Then come back when you're ready for the next pack.
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Mission 3 โ Add an interactive button
|
|
2
|
+
|
|
3
|
+
> **Estimated time**: 45 minutes ยท **Estimated Stars**: 15 ยท **Goal**: a button on your page that does something when you click it. Real JavaScript.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## What you're going to add
|
|
8
|
+
|
|
9
|
+
A button. When the kid (or anyone) clicks it, something happens on the page.
|
|
10
|
+
|
|
11
|
+
Pick **one** of these (or invent your own โ tell the AI):
|
|
12
|
+
|
|
13
|
+
- **Pop-up greeting**: Click โ an alert says hi back
|
|
14
|
+
- **Hide and show**: Click โ a paragraph appears (or disappears)
|
|
15
|
+
- **Random fact**: Click โ a different sentence from a list of your own choices appears
|
|
16
|
+
- **Counter**: Click โ a number goes up by one
|
|
17
|
+
- **Colour shift**: Click โ the page background changes colour
|
|
18
|
+
- **Confetti time**: Click โ emoji burst on screen (a small JS confetti effect)
|
|
19
|
+
- **The day teller**: Click โ today's date is shown
|
|
20
|
+
- **The compliment**: Click โ a random compliment appears
|
|
21
|
+
- **Whatever you want**: Tell the AI what the button should do. If it's doable in HTML/CSS/JS, the AI will help.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Steps
|
|
26
|
+
|
|
27
|
+
1. **Start the agent.**
|
|
28
|
+
```
|
|
29
|
+
kids-opencode --course portfolio-site --mission mission-3
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
2. **Pick what the button does.** Tell the AI in your own words.
|
|
33
|
+
|
|
34
|
+
3. **Approve the plan.** The AI will say something like: "I'll add a `<button>` to your `index.html`, write a JavaScript file `script.js`, and link it." Approve.
|
|
35
|
+
|
|
36
|
+
4. **Try clicking the button.** Refresh the browser, click. Did it work?
|
|
37
|
+
|
|
38
|
+
5. **If it didn't work**, tell the AI what happened ("nothing happened" or "I got an error in the console"). The AI can read your files and figure out why. **This is the most common bug in your career as a coder. Get used to it.**
|
|
39
|
+
|
|
40
|
+
6. **Make it yours.** Once it works, tweak. Change the message. Change the colour. Add a second button. Whatever.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## A quick word about errors
|
|
45
|
+
|
|
46
|
+
When something doesn't work in JavaScript, **open the browser console** (`Cmd-Option-J` on Mac, `Ctrl-Shift-J` on Linux/Windows in Chrome). Red text = the error. Tell the AI what the red text says.
|
|
47
|
+
|
|
48
|
+
This is how all coders work. They don't memorise everything; they read errors and fix them.
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## When you get stuck
|
|
53
|
+
|
|
54
|
+
- **The button is there but nothing happens.** Tell the AI; it will read your files and check the wiring.
|
|
55
|
+
- **The console has a red error I don't understand.** Copy-paste the error text to the AI. "What does this mean?"
|
|
56
|
+
- **My button works once, then stops.** Tell the AI; common JS bug.
|
|
57
|
+
- **I want to add a second button.** Go ahead โ start a new round with the AI.
|
|
58
|
+
- **I want my button to do something that involves the internet.** Not in V0. The AI will explain why; we keep things local for safety.
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## What you'll learn
|
|
63
|
+
|
|
64
|
+
- JavaScript files (`.js`) are linked from HTML the same way CSS is
|
|
65
|
+
- An **event listener** waits for a click and runs code when it happens
|
|
66
|
+
- Debugging โ the most-real coding skill โ is just reading the error and trying again
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## What's next
|
|
71
|
+
|
|
72
|
+
You're done with Mission 3 and the Course Pack! Your portfolio site has:
|
|
73
|
+
- Real content (Mission 1)
|
|
74
|
+
- Your visual style (Mission 2)
|
|
75
|
+
- Something interactive (Mission 3)
|
|
76
|
+
|
|
77
|
+
Show it to people. Then either:
|
|
78
|
+
- **Pick a new Course Pack** (more coming after V0 launch)
|
|
79
|
+
- **Keep iterating** โ add more sections, more buttons, more pages. The AI is happy to keep helping.
|
|
80
|
+
- **Take a break** โ your project is saved in this folder; come back anytime.
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## For parents / teachers
|
|
85
|
+
|
|
86
|
+
This Mission targets:
|
|
87
|
+
- **AU Digital Technologies F-10** โ implementation of programs (ACTDIP031), debugging (ACTDIP030)
|
|
88
|
+
- **Console literacy** โ first exposure to browser dev tools is a big leap; expect kids to forget how to open the console multiple times
|
|
89
|
+
- **Resilience to errors** โ kids who quit at the first red text in the console are not ready for engineering yet. The agent's job is to model "errors are OK, here's how I read them." Workshop teachers should reinforce this orally.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# Course Pack โ Personal Portfolio Website
|
|
2
|
+
#
|
|
3
|
+
# V0 launch Course Pack. Goal: a 12+ kid builds and ships a single-page
|
|
4
|
+
# HTML/CSS/JS personal portfolio website in 2 hours total, across 3 missions.
|
|
5
|
+
#
|
|
6
|
+
# Loaded by @kidsinai/kids-opencode-plugin when KIDS_COURSE_PACK=portfolio-site.
|
|
7
|
+
|
|
8
|
+
id: portfolio-site
|
|
9
|
+
version: 0.1.0
|
|
10
|
+
title: "My personal portfolio website"
|
|
11
|
+
short_description: "Build a one-page site about you โ your hobbies, projects, what you care about."
|
|
12
|
+
target_age_band: "12+"
|
|
13
|
+
estimated_duration_minutes: 120
|
|
14
|
+
estimated_stars_budget: 40
|
|
15
|
+
|
|
16
|
+
learning_objectives:
|
|
17
|
+
- "Understand the basic anatomy of an HTML document (head, body, headings, paragraphs)"
|
|
18
|
+
- "Use CSS to apply colour, typography, and layout"
|
|
19
|
+
- "Use a small amount of JavaScript to add interactivity (a button that does something)"
|
|
20
|
+
- "Experience the agent-mentor workflow: plan, approve, observe, iterate"
|
|
21
|
+
- "Produce a single-file deliverable you can open in your browser and share with family"
|
|
22
|
+
|
|
23
|
+
prerequisites:
|
|
24
|
+
- "Can read English at year-6 level"
|
|
25
|
+
- "Can use a terminal to type a command (with help)"
|
|
26
|
+
- "Knows what a web page is"
|
|
27
|
+
- "Has Kids OpenCode installed (`kids-opencode --version` works)"
|
|
28
|
+
|
|
29
|
+
missions:
|
|
30
|
+
- id: mission-1
|
|
31
|
+
title: "Project setup + first HTML page"
|
|
32
|
+
estimated_minutes: 30
|
|
33
|
+
estimated_stars: 10
|
|
34
|
+
file: mission-1/brief.md
|
|
35
|
+
acceptance: mission-1/acceptance.yml
|
|
36
|
+
- id: mission-2
|
|
37
|
+
title: "Style your page with CSS"
|
|
38
|
+
estimated_minutes: 45
|
|
39
|
+
estimated_stars: 15
|
|
40
|
+
file: mission-2/brief.md
|
|
41
|
+
acceptance: mission-2/acceptance.yml
|
|
42
|
+
- id: mission-3
|
|
43
|
+
title: "Add an interactive button"
|
|
44
|
+
estimated_minutes: 45
|
|
45
|
+
estimated_stars: 15
|
|
46
|
+
file: mission-3/brief.md
|
|
47
|
+
acceptance: mission-3/acceptance.yml
|
|
48
|
+
|
|
49
|
+
system_prompt_overlay: |
|
|
50
|
+
You are running the "My personal portfolio website" Course Pack with a kid who has likely never coded before.
|
|
51
|
+
|
|
52
|
+
Cultural context: this is a creative project about who the kid is. Encourage them to put their own personality
|
|
53
|
+
into it. Their favourite colours, their hobbies, the things they care about.
|
|
54
|
+
|
|
55
|
+
Pacing rules specific to this pack:
|
|
56
|
+
- Mission 1 should feel like a quick win โ within 5 minutes of starting, the kid should see something
|
|
57
|
+
real in their browser. Even just "Hello, my name is โฆ" rendered in big text counts.
|
|
58
|
+
- Mission 2 should let the kid express themselves visually. Encourage real choices about colours and
|
|
59
|
+
fonts; don't impose your defaults.
|
|
60
|
+
- Mission 3 introduces a tiny bit of JavaScript. Aim for celebration when their button works.
|
|
61
|
+
- At the end of each mission, briefly celebrate. "Look at what you made!" โ concretely.
|
|
62
|
+
|
|
63
|
+
When the kid asks "what should I write about", offer a few prompts they can pick from:
|
|
64
|
+
- "What's a hobby you've gotten into recently?"
|
|
65
|
+
- "What's something you're proud of making or doing?"
|
|
66
|
+
- "If you could teach a friend one thing, what would it be?"
|
|
67
|
+
Don't put words in their mouth โ let them choose.
|
|
68
|
+
|
|
69
|
+
Allowed tools: read, write, edit, glob, grep. Don't try to fetch anything from the web during this pack.
|
|
70
|
+
Don't use shell commands (you can't anyway).
|
|
71
|
+
|
|
72
|
+
teacher_notes:
|
|
73
|
+
- "Pre-pack: ensure each kid has a project folder with write permissions"
|
|
74
|
+
- "If a workshop: project folders in `~/portfolio-{kidname}/`"
|
|
75
|
+
- "Plan for 20 minutes of buffer at the end for show-and-tell"
|
|
76
|
+
- "Common stuck point in Mission 2: kids spend 20 minutes on colour choice โ give them a 5-min limit"
|
|
77
|
+
- "Common stuck point in Mission 3: JavaScript syntax errors โ agent will help but teacher should be ready"
|
|
78
|
+
|
|
79
|
+
revision_history:
|
|
80
|
+
- version: 0.1.0
|
|
81
|
+
date: 2026-05-15
|
|
82
|
+
note: "Initial Course Pack. Engineering-side draft."
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json.schemastore.org/package.json",
|
|
3
|
+
"name": "@kidsinai/kids-opencode-plugin",
|
|
4
|
+
"version": "0.0.1",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"description": "opencode plugin that turns opencode into a kid-safe coding mentor: kid-safe system prompt, tool whitelist (no shell), DeepRouter routing, audit emission.",
|
|
7
|
+
"license": "MIT",
|
|
8
|
+
"homepage": "https://github.com/kidsinai/kids-opencode",
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "https://github.com/kidsinai/kids-opencode.git",
|
|
12
|
+
"directory": "packages/kids-plugin"
|
|
13
|
+
},
|
|
14
|
+
"keywords": ["opencode", "opencode-plugin", "kids", "education", "k-12", "agentic"],
|
|
15
|
+
"exports": {
|
|
16
|
+
".": {
|
|
17
|
+
"import": "./src/index.ts",
|
|
18
|
+
"types": "./src/index.ts"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"src",
|
|
23
|
+
"course-packs",
|
|
24
|
+
"README.md",
|
|
25
|
+
"LICENSE"
|
|
26
|
+
],
|
|
27
|
+
"scripts": {
|
|
28
|
+
"typecheck": "tsc --noEmit",
|
|
29
|
+
"test": "bun test"
|
|
30
|
+
},
|
|
31
|
+
"peerDependencies": {
|
|
32
|
+
"@opencode-ai/plugin": ">=1.14.0",
|
|
33
|
+
"@opencode-ai/sdk": ">=1.14.0"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@opencode-ai/plugin": "^1.14.51",
|
|
37
|
+
"@opencode-ai/sdk": "^1.14.51",
|
|
38
|
+
"typescript": "^5.7.0"
|
|
39
|
+
},
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"yaml": "^2.9.0"
|
|
42
|
+
}
|
|
43
|
+
}
|