|
| 1 | +# godot-toolbox |
| 2 | + |
| 3 | +     |
| 4 | + |
| 5 | +> AI-native Godot 4.6+ bootstrap control plane. 24 curated plugin packs, manifest-driven assembly, CI-verified contracts, optional RPG scaffolds. |
| 6 | +
|
| 7 | +[中文说明](README.md) |
| 8 | + |
| 9 | +--- |
| 10 | + |
| 11 | +## Table of Contents |
| 12 | + |
| 13 | +- [Quick Start](#quick-start) |
| 14 | +- [What It Does](#what-it-does) |
| 15 | +- [Pack Catalog](#pack-catalog) |
| 16 | +- [Architecture](#architecture) |
| 17 | +- [Interactive Deployment](#interactive-deployment) |
| 18 | +- [Verification](#verification) |
| 19 | +- [Maintenance](#maintenance) |
| 20 | +- [Contributing](#contributing) |
| 21 | +- [License](#license) |
| 22 | + |
| 23 | +--- |
| 24 | + |
| 25 | +## Quick Start |
| 26 | + |
| 27 | +### Interactive deployment (recommended for new users) |
| 28 | + |
| 29 | +```bash |
| 30 | +git clone https://github.com/codefromkarl/godot-toolbox.git |
| 31 | +cd godot-toolbox |
| 32 | + |
| 33 | +# Interactive wizard — browse packs by category |
| 34 | +./scripts/quickstart.sh /path/to/new-project |
| 35 | +``` |
| 36 | + |
| 37 | +### Manual pack assembly |
| 38 | + |
| 39 | +```bash |
| 40 | +./scripts/bootstrap_toolbox_project.sh /path/to/new-project --packs=validation,debug |
| 41 | +``` |
| 42 | + |
| 43 | +Preview pack assembly without writing files: |
| 44 | + |
| 45 | +```bash |
| 46 | +./scripts/bootstrap_toolbox_project.sh ../preview \ |
| 47 | + --packs=flow-core,simulation-core,data-core,save-core,flow-test-kit \ |
| 48 | + --dry-run-report |
| 49 | +``` |
| 50 | + |
| 51 | +RPG pack combination previews: |
| 52 | + |
| 53 | +```bash |
| 54 | +# Inventory + data + save |
| 55 | +./scripts/bootstrap_toolbox_project.sh ../preview \ |
| 56 | + --packs=inventory,data-core,save-core --dry-run-report |
| 57 | + |
| 58 | +# Quest + events + save |
| 59 | +./scripts/bootstrap_toolbox_project.sh ../preview \ |
| 60 | + --packs=quest,data-core,save-core,rules-events-core --dry-run-report |
| 61 | + |
| 62 | +# Full RPG stack |
| 63 | +./scripts/bootstrap_toolbox_project.sh ../preview \ |
| 64 | + --packs=rpg-core,rpg-battle-core,rpg-save-adapter,rpg-test-kit,flow-core,data-core,save-core,rules-events-core \ |
| 65 | + --dry-run-report |
| 66 | +``` |
| 67 | + |
| 68 | +--- |
| 69 | + |
| 70 | +## What It Does |
| 71 | + |
| 72 | +**Design Principles:** |
| 73 | + |
| 74 | +- **Minimal by default** — only CI-friendly baseline capabilities are enabled |
| 75 | +- **Opt-in complexity** — gameplay, debug, and presentation plugins are optional packs, never forced into every project |
| 76 | +- **Vendored separation** — third-party addons are isolated from repo-owned scripts, tests, and docs |
| 77 | +- **Selection by value** — plugins are evaluated on automation value, reuse breadth, coupling, and maintenance cost, not feature count |
| 78 | + |
| 79 | +**Key Features:** |
| 80 | + |
| 81 | +- **Manifest-driven assembly** — `packs.manifest.json` defines every pack's dependencies, autoloads, conflicts, and verification entry points |
| 82 | +- **Upstream version locking** — `upstreams.lock.json` pins exact git refs for all vendored plugins |
| 83 | +- **Pre-integrated testing** — gdUnit4 + godot-gdscript-toolkit in the base template, CI-ready from day one |
| 84 | +- **CI pipeline** — Godot 4.6.2 headless import + gdUnit4 smoke on every push |
| 85 | +- **Architecture packs** — toolbox-owned autoload contracts for flow, data, save, rules, RPG, and more |
| 86 | +- **Verification suite** — layered scripts validate manifest contracts, bootstrap artifacts, and pack consistency |
| 87 | + |
| 88 | +**What this repo is NOT:** |
| 89 | + |
| 90 | +- Not an official Godot demo mirror |
| 91 | +- Not a single-game starter template |
| 92 | +- It is a **select → pin → assemble → verify → ship** control plane |
| 93 | + |
| 94 | +--- |
| 95 | + |
| 96 | +## Pack Catalog |
| 97 | + |
| 98 | +### Baseline Pack (always included) |
| 99 | + |
| 100 | +| Pack | Plugins | Purpose | |
| 101 | +|------|---------|---------| |
| 102 | +| `base` | gdUnit4 6.1.2, godot-gdscript-toolkit 4.5.0 | Testing + linting baseline | |
| 103 | + |
| 104 | +### Developer Tools (base only) |
| 105 | + |
| 106 | +| Pack | Plugin | Version | When to Enable | |
| 107 | +|------|--------|---------|----------------| |
| 108 | +| `validation` | Godot Doctor | 2.1.2 | Scene/resource constraint CI validation | |
| 109 | +| `debug` | Signal Lens | 1.4.1 | Signal-heavy projects needing visual flow debugging | |
| 110 | +| `stateful` | Godot State Charts | 0.22.3 | Complex state machine architecture | |
| 111 | +| `juice` | Sparkle Lite | 1.0.0 | Game-feel and feedback authoring | |
| 112 | +| `ai-behavior` | Beehave | 2.9.2 | Behavior tree AI for NPCs/enemies | |
| 113 | +| `save-state-lite` | SaveState Lite | 1.2.0 | Advanced save tooling and browser (**conflicts: save-core**) | |
| 114 | + |
| 115 | +### Input & Automation |
| 116 | + |
| 117 | +| Pack | Plugin | Version | When to Enable | |
| 118 | +|------|--------|---------|----------------| |
| 119 | +| `input` | G.U.I.D.E | 0.12.0 | Cross-device input mapping and prompt icons | |
| 120 | +| `automation` | GodotE2E | 1.1.0 | Runtime UI/E2E testing via pytest bridge | |
| 121 | + |
| 122 | +### Architecture Packs (Toolbox-owned) |
| 123 | + |
| 124 | +| Pack | Autoload | Requires | Purpose | |
| 125 | +|------|----------|----------|---------| |
| 126 | +| `flow-core` | `FlowCore` | base | Game mode stack, flow requests, and result contracts | |
| 127 | +| `simulation-core` | `SimulationCore` | flow-core | Tick scheduler and system contracts for long-lived state | |
| 128 | +| `data-core` | `DataCore` | base | Data registry with stable ID contracts | |
| 129 | +| `save-core` | `SaveCore` | data-core | Versioned snapshots and atomic JSON writes | |
| 130 | +| `rules-events-core` | `RulesEventsCore` | base | Event, condition, and effect execution spine | |
| 131 | +| `ui-game-shell` | — | base | Menu, pause, modal, and loading shell primitives | |
| 132 | +| `flow-test-kit` | — | flow-core | Flow smoke fixtures and gdUnit4 test suites | |
| 133 | +| `ai-testing` | `AITestingCore` | automation | AI-driven test exploration and coverage tracking | |
| 134 | + |
| 135 | +### Game Systems (Third-party Vendor) |
| 136 | + |
| 137 | +| Pack | Plugin | Version | Requires | When to Enable | |
| 138 | +|------|--------|---------|----------|----------------| |
| 139 | +| `inventory` | GLoot | 3.0.1 | data-core, save-core | Inventory/equipment slot authoring | |
| 140 | +| `quest` | QuestSystem | 2.0.1.4 | data-core, save-core, rules-events-core | Resource-driven quest management | |
| 141 | +| `dialogue` | Dialogue Manager | 3.10.4 | data-core, save-core, rules-events-core | Dialogue graph authoring and playback | |
| 142 | + |
| 143 | +### RPG Extensions (Toolbox-owned) |
| 144 | + |
| 145 | +| Pack | Autoload | Requires | Purpose | |
| 146 | +|------|----------|----------|---------| |
| 147 | +| `rpg-core` | `RPGCore` | data-core, save-core | RPG character, party, wallet, and equipment state | |
| 148 | +| `rpg-battle-core` | `RPGBattleCore` | rpg-core, flow-core, rules-events-core | Deterministic turn-based battle contracts | |
| 149 | +| `rpg-save-adapter` | `RPGSaveAdapter` | rpg-core, save-core, rules-events-core | RPG state → save-core serialization | |
| 150 | +| `rpg-test-kit` | — | rpg-core, rpg-battle-core, rpg-save-adapter | Battle replay, event stream, and state dump evidence | |
| 151 | +| `rpg-art-demo` | — | base | First-party placeholder art/audio scaffold | |
| 152 | + |
| 153 | +--- |
| 154 | + |
| 155 | +## Architecture |
| 156 | + |
| 157 | +```mermaid |
| 158 | +graph TD |
| 159 | + BASE["base<br/>gdUnit4 + gdtoolkit"] |
| 160 | +
|
| 161 | + BASE --> VALID["validation<br/>Godot Doctor"] |
| 162 | + BASE --> DEBUG["debug<br/>Signal Lens"] |
| 163 | + BASE --> STATE["stateful<br/>State Charts"] |
| 164 | + BASE --> JUICE["juice<br/>Sparkle Lite"] |
| 165 | + BASE --> AUTO["automation<br/>GodotE2E"] |
| 166 | + BASE --> INPUT["input<br/>G.U.I.D.E"] |
| 167 | + BASE --> FLOW["flow-core<br/>FlowCore"] |
| 168 | + BASE --> DATA["data-core<br/>DataCore"] |
| 169 | + BASE --> RULES["rules-events-core<br/>RulesEventsCore"] |
| 170 | + BASE --> SHELL["ui-game-shell"] |
| 171 | + BASE --> ART["rpg-art-demo"] |
| 172 | +
|
| 173 | + FLOW --> SIM["simulation-core<br/>SimulationCore"] |
| 174 | + FLOW --> FTK["flow-test-kit"] |
| 175 | + DATA --> SAVE["save-core<br/>SaveCore"] |
| 176 | + AUTO --> AITEST["ai-testing<br/>AITestingCore"] |
| 177 | +
|
| 178 | + DATA --> RPGC["rpg-core<br/>RPGCore"] |
| 179 | + SAVE --> RPGC |
| 180 | + RPGC --> RPGB["rpg-battle-core<br/>RPGBattleCore"] |
| 181 | + FLOW --> RPGB |
| 182 | + RULES --> RPGB |
| 183 | + RPGC --> RPGSA["rpg-save-adapter<br/>RPGSaveAdapter"] |
| 184 | + SAVE --> RPGSA |
| 185 | + RULES --> RPGSA |
| 186 | + RPGC --> RPGTK["rpg-test-kit"] |
| 187 | + RPGB --> RPGTK |
| 188 | + RPGSA --> RPGTK |
| 189 | +
|
| 190 | + DATA --> INV["inventory<br/>GLoot"] |
| 191 | + SAVE --> INV |
| 192 | + DATA --> QUEST["quest<br/>QuestSystem"] |
| 193 | + SAVE --> QUEST |
| 194 | + RULES --> QUEST |
| 195 | + DATA --> DIALOG["dialogue<br/>Dialogue Manager"] |
| 196 | + SAVE --> DIALOG |
| 197 | + RULES --> DIALOG |
| 198 | + BASE --> BEH["ai-behavior<br/>Beehave"] |
| 199 | + BASE --> SSL["save-state-lite<br/>SaveState Lite"] |
| 200 | +
|
| 201 | + style BASE fill:#478cbf,color:#fff |
| 202 | + style RPGC fill:#c0392b,color:#fff |
| 203 | + style RPGB fill:#c0392b,color:#fff |
| 204 | + style RPGSA fill:#c0392b,color:#fff |
| 205 | + style RPGTK fill:#c0392b,color:#fff |
| 206 | +``` |
| 207 | + |
| 208 | +For the full expanded dependency graph with autoload contracts, see [docs/architecture.md](docs/architecture.md). |
| 209 | + |
| 210 | +--- |
| 211 | + |
| 212 | +## Interactive Deployment |
| 213 | + |
| 214 | +`scripts/quickstart.sh` provides an interactive deployment wizard with automatic dependency resolution and conflict detection. |
| 215 | + |
| 216 | +### Interactive mode (default) |
| 217 | + |
| 218 | +```bash |
| 219 | +./scripts/quickstart.sh /path/to/new-project |
| 220 | +``` |
| 221 | + |
| 222 | +The wizard will: |
| 223 | + |
| 224 | +1. Display all available packs grouped by category |
| 225 | +2. Accept user selection (comma-separated pack IDs) |
| 226 | +3. Automatically resolve dependencies (BFS upward requires collection) |
| 227 | +4. Detect conflicts (e.g. save-state-lite vs save-core) |
| 228 | +5. Display final pack list + dependency summary |
| 229 | +6. Call `bootstrap_toolbox_project.sh` on confirmation |
| 230 | + |
| 231 | +### Non-interactive mode (CI/automation) |
| 232 | + |
| 233 | +```bash |
| 234 | +./scripts/quickstart.sh /path/to/new-project --packs=validation,debug --auto-deps |
| 235 | +``` |
| 236 | + |
| 237 | +`--auto-deps` enables automatic dependency resolution, then calls `bootstrap_toolbox_project.sh`. |
| 238 | + |
| 239 | +--- |
| 240 | + |
| 241 | +## Verification |
| 242 | + |
| 243 | +### Local verification chain |
| 244 | + |
| 245 | +```bash |
| 246 | +bash ./scripts/verify_toolbox_layout.sh |
| 247 | +bash ./scripts/verify_game_architecture_packs.sh |
| 248 | +bash ./scripts/verify_rules_events_core_pack.sh |
| 249 | +bash ./scripts/verify_ui_game_shell_pack.sh |
| 250 | +bash ./scripts/verify_pack_matrix.sh --all |
| 251 | +bash ./scripts/verify_specialized_pack_candidates.sh |
| 252 | +bash ./scripts/verify_input_pack_poc.sh |
| 253 | +bash ./scripts/verify_bootstrap_flow.sh |
| 254 | +``` |
| 255 | + |
| 256 | +`verify_bootstrap_flow.sh` creates a temporary project, overlays default packs (`validation,debug,stateful,juice`), then runs: |
| 257 | + |
| 258 | +1. Bootstrap the temporary project |
| 259 | +2. `godot --headless --editor --quit-after 1 --import` |
| 260 | +3. Generate and run project-local gdUnit4 smoke |
| 261 | + |
| 262 | +CI runs the same pipeline. The current workflow uses official Linux Godot `4.6.2`. Locally, keep `4.6.x`. If Godot is not in `PATH`, set `GODOT_BIN=/path/to/godot`. |
| 263 | + |
| 264 | +### Optional pack verification |
| 265 | + |
| 266 | +```bash |
| 267 | +bash ./scripts/verify_automation_pack_poc.sh |
| 268 | +bash ./scripts/verify_dialogue_pack.sh |
| 269 | +``` |
| 270 | + |
| 271 | +--- |
| 272 | + |
| 273 | +## Maintenance |
| 274 | + |
| 275 | +### Import a new upstream plugin |
| 276 | + |
| 277 | +```bash |
| 278 | +./scripts/import_plugin_from_upstream.sh \ |
| 279 | + --id=signal_lens \ |
| 280 | + --repo=https://github.com/yannlemos/signal-lens \ |
| 281 | + --target=packs/debug/godot/addons/signal_lens \ |
| 282 | + --pack=debug \ |
| 283 | + --version=1.4.1 |
| 284 | +``` |
| 285 | + |
| 286 | +### Update a pinned upstream plugin |
| 287 | + |
| 288 | +```bash |
| 289 | +# Preview update (dry-run) |
| 290 | +./scripts/update_plugin_from_upstream.sh --id=signal_lens --version=1.4.1 --dry-run |
| 291 | + |
| 292 | +# Update automation pack upstream |
| 293 | +./scripts/update_plugin_from_upstream.sh --id=godot_e2e --dry-run |
| 294 | + |
| 295 | +# Update candidate shell pack upstream |
| 296 | +./scripts/update_plugin_from_upstream.sh --id=maaacks_game_template --dry-run |
| 297 | +``` |
| 298 | + |
| 299 | +--- |
| 300 | + |
| 301 | +## Contributing |
| 302 | + |
| 303 | +See [CONTRIBUTING.md](CONTRIBUTING.md) for the full guide: |
| 304 | + |
| 305 | +- **Pack proposals** — open an issue with the Pack Request template |
| 306 | +- **Commit convention** — Conventional Commits (`feat:`, `fix:`, `docs:`, `test:`, `chore:`) |
| 307 | +- **PR checklist** — manifest/lock consistency, verification scripts pass |
| 308 | + |
| 309 | +--- |
| 310 | + |
| 311 | +## License |
| 312 | + |
| 313 | +This project is licensed under the **MIT License** — see [LICENSE](LICENSE). |
| 314 | + |
| 315 | +Third-party plugins vendored in `packs/*/godot/addons/` retain their original licenses. |
| 316 | +See [docs/rpg-vendor-license-notice.md](docs/rpg-vendor-license-notice.md) for the complete attribution summary. |
0 commit comments