summer-engine 1.2.1 → 1.3.1

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.
Files changed (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +7 -2
  3. package/dist/bin/summer.js +24 -1
  4. package/dist/commands/doctor.js +44 -20
  5. package/dist/commands/setup.js +77 -6
  6. package/dist/commands/skills.js +14 -6
  7. package/dist/lib/format.d.ts +23 -0
  8. package/dist/lib/format.js +60 -0
  9. package/dist/lib/format.test.d.ts +1 -0
  10. package/dist/lib/format.test.js +36 -0
  11. package/dist/lib/skills-registry.d.ts +33 -11
  12. package/dist/lib/skills-registry.js +71 -11
  13. package/package.json +1 -1
  14. package/skills/README.md +96 -0
  15. package/skills/_meta/skill-create/SKILL.md +143 -0
  16. package/skills/_meta/skill-improve/SKILL.md +89 -0
  17. package/skills/_meta/skill-test/SKILL.md +86 -0
  18. package/skills/_shared/collaborative-protocol.md +50 -0
  19. package/skills/_shared/gd-style.md +121 -0
  20. package/skills/_shared/godot-version.md +32 -0
  21. package/skills/_shared/mcp-tools-reference.md +133 -0
  22. package/skills/_shared/template-registry.md +40 -0
  23. package/skills/_tests/runner.md +90 -0
  24. package/skills/_tests/specs/3d-lighting.md +19 -0
  25. package/skills/_tests/specs/asset-strategy.md +19 -0
  26. package/skills/_tests/specs/debug.md +94 -0
  27. package/skills/_tests/specs/fps-controller.md +100 -0
  28. package/skills/_tests/specs/gdscript-patterns.md +19 -0
  29. package/skills/_tests/specs/make-game.md +19 -0
  30. package/skills/_tests/specs/play.md +88 -0
  31. package/skills/_tests/specs/scene-composition.md +19 -0
  32. package/skills/_tests/specs/ui-basics.md +19 -0
  33. package/skills/{asset-strategy → asset-pipeline/asset-strategy}/SKILL.md +5 -5
  34. package/skills/catalog.yaml +646 -0
  35. package/skills/{fps-controller → character-controllers/fps-controller}/SKILL.md +7 -5
  36. package/skills/debugging/debug/SKILL.md +137 -0
  37. package/skills/{3d-lighting → rendering-and-lighting/3d-lighting}/SKILL.md +6 -5
  38. package/skills/{make-game → scene-and-project/make-game}/SKILL.md +6 -5
  39. package/skills/scene-and-project/play/SKILL.md +108 -0
  40. package/skills/{scene-composition → scene-and-project/scene-composition}/SKILL.md +6 -5
  41. package/skills/{gdscript-patterns → scripting-patterns/gdscript-patterns}/SKILL.md +6 -5
  42. package/skills/{ui-basics → ui-and-ux/ui-basics}/SKILL.md +6 -5
  43. /package/skills/{gdscript-patterns → scripting-patterns/gdscript-patterns}/reference.md +0 -0
@@ -5,26 +5,86 @@ export const AGENT_CLIENTS = [
5
5
  "cursor",
6
6
  "windsurf",
7
7
  ];
8
+ export const SKILL_CATEGORIES = [
9
+ "_meta",
10
+ "character-controllers",
11
+ "gameplay-mechanics",
12
+ "scripting-patterns",
13
+ "scene-and-project",
14
+ "rendering-and-lighting",
15
+ "shaders",
16
+ "visual-effects",
17
+ "post-processing",
18
+ "animation",
19
+ "audio",
20
+ "physics",
21
+ "multiplayer-and-networking",
22
+ "ai-and-npcs",
23
+ "level-design",
24
+ "performance",
25
+ "ui-and-ux",
26
+ "asset-pipeline",
27
+ "input-and-controls",
28
+ "debugging",
29
+ "deployment",
30
+ ];
8
31
  const ALL_CLIENTS = AGENT_CLIENTS;
32
+ /**
33
+ * Skills with `status: HAVE` in catalog.yaml. The catalog is the planning source
34
+ * of truth (~85 skills); this TS registry is the install-time list (only skills
35
+ * with shippable content). When a NEXT skill ships, mirror it here.
36
+ */
9
37
  export const SKILL_REGISTRY = [
38
+ {
39
+ name: "debug",
40
+ category: "debugging",
41
+ public: true,
42
+ clients: ALL_CLIENTS,
43
+ recommended: true,
44
+ requiresMcpTools: [
45
+ "summer_get_console",
46
+ "summer_get_debugger_errors",
47
+ "summer_get_script_errors",
48
+ "summer_get_diagnostics",
49
+ "summer_clear_console",
50
+ "summer_play",
51
+ "summer_stop",
52
+ "summer_inspect_node",
53
+ ],
54
+ testScenario: "Triage a runtime crash end-to-end: read errors, locate code, propose fix, apply on approval, verify.",
55
+ },
56
+ {
57
+ name: "play",
58
+ category: "scene-and-project",
59
+ public: true,
60
+ clients: ALL_CLIENTS,
61
+ recommended: true,
62
+ requiresMcpTools: [
63
+ "summer_is_running",
64
+ "summer_play",
65
+ "summer_stop",
66
+ "summer_clear_console",
67
+ "summer_get_diagnostics",
68
+ "summer_get_debugger_errors",
69
+ "summer_get_script_errors",
70
+ ],
71
+ testScenario: "Run the game from a clean state, wait for first frame, report whether it runs cleanly or has errors.",
72
+ },
10
73
  {
11
74
  name: "gdscript-patterns",
75
+ category: "scripting-patterns",
12
76
  public: true,
13
- category: "scripting",
14
77
  clients: ALL_CLIENTS,
15
78
  recommended: true,
16
79
  requiresMcpTools: [
17
- "summer_set_prop",
18
- "summer_connect_signal",
19
- "summer_input_map_bind",
20
80
  "summer_get_script_errors",
21
81
  ],
22
- testScenario: "Create a typed GDScript with a signal, attach it to a node, connect the signal, and verify script errors.",
82
+ testScenario: "Write a typed GDScript with a signal, attach it to a node, connect the signal, and verify script errors.",
23
83
  },
24
84
  {
25
85
  name: "scene-composition",
86
+ category: "scene-and-project",
26
87
  public: true,
27
- category: "scene",
28
88
  clients: ALL_CLIENTS,
29
89
  recommended: true,
30
90
  requiresMcpTools: [
@@ -39,8 +99,8 @@ export const SKILL_REGISTRY = [
39
99
  },
40
100
  {
41
101
  name: "fps-controller",
102
+ category: "character-controllers",
42
103
  public: true,
43
- category: "gameplay",
44
104
  clients: ALL_CLIENTS,
45
105
  recommended: true,
46
106
  requiresMcpTools: [
@@ -53,8 +113,8 @@ export const SKILL_REGISTRY = [
53
113
  },
54
114
  {
55
115
  name: "3d-lighting",
116
+ category: "rendering-and-lighting",
56
117
  public: true,
57
- category: "lighting",
58
118
  clients: ALL_CLIENTS,
59
119
  recommended: true,
60
120
  requiresMcpTools: [
@@ -66,8 +126,8 @@ export const SKILL_REGISTRY = [
66
126
  },
67
127
  {
68
128
  name: "ui-basics",
129
+ category: "ui-and-ux",
69
130
  public: true,
70
- category: "ui",
71
131
  clients: ALL_CLIENTS,
72
132
  recommended: true,
73
133
  requiresMcpTools: [
@@ -79,8 +139,8 @@ export const SKILL_REGISTRY = [
79
139
  },
80
140
  {
81
141
  name: "asset-strategy",
142
+ category: "asset-pipeline",
82
143
  public: true,
83
- category: "assets",
84
144
  clients: ALL_CLIENTS,
85
145
  recommended: true,
86
146
  requiresMcpTools: [
@@ -95,8 +155,8 @@ export const SKILL_REGISTRY = [
95
155
  },
96
156
  {
97
157
  name: "make-game",
158
+ category: "scene-and-project",
98
159
  public: true,
99
- category: "workflow",
100
160
  clients: ALL_CLIENTS,
101
161
  recommended: false,
102
162
  requiresMcpTools: [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "summer-engine",
3
- "version": "1.2.1",
3
+ "version": "1.3.1",
4
4
  "description": "CLI and MCP tools for Summer Engine — the AI-native game engine",
5
5
  "keywords": [
6
6
  "game-engine",
@@ -0,0 +1,96 @@
1
+ # Summer Skill Library
2
+
3
+ The canonical agent-readable game-dev knowledge source for Claude Code, Cursor, Codex, and Windsurf.
4
+
5
+ When an agent is asked to make a game in Godot, this is what it reads to learn how.
6
+
7
+ ## Layout
8
+
9
+ ```
10
+ skills/
11
+ ├── README.md # this file
12
+ ├── catalog.yaml # canonical registry (name, category, status, template-id)
13
+ ├── _shared/ # cross-skill references every skill can link
14
+ │ ├── godot-version.md
15
+ │ ├── mcp-tools-reference.md
16
+ │ ├── collaborative-protocol.md
17
+ │ ├── template-registry.md
18
+ │ └── gd-style.md
19
+ ├── _meta/
20
+ │ ├── skill-test/ # static + behavioral linter
21
+ │ ├── skill-create/ # bootstrap a new skill
22
+ │ └── skill-improve/ # eval-harness iteration
23
+ ├── _tests/
24
+ │ ├── runner.md # how /skill-test works
25
+ │ └── specs/ # behavioral specs per skill
26
+ └── <category>/<skill>/
27
+ ├── SKILL.md # < 500 lines, frontmatter + body
28
+ ├── references/ # loaded on demand
29
+ ├── examples/ # working snippets
30
+ └── tests/spec.md # behavioral spec
31
+ ```
32
+
33
+ ## Categories (20)
34
+
35
+ `character-controllers`, `gameplay-mechanics`, `scripting-patterns`, `scene-and-project`, `rendering-and-lighting`, `shaders`, `visual-effects`, `post-processing`, `animation`, `audio`, `physics`, `multiplayer-and-networking`, `ai-and-npcs`, `level-design`, `performance`, `ui-and-ux`, `asset-pipeline`, `input-and-controls`, `debugging`, `deployment`.
36
+
37
+ ## Standard
38
+
39
+ Adopts the **Anthropic Agent Skills open standard** (`agentskills.io`). Frontmatter:
40
+
41
+ ```yaml
42
+ ---
43
+ name: <kebab-case>
44
+ description: <when-to-use, key trigger phrases first>
45
+ license: MIT
46
+ compatibility: [Cursor, Claude Code, Windsurf, Codex]
47
+ category: <one of the 20>
48
+ template-id: <optional, resolved against _shared/template-registry.md>
49
+ allowed-tools: Read Grep summer_add_node summer_set_prop ...
50
+ paths: ["**/*.gd", "**/*.tscn"]
51
+ ---
52
+ ```
53
+
54
+ Cross-portable. Cursor / Codex / Windsurf understand the same SKILL.md.
55
+
56
+ ## Authoring rules
57
+
58
+ 1. **SKILL.md ≤ 500 lines.** Push detail into `references/`. Progressive disclosure.
59
+ 2. **MCP-preferred + file-edit-fallback.** Every code-touching skill must show both paths so the skill works without Summer MCP installed.
60
+ 3. **Collaborative protocol.** "May I write…?" before any user-visible mutation. See `_shared/collaborative-protocol.md`.
61
+ 4. **Template cross-link.** When a working starter exists, link via `template-id` and the section "Want a working starter?".
62
+ 5. **Test spec.** Every non-`_meta` skill ships `tests/spec.md` with at least one Test Case.
63
+
64
+ ## Adding a new skill
65
+
66
+ ```
67
+ /skill-create
68
+ ```
69
+
70
+ (See `_meta/skill-create/SKILL.md`.)
71
+
72
+ ## Testing
73
+
74
+ ```
75
+ /skill-test <name> # static lint
76
+ /skill-test <name> spec # behavioral spec runner
77
+ /skill-test audit # whole-library audit
78
+ /skill-improve <name> # parallel-eval harness for iteration
79
+ ```
80
+
81
+ (See `_meta/skill-test/SKILL.md` and `_tests/runner.md`.)
82
+
83
+ ## Roadmap
84
+
85
+ Status legend in `catalog.yaml`:
86
+
87
+ - **HAVE** — ships today.
88
+ - **NEXT** — next wave, in active development.
89
+ - **LATER** — on roadmap.
90
+
91
+ Currently: **7 HAVE / ~50 NEXT / ~30 LATER ≈ 85 skills across 20 categories**. Subagents fill content category by category.
92
+
93
+ ## See also
94
+
95
+ - [Architecture spec](../../../publicsummerengine/Docs/superpowers/specs/2026-05-05-skill-library-architecture.md) (lives in publicsummerengine for spec history)
96
+ - [Research notes](../../../publicsummerengine/Docs/superpowers/research/2026-05-05-skill-library-research.md)
@@ -0,0 +1,143 @@
1
+ ---
2
+ name: skill-create
3
+ description: Bootstrap a new Summer skill with the canonical folder structure, frontmatter, and stub sections. Use when adding a new skill to the library. Trigger on "create skill", "add skill", "new skill".
4
+ license: MIT
5
+ compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
+ category: _meta
7
+ allowed-tools: Read Write Glob Grep
8
+ ---
9
+
10
+ # /skill-create — Bootstrap a New Skill
11
+
12
+ ## Steps
13
+
14
+ ### 1. Get the basics
15
+
16
+ Ask the user:
17
+ - **Name** (kebab-case, ≤ 64 chars). Example: `state-machine-patterns`.
18
+ - **Category** (one of the 20 in `catalog.yaml`). Example: `scripting-patterns`.
19
+ - **One-sentence description** for the frontmatter.
20
+ - **Template-id** (optional). Lookup against `_shared/template-registry.md`.
21
+
22
+ ### 2. Create the folder
23
+
24
+ May I create `skills/<category>/<name>/` with this structure?
25
+
26
+ ```
27
+ skills/<category>/<name>/
28
+ ├── SKILL.md
29
+ ├── references/ (empty, populate as needed)
30
+ ├── examples/ (empty, populate as needed)
31
+ └── tests/spec.md
32
+ ```
33
+
34
+ ### 3. Write SKILL.md (template)
35
+
36
+ ```markdown
37
+ ---
38
+ name: <name>
39
+ description: <one-sentence what + when. Lead with key trigger phrases.>
40
+ license: MIT
41
+ compatibility: [Cursor, Claude Code, Windsurf, Codex]
42
+ category: <category>
43
+ template-id: <optional template-id from _shared/template-registry.md>
44
+ allowed-tools: Read Grep <summer_* tools this skill uses>
45
+ paths: ["**/*.gd", "**/*.tscn"]
46
+ ---
47
+
48
+ # <Title> for Summer Engine
49
+
50
+ <One-paragraph context. Why this exists, who needs it.>
51
+
52
+ ## Steps
53
+
54
+ ### 1. <First step>
55
+
56
+ **Preferred (Summer MCP):**
57
+
58
+ \`\`\`
59
+ summer_<tool>(...)
60
+ \`\`\`
61
+
62
+ **Fallback (no MCP — edit `<file>` directly):**
63
+
64
+ \`\`\`
65
+ <raw text/code>
66
+ \`\`\`
67
+
68
+ May I <action>?
69
+
70
+ ### 2. <Second step>
71
+
72
+ ...
73
+
74
+ ## Common mistakes
75
+
76
+ - <mistake 1, with one-line fix>
77
+ - <mistake 2, with one-line fix>
78
+
79
+ ## Want a working starter?
80
+
81
+ → **template-id**: `<template-id>`
82
+ → **Repo**: <github URL from _shared/template-registry.md>
83
+ → **Bootstrap**: `summer template clone <template-id> my-game`
84
+
85
+ ## See also
86
+
87
+ - `_shared/godot-version.md`
88
+ - `_shared/mcp-tools-reference.md`
89
+ - `_shared/gd-style.md`
90
+ - (other relevant skills)
91
+ ```
92
+
93
+ ### 4. Write tests/spec.md (template)
94
+
95
+ ```markdown
96
+ # Skill Spec: /<name>
97
+
98
+ ## Fixture
99
+ - <starting state of the project>
100
+ - <which tools are available — Summer MCP yes/no>
101
+
102
+ ## Case 1: Happy Path
103
+ **Input:** "<typical user prompt>"
104
+ **Expected MCP tool sequence (in order):**
105
+ 1. <first tool call>
106
+ 2. <second>
107
+
108
+ **Assertions:**
109
+ - [ ] <observable outcome>
110
+ - [ ] <skill asks "May I" before any write step>
111
+
112
+ ## Case 2: Failure / Edge
113
+ **Fixture:** <something different>
114
+ **Input:** "<edge prompt>"
115
+ **Expected:** <how the skill should adapt>
116
+ ```
117
+
118
+ ### 5. Register in catalog.yaml
119
+
120
+ Append:
121
+
122
+ ```yaml
123
+ - name: <name>
124
+ category: <category>
125
+ status: NEXT # or HAVE if shipping immediately
126
+ template-id: <or omit>
127
+ public: true
128
+ recommended: false # flip to true when status: HAVE and tested
129
+ ```
130
+
131
+ ### 6. Run /skill-test in static mode
132
+
133
+ Confirm the new skill passes the 7 structural checks before commit.
134
+
135
+ ## Collaborative protocol
136
+
137
+ This skill writes files (the new skill folder + catalog update). Always ask before each write step.
138
+
139
+ ## See also
140
+
141
+ - `_shared/collaborative-protocol.md`
142
+ - `_meta/skill-test/SKILL.md`
143
+ - `catalog.yaml`
@@ -0,0 +1,89 @@
1
+ ---
2
+ name: skill-improve
3
+ description: Iterate on an existing Summer skill using a parallel-eval harness — run the skill against a behavioral spec with and without proposed changes, compare outputs, ship the version that wins. Use to upgrade a skill that's underperforming. Trigger on "improve skill", "iterate on skill", "make this skill better".
4
+ license: MIT
5
+ compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
+ category: _meta
7
+ allowed-tools: Read Write Edit Task
8
+ ---
9
+
10
+ # /skill-improve — Iterate on a Skill With Eval Harness
11
+
12
+ Inspired by `anthropics/skills` `skill-creator/`. Use when a skill's behavioral spec is failing assertions or producing low-quality output.
13
+
14
+ ## When to use this vs. `/skill-test`
15
+
16
+ - `/skill-test spec` reasons over text. Cheap, fast, lossy.
17
+ - `/skill-improve` actually runs the skill in parallel subagents with-vs-without proposed changes. Expensive, accurate.
18
+
19
+ Run this when `/skill-test spec` flags issues you can't fix by reading the skill alone.
20
+
21
+ ## Steps
22
+
23
+ ### 1. Pick the skill + the spec
24
+
25
+ Ask the user:
26
+ - **Skill name.** Resolves to `skills/<category>/<name>/SKILL.md`.
27
+ - **Test cases to focus on.** Default: all `## Case` blocks in `_tests/specs/<name>.md`.
28
+
29
+ ### 2. Establish a baseline
30
+
31
+ For each Case:
32
+
33
+ 1. Spawn a subagent (`Task` tool, `general-purpose`) with the **current** skill body in context.
34
+ 2. Give it the Case's Input + Fixture.
35
+ 3. Capture the tool calls it makes and the diff it produces.
36
+ 4. Score against the Case's Assertions.
37
+
38
+ Save outputs to `_tests/runs/<skill-name>/baseline/case-<N>/`.
39
+
40
+ ### 3. Propose changes
41
+
42
+ Read the failing Cases. Identify the gap between what the skill says and what the agent did. Common gaps:
43
+
44
+ - Skill names a tool but the agent picked a different one (clarify the trigger).
45
+ - Skill assumes a fixture detail the agent missed (add explicit step to confirm).
46
+ - Skill's "May I" wording is too generic for the agent to infer the right ask.
47
+
48
+ Draft a revised SKILL.md. May I write it to `_tests/runs/<skill-name>/proposed/SKILL.md`?
49
+
50
+ ### 4. Run the proposed version
51
+
52
+ Repeat step 2 with the proposed SKILL.md. Save to `_tests/runs/<skill-name>/proposed/case-<N>/`.
53
+
54
+ ### 5. Compare and decide
55
+
56
+ For each Case, score:
57
+
58
+ - Assertions passed (proposed vs. baseline).
59
+ - Tool-call efficiency (fewer tools = better, all else equal).
60
+ - Hallucination / unwanted ops (penalize).
61
+
62
+ Output:
63
+
64
+ ```
65
+ Case 1 (Happy): baseline 4/6 proposed 6/6 ✓ ship proposed
66
+ Case 2 (Failure): baseline 3/4 proposed 4/4 ✓ ship proposed
67
+ Case 3 (Edge): baseline 3/3 proposed 3/3 = no change
68
+ ```
69
+
70
+ If proposed wins on net, prompt the user:
71
+
72
+ > Proposed version wins 2 cases, ties 1, loses 0. May I overwrite `skills/<category>/<name>/SKILL.md` with the proposed version and update `last-tested:` in `catalog.yaml`?
73
+
74
+ ### 6. Ship
75
+
76
+ On user yes:
77
+ - Overwrite `SKILL.md`.
78
+ - Update `last-tested: <today>` in `catalog.yaml`.
79
+ - Commit with message `feat(skill): improve <name> — <one-line summary of change>`.
80
+
81
+ ## Collaborative protocol
82
+
83
+ This skill writes files at multiple steps. Always ask before each write.
84
+
85
+ ## See also
86
+
87
+ - `_meta/skill-test/SKILL.md`
88
+ - `_tests/runner.md`
89
+ - `_tests/specs/`
@@ -0,0 +1,86 @@
1
+ ---
2
+ name: skill-test
3
+ description: Validate a Summer skill against static structural rules and per-skill behavioral specs. Use to lint a skill before commit, audit the whole library, or check a behavioral spec assertion. Trigger on "skill test", "lint skill", "validate skill".
4
+ license: MIT
5
+ compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
+ category: _meta
7
+ allowed-tools: Read Glob Grep
8
+ ---
9
+
10
+ # /skill-test — Validate a Summer Skill
11
+
12
+ Three modes. Pick by the user's intent.
13
+
14
+ ## Mode: `static` — Structural lint (default for "test this skill")
15
+
16
+ For a single skill at `skills/<category>/<name>/`, run these checks:
17
+
18
+ 1. **Frontmatter completeness.** `name`, `description`, `license`, `compatibility`, `category` present. `name` matches the directory name.
19
+ 2. **SKILL.md length.** ≤ 500 lines. (Progressive disclosure rule from Anthropic spec.)
20
+ 3. **MCP-preferred + file-edit-fallback.** If the skill mutates scenes or resources, body must show both:
21
+ - At least one `summer_*` MCP tool example.
22
+ - At least one file-edit fallback block (e.g., raw `.tscn` snippet) OR an explicit "no fallback for this — Summer MCP required" note.
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
+ 5. **Template-id resolved.** If the skill's frontmatter declares `template-id: <id>`, that id must exist in `_shared/template-registry.md`.
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. **No broken relative links.** Every `](../...)` and `](./...)` in the body must point at an existing file.
27
+
28
+ Output:
29
+
30
+ ```
31
+ skill: <category>/<name>
32
+ PASS (1) frontmatter complete
33
+ PASS (2) length 217 / 500 lines
34
+ FAIL (3) no MCP-preferred example found in body
35
+ PASS (4) collaborative protocol present
36
+ PASS (5) template-id resolved
37
+ PASS (6) tests/spec.md exists
38
+ PASS (7) all relative links resolve
39
+
40
+ 6 PASS / 1 FAIL — fix item 3 before commit.
41
+ ```
42
+
43
+ ## Mode: `spec` — Behavioral spec runner
44
+
45
+ For a single skill, read both `skills/<category>/<name>/SKILL.md` and `_tests/specs/<name>.md`. For each `## Case` in the spec:
46
+
47
+ 1. Lay out the **Fixture** (starting state, available tools).
48
+ 2. Read the **Input** (user prompt).
49
+ 3. Reason: given the skill's instructions and this fixture, would the agent follow the **Expected MCP tool sequence**?
50
+ 4. For each assertion under `**Assertions:**`, mark `[x]` if the skill's instructions would satisfy it, `[ ]` if not, with a one-line reason.
51
+
52
+ Output: an annotated copy of the spec with assertions filled in, plus a pass-rate.
53
+
54
+ No code execution. Pure reasoning over text.
55
+
56
+ ## Mode: `audit` — Whole library report
57
+
58
+ Read `catalog.yaml`. For each skill with `status: HAVE`:
59
+
60
+ 1. Run `static` mode on the skill.
61
+ 2. Note the skill's `last-tested:` date.
62
+ 3. Flag skills where `last-tested:` is missing or older than 30 days.
63
+
64
+ Output: a table with PASS / FAIL counts, last-tested ages, and a punch list of skills needing attention.
65
+
66
+ ## When to use which mode
67
+
68
+ | User said | Mode |
69
+ |---|---|
70
+ | "test the fps-controller skill" | static |
71
+ | "lint this skill" | static |
72
+ | "does this skill actually do what it should?" | spec |
73
+ | "run the behavioral check" | spec |
74
+ | "audit the skill library" | audit |
75
+ | "what skills need work" | audit |
76
+
77
+ ## Collaborative protocol
78
+
79
+ This skill is **read-only**. It never writes. No "May I" needed.
80
+
81
+ ## See also
82
+
83
+ - `_shared/collaborative-protocol.md`
84
+ - `_shared/template-registry.md`
85
+ - `_tests/runner.md`
86
+ - `_tests/specs/` — per-skill behavioral specs
@@ -0,0 +1,50 @@
1
+ # Collaborative Protocol — "May I write?"
2
+
3
+ > Every Summer skill must follow this. The agent works *with* the user, not around them.
4
+
5
+ ## The rule
6
+
7
+ **Before any user-visible write step, the agent must explicitly state what it is about to do and ask permission to proceed.**
8
+
9
+ This applies to:
10
+ - Creating files (`.gd`, `.tscn`, `.tres`, JSON, configs)
11
+ - Modifying existing files (especially `.gd` and `.tscn`)
12
+ - Running irreversible operations (deletion, reset, force-overwrite)
13
+ - Setting up project-wide settings (`project.godot`)
14
+ - Installing tools, libraries, or templates
15
+
16
+ Reading is unconditional. Inspection, scene-tree walks, diagnostics — never need permission.
17
+
18
+ ## Phrasing
19
+
20
+ Plain, short, action-first. Examples:
21
+
22
+ > May I create `scenes/player.tscn` and add a CharacterBody3D + Camera3D?
23
+
24
+ > I'm about to overwrite `levels/level_01.tscn`. The current version has 14 nodes — I'll preserve them and add the new lighting setup. Continue?
25
+
26
+ > May I attach `scripts/player_controller.gd` to `./World/Player`?
27
+
28
+ > I'm going to bind `move_forward`, `move_back`, `move_left`, `move_right`, `jump`. OK?
29
+
30
+ ## What this prevents
31
+
32
+ 1. **Silent overwrites.** The agent stomps the user's hand-edited script.
33
+ 2. **Cascading scope creep.** A "small fix" turns into a 30-file refactor.
34
+ 3. **Unclear state.** The user has no idea what changed when something breaks.
35
+ 4. **Trust loss.** One unauthorized edit and the user stops trusting the agent.
36
+
37
+ ## What this is NOT
38
+
39
+ - Not a confirmation dialog for every property change in a single skill execution. Group related writes into one ask: "I'm about to add the player root, attach the controller script, and bind 5 input actions. OK?"
40
+ - Not a request for design input. The skill should know what to do; the ask is for permission, not direction.
41
+ - Not a stop on simple read-only ops or single-property tweaks the user clearly directed.
42
+
43
+ ## Linter check
44
+
45
+ The `_meta/skill-test/SKILL.md` static linter looks for the phrases:
46
+ - "May I" / "May I write" / "May I create" / "May I attach"
47
+ - "I'm about to"
48
+ - "Continue?" / "OK?" / "Proceed?"
49
+
50
+ A skill that mutates files but never says any of these fails the linter.