Test ECS core functionality (system registration, components, Transform sync, pause/step/resume, system toggle, entity discovery, snapshots) against the poke example using the iwsdk CLI.
67
81%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Run 8 test suites covering ECS system registration, component schemas, Transform sync, pause/step/resume, system toggle, entity discovery, snapshot/diff, and stability.
Configuration:
$IWSDK_REPO_ROOT/examples/pokeTool calls: every tool call is npx @iwsdk/cli <subcommand> [--input-json '<JSON>'] [--timeout <ms>], run from inside the example workspace (cwd $EXAMPLE_DIR). The CLI auto-discovers the IWSDK app root from cwd, so no path tricks are required. Run npx @iwsdk/cli mcp inspect from the example to discover available tools and their CLI subcommands.
<JSON> is a JSON object string. Omit --input-json if no arguments are needed.{ok, workspaceRoot, operation, result}. Parse it to check assertions.--timeout 20000 for operations that may take longer (reload, xr enter, screenshot).IMPORTANT: Run each Bash command one at a time. Parse the JSON output and verify assertions before moving to the next command. Do NOT chain multiple CLI commands together.
IMPORTANT: When the instructions say "wait N seconds", use sleep N as a separate Bash command.
cd $IWSDK_REPO_ROOT/examples/poke && npm run fresh:installWait for this to complete before proceeding.
Start the dev server as a background task using the Bash tool's run_in_background: true parameter:
cd $IWSDK_REPO_ROOT/examples/poke && npm run devIMPORTANT: This command MUST be run with run_in_background: true on the Bash tool — do NOT append & to the command itself.
Once the background task is launched, poll the output for Vite's ready message (up to 60s). You can also run npx @iwsdk/cli dev status from the example directory until state.running becomes true. You do not need to extract or manage the port yourself; subsequent commands resolve the active runtime through the CLI automatically.
If the server fails to start within 60 seconds, report FAIL for all suites and skip to Step 5.
npx @iwsdk/cli ecs systems 2>/dev/nullThis must return JSON with a list of systems. If it fails:
Run these commands in order:
Record the test start time immediately before reloading:
node -p 'Date.now()'Save the output as <test-start-ms>.
npx @iwsdk/cli browser reload --timeout 20000 2>/dev/null
Then: sleep 3
npx @iwsdk/cli xr enter --timeout 20000 2>/dev/null
Then: sleep 2
npx @iwsdk/cli browser logs --input-json '{"since":<test-start-ms>,"level":["error","warn"]}' 2>/dev/null
Assert: result should be empty or have no errors/warnings
Test 1.1: List All Systems
npx @iwsdk/cli ecs systems 2>/dev/nullAssert these framework systems are present with correct priorities:
| System | Priority |
|---|---|
LocomotionSystem | -5 |
InputSystem | -4 |
GrabSystem | -3 |
TransformSystem | 0 |
VisibilitySystem | 0 |
EnvironmentSystem | 0 |
LevelSystem | 0 |
AudioSystem | 0 |
PanelUISystem | -3.8 |
Also verify entity counts:
rayInteractables >= 1, pokeInteractables >= 1transform >= 5levelEntities >= 4Test 2.1: List All Components
npx @iwsdk/cli ecs components 2>/dev/nullAssert these components are present:
Transform with fields: position (Vec3), orientation (Vec4), scale (Vec3), parent (Entity)Visibility with field: isVisible (Boolean, default: true)LevelRoot (no fields — marker)LevelTag with field: id (String)PanelUI with field: config (String); this is the legacy raw-URL adapterAudioSource with fields: src (FilePath), volume (Float32)Test 2.2: Transform Default Values From the ecs_list_components output, verify Transform field defaults:
position default: [NaN, NaN, NaN]orientation default: [NaN, NaN, NaN, NaN]scale default: [NaN, NaN, NaN]Test 3.1: Modify Transform Position
Find an entity with LevelTag:
npx @iwsdk/cli ecs find --input-json '{"withComponents":["LevelTag"]}' 2>/dev/nullPick the first entity's entityIndex.
Get the scene hierarchy to find the entity's Object3D UUID:
npx @iwsdk/cli scene runtime-hierarchy --input-json '{"maxDepth":3}' 2>/dev/nullFind the node matching the entity index.
Get initial transform:
npx @iwsdk/cli scene transform --input-json '{"uuid":"<UUID>"}' 2>/dev/nullSet position via ECS:
npx @iwsdk/cli ecs set-component --input-json '{"entityIndex":<N>,"componentId":"Transform","field":"position","value":"[0, 2, -1]"}' 2>/dev/nullVerify Object3D moved:
npx @iwsdk/cli scene transform --input-json '{"uuid":"<UUID>"}' 2>/dev/nullAssert: localPosition matches [0, 2, -1] (within tolerance of 0.01).
Test 4.1: Pause
npx @iwsdk/cli ecs pause 2>/dev/nullAssert: paused === true, systemCount >= 12
Test 4.2: Step
npx @iwsdk/cli ecs step --input-json '{"count":5}' 2>/dev/nullAssert: framesAdvanced === 5
Test 4.3: Resume
npx @iwsdk/cli ecs resume 2>/dev/nullAssert: paused === false
Test 5.1: Pause a System
npx @iwsdk/cli ecs toggle-system --input-json '{"name":"GrabSystem","paused":true}' 2>/dev/nullAssert: isPaused === true
Test 5.2: Resume a System
npx @iwsdk/cli ecs toggle-system --input-json '{"name":"GrabSystem","paused":false}' 2>/dev/nullAssert: isPaused === false
Test 6.1: Find by Component
npx @iwsdk/cli ecs find --input-json '{"withComponents":["LevelRoot"]}' 2>/dev/nullAssert: exactly 1 entity
npx @iwsdk/cli ecs find --input-json '{"withComponents":["Transform"]}' 2>/dev/nullAssert: returns entities (count >= 5)
npx @iwsdk/cli ecs find --input-json '{"withComponents":["LevelTag"]}' 2>/dev/nullAssert: returns entities (count >= 4)
Test 6.2: Find by Name Pattern
npx @iwsdk/cli ecs find --input-json '{"namePattern":"LevelRoot"}' 2>/dev/nullAssert: matches entity named "LevelRoot"
Test 6.3: Exclude Components
npx @iwsdk/cli ecs find --input-json '{"withComponents":["Transform"],"withoutComponents":["LevelTag"]}' 2>/dev/nullAssert: returns only persistent entities (fewer than the full Transform set)
Test 7.1: Snapshot
npx @iwsdk/cli ecs snapshot --input-json '{"label":"baseline"}' 2>/dev/nullAssert: entityCount >= 5, componentCount >= 20
Test 7.2: Modify and Diff
Find an entity with LevelTag:
npx @iwsdk/cli ecs find --input-json '{"withComponents":["LevelTag"]}' 2>/dev/nullSet its position:
npx @iwsdk/cli ecs set-component --input-json '{"entityIndex":<N>,"componentId":"Transform","field":"position","value":"[1, 1, 1]"}' 2>/dev/nullTake second snapshot:
npx @iwsdk/cli ecs snapshot --input-json '{"label":"modified"}' 2>/dev/nullDiff:
npx @iwsdk/cli ecs diff --input-json '{"from":"baseline","to":"modified"}' 2>/dev/nullAssert: diff shows Transform.position changed to [1, 1, 1]
npx @iwsdk/cli browser logs --input-json '{"since":<test-start-ms>,"count":30,"level":["error","warn"]}' 2>/dev/nullAssert: No application-level errors or warnings. Pre-existing 404 resource errors from page load are acceptable.
Kill the dev server:
cd $IWSDK_REPO_ROOT/examples/poke && npx @iwsdk/cli dev downOutput a summary table:
| Suite | Result |
|--------------------------|-----------|
| 1. System Registration | PASS/FAIL |
| 2. Component Registration| PASS/FAIL |
| 3. Transform Sync | PASS/FAIL |
| 4. Pause/Step/Resume | PASS/FAIL |
| 5. System Toggle | PASS/FAIL |
| 6. Entity Discovery | PASS/FAIL |
| 7. Snapshot & Diff | PASS/FAIL |
| 8. Stability | PASS/FAIL |If any suite fails, include which assertion failed and actual vs expected values.
If at any point a transient error occurs (server crash, WebSocket timeout, connection refused, etc.) that is NOT caused by a source code bug:
cd $IWSDK_REPO_ROOT/examples/poke && npx @iwsdk/cli dev downOnly give up after one retry attempt per suite. If the same suite fails twice, mark it FAIL and continue to the next suite.
Transform fields default to [NaN, NaN, NaN] — by design. NaN sentinel means "don't overwrite existing Object3D value".
Three.js Object3D UUIDs regenerate on page reload. Always call npx @iwsdk/cli scene runtime-hierarchy after reload.
npx @iwsdk/cli ecs step has a 5-second timeout per step. If render loop is inactive, steps may fail.
Never cache entity indices across reloads. Always re-discover via npx @iwsdk/cli ecs find.
Some warnings (e.g., TLS self-signed cert) are expected and should be ignored. Only check for application-level errors/warnings.
0778f51
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.