Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 55 additions & 0 deletions .claude/skills/curik/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
---
description: Curik curriculum development tool dispatcher
---

# /curik

Dispatch to the Curik curriculum development tool. Parse the argument
after `/curik` and run the matching CLI command via Bash from the table below.

If `/curik` is called with **no arguments**, display this help listing
to the user and stop — do not execute any command.

## Available commands

| Command | Description | CLI call |
|---------|-------------|----------|
| `/curik status` | Show current project phase, open issues, active plans | `Bash("curik status --json")` |
| `/curik spec` | Display the current course specification | `Bash("curik spec get")` |
| `/curik phase` | Show the current development phase | `Bash("curik phase get --json")` |
| `/curik validate <path>` | Validate a lesson file | `Bash("curik validate lesson <path> --json")` |
| `/curik publish` | Run publish check, fix issues, and push | See **Publish workflow** below |
| `/curik publish check` | Quick readiness check (no push) | `Bash("curik publish check --json")` |
| `/curik publish guide` | Show full publishing setup guide | `Bash("curik publish guide")` |

Pass any remaining text after the subcommand as the argument to the
CLI command (e.g., `/curik validate content/01-intro/01-hello.md`).

## Publish workflow

When the user runs `/curik publish`, execute these steps in order:

1. **Run readiness check**: `Bash("curik publish check --json")`.
2. **Fix what you can**: If any checks fail:
- Missing `course.yml` fields → fill them in with `Bash("curik config update '<json>'")`,
using your best inference from the course content. Present the values to
the user with `AskUserQuestion` for confirmation.
- Missing `.gitignore` or workflow → run `Bash("curik init")`.
- Wrong `baseURL` → run `Bash("curik hugo setup")`.
- Hugo build fails → investigate and fix the build errors.
3. **Re-check**: Run `Bash("curik publish check --json")` again to confirm all green.
4. **Bump version**: Run `Bash("curik hugo bump-version --json")` to update the
curriculum version in `hugo.toml`. This uses the format `0.YYYYMMDD.revision`.
5. **Commit**: Stage and commit all changes including the version bump.
6. **Push**: Run `git push` to deploy. The GitHub Actions workflow handles
the rest (build + deploy to GitHub Pages).
7. **Report**: Show the user the target URL, the new version number, and
remind them to check the post-publish checklist from `Bash("curik publish guide")`.

If a check fails that you cannot fix (e.g., no content, GitHub Pages not
enabled), use `AskUserQuestion` to tell the user what's needed.

## General guidance

Load the `start-curik` agent definition to begin the curriculum development
workflow.
3 changes: 3 additions & 0 deletions .course/overview.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Course Overview

TBD
3 changes: 3 additions & 0 deletions .course/research.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Research Findings

TBD
45 changes: 45 additions & 0 deletions .course/spec.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# Curik Course Specification

## Course Concept
**Course:** Python Games

**Audience:** Students who have completed Python Apprentice (or have equivalent foundational Python skills: variables, control flow, functions, lists, basic classes). Tier 3, grades 6–10.

**Premise:** Students learn intermediate Python by reading, modifying, and building games with Pygame. Rather than a traditional sequence of "teach concept → exercise," the course is project- and code-reading driven: each module presents working Pygame programs that students study, extend, and remix.

**Pedagogical stance:**
- Code reading is a first-class skill. Most learning happens by analyzing existing programs in the `examples/` and `games/` directories.
- Concepts (vectors, sprites, collisions, surfaces, OOP) are introduced as tools needed to understand and modify game code, not as standalone academic units.
- Game projects (Flappy Bird, Space Invaders, Mars Lander, Alien Invaders, Chimp) give students concrete artifacts to build, debug, and demo.

**Module structure (existing):**
- 00 Getting Started — Codespaces, virtual screen, Pygame setup
- 01 Physics for Games — motion, gravity, frame loops
- 02 Classes and Objects — OOP for game entities
- 03 Vectors — 2D vector math
- 04 Sprites — Pygame sprite system
- 05 Collisions — collision detection
- 06 Surfaces — drawing, blitting, images
- 07 Projects — full-game capstones (Flappy Bird, Space Invaders, etc.)

**Outcomes:** A student who completes Python Games can read a non-trivial Pygame program, explain what it does, modify it, and build a small original game using sprites, collisions, and basic physics.

**Estimated duration:** 36 weeks.

## Pedagogical Model
TBD

## Research Summary
TBD

## Alignment Decision
TBD

## Course Structure Outline
TBD

## Assessment Plan
TBD

## Technical Decisions
TBD
5 changes: 5 additions & 0 deletions .course/state.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"phase": "phase1",
"sub_phase": "1b",
"type": "course"
}
3 changes: 0 additions & 3 deletions .devcontainer/Dockerfile

This file was deleted.

19 changes: 4 additions & 15 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,32 +3,22 @@
{
"name": "Python 3",

// This is the default
// "image": "mcr.microsoft.com/devcontainers/universal:2",

// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
//"image": "mcr.microsoft.com/devcontainers/python:1-${templateOption:imageVariant}",
//"image": "mcr.microsoft.com/devcontainers/python:1-3.12-bookworm",

"build": {
"dockerfile": "Dockerfile",
"context": ".."
},
"image": "mcr.microsoft.com/devcontainers/python:1-3.12-bookworm",

"containerEnv": {
"VNC_RESOLUTION": "600x600x16",
"SDL_VIDEO_WINDOW_POS": "0,0", // GUI Windows all the way in the upper left.
"SDL_AUDIODRIVER": "dummy" // Disable audio
},

// Features to add to the dev container. More info: https://containers.dev/features.
"features": {
"ghcr.io/devcontainers/features/desktop-lite:1": {
"./features/desktop-lite": {
"password" : "code4life"
}
},



// Use 'forwardPorts' to make a list of ports inside the container available locally.
"forwardPorts": [6080, 5901],

Expand All @@ -48,8 +38,7 @@
"customizations": {
"codespaces": {
"openFiles": [
//"lessons/00_Turtles/01_Get_Started.ipynb"
"README.md"
"lessons/00_Getting_Started/README.md"
]
},
"vscode": {
Expand Down
81 changes: 81 additions & 0 deletions .devcontainer/features/desktop-lite/NOTES.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
## Connecting to the desktop

This feature provides two ways of connecting to the desktop environment it adds. The first is to connect using a web browser. To do so:

1. Forward the noVNC port (`6080` by default) to your local machine using either the `forwardPorts` property in `devcontainer.json` or the user interface in your tool (e.g., you can press <kbd>F1</kbd> or <kbd>Ctrl/Cmd</kbd>+<kbd>Shift</kbd>+<kbd>P</kbd> and select **Ports: Focus on Ports View** in VS Code to bring it into focus).
1. Open the ports view in your tool, select the noVNC port, and click the Globe icon.
1. In the browser that appears, click the **Connect** button and enter the desktop password (`vscode` by default).

To set up the `6080` port from your `devcontainer.json` file, include the following:
```json
"forwardPorts": [6080],
"portsAttributes": {
"6080": {
"label": "desktop"
}
}
```

You can also connect to the desktop using a [VNC viewer](https://www.realvnc.com/en/connect/download/viewer/). To do so:

1. Connect to the environment from a desktop tool that supports the dev container spec (e.g., VS Code client).
1. Forward the VNC server port (`5901` by default) to your local machine using either the `forwardPorts` property in `devcontainer.json` or the user interface in your tool (e.g., you can press <kbd>F1</kbd> or <kbd>Ctrl/Cmd</kbd>+<kbd>Shift</kbd>+<kbd>P</kbd> and select **Ports: Focus on Ports View** in VS Code to bring it into focus). If you are using the [Dev Container CLI](https://github.com/devcontainers/cli), you should instead use the `appPort` property in `devcontainer.json`.
1. Start your VNC Viewer and connect to localhost:5901. Note that you may need to bump up the color depth to 24 bits to see full color.
1. Enter the desktop password (`vscode` by default).

## Customizing Fluxbox

The window manager installed is [Fluxbox](http://fluxbox.org/). **Right-click** to see the application menu. In addition, any UI-based commands you execute inside the dev container will automatically appear on the desktop.

You can customize the desktop using Fluxbox configuration files. The configuration files are located in the `.fluxbox` folder of the home directory of the user you using to connect to the dev container (`$HOME/.fluxbox`).

If you add custom content to your base image or a Dockerfile in this location, the Feature will automatically use it rather than its default configuration.

See the [Fluxbox menu documentation](http://www.fluxbox.org/help/man-fluxbox-menu.php) for format details. More information on additional customization can be found in Fluxbox's [help](http://www.fluxbox.org/help/) and [general](http://fluxbox.sourceforge.net/docbook/en/html/book1.html) documentation.

## Resolving crashes

If you run into applications crashing, you may need to increase the size of the shared memory space allocated to your container. For example, this will bump it up to 1 GB in `devcontainer.json`:

```json
"runArgs": ["--shm-size=1g"]
```

Or using Docker Compose:

```yaml
services:
your-service-here:
# ...
shm_size: '1gb'
# ...
```

## Installing a browser

If you need a browser, you can install **Firefox ESR** by adding the following to `.devcontainer/Dockerfile`:

```Dockerfile
RUN apt-get update && export DEBIAN_FRONTEND=noninteractive && apt-get install -y firefox-esr
```

If you want the full version of **Google Chrome** in the desktop:

1. Add the following to `.devcontainer/Dockerfile`

```Dockerfile
RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
&& curl -sSL https://dl.google.com/linux/direct/google-chrome-stable_current_$(dpkg --print-architecture).deb -o /tmp/chrome.deb \
&& apt-get -y install /tmp/chrome.deb
```

2. Chrome sandbox support requires you set up and run as a non-root user. The [`common-utils`](https://github.com/devcontainers/features/tree/main/src/common-utils) script can do this for you, or you [set one up yourself](https://aka.ms/vscode-remote/containers/non-root). Alternatively, you can start Chrome using `google-chrome --no-sandbox`

That's it!


## OS Support

This Feature should work on recent versions of Debian/Ubuntu-based distributions with the `apt` package manager installed.

`bash` is required to execute the `install.sh` script.
109 changes: 109 additions & 0 deletions .devcontainer/features/desktop-lite/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@

# Light-weight Desktop (desktop-lite)

Adds a lightweight Fluxbox based desktop to the container that can be accessed using a VNC viewer or the web. GUI-based commands executed from the built-in VS code terminal will open on the desktop automatically.

## Example Usage

```json
"features": {
"ghcr.io/devcontainers/features/desktop-lite:1": {}
}
```

## Options

| Options Id | Description | Type | Default Value |
|-----|-----|-----|-----|
| version | Currently Unused! | string | latest |
| noVncVersion | The noVNC version to use | string | 1.2.0 |
| password | Enter a password for desktop connections. If "noPassword", connections from the local host can be established without entering a password | string | vscode |
| webPort | Enter a port for the VNC web client (noVNC) | string | 6080 |
| vncPort | Enter a port for the desktop VNC server (TigerVNC) | string | 5901 |

## Connecting to the desktop

This feature provides two ways of connecting to the desktop environment it adds. The first is to connect using a web browser. To do so:

1. Forward the noVNC port (`6080` by default) to your local machine using either the `forwardPorts` property in `devcontainer.json` or the user interface in your tool (e.g., you can press <kbd>F1</kbd> or <kbd>Ctrl/Cmd</kbd>+<kbd>Shift</kbd>+<kbd>P</kbd> and select **Ports: Focus on Ports View** in VS Code to bring it into focus).
1. Open the ports view in your tool, select the noVNC port, and click the Globe icon.
1. In the browser that appears, click the **Connect** button and enter the desktop password (`vscode` by default).

To set up the `6080` port from your `devcontainer.json` file, include the following:
```json
"forwardPorts": [6080],
"portsAttributes": {
"6080": {
"label": "desktop"
}
}
```

You can also connect to the desktop using a [VNC viewer](https://www.realvnc.com/en/connect/download/viewer/). To do so:

1. Connect to the environment from a desktop tool that supports the dev container spec (e.g., VS Code client).
1. Forward the VNC server port (`5901` by default) to your local machine using either the `forwardPorts` property in `devcontainer.json` or the user interface in your tool (e.g., you can press <kbd>F1</kbd> or <kbd>Ctrl/Cmd</kbd>+<kbd>Shift</kbd>+<kbd>P</kbd> and select **Ports: Focus on Ports View** in VS Code to bring it into focus). If you are using the [Dev Container CLI](https://github.com/devcontainers/cli), you should instead use the `appPort` property in `devcontainer.json`.
1. Start your VNC Viewer and connect to localhost:5901. Note that you may need to bump up the color depth to 24 bits to see full color.
1. Enter the desktop password (`vscode` by default).

## Customizing Fluxbox

The window manager installed is [Fluxbox](http://fluxbox.org/). **Right-click** to see the application menu. In addition, any UI-based commands you execute inside the dev container will automatically appear on the desktop.

You can customize the desktop using Fluxbox configuration files. The configuration files are located in the `.fluxbox` folder of the home directory of the user you using to connect to the dev container (`$HOME/.fluxbox`).

If you add custom content to your base image or a Dockerfile in this location, the Feature will automatically use it rather than its default configuration.

See the [Fluxbox menu documentation](http://www.fluxbox.org/help/man-fluxbox-menu.php) for format details. More information on additional customization can be found in Fluxbox's [help](http://www.fluxbox.org/help/) and [general](http://fluxbox.sourceforge.net/docbook/en/html/book1.html) documentation.

## Resolving crashes

If you run into applications crashing, you may need to increase the size of the shared memory space allocated to your container. For example, this will bump it up to 1 GB in `devcontainer.json`:

```json
"runArgs": ["--shm-size=1g"]
```

Or using Docker Compose:

```yaml
services:
your-service-here:
# ...
shm_size: '1gb'
# ...
```

## Installing a browser

If you need a browser, you can install **Firefox ESR** by adding the following to `.devcontainer/Dockerfile`:

```Dockerfile
RUN apt-get update && export DEBIAN_FRONTEND=noninteractive && apt-get install -y firefox-esr
```

If you want the full version of **Google Chrome** in the desktop:

1. Add the following to `.devcontainer/Dockerfile`

```Dockerfile
RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
&& curl -sSL https://dl.google.com/linux/direct/google-chrome-stable_current_$(dpkg --print-architecture).deb -o /tmp/chrome.deb \
&& apt-get -y install /tmp/chrome.deb
```

2. Chrome sandbox support requires you set up and run as a non-root user. The [`common-utils`](https://github.com/devcontainers/features/tree/main/src/common-utils) script can do this for you, or you [set one up yourself](https://aka.ms/vscode-remote/containers/non-root). Alternatively, you can start Chrome using `google-chrome --no-sandbox`

That's it!


## OS Support

This Feature should work on recent versions of Debian/Ubuntu-based distributions with the `apt` package manager installed.

`bash` is required to execute the `install.sh` script.


---

_Note: This file was auto-generated from the [devcontainer-feature.json](https://github.com/devcontainers/features/blob/main/src/desktop-lite/devcontainer-feature.json). Add additional notes to a `NOTES.md`._
16 changes: 16 additions & 0 deletions .devcontainer/features/desktop-lite/VENDORED_FROM.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Vendored Source

This directory is a vendored copy of the Dev Container feature:
- Feature: `desktop-lite`
- Upstream repo: `https://github.com/devcontainers/features`
- Upstream path: `src/desktop-lite`
- Upstream commit: `6c375f1d65510836760bef052f4614a0df974946`

## Update Procedure

1. Clone or fetch `https://github.com/devcontainers/features`.
2. Copy `src/desktop-lite/*` into this directory.
3. Review `install.sh` for apt repository key changes.
4. Rebuild the dev container and verify desktop startup.

This copy is intentionally pinned to avoid unexpected upstream behavior changes.
Loading