Skip to content
Merged
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
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# OpsQuest agent guide

OpsQuest is a Go 1.22 CLI game with 19 in-memory Linux missions and an optional Docker Foundations lab. Linux player commands stay inside the teaching shell. Docker input is parsed into a deliberately small command subset that can affect only disposable, OpsQuest-labeled resources. Kubernetes remains future scope unless a task explicitly adds it.
OpsQuest is a Go 1.22 CLI game with 23 in-memory Linux missions and six optional Docker Foundations labs. Linux player commands stay inside the teaching shell. Docker input is parsed into a deliberately small command subset that can affect only disposable, OpsQuest-labeled resources. Kubernetes remains future scope unless a task explicitly adds it.

## Repository map

Expand Down
14 changes: 7 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@
OpsQuest is **Duolingo meets a terminal sandbox**: a Go CLI game that teaches Linux and container operations through short, story-driven missions.

```console
$ opsquest play --once 4
$ opsquest play --once 5

MISSION 04: The Missing Log File
MISSION 05: The Missing Log File
================================
Linux · World 1/4: First Day · Stage 4/5
Linux · World 1/4: First Day · Stage 5/6
Difficulty: beginner · Reward: 75 XP

INCIDENT
Expand All @@ -29,8 +29,8 @@ OpsQuest validates the result, not a prescribed command. Equivalent supported so

## What is included

- 19 Linux missions across four ordered learning worlds
- One optional, disposable Docker Foundations mission
- 23 Linux missions across four ordered learning worlds
- Six optional, disposable Docker Foundations missions
- An isolated in-memory filesystem, environment, process table, and archives
- Quote-aware globs and variables, pipelines, redirection, and command history
- A compact virtual `vi` and bounded virtual shell scripts
Expand Down Expand Up @@ -77,15 +77,15 @@ Linux gameplay never requires a container engine. Docker Foundations works with
```console
$ docker pull docker.io/library/busybox@sha256:73aaf090f3d85aa34ee199857f03fa3a95c8ede2ffd4cc2cdb5b94e566b11662
$ opsquest doctor
$ opsquest play 17
$ opsquest play 20
```

On macOS, you can direct both setup and gameplay to OrbStack without changing your global Docker context:

```console
$ DOCKER_CONTEXT=orbstack docker pull docker.io/library/busybox@sha256:73aaf090f3d85aa34ee199857f03fa3a95c8ede2ffd4cc2cdb5b94e566b11662
$ DOCKER_CONTEXT=orbstack opsquest doctor
$ DOCKER_CONTEXT=orbstack opsquest play 17
$ DOCKER_CONTEXT=orbstack opsquest play 20
```

OpsQuest never pulls the image automatically. The OrbStack context uses the same constrained Docker integration and cleanup path as every other compatible engine. See [Docker Foundations](docs/play/docker-foundations.md) for setup details, the teaching subset, and the isolation boundary.
Expand Down
4 changes: 2 additions & 2 deletions docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ The game describes an observable objective, gives you a disposable environment,

## Current scope

- 19 Linux missions across four ordered learning worlds
- One optional Docker Foundations mission
- 23 Linux missions across four ordered learning worlds
- Six optional Docker Foundations missions
- Outcome-based validation rather than one required command transcript
- An in-memory filesystem, process table, environment, archives, editor, and shell scripts
- Persistent XP, ranks, command practice, hints, completions, and achievements
Expand Down
63 changes: 36 additions & 27 deletions docs/game/curriculum.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@ Editable source: [`learning-journey.excalidraw`](diagrams/learning-journey.excal

The curriculum has two independent tracks:

- **Linux:** 19 missions across four ordered worlds. Bare `opsquest play` follows this track.
- **Docker:** one optional Foundations mission in its first world. Docker readiness never blocks Linux play.
- **Linux:** 23 missions across four ordered worlds. Bare `opsquest play` follows this track.
- **Docker:** six optional Foundations missions in one beginner world. Docker readiness never blocks Linux play.

Mission numbers are stable and global across both tracks, which is why the Docker mission is number 17 while Linux World 4 resumes at number 18. World and stage positions are derived separately inside each track.
Display numbers are global across both tracks: Docker occupies Missions 20–25 and Linux World 4 resumes at Mission 26. World and stage positions are derived separately inside each track. Persisted completions use stable mission IDs rather than display numbers, so profiles created before this expansion remain compatible.

The [learning philosophy](learning-philosophy.md) explains the incident loop and feedback model. [Outcome-based mission design](mission-design.md) describes how validators preserve equivalent solutions.

Expand All @@ -31,50 +31,59 @@ The “tools” column records suggested commands, not a mandatory solution. Out
| ---: | --- | --- | --- | --- | --- |
| 1 | Linux W1.1 | Beginner | Identify the current directory | `pwd` | Output equals |
| 2 | Linux W1.2 | Beginner | Inspect and navigate a directory tree | `pwd`, `ls`, `cd` | Current directory equals |
| 3 | Linux W1.3 | Beginner | Create directories and files | `ls`, `mkdir`, `touch` | Directory and file exist |
| 4 | Linux W1.4 | Beginner | Search recursively and filter matching files | `find`, `grep` | Output contains all required paths and excludes noise |
| 5 | Linux W1.5 | Beginner | Move a release artifact without losing content | `ls`, `mv`, `cp`, `rm` | Destination content equals; source is missing |
| 6 | Linux W2.1 | Beginner | Inspect and repair executable permissions | `ls`, `stat`, `chmod` | File mode equals |
| 7 | Linux W2.2 | Beginner | Inspect and export environment variables | `env`, `echo`, `export` | Environment value equals |
| 8 | Linux W2.3 | Intermediate | Inspect processes and stop the faulty one | `ps`, `kill` | Target stopped; healthy process still running |
| 9 | Linux W2.4 | Intermediate | Inspect and extract an archive | `ls`, `tar` | Extracted content contains and equals expected data |
| 10 | Linux W2.5 | Advanced | Build a multi-stage log-processing pipeline | `cat`, `grep`, `awk`, `sort`, `uniq` | Report file content equals |
| 11 | Linux W3.1 | Beginner | Select the newest log lines | `cat`, `tail` | Output equals |
| 12 | Linux W3.2 | Intermediate | Sort and aggregate repeated alerts | `cat`, `sort`, `uniq` | Report lines equal |
| 13 | Linux W3.3 | Intermediate | Repair configuration text while preserving mode | `cat`, `sed`, `vi` | Content and mode equal |
| 14 | Linux W3.4 | Intermediate | Correct ownership and permissions together | `stat`, `chown`, `chmod` | Owner and mode equal |
| 15 | Linux W3.5 | Intermediate | Compare disk usage and identify the right target | `ls`, `du`, `sort`, `tail` | Output includes target and excludes distractor |
| 16 | Linux W3.6 | Advanced | Resolve a multi-fault production incident | `tar`, `sed`, `vi`, `chmod`, `ps`, `kill` | Content, mode, and process-state checks |
| 17 | Docker W1.1 | Beginner | List mission containers and start a stopped service | `docker` | Owned container count equals; target is running |
| 18 | Linux W4.1 | Beginner | Make a focused configuration edit with a modal editor | `cat`, `vi` | Content and mode equal |
| 19 | Linux W4.2 | Intermediate | Repair, permit, and run a reusable report script | `cat`, `less`, `vi`, `sed`, `chmod`, `sh` | Report content/lines and script mode |
| 20 | Linux W4.3 | Advanced | Reason about child-shell directory and environment scope | `cat`, `less`, `vi`, `sed`, `chmod`, `sh`, `pwd`, `env` | Parent scope preserved; report and script state correct |
| 3 | Linux W1.3 | Beginner | Read the correct short handoff file | `ls`, `cat`, `less` | Output equals |
| 4 | Linux W1.4 | Beginner | Create directories and files | `ls`, `mkdir`, `touch` | Directory and file exist |
| 5 | Linux W1.5 | Beginner | Search recursively and filter matching files | `find`, `grep` | Output contains all required paths and excludes noise |
| 6 | Linux W1.6 | Beginner | Move a release artifact without losing content | `ls`, `mv`, `cp`, `rm` | Destination content equals; source is missing |
| 7 | Linux W2.1 | Beginner | Inspect and repair executable permissions | `ls`, `stat`, `chmod` | File mode equals |
| 8 | Linux W2.2 | Beginner | Inspect and export environment variables | `env`, `echo`, `export` | Environment value equals |
| 9 | Linux W2.3 | Beginner | Select the opening lines of a startup log | `cat`, `head` | Output equals |
| 10 | Linux W2.4 | Intermediate | Inspect processes and stop the faulty one | `ps`, `kill` | Target stopped; healthy process still running |
| 11 | Linux W2.5 | Intermediate | Inspect and extract an archive | `ls`, `tar` | Extracted content contains and equals expected data |
| 12 | Linux W2.6 | Advanced | Build a multi-stage log-processing pipeline | `cat`, `grep`, `awk`, `sort`, `uniq` | Report file content equals |
| 13 | Linux W3.1 | Beginner | Select the newest log lines | `cat`, `tail` | Output equals |
| 14 | Linux W3.2 | Beginner | Count error records through filtering or a pipeline | `grep`, `wc` | Output equals |
| 15 | Linux W3.3 | Intermediate | Sort and aggregate repeated alerts | `cat`, `sort`, `uniq` | Report lines equal |
| 16 | Linux W3.4 | Intermediate | Repair configuration text while preserving mode | `cat`, `sed`, `vi` | Content and mode equal |
| 17 | Linux W3.5 | Intermediate | Correct ownership and permissions together | `stat`, `chown`, `chmod` | Owner and mode equal |
| 18 | Linux W3.6 | Intermediate | Compare disk usage and identify the right target | `ls`, `du`, `sort`, `tail` | Output includes target and excludes distractor |
| 19 | Linux W3.7 | Advanced | Resolve a multi-fault production incident | `tar`, `sed`, `vi`, `chmod`, `ps`, `kill` | Content, mode, and process-state checks |
| 20 | Docker W1.1 | Beginner | List mission containers and start a stopped service | `docker` | Owned count equals; targets are running |
| 21 | Docker W1.2 | Beginner | Read bounded logs from an exited job | `docker` | Output equals recorded log |
| 22 | Docker W1.3 | Beginner | Identify a successful one-shot job by exit code | `docker` | Output contains logical name and exit code; count equals |
| 23 | Docker W1.4 | Beginner | Stop one worker while preserving metrics | `docker` | Target stopped; healthy target running; count equals |
| 24 | Docker W1.5 | Beginner | Restore two stopped services | `docker` | All targets running; count equals |
| 25 | Docker W1.6 | Beginner | Perform a mixed start/stop handoff | `docker` | Replacement running; retiring target stopped; count equals |
| 26 | Linux W4.1 | Beginner | Inspect and run a supplied report script | `cat`, `less`, `chmod`, `sh` | Report content equals |
| 27 | Linux W4.2 | Beginner | Make a focused configuration edit with a modal editor | `cat`, `vi` | Content and mode equal |
| 28 | Linux W4.3 | Intermediate | Repair, permit, and run a reusable report script | `cat`, `less`, `vi`, `sed`, `chmod`, `sh` | Report content/lines and script mode |
| 29 | Linux W4.4 | Advanced | Reason about child-shell directory and environment scope | `cat`, `less`, `vi`, `sed`, `chmod`, `sh`, `pwd`, `env` | Parent scope preserved; report and script state correct |

## World progression

### Linux World 1: First Day

The opening world establishes orientation and safe filesystem manipulation. It moves from observing location, through navigation and creation, to recursive search and a small state-changing incident. All five missions are beginner difficulty.
The opening world establishes orientation and safe filesystem manipulation. It moves from observing location, through navigation and reading, to creation, recursive search, and a small state-changing incident. All six missions are beginner difficulty.

### Linux World 2: The Logpocalypse

This world broadens the state model: permissions, environment, processes, and archives. Missions 6–7 remain beginner-friendly, Missions 8–9 combine inspection with mutation, and Mission 10 is the first advanced boss and sustained pipeline exercise.
This world broadens the state model: permissions, environment, focused log reading, processes, and archives. Its first three stages are beginner-friendly, the next two combine inspection with mutation, and Stage 6 is the first advanced boss and sustained pipeline exercise.

### Linux World 3: Production Friday

The third world reinforces text inspection and transformation while adding ownership and disk-usage reasoning. Its six stages culminate in a multi-fault incident that combines archive extraction, configuration repair, permissions, and process control.
The third world reinforces text inspection, counting, and transformation while adding ownership and disk-usage reasoning. Its seven stages culminate in a multi-fault incident that combines archive extraction, configuration repair, permissions, and process control.

### Linux World 4: The Automation Shift

The final Linux world moves from one-off commands to reusable automation. It introduces the modal editor, executable virtual scripts, and the difference between child-shell scope and durable virtual state.
The final Linux world moves from executing a supplied script to repairing reusable automation. It introduces the modal editor, executable virtual scripts, and the difference between child-shell scope and durable virtual state.

### Docker World 1: It Works on My Machine

Docker Foundations begins with the smallest useful lifecycle: discover the attempt's containers and start the intended stopped service. Logical aliases hide real container names and IDs, keeping the lesson focused on observable container state.
Docker Foundations progresses through listing, logs, sanitized exit status, targeted stop, multi-service recovery, and a mixed lifecycle handoff. Logical aliases hide real container names and IDs, keeping every lesson focused on observable state for exact attempt-owned resources.

## Curriculum evolution

The current map makes deliberate expansion opportunities visible: there is no dedicated early file-reading stage, the first substantial pipeline appears in an advanced boss, and Docker currently has only its opening lifecycle mission. Those are curriculum decisions to address with new declarative missions rather than by weakening existing validators.
The expanded map fills the early file-reading, focused log-preview, simple counting, supplied-script, and beginner Docker lifecycle gaps. Later curriculum work can deepen those skills through new declarative missions without weakening existing outcome validators or widening the Docker boundary casually.

Read [Progression and rewards](progression.md) for route and persistence behavior, and [Outcome-based mission design](mission-design.md) for the authoring checklist.

Expand Down
Loading
Loading