summer-engine 1.3.1 → 1.3.2
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/CHANGELOG.md +67 -0
- package/package.json +5 -3
- package/skills/_meta/skill-test/SKILL.md +1 -1
- package/skills/_shared/summer-folder.md +44 -0
- package/skills/_tests/specs/art-direction.md +115 -0
- package/skills/_tests/specs/audio-direction.md +123 -0
- package/skills/_tests/specs/brainstorm-game.md +99 -0
- package/skills/_tests/specs/design-level.md +113 -0
- package/skills/_tests/specs/design-mechanic.md +112 -0
- package/skills/_tests/specs/design-npc.md +112 -0
- package/skills/_tests/specs/export-and-ship.md +114 -0
- package/skills/_tests/specs/fps-controller.md +5 -5
- package/skills/_tests/specs/setup-multiplayer.md +106 -0
- package/skills/_tests/specs/tune-performance.md +104 -0
- package/skills/_tests/specs/vfx.md +98 -0
- package/skills/ai-and-npcs/design-npc/SKILL.md +343 -0
- package/skills/audio/audio-direction/SKILL.md +258 -0
- package/skills/deployment/export-and-ship/SKILL.md +300 -0
- package/skills/gameplay-mechanics/design-mechanic/SKILL.md +265 -0
- package/skills/level-design/design-level/SKILL.md +266 -0
- package/skills/multiplayer-and-networking/setup-multiplayer/SKILL.md +328 -0
- package/skills/performance/tune-performance/SKILL.md +219 -0
- package/skills/rendering-and-lighting/art-direction/SKILL.md +284 -0
- package/skills/scene-and-project/brainstorm-game/SKILL.md +210 -0
- package/skills/visual-effects/vfx/SKILL.md +280 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to summer-engine will be documented here. Following [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and [Semantic Versioning](https://semver.org/).
|
|
4
|
+
|
|
5
|
+
## [1.3.2] — 2026-05-05
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
- `summer_input_map_bind` syntax aligned across `fps-controller` SKILL.md and its behavioral test spec.
|
|
9
|
+
- `_meta/skill-test` static linter relaxed to allow forward-reference `See also` links to other SKILL.md files (warn instead of fail).
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
- `_shared/summer-folder.md` — canonical `.summer/` folder convention (documents files written by `/summer:brainstorm-game`, `/summer:art-direction`, etc.).
|
|
13
|
+
- `CHANGELOG.md` — retroactive v1.0.0 → v1.3.1 history.
|
|
14
|
+
|
|
15
|
+
## [1.3.1] — 2026-05-05
|
|
16
|
+
|
|
17
|
+
### Added
|
|
18
|
+
- ASCII banner displays on bare `summer` command (`npx summer-engine`).
|
|
19
|
+
- ANSI colors throughout: green ✓ for OK, yellow ⚠ for warnings, red ✗ for failures.
|
|
20
|
+
- Brand line + colored slash command list in setup output.
|
|
21
|
+
- `/debug` workflow skill — triage and fix a bug end-to-end via Summer MCP diagnostics.
|
|
22
|
+
- `/play` workflow skill — run the game and report state.
|
|
23
|
+
- 7 specialist skills marked `user-invocable: false` (auto-trigger only).
|
|
24
|
+
|
|
25
|
+
### Fixed
|
|
26
|
+
- `summer doctor` defaults to human-readable output instead of JSON.
|
|
27
|
+
- Engine path display shortened (`/Applications/Summer.app/Contents/MacOS/Summer` → `/Applications/Summer.app`).
|
|
28
|
+
- Home-relative paths now display tildeified.
|
|
29
|
+
- MCP server status no longer leaks "stdio" implementation detail (now reads "ready").
|
|
30
|
+
- `tools/summer-cli/src/bin/` finally tracked in git (root `.gitignore`'s `[Bb]in/` was silently excluding the npm entrypoint).
|
|
31
|
+
- `LICENSE` now bundled in the npm tarball.
|
|
32
|
+
|
|
33
|
+
## [1.3.0] — 2026-05-05
|
|
34
|
+
|
|
35
|
+
### Added
|
|
36
|
+
- 20-category skill library scaffold with descriptive folder names (`character-controllers`, `gameplay-mechanics`, `scripting-patterns`, etc.).
|
|
37
|
+
- `_shared/` directory with 5 canonical references (godot-version, mcp-tools-reference, collaborative-protocol, template-registry, gd-style).
|
|
38
|
+
- `_meta/` directory with 3 meta-skills (skill-test linter, skill-create bootstrap, skill-improve eval harness).
|
|
39
|
+
- `_tests/specs/` directory with per-skill behavioral test specs (fps-controller as canonical format).
|
|
40
|
+
- `catalog.yaml` — 85-skill roadmap with HAVE / NEXT / LATER status.
|
|
41
|
+
|
|
42
|
+
### Changed
|
|
43
|
+
- 7 existing skills migrated into category folders with Anthropic-spec frontmatter (`category`, `template-id`, `allowed-tools`, `paths`).
|
|
44
|
+
- CLI `skills install` walks `<skillsDir>/<category>/<name>/` paths.
|
|
45
|
+
|
|
46
|
+
## [1.2.1] — 2026-05-05
|
|
47
|
+
|
|
48
|
+
### Added
|
|
49
|
+
- `summer setup <agent>` — one-shot MCP config + recommended skills install + doctor.
|
|
50
|
+
- `summer doctor` — node, login, engine, local API, MCP boot diagnostics.
|
|
51
|
+
- `summer mcp setup <agent>` — idempotent JSON/TOML config writer.
|
|
52
|
+
- Multi-agent skills install (codex, claude-code, cursor, windsurf with user/project scopes; Cursor `.mdc` rule generation; Windsurf rule blocks).
|
|
53
|
+
- Skill registry (`src/lib/skills-registry.ts`) with category metadata.
|
|
54
|
+
- Per-agent docs (AGENT_KIT, CLAUDE_CODE, CODEX, CURSOR, SKILLS, TEMPLATES).
|
|
55
|
+
|
|
56
|
+
### Changed
|
|
57
|
+
- `/api/mcp/assets`: removed Pro gate; public/community asset search now free for all signed-in users (deployed on summerengine.com).
|
|
58
|
+
- `/api/mcp/log-local-call`: removed visible 100/week quota; auth-gated telemetry only.
|
|
59
|
+
|
|
60
|
+
## [1.2.0] — 2026-04-23
|
|
61
|
+
|
|
62
|
+
### Added
|
|
63
|
+
- Initial public release on npm.
|
|
64
|
+
- MCP server with 36 `summer_*` tools.
|
|
65
|
+
- 7 specialist skills (`fps-controller`, `gdscript-patterns`, `scene-composition`, `3d-lighting`, `ui-basics`, `asset-strategy`, `make-game`).
|
|
66
|
+
- CLI commands (`install`, `login`, `logout`, `status`, `run`, `open`, `create`, `list`, `skills`, `mcp`).
|
|
67
|
+
- MIT license.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "summer-engine",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.2",
|
|
4
4
|
"description": "CLI and MCP tools for Summer Engine — the AI-native game engine",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"game-engine",
|
|
@@ -25,7 +25,9 @@
|
|
|
25
25
|
"files": [
|
|
26
26
|
"dist/",
|
|
27
27
|
"skills/",
|
|
28
|
-
"README.md"
|
|
28
|
+
"README.md",
|
|
29
|
+
"LICENSE",
|
|
30
|
+
"CHANGELOG.md"
|
|
29
31
|
],
|
|
30
32
|
"scripts": {
|
|
31
33
|
"build": "tsc",
|
|
@@ -33,7 +35,7 @@
|
|
|
33
35
|
"summer": "node dist/bin/summer.js",
|
|
34
36
|
"test": "vitest run",
|
|
35
37
|
"test:watch": "vitest",
|
|
36
|
-
"prepublishOnly": "npm run build"
|
|
38
|
+
"prepublishOnly": "npm run build && npm test"
|
|
37
39
|
},
|
|
38
40
|
"engines": {
|
|
39
41
|
"node": ">=18"
|
|
@@ -23,7 +23,7 @@ For a single skill at `skills/<category>/<name>/`, run these checks:
|
|
|
23
23
|
4. **Collaborative protocol.** If the skill triggers user-visible writes, body must contain at least one of: `May I`, `I'm about to`, `Continue?`, `OK?`, `Proceed?`. Skills that only inspect/read are exempt.
|
|
24
24
|
5. **Template-id resolved.** If the skill's frontmatter declares `template-id: <id>`, that id must exist in `_shared/template-registry.md`.
|
|
25
25
|
6. **Tests/spec.md present.** Every skill in a non-`_meta` category must have `tests/spec.md` with at least one `## Case` heading.
|
|
26
|
-
7. **
|
|
26
|
+
7. **Relative links resolve.** Every `](../_shared/...)`, `](../../_shared/...)`, `](./references/...)`, and `](./examples/...)` link must point at an existing file (FAIL if broken). Forward references in `## See also` to other SKILL.md files (e.g., `[design-mechanic](../../gameplay-mechanics/design-mechanic/SKILL.md)`) are allowed to dangle and only WARN if the target is missing — the catalog evolves and skills should be free to point at planned skills.
|
|
27
27
|
|
|
28
28
|
Output:
|
|
29
29
|
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# `.summer/` Folder Convention
|
|
2
|
+
|
|
3
|
+
> The canonical layout for project-scoped Summer state. Read this if you're authoring a skill that writes durable design output (briefs, art bible, level docs).
|
|
4
|
+
|
|
5
|
+
## Files at the root of `.summer/`
|
|
6
|
+
|
|
7
|
+
- `GameSoul.md` — the project brief. Created by `/summer:brainstorm-game`. Contains: name, one-sentence pitch, core loop, 3 mechanics max, art direction summary, scope. Updated whenever the game's high-level direction changes.
|
|
8
|
+
- `art-bible.md` — visual style reference. Created by `/summer:art-direction`. Contains: palette (6–15 hex codes), mood adjectives, lighting plan, post-processing notes, do/don't list, references.
|
|
9
|
+
- `audio-bible.md` — sonic identity. Created by `/summer:audio-direction`. Contains: music style + tempo range, SFX vocabulary (8 classes), dynamic music FSM, bus layout reference.
|
|
10
|
+
|
|
11
|
+
## Subdirectories
|
|
12
|
+
|
|
13
|
+
- `mechanics/<mechanic-name>.md` — one file per designed mechanic (e.g., `double-jump.md`, `parry.md`). Created by `/summer:design-mechanic`. Contains: input → response → feedback → failure modes → tunable parameters.
|
|
14
|
+
- `levels/<level-name>.md` — one file per designed level. Created by `/summer:design-level`. Contains: teaching goal, pacing curve (5 beats), encounters, secrets, reward gating.
|
|
15
|
+
- `npcs/<npc-name>.md` — one file per designed NPC. Created by `/summer:design-npc`. Contains: archetype, perception model, decision tree, escalation, defeat sequence.
|
|
16
|
+
|
|
17
|
+
## Conventions
|
|
18
|
+
|
|
19
|
+
- All filenames are lowercase, hyphens not underscores.
|
|
20
|
+
- Skills MUST ask "May I write/update `.summer/<file>`?" before any write to this folder.
|
|
21
|
+
- Skills MAY read existing files in `.summer/` without permission to ground their output in prior decisions.
|
|
22
|
+
- The folder lives in the project root (sibling to `project.godot`).
|
|
23
|
+
- Add `.summer/` to `.gitignore` if the user prefers it private; default is to commit it (game design lives with the game).
|
|
24
|
+
|
|
25
|
+
## Skills that write here
|
|
26
|
+
|
|
27
|
+
| Skill | Writes |
|
|
28
|
+
|---|---|
|
|
29
|
+
| `/summer:brainstorm-game` | `.summer/GameSoul.md` |
|
|
30
|
+
| `/summer:art-direction` | `.summer/art-bible.md` |
|
|
31
|
+
| `/summer:audio-direction` | `.summer/audio-bible.md` |
|
|
32
|
+
| `/summer:design-mechanic` | `.summer/mechanics/<name>.md` |
|
|
33
|
+
| `/summer:design-level` | `.summer/levels/<name>.md` |
|
|
34
|
+
| `/summer:design-npc` | `.summer/npcs/<name>.md` |
|
|
35
|
+
| `/summer:debug` | does NOT write here |
|
|
36
|
+
| `/summer:play` | does NOT write here |
|
|
37
|
+
| `/summer:vfx` | does NOT write here (VFX edits scenes/scripts) |
|
|
38
|
+
| `/summer:tune-performance` | optionally writes `.summer/perf-notes.md` if user requests |
|
|
39
|
+
| `/summer:setup-multiplayer` | optionally writes `.summer/multiplayer-architecture.md` |
|
|
40
|
+
| `/summer:export-and-ship` | does NOT write here (writes export configs in `project.godot`) |
|
|
41
|
+
|
|
42
|
+
## Linter check (future)
|
|
43
|
+
|
|
44
|
+
Once `_meta/skill-test` gains an executable mode, it should validate that any skill writing to `.summer/` is documented in the table above.
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# Skill Spec: /art-direction
|
|
2
|
+
|
|
3
|
+
## Fixture
|
|
4
|
+
|
|
5
|
+
- Godot 4.5 / Summer Engine project, main scene with `World/WorldEnvironment` and `World/Sun` (DirectionalLight3D) present.
|
|
6
|
+
- `.summer/GameSoul.md` exists; brief: "Cozy farming sim, vertical slice scope."
|
|
7
|
+
- No `.summer/art-bible.md` yet.
|
|
8
|
+
- Summer MCP available.
|
|
9
|
+
|
|
10
|
+
## Case 1: Happy Path — define art direction for cozy farming sim
|
|
11
|
+
|
|
12
|
+
**Input:** "Help me define the art direction. References: Stardew Valley and Sable."
|
|
13
|
+
|
|
14
|
+
**Expected MCP tool sequence (in order):**
|
|
15
|
+
|
|
16
|
+
1. `Read .summer/GameSoul.md` — anchor
|
|
17
|
+
2. (Skill notes: brief says "cozy", which forbids harsh contrast / saturated reds)
|
|
18
|
+
3. (Skill walks: technique pick → palette (6-15 hex codes) → mood adjectives → lighting plan → post-processing rules → do/don't list)
|
|
19
|
+
4. (Skill shows the bible inline)
|
|
20
|
+
5. (Skill asks: "May I update `project.godot`'s default clear color to the palette primary, and enable MSAA 2x?")
|
|
21
|
+
6. `summer_project_setting(key="rendering/environment/defaults/default_clear_color", value="Color(...)")`
|
|
22
|
+
7. `summer_project_setting(key="rendering/anti_aliasing/quality/msaa_3d", value="2")`
|
|
23
|
+
8. (Skill asks: "May I dial in the WorldEnvironment + Sun to the lighting plan?")
|
|
24
|
+
9. `summer_inspect_node(path="./World/WorldEnvironment")`
|
|
25
|
+
10. `summer_set_prop(...)` — adjustments + tonemap per the plan
|
|
26
|
+
11. `summer_set_prop(path="./World/Sun", key="light_color", value="Color(...)")`
|
|
27
|
+
12. (Skill asks: "May I create `.summer/art-bible.md` with this bible?")
|
|
28
|
+
13. `Write .summer/art-bible.md`
|
|
29
|
+
|
|
30
|
+
**Assertions:**
|
|
31
|
+
|
|
32
|
+
- [ ] Skill reads `.summer/GameSoul.md` to anchor.
|
|
33
|
+
- [ ] Skill enforces 2+ references — does not proceed with single reference.
|
|
34
|
+
- [ ] Skill picks ONE rendering technique (does not allow blending without naming the conflict).
|
|
35
|
+
- [ ] Palette has 6-15 hex codes; uses off-white (e.g., #f4ecdf) and off-black (e.g., #1f1a16) — flags pure #ffffff or #000000 if user pitches them.
|
|
36
|
+
- [ ] Mood adjectives are concrete (e.g., "soft, hand-warmed, golden-hour"), not vague ("cool, atmospheric").
|
|
37
|
+
- [ ] Lighting plan names DirectionalLight3D color, energy, angle; sky colors; ambient; never-rules.
|
|
38
|
+
- [ ] Post-processing has explicit ON/OFF/value calls per item (Glow, SDFGI, SSAO, SSR, Tonemap, Vignette, Chromatic aberration, Film grain) — NOT a list of options.
|
|
39
|
+
- [ ] DO and DON'T lists each have at least 5 specific, enforceable rules.
|
|
40
|
+
- [ ] DON'T list explicitly forbids chromatic aberration, motion blur, lens flare unless mood justifies them.
|
|
41
|
+
- [ ] Skill asks "May I ..." before any `summer_project_setting` or `summer_set_prop` call.
|
|
42
|
+
- [ ] Skill writes `.summer/art-bible.md` only after asking.
|
|
43
|
+
- [ ] Skill never calls `summer_set_resource_property` on an inline sub_resource (silent-fail trap).
|
|
44
|
+
- [ ] Skill ends with routing to `/summer:audio-direction` or similar.
|
|
45
|
+
|
|
46
|
+
## Case 2: Failure Path — mixed-technique pitch
|
|
47
|
+
|
|
48
|
+
**Fixture:** Same as Case 1.
|
|
49
|
+
|
|
50
|
+
**Input:** "I want PBR realistic characters in a toon-shaded world."
|
|
51
|
+
|
|
52
|
+
**Expected behavior:**
|
|
53
|
+
|
|
54
|
+
- Skill identifies the conflict explicitly: "Toon characters in a PBR world fight. The lighting that makes PBR read realistic crushes toon shading; the flat shading that makes toon read clean strips PBR's value."
|
|
55
|
+
- Skill offers a hierarchy: "(a) PBR with toon outlines (one technique), (b) full-toon with PBR-feeling fabric (one technique), (c) accept the conflict and pick which side wins on which assets."
|
|
56
|
+
- Skill does NOT silently pick or design two parallel pipelines.
|
|
57
|
+
|
|
58
|
+
**Assertions:**
|
|
59
|
+
|
|
60
|
+
- [ ] Skill names the technique conflict out loud.
|
|
61
|
+
- [ ] Skill explains *why* the techniques fight (lighting interaction).
|
|
62
|
+
- [ ] Skill forces the user to pick one primary technique.
|
|
63
|
+
- [ ] No bible written until the technique is locked.
|
|
64
|
+
|
|
65
|
+
## Case 3: Edge Case — user pitches pure white + pure black palette
|
|
66
|
+
|
|
67
|
+
**Fixture:** Same as Case 1.
|
|
68
|
+
|
|
69
|
+
**Input:** "Black-and-white only, super high contrast. Like Limbo."
|
|
70
|
+
|
|
71
|
+
**Expected behavior:**
|
|
72
|
+
|
|
73
|
+
- Skill recognizes the intent (high-contrast monochrome) but flags pure values: "Limbo isn't actually pure black — it's #0a0a0a to #f0f0f0 with subtle warm tint. Pure #000 + #fff makes UI text vibrate and reads as unintentional."
|
|
74
|
+
- Skill offers a near-monochrome palette: e.g., #0a0a0a, #2a2a2a, #6e6e6e, #c0c0c0, #f0f0f0 with one accent color (often warm) reserved for a single mechanic-tied use.
|
|
75
|
+
- Skill writes the bible with off-pure values and documents the single-accent rule in the DO list.
|
|
76
|
+
|
|
77
|
+
**Assertions:**
|
|
78
|
+
|
|
79
|
+
- [ ] Skill flags pure #000 / #fff as a red flag and corrects to off-pure values.
|
|
80
|
+
- [ ] Bible includes at least one accent color reserved for mechanic-tied use.
|
|
81
|
+
- [ ] Skill explains *why* (UI vibration, "looks unintentional") not just "use these values".
|
|
82
|
+
|
|
83
|
+
## Case 4: No Summer MCP — file-edit fallback
|
|
84
|
+
|
|
85
|
+
**Fixture:** Same as Case 1, but Summer MCP is unavailable.
|
|
86
|
+
|
|
87
|
+
**Input:** "Define the art direction for my farming sim."
|
|
88
|
+
|
|
89
|
+
**Expected behavior:**
|
|
90
|
+
|
|
91
|
+
- Skill detects no MCP.
|
|
92
|
+
- Walks the design beats normally.
|
|
93
|
+
- Instead of `summer_project_setting`, prints the `project.godot` snippet for the user to paste:
|
|
94
|
+
|
|
95
|
+
```
|
|
96
|
+
[rendering]
|
|
97
|
+
environment/defaults/default_clear_color=Color(0.227, 0.290, 0.227, 1)
|
|
98
|
+
anti_aliasing/quality/msaa_3d=2
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
- Instead of `summer_set_prop` on WorldEnvironment, prints the `.tscn` snippet for the user to paste into the main scene.
|
|
102
|
+
- Still writes `.summer/art-bible.md` via host `Write`.
|
|
103
|
+
- Asks "May I write ..." before each file write.
|
|
104
|
+
|
|
105
|
+
**Assertions:**
|
|
106
|
+
|
|
107
|
+
- [ ] Skill identifies that MCP is unavailable; does not blindly call `summer_*`.
|
|
108
|
+
- [ ] Generated `project.godot` snippet uses correct INI section format.
|
|
109
|
+
- [ ] Generated `.tscn` snippet for WorldEnvironment is parseable Godot 4.
|
|
110
|
+
- [ ] Skill still writes `.summer/art-bible.md`.
|
|
111
|
+
- [ ] Skill still asks "May I write ..." before each write.
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
This spec runs via `/skill-test art-direction spec` (see `_meta/skill-test/SKILL.md`).
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# Skill Spec: /audio-direction
|
|
2
|
+
|
|
3
|
+
## Fixture
|
|
4
|
+
|
|
5
|
+
- Godot 4.5 / Summer Engine project, default audio bus layout (Master only).
|
|
6
|
+
- `.summer/GameSoul.md` exists; brief: "Cozy farming sim, vertical slice scope."
|
|
7
|
+
- `.summer/art-bible.md` exists; mood: "soft, hand-warmed, golden-hour, painterly".
|
|
8
|
+
- No `.summer/audio-bible.md` yet.
|
|
9
|
+
- No `audio/` folder yet.
|
|
10
|
+
- Summer MCP available.
|
|
11
|
+
|
|
12
|
+
## Case 1: Happy Path — define audio direction for cozy farming sim
|
|
13
|
+
|
|
14
|
+
**Input:** "Define the audio direction. References: Stardew Valley OST, Studio Ghibli scores, and Outer Wilds. Acoustic, organic SFX."
|
|
15
|
+
|
|
16
|
+
**Expected MCP tool sequence (in order):**
|
|
17
|
+
|
|
18
|
+
1. `Read .summer/GameSoul.md` — anchor to brief
|
|
19
|
+
2. `Read .summer/art-bible.md` — anchor to visual mood
|
|
20
|
+
3. (Skill notes the rhyme: "soft, hand-warmed, golden-hour" + acoustic references = acoustic / folk style as primary)
|
|
21
|
+
4. (Skill walks: music style → tempo + key → SFX vocabulary (8 classes) → dynamic music plan with state machine → spatial + mix rules)
|
|
22
|
+
5. (Skill shows the bible inline)
|
|
23
|
+
6. (Skill asks: "May I create `audio/default_bus_layout.tres` with these buses: Master / Music / SFX / UI / Voice / Ambient / Reverb_Small / Reverb_Large / Reverb_Outdoor?")
|
|
24
|
+
7. `Write audio/default_bus_layout.tres`
|
|
25
|
+
8. `summer_project_setting(key="audio/buses/default_bus_layout", value="res://audio/default_bus_layout.tres")`
|
|
26
|
+
9. (Skill asks: "May I create `.summer/audio-bible.md` with this bible?")
|
|
27
|
+
10. `Write .summer/audio-bible.md`
|
|
28
|
+
11. (Skill optionally asks: "May I generate first-pass SFX seeds for UI, pickup, damage?")
|
|
29
|
+
12. (On yes) `summer_generate_audio(prompt="soft woody UI click, 80ms, no reverb", duration=0.1)` etc.
|
|
30
|
+
|
|
31
|
+
**Assertions:**
|
|
32
|
+
|
|
33
|
+
- [ ] Skill reads BOTH `.summer/GameSoul.md` AND `.summer/art-bible.md` to anchor.
|
|
34
|
+
- [ ] Skill enforces 3+ references — does not proceed with one or two.
|
|
35
|
+
- [ ] Skill picks ONE primary music style; if user pitches multiple, names the conflict.
|
|
36
|
+
- [ ] Music section has explicit tempo range (BPM), key center, time signature — not "varies".
|
|
37
|
+
- [ ] SFX vocabulary has 8 classes, each with character + examples + a DON'T rule.
|
|
38
|
+
- [ ] DON'T rules include things like "no pure sine ding for pickup" and "no same footstep for all surfaces".
|
|
39
|
+
- [ ] Dynamic music plan picks ONE model (layered / vertical / horizontal / procedural) — not a list.
|
|
40
|
+
- [ ] Dynamic music plan defines a state machine with named states + transitions + crossfade times.
|
|
41
|
+
- [ ] Spatial + mix section has concrete dB values, attenuation curve, max distance, master ceiling -1 dBTP.
|
|
42
|
+
- [ ] Mix defaults to SFX 0 dB / Music -8 dB / UI -3 dB (SFX loudest).
|
|
43
|
+
- [ ] Bus layout has at least Music, SFX, UI, Voice, Ambient + 1+ Reverb send buses.
|
|
44
|
+
- [ ] Skill asks "May I ..." before any `Write`, `summer_project_setting`, or `summer_generate_audio` call.
|
|
45
|
+
- [ ] Skill writes `.summer/audio-bible.md` only after asking.
|
|
46
|
+
- [ ] Skill never calls `summer_set_resource_property` on an inline sub_resource (silent-fail trap).
|
|
47
|
+
- [ ] Skill ends with routing to `/summer:design-mechanic` or implementation skill.
|
|
48
|
+
|
|
49
|
+
## Case 2: Failure Path — references contradict the brief
|
|
50
|
+
|
|
51
|
+
**Fixture:** Same as Case 1, but brief says "horror walking sim".
|
|
52
|
+
|
|
53
|
+
**Input:** "References: Mario 64 OST, A Hat in Time, Banjo-Kazooie. Bouncy chiptune."
|
|
54
|
+
|
|
55
|
+
**Expected behavior:**
|
|
56
|
+
|
|
57
|
+
- Skill identifies the conflict: "Brief says horror; references are bright N64 platformer scores. Those want opposite shapes — horror wants ambient drone or industrial; bouncy chiptune undercuts dread."
|
|
58
|
+
- Skill asks the user to resolve: "(a) keep horror brief, change references to ambient/industrial, (b) keep bouncy references, change brief away from horror, or (c) intentional juxtaposition (rare; works in 1 in 50 games — Undertale, Buckshot Roulette)."
|
|
59
|
+
- Skill does NOT silently pick or design a "horror chiptune" hybrid without flagging the friction.
|
|
60
|
+
|
|
61
|
+
**Assertions:**
|
|
62
|
+
|
|
63
|
+
- [ ] Skill names the brief vs. references conflict explicitly.
|
|
64
|
+
- [ ] Skill explains *why* the shapes oppose.
|
|
65
|
+
- [ ] Skill offers (c) intentional juxtaposition as a valid but rare path.
|
|
66
|
+
- [ ] No bible written until the user resolves.
|
|
67
|
+
|
|
68
|
+
## Case 3: Edge Case — user wants no music
|
|
69
|
+
|
|
70
|
+
**Fixture:** Same as Case 1.
|
|
71
|
+
|
|
72
|
+
**Input:** "Reference: Inside, Limbo. No music — just diegetic sound and ambience."
|
|
73
|
+
|
|
74
|
+
**Expected behavior:**
|
|
75
|
+
|
|
76
|
+
- Skill accepts "no music" as a valid direction (those references genuinely use it).
|
|
77
|
+
- Skill replaces the dynamic music plan section with a "Diegetic-only ambience plan":
|
|
78
|
+
- Named ambience layers (room tone / wind / distant water / heart-rate-tied sub-bass when tense)
|
|
79
|
+
- Rules for when sub-bass enters (proximity to threat) and exits
|
|
80
|
+
- SFX still gets all 8 vocabulary classes (with extra weight on the "Ambient layer" class)
|
|
81
|
+
- Skill keeps the bus layout but removes the Music bus or marks it "reserved (unused in v1)".
|
|
82
|
+
- Skill notes the trade-off: "Diegetic-only is harder to make feel paced — every level needs an ambient arc that does what music would normally do."
|
|
83
|
+
|
|
84
|
+
**Assertions:**
|
|
85
|
+
|
|
86
|
+
- [ ] Skill does NOT force a music style on a no-music game.
|
|
87
|
+
- [ ] Bible has a Diegetic / ambience plan section instead of (or supplementing) Dynamic music plan.
|
|
88
|
+
- [ ] Bus layout reflects the choice (no Music bus or marked reserved).
|
|
89
|
+
- [ ] Skill flags the trade-off: pacing is now ambience's job.
|
|
90
|
+
|
|
91
|
+
## Case 4: No Summer MCP — file-edit fallback
|
|
92
|
+
|
|
93
|
+
**Fixture:** Same as Case 1, but Summer MCP is unavailable.
|
|
94
|
+
|
|
95
|
+
**Input:** "Define the audio direction for my cozy farming sim."
|
|
96
|
+
|
|
97
|
+
**Expected behavior:**
|
|
98
|
+
|
|
99
|
+
- Skill detects no MCP.
|
|
100
|
+
- Walks the design beats normally.
|
|
101
|
+
- Instead of `summer_project_setting`, prints the `project.godot` snippet for the user to paste:
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
[audio]
|
|
105
|
+
buses/default_bus_layout="res://audio/default_bus_layout.tres"
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
- Generates `audio/default_bus_layout.tres` content as plain text for the user to save (Godot's `.tres` resource format with bus entries).
|
|
109
|
+
- Writes `.summer/audio-bible.md` via host `Write`.
|
|
110
|
+
- Does NOT call `summer_generate_audio` — instead suggests external SFX library searches or asks the user to handle generation later.
|
|
111
|
+
- Asks "May I write ..." before each file write.
|
|
112
|
+
|
|
113
|
+
**Assertions:**
|
|
114
|
+
|
|
115
|
+
- [ ] Skill identifies that MCP is unavailable; does not blindly call `summer_*`.
|
|
116
|
+
- [ ] Generated `project.godot` snippet uses correct INI section format.
|
|
117
|
+
- [ ] Generated `default_bus_layout.tres` is valid Godot 4 resource format.
|
|
118
|
+
- [ ] Skill still writes `.summer/audio-bible.md`.
|
|
119
|
+
- [ ] Skill does not attempt audio generation when generation tools are unavailable.
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
This spec runs via `/skill-test audio-direction spec` (see `_meta/skill-test/SKILL.md`).
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# Skill Spec: /brainstorm-game
|
|
2
|
+
|
|
3
|
+
## Fixture
|
|
4
|
+
|
|
5
|
+
- Empty Godot 4.5 / Summer Engine project, `project.godot` exists, no `.summer/` folder yet.
|
|
6
|
+
- Summer MCP available.
|
|
7
|
+
- Host file tools available (Read, Write, Edit).
|
|
8
|
+
|
|
9
|
+
## Case 1: Happy Path — fresh idea, full brainstorm
|
|
10
|
+
|
|
11
|
+
**Input:** "I want to make a game but I don't know what."
|
|
12
|
+
|
|
13
|
+
**Expected behavior:**
|
|
14
|
+
|
|
15
|
+
1. Skill asks the one opening question: "One sentence — what kind of game do you want to make?"
|
|
16
|
+
2. (Simulated user reply: "Something like Hades, but cozy.")
|
|
17
|
+
3. Skill recognizes Action-Combat anchor + cozy modifier, picks Action-Combat branch, but flags the tension: "Hades is tense, cozy is calm — let's pin which side wins."
|
|
18
|
+
4. Skill walks: core loop candidate → user refinement → three mechanics (push back if user lists more) → one-phrase art direction → scope (recommend vertical slice).
|
|
19
|
+
5. Skill drafts the 1-page brief inline, shows it to the user.
|
|
20
|
+
6. Skill asks: "May I create `.summer/GameSoul.md` with this brief?"
|
|
21
|
+
7. On yes, calls `Write .summer/GameSoul.md`.
|
|
22
|
+
8. Skill ends with the routing question pointing to `/summer:design-mechanic` or similar.
|
|
23
|
+
|
|
24
|
+
**Assertions:**
|
|
25
|
+
|
|
26
|
+
- [ ] Skill asks ONLY the opening question first, no menu of options.
|
|
27
|
+
- [ ] Skill picks ONE branch, not multiple; doesn't ask 6 questions in parallel.
|
|
28
|
+
- [ ] Skill enforces the three-mechanic limit (pushes back if user lists more).
|
|
29
|
+
- [ ] Brief includes all 8 fields: Pitch, Core loop, Three mechanics, Art direction, Scope, Win condition, "One thing this is NOT", Inspirations, Parked for later.
|
|
30
|
+
- [ ] Skill asks "May I create `.summer/GameSoul.md`?" before writing.
|
|
31
|
+
- [ ] Brief is shown inline before being written so the user can react.
|
|
32
|
+
- [ ] Skill ends with a routing question to a next `/summer:` step.
|
|
33
|
+
- [ ] Skill defaults to "vertical slice" scope when the user is unsure.
|
|
34
|
+
|
|
35
|
+
## Case 2: Failure Path — `.summer/GameSoul.md` already exists
|
|
36
|
+
|
|
37
|
+
**Fixture:** Same as Case 1, except `.summer/GameSoul.md` already exists with a previous game's brief.
|
|
38
|
+
|
|
39
|
+
**Input:** "I want to brainstorm a new game."
|
|
40
|
+
|
|
41
|
+
**Expected behavior:**
|
|
42
|
+
|
|
43
|
+
- Skill reads the existing `.summer/GameSoul.md` first via `Read`.
|
|
44
|
+
- Skill walks the brainstorm normally.
|
|
45
|
+
- Before writing, skill detects the file exists and asks: "`.summer/GameSoul.md` already exists. May I overwrite it, or merge into a 'Revision 2' section below the existing brief?"
|
|
46
|
+
- Does NOT silently overwrite.
|
|
47
|
+
|
|
48
|
+
**Assertions:**
|
|
49
|
+
|
|
50
|
+
- [ ] Skill reads existing `.summer/GameSoul.md` before drafting the new brief.
|
|
51
|
+
- [ ] Skill shows the user what would change before writing.
|
|
52
|
+
- [ ] Skill explicitly offers overwrite vs. merge — does not default-pick.
|
|
53
|
+
- [ ] No `Write` call happens until the user answers.
|
|
54
|
+
|
|
55
|
+
## Case 3: Edge Case — user pitches a multiplayer 4-player co-op horror RPG with crafting
|
|
56
|
+
|
|
57
|
+
**Fixture:** Same as Case 1.
|
|
58
|
+
|
|
59
|
+
**Input:** "I want a 4-player online co-op horror RPG with crafting, base-building, dialogue trees, and procedural worlds, kind of like Valheim meets Phasmophobia meets Disco Elysium."
|
|
60
|
+
|
|
61
|
+
**Expected behavior:**
|
|
62
|
+
|
|
63
|
+
- Skill catches the multiplayer flag (4-player co-op = scope explosion) and surfaces it explicitly: "Multiplayer is its own scope category — it roughly 3x's everything. Confirm: is multiplayer non-negotiable, or could a great single-player version land first and multiplayer come later?"
|
|
64
|
+
- Skill enforces the three-mechanic constraint hard. Names which mechanics from the user's pitch are content vs. mechanics, e.g.: "crafting + base-building are systems, not mechanics; dialogue is a mechanic if choices change outcomes."
|
|
65
|
+
- Skill states a sanity-check concern: "Procedural worlds + horror + RPG depth + multiplayer at vertical-slice scope is unrealistic. Suggest scoping to one of those four pillars."
|
|
66
|
+
- Skill does NOT just write the brief with all five things in it.
|
|
67
|
+
- Skill asks the user to pick the cut.
|
|
68
|
+
|
|
69
|
+
**Assertions:**
|
|
70
|
+
|
|
71
|
+
- [ ] Skill flags multiplayer explicitly and asks about negotiability before continuing.
|
|
72
|
+
- [ ] Skill distinguishes "system/feature" from "mechanic" out loud.
|
|
73
|
+
- [ ] Skill names a scope concern instead of writing the brief verbatim from the pitch.
|
|
74
|
+
- [ ] Skill never writes a brief with more than three mechanics.
|
|
75
|
+
- [ ] Skill offers a clear cut, not a vague "scope down" platitude.
|
|
76
|
+
|
|
77
|
+
## Case 4: No Summer MCP / no host file write — fallback path
|
|
78
|
+
|
|
79
|
+
**Fixture:** Same as Case 1, except the host has no file-write tool (read-only agent in a constrained environment).
|
|
80
|
+
|
|
81
|
+
**Input:** "Help me brainstorm a game."
|
|
82
|
+
|
|
83
|
+
**Expected behavior:**
|
|
84
|
+
|
|
85
|
+
- Skill detects no write tool is available.
|
|
86
|
+
- Walks the brainstorm normally.
|
|
87
|
+
- Instead of asking "May I create `.summer/GameSoul.md`?", prints the full brief to the user with explicit save instruction: "Save this as `.summer/GameSoul.md` in your project root. Every Summer skill reads it."
|
|
88
|
+
- Still ends with the routing question.
|
|
89
|
+
|
|
90
|
+
**Assertions:**
|
|
91
|
+
|
|
92
|
+
- [ ] Skill does NOT call a file-write tool that doesn't exist.
|
|
93
|
+
- [ ] Skill prints the brief inline as a self-contained block.
|
|
94
|
+
- [ ] Skill includes the explicit save instruction with the canonical path.
|
|
95
|
+
- [ ] Skill still asks the user the brainstorm questions and the routing question.
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
This spec runs via `/skill-test brainstorm-game spec` (see `_meta/skill-test/SKILL.md`).
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# Skill Spec: /design-level
|
|
2
|
+
|
|
3
|
+
## Fixture
|
|
4
|
+
|
|
5
|
+
- Godot 4.5 / Summer Engine project, main scene already has a `World/Player` (CharacterBody3D) with FPS controller wired.
|
|
6
|
+
- `.summer/GameSoul.md` exists; brief: "Action-combat game, three mechanics: dash, parry, double-jump. Vertical slice scope."
|
|
7
|
+
- `.summer/mechanics/parry.md` exists.
|
|
8
|
+
- No `levels/` folder yet.
|
|
9
|
+
- Summer MCP available.
|
|
10
|
+
|
|
11
|
+
## Case 1: Happy Path — design level 1, a combat encounter
|
|
12
|
+
|
|
13
|
+
**Input:** "Design level 1, a 5-minute combat encounter that teaches parry."
|
|
14
|
+
|
|
15
|
+
**Expected MCP tool sequence (in order):**
|
|
16
|
+
|
|
17
|
+
1. `Read .summer/GameSoul.md` — anchor to the brief
|
|
18
|
+
2. (Optional: `Read .summer/mechanics/parry.md` — anchor to the mechanic being taught)
|
|
19
|
+
3. (Skill walks: type → teaching goal → pacing curve (5 beats with intensity numbers) → encounters list → secrets list → reward gating → spaces list)
|
|
20
|
+
4. (Skill shows the node-tree skeleton inline)
|
|
21
|
+
5. (Skill asks: "May I create `levels/level_01.tscn` with this skeleton?")
|
|
22
|
+
6. `summer_create_scene(path="res://levels/level_01.tscn", root_type="Node3D", root_name="World")`
|
|
23
|
+
7. `summer_add_node(parent="./World", type="Node3D", name="Geometry")` and children
|
|
24
|
+
8. `summer_add_node(parent="./World", type="Node3D", name="Spawns")` and children
|
|
25
|
+
9. `summer_add_node(parent="./World", type="Node3D", name="Triggers")` and Area3D children
|
|
26
|
+
10. `summer_add_node(parent="./World", type="Node3D", name="Pickups")`
|
|
27
|
+
11. `summer_add_node(parent="./World", type="Node3D", name="Secrets")`
|
|
28
|
+
12. `summer_add_node(parent="./World", type="Node3D", name="Lighting")` with WorldEnvironment + DirectionalLight3D
|
|
29
|
+
13. `summer_save_scene`
|
|
30
|
+
14. (Skill asks: "May I create `.summer/levels/level_01.md` with the design doc?")
|
|
31
|
+
15. `Write .summer/levels/level_01.md`
|
|
32
|
+
16. `summer_get_script_errors`
|
|
33
|
+
|
|
34
|
+
**Assertions:**
|
|
35
|
+
|
|
36
|
+
- [ ] Skill reads `.summer/GameSoul.md` to anchor.
|
|
37
|
+
- [ ] Skill reads the relevant `.summer/mechanics/<name>.md` if the level teaches an existing mechanic.
|
|
38
|
+
- [ ] Skill states a concrete teaching goal — not a vague "fun encounter".
|
|
39
|
+
- [ ] Skill draws a 5-beat pacing curve with intensity numbers (Intro / Build / Peak / Release / Hook).
|
|
40
|
+
- [ ] Skill lists 4 encounters with timing + space mapping.
|
|
41
|
+
- [ ] Skill lists 3 secrets with which beat each lives in.
|
|
42
|
+
- [ ] Skill lists reward gating, gates rewards behind tests.
|
|
43
|
+
- [ ] Skill enforces 4-6 distinct spaces (does not produce 12 micro-rooms).
|
|
44
|
+
- [ ] Skill asks "May I create ..." before `summer_create_scene`.
|
|
45
|
+
- [ ] Skeleton is markers + Area3Ds, NOT meshes / enemy scripts (those come later).
|
|
46
|
+
- [ ] Skill writes the design doc to `.summer/levels/<name>.md`.
|
|
47
|
+
- [ ] Skill never calls `summer_set_resource_property` on an inline sub_resource.
|
|
48
|
+
- [ ] Final step is `summer_save_scene` then `summer_get_script_errors`.
|
|
49
|
+
|
|
50
|
+
## Case 2: Failure Path — user blends three level types
|
|
51
|
+
|
|
52
|
+
**Fixture:** Same as Case 1.
|
|
53
|
+
|
|
54
|
+
**Input:** "Design a stealth level with a puzzle in the middle and a boss at the end."
|
|
55
|
+
|
|
56
|
+
**Expected behavior:**
|
|
57
|
+
|
|
58
|
+
- Skill recognizes blended types: stealth + puzzle + boss.
|
|
59
|
+
- Skill pushes back: "That's three level types. Pick one as the primary; the other two become flavor or get split into sequential levels."
|
|
60
|
+
- Skill names the trade-off: "Stealth + boss in the same level kills both — stealth wants tension that releases at the encounter, boss wants tension that builds *to* the encounter. They're opposite shapes."
|
|
61
|
+
- Skill does NOT silently pick one or design all three at once.
|
|
62
|
+
|
|
63
|
+
**Assertions:**
|
|
64
|
+
|
|
65
|
+
- [ ] Skill identifies the blend explicitly.
|
|
66
|
+
- [ ] Skill explains the design tension between the blended types.
|
|
67
|
+
- [ ] Skill asks the user to pick one primary type before designing.
|
|
68
|
+
- [ ] No `summer_create_scene` call until user picks.
|
|
69
|
+
|
|
70
|
+
## Case 3: Edge Case — no `.summer/GameSoul.md` exists
|
|
71
|
+
|
|
72
|
+
**Fixture:** Same as Case 1, but `.summer/GameSoul.md` does NOT exist.
|
|
73
|
+
|
|
74
|
+
**Input:** "Design level 1 of my game."
|
|
75
|
+
|
|
76
|
+
**Expected behavior:**
|
|
77
|
+
|
|
78
|
+
- Skill detects no brief exists.
|
|
79
|
+
- Skill suggests: "No `.summer/GameSoul.md` yet — without a brief, this level has no game to serve. Run `/summer:brainstorm-game` first, or give me the core loop + mechanics inline so I can anchor the design."
|
|
80
|
+
- Skill does NOT design a generic level in a vacuum.
|
|
81
|
+
|
|
82
|
+
**Assertions:**
|
|
83
|
+
|
|
84
|
+
- [ ] Skill checks for `.summer/GameSoul.md` early (before designing).
|
|
85
|
+
- [ ] Skill explicitly recommends `/summer:brainstorm-game` if absent.
|
|
86
|
+
- [ ] Skill offers the inline-anchor alternative as a fallback.
|
|
87
|
+
- [ ] No design happens without anchoring information.
|
|
88
|
+
|
|
89
|
+
## Case 4: No Summer MCP — file-edit fallback
|
|
90
|
+
|
|
91
|
+
**Fixture:** Same as Case 1, but Summer MCP is unavailable.
|
|
92
|
+
|
|
93
|
+
**Input:** "Design level 1 — a 5-minute combat encounter."
|
|
94
|
+
|
|
95
|
+
**Expected behavior:**
|
|
96
|
+
|
|
97
|
+
- Skill detects no MCP.
|
|
98
|
+
- Walks the design beats normally.
|
|
99
|
+
- Instead of `summer_create_scene` + `summer_add_node`, prints the full `.tscn` file contents for the user to save manually at `levels/level_01.tscn`.
|
|
100
|
+
- Generated `.tscn` is syntactically valid Godot 4 scene format with the marker/Area3D skeleton (no meshes).
|
|
101
|
+
- Still writes the design doc to `.summer/levels/level_01.md` via host `Write`.
|
|
102
|
+
- Asks "May I write ..." before each file write.
|
|
103
|
+
|
|
104
|
+
**Assertions:**
|
|
105
|
+
|
|
106
|
+
- [ ] Skill identifies that MCP is unavailable; does not blindly call `summer_*`.
|
|
107
|
+
- [ ] Generated `.tscn` is parseable Godot 4 scene file.
|
|
108
|
+
- [ ] Skeleton in the `.tscn` matches the spaces / spawns / triggers structure from the design doc.
|
|
109
|
+
- [ ] Skill still writes `.summer/levels/<name>.md`.
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
This spec runs via `/skill-test design-level spec` (see `_meta/skill-test/SKILL.md`).
|