summer-engine 2.3.0 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +24 -8
- package/.codex-plugin/plugin.json +19 -8
- package/.cursor-plugin/plugin.json +18 -7
- package/.factory-plugin/plugin.json +3 -3
- package/.opencode/INSTALL.md +1 -1
- package/AGENTS.md +6 -4
- package/CHANGELOG.md +46 -7
- package/CLAUDE.md +2 -2
- package/GEMINI.md +5 -6
- package/README.md +116 -109
- package/_persona/summer/SKILL.md +5 -6
- package/commands/gameskill.md +103 -0
- package/dist/bin/summer.js +17 -4
- package/dist/commands/cloud.d.ts +2 -0
- package/dist/commands/cloud.js +80 -0
- package/dist/commands/create.js +2 -0
- package/dist/commands/doctor.js +90 -1
- package/dist/commands/install.d.ts +17 -0
- package/dist/commands/install.js +63 -4
- package/dist/commands/login.js +4 -1
- package/dist/commands/logout.js +1 -1
- package/dist/commands/memory.d.ts +14 -0
- package/dist/commands/memory.js +196 -0
- package/dist/commands/open.js +1 -1
- package/dist/commands/plan.d.ts +2 -0
- package/dist/commands/plan.js +60 -0
- package/dist/commands/run.js +132 -35
- package/dist/commands/setup.js +8 -2
- package/dist/commands/skills.js +90 -6
- package/dist/commands/status.js +3 -0
- package/dist/lib/agent-config.d.ts +2 -2
- package/dist/lib/agent-config.js +134 -7
- package/dist/lib/api-client.d.ts +13 -0
- package/dist/lib/api-client.js +63 -26
- package/dist/lib/async-op-lifecycle.d.ts +60 -0
- package/dist/lib/async-op-lifecycle.js +83 -0
- package/dist/lib/auth.d.ts +2 -0
- package/dist/lib/auth.js +13 -0
- package/dist/lib/cloud/api.d.ts +79 -0
- package/dist/lib/cloud/api.js +107 -0
- package/dist/lib/cloud/apply.d.ts +32 -0
- package/dist/lib/cloud/apply.js +294 -0
- package/dist/lib/cloud/checkpoint.d.ts +26 -0
- package/dist/lib/cloud/checkpoint.js +142 -0
- package/dist/lib/cloud/conflicts.d.ts +55 -0
- package/dist/lib/cloud/conflicts.js +131 -0
- package/dist/lib/cloud/containment.d.ts +8 -0
- package/dist/lib/cloud/containment.js +52 -0
- package/dist/lib/cloud/diff.d.ts +39 -0
- package/dist/lib/cloud/diff.js +138 -0
- package/dist/lib/cloud/engine-bridge.d.ts +21 -0
- package/dist/lib/cloud/engine-bridge.js +105 -0
- package/dist/lib/cloud/hash-cache.d.ts +23 -0
- package/dist/lib/cloud/hash-cache.js +44 -0
- package/dist/lib/cloud/hash.d.ts +10 -0
- package/dist/lib/cloud/hash.js +111 -0
- package/dist/lib/cloud/http.d.ts +17 -0
- package/dist/lib/cloud/http.js +47 -0
- package/dist/lib/cloud/lock-path.d.ts +1 -0
- package/dist/lib/cloud/lock-path.js +5 -0
- package/dist/lib/cloud/lock.d.ts +14 -0
- package/dist/lib/cloud/lock.js +143 -0
- package/dist/lib/cloud/manifest.d.ts +6 -0
- package/dist/lib/cloud/manifest.js +41 -0
- package/dist/lib/cloud/paths.d.ts +20 -0
- package/dist/lib/cloud/paths.js +90 -0
- package/dist/lib/cloud/project-godot-merge.d.ts +32 -0
- package/dist/lib/cloud/project-godot-merge.js +185 -0
- package/dist/lib/cloud/rules.d.ts +39 -0
- package/dist/lib/cloud/rules.js +159 -0
- package/dist/lib/cloud/sync.d.ts +21 -0
- package/dist/lib/cloud/sync.js +518 -0
- package/dist/lib/cloud/transfer.d.ts +23 -0
- package/dist/lib/cloud/transfer.js +184 -0
- package/dist/lib/cloud/types.d.ts +62 -0
- package/dist/lib/cloud/validate-path.d.ts +23 -0
- package/dist/lib/cloud/validate-path.js +103 -0
- package/dist/lib/engine.d.ts +6 -0
- package/dist/lib/engine.js +36 -1
- package/dist/lib/game-task-plan.d.ts +42 -0
- package/dist/lib/game-task-plan.js +376 -0
- package/dist/lib/project-memory.d.ts +33 -0
- package/dist/lib/project-memory.js +220 -0
- package/dist/lib/skills-registry.d.ts +134 -61
- package/dist/lib/skills-registry.js +102 -4
- package/dist/lib/version-check.d.ts +106 -0
- package/dist/lib/version-check.js +338 -0
- package/dist/mcp/server.d.ts +2 -0
- package/dist/mcp/server.js +83 -0
- package/dist/mcp/tools/asset-tools.js +265 -45
- package/dist/mcp/tools/cloud-tools.d.ts +2 -0
- package/dist/mcp/tools/cloud-tools.js +42 -0
- package/dist/mcp/tools/debug-tools.js +32 -2
- package/dist/mcp/tools/generate-tools.js +101 -13
- package/dist/mcp/tools/project-tools.js +76 -21
- package/dist/mcp/tools/with-engine.d.ts +14 -0
- package/dist/mcp/tools/with-engine.js +52 -7
- package/gemini-extension.json +3 -3
- package/hooks/pre-commit-doctor.sh +0 -0
- package/hooks/run-hook.cmd +0 -0
- package/hooks/session-start.sh +0 -0
- package/package.json +20 -7
- package/skills/2d-assets/character-portrait/SKILL.md +1 -1
- package/skills/2d-assets/concept-art/SKILL.md +1 -1
- package/skills/2d-assets/create-asset-sheet/SKILL.md +163 -0
- package/skills/2d-assets/instantiate-asset-pack/SKILL.md +245 -0
- package/skills/2d-assets/pixel-art/SKILL.md +1 -1
- package/skills/2d-assets/skybox-panorama/SKILL.md +1 -1
- package/skills/2d-assets/sprite-sheet/SKILL.md +1 -1
- package/skills/2d-assets/tileable-texture/SKILL.md +1 -1
- package/skills/2d-assets/ui-graphics/SKILL.md +1 -1
- package/skills/2d-assets/use-widget-asset/SKILL.md +217 -0
- package/skills/3d-assets/character-model/SKILL.md +28 -6
- package/skills/3d-assets/environment-kit/SKILL.md +7 -2
- package/skills/3d-assets/organic-model/SKILL.md +5 -4
- package/skills/3d-assets/prop-model/SKILL.md +17 -9
- package/skills/3d-assets/vehicle-model/SKILL.md +5 -4
- package/skills/README.md +37 -30
- package/skills/ai-and-npcs/design-npc/SKILL.md +6 -6
- package/skills/animation/animation-tree/SKILL.md +4 -2
- package/skills/animation/facial-and-lipsync/SKILL.md +1 -1
- package/skills/animation/generate-motion/SKILL.md +26 -5
- package/skills/animation/procedural-animation/SKILL.md +2 -2
- package/skills/asset-pipeline/asset-strategy/SKILL.md +3 -2
- package/skills/audio/adaptive-music/SKILL.md +1 -1
- package/skills/audio/audio-direction/SKILL.md +5 -5
- package/skills/audio/sound-effect/SKILL.md +2 -2
- package/skills/audio/voice-line/SKILL.md +25 -3
- package/skills/character-controllers/fps-controller/SKILL.md +5 -5
- package/skills/debugging/debug/SKILL.md +39 -1
- package/skills/deployment/export-and-ship/SKILL.md +4 -4
- package/skills/gameplay-mechanics/auto-fire-targeting/SKILL.md +170 -0
- package/skills/gameplay-mechanics/design-mechanic/SKILL.md +8 -8
- package/skills/level-design/design-level/SKILL.md +5 -5
- package/skills/level-design/scene-to-level/SKILL.md +125 -0
- package/skills/multiplayer-and-networking/host-authoritative-state/SKILL.md +4 -4
- package/skills/multiplayer-and-networking/peer-to-peer-multiplayer/SKILL.md +4 -4
- package/skills/multiplayer-and-networking/setup-multiplayer/SKILL.md +7 -7
- package/skills/performance/tune-performance/SKILL.md +5 -5
- package/skills/rendering-and-lighting/3d-lighting/SKILL.md +1 -1
- package/skills/rendering-and-lighting/art-direction/SKILL.md +5 -5
- package/skills/scene-and-project/brainstorm-game/SKILL.md +4 -4
- package/skills/scene-and-project/play/SKILL.md +1 -1
- package/skills/scene-and-project/scene-composition/SKILL.md +30 -1
- package/skills/scripting-patterns/gdscript-patterns/SKILL.md +53 -0
- package/skills/ui-and-ux/ui-basics/SKILL.md +1 -1
- package/skills/video/animated-loop/SKILL.md +1 -1
- package/skills/video/cinematic-cutscene/SKILL.md +1 -1
- package/skills/video/trailer-shot/SKILL.md +1 -1
- package/skills/visual-effects/game-feel/SKILL.md +6 -6
- package/skills/workflow/brainstorming/SKILL.md +164 -0
- package/skills/workflow/brainstorming/scripts/frame-template.html +214 -0
- package/skills/workflow/brainstorming/scripts/helper.js +88 -0
- package/skills/workflow/brainstorming/scripts/server.cjs +354 -0
- package/skills/workflow/brainstorming/scripts/start-server.sh +148 -0
- package/skills/workflow/brainstorming/scripts/stop-server.sh +56 -0
- package/skills/workflow/brainstorming/spec-document-reviewer-prompt.md +49 -0
- package/skills/workflow/brainstorming/visual-companion.md +287 -0
- package/skills/workflow/debugging-game-feel/SKILL.md +174 -0
- package/skills/workflow/diagnosing-perf-regressions/SKILL.md +190 -0
- package/skills/workflow/dispatching-parallel-agents/SKILL.md +182 -0
- package/skills/workflow/gameskill/SKILL.md +111 -0
- package/skills/workflow/investigating-bugs/CREATION-LOG.md +119 -0
- package/skills/workflow/investigating-bugs/SKILL.md +296 -0
- package/skills/workflow/investigating-bugs/condition-based-waiting-example.ts +158 -0
- package/skills/workflow/investigating-bugs/condition-based-waiting.md +115 -0
- package/skills/workflow/investigating-bugs/defense-in-depth.md +122 -0
- package/skills/workflow/investigating-bugs/find-polluter.sh +63 -0
- package/skills/workflow/investigating-bugs/root-cause-tracing.md +169 -0
- package/skills/workflow/investigating-bugs/test-academic.md +14 -0
- package/skills/workflow/investigating-bugs/test-pressure-1.md +58 -0
- package/skills/workflow/investigating-bugs/test-pressure-2.md +68 -0
- package/skills/workflow/investigating-bugs/test-pressure-3.md +69 -0
- package/skills/workflow/mcpupdate/SKILL.md +134 -0
- package/skills/workflow/playtesting-a-feature/SKILL.md +173 -0
- package/skills/{_meta → workflow}/skill-create/SKILL.md +32 -22
- package/skills/{_meta → workflow}/skill-improve/SKILL.md +9 -10
- package/skills/{_meta → workflow}/skill-test/SKILL.md +12 -12
- package/skills/{_meta → workflow}/using-summer/SKILL.md +5 -2
- package/skills/workflow/verification-before-completion/SKILL.md +139 -0
- package/skills/workflow/writing-plans/SKILL.md +152 -0
- package/skills/workflow/writing-plans/plan-document-reviewer-prompt.md +49 -0
- package/skills/workflow/writing-skills/SKILL.md +655 -0
- package/skills/workflow/writing-skills/anthropic-best-practices.md +1150 -0
- package/skills/workflow/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
- package/skills/workflow/writing-skills/graphviz-conventions.dot +172 -0
- package/skills/workflow/writing-skills/persuasion-principles.md +187 -0
- package/skills/workflow/writing-skills/render-graphs.js +168 -0
- package/skills/workflow/writing-skills/testing-skills-with-subagents.md +384 -0
- package/dist/commands/assets.d.ts +0 -2
- package/dist/commands/assets.js +0 -189
- package/dist/commands/debug.d.ts +0 -2
- package/dist/commands/debug.js +0 -127
- package/dist/commands/doctor.test.js +0 -29
- package/dist/commands/project.d.ts +0 -2
- package/dist/commands/project.js +0 -170
- package/dist/commands/scene.d.ts +0 -2
- package/dist/commands/scene.js +0 -290
- package/dist/lib/agent-config.test.d.ts +0 -1
- package/dist/lib/agent-config.test.js +0 -80
- package/dist/lib/format.test.d.ts +0 -1
- package/dist/lib/format.test.js +0 -36
- package/dist/lib/plugin-manifests.test.d.ts +0 -1
- package/dist/lib/plugin-manifests.test.js +0 -134
- package/dist/lib/with-engine.d.ts +0 -14
- package/dist/lib/with-engine.js +0 -109
- package/skills/_shared/collaborative-protocol.md +0 -50
- package/skills/_shared/gd-style.md +0 -121
- package/skills/_shared/godot-version.md +0 -32
- package/skills/_shared/mcp-tools-reference.md +0 -133
- package/skills/_shared/summer-folder.md +0 -44
- package/skills/_shared/template-registry.md +0 -40
- package/skills/_tests/runner.md +0 -90
- package/skills/_tests/specs/3d-lighting.md +0 -19
- package/skills/_tests/specs/art-direction.md +0 -115
- package/skills/_tests/specs/asset-strategy.md +0 -19
- package/skills/_tests/specs/audio-direction.md +0 -123
- package/skills/_tests/specs/brainstorm-game.md +0 -99
- package/skills/_tests/specs/debug.md +0 -94
- package/skills/_tests/specs/design-level.md +0 -113
- package/skills/_tests/specs/design-mechanic.md +0 -112
- package/skills/_tests/specs/design-npc.md +0 -143
- package/skills/_tests/specs/export-and-ship.md +0 -114
- package/skills/_tests/specs/fps-controller.md +0 -113
- package/skills/_tests/specs/gdscript-patterns.md +0 -19
- package/skills/_tests/specs/host-authoritative-state.md +0 -104
- package/skills/_tests/specs/make-game.md +0 -19
- package/skills/_tests/specs/peer-to-peer-multiplayer.md +0 -99
- package/skills/_tests/specs/play.md +0 -88
- package/skills/_tests/specs/scene-composition.md +0 -19
- package/skills/_tests/specs/setup-multiplayer.md +0 -106
- package/skills/_tests/specs/tune-performance.md +0 -104
- package/skills/_tests/specs/ui-basics.md +0 -19
- package/skills/_tests/specs/vfx.md +0 -116
- package/skills/catalog.yaml +0 -991
- /package/dist/{commands/doctor.test.d.ts → lib/cloud/types.js} +0 -0
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
# Skill Spec: /design-npc
|
|
2
|
-
|
|
3
|
-
## Fixture
|
|
4
|
-
|
|
5
|
-
- Godot 4.5 / Summer Engine project, main scene with `World/Player` (CharacterBody3D in `player` group) and an empty `World/Enemies` parent.
|
|
6
|
-
- Summer MCP tools available.
|
|
7
|
-
- Host file tools available (Read, Edit, Write).
|
|
8
|
-
|
|
9
|
-
## Case 1: Happy Path — basic patrol-and-chase enemy with personality + intent
|
|
10
|
-
|
|
11
|
-
**Input:** "Add a basic enemy that chases the player when it sees them."
|
|
12
|
-
|
|
13
|
-
**Expected MCP tool sequence (in order):**
|
|
14
|
-
|
|
15
|
-
1. (Skill asks the archetype question and waits.)
|
|
16
|
-
2. User confirms "basic enemy".
|
|
17
|
-
3. `summer_get_scene_tree`
|
|
18
|
-
4. `summer_inspect_node "./World/Player"` — confirms it's in `player` group
|
|
19
|
-
5. (Skill proposes the bundle: scene tree + script + personality knobs + intent enum + action SM + telegraph + loot hook + "May I create?")
|
|
20
|
-
6. After user OK:
|
|
21
|
-
- `summer_add_node(parent="./World/Enemies", type="CharacterBody3D", name="Enemy")`
|
|
22
|
-
- `summer_add_node(parent="./World/Enemies/Enemy", type="CollisionShape3D", name="Body")`
|
|
23
|
-
- `summer_add_node(parent="./World/Enemies/Enemy", type="MeshInstance3D", name="Mesh")`
|
|
24
|
-
- `summer_add_node(parent="./World/Enemies/Enemy", type="Area3D", name="Vision")`
|
|
25
|
-
- `summer_add_node(parent="./World/Enemies/Enemy/Vision", type="CollisionShape3D", name="VisionShape")`
|
|
26
|
-
- `summer_add_node(parent="./World/Enemies/Enemy", type="RayCast3D", name="Sight")`
|
|
27
|
-
- (Vision SphereShape3D saved as standalone `.tres`, NOT inline)
|
|
28
|
-
- `summer_set_prop` on Sight: `enabled = true`
|
|
29
|
-
- `Write scripts/enemy_ai.gd`
|
|
30
|
-
- `summer_connect_signal(from="./World/Enemies/Enemy/Vision", signal="body_entered", to="./World/Enemies/Enemy", method="_on_body_entered")`
|
|
31
|
-
- `summer_save_scene`
|
|
32
|
-
- `summer_get_script_errors`
|
|
33
|
-
|
|
34
|
-
**Assertions:**
|
|
35
|
-
|
|
36
|
-
- [ ] Skill asks the archetype question before any tool call.
|
|
37
|
-
- [ ] Scene has BOTH a Vision Area3D AND a Sight RayCast3D (the two-step perception pattern).
|
|
38
|
-
- [ ] Vision shape is saved as a standalone `.tres`, NOT inline sub_resource (silent-fail trap).
|
|
39
|
-
- [ ] Script declares four `@export_range(0.0, 1.0)` personality knobs: `aggression`, `patience`, `caution`, `punishment`.
|
|
40
|
-
- [ ] Script jitters personality in `_ready` via `randf_range` clamped to `[0.0, 1.0]`.
|
|
41
|
-
- [ ] Script defines an `enum Intent` with at least 5 values from {IDLE, PATROL, INVESTIGATE, HUNT, KILL, RETREAT, RESCUE_ALLY}.
|
|
42
|
-
- [ ] Script defines an `enum State` with the 4 action states (CALM / ALERT / AGGRESSIVE / DEFEATED).
|
|
43
|
-
- [ ] Intent layer (`_update_intent` / `_decide_intent`) computes `current_intent` from perception + personality.
|
|
44
|
-
- [ ] Action SM (`_update_action`) reads `current_intent`; it does NOT write it.
|
|
45
|
-
- [ ] Script has an `attack_telegraph` parameter in 0.3–0.7 sec range, scaled by aggression at attack time.
|
|
46
|
-
- [ ] Script emits a `died` signal AND an `ally_defeated` signal.
|
|
47
|
-
- [ ] Script uses `distance_squared_to` (NOT `distance_to`) for range comparisons.
|
|
48
|
-
- [ ] Script uses typed GDScript per `_shared/gd-style.md`.
|
|
49
|
-
- [ ] Skill asks "May I create / write …" before each user-visible mutation.
|
|
50
|
-
- [ ] Final step is `summer_save_scene` then `summer_get_script_errors`.
|
|
51
|
-
|
|
52
|
-
## Case 2: Failure Path — wave-mob archetype but user asks for full FSM
|
|
53
|
-
|
|
54
|
-
**Fixture:** User wants 100+ enemies on screen at once.
|
|
55
|
-
|
|
56
|
-
**Input:** "Spawn 100 enemies that chase the player. Each one should perceive, decide, telegraph attacks, and drop loot."
|
|
57
|
-
|
|
58
|
-
**Expected behavior:**
|
|
59
|
-
|
|
60
|
-
- Skill recognizes the scale conflict.
|
|
61
|
-
- Says: "100 enemies with full intent SM + LOS perception will eat your frame budget. For wave mobs at this scale, the right archetype is the wave-mob (single KILL intent, 2 action states, no LOS). Want me to build that instead?"
|
|
62
|
-
- Does NOT silently build 100 expensive enemies.
|
|
63
|
-
- Offers the trade-off explicitly.
|
|
64
|
-
|
|
65
|
-
**Assertions:**
|
|
66
|
-
|
|
67
|
-
- [ ] Skill names the performance trade-off, not just "this is hard".
|
|
68
|
-
- [ ] Skill points to the wave-mob archetype as the right answer.
|
|
69
|
-
- [ ] Skill does NOT proceed without confirmation.
|
|
70
|
-
- [ ] Skill never starts spawning 100 expensive nodes.
|
|
71
|
-
|
|
72
|
-
## Case 3: Edge Case — boss with phases
|
|
73
|
-
|
|
74
|
-
**Fixture:** Same as Case 1.
|
|
75
|
-
|
|
76
|
-
**Input:** "Design a 3-phase boss for the dungeon room."
|
|
77
|
-
|
|
78
|
-
**Expected behavior:**
|
|
79
|
-
|
|
80
|
-
- Skill picks the **boss** archetype (different complexity budget).
|
|
81
|
-
- Calls out: "Boss complexity (6–10 action states, 5–7 intents incl. RESCUE_ALLY, scripted phases) is at the threshold where a behavior tree might pay off, but I recommend a hand-coded FSM with phase enum first since you're a single dev."
|
|
82
|
-
- Recommends boss personality bias: aggression 0.7–0.9, patience 0.7–0.9, punishment 0.8–1.0 (from the tunable matrix).
|
|
83
|
-
- Walks all six pillars at boss scale: more tells per state, telegraph 0.5–0.7 sec, distinct mechanics per phase (cap at 4–6 total mechanics).
|
|
84
|
-
- Defers to `ai-and-npcs/boss-patterns/SKILL.md` for the deeper phase-transition patterns.
|
|
85
|
-
- Does NOT just scale up the basic-enemy stub.
|
|
86
|
-
|
|
87
|
-
**Assertions:**
|
|
88
|
-
|
|
89
|
-
- [ ] Skill recognizes "boss" requires a different design.
|
|
90
|
-
- [ ] Skill caps at 4–6 distinct mechanics across phases.
|
|
91
|
-
- [ ] Skill mentions phase enum as the FSM extension.
|
|
92
|
-
- [ ] Skill cites boss-archetype personality ranges from the tunable matrix.
|
|
93
|
-
- [ ] Skill defers to boss-patterns for deeper detail rather than trying to one-shot it.
|
|
94
|
-
|
|
95
|
-
## Case 4: No Summer MCP — fallback path
|
|
96
|
-
|
|
97
|
-
**Fixture:** Same as Case 1, but Summer MCP unavailable.
|
|
98
|
-
|
|
99
|
-
**Input:** "Add a basic enemy that chases the player."
|
|
100
|
-
|
|
101
|
-
**Expected behavior:**
|
|
102
|
-
|
|
103
|
-
- Skill detects MCP unavailable.
|
|
104
|
-
- Asks user to paste the existing scene tree (or relevant `.tscn` snippet) so node paths are right.
|
|
105
|
-
- Generates a `.tscn` snippet (Enemy + Vision + Sight + Mesh + CollisionShape) with valid Godot 4 scene syntax.
|
|
106
|
-
- Writes `scripts/enemy_ai.gd` directly with the personality + intent + action layers intact.
|
|
107
|
-
- Provides manual editor instructions for connecting the `body_entered` signal.
|
|
108
|
-
- Still asks "May I write …" before each file write.
|
|
109
|
-
|
|
110
|
-
**Assertions:**
|
|
111
|
-
|
|
112
|
-
- [ ] Skill does not blindly call `summer_*` tools and fail.
|
|
113
|
-
- [ ] Generated `.tscn` is valid Godot 4 syntax (parseable).
|
|
114
|
-
- [ ] Generated GDScript has personality knobs, intent enum, action SM (same structure as MCP path).
|
|
115
|
-
- [ ] Skill still asks "May I" on writes.
|
|
116
|
-
|
|
117
|
-
## Case 5: Group emergence — squad of 4 with varied aggression
|
|
118
|
-
|
|
119
|
-
**Fixture:** Same as Case 1. User wants a small squad, not a wave.
|
|
120
|
-
|
|
121
|
-
**Input:** "Spawn a patrol squad of 4 basic_grunt enemies near the gate."
|
|
122
|
-
|
|
123
|
-
**Expected behavior:**
|
|
124
|
-
|
|
125
|
-
- Skill picks the **basic enemy** archetype with squad framing.
|
|
126
|
-
- Confirms the squad uses the **same `enemy_ai.gd` script and same archetype `.tscn`** — variation comes from per-instance personality jitter, NOT 4 different scripts.
|
|
127
|
-
- Shows / verifies that `personality_jitter` (default 0.15) is set on each instance, with base aggression in the basic_grunt range (0.5–0.7).
|
|
128
|
-
- Predicts the emergent roles: with jitter, post-spawn aggression values land roughly across `0.35 / 0.5 / 0.65 / 0.85` and produce a sniper / anchor / flanker / berserker mix.
|
|
129
|
-
- Does NOT author per-instance roles by hand.
|
|
130
|
-
- Does NOT duplicate the script per role.
|
|
131
|
-
|
|
132
|
-
**Assertions:**
|
|
133
|
-
|
|
134
|
-
- [ ] All 4 spawned NPCs use the same script file and same archetype scene.
|
|
135
|
-
- [ ] Each instance's `_ready` jitters all 4 personality knobs via `randf_range` clamped to `[0.0, 1.0]`.
|
|
136
|
-
- [ ] Skill explicitly cites group emergence (varied aggression -> varied roles) instead of authoring roles centrally.
|
|
137
|
-
- [ ] Skill does NOT recommend creating `sniper_ai.gd`, `flanker_ai.gd`, etc. as separate scripts.
|
|
138
|
-
- [ ] Skill calls out that two NPCs with the same base archetype will still feel different post-jitter.
|
|
139
|
-
- [ ] If the user pushes back ("I want one to definitely be a sniper"), skill suggests narrowing that *instance's* base values (e.g., aggression 0.2, caution 0.8) rather than forking the script.
|
|
140
|
-
|
|
141
|
-
---
|
|
142
|
-
|
|
143
|
-
This spec runs via `/skill-test design-npc spec` (see `_meta/skill-test/SKILL.md`).
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
# Skill Spec: /export-and-ship
|
|
2
|
-
|
|
3
|
-
## Fixture
|
|
4
|
-
|
|
5
|
-
- Godot 4.5 / Summer Engine project, complete game with main scene set, no script errors, basic icon at `icon.png` (256×256).
|
|
6
|
-
- Existing `export_presets.cfg` with Windows/Mac/Linux presets, all `debug = true` (development defaults).
|
|
7
|
-
- No `LICENSE` file at repo root.
|
|
8
|
-
- No `attribution.md`.
|
|
9
|
-
- Two CC-BY 4.0 assets imported from public sources (used in scene).
|
|
10
|
-
- Summer MCP tools available.
|
|
11
|
-
|
|
12
|
-
## Case 1: Happy Path — Steam (Windows + Mac + Linux)
|
|
13
|
-
|
|
14
|
-
**Input:** "I'm ready to ship to Steam. Build me Windows, Mac, and Linux releases."
|
|
15
|
-
|
|
16
|
-
**Expected MCP tool sequence (in order):**
|
|
17
|
-
|
|
18
|
-
1. (Skill asks the destination question and waits — confirms Steam, Win/Mac/Linux.)
|
|
19
|
-
2. Pre-flight:
|
|
20
|
-
- `summer_get_diagnostics` — clean
|
|
21
|
-
- `summer_get_console` — clean
|
|
22
|
-
- Read `project.godot` — main scene set, no version, no name
|
|
23
|
-
- Read `LICENSE` — does not exist
|
|
24
|
-
- Read `attribution.md` — does not exist
|
|
25
|
-
- Read `export_presets.cfg` — `debug = true` on all presets
|
|
26
|
-
- Grep for hardcoded paths
|
|
27
|
-
3. (Skill lists the pre-flight failures: missing LICENSE, missing attribution.md, missing version, missing game name, debug=true on release presets, missing Steam-required assets like trailer + capsules.)
|
|
28
|
-
4. Skill asks: "Pre-flight failed on N items: <list>. Want me to walk these one by one?"
|
|
29
|
-
5. (Does NOT proceed to build.)
|
|
30
|
-
|
|
31
|
-
**Assertions:**
|
|
32
|
-
|
|
33
|
-
- [ ] Skill asks the destination question first.
|
|
34
|
-
- [ ] Skill runs the FULL pre-flight checklist before any build.
|
|
35
|
-
- [ ] Skill detects missing LICENSE and missing `attribution.md`.
|
|
36
|
-
- [ ] Skill detects `debug = true` and flags it as a blocker for release.
|
|
37
|
-
- [ ] Skill detects missing Steam-specific assets (capsules, trailer) and lists them.
|
|
38
|
-
- [ ] Skill does NOT produce a build until the user fixes the blockers OR explicitly waives them.
|
|
39
|
-
- [ ] Skill never auto-uploads to Steam Pipe — only points at the upload command.
|
|
40
|
-
|
|
41
|
-
## Case 2: Failure Path — pre-flight passes, but iOS targeted without Apple Developer setup
|
|
42
|
-
|
|
43
|
-
**Fixture:** Project is clean (LICENSE present, no script errors, version + name set).
|
|
44
|
-
|
|
45
|
-
**Input:** "Ship to iOS App Store."
|
|
46
|
-
|
|
47
|
-
**Expected behavior:**
|
|
48
|
-
|
|
49
|
-
- Skill runs pre-flight — clean.
|
|
50
|
-
- Skill walks iOS-specific requirements: 1024×1024 icon, screenshots at 6.5" iPhone resolution, App Store description, privacy policy URL, support URL, bundle ID, Apple Developer cert + provisioning profile.
|
|
51
|
-
- Skill asks: "iOS submission requires (a) Apple Developer account ($99/yr), (b) Bundle ID configured in Apple Developer portal, (c) distribution certificate + provisioning profile, (d) macOS machine with Xcode for the final archive step. Do you have these set up? If not, those are the prerequisites — I can help with the build config but not the Apple Developer side."
|
|
52
|
-
- Does NOT silently produce an unsigned `.ipa` that can't be submitted.
|
|
53
|
-
|
|
54
|
-
**Assertions:**
|
|
55
|
-
|
|
56
|
-
- [ ] Skill names the iOS prerequisites that aren't satisfiable from inside Godot.
|
|
57
|
-
- [ ] Skill names the bundle-ID convention (`com.<org>.<game>`).
|
|
58
|
-
- [ ] Skill mentions TestFlight before App Store review.
|
|
59
|
-
- [ ] Skill does NOT pretend to do code signing it can't actually do.
|
|
60
|
-
- [ ] Skill names AAB-vs-APK if the user mistakenly says "Android APK" (different ticket but related anti-pattern).
|
|
61
|
-
|
|
62
|
-
## Case 3: Edge Case — multi-platform, web HTML5 included
|
|
63
|
-
|
|
64
|
-
**Fixture:** Same as Case 1 but post-fix (LICENSE added, attribution.md added, presets `debug = false`, version = "1.0.0", screenshots ready, trailer recorded).
|
|
65
|
-
|
|
66
|
-
**Input:** "Ship to Steam + itch + web."
|
|
67
|
-
|
|
68
|
-
**Expected behavior:**
|
|
69
|
-
|
|
70
|
-
- Pre-flight clean.
|
|
71
|
-
- Skill walks each platform's requirements separately.
|
|
72
|
-
- For web: explicitly flags the multiplayer transport (ENet doesn't work in browser), the audio autoplay block (Chrome blocks until first user click), and the file-size matters trap.
|
|
73
|
-
- Web export preset configured: encryption disabled, no JS eval, GLES3 fallback to GLES2 on if old browsers targeted.
|
|
74
|
-
- Skill asks: "May I produce 5 builds (Win + Mac + Linux + itch packages + web)?"
|
|
75
|
-
- Produces builds via `godot --headless --export-release` invocations after user OK.
|
|
76
|
-
- Verifies each build size and lists post-build warnings (e.g. "Web build is 180 MB — consider stripping unused textures").
|
|
77
|
-
- Points at upload commands for each: `steamcmd`, `butler push`, manual itch web upload.
|
|
78
|
-
|
|
79
|
-
**Assertions:**
|
|
80
|
-
|
|
81
|
-
- [ ] Skill walks per-platform requirements separately, NOT a generic checklist.
|
|
82
|
-
- [ ] For web: skill flags the autoplay + multiplayer + file-size traps explicitly.
|
|
83
|
-
- [ ] Skill produces builds in correct order (build, then verify, then point at upload — never auto-upload).
|
|
84
|
-
- [ ] Skill provides per-platform upload commands (steamcmd / butler / etc).
|
|
85
|
-
- [ ] Skill does NOT execute uploads itself.
|
|
86
|
-
|
|
87
|
-
## Case 4: No Summer MCP — fallback path
|
|
88
|
-
|
|
89
|
-
**Fixture:** Same as Case 1, MCP unavailable.
|
|
90
|
-
|
|
91
|
-
**Input:** "I want to ship to Steam."
|
|
92
|
-
|
|
93
|
-
**Expected behavior:**
|
|
94
|
-
|
|
95
|
-
- Skill detects MCP unavailable.
|
|
96
|
-
- Asks user to confirm via the editor: main scene set, no errors in Output panel, no errors in Debugger panel.
|
|
97
|
-
- Asks user to paste contents of `project.godot` and `export_presets.cfg`.
|
|
98
|
-
- Walks the pre-flight checklist by reasoning over the pasted text.
|
|
99
|
-
- Provides per-platform asset list and config recommendations.
|
|
100
|
-
- Provides build commands the user can run manually (`godot --headless --export-release ...`).
|
|
101
|
-
- Provides upload commands the user can run manually (`steamcmd ...`).
|
|
102
|
-
- Still applies "May I write" before any file edit (e.g. `LICENSE` creation).
|
|
103
|
-
|
|
104
|
-
**Assertions:**
|
|
105
|
-
|
|
106
|
-
- [ ] Skill does not blindly call `summer_*` tools and fail.
|
|
107
|
-
- [ ] Skill asks for the specific files it needs (project.godot, export_presets.cfg).
|
|
108
|
-
- [ ] Skill still runs the full pre-flight check via reading.
|
|
109
|
-
- [ ] Skill names the same blockers (LICENSE, debug=true, missing trailer).
|
|
110
|
-
- [ ] Skill asks "May I write" before creating LICENSE / attribution.md / etc.
|
|
111
|
-
|
|
112
|
-
---
|
|
113
|
-
|
|
114
|
-
This spec runs via `/skill-test export-and-ship spec` (see `_meta/skill-test/SKILL.md`).
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
# Skill Spec: /fps-controller
|
|
2
|
-
|
|
3
|
-
## Fixture
|
|
4
|
-
|
|
5
|
-
- Empty Godot 4.5 / Summer Engine project, main scene open with a single `World` (Node3D) root.
|
|
6
|
-
- Summer MCP tools available (engine running on localhost:6550).
|
|
7
|
-
- No existing input actions in InputMap beyond Godot defaults.
|
|
8
|
-
- No script files attached.
|
|
9
|
-
|
|
10
|
-
## Case 1: Happy Path — fresh FPS in an empty scene
|
|
11
|
-
|
|
12
|
-
**Input:** "Add a first-person controller to my scene."
|
|
13
|
-
|
|
14
|
-
**Expected MCP tool sequence (in order):**
|
|
15
|
-
|
|
16
|
-
1. `summer_get_scene_tree` — verify empty World exists.
|
|
17
|
-
2. `summer_add_node(parent="./World", type="CharacterBody3D", name="Player")`
|
|
18
|
-
3. `summer_add_node(parent="./World/Player", type="CollisionShape3D", name="Collision")`
|
|
19
|
-
4. `summer_set_prop("./World/Player/Collision", "shape", "CapsuleShape3D")` (creates standalone, NOT inline sub-resource)
|
|
20
|
-
5. `summer_set_resource_property("./World/Player/Collision", "shape", "radius", "0.4")`
|
|
21
|
-
6. `summer_set_resource_property("./World/Player/Collision", "shape", "height", "1.8")`
|
|
22
|
-
7. `summer_add_node(parent="./World/Player", type="Node3D", name="Head")`
|
|
23
|
-
8. `summer_set_prop("./World/Player/Head", "position", "Vector3(0, 1.6, 0)")`
|
|
24
|
-
9. `summer_add_node(parent="./World/Player/Head", type="Camera3D", name="Camera")`
|
|
25
|
-
10. `summer_input_map_bind(name="move_forward", events=[{type:"key", key:"W"}])`
|
|
26
|
-
11. `summer_input_map_bind(name="move_back", events=[{type:"key", key:"S"}])`
|
|
27
|
-
12. `summer_input_map_bind(name="move_left", events=[{type:"key", key:"A"}])`
|
|
28
|
-
13. `summer_input_map_bind(name="move_right", events=[{type:"key", key:"D"}])`
|
|
29
|
-
14. `summer_input_map_bind(name="jump", events=[{type:"key", key:"Space"}])`
|
|
30
|
-
15. `summer_input_map_bind(name="sprint", events=[{type:"key", key:"Shift"}])`
|
|
31
|
-
16. (User-side write) `Write` script file `scripts/player_controller.gd` after the agent asks "May I create the controller script and attach it to ./World/Player?"
|
|
32
|
-
17. `summer_save_scene`
|
|
33
|
-
18. `summer_get_script_errors`
|
|
34
|
-
|
|
35
|
-
**Assertions:**
|
|
36
|
-
|
|
37
|
-
- [ ] CharacterBody3D node exists at `./World/Player`.
|
|
38
|
-
- [ ] CollisionShape3D is a child of Player with a CapsuleShape3D (NOT BoxShape, NOT SphereShape).
|
|
39
|
-
- [ ] A `Head` Node3D pivots at `y ≈ 1.6` and contains the Camera3D as a child (yaw on body, pitch on head — never both on the body).
|
|
40
|
-
- [ ] All 6 input actions bound: `move_forward`, `move_back`, `move_left`, `move_right`, `jump`, `sprint`.
|
|
41
|
-
- [ ] Skill asks "May I create / attach …" before the script write.
|
|
42
|
-
- [ ] Skill never calls `summer_set_resource_property` on an inline `sub_resource` (the silent-fail trap from `_shared/mcp-tools-reference.md`).
|
|
43
|
-
- [ ] Final step is `summer_save_scene` followed by `summer_get_script_errors`.
|
|
44
|
-
- [ ] Script uses typed GDScript per `_shared/gd-style.md` (`@export`, `:=`, `class_name`).
|
|
45
|
-
- [ ] Script defines `coyote_time` and `jump_buffer_time` as `@export` floats with sensible defaults (0.05–0.2).
|
|
46
|
-
- [ ] Script defines separate `ground_accel`, `ground_friction`, `air_accel`, `air_friction` exports — NOT a single `move_speed` snap-to-target.
|
|
47
|
-
- [ ] Script implements `air_accel < ground_accel` (reduced air control, not zero, not full).
|
|
48
|
-
- [ ] Script defines an `external_velocity: Vector3` accumulator AND a public `add_external_velocity(impulse: Vector3)` method.
|
|
49
|
-
- [ ] Script subtracts the previous frame's external contribution at the top of `_physics_process` BEFORE applying gravity (prevents knockback compounding).
|
|
50
|
-
- [ ] Script uses `move_toward` for horizontal acceleration/deceleration — not `velocity.x = direction.x * speed` snap.
|
|
51
|
-
- [ ] Script applies asymmetric gravity (`fall_gravity_multiplier` when `velocity.y < 0`).
|
|
52
|
-
- [ ] Mouse look pitches `Head`, not `Player`. Pitch is clamped to `[pitch_min, pitch_max]`.
|
|
53
|
-
- [ ] `Input.mouse_mode = Input.MOUSE_MODE_CAPTURED` set in `_ready`.
|
|
54
|
-
|
|
55
|
-
## Case 2: Failure Path — existing PlayerOld in scene
|
|
56
|
-
|
|
57
|
-
**Fixture:** Same as Case 1, but `World/PlayerOld` exists with a CharacterBody3D + collision (manually authored).
|
|
58
|
-
|
|
59
|
-
**Input:** "Add a first-person controller to my scene."
|
|
60
|
-
|
|
61
|
-
**Expected behavior:**
|
|
62
|
-
|
|
63
|
-
- Skill detects the name collision via `summer_get_scene_tree`.
|
|
64
|
-
- Skill asks: "I see `World/PlayerOld` already exists. Should I replace it, add a second player as `Player2`, or something else?"
|
|
65
|
-
- Does NOT silently overwrite.
|
|
66
|
-
|
|
67
|
-
**Assertions:**
|
|
68
|
-
|
|
69
|
-
- [ ] Skill calls `summer_get_scene_tree` before any mutation.
|
|
70
|
-
- [ ] Skill asks the user how to handle the collision before adding any node.
|
|
71
|
-
- [ ] No `summer_add_node` calls happen until the user answers.
|
|
72
|
-
|
|
73
|
-
## Case 3: Edge Case — user says "third-person"
|
|
74
|
-
|
|
75
|
-
**Fixture:** Empty Godot project, main scene with `World` only.
|
|
76
|
-
|
|
77
|
-
**Input:** "Build a third-person FPS controller."
|
|
78
|
-
|
|
79
|
-
**Expected behavior:**
|
|
80
|
-
|
|
81
|
-
- Skill clarifies the contradiction: FPS = first-person; third-person ≠ FPS.
|
|
82
|
-
- Either asks the user which they meant, OR hands off to `/tps-controller` (when that skill ships) and explains the difference.
|
|
83
|
-
|
|
84
|
-
**Assertions:**
|
|
85
|
-
|
|
86
|
-
- [ ] Skill does NOT silently start building a third-person controller using FPS scaffolding.
|
|
87
|
-
- [ ] Skill explicitly names the ambiguity ("FPS means first-person; third-person is a separate skill").
|
|
88
|
-
- [ ] Skill offers a clear next step: clarify or use the right skill.
|
|
89
|
-
|
|
90
|
-
## Case 4: No Summer MCP — file-edit fallback path
|
|
91
|
-
|
|
92
|
-
**Fixture:** Same as Case 1 except Summer MCP is NOT available (running in plain Cursor on a project where the engine is not connected).
|
|
93
|
-
|
|
94
|
-
**Input:** "Add a first-person controller to my scene."
|
|
95
|
-
|
|
96
|
-
**Expected behavior:**
|
|
97
|
-
|
|
98
|
-
- Skill detects no MCP and falls back to direct file edits on `level.tscn` (or whatever main scene exists).
|
|
99
|
-
- Writes a `.tscn` snippet with CharacterBody3D + CollisionShape3D + Head Node3D + Camera3D following the format in the skill's "Fallback (no MCP)" section.
|
|
100
|
-
- Writes `scripts/player_controller.gd` directly via host file-write tools — same skeleton as the MCP path (coyote + buffer + air-accel + external-velocity + move_toward).
|
|
101
|
-
- Edits `project.godot` to add the InputMap actions (all 6: WASD + jump + sprint).
|
|
102
|
-
|
|
103
|
-
**Assertions:**
|
|
104
|
-
|
|
105
|
-
- [ ] Skill identifies that MCP is unavailable (does not blindly call `summer_*` tools and fail).
|
|
106
|
-
- [ ] Generated `.tscn` is syntactically valid Godot 4 scene format (parseable by Godot, includes `[gd_scene ... format=3]` header and a CapsuleShape3D sub-resource with `radius` and `height`).
|
|
107
|
-
- [ ] Generated `project.godot` patch follows Godot's input action format (`input/move_forward = { "deadzone": ..., "events": [...] }`).
|
|
108
|
-
- [ ] Generated script still includes coyote_time, jump_buffer_time, external_velocity, move_toward acceleration model (the fallback path is NOT a downgraded skeleton).
|
|
109
|
-
- [ ] Skill still asks "May I write …" before each file write.
|
|
110
|
-
|
|
111
|
-
---
|
|
112
|
-
|
|
113
|
-
This spec runs via `/skill-test fps-controller spec` (see `_meta/skill-test/SKILL.md`).
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
# Skill Spec: /gdscript-patterns
|
|
2
|
-
|
|
3
|
-
> Stub spec. Expand with Happy / Failure / Edge cases. See `fps-controller.md` for the canonical format.
|
|
4
|
-
|
|
5
|
-
## Fixture
|
|
6
|
-
|
|
7
|
-
- TBD
|
|
8
|
-
|
|
9
|
-
## Case 1: Happy Path
|
|
10
|
-
|
|
11
|
-
**Input:** "<typical user prompt>"
|
|
12
|
-
|
|
13
|
-
**Expected MCP tool sequence (in order):**
|
|
14
|
-
|
|
15
|
-
1. TBD
|
|
16
|
-
|
|
17
|
-
**Assertions:**
|
|
18
|
-
|
|
19
|
-
- [ ] TBD
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
# Skill Spec: /host-authoritative-state
|
|
2
|
-
|
|
3
|
-
## Fixture
|
|
4
|
-
|
|
5
|
-
- A Godot 4.5 / Summer Engine project with `/peer-to-peer-multiplayer` Layer 1 already done — `NetworkManager` autoload exists, exposes `peer_joined` / `peer_left` signals.
|
|
6
|
-
- Project may have a partial player scene; no Managers yet.
|
|
7
|
-
- Summer MCP tools available; engine on localhost:6550.
|
|
8
|
-
|
|
9
|
-
## Case 1: Happy Path — design HealthManager from scratch with full ownership audit
|
|
10
|
-
|
|
11
|
-
**Input:** "I want to add health, damage, and a kill counter to my multiplayer game. Help me set it up correctly."
|
|
12
|
-
|
|
13
|
-
**Expected behavior:**
|
|
14
|
-
|
|
15
|
-
1. Skill confirms `NetworkManager` already exists; if not, defers to `/peer-to-peer-multiplayer`.
|
|
16
|
-
2. Skill walks the user through the fundamental question on each new field: `health`, `max_health`, `score`, `kills`. All four → host-owned.
|
|
17
|
-
3. Skill proposes one Manager per domain — `HealthManager` for health/max_health, `ScoreManager` for score/kills. Asks before creating each.
|
|
18
|
-
4. For `HealthManager`, skill walks the canonical shape:
|
|
19
|
-
- Data dict keyed by `peer_id`.
|
|
20
|
-
- `_host_apply_damage()` mutator with `if not NetworkManager.is_host: return` first line.
|
|
21
|
-
- `_client_request_damage()` RPC with `@rpc("any_peer", "call_remote", "reliable")` and validation (range, line-of-sight, cooldown, magnitude).
|
|
22
|
-
- `_broadcast_health()` and `_broadcast_death()` with `@rpc("authority", "call_remote", "reliable")`.
|
|
23
|
-
- `peer_joined` registers, `peer_left` cleans up.
|
|
24
|
-
5. After file write, `summer_get_script_errors` to verify clean compile.
|
|
25
|
-
|
|
26
|
-
**Expected MCP tool sequence (partial):**
|
|
27
|
-
|
|
28
|
-
1. `summer_get_scene_tree` — confirm NetworkManager autoload presence.
|
|
29
|
-
2. `Read autoloads/network_manager.gd` — confirm signals match expected shape.
|
|
30
|
-
3. (User approves HealthManager) `Write autoloads/HealthManager.gd`.
|
|
31
|
-
4. `summer_get_script_errors` to verify.
|
|
32
|
-
5. (User approves ScoreManager) repeat.
|
|
33
|
-
|
|
34
|
-
**Assertions:**
|
|
35
|
-
|
|
36
|
-
- [ ] Skill applies the fundamental question explicitly to each field — does not silently dump generic state.
|
|
37
|
-
- [ ] Skill proposes one Manager per domain, not one mega-Manager for all state.
|
|
38
|
-
- [ ] Every `_host_apply_*` function's first line is `if not NetworkManager.is_host: return`.
|
|
39
|
-
- [ ] Every `_client_request_*` is `@rpc("any_peer", "call_remote", "reliable")` and has at least three validators.
|
|
40
|
-
- [ ] Every `_broadcast_*` is `@rpc("authority", "call_remote", "reliable")`.
|
|
41
|
-
- [ ] `peer_joined` and `peer_left` lifecycle is wired in `_ready()`.
|
|
42
|
-
- [ ] Skill does NOT use `MultiplayerSynchronizer` for any health/score field.
|
|
43
|
-
- [ ] Skill asks "May I…" before each new file creation.
|
|
44
|
-
|
|
45
|
-
## Case 2: Late-join state sync
|
|
46
|
-
|
|
47
|
-
**Input:** "I have HealthManager working but new players who join mid-match see 100 HP for everyone, even players who are at 30 HP. Fix it."
|
|
48
|
-
|
|
49
|
-
**Expected behavior:**
|
|
50
|
-
|
|
51
|
-
- Skill identifies the bug: no late-join state replay.
|
|
52
|
-
- Skill explains the pattern: `_send_full_state(peer_id)` method on each Manager, called from `peer_joined`, uses `rpc_id` (flavor 4) to target only the joining peer.
|
|
53
|
-
- Skill audits all existing Managers for missing `_send_full_state` and adds it.
|
|
54
|
-
- Skill verifies idempotency — receiving a broadcast twice for the same peer must be a no-op.
|
|
55
|
-
|
|
56
|
-
**Assertions:**
|
|
57
|
-
|
|
58
|
-
- [ ] Skill diagnoses the missing late-join replay before writing code.
|
|
59
|
-
- [ ] Skill uses `rpc_id(target_peer, ...)` (flavor 4), NOT a broadcast to all peers.
|
|
60
|
-
- [ ] Skill audits ALL existing Managers, not just HealthManager — score, inventory, cooldowns all need the same fix.
|
|
61
|
-
- [ ] Skill checks that broadcast handlers are idempotent before shipping.
|
|
62
|
-
- [ ] `summer_get_script_errors` runs after each file edit.
|
|
63
|
-
|
|
64
|
-
## Case 3: Edge — client wants to lie about position (client-predicted)
|
|
65
|
-
|
|
66
|
-
**Input:** "A peer reports another player is teleporting around the map. I added validation to `_client_request_position()` and it blocks legitimate movement. What do I do?"
|
|
67
|
-
|
|
68
|
-
**Expected behavior:**
|
|
69
|
-
|
|
70
|
-
- Skill identifies the user has put `position` into the wrong column. Position is **host-authoritative with client prediction**, not pure host-owned.
|
|
71
|
-
- Skill explains: clients send their input/intent (movement direction + jump), not their final position. Host runs the same physics function authoritatively. If host's computed position diverges from client's reported position by more than a tolerance, host snaps the client (reconciliation).
|
|
72
|
-
- Skill removes the `_client_request_position` validator and points to `/peer-to-peer-multiplayer` Layer 4 for the prediction/reconciliation pattern.
|
|
73
|
-
- Skill notes that "blocking" position requests defeats the point of prediction — it would make movement feel terrible. The right response to a divergent client is reconciliation, not rejection.
|
|
74
|
-
|
|
75
|
-
**Assertions:**
|
|
76
|
-
|
|
77
|
-
- [ ] Skill recognizes position is the "Sometimes" category from the fundamental question, not pure host-owned.
|
|
78
|
-
- [ ] Skill defers reconciliation logic to `/peer-to-peer-multiplayer` Layer 4 instead of inventing a new pattern.
|
|
79
|
-
- [ ] Skill does NOT propose validating each position update with range/distance checks — that's the wrong tool.
|
|
80
|
-
- [ ] Skill explains why teleport-cheating is caught by reconciliation, not rejection.
|
|
81
|
-
|
|
82
|
-
## Case 4: No Summer MCP — fallback path
|
|
83
|
-
|
|
84
|
-
**Fixture:** Same as Case 1, but Summer MCP unavailable.
|
|
85
|
-
|
|
86
|
-
**Input:** "Add a HealthManager autoload to my multiplayer game."
|
|
87
|
-
|
|
88
|
-
**Expected behavior:**
|
|
89
|
-
|
|
90
|
-
- Skill detects MCP unavailable.
|
|
91
|
-
- Walks the same Manager shape (data, mutators, requests, broadcasts, lifecycle).
|
|
92
|
-
- Instead of `summer_get_script_errors`, asks the user to save and check errors via the Godot editor.
|
|
93
|
-
- Provides exact `[autoload]` lines for `project.godot` to paste.
|
|
94
|
-
- File write still goes through `Write` host tool with "May I…" approval.
|
|
95
|
-
|
|
96
|
-
**Assertions:**
|
|
97
|
-
|
|
98
|
-
- [ ] Skill detects MCP unavailable; doesn't blindly call `summer_*` tools and fail.
|
|
99
|
-
- [ ] `project.godot` autoload lines are provided as exact paste-able text.
|
|
100
|
-
- [ ] Manager shape (5-part: data / mutators / requests / broadcasts / lifecycle) is identical regardless of MCP availability.
|
|
101
|
-
|
|
102
|
-
---
|
|
103
|
-
|
|
104
|
-
This spec runs via `/skill-test host-authoritative-state spec` (see `_meta/skill-test/SKILL.md`).
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
# Skill Spec: /make-game
|
|
2
|
-
|
|
3
|
-
> Stub spec. Expand with Happy / Failure / Edge cases. See `fps-controller.md` for the canonical format.
|
|
4
|
-
|
|
5
|
-
## Fixture
|
|
6
|
-
|
|
7
|
-
- TBD
|
|
8
|
-
|
|
9
|
-
## Case 1: Happy Path
|
|
10
|
-
|
|
11
|
-
**Input:** "<typical user prompt>"
|
|
12
|
-
|
|
13
|
-
**Expected MCP tool sequence (in order):**
|
|
14
|
-
|
|
15
|
-
1. TBD
|
|
16
|
-
|
|
17
|
-
**Assertions:**
|
|
18
|
-
|
|
19
|
-
- [ ] TBD
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
# Skill Spec: /peer-to-peer-multiplayer
|
|
2
|
-
|
|
3
|
-
## Fixture
|
|
4
|
-
|
|
5
|
-
- A Godot 4.5 / Summer Engine project that does NOT yet have multiplayer.
|
|
6
|
-
- Project may be empty or may have an existing single-player scene.
|
|
7
|
-
- Summer MCP tools available; engine running on localhost:6550.
|
|
8
|
-
|
|
9
|
-
## Case 1: Happy Path — fresh multiplayer architecture from scratch
|
|
10
|
-
|
|
11
|
-
**Input:** "I want to add 2-player co-op to my game. Players will connect through Steam friend invites."
|
|
12
|
-
|
|
13
|
-
**Expected behavior:**
|
|
14
|
-
|
|
15
|
-
1. Skill confirms P2P is the right architecture (Steam friend invite ≤8 players → P2P, not dedicated server).
|
|
16
|
-
2. Skill walks the four layers in order, checkpointing between each.
|
|
17
|
-
3. Layer 1: asks "May I create `autoloads/network_manager.gd`?" — creates it on user OK, calls `summer_project_setting` to register the autoload.
|
|
18
|
-
4. Layer 2: asks "May I create `autoloads/game_state.gd` and walk through the authority decision matrix?" — creates it, prompts user for game-specific state fields and proposes ownership.
|
|
19
|
-
5. Layer 3: explains the three RPC patterns with examples; doesn't auto-apply (this is reference material until concrete game logic exists).
|
|
20
|
-
6. Layer 4: defers prediction/interpolation until there's a player scene to apply it to.
|
|
21
|
-
|
|
22
|
-
**Expected MCP tool sequence (in order, partial):**
|
|
23
|
-
|
|
24
|
-
1. `summer_get_scene_tree` — see what already exists.
|
|
25
|
-
2. `summer_get_project_context` — read autoload list to avoid name collisions.
|
|
26
|
-
3. (User approves Layer 1) `Write autoloads/network_manager.gd`.
|
|
27
|
-
4. `summer_project_setting(key="autoload/NetworkManager", value="*res://autoloads/network_manager.gd")`.
|
|
28
|
-
5. (User approves Layer 2) `Write autoloads/game_state.gd`.
|
|
29
|
-
6. `summer_project_setting(key="autoload/GameState", value="*res://autoloads/game_state.gd")`.
|
|
30
|
-
7. `summer_save_scene` and `summer_get_script_errors` to verify clean.
|
|
31
|
-
|
|
32
|
-
**Assertions:**
|
|
33
|
-
|
|
34
|
-
- [ ] Skill explicitly checks Step 0 (P2P vs. client-server) before any code is written.
|
|
35
|
-
- [ ] Skill creates Layer 1 (NetworkManager) before Layer 2 (GameState).
|
|
36
|
-
- [ ] NetworkManager is the only place that calls `multiplayer.peer_connected.connect()` directly. GameState listens to NetworkManager signals, NOT to the multiplayer API directly.
|
|
37
|
-
- [ ] GameState uses `@rpc("authority", "call_remote", "reliable")` for host-broadcast functions and `@rpc("any_peer", "call_remote", "reliable")` with a `is_host` guard for client-request functions.
|
|
38
|
-
- [ ] Skill walks the user through the authority decision matrix before writing GameState. Doesn't dump generic state fields without asking what the game has.
|
|
39
|
-
- [ ] Skill asks "May I…" before each new file creation and before the autoload registration.
|
|
40
|
-
- [ ] Skill does NOT apply prediction/interpolation in Layer 4 unless there's an existing player scene to wire into.
|
|
41
|
-
- [ ] At any layer, `summer_get_script_errors` is called after the file write to confirm clean compile.
|
|
42
|
-
|
|
43
|
-
## Case 2: Failure Path — user wants matchmaking at scale
|
|
44
|
-
|
|
45
|
-
**Input:** "I'm building a competitive shooter. I want matchmaking with anti-cheat for 10,000 concurrent matches."
|
|
46
|
-
|
|
47
|
-
**Expected behavior:**
|
|
48
|
-
|
|
49
|
-
- Skill recognizes Step 0: this is dedicated client-server territory, not P2P.
|
|
50
|
-
- Skill explains why P2P is wrong (host can cheat, no anti-cheat hooks, scale concerns).
|
|
51
|
-
- Skill defers to `/summer:client-server-multiplayer` (when shipped) OR explains the user needs to roll a custom server.
|
|
52
|
-
- Does NOT start writing P2P NetworkManager code anyway.
|
|
53
|
-
|
|
54
|
-
**Assertions:**
|
|
55
|
-
|
|
56
|
-
- [ ] Skill stops at Step 0 — does NOT proceed to Layer 1.
|
|
57
|
-
- [ ] Skill explains the architecture mismatch in one sentence.
|
|
58
|
-
- [ ] Skill names the right alternative (client-server) and which skill to use instead.
|
|
59
|
-
|
|
60
|
-
## Case 3: Edge Case — retrofitting multiplayer to a single-player game
|
|
61
|
-
|
|
62
|
-
**Input:** "I have a single-player platformer that's mostly done. Can you add multiplayer?"
|
|
63
|
-
|
|
64
|
-
**Expected behavior:**
|
|
65
|
-
|
|
66
|
-
- Skill is honest about the cost: retrofitting multiplayer is 5× harder than starting MP-first.
|
|
67
|
-
- Skill asks: "Are you committed? It will require auditing every state mutation in your existing code. Time estimate: significant."
|
|
68
|
-
- If user proceeds: skill walks the same 4 layers but adds an AUDIT phase before Layer 2: identify every place existing code writes to state that should be host-authoritative.
|
|
69
|
-
- If user balks: skill points to alternatives (release MP as a sequel; ship single-player; add async leaderboards instead).
|
|
70
|
-
|
|
71
|
-
**Assertions:**
|
|
72
|
-
|
|
73
|
-
- [ ] Skill warns about retrofit cost BEFORE starting Layer 1.
|
|
74
|
-
- [ ] Skill adds an AUDIT step that doesn't exist in the happy-path workflow.
|
|
75
|
-
- [ ] Skill never silently proceeds as if the game were greenfield.
|
|
76
|
-
|
|
77
|
-
## Case 4: No Summer MCP — fallback path
|
|
78
|
-
|
|
79
|
-
**Fixture:** Same as Case 1, but Summer MCP unavailable.
|
|
80
|
-
|
|
81
|
-
**Input:** "Add multiplayer to my Godot game (P2P, friend invite)."
|
|
82
|
-
|
|
83
|
-
**Expected behavior:**
|
|
84
|
-
|
|
85
|
-
- Skill detects MCP unavailable.
|
|
86
|
-
- Walks the same 4 layers.
|
|
87
|
-
- Instead of `summer_project_setting`, asks the user to manually edit `project.godot`'s `[autoload]` section — provides the exact lines to paste.
|
|
88
|
-
- Instead of `summer_save_scene` / `summer_get_script_errors`, asks the user to save and check errors via the Godot editor.
|
|
89
|
-
- All file writes still go through `Write` host tool with "May I…" approval per file.
|
|
90
|
-
|
|
91
|
-
**Assertions:**
|
|
92
|
-
|
|
93
|
-
- [ ] Skill detects MCP unavailable; doesn't blindly call `summer_*` tools and fail.
|
|
94
|
-
- [ ] Project.godot edits are provided as exact paste-able lines.
|
|
95
|
-
- [ ] Workflow shape (4 layers, checkpoints between) is identical regardless of MCP availability.
|
|
96
|
-
|
|
97
|
-
---
|
|
98
|
-
|
|
99
|
-
This spec runs via `/skill-test peer-to-peer-multiplayer spec` (see `_meta/skill-test/SKILL.md`).
|