Skip to content

feat: register bevy, github-release-deploy, itch-deploy, pseudo-localization, code-signing, and steam-workshop as built-in plugins - #230

Merged
frostebite merged 1 commit into
mainfrom
feat/bevy-builtin-plugin
Aug 29, 2026
Merged

feat: register bevy, github-release-deploy, itch-deploy, pseudo-localization, code-signing, and steam-workshop as built-in plugins#230
frostebite merged 1 commit into
mainfrom
feat/bevy-builtin-plugin

Conversation

@frostebite

@frostebite frostebite commented Aug 29, 2026

Copy link
Copy Markdown
Member

Summary

Registers six functional-but-unpublished plugins as built-ins, so they're actually usable from the released binary with no --plugin flag and no npm publish:

  • @game-ci/bevygame-ci build <path> auto-detects a Bevy project
  • @game-ci/github-release-deploygame-ci deploy github-release <buildPath>
  • @game-ci/itch-deploygame-ci deploy itch <buildPath>
  • @game-ci/pseudo-localizationgame-ci pseudo-localize
  • @game-ci/code-signinggame-ci sign <path>
  • @game-ci/steam-workshopgame-ci deploy steam-workshop <itemPath>

All six were previously only reachable via --plugin @game-ci/<name>, which routes through PluginLoader.load's string-parameter path (loadFromNpm) and fails at runtime since none of them are published to npm — the only working path today is running from source inside this monorepo. This registers each the same way orchestrator/steam-deploy/runtime-test-framework already are: a literal import() at the loadPlugins() call site, which Bun's --compile bundler traces and embeds directly into the standalone binary.

  • Bevy does project-structure detection (a real bevy dependency in Cargo.toml), so registering it unconditionally costs nothing for non-Bevy projects using the same binary.
  • The other five each register their own subcommand (not engine detection), matching how steam-deploy — already built-in — works: they only do anything when their own subcommand is actually invoked.

Updated each plugin's README banner and usage examples to drop the now-stale --plugin flag, and a stale code comment in github-release-deploy's onLoad warning that referenced the old load-gating.

Test plan

  • bun test ./src — 220/220 pass
  • Each affected plugin's own vitest run — all pass (bevy, github-release-deploy, itch-deploy, pseudo-localization, code-signing, steam-workshop)
  • Built the actual standalone binary and verified against it directly, no --plugin flag:
    • game-ci build <fake-bevy-project> --debug → correctly detects and reaches Building fake-bevy-game (cargo build)
    • game-ci deploy github-release → reaches real command logic (Missing required argument: tag, not "unknown command")
    • game-ci deploy steam-workshop → same (Missing required argument: appId)

…blish needed

Loads the same way orchestrator/steam-deploy/runtime-test-framework
already do: a literal import("@game-ci/bevy") at the call site, which
Bun's --compile bundler can trace and embed directly into the
standalone binary - unlike PluginLoader.load's string-parameter path
(--plugin @game-ci/bevy), which resolves via loadFromNpm and fails at
runtime since this package was never published.

Detection only fires for a project with a real `bevy` dependency in
Cargo.toml, so registering it unconditionally costs nothing for
non-Bevy projects using the same binary.

Verified against the actual compiled binary: `game-ci build <path>`
against a fake Bevy project (real Cargo.toml with a bevy dependency,
no --plugin flag) correctly auto-detects and reaches "Building
<name> (cargo build)" before failing only on a missing `cargo`
executable in the test sandbox - confirms plugin registration and
detection both work end-to-end.
@coderabbitai

coderabbitai Bot commented Aug 29, 2026

Copy link
Copy Markdown

Warning

Review limit reached

Next included review available in 19 minutes.

View limit details

Limit details: You’ve used the included review currently available.

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: b4c30b0a-0694-4231-b686-18aec9c4008c

📥 Commits

Reviewing files that changed from the base of the PR and between a9d35fd and 85fdd97.

📒 Files selected for processing (3)
  • package.json
  • plugins/bevy/README.md
  • src/cli.ts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@frostebite
frostebite merged commit 29c8324 into main Aug 29, 2026
22 checks passed
@frostebite
frostebite deleted the feat/bevy-builtin-plugin branch August 29, 2026 01:11
@frostebite frostebite changed the title feat(bevy): register as a built-in plugin, no --plugin flag or npm publish needed feat: register bevy, github-release-deploy, itch-deploy, pseudo-localization, code-signing, and steam-workshop as built-in plugins Aug 29, 2026
frostebite added a commit to game-ci/documentation that referenced this pull request Aug 29, 2026
… plugins

- Removes --plugin flags from every experimental-plugin usage example:
  bevy, github-release-deploy, itch-deploy, pseudo-localization,
  code-signing, and steam-workshop are all registered by default as of
  game-ci/cli#230 - no flag, no npm publish needed.
- Adds a Bevy options table (--target/--features/--locked/--debug/--outputPath),
  matching the level of detail the other plugins already had.
- Adds a "Planned plugins" table covering the 8 structural-draft-only
  plugins (anti-cheat, dedicated-server-provisioning, dev-tunnel,
  gamemaker, renpy, rpg-maker, save-data-compat, screen-capture) that
  had no documentation at all before this - not usable yet, but visible
  as roadmap.
- Bumps the GitHub Action's stale v0.1.14 example pin to v0.1.48, fixes
  the Windows asset description (it's a .zip archive with a dist/
  sibling, not a bare .exe - matches the actual fix in game-ci/cli#230),
  and corrects the Orchestrator section's now-wrong claim that the
  current release "predates" Orchestrator integration.
frostebite added a commit that referenced this pull request Aug 29, 2026
…d real-project examples (#232)

* feat: register github-release-deploy, itch-deploy, pseudo-localization, code-signing, and steam-workshop as built-in plugins

Same fix as the previous commit for bevy - these five are functional
but were only reachable via --plugin @game-ci/<name>, which fails at
runtime (loadFromNpm) since none of them are published to npm. Only a
literal import() traced into the compiled binary actually works.

Each registers its own subcommand(s) (deploy github-release, deploy
itch, deploy steam-workshop, sign, pseudo-localize) rather than doing
engine-style project detection, so - like steam-deploy, already
built-in - there's no auto-detection cost to registering them
unconditionally; they only do anything when their own subcommand is
invoked.

Verified against the actual compiled binary: `game-ci deploy
github-release` and `game-ci deploy steam-workshop`, with no --plugin
flag, both reach real command logic (fail on a missing required
argument, not "unknown command").

* fix(action): Windows install path downloaded a nonexistent asset and silently skipped checksum verification

Two real bugs, both found while verifying the composite action end-to-end
against a live release for the docs work:

1. The Windows branch downloaded `game-ci-windows-x64.exe`, which has
   never existed - the real release asset is `game-ci-windows-x64.zip`
   (a zip containing game-ci.exe plus its dist/ sibling of static
   assets, same packaging as every other platform). Every Windows run
   of this action would 404.

2. Checksum verification: `Invoke-WebRequest ... | Select-Object
   -ExpandProperty Content` for a plain-text response returns a raw
   byte[] on this PowerShell/runner combination, not a decoded string.
   $expectedHash silently ended up empty every time, and the `if
   ($expectedHash) {...}` guard around the actual comparison meant
   verification was always skipped without ever warning - it's been a
   silent no-op since this branch was written, not something my zip fix
   introduced.

Verified against v0.1.48 end-to-end (real download, checksum compare,
extract, `--help` invocation) via PowerShell directly: checksum now
matches, dist/ and game-ci.exe both land correctly, and the binary
runs.

* fix(godot): fall back to --import when export_presets.cfg is missing

Godot's export_presets.cfg is commonly untracked (it can carry
machine-specific paths/keystore locations, much like a .env file), so
plenty of real, otherwise-buildable Godot projects don't have one
checked in - godotengine's own official demo projects included (e.g.
2d/dodge_the_creeps). `game-ci build` on such a project previously
failed outright with no useful signal, unconditionally attempting
`--export-release` regardless of whether a preset existed.

Falls back to `godot --headless --import` instead - validates the
project actually opens/imports cleanly - the same accommodation this
repo's own engine-smoke-test.yml already made by hand for its Godot
fixture, now built into the command itself so any real project gets it
too.

* ci: add real-project example smoke tests for Godot and Bevy

Validates the CLI against real, popular open-source projects instead
of only our own minimal fixtures - runs weekly + manually (not on
every PR, unlike engine-smoke-test.yml) since these depend on external
repos we don't control and involve real, slower engine work (a real
Godot import, real cargo builds).

- Godot: godotengine/godot-demo-projects' 2d/dodge_the_creeps (the
  canonical minimal tutorial project) - exercises the just-added
  --import fallback, since it has no export_presets.cfg.
- Bevy: NiklasEi/bevy_game_template (a maintained, purpose-built
  starting template) and webbertakken/death-arena (a real game, older
  Bevy 0.9 vs. the template's 0.19 - some version spread). Both have a
  direct `bevy` Cargo dependency our plugin's detection requires - no
  --plugin flag needed for either.

Unity is deliberately not included here: this repo's own Unity
coverage in engine-smoke-test.yml already exercises real build/activate
logic with a real license, and open-source + freely-buildable (no
proprietary assets) Unity projects are hard to find. GameMaker, Ren'Py,
RPG Maker, and the other structural-draft plugins aren't included
either - their domain logic isn't implemented yet regardless of how
many public example projects exist for those engines (see
#231 for the separate, real concern about how many
built-in plugins this binary can keep absorbing).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant