# Openword Navigator

> Operate OpenWord end-to-end for live adventure sessions. Use when needs to download/install/start OpenWord, guide a human player in the browser, or play autonomously through REST API (create/load game, do_action loop, state/image retrieval), including configuring GEMINI_API_KEY and sharing interesting scenes and choices during play.

- Skill: `dinghuanghao/openword-navigator` (Agent Skill, multi-file: 4 files)
- Install (CLI): `npx skillmds@latest add dinghuanghao/openword-navigator`
- Raw SKILL.md: https://api.skillmd.com/api/skills/dinghuanghao/openword-navigator/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Integrations & APIs
- Author: dinghuanghao (https://skillmd.com/u/dinghuanghao)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/dinghuanghao/openword-navigator

---


# OpenWord Player

Read `references/session-runbook.md` before running a session.
Treat repository `README.md` as the source of truth for install/startup/API details, and re-check it when commands fail or look outdated.

## Session Workflow

1. Ask the user which mode to run before gameplay starts.
2. Prepare runtime (download/install/start, browser, key setup).
3. Branch to human-guided mode or AI REST mode.
4. For every turn in both modes (including AI-driven sessions), show `last_scene_image_path + narrative + player_profile` as a natural user-facing update (avoid raw field-label dump).

Use this exact mode-selection question:

`主人你想自己玩，还是我来玩？`

If the user does not choose, default to human-guided mode.

## Runtime Preparation

1. If repository does not exist locally, run:
`git clone https://github.com/dinghuanghao/openword.git`
2. Install and start:
`npm install`
`npm run dev`
Then check `GET /health` first: only if `bridge_online=false`, open one browser window at `http://127.0.0.1:<PORT>` (default `30000`) and re-check once; if already connected, do not open a new window.
3. `GEMINI_API_KEY` load order is: shell environment variable -> repo `.env` -> key modal/Settings.
4. `PORT` is optional (default `30000`); ensure browser opens `http://127.0.0.1:<PORT>`.
5. Confirm the game can reach interactive state before sending turns.

## Human-Guided Mode

1. Confirm user can input actions in the browser.
2. Help user craft opening world prompt and style.
3. For each turn, provide a short recap and 3 action options with different risk/reward.
4. Let the user pick or rewrite the action.
5. Remind controls only when relevant:
`机器人按钮` toggles built-in Auto Player, `Esc` exits auto mode/panels, Settings has `Connect API Bridge`.

## AI REST Mode

Creative directive: in AI REST mode, be bold and imaginative; try seemingly impossible actions when they can produce a truly unique story.

1. Ensure one browser tab is online at `http://127.0.0.1:<PORT>` (default `30000`); before opening a new tab/window, check `GET /health`: if `bridge_online=true`, do not open; if `bridge_online=false`, open only one tab/window and re-check once.
2. BFF/`Connect API Bridge` should be connected by default; do not ask the user to click it unless troubleshooting a bridge failure.
3. Check server health (`GET /health`).
4. Start or resume game via REST (`create_game` or `load_game`).
   - If the player provides a reference image, always include it in `create_game.image_path`.
   - If the player does not provide a reference image, do not send `image_path`.
   - When `image_path` is used, prefer an absolute path.
5. Loop:
call `get_current_game_state` -> choose a high-impact next action -> call `do_action` -> immediately show a natural-language update synthesized from `last_scene_image_path + narrative + player_profile` to the user.
6. After each turn update, either continue autonomously or pause at key nodes for user input.
7. Prefer visual style `3D Pixel Art` (voxel) or `Claymation` (clay); avoid frequent style switching in one session.

Use `scripts/openword_rest.sh` first (curl-only).  
If shell behavior is inconsistent across platforms, use `scripts/openword_rest.py` with the same commands/arguments.
If `PORT` is not `30000`, set:
`OPENWORD_BASE_URL="http://127.0.0.1:<PORT>"`.

## REST API Schema

| Method | Path | Body | Success fields | Tips |
| --- | --- | --- | --- | --- |
| `GET` | `/health` | none | `status`, `bridge_online` | Ensure `bridge_online=true` before `create_game`, `load_game`, or `do_action`. |
| `POST` | `/api/create_game` | `{ "description": string, "style": string, "image_path"?: string }` | `status`, `game_id` | In `description`, cite the single closest reference game (tone + mechanics) for stable art direction and stronger worldbuilding; set `style` to voxel/clay first. If player provides a reference image, include `image_path` (absolute path preferred). |
| `GET` | `/api/show_history_games` | none | `status`, `games` | Use after restart to find the most coherent checkpoint before loading. |
| `POST` | `/api/load_game` | `{ "game_id": string }` | `status` | Always confirm selected `game_id` with the user before continuing. |
| `GET` | `/api/get_current_game_state` | none | `status`, `game_id`, `world_view`, `narrative`, `player_profile`, `last_scene_image_path` | Compare with previous state and extract one clear objective for the next turn. |
| `POST` | `/api/do_action` | `{ "description": string }` | `status`, `game_id`, `world_view`, `narrative`, `player_profile`, `last_scene_image_path` | Prefer interesting actions that directly advance the story; avoid low-impact micro actions that waste tokens. |

## Interaction Contract

Never run long silent streaks. Keep the user in the loop even when AI plays.

1. After every turn, show one natural-language update based on `last_scene_image_path + narrative + player_profile` before the next action; do not print rigid prefixes like `last_scene_image_path:`, `narrative:`, `player_profile:`.
2. At meaningful branch points, ask user preference before committing.
3. Surface scene image paths and display scene images when possible.
4. Highlight interesting moments:
scene changes, risky decisions, major rewards, unexpected twists.

## Failure Handling

1. `NO_BRIDGE`: first verify the game tab is open and `GET /health` status; only then ask user to enable `Connect API Bridge` in Settings for troubleshooting.
2. Bridge occupied: another tab owns the bridge; disconnect that tab first.
3. Missing key/model errors: check `GEMINI_API_KEY` in shell env first, then repo `.env`; if still missing, ask user to configure key modal/Settings.
4. Slow/timeout calls: increase timeout, avoid overlapping requests. Some APIs may return `BUSY`; wait patiently and retry only after the current call settles, which can occasionally take several minutes when the service is blocked.

