Dev Commands Reference
Complete reference for the kubeasy dev commands used by challenge creators to scaffold, deploy, validate, and iterate on challenges locally.
The kubeasy dev commands are designed for challenge creators. They let you work entirely locally — no API login, no OCI registry, no backend required.
Recommended workflow
A typical challenge development loop looks like this:
# 1. Scaffold a new challenge
kubeasy dev create
# 2. Edit challenge.yaml, manifests/, and policies/
# (use your editor of choice)
# 3. Lint your challenge.yaml (no cluster needed)
kubeasy dev lint
# 4. Deploy to the Kind cluster and run validations
kubeasy dev test --clean
# 5. Iterate: watch mode re-runs validations on every change
kubeasy dev apply --watch # in one terminal
kubeasy dev validate --watch # in another terminal
# 6. Check pod state and logs while debugging
kubeasy dev status
kubeasy dev logs --follow
# 7. Clean up when done
kubeasy dev cleanCommand reference
kubeasy dev create
Scaffold a new challenge directory with a challenge.yaml template and the required folder structure (manifests/, policies/).
In interactive mode (TTY), prompts guide you through the setup. In non-interactive mode, use flags.
Flags:
| Flag | Type | Default | Description |
|---|---|---|---|
--name | string | Challenge name | |
--slug | string | Challenge slug (auto-generated from name if omitted) | |
--type | string | Challenge type (fix, build, migrate) | |
--theme | string | Challenge theme | |
--difficulty | string | Difficulty (easy, medium, hard) | |
--estimated-time | int | 30 | Estimated time in minutes |
--with-manifests | bool | false | Generate starter deployment and service manifests |
Usage:
kubeasy dev create
kubeasy dev create --name "Pod Evicted" --type fix --theme resources-scaling --difficulty easy
kubeasy dev create --name "My Challenge" --with-manifestsExample (interactive):
$ kubeasy dev create
Challenge name: Pod Evicted
Slug [pod-evicted]:
Type (fix/build/migrate): fix
Theme: resources-scaling
Difficulty (easy/medium/hard): easy
Estimated time (minutes) [30]: 15
Created challenge directory: pod-evicted/
pod-evicted/challenge.yaml
pod-evicted/manifests/
pod-evicted/policies/kubeasy dev get
Display local challenge metadata by reading challenge.yaml from the local directory. No cluster or API required.
This is the dev equivalent of kubeasy challenge get.
Flags:
| Flag | Type | Default | Description |
|---|---|---|---|
--dir | string | Path to challenge directory (default: auto-detect) |
Usage:
kubeasy dev get
kubeasy dev get --dir ./my-challengeExample:
$ kubeasy dev get
Pod Evicted
Slug: pod-evicted
Type: fix
Theme: resources-scaling
Difficulty: easy
Est. time: 15 min
Objectives: 2
Description:
A data processing pod keeps crashing and getting evicted.
It was working fine yesterday.
Initial Situation:
A data processing application is deployed as a single pod.
The pod starts but gets killed after a few seconds.
Objective:
Make the pod run stably without being evicted.
Validation Objectives
ORDER KEY TITLE TYPE
1 pod-running Pod Ready condition
2 no-crash-events Stable Op. eventkubeasy dev lint
Validate the structure and content of a challenge.yaml file. Checks required fields, valid values, objective structure, and manifests directory. No cluster needed.
Flags:
| Flag | Type | Default | Description |
|---|---|---|---|
--dir | string | Path to challenge directory (default: auto-detect) |
Usage:
kubeasy dev lint
kubeasy dev lint --dir ./my-challengeExample (passing):
$ kubeasy dev lint
Linting challenge: pod-evicted
✓ All checks passed (0 errors, 0 warnings)Example (with issues):
$ kubeasy dev lint
Linting challenge: pod-evicted
✗ ERROR: missing required field "objective"
⚠ WARNING: estimated_time is 0, consider setting a value
1 error, 1 warningkubeasy dev apply
Deploy local challenge manifests to the Kind cluster. This is the dev equivalent of kubeasy challenge start but reads from the local filesystem instead of the OCI registry. No API login required.
If an image/ directory exists, the Docker image is built and loaded into the Kind cluster automatically.
Flags:
| Flag | Type | Default | Description |
|---|---|---|---|
--dir | string | Path to challenge directory (default: auto-detect) | |
--clean | bool | false | Delete existing resources before applying |
--watch, -w | bool | false | Watch for file changes and auto-redeploy |
Usage:
kubeasy dev apply
kubeasy dev apply --clean
kubeasy dev apply --watchExample:
$ kubeasy dev apply --clean
Applying challenge: pod-evicted
Cleaning existing resources
Creating namespace pod-evicted
Applying manifests
Kubectl context configured
Challenge deployed!
Namespace: pod-evictedkubeasy dev validate
Run challenge validations against the Kind cluster and display results. Does not send results to the API. No login required.
Flags:
| Flag | Type | Default | Description |
|---|---|---|---|
--dir | string | Path to challenge directory (default: auto-detect) | |
--watch, -w | bool | false | Re-run validations every 5 seconds |
--fail-fast | bool | false | Stop at the first validation failure |
--json | bool | false | Output results as JSON |
Usage:
kubeasy dev validate
kubeasy dev validate --watch
kubeasy dev validate --fail-fast --jsonExample:
$ kubeasy dev validate
Validating challenge: pod-evicted
Condition Validation
pod-running: PASSED - All condition checks passed
Event Validation
no-crash-events: PASSED - No forbidden events found
All validations passed! (2/2)JSON output (for CI):
$ kubeasy dev validate --json{
"passed": true,
"results": [
{"key": "pod-running", "passed": true, "message": "All condition checks passed"},
{"key": "no-crash-events", "passed": true, "message": "No forbidden events found"}
]
}kubeasy dev test
Apply manifests and run validations in one step. Equivalent to running kubeasy dev apply followed by kubeasy dev validate.
Flags:
| Flag | Type | Default | Description |
|---|---|---|---|
--dir | string | Path to challenge directory (default: auto-detect) | |
--clean | bool | false | Delete existing resources before applying |
--watch, -w | bool | false | Re-run validations every 5 seconds after apply |
--fail-fast | bool | false | Stop at the first validation failure |
--json | bool | false | Output results as JSON |
Usage:
kubeasy dev test
kubeasy dev test --clean
kubeasy dev test --clean --watchExample:
$ kubeasy dev test --clean
Applying challenge: pod-evicted
Cleaning existing resources
Creating namespace pod-evicted
Applying manifests
Validating challenge: pod-evicted
Condition Validation
pod-running: PASSED - All condition checks passed
Event Validation
no-crash-events: PASSED - No forbidden events found
All validations passed! (2/2)kubeasy dev status
Show pods, recent events, and objective count for a deployed challenge. Requires the challenge to be deployed in the Kind cluster.
Flags:
| Flag | Type | Default | Description |
|---|---|---|---|
--dir | string | Path to challenge directory (default: auto-detect) |
Usage:
kubeasy dev statusExample:
$ kubeasy dev status
Pods
NAME STATUS READY RESTARTS AGE
data-processor-abc12 Running 1/1 0 2m
Events (last 5m)
AGE TYPE REASON MESSAGE
2m Normal Pulled Successfully pulled image "myapp:latest"
2m Normal Started Started container app
Objectives: 3kubeasy dev logs
Stream logs from pods in the challenge namespace. Attempts to find relevant pods from challenge.yaml label selectors, falling back to all pods.
Flags:
| Flag | Type | Default | Description |
|---|---|---|---|
--dir | string | Path to challenge directory (default: auto-detect) | |
--follow, -f | bool | false | Follow log output (stream continuously) |
--container, -c | string | Target a specific container | |
--tail | int | 50 | Number of recent log lines to show |
Usage:
kubeasy dev logs
kubeasy dev logs --follow
kubeasy dev logs --tail 100 --container appExample:
$ kubeasy dev logs --follow
[data-processor-abc12] 2024-01-15T10:30:00Z Starting data processor...
[data-processor-abc12] 2024-01-15T10:30:01Z Connected to database
[data-processor-abc12] 2024-01-15T10:30:02Z Processing batch 1/10...kubeasy dev clean
Remove all Kubernetes resources for a dev challenge (deletes the namespace). No API login required.
This is the dev equivalent of kubeasy challenge clean.
Usage:
kubeasy dev cleanExample:
$ kubeasy dev clean
Cleaning challenge: pod-evicted
Deleting namespace pod-evicted
Challenge 'pod-evicted' cleaned successfully!