Skip to main content

WebSocket bridge for headless / scripted control of Godot scenes.

Project description

godot-cli-control

WebSocket bridge for headless / scripted control of Godot 4 scenes — Python client + CLI.

Install

pipx install godot-cli-control

# or, for unreleased main:
pipx install "git+https://github.com/ClaymanTwinkle/godot-cli-control.git#subdirectory=python"

The wheel ships the Godot plugin source so the init command can drop it into your project.

Requires Python ≥ 3.10.

One-shot setup of a Godot project

cd path/to/your_godot_project
godot-cli-control init        # copies plugin, patches project.godot, detects Godot binary
godot-cli-control daemon start
godot-cli-control tree 3
godot-cli-control daemon stop

init is idempotent — running it twice on the same project does nothing the second time. Pass --force to overwrite an existing addons/godot_cli_control/.

init also writes .claude/skills/godot-cli-control/SKILL.md and .codex/skills/godot-cli-control/SKILL.md so AI agents working in your Godot project can pick up this CLI surface automatically. Use --no-skills to skip, or --skills-only to refresh just those files after a CLI upgrade. See the top-level README for details.

Async API

import asyncio
from godot_cli_control import GameClient

async def main():
    async with GameClient(port=9877) as client:
        tree = await client.get_scene_tree(depth=3)
        await client.click("/root/MyScene/Button")
        await client.action_press("jump")
        await client.wait_game_time(0.5)
        await client.action_release("jump")
        png_bytes = await client.screenshot()
        open("frame.png", "wb").write(png_bytes)

asyncio.run(main())

Sync API (for scripts and tests)

# script.py
def run(bridge):
    bridge.click("/root/MyScene/StartButton")
    bridge.wait(2)
    bridge.tap("attack")
godot-cli-control run script.py --headless     # auto-starts and stops the daemon

pytest fixtures

pip install "godot-cli-control[pytest]"

The package ships a pytest plugin (auto-loaded via pytest11 entry-point):

# tests/test_jump.py — no fixture boilerplate needed
def test_jump(godot_daemon, bridge):
    bridge.click("/root/Game/Start")
    bridge.tap("jump")
    assert bridge.get_property("/root/Player", "on_floor") is False
  • godot_daemon (session-scoped) starts headless Godot once and stops it after all tests; if a daemon is already running it's reused (and not stopped at teardown — keeps your IDE workflow alive).
  • bridge (function-scoped) gives a fresh GameBridge; on teardown it calls release_all() so a hold left behind by one case can't bleed into the next, then closes the connection.

CLI options:

--godot-cli-port=N           # GameBridge port (default 9877)
--godot-cli-no-headless      # open a real Godot window
--godot-cli-project-root=DIR # default: pytest rootdir

CLI

godot-cli-control init [--path DIR] [--force]
godot-cli-control daemon start [--headless --record --movie-path X --fps N --port N]
godot-cli-control daemon stop
godot-cli-control run <script.py> [--headless ...]
godot-cli-control tree [depth]
godot-cli-control click <node_path>
godot-cli-control screenshot [output.png]
godot-cli-control press|release|tap|hold|combo|release-all <args...>

The port is read from .cli_control/port if you don't pass --port, so RPC calls just work after daemon start.

Documentation

See the Godot plugin README for the full RPC reference, activation modes, security model, and known limitations.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

godot_cli_control-0.1.8.tar.gz (63.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

godot_cli_control-0.1.8-py3-none-any.whl (66.8 kB view details)

Uploaded Python 3

File details

Details for the file godot_cli_control-0.1.8.tar.gz.

File metadata

  • Download URL: godot_cli_control-0.1.8.tar.gz
  • Upload date:
  • Size: 63.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for godot_cli_control-0.1.8.tar.gz
Algorithm Hash digest
SHA256 8443c27ededa5ec6baad14791be54889f71f2f8d0ed3313c60fd1f67f9b71f64
MD5 57c7742f21a259b6666281d9d39b4f3a
BLAKE2b-256 86e7205b7da2112ba73cb874f01bcc111a8874281a1871303f344d7f424a7802

See more details on using hashes here.

Provenance

The following attestation bundles were made for godot_cli_control-0.1.8.tar.gz:

Publisher: release.yml on ClaymanTwinkle/godot-cli-control

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file godot_cli_control-0.1.8-py3-none-any.whl.

File metadata

File hashes

Hashes for godot_cli_control-0.1.8-py3-none-any.whl
Algorithm Hash digest
SHA256 be5a72e982b2db2a884210d9dc2ce8650a386ab64fcb7b133e3131c85b73377d
MD5 df7b71000b6c3159f4c3c414994811a6
BLAKE2b-256 29bcdc71f0c2ce713a9d1c57f4932a9fc3368ed6f0c4e3f8732cba5ae0e7b761

See more details on using hashes here.

Provenance

The following attestation bundles were made for godot_cli_control-0.1.8-py3-none-any.whl:

Publisher: release.yml on ClaymanTwinkle/godot-cli-control

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page