summer-engine 1.2.1 → 1.3.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.
Files changed (31) hide show
  1. package/LICENSE +21 -0
  2. package/dist/commands/skills.js +9 -3
  3. package/dist/lib/skills-registry.d.ts +17 -11
  4. package/dist/lib/skills-registry.js +36 -11
  5. package/package.json +1 -1
  6. package/skills/README.md +96 -0
  7. package/skills/_meta/skill-create/SKILL.md +143 -0
  8. package/skills/_meta/skill-improve/SKILL.md +89 -0
  9. package/skills/_meta/skill-test/SKILL.md +86 -0
  10. package/skills/_shared/collaborative-protocol.md +50 -0
  11. package/skills/_shared/gd-style.md +121 -0
  12. package/skills/_shared/godot-version.md +32 -0
  13. package/skills/_shared/mcp-tools-reference.md +133 -0
  14. package/skills/_shared/template-registry.md +40 -0
  15. package/skills/_tests/runner.md +90 -0
  16. package/skills/_tests/specs/3d-lighting.md +19 -0
  17. package/skills/_tests/specs/asset-strategy.md +19 -0
  18. package/skills/_tests/specs/fps-controller.md +100 -0
  19. package/skills/_tests/specs/gdscript-patterns.md +19 -0
  20. package/skills/_tests/specs/make-game.md +19 -0
  21. package/skills/_tests/specs/scene-composition.md +19 -0
  22. package/skills/_tests/specs/ui-basics.md +19 -0
  23. package/skills/{asset-strategy → asset-pipeline/asset-strategy}/SKILL.md +4 -5
  24. package/skills/catalog.yaml +636 -0
  25. package/skills/{fps-controller → character-controllers/fps-controller}/SKILL.md +6 -5
  26. package/skills/{3d-lighting → rendering-and-lighting/3d-lighting}/SKILL.md +5 -5
  27. package/skills/{make-game → scene-and-project/make-game}/SKILL.md +5 -5
  28. package/skills/{scene-composition → scene-and-project/scene-composition}/SKILL.md +5 -5
  29. package/skills/{gdscript-patterns → scripting-patterns/gdscript-patterns}/SKILL.md +5 -5
  30. package/skills/{ui-basics → ui-and-ux/ui-basics}/SKILL.md +5 -5
  31. /package/skills/{gdscript-patterns → scripting-patterns/gdscript-patterns}/reference.md +0 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Summer Engine
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -13,7 +13,7 @@ function getBuiltinSkills() {
13
13
  for (const entry of SKILL_REGISTRY) {
14
14
  if (!entry.public)
15
15
  continue;
16
- const skillPath = join(skillsDir, entry.name, "SKILL.md");
16
+ const skillPath = join(skillsDir, entry.category, entry.name, "SKILL.md");
17
17
  if (!existsSync(skillPath))
18
18
  continue;
19
19
  const frontmatter = parseSkillFrontmatter(skillPath);
@@ -48,13 +48,19 @@ function getSkillMeta(name) {
48
48
  return getBuiltinSkills().find((skill) => skill.name === name) ?? null;
49
49
  }
50
50
  function getSkillPath(name) {
51
- const path = join(skillsDir, name);
51
+ const entry = SKILL_REGISTRY.find((s) => s.name === name);
52
+ if (!entry)
53
+ return null;
54
+ const path = join(skillsDir, entry.category, entry.name);
52
55
  if (!existsSync(path) || !existsSync(join(path, "SKILL.md")))
53
56
  return null;
54
57
  return path;
55
58
  }
56
59
  function getSkillBody(name) {
57
- const skillPath = join(skillsDir, name, "SKILL.md");
60
+ const entry = SKILL_REGISTRY.find((s) => s.name === name);
61
+ if (!entry)
62
+ throw new Error(`Unknown skill: ${name}`);
63
+ const skillPath = join(skillsDir, entry.category, entry.name, "SKILL.md");
58
64
  const content = readFileSync(skillPath, "utf-8");
59
65
  return content.replace(/^---\s*\n[\s\S]*?\n---\s*\n/, "").trim();
60
66
  }
@@ -1,67 +1,73 @@
1
1
  export declare const AGENT_CLIENTS: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
2
2
  export type AgentClient = (typeof AGENT_CLIENTS)[number];
3
- export type SkillCategory = "workflow" | "scripting" | "scene" | "gameplay" | "lighting" | "assets" | "ui";
3
+ export declare const SKILL_CATEGORIES: readonly ["_meta", "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"];
4
+ export type SkillCategory = (typeof SKILL_CATEGORIES)[number];
4
5
  export interface SkillRegistryEntry {
5
6
  name: string;
6
- public: boolean;
7
7
  category: SkillCategory;
8
+ public: boolean;
8
9
  clients: readonly AgentClient[];
9
10
  recommended: boolean;
10
11
  requiresMcpTools: readonly string[];
11
12
  testScenario: string;
12
13
  }
14
+ /**
15
+ * Skills with `status: HAVE` in catalog.yaml. The catalog is the planning source
16
+ * of truth (~85 skills); this TS registry is the install-time list (only skills
17
+ * with shippable content). When a NEXT skill ships, mirror it here.
18
+ */
13
19
  export declare const SKILL_REGISTRY: readonly [{
14
20
  readonly name: "gdscript-patterns";
21
+ readonly category: "scripting-patterns";
15
22
  readonly public: true;
16
- readonly category: "scripting";
17
23
  readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
18
24
  readonly recommended: true;
19
- readonly requiresMcpTools: readonly ["summer_set_prop", "summer_connect_signal", "summer_input_map_bind", "summer_get_script_errors"];
20
- readonly testScenario: "Create a typed GDScript with a signal, attach it to a node, connect the signal, and verify script errors.";
25
+ readonly requiresMcpTools: readonly ["summer_get_script_errors"];
26
+ readonly testScenario: "Write a typed GDScript with a signal, attach it to a node, connect the signal, and verify script errors.";
21
27
  }, {
22
28
  readonly name: "scene-composition";
29
+ readonly category: "scene-and-project";
23
30
  readonly public: true;
24
- readonly category: "scene";
25
31
  readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
26
32
  readonly recommended: true;
27
33
  readonly requiresMcpTools: readonly ["summer_create_scene", "summer_open_scene", "summer_get_scene_tree", "summer_add_node", "summer_instantiate_scene", "summer_save_scene"];
28
34
  readonly testScenario: "Build a small reusable player scene, instantiate it in a main scene, and save both scenes through Summer tools.";
29
35
  }, {
30
36
  readonly name: "fps-controller";
37
+ readonly category: "character-controllers";
31
38
  readonly public: true;
32
- readonly category: "gameplay";
33
39
  readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
34
40
  readonly recommended: true;
35
41
  readonly requiresMcpTools: readonly ["summer_add_node", "summer_set_prop", "summer_set_resource_property", "summer_input_map_bind"];
36
42
  readonly testScenario: "Create a CharacterBody3D player with collision, camera, input actions, and a host-edited controller script.";
37
43
  }, {
38
44
  readonly name: "3d-lighting";
45
+ readonly category: "rendering-and-lighting";
39
46
  readonly public: true;
40
- readonly category: "lighting";
41
47
  readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
42
48
  readonly recommended: true;
43
49
  readonly requiresMcpTools: readonly ["summer_add_node", "summer_set_prop", "summer_set_resource_property"];
44
50
  readonly testScenario: "Add sun, fill lighting, WorldEnvironment, and shadow settings to a simple 3D scene.";
45
51
  }, {
46
52
  readonly name: "ui-basics";
53
+ readonly category: "ui-and-ux";
47
54
  readonly public: true;
48
- readonly category: "ui";
49
55
  readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
50
56
  readonly recommended: true;
51
57
  readonly requiresMcpTools: readonly ["summer_add_node", "summer_set_prop", "summer_connect_signal"];
52
58
  readonly testScenario: "Create a HUD CanvasLayer with labels, a ProgressBar, and a connected Button signal.";
53
59
  }, {
54
60
  readonly name: "asset-strategy";
61
+ readonly category: "asset-pipeline";
55
62
  readonly public: true;
56
- readonly category: "assets";
57
63
  readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
58
64
  readonly recommended: true;
59
65
  readonly requiresMcpTools: readonly ["summer_search_assets", "summer_import_asset", "summer_import_from_url", "summer_generate_image", "summer_generate_3d", "summer_generate_audio"];
60
66
  readonly testScenario: "Choose library, generated, or primitive assets for a small level and import one asset into the project.";
61
67
  }, {
62
68
  readonly name: "make-game";
69
+ readonly category: "scene-and-project";
63
70
  readonly public: true;
64
- readonly category: "workflow";
65
71
  readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
66
72
  readonly recommended: false;
67
73
  readonly requiresMcpTools: readonly ["summer_get_agent_playbook", "summer_get_project_context", "summer_create_scene", "summer_open_scene", "summer_save_scene", "summer_add_node", "summer_set_prop", "summer_set_resource_property", "summer_instantiate_scene", "summer_play", "summer_stop", "summer_get_diagnostics"];
@@ -5,26 +5,51 @@ 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 = [
10
38
  {
11
39
  name: "gdscript-patterns",
40
+ category: "scripting-patterns",
12
41
  public: true,
13
- category: "scripting",
14
42
  clients: ALL_CLIENTS,
15
43
  recommended: true,
16
44
  requiresMcpTools: [
17
- "summer_set_prop",
18
- "summer_connect_signal",
19
- "summer_input_map_bind",
20
45
  "summer_get_script_errors",
21
46
  ],
22
- testScenario: "Create a typed GDScript with a signal, attach it to a node, connect the signal, and verify script errors.",
47
+ testScenario: "Write a typed GDScript with a signal, attach it to a node, connect the signal, and verify script errors.",
23
48
  },
24
49
  {
25
50
  name: "scene-composition",
51
+ category: "scene-and-project",
26
52
  public: true,
27
- category: "scene",
28
53
  clients: ALL_CLIENTS,
29
54
  recommended: true,
30
55
  requiresMcpTools: [
@@ -39,8 +64,8 @@ export const SKILL_REGISTRY = [
39
64
  },
40
65
  {
41
66
  name: "fps-controller",
67
+ category: "character-controllers",
42
68
  public: true,
43
- category: "gameplay",
44
69
  clients: ALL_CLIENTS,
45
70
  recommended: true,
46
71
  requiresMcpTools: [
@@ -53,8 +78,8 @@ export const SKILL_REGISTRY = [
53
78
  },
54
79
  {
55
80
  name: "3d-lighting",
81
+ category: "rendering-and-lighting",
56
82
  public: true,
57
- category: "lighting",
58
83
  clients: ALL_CLIENTS,
59
84
  recommended: true,
60
85
  requiresMcpTools: [
@@ -66,8 +91,8 @@ export const SKILL_REGISTRY = [
66
91
  },
67
92
  {
68
93
  name: "ui-basics",
94
+ category: "ui-and-ux",
69
95
  public: true,
70
- category: "ui",
71
96
  clients: ALL_CLIENTS,
72
97
  recommended: true,
73
98
  requiresMcpTools: [
@@ -79,8 +104,8 @@ export const SKILL_REGISTRY = [
79
104
  },
80
105
  {
81
106
  name: "asset-strategy",
107
+ category: "asset-pipeline",
82
108
  public: true,
83
- category: "assets",
84
109
  clients: ALL_CLIENTS,
85
110
  recommended: true,
86
111
  requiresMcpTools: [
@@ -95,8 +120,8 @@ export const SKILL_REGISTRY = [
95
120
  },
96
121
  {
97
122
  name: "make-game",
123
+ category: "scene-and-project",
98
124
  public: true,
99
- category: "workflow",
100
125
  clients: ALL_CLIENTS,
101
126
  recommended: false,
102
127
  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.0",
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