summer-engine 2.8.2 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +27 -7
- package/.claude-plugin/plugin.json +99 -83
- package/.codex-plugin/plugin.json +112 -82
- package/.cursor-plugin/plugin.json +119 -83
- package/.factory-plugin/plugin.json +100 -3
- package/.mcp.json +6 -1
- package/.opencode/INSTALL.md +7 -4
- package/.opencode/plugins/summer.js +31 -18
- package/AGENTS.md +107 -34
- package/CHANGELOG.md +131 -44
- package/CLAUDE.md +4 -2
- package/GEMINI.md +7 -53
- package/NOTICE +31 -0
- package/README.md +159 -391
- package/assets/api-docs.json.gz +0 -0
- package/assets/autopilot/README.md +20 -6
- package/assets/autopilot/autopilot.gd +80 -26
- package/assets/autopilot/run.sh +132 -7
- package/assets/navigation/web-routes.json +719 -0
- package/commands/gameskill.md +10 -108
- package/commands/summer.md +72 -4
- package/dist/bin/summer.js +6 -87
- package/dist/cli/banner.d.ts +1 -0
- package/dist/cli/banner.js +33 -0
- package/dist/{commands → cli/commands}/config.js +1 -1
- package/dist/cli/commands/create.d.ts +30 -0
- package/dist/cli/commands/create.js +212 -0
- package/dist/{commands → cli/commands}/debug.js +2 -2
- package/dist/cli/commands/doctor.d.ts +2 -0
- package/dist/cli/commands/doctor.js +18 -0
- package/dist/cli/commands/events.d.ts +57 -0
- package/dist/cli/commands/events.js +158 -0
- package/dist/cli/commands/install.d.ts +50 -0
- package/dist/cli/commands/install.js +447 -0
- package/dist/cli/commands/list.js +72 -0
- package/dist/{commands → cli/commands}/login.js +33 -17
- package/dist/{commands → cli/commands}/logout.d.ts +1 -0
- package/dist/cli/commands/logout.js +19 -0
- package/dist/{commands → cli/commands}/memory.d.ts +1 -8
- package/dist/{commands → cli/commands}/memory.js +20 -11
- package/dist/cli/commands/open.d.ts +45 -0
- package/dist/cli/commands/open.js +216 -0
- package/dist/{commands → cli/commands}/plan.js +2 -2
- package/dist/{commands → cli/commands}/publish.js +1 -1
- package/dist/{commands → cli/commands}/releases.js +1 -1
- package/dist/cli/commands/run.d.ts +19 -0
- package/dist/cli/commands/run.js +255 -0
- package/dist/{commands → cli/commands}/setup.js +43 -89
- package/dist/{commands → cli/commands}/skills.js +85 -222
- package/dist/{commands → cli/commands}/status.d.ts +1 -0
- package/dist/cli/commands/status.js +62 -0
- package/dist/cli/commands/tool.d.ts +11 -0
- package/dist/cli/commands/tool.js +121 -0
- package/dist/cli/index.d.ts +6 -0
- package/dist/cli/index.js +89 -0
- package/dist/cli/root-action.d.ts +7 -0
- package/dist/cli/root-action.js +15 -0
- package/dist/{lib → core}/api-client.d.ts +106 -15
- package/dist/{lib → core}/api-client.js +267 -75
- package/dist/{lib → core}/async-op-lifecycle.d.ts +3 -4
- package/dist/{lib → core}/async-op-lifecycle.js +3 -4
- package/dist/{lib → core}/auth.d.ts +14 -6
- package/dist/{lib → core}/auth.js +56 -40
- package/dist/core/capabilities/agent-playbook.d.ts +20 -0
- package/dist/core/capabilities/agent-playbook.js +218 -0
- package/dist/core/capabilities/api-docs.d.ts +36 -0
- package/dist/core/capabilities/api-docs.js +118 -0
- package/dist/core/capabilities/asset-import.d.ts +49 -0
- package/dist/core/capabilities/asset-import.js +134 -0
- package/dist/core/capabilities/camera-view.d.ts +98 -0
- package/dist/core/capabilities/camera-view.js +222 -0
- package/dist/core/capabilities/capture.d.ts +63 -0
- package/dist/core/capabilities/capture.js +67 -0
- package/dist/core/capabilities/console-read.d.ts +17 -0
- package/dist/core/capabilities/console-read.js +21 -0
- package/dist/{lib → core/capabilities}/creator.d.ts +1 -29
- package/dist/{lib → core/capabilities}/creator.js +14 -33
- package/dist/{lib → core/capabilities}/debug-report.d.ts +1 -1
- package/dist/{lib → core/capabilities}/debug-report.js +12 -31
- package/dist/{commands → core/capabilities}/doctor.d.ts +7 -2
- package/dist/{commands → core/capabilities}/doctor.js +47 -73
- package/dist/core/capabilities/engine-fallbacks.d.ts +26 -0
- package/dist/core/capabilities/engine-fallbacks.js +36 -0
- package/dist/core/capabilities/engine-ops.d.ts +33 -0
- package/dist/core/capabilities/engine-ops.js +145 -0
- package/dist/core/capabilities/engine-receipt.d.ts +53 -0
- package/dist/core/capabilities/engine-receipt.js +134 -0
- package/dist/core/capabilities/events.d.ts +200 -0
- package/dist/core/capabilities/events.js +383 -0
- package/dist/core/capabilities/fabricate-mesh.d.ts +111 -0
- package/dist/core/capabilities/fabricate-mesh.js +165 -0
- package/dist/core/capabilities/frame-quality.d.ts +71 -0
- package/dist/core/capabilities/frame-quality.js +449 -0
- package/dist/core/capabilities/game-task-plan.d.ts +66 -0
- package/dist/{lib → core/capabilities}/game-task-plan.js +59 -8
- package/dist/core/capabilities/hdri-import.d.ts +90 -0
- package/dist/core/capabilities/hdri-import.js +250 -0
- package/dist/core/capabilities/image-generation.d.ts +24 -0
- package/dist/core/capabilities/image-generation.js +22 -0
- package/dist/core/capabilities/navigation/open.d.ts +156 -0
- package/dist/core/capabilities/navigation/open.js +567 -0
- package/dist/core/capabilities/navigation/render-product-map.d.ts +1 -0
- package/dist/core/capabilities/navigation/render-product-map.js +84 -0
- package/dist/core/capabilities/navigation/targets.d.ts +87 -0
- package/dist/core/capabilities/navigation/targets.js +250 -0
- package/dist/core/capabilities/play-determinism.d.ts +35 -0
- package/dist/core/capabilities/play-determinism.js +86 -0
- package/dist/core/capabilities/project-context.d.ts +114 -0
- package/dist/core/capabilities/project-context.js +249 -0
- package/dist/core/capabilities/runtime-control.d.ts +540 -0
- package/dist/core/capabilities/runtime-control.js +1011 -0
- package/dist/core/capabilities/scene-kind.d.ts +19 -0
- package/dist/core/capabilities/scene-kind.js +137 -0
- package/dist/core/capabilities/scene-script.d.ts +38 -0
- package/dist/core/capabilities/scene-script.js +45 -0
- package/dist/core/capabilities/tool-dispatch.d.ts +42 -0
- package/dist/core/capabilities/tool-dispatch.js +1490 -0
- package/dist/core/capabilities/ui-control.d.ts +179 -0
- package/dist/core/capabilities/ui-control.js +423 -0
- package/dist/core/capabilities/variant-types.d.ts +22 -0
- package/dist/core/capabilities/variant-types.js +101 -0
- package/dist/core/capability-skew.d.ts +205 -0
- package/dist/core/capability-skew.js +386 -0
- package/dist/{lib → core}/config.d.ts +11 -1
- package/dist/{lib → core}/config.js +13 -2
- package/dist/core/embeddings.d.ts +78 -0
- package/dist/core/embeddings.js +166 -0
- package/dist/core/engine-install.d.ts +105 -0
- package/dist/core/engine-install.js +190 -0
- package/dist/core/engine.d.ts +94 -0
- package/dist/{lib → core}/engine.js +74 -28
- package/dist/core/feedback/client.d.ts +88 -0
- package/dist/core/feedback/client.js +182 -0
- package/dist/{lib → core}/format.d.ts +0 -1
- package/dist/{lib → core}/format.js +1 -1
- package/dist/core/headless/connection.d.ts +86 -0
- package/dist/core/headless/connection.js +97 -0
- package/dist/core/headless/editor-connection.d.ts +26 -0
- package/dist/core/headless/editor-connection.js +81 -0
- package/dist/core/headless/mcp-routing.d.ts +38 -0
- package/dist/core/headless/mcp-routing.js +83 -0
- package/dist/core/headless/registry.d.ts +91 -0
- package/dist/core/headless/registry.js +226 -0
- package/dist/core/headless/resolve.d.ts +46 -0
- package/dist/core/headless/resolve.js +75 -0
- package/dist/core/headless/spawn.d.ts +46 -0
- package/dist/core/headless/spawn.js +205 -0
- package/dist/core/headless/worker-connection.d.ts +96 -0
- package/dist/core/headless/worker-connection.js +353 -0
- package/dist/core/headless/worker-engine-client.d.ts +58 -0
- package/dist/core/headless/worker-engine-client.js +246 -0
- package/dist/core/launch-posture.d.ts +170 -0
- package/dist/core/launch-posture.js +317 -0
- package/dist/core/library-read.d.ts +73 -0
- package/dist/core/library-read.js +279 -0
- package/dist/core/library-search.d.ts +143 -0
- package/dist/core/library-search.js +301 -0
- package/dist/{lib → core}/log-filters.js +4 -2
- package/dist/{lib → core}/mcp-log.js +2 -17
- package/dist/core/package-root.d.ts +9 -0
- package/dist/core/package-root.js +11 -0
- package/dist/core/redact.d.ts +20 -0
- package/dist/core/redact.js +64 -0
- package/dist/core/registry-search.d.ts +167 -0
- package/dist/core/registry-search.js +358 -0
- package/dist/core/skills-registry.d.ts +47 -0
- package/dist/core/skills-registry.js +83 -0
- package/dist/{lib → core}/store.js +11 -7
- package/dist/{lib → core}/summer-compatibility.js +3 -3
- package/dist/{lib → core}/telemetry.js +5 -2
- package/dist/core/templates.d.ts +98 -0
- package/dist/core/templates.js +241 -0
- package/dist/core/tool-errors.d.ts +30 -0
- package/dist/core/tool-errors.js +40 -0
- package/dist/core/trajectory.d.ts +80 -0
- package/dist/core/trajectory.js +307 -0
- package/dist/core/util/http.d.ts +13 -0
- package/dist/core/util/http.js +28 -0
- package/dist/core/util/json.d.ts +12 -0
- package/dist/core/util/json.js +21 -0
- package/dist/core/util/process.d.ts +3 -0
- package/dist/core/util/process.js +13 -0
- package/dist/core/util/sleep.d.ts +1 -0
- package/dist/core/util/sleep.js +3 -0
- package/dist/core/version.d.ts +3 -0
- package/dist/core/version.js +5 -0
- package/dist/{lib → installer}/agent-config.d.ts +20 -1
- package/dist/{lib → installer}/agent-config.js +138 -24
- package/dist/installer/legacy-skills.d.ts +26 -0
- package/dist/installer/legacy-skills.js +53 -0
- package/dist/installer/setup.d.ts +76 -0
- package/dist/installer/setup.js +146 -0
- package/dist/installer/skill-locations.d.ts +45 -0
- package/dist/installer/skill-locations.js +170 -0
- package/dist/installer/version-check.d.ts +174 -0
- package/dist/{lib → installer}/version-check.js +173 -42
- package/dist/{lib/mcp-boot-notice.d.ts → mcp/boot-notice.d.ts} +1 -1
- package/dist/{commands/mcp.js → mcp/command.js} +18 -6
- package/dist/mcp/server.d.ts +23 -3
- package/dist/mcp/server.js +122 -28
- package/dist/mcp/tools/asset-tools.js +62 -142
- package/dist/mcp/tools/creator-tools.js +5 -23
- package/dist/mcp/tools/debug-tools.js +61 -18
- package/dist/mcp/tools/event-tools.d.ts +14 -0
- package/dist/mcp/tools/event-tools.js +41 -0
- package/dist/mcp/tools/fabricate-tools.d.ts +2 -0
- package/dist/mcp/tools/fabricate-tools.js +28 -0
- package/dist/mcp/tools/feedback-tools.d.ts +77 -0
- package/dist/mcp/tools/feedback-tools.js +88 -0
- package/dist/mcp/tools/file-tools.js +6 -53
- package/dist/mcp/tools/generate-tools.js +37 -63
- package/dist/mcp/tools/library-tools.d.ts +11 -0
- package/dist/mcp/tools/library-tools.js +42 -0
- package/dist/mcp/tools/navigation-tools.d.ts +7 -0
- package/dist/mcp/tools/navigation-tools.js +37 -0
- package/dist/mcp/tools/perception-tools.d.ts +20 -0
- package/dist/mcp/tools/perception-tools.js +146 -0
- package/dist/mcp/tools/project-tools.d.ts +14 -0
- package/dist/mcp/tools/project-tools.js +72 -281
- package/dist/mcp/tools/runtime-tools.d.ts +2 -0
- package/dist/mcp/tools/runtime-tools.js +92 -0
- package/dist/mcp/tools/scene-tools.d.ts +3 -0
- package/dist/mcp/tools/scene-tools.js +68 -119
- package/dist/mcp/tools/script-tools.d.ts +3 -0
- package/dist/mcp/tools/script-tools.js +118 -0
- package/dist/mcp/tools/spatial-tools.d.ts +2 -0
- package/dist/mcp/tools/spatial-tools.js +485 -0
- package/dist/mcp/tools/text-json.d.ts +8 -0
- package/dist/mcp/tools/text-json.js +12 -0
- package/dist/mcp/tools/{cloud-tools.d.ts → ui-tools.d.ts} +1 -1
- package/dist/mcp/tools/ui-tools.js +82 -0
- package/dist/mcp/tools/visual-tools.d.ts +2 -7
- package/dist/mcp/tools/visual-tools.js +383 -101
- package/dist/mcp/tools/with-engine.d.ts +9 -15
- package/dist/mcp/tools/with-engine.js +60 -96
- package/dist/project-memory/project-manifest.d.ts +36 -0
- package/dist/project-memory/project-manifest.js +50 -0
- package/dist/project-memory/project-memory.d.ts +57 -0
- package/dist/{lib → project-memory}/project-memory.js +46 -0
- package/gemini-extension.json +103 -2
- package/hooks/hooks-cursor.json +2 -2
- package/hooks/hooks.json +2 -1
- package/hooks/pre-commit-doctor.sh +45 -39
- package/hooks/run-hook.cmd +30 -23
- package/hooks/run-hook.sh +20 -0
- package/hooks/session-start.sh +18 -7
- package/integrations/README.md +70 -0
- package/integrations/claude/README.md +19 -0
- package/integrations/claude/manifest-target.json +16 -0
- package/integrations/cline/README.md +13 -0
- package/integrations/cline/manifest-target.json +3 -0
- package/integrations/codex/README.md +15 -0
- package/integrations/codex/manifest-target.json +5 -0
- package/integrations/cursor/README.md +16 -0
- package/integrations/cursor/manifest-target.json +5 -0
- package/integrations/factory/README.md +26 -0
- package/integrations/factory/manifest-target.json +5 -0
- package/integrations/gemini/README.md +26 -0
- package/integrations/gemini/manifest-target.json +5 -0
- package/integrations/github-copilot/README.md +12 -0
- package/integrations/github-copilot/manifest-target.json +3 -0
- package/integrations/kilo-code/README.md +16 -0
- package/integrations/kilo-code/manifest-target.json +3 -0
- package/integrations/lm-studio/README.md +12 -0
- package/integrations/lm-studio/manifest-target.json +3 -0
- package/integrations/opencode/README.md +15 -0
- package/integrations/opencode/manifest-target.json +3 -0
- package/integrations/roo-code/README.md +13 -0
- package/integrations/roo-code/manifest-target.json +3 -0
- package/integrations/vscode-copilot/README.md +12 -0
- package/integrations/vscode-copilot/manifest-target.json +3 -0
- package/integrations/windsurf/README.md +13 -0
- package/integrations/windsurf/manifest-target.json +3 -0
- package/library/references/collaborative-protocol/resource.yaml +24 -0
- package/library/references/gd-style/resource.yaml +24 -0
- package/{references → library/references/godot-version}/godot-version.md +6 -6
- package/library/references/godot-version/resource.yaml +22 -0
- package/library/references/headless-routing/headless-routing.md +46 -0
- package/library/references/headless-routing/resource.yaml +24 -0
- package/library/references/mcp-fresh-chat-playbook/mcp-fresh-chat-playbook.md +49 -0
- package/library/references/mcp-fresh-chat-playbook/resource.yaml +23 -0
- package/library/references/mcp-tools-reference/mcp-tools-reference.md +271 -0
- package/library/references/mcp-tools-reference/resource.yaml +17 -0
- package/library/references/product-map/product-map.md +103 -0
- package/library/references/product-map/resource.yaml +33 -0
- package/{references → library/references/public-surface-language}/public-surface-language.md +5 -7
- package/library/references/public-surface-language/resource.yaml +17 -0
- package/library/references/summer-folder/resource.yaml +20 -0
- package/{references → library/references/summer-folder}/summer-folder.md +22 -21
- package/{skills/rendering-and-lighting → library/skills}/3d-lighting/SKILL.md +15 -11
- package/library/skills/3d-lighting/resource.yaml +27 -0
- package/{skills/audio → library/skills}/adaptive-music/SKILL.md +1 -1
- package/library/skills/adaptive-music/resource.yaml +28 -0
- package/library/skills/agent-playtesting/SKILL.md +148 -0
- package/library/skills/agent-playtesting/resource.yaml +52 -0
- package/library/skills/ambient-bed/resource.yaml +24 -0
- package/{skills/video → library/skills}/animated-loop/SKILL.md +1 -1
- package/library/skills/animated-loop/resource.yaml +27 -0
- package/{skills/animation → library/skills}/animation-tree/SKILL.md +29 -14
- package/library/skills/animation-tree/resource.yaml +33 -0
- package/{skills/rendering-and-lighting → library/skills}/art-direction/SKILL.md +3 -3
- package/library/skills/art-direction/resource.yaml +29 -0
- package/{skills/asset-pipeline → library/skills}/asset-strategy/SKILL.md +44 -44
- package/library/skills/asset-strategy/resource.yaml +63 -0
- package/{skills/audio → library/skills}/audio-direction/SKILL.md +7 -7
- package/library/skills/audio-direction/resource.yaml +32 -0
- package/library/skills/auto-fire-targeting/resource.yaml +22 -0
- package/{skills/scene-and-project → library/skills}/brainstorm-game/SKILL.md +8 -8
- package/library/skills/brainstorm-game/resource.yaml +30 -0
- package/{skills/workflow → library/skills}/brainstorming/SKILL.md +2 -22
- package/library/skills/brainstorming/resource.yaml +23 -0
- package/{skills/workflow → library/skills}/brainstorming/spec-document-reviewer-prompt.md +1 -1
- package/{skills/scene-and-project → library/skills}/browse-templates/SKILL.md +18 -18
- package/library/skills/browse-templates/resource.yaml +23 -0
- package/library/skills/celeste-momentum-platforming/SKILL.md +366 -0
- package/library/skills/celeste-momentum-platforming/resource.yaml +33 -0
- package/library/skills/character-animation-wiring/SKILL.md +249 -0
- package/library/skills/character-animation-wiring/resource.yaml +39 -0
- package/{skills/3d-assets → library/skills}/character-model/SKILL.md +25 -25
- package/library/skills/character-model/resource.yaml +36 -0
- package/{skills/2d-assets → library/skills}/character-portrait/SKILL.md +14 -14
- package/library/skills/character-portrait/resource.yaml +30 -0
- package/{skills/video → library/skills}/cinematic-cutscene/SKILL.md +2 -2
- package/library/skills/cinematic-cutscene/resource.yaml +29 -0
- package/{skills/2d-assets → library/skills}/concept-art/SKILL.md +15 -15
- package/library/skills/concept-art/resource.yaml +34 -0
- package/{skills/2d-assets → library/skills}/create-asset-sheet/SKILL.md +8 -8
- package/library/skills/create-asset-sheet/resource.yaml +33 -0
- package/{skills/debugging → library/skills}/debug/SKILL.md +3 -3
- package/library/skills/debug/resource.yaml +31 -0
- package/{skills/workflow → library/skills}/debugging-game-feel/SKILL.md +11 -11
- package/library/skills/debugging-game-feel/resource.yaml +25 -0
- package/{skills/level-design → library/skills}/design-level/SKILL.md +6 -6
- package/library/skills/design-level/resource.yaml +31 -0
- package/{skills/gameplay-mechanics → library/skills}/design-mechanic/SKILL.md +3 -3
- package/library/skills/design-mechanic/resource.yaml +31 -0
- package/{skills/ai-and-npcs → library/skills}/design-npc/SKILL.md +7 -3
- package/library/skills/design-npc/resource.yaml +29 -0
- package/{skills/workflow → library/skills}/diagnosing-perf-regressions/SKILL.md +10 -10
- package/library/skills/diagnosing-perf-regressions/resource.yaml +25 -0
- package/{skills/workflow → library/skills}/dispatching-parallel-agents/SKILL.md +8 -8
- package/library/skills/dispatching-parallel-agents/resource.yaml +23 -0
- package/library/skills/driving-the-editor-ui/SKILL.md +85 -0
- package/library/skills/driving-the-editor-ui/resource.yaml +46 -0
- package/{skills/3d-assets → library/skills}/environment-kit/SKILL.md +11 -11
- package/library/skills/environment-kit/resource.yaml +29 -0
- package/{skills/deployment → library/skills}/export-and-ship/SKILL.md +5 -5
- package/library/skills/export-and-ship/resource.yaml +32 -0
- package/library/skills/fabricating-assets/SKILL.md +195 -0
- package/library/skills/fabricating-assets/resource.yaml +52 -0
- package/{skills/animation → library/skills}/facial-and-lipsync/SKILL.md +23 -11
- package/library/skills/facial-and-lipsync/resource.yaml +36 -0
- package/{skills/character-controllers → library/skills}/fps-controller/SKILL.md +8 -4
- package/library/skills/fps-controller/resource.yaml +29 -0
- package/{skills/visual-effects → library/skills}/game-feel/SKILL.md +7 -7
- package/library/skills/game-feel/resource.yaml +27 -0
- package/library/skills/gameskill/SKILL.md +64 -0
- package/library/skills/gameskill/resource.yaml +22 -0
- package/library/skills/gdscript-patterns/resource.yaml +23 -0
- package/{skills/animation → library/skills}/generate-motion/SKILL.md +16 -16
- package/library/skills/generate-motion/resource.yaml +34 -0
- package/library/skills/godogen-visual-proof-game-generation/SKILL.md +223 -0
- package/library/skills/godogen-visual-proof-game-generation/resource.yaml +33 -0
- package/{skills/workflow → library/skills}/headless-scripting/SKILL.md +14 -7
- package/library/skills/headless-scripting/resource.yaml +26 -0
- package/library/skills/host-authoritative-state/resource.yaml +28 -0
- package/{skills/2d-assets → library/skills}/instantiate-asset-pack/SKILL.md +10 -12
- package/library/skills/instantiate-asset-pack/resource.yaml +29 -0
- package/{skills/workflow → library/skills}/investigating-bugs/SKILL.md +4 -4
- package/{skills/workflow → library/skills}/investigating-bugs/condition-based-waiting.md +8 -8
- package/library/skills/investigating-bugs/resource.yaml +24 -0
- package/{skills/workflow → library/skills}/investigating-bugs/root-cause-tracing.md +1 -7
- package/library/skills/lumera-single-image-scene-reconstruction/SKILL.md +164 -0
- package/library/skills/lumera-single-image-scene-reconstruction/resource.yaml +35 -0
- package/{skills/scene-and-project → library/skills}/make-game/SKILL.md +22 -22
- package/library/skills/make-game/resource.yaml +35 -0
- package/library/skills/music-track/resource.yaml +28 -0
- package/library/skills/navigate-summer/SKILL.md +61 -0
- package/library/skills/navigate-summer/resource.yaml +35 -0
- package/{skills/scene-and-project → library/skills}/new-project/SKILL.md +10 -10
- package/library/skills/new-project/resource.yaml +28 -0
- package/{skills/3d-assets → library/skills}/organic-model/SKILL.md +16 -16
- package/library/skills/organic-model/resource.yaml +32 -0
- package/{skills/multiplayer-and-networking → library/skills}/peer-to-peer-multiplayer/SKILL.md +2 -2
- package/library/skills/peer-to-peer-multiplayer/resource.yaml +28 -0
- package/{skills/2d-assets → library/skills}/pixel-art/SKILL.md +13 -13
- package/library/skills/pixel-art/resource.yaml +31 -0
- package/library/skills/play/resource.yaml +26 -0
- package/{skills/workflow → library/skills}/playtesting-a-feature/SKILL.md +41 -22
- package/library/skills/playtesting-a-feature/resource.yaml +31 -0
- package/{skills/animation → library/skills}/procedural-animation/SKILL.md +25 -10
- package/library/skills/procedural-animation/resource.yaml +33 -0
- package/{skills/3d-assets → library/skills}/prop-model/SKILL.md +13 -13
- package/library/skills/prop-model/resource.yaml +33 -0
- package/library/skills/psx-retro-rendering/SKILL.md +416 -0
- package/library/skills/psx-retro-rendering/resource.yaml +36 -0
- package/library/skills/realtime-wet-surfaces/SKILL.md +189 -0
- package/library/skills/realtime-wet-surfaces/resource.yaml +31 -0
- package/{skills/deployment → library/skills}/remote-deploy/SKILL.md +3 -3
- package/library/skills/remote-deploy/resource.yaml +23 -0
- package/{skills/animation → library/skills}/retarget/SKILL.md +15 -14
- package/library/skills/retarget/resource.yaml +33 -0
- package/library/skills/running-in-the-cloud/SKILL.md +103 -0
- package/library/skills/running-in-the-cloud/resource.yaml +33 -0
- package/{skills/scene-and-project → library/skills}/scene-composition/SKILL.md +8 -0
- package/library/skills/scene-composition/resource.yaml +27 -0
- package/library/skills/scene-hierarchy-design/SKILL.md +102 -0
- package/library/skills/scene-hierarchy-design/resource.yaml +31 -0
- package/library/skills/scene-scripting/SKILL.md +764 -0
- package/library/skills/scene-scripting/resource.yaml +58 -0
- package/{skills/level-design → library/skills}/scene-to-level/SKILL.md +16 -17
- package/library/skills/scene-to-level/resource.yaml +33 -0
- package/library/skills/setup-multiplayer/resource.yaml +28 -0
- package/library/skills/skill-create/SKILL.md +138 -0
- package/library/skills/skill-create/resource.yaml +25 -0
- package/{skills/workflow → library/skills}/skill-improve/SKILL.md +2 -2
- package/library/skills/skill-improve/resource.yaml +25 -0
- package/{skills/workflow → library/skills}/skill-test/SKILL.md +4 -4
- package/library/skills/skill-test/resource.yaml +26 -0
- package/library/skills/skintokens-auto-rigging/SKILL.md +200 -0
- package/library/skills/skintokens-auto-rigging/resource.yaml +38 -0
- package/{skills/2d-assets → library/skills}/skybox-panorama/SKILL.md +8 -8
- package/library/skills/skybox-panorama/resource.yaml +28 -0
- package/{skills/audio → library/skills}/sound-effect/SKILL.md +2 -2
- package/library/skills/sound-effect/resource.yaml +27 -0
- package/library/skills/spatial-placement/SKILL.md +74 -0
- package/library/skills/spatial-placement/resource.yaml +42 -0
- package/library/skills/spatial-placement/tests/spec.md +65 -0
- package/{skills/2d-assets → library/skills}/sprite-sheet/SKILL.md +12 -12
- package/library/skills/sprite-sheet/resource.yaml +32 -0
- package/{skills/2d-assets → library/skills}/tileable-texture/SKILL.md +9 -9
- package/library/skills/tileable-texture/resource.yaml +31 -0
- package/{skills/video → library/skills}/trailer-shot/SKILL.md +1 -1
- package/library/skills/trailer-shot/resource.yaml +27 -0
- package/{skills/performance → library/skills}/tune-performance/SKILL.md +6 -6
- package/library/skills/tune-performance/resource.yaml +31 -0
- package/library/skills/ui-basics/resource.yaml +25 -0
- package/{skills/2d-assets → library/skills}/ui-graphics/SKILL.md +11 -11
- package/library/skills/ui-graphics/resource.yaml +29 -0
- package/{skills/2d-assets → library/skills}/use-widget-asset/SKILL.md +4 -4
- package/library/skills/use-widget-asset/resource.yaml +29 -0
- package/{skills/workflow → library/skills}/using-summer/SKILL.md +12 -9
- package/library/skills/using-summer/resource.yaml +41 -0
- package/{skills/3d-assets → library/skills}/vehicle-model/SKILL.md +18 -18
- package/library/skills/vehicle-model/resource.yaml +34 -0
- package/{skills/workflow → library/skills}/verification-before-completion/SKILL.md +10 -10
- package/library/skills/verification-before-completion/resource.yaml +23 -0
- package/library/skills/verifying-scenes/SKILL.md +98 -0
- package/library/skills/verifying-scenes/resource.yaml +42 -0
- package/{skills/visual-effects/recipes/dissolve → library/skills/vfx-dissolve}/SKILL.md +31 -11
- package/library/skills/vfx-dissolve/resource.yaml +33 -0
- package/{skills/visual-effects/recipes/fire → library/skills/vfx-fire}/SKILL.md +43 -12
- package/library/skills/vfx-fire/_building-blocks/noise-3d-fbm.gdshaderinc +45 -0
- package/library/skills/vfx-fire/resource.yaml +35 -0
- package/{skills/visual-effects/recipes/hit-spark → library/skills/vfx-hit-spark}/SKILL.md +16 -10
- package/library/skills/vfx-hit-spark/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-hit-spark/resource.yaml +34 -0
- package/{skills/visual-effects/recipes/lightning → library/skills/vfx-lightning}/SKILL.md +24 -11
- package/library/skills/vfx-lightning/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-lightning/resource.yaml +33 -0
- package/{skills/visual-effects/recipes/magic-glow → library/skills/vfx-magic-glow}/SKILL.md +31 -11
- package/library/skills/vfx-magic-glow/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-magic-glow/resource.yaml +34 -0
- package/{skills/visual-effects/recipes/muzzle-flash → library/skills/vfx-muzzle-flash}/SKILL.md +29 -9
- package/library/skills/vfx-muzzle-flash/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-muzzle-flash/_building-blocks/trauma-shake-snippet.md +53 -0
- package/library/skills/vfx-muzzle-flash/resource.yaml +35 -0
- package/{skills/visual-effects/recipes/smoke → library/skills/vfx-smoke}/SKILL.md +35 -9
- package/library/skills/vfx-smoke/_building-blocks/noise-3d-fbm.gdshaderinc +45 -0
- package/library/skills/vfx-smoke/resource.yaml +32 -0
- package/{skills/visual-effects/recipes/water-ripple → library/skills/vfx-water-ripple}/SKILL.md +31 -9
- package/library/skills/vfx-water-ripple/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-water-ripple/resource.yaml +31 -0
- package/library/skills/voice-line/resource.yaml +27 -0
- package/library/skills/world-building-3d/SKILL.md +105 -0
- package/library/skills/world-building-3d/references/spatial-tools.md +50 -0
- package/library/skills/world-building-3d/resource.yaml +44 -0
- package/library/skills/world-building-3d/tests/spec.md +48 -0
- package/{skills/workflow → library/skills}/writing-plans/SKILL.md +19 -14
- package/library/skills/writing-plans/resource.yaml +23 -0
- package/{skills/workflow → library/skills}/writing-skills/SKILL.md +38 -44
- package/library/skills/writing-skills/resource.yaml +29 -0
- package/{skills/workflow → library/skills}/writing-skills/testing-skills-with-subagents.md +13 -14
- package/library/templates/2d-brario-platformer/resource.yaml +21 -0
- package/library/templates/2d-dungeon-roguelike/resource.yaml +23 -0
- package/library/templates/2d-grid-puzzle/resource.yaml +21 -0
- package/library/templates/2d-plants-and-zombies-tower-defense/resource.yaml +21 -0
- package/library/templates/2d-platformer/resource.yaml +24 -0
- package/library/templates/2d-rpg/resource.yaml +21 -0
- package/library/templates/2d-vampire-survivor-roguelike/resource.yaml +21 -0
- package/library/templates/3d-basic/resource.yaml +16 -0
- package/library/templates/3d-city-kit/resource.yaml +24 -0
- package/library/templates/3d-fps-old-school/resource.yaml +21 -0
- package/library/templates/3d-fps-simple-animated-npc/resource.yaml +21 -0
- package/library/templates/3d-lan-multiplayer-starter/resource.yaml +22 -0
- package/library/templates/3d-open-world-explore-tps/resource.yaml +21 -0
- package/library/templates/3d-procedural-road-world/resource.yaml +21 -0
- package/library/templates/3d-racing-game/resource.yaml +21 -0
- package/library/templates/3d-royale-clash-type/resource.yaml +21 -0
- package/library/templates/3d-third-person-controller/resource.yaml +21 -0
- package/library/templates/3d-voxel-sandbox/resource.yaml +24 -0
- package/library/templates/README.md +94 -0
- package/library/templates/empty/resource.yaml +16 -0
- package/library/tools/add-node/resource.yaml +60 -0
- package/library/tools/align-distribute-3d/resource.yaml +87 -0
- package/library/tools/api-docs/resource.yaml +57 -0
- package/library/tools/batch/resource.yaml +52 -0
- package/library/tools/camera-bookmark/resource.yaml +73 -0
- package/library/tools/check-job/resource.yaml +45 -0
- package/library/tools/clear-console/resource.yaml +40 -0
- package/library/tools/connect-signal/resource.yaml +63 -0
- package/library/tools/create-debug-report/resource.yaml +67 -0
- package/library/tools/create-scene/resource.yaml +59 -0
- package/library/tools/creator-config/resource.yaml +63 -0
- package/library/tools/creator-publish/resource.yaml +73 -0
- package/library/tools/creator-releases/resource.yaml +53 -0
- package/library/tools/fabricate-3d/resource.yaml +108 -0
- package/library/tools/game-control/resource.yaml +84 -0
- package/library/tools/game-input/resource.yaml +159 -0
- package/library/tools/game-probe/resource.yaml +90 -0
- package/library/tools/generate-3d/resource.yaml +112 -0
- package/library/tools/generate-audio/resource.yaml +80 -0
- package/library/tools/generate-image/resource.yaml +62 -0
- package/library/tools/generate-motion/resource.yaml +66 -0
- package/library/tools/generate-video/resource.yaml +66 -0
- package/library/tools/get-agent-playbook/resource.yaml +40 -0
- package/library/tools/get-asset/resource.yaml +42 -0
- package/library/tools/get-asset-download-url/resource.yaml +52 -0
- package/library/tools/get-console/resource.yaml +69 -0
- package/library/tools/get-debugger-errors/resource.yaml +56 -0
- package/library/tools/get-debugger-warnings/resource.yaml +52 -0
- package/library/tools/get-diagnostics/resource.yaml +42 -0
- package/library/tools/get-project-context/resource.yaml +45 -0
- package/library/tools/get-runtime-tree/resource.yaml +62 -0
- package/library/tools/get-scene-tree/resource.yaml +52 -0
- package/library/tools/get-script-errors/resource.yaml +45 -0
- package/library/tools/get-studio-workflow/resource.yaml +43 -0
- package/library/tools/import-asset/resource.yaml +73 -0
- package/library/tools/import-asset-by-id/resource.yaml +56 -0
- package/library/tools/import-from-url/resource.yaml +51 -0
- package/library/tools/import-from-url-batch/resource.yaml +60 -0
- package/library/tools/import-hdri/resource.yaml +69 -0
- package/library/tools/input-map-bind/resource.yaml +52 -0
- package/library/tools/inspect-node/resource.yaml +46 -0
- package/library/tools/inspect-resource/resource.yaml +45 -0
- package/library/tools/inspect-runtime-node/resource.yaml +54 -0
- package/library/tools/instantiate-scene/resource.yaml +62 -0
- package/library/tools/is-running/resource.yaml +40 -0
- package/library/tools/library-feedback/resource.yaml +89 -0
- package/library/tools/list-my-assets/resource.yaml +56 -0
- package/library/tools/navigation-probe/resource.yaml +85 -0
- package/library/tools/open/resource.yaml +80 -0
- package/library/tools/open-main-scene/resource.yaml +40 -0
- package/library/tools/open-scene/resource.yaml +46 -0
- package/library/tools/play/resource.yaml +91 -0
- package/library/tools/project-setting/resource.yaml +53 -0
- package/library/tools/read-file/resource.yaml +47 -0
- package/library/tools/read-library/resource.yaml +67 -0
- package/library/tools/recent-events/resource.yaml +71 -0
- package/library/tools/remove-node/resource.yaml +51 -0
- package/library/tools/replace-node/resource.yaml +57 -0
- package/library/tools/replace-text/resource.yaml +61 -0
- package/library/tools/run-editor-script/resource.yaml +61 -0
- package/library/tools/run-script/resource.yaml +73 -0
- package/library/tools/runtime-animate/resource.yaml +140 -0
- package/library/tools/runtime-call/resource.yaml +74 -0
- package/library/tools/runtime-set/resource.yaml +80 -0
- package/library/tools/runtime-spawn/resource.yaml +95 -0
- package/library/tools/save-scene/resource.yaml +50 -0
- package/library/tools/screenshot/resource.yaml +112 -0
- package/library/tools/search-assets/resource.yaml +67 -0
- package/library/tools/search-library/resource.yaml +81 -0
- package/library/tools/select-node/resource.yaml +48 -0
- package/library/tools/set-prop/resource.yaml +64 -0
- package/library/tools/set-resource-property/resource.yaml +66 -0
- package/library/tools/slice-asset-sheet/resource.yaml +47 -0
- package/library/tools/snap-to-surface/resource.yaml +90 -0
- package/library/tools/snapshot-diff/resource.yaml +58 -0
- package/library/tools/starcast/resource.yaml +120 -0
- package/library/tools/start-game-task/resource.yaml +91 -0
- package/library/tools/stop/resource.yaml +51 -0
- package/library/tools/test-placement/resource.yaml +109 -0
- package/library/tools/ui-actions/resource.yaml +77 -0
- package/library/tools/ui-activate/resource.yaml +88 -0
- package/library/tools/ui-screenshot/resource.yaml +63 -0
- package/library/tools/ui-tree/resource.yaml +69 -0
- package/library/tools/wait-for-event/resource.yaml +84 -0
- package/library/tools/world-snapshot/resource.yaml +60 -0
- package/library/tools/write-file/resource.yaml +54 -0
- package/package.json +22 -16
- package/registry/generated/aliases.json +207 -0
- package/registry/generated/counts.json +12 -0
- package/registry/generated/gemini-extension.json +122 -0
- package/registry/generated/index.json +7709 -0
- package/registry/generated/marketplace.claude.json +44 -0
- package/registry/generated/mcp.json +13 -0
- package/registry/generated/plugin.claude.json +135 -0
- package/registry/generated/plugin.codex.json +144 -0
- package/registry/generated/plugin.cursor.json +134 -0
- package/registry/generated/plugin.factory.json +117 -0
- package/registry/generated/skills-registry.json +851 -0
- package/registry/generated/templates-registry.json +455 -0
- package/registry/schemas/allowed-hosts.json +19 -0
- package/registry/schemas/collection.schema.json +68 -0
- package/registry/schemas/domains.json +96 -0
- package/registry/schemas/example.schema.json +11 -0
- package/registry/schemas/reference.schema.json +10 -0
- package/registry/schemas/resource.schema.json +154 -0
- package/registry/schemas/skill.schema.json +14 -0
- package/registry/schemas/template.schema.json +46 -0
- package/registry/schemas/tool.schema.json +61 -0
- package/_persona/summer/SKILL.md +0 -113
- package/dist/bin/postinstall.d.ts +0 -2
- package/dist/bin/postinstall.js +0 -3
- package/dist/commands/cloud.d.ts +0 -2
- package/dist/commands/cloud.js +0 -80
- package/dist/commands/create.d.ts +0 -3
- package/dist/commands/create.js +0 -171
- package/dist/commands/install.d.ts +0 -19
- package/dist/commands/install.js +0 -194
- package/dist/commands/list.js +0 -67
- package/dist/commands/logout.js +0 -13
- package/dist/commands/logs.d.ts +0 -2
- package/dist/commands/logs.js +0 -19
- package/dist/commands/open.d.ts +0 -2
- package/dist/commands/open.js +0 -32
- package/dist/commands/orchestrator.d.ts +0 -8
- package/dist/commands/orchestrator.js +0 -143
- package/dist/commands/run.d.ts +0 -2
- package/dist/commands/run.js +0 -167
- package/dist/commands/status.js +0 -46
- package/dist/lib/banner.d.ts +0 -4
- package/dist/lib/banner.js +0 -122
- package/dist/lib/cloud/api.d.ts +0 -79
- package/dist/lib/cloud/api.js +0 -107
- package/dist/lib/cloud/apply.d.ts +0 -32
- package/dist/lib/cloud/apply.js +0 -294
- package/dist/lib/cloud/checkpoint.d.ts +0 -26
- package/dist/lib/cloud/checkpoint.js +0 -142
- package/dist/lib/cloud/conflicts.d.ts +0 -55
- package/dist/lib/cloud/conflicts.js +0 -131
- package/dist/lib/cloud/containment.d.ts +0 -8
- package/dist/lib/cloud/containment.js +0 -52
- package/dist/lib/cloud/diff.d.ts +0 -39
- package/dist/lib/cloud/diff.js +0 -138
- package/dist/lib/cloud/engine-bridge.d.ts +0 -34
- package/dist/lib/cloud/engine-bridge.js +0 -139
- package/dist/lib/cloud/hash-cache.d.ts +0 -23
- package/dist/lib/cloud/hash-cache.js +0 -44
- package/dist/lib/cloud/hash.d.ts +0 -10
- package/dist/lib/cloud/hash.js +0 -111
- package/dist/lib/cloud/http.d.ts +0 -17
- package/dist/lib/cloud/http.js +0 -47
- package/dist/lib/cloud/lock-path.d.ts +0 -1
- package/dist/lib/cloud/lock-path.js +0 -5
- package/dist/lib/cloud/lock.d.ts +0 -14
- package/dist/lib/cloud/lock.js +0 -143
- package/dist/lib/cloud/manifest.d.ts +0 -6
- package/dist/lib/cloud/manifest.js +0 -41
- package/dist/lib/cloud/paths.d.ts +0 -20
- package/dist/lib/cloud/paths.js +0 -90
- package/dist/lib/cloud/project-godot-merge.d.ts +0 -32
- package/dist/lib/cloud/project-godot-merge.js +0 -185
- package/dist/lib/cloud/rules.d.ts +0 -39
- package/dist/lib/cloud/rules.js +0 -159
- package/dist/lib/cloud/sync.d.ts +0 -21
- package/dist/lib/cloud/sync.js +0 -518
- package/dist/lib/cloud/transfer.d.ts +0 -23
- package/dist/lib/cloud/transfer.js +0 -184
- package/dist/lib/cloud/types.d.ts +0 -62
- package/dist/lib/cloud/types.js +0 -1
- package/dist/lib/cloud/validate-path.d.ts +0 -23
- package/dist/lib/cloud/validate-path.js +0 -103
- package/dist/lib/engine.d.ts +0 -51
- package/dist/lib/game-task-plan.d.ts +0 -42
- package/dist/lib/project-memory.d.ts +0 -33
- package/dist/lib/public-surface-paths.d.ts +0 -13
- package/dist/lib/public-surface-paths.js +0 -42
- package/dist/lib/remote-templates.d.ts +0 -25
- package/dist/lib/remote-templates.js +0 -86
- package/dist/lib/skills-registry.d.ts +0 -572
- package/dist/lib/skills-registry.js +0 -1061
- package/dist/lib/version-check.d.ts +0 -106
- package/dist/mcp/tools/cloud-tools.js +0 -42
- package/references/mcp-tools-reference.md +0 -199
- package/references/template-registry.md +0 -73
- package/skills/README.md +0 -103
- package/skills/scene-and-project/summer-cloud/SKILL.md +0 -92
- package/skills/workflow/brainstorming/scripts/frame-template.html +0 -214
- package/skills/workflow/brainstorming/scripts/helper.js +0 -88
- package/skills/workflow/brainstorming/scripts/server.cjs +0 -354
- package/skills/workflow/brainstorming/scripts/start-server.sh +0 -148
- package/skills/workflow/brainstorming/scripts/stop-server.sh +0 -56
- package/skills/workflow/brainstorming/visual-companion.md +0 -287
- package/skills/workflow/gameskill/SKILL.md +0 -120
- package/skills/workflow/investigating-bugs/CREATION-LOG.md +0 -119
- package/skills/workflow/investigating-bugs/condition-based-waiting-example.ts +0 -158
- package/skills/workflow/investigating-bugs/find-polluter.sh +0 -63
- package/skills/workflow/investigating-bugs/test-academic.md +0 -14
- package/skills/workflow/investigating-bugs/test-pressure-1.md +0 -58
- package/skills/workflow/investigating-bugs/test-pressure-2.md +0 -68
- package/skills/workflow/investigating-bugs/test-pressure-3.md +0 -69
- package/skills/workflow/mcpupdate/SKILL.md +0 -134
- package/skills/workflow/skill-create/SKILL.md +0 -153
- package/skills/workflow/writing-skills/anthropic-best-practices.md +0 -1150
- package/skills/workflow/writing-skills/examples/CLAUDE_MD_TESTING.md +0 -189
- package/skills/workflow/writing-skills/graphviz-conventions.dot +0 -172
- package/skills/workflow/writing-skills/persuasion-principles.md +0 -187
- package/skills/workflow/writing-skills/render-graphs.js +0 -168
- /package/dist/{commands → cli/commands}/config.d.ts +0 -0
- /package/dist/{commands → cli/commands}/debug.d.ts +0 -0
- /package/dist/{commands → cli/commands}/list.d.ts +0 -0
- /package/dist/{commands → cli/commands}/login.d.ts +0 -0
- /package/dist/{commands → cli/commands}/plan.d.ts +0 -0
- /package/dist/{commands → cli/commands}/publish.d.ts +0 -0
- /package/dist/{commands → cli/commands}/releases.d.ts +0 -0
- /package/dist/{commands → cli/commands}/setup.d.ts +0 -0
- /package/dist/{commands → cli/commands}/skills.d.ts +0 -0
- /package/dist/{lib → core}/log-filters.d.ts +0 -0
- /package/dist/{lib → core}/mcp-log.d.ts +0 -0
- /package/dist/{lib → core}/store.d.ts +0 -0
- /package/dist/{lib → core}/summer-compatibility.d.ts +0 -0
- /package/dist/{lib → core}/telemetry.d.ts +0 -0
- /package/dist/{lib/mcp-boot-notice.js → mcp/boot-notice.js} +0 -0
- /package/dist/{commands/mcp.d.ts → mcp/command.d.ts} +0 -0
- /package/{references → library/references/collaborative-protocol}/collaborative-protocol.md +0 -0
- /package/{references → library/references/gd-style}/gd-style.md +0 -0
- /package/{skills/audio → library/skills}/ambient-bed/SKILL.md +0 -0
- /package/{skills/gameplay-mechanics → library/skills}/auto-fire-targeting/SKILL.md +0 -0
- /package/{skills/scripting-patterns → library/skills}/gdscript-patterns/SKILL.md +0 -0
- /package/{skills/scripting-patterns → library/skills}/gdscript-patterns/reference.md +0 -0
- /package/{skills/multiplayer-and-networking → library/skills}/host-authoritative-state/SKILL.md +0 -0
- /package/{skills/workflow → library/skills}/investigating-bugs/defense-in-depth.md +0 -0
- /package/{skills/audio → library/skills}/music-track/SKILL.md +0 -0
- /package/{skills/scene-and-project → library/skills}/play/SKILL.md +0 -0
- /package/{skills/multiplayer-and-networking → library/skills}/setup-multiplayer/SKILL.md +0 -0
- /package/{skills/ui-and-ux → library/skills}/ui-basics/SKILL.md +0 -0
- /package/{skills/visual-effects → library/skills/vfx-dissolve}/_building-blocks/noise-3d-fbm.gdshaderinc +0 -0
- /package/{skills/visual-effects → library/skills/vfx-fire}/_building-blocks/additive-billboard-particles.md +0 -0
- /package/{skills/visual-effects → library/skills/vfx-lightning}/_building-blocks/trauma-shake-snippet.md +0 -0
- /package/{skills/audio → library/skills}/voice-line/SKILL.md +0 -0
- /package/{skills/workflow → library/skills}/writing-plans/plan-document-reviewer-prompt.md +0 -0
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry search — deterministic, kind-aware ranking over library index entries.
|
|
3
|
+
*
|
|
4
|
+
* Shared by the routing eval (evals/routing/runner.ts) and any runtime registry
|
|
5
|
+
* search so both rank the same way. No ML, no network, no randomness: the same
|
|
6
|
+
* (index, query) always yields the same ordering.
|
|
7
|
+
*
|
|
8
|
+
* Pipeline, in order:
|
|
9
|
+
*
|
|
10
|
+
* 1. LEXICAL — BM25 over one document per entry built from the id slug
|
|
11
|
+
* (repeated SLUG_BOOST times: the slug is the strongest routing signal),
|
|
12
|
+
* summary, use_when lines, and facets.domains tokens. Tokens are lightly
|
|
13
|
+
* stemmed (plural / -ing / -ed) so "animations" meets "animation".
|
|
14
|
+
* Compound fallback: a query token that appears in NO document (e.g.
|
|
15
|
+
* "fireball") is matched against its longest vocabulary prefix of at
|
|
16
|
+
* least COMPOUND_MIN_PREFIX chars ("fire") at COMPOUND_WEIGHT of a full
|
|
17
|
+
* match. Users compound words; metadata rarely does.
|
|
18
|
+
*
|
|
19
|
+
* 1b. TRIGGER PHRASES — the library quotes literal triggers inside use_when
|
|
20
|
+
* ('run it', 'make me a game', "engine not running"). When the query
|
|
21
|
+
* contains one as whole words, the entry earns TRIGGER_BONUS x the best
|
|
22
|
+
* lexical score of the query. Stopword-only triggers like 'run it' are
|
|
23
|
+
* otherwise invisible to BM25, and authors wrote them for exactly this.
|
|
24
|
+
*
|
|
25
|
+
* 2. KIND PRIOR — a per-kind multiplier derived from how the query is phrased
|
|
26
|
+
* (see `inferKindPrior`). Multiplicative, so an entry with zero lexical
|
|
27
|
+
* overlap is never promoted; the prior only re-orders entries that already
|
|
28
|
+
* matched something. Rules are documented on the function, are applied to
|
|
29
|
+
* every query identically, and are the ONLY place kind enters the score.
|
|
30
|
+
*
|
|
31
|
+
* 3. RELATED BOOST — after lexical x prior, each of the top RELATED_FROM_TOP
|
|
32
|
+
* hits lends RELATED_BOOST of its own score to the ids listed in its
|
|
33
|
+
* `related` map (skill <-> example / template / tool). Sized to break
|
|
34
|
+
* ties toward the neighbourhood of a confident hit, not to outrank a
|
|
35
|
+
* direct match (see the sweep note on DEFAULT_TUNING.relatedBoost).
|
|
36
|
+
*
|
|
37
|
+
* Final ties break on id (localeCompare) so output is stable across runs.
|
|
38
|
+
*/
|
|
39
|
+
export type RegistryKind = "skill" | "tool" | "template" | "reference" | "example";
|
|
40
|
+
export interface SearchEntry {
|
|
41
|
+
id: string;
|
|
42
|
+
kind: RegistryKind | string;
|
|
43
|
+
summary?: string;
|
|
44
|
+
use_when?: string[];
|
|
45
|
+
facets?: {
|
|
46
|
+
domains?: string[];
|
|
47
|
+
[k: string]: unknown;
|
|
48
|
+
};
|
|
49
|
+
related?: Record<string, string[] | undefined>;
|
|
50
|
+
}
|
|
51
|
+
export interface RankedHit {
|
|
52
|
+
id: string;
|
|
53
|
+
kind: string;
|
|
54
|
+
/** final score = (lexical + triggerBonus) * prior + relatedBoost */
|
|
55
|
+
score: number;
|
|
56
|
+
lexical: number;
|
|
57
|
+
triggerBonus: number;
|
|
58
|
+
prior: number;
|
|
59
|
+
relatedBoost: number;
|
|
60
|
+
}
|
|
61
|
+
export interface KindPrior {
|
|
62
|
+
skill: number;
|
|
63
|
+
tool: number;
|
|
64
|
+
template: number;
|
|
65
|
+
reference: number;
|
|
66
|
+
example: number;
|
|
67
|
+
/** Which rules fired, for transparency in eval output. */
|
|
68
|
+
rules: string[];
|
|
69
|
+
}
|
|
70
|
+
export interface SearchIndex {
|
|
71
|
+
docs: IndexedDoc[];
|
|
72
|
+
df: Map<string, number>;
|
|
73
|
+
avgLen: number;
|
|
74
|
+
byId: Map<string, IndexedDoc>;
|
|
75
|
+
}
|
|
76
|
+
interface IndexedDoc {
|
|
77
|
+
id: string;
|
|
78
|
+
kind: string;
|
|
79
|
+
tf: Map<string, number>;
|
|
80
|
+
len: number;
|
|
81
|
+
related: string[];
|
|
82
|
+
/** normalized quoted trigger phrases from use_when */
|
|
83
|
+
triggers: string[];
|
|
84
|
+
}
|
|
85
|
+
/** Slug tokens are repeated this many times in the document. */
|
|
86
|
+
export declare const SLUG_BOOST = 3;
|
|
87
|
+
/** Compound fallback: shortest vocabulary prefix that may stand in for an unknown token. */
|
|
88
|
+
export declare const COMPOUND_MIN_PREFIX = 4;
|
|
89
|
+
export interface Tuning {
|
|
90
|
+
/** Kind prior: multiplier for the kind(s) a rule points at. */
|
|
91
|
+
favor: number;
|
|
92
|
+
/** Kind prior: multiplier for the kind(s) a rule argues against. */
|
|
93
|
+
demote: number;
|
|
94
|
+
/** Fraction of a top hit's score lent to each of its `related` ids. */
|
|
95
|
+
relatedBoost: number;
|
|
96
|
+
/** How many top hits lend related boosts. */
|
|
97
|
+
relatedFromTop: number;
|
|
98
|
+
/** Compound fallback: weight of a prefix match relative to an exact match. */
|
|
99
|
+
compoundWeight: number;
|
|
100
|
+
/** Trigger phrase match: bonus as a fraction of the query's best lexical score. */
|
|
101
|
+
triggerBonus: number;
|
|
102
|
+
}
|
|
103
|
+
export declare const DEFAULT_TUNING: Tuning;
|
|
104
|
+
/**
|
|
105
|
+
* Light suffix stemmer. Deliberately conservative: only the endings that show
|
|
106
|
+
* up as noise between user phrasing and metadata (plurals, -ing, -ed).
|
|
107
|
+
*/
|
|
108
|
+
export declare function stem(t: string): string;
|
|
109
|
+
export declare function tokenize(s: string): string[];
|
|
110
|
+
export declare function buildSearchIndex(entries: SearchEntry[]): SearchIndex;
|
|
111
|
+
/**
|
|
112
|
+
* Pull quoted trigger phrases out of use_when lines. Only straight quotes
|
|
113
|
+
* count, the phrase must be at least 3 chars, and bracketed placeholders
|
|
114
|
+
* ('I want to make a [genre] game') are dropped — a placeholder is not a
|
|
115
|
+
* literal trigger.
|
|
116
|
+
*/
|
|
117
|
+
export declare function extractTriggers(useWhen: string[]): string[];
|
|
118
|
+
interface QueryTerm {
|
|
119
|
+
token: string;
|
|
120
|
+
weight: number;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Map raw query tokens to index terms. Known tokens pass through at weight 1;
|
|
124
|
+
* unknown tokens fall back to their longest vocabulary prefix (compound
|
|
125
|
+
* splitting) at COMPOUND_WEIGHT, or are dropped when no prefix exists.
|
|
126
|
+
*/
|
|
127
|
+
export declare function queryTerms(index: SearchIndex, qTokens: string[], compoundWeight?: number): QueryTerm[];
|
|
128
|
+
/**
|
|
129
|
+
* Derive a kind prior from the query alone.
|
|
130
|
+
*
|
|
131
|
+
* Rules (each may fire; effects multiply):
|
|
132
|
+
* R0 default — a user-phrased request with no engine-action vocabulary
|
|
133
|
+
* is a skill ask: skills are the entry point that names
|
|
134
|
+
* tools. skill x FAVOR, tool x DEMOTE. Skipped when R1
|
|
135
|
+
* fires.
|
|
136
|
+
* R1 tool-action — the query names a concrete engine/editor action
|
|
137
|
+
* (screenshot, add node, set property, import, console,
|
|
138
|
+
* stop the game ...). tool x FAVOR; R0 is suppressed. Skills
|
|
139
|
+
* stay neutral: the wrapping skill (e.g. skill/play) may
|
|
140
|
+
* still rank on lexical merit.
|
|
141
|
+
* R2 imperative — the query opens with a creative/design imperative
|
|
142
|
+
* ("make/build/design/add a ..."). skill x FAVOR again
|
|
143
|
+
* unless R1 fired (then only a mild skill lift so
|
|
144
|
+
* "add a Camera3D node" stays a tool ask).
|
|
145
|
+
* R3 symptom — the query describes a problem ("the character falls
|
|
146
|
+
* through the floor", "fps drops"). skill x FAVOR; template
|
|
147
|
+
* x DEMOTE (a starter never fixes a symptom).
|
|
148
|
+
* R4 template — asks for a template/starter/"start from". template x FAVOR.
|
|
149
|
+
* R5 reference — conceptual "what is / how does X work / convention".
|
|
150
|
+
* reference x FAVOR. Not triggered by "how do I ..." (R6).
|
|
151
|
+
* R6 how-to — "how do I / how should I": a skill answers. skill x FAVOR,
|
|
152
|
+
* reference x DEMOTE.
|
|
153
|
+
*/
|
|
154
|
+
export declare function inferKindPrior(query: string, tuning?: Pick<Tuning, "favor" | "demote">): KindPrior;
|
|
155
|
+
export interface RankOptions {
|
|
156
|
+
limit?: number;
|
|
157
|
+
/** Disable the kind prior (pure lexical). Used by tests and A/B in the eval. */
|
|
158
|
+
kindPrior?: boolean;
|
|
159
|
+
/** Disable the related boost. */
|
|
160
|
+
relatedBoost?: boolean;
|
|
161
|
+
/** Disable the trigger-phrase bonus. */
|
|
162
|
+
triggerBonus?: boolean;
|
|
163
|
+
/** Override tunables (sweeps, tests). Production callers leave this unset. */
|
|
164
|
+
tuning?: Partial<Tuning>;
|
|
165
|
+
}
|
|
166
|
+
export declare function rankEntries(index: SearchIndex, query: string, opts?: RankOptions): RankedHit[];
|
|
167
|
+
export {};
|
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry search — deterministic, kind-aware ranking over library index entries.
|
|
3
|
+
*
|
|
4
|
+
* Shared by the routing eval (evals/routing/runner.ts) and any runtime registry
|
|
5
|
+
* search so both rank the same way. No ML, no network, no randomness: the same
|
|
6
|
+
* (index, query) always yields the same ordering.
|
|
7
|
+
*
|
|
8
|
+
* Pipeline, in order:
|
|
9
|
+
*
|
|
10
|
+
* 1. LEXICAL — BM25 over one document per entry built from the id slug
|
|
11
|
+
* (repeated SLUG_BOOST times: the slug is the strongest routing signal),
|
|
12
|
+
* summary, use_when lines, and facets.domains tokens. Tokens are lightly
|
|
13
|
+
* stemmed (plural / -ing / -ed) so "animations" meets "animation".
|
|
14
|
+
* Compound fallback: a query token that appears in NO document (e.g.
|
|
15
|
+
* "fireball") is matched against its longest vocabulary prefix of at
|
|
16
|
+
* least COMPOUND_MIN_PREFIX chars ("fire") at COMPOUND_WEIGHT of a full
|
|
17
|
+
* match. Users compound words; metadata rarely does.
|
|
18
|
+
*
|
|
19
|
+
* 1b. TRIGGER PHRASES — the library quotes literal triggers inside use_when
|
|
20
|
+
* ('run it', 'make me a game', "engine not running"). When the query
|
|
21
|
+
* contains one as whole words, the entry earns TRIGGER_BONUS x the best
|
|
22
|
+
* lexical score of the query. Stopword-only triggers like 'run it' are
|
|
23
|
+
* otherwise invisible to BM25, and authors wrote them for exactly this.
|
|
24
|
+
*
|
|
25
|
+
* 2. KIND PRIOR — a per-kind multiplier derived from how the query is phrased
|
|
26
|
+
* (see `inferKindPrior`). Multiplicative, so an entry with zero lexical
|
|
27
|
+
* overlap is never promoted; the prior only re-orders entries that already
|
|
28
|
+
* matched something. Rules are documented on the function, are applied to
|
|
29
|
+
* every query identically, and are the ONLY place kind enters the score.
|
|
30
|
+
*
|
|
31
|
+
* 3. RELATED BOOST — after lexical x prior, each of the top RELATED_FROM_TOP
|
|
32
|
+
* hits lends RELATED_BOOST of its own score to the ids listed in its
|
|
33
|
+
* `related` map (skill <-> example / template / tool). Sized to break
|
|
34
|
+
* ties toward the neighbourhood of a confident hit, not to outrank a
|
|
35
|
+
* direct match (see the sweep note on DEFAULT_TUNING.relatedBoost).
|
|
36
|
+
*
|
|
37
|
+
* Final ties break on id (localeCompare) so output is stable across runs.
|
|
38
|
+
*/
|
|
39
|
+
// ── Tunables (documented; change here, nowhere else) ───────────────────────
|
|
40
|
+
const K1 = 1.5;
|
|
41
|
+
const B = 0.75;
|
|
42
|
+
/** Slug tokens are repeated this many times in the document. */
|
|
43
|
+
export const SLUG_BOOST = 3;
|
|
44
|
+
/** Compound fallback: shortest vocabulary prefix that may stand in for an unknown token. */
|
|
45
|
+
export const COMPOUND_MIN_PREFIX = 4;
|
|
46
|
+
export const DEFAULT_TUNING = {
|
|
47
|
+
favor: 1.35,
|
|
48
|
+
demote: 0.7,
|
|
49
|
+
// Swept 2026-09-02 on evals/routing: plateau 0.25-0.30; at >=0.35 related
|
|
50
|
+
// neighbours begin outranking direct matches (retarget lost to its siblings).
|
|
51
|
+
relatedBoost: 0.25,
|
|
52
|
+
relatedFromTop: 3,
|
|
53
|
+
compoundWeight: 0.6,
|
|
54
|
+
triggerBonus: 0.6,
|
|
55
|
+
};
|
|
56
|
+
// ── Tokenization ───────────────────────────────────────────────────────────
|
|
57
|
+
const STOPWORDS = new Set([
|
|
58
|
+
"a", "an", "the", "of", "to", "in", "on", "for", "and", "or", "is", "are",
|
|
59
|
+
"it", "my", "me", "i", "with", "when", "use", "this", "that", "via", "into",
|
|
60
|
+
"from", "as", "at", "be", "by", "not", "no", "so", "do", "how", "what",
|
|
61
|
+
"should", "want", "wants", "user", "trigger", "covers", "like", "its", "s",
|
|
62
|
+
]);
|
|
63
|
+
/**
|
|
64
|
+
* Light suffix stemmer. Deliberately conservative: only the endings that show
|
|
65
|
+
* up as noise between user phrasing and metadata (plurals, -ing, -ed).
|
|
66
|
+
*/
|
|
67
|
+
export function stem(t) {
|
|
68
|
+
if (t.length <= 3)
|
|
69
|
+
return t;
|
|
70
|
+
// plurals
|
|
71
|
+
if (t.endsWith("ies") && t.length > 4)
|
|
72
|
+
t = t.slice(0, -3) + "y";
|
|
73
|
+
else if (t.endsWith("sses"))
|
|
74
|
+
t = t.slice(0, -2);
|
|
75
|
+
else if (/(sh|ch|x|z)es$/.test(t))
|
|
76
|
+
t = t.slice(0, -2);
|
|
77
|
+
else if (t.endsWith("s") && !t.endsWith("ss") && !t.endsWith("us"))
|
|
78
|
+
t = t.slice(0, -1);
|
|
79
|
+
// verb forms; undo consonant doubling (running -> runn -> run) but keep ll/ss/ff/zz
|
|
80
|
+
if (t.endsWith("ing") && t.length > 5)
|
|
81
|
+
t = undouble(t.slice(0, -3));
|
|
82
|
+
else if (t.endsWith("ed") && t.length > 4 && !t.endsWith("eed"))
|
|
83
|
+
t = undouble(t.slice(0, -2));
|
|
84
|
+
return t;
|
|
85
|
+
}
|
|
86
|
+
function undouble(t) {
|
|
87
|
+
const n = t.length;
|
|
88
|
+
if (n < 3)
|
|
89
|
+
return t;
|
|
90
|
+
const a = t[n - 1];
|
|
91
|
+
const b = t[n - 2];
|
|
92
|
+
if (a === b && !"aeiou".includes(a) && !["l", "s", "f", "z"].includes(a))
|
|
93
|
+
return t.slice(0, -1);
|
|
94
|
+
return t;
|
|
95
|
+
}
|
|
96
|
+
export function tokenize(s) {
|
|
97
|
+
return s
|
|
98
|
+
.toLowerCase()
|
|
99
|
+
.replace(/[^a-z0-9]+/g, " ")
|
|
100
|
+
.split(/\s+/)
|
|
101
|
+
.filter((t) => t.length > 1 && !STOPWORDS.has(t))
|
|
102
|
+
.map(stem);
|
|
103
|
+
}
|
|
104
|
+
// ── Index ──────────────────────────────────────────────────────────────────
|
|
105
|
+
export function buildSearchIndex(entries) {
|
|
106
|
+
const docs = [];
|
|
107
|
+
const df = new Map();
|
|
108
|
+
let totalLen = 0;
|
|
109
|
+
for (const e of entries) {
|
|
110
|
+
const slug = e.id.split("/").pop() ?? "";
|
|
111
|
+
const text = [e.summary ?? "", ...(e.use_when ?? []), ...(e.facets?.domains ?? [])].join(" ");
|
|
112
|
+
const tokens = tokenize(text);
|
|
113
|
+
for (const st of tokenize(slug))
|
|
114
|
+
for (let i = 0; i < SLUG_BOOST; i++)
|
|
115
|
+
tokens.push(st);
|
|
116
|
+
const tf = new Map();
|
|
117
|
+
for (const t of tokens)
|
|
118
|
+
tf.set(t, (tf.get(t) ?? 0) + 1);
|
|
119
|
+
for (const t of tf.keys())
|
|
120
|
+
df.set(t, (df.get(t) ?? 0) + 1);
|
|
121
|
+
const related = [];
|
|
122
|
+
for (const list of Object.values(e.related ?? {}))
|
|
123
|
+
if (Array.isArray(list))
|
|
124
|
+
related.push(...list);
|
|
125
|
+
docs.push({ id: e.id, kind: e.kind, tf, len: tokens.length, related, triggers: extractTriggers(e.use_when ?? []) });
|
|
126
|
+
totalLen += tokens.length;
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
docs,
|
|
130
|
+
df,
|
|
131
|
+
avgLen: totalLen / Math.max(docs.length, 1),
|
|
132
|
+
byId: new Map(docs.map((d) => [d.id, d])),
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
/** Normalize free text for whole-phrase comparison: lowercase, letters/digits only, single spaces. */
|
|
136
|
+
function normalizePhrase(s) {
|
|
137
|
+
return s.toLowerCase().replace(/[^a-z0-9]+/g, " ").trim();
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Pull quoted trigger phrases out of use_when lines. Only straight quotes
|
|
141
|
+
* count, the phrase must be at least 3 chars, and bracketed placeholders
|
|
142
|
+
* ('I want to make a [genre] game') are dropped — a placeholder is not a
|
|
143
|
+
* literal trigger.
|
|
144
|
+
*/
|
|
145
|
+
export function extractTriggers(useWhen) {
|
|
146
|
+
const out = [];
|
|
147
|
+
for (const line of useWhen) {
|
|
148
|
+
for (const m of line.matchAll(/'([^']{3,}?)'|"([^"]{3,}?)"/g)) {
|
|
149
|
+
const raw = m[1] ?? m[2] ?? "";
|
|
150
|
+
if (/[\[\]]/.test(raw))
|
|
151
|
+
continue;
|
|
152
|
+
const norm = normalizePhrase(raw);
|
|
153
|
+
if (norm.length >= 3)
|
|
154
|
+
out.push(norm);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return out;
|
|
158
|
+
}
|
|
159
|
+
function matchesTrigger(normQuery, trigger) {
|
|
160
|
+
return (" " + normQuery + " ").includes(" " + trigger + " ");
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Map raw query tokens to index terms. Known tokens pass through at weight 1;
|
|
164
|
+
* unknown tokens fall back to their longest vocabulary prefix (compound
|
|
165
|
+
* splitting) at COMPOUND_WEIGHT, or are dropped when no prefix exists.
|
|
166
|
+
*/
|
|
167
|
+
export function queryTerms(index, qTokens, compoundWeight = DEFAULT_TUNING.compoundWeight) {
|
|
168
|
+
const out = [];
|
|
169
|
+
for (const t of qTokens) {
|
|
170
|
+
if (index.df.has(t)) {
|
|
171
|
+
out.push({ token: t, weight: 1 });
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
for (let len = t.length - 1; len >= COMPOUND_MIN_PREFIX; len--) {
|
|
175
|
+
const prefix = t.slice(0, len);
|
|
176
|
+
if (index.df.has(prefix)) {
|
|
177
|
+
out.push({ token: prefix, weight: compoundWeight });
|
|
178
|
+
break;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return out;
|
|
183
|
+
}
|
|
184
|
+
function bm25(index, terms, d) {
|
|
185
|
+
const N = index.docs.length;
|
|
186
|
+
let score = 0;
|
|
187
|
+
for (const { token: t, weight } of terms) {
|
|
188
|
+
const f = d.tf.get(t) ?? 0;
|
|
189
|
+
if (f === 0)
|
|
190
|
+
continue;
|
|
191
|
+
const n = index.df.get(t) ?? 0;
|
|
192
|
+
const idf = Math.log(1 + (N - n + 0.5) / (n + 0.5));
|
|
193
|
+
score += weight * idf * ((f * (K1 + 1)) / (f + K1 * (1 - B + B * (d.len / index.avgLen))));
|
|
194
|
+
}
|
|
195
|
+
return score;
|
|
196
|
+
}
|
|
197
|
+
// ── Kind prior ─────────────────────────────────────────────────────────────
|
|
198
|
+
/**
|
|
199
|
+
* Phrases that name a concrete engine/editor action a single tool performs.
|
|
200
|
+
* Matched as whole words / word sequences against the lowercased raw query
|
|
201
|
+
* (NOT stemmed tokens) so multi-word actions stay intact.
|
|
202
|
+
*/
|
|
203
|
+
const TOOL_ACTION_PHRASES = [
|
|
204
|
+
/\bscreenshot\b/, /\bscreen ?shot\b/, /\bcapture (a |the )?(frame|screen)\b/,
|
|
205
|
+
/\b(stop|pause|kill) (the )?(game|it)\b/, /\bis (the game|it) (currently )?running\b/,
|
|
206
|
+
/\b(add|create|insert|remove|delete|replace|select|inspect) (a |an |the |this |that )?(\w+ )?node\b/,
|
|
207
|
+
/\bset (the |a |its )?(\w+('s)? )?(property|prop|position|rotation|scale|size|color|value)\b/,
|
|
208
|
+
/\bproject setting/, /\bmain scene\b/, /\bsave (the |this )?scene\b/, /\bopen (the |a )?scene\b/,
|
|
209
|
+
/\bscene tree\b/, /\bnode tree\b/, /\bconnect (the |a )?(\w+('s)? )?signal\b/, /\bsignal to\b/,
|
|
210
|
+
/\b(bind|map) (the |a )?(\w+ )?(key|button|action|input)\b/, /\binput (map|action)\b/,
|
|
211
|
+
/\bconsole\b/, /\bdebugger\b/, /\bstack trace\b/, /\boutput panel\b/,
|
|
212
|
+
/\b(compile|parse|script) errors?\b/, /\bsyntax error/,
|
|
213
|
+
/\bimport (this |the |a |an )?(\w+ )?(from (a |the )?url|url|file|glb|gltf|fbx|png|wav|asset)\b/,
|
|
214
|
+
/\bdownload (the |an |this )?asset\b/, /\basset (id|by id)\b/, /\bjob (id|status)\b/,
|
|
215
|
+
/\b(read|write|overwrite) (the |a |this )?file\b/, /\breplace text\b/, /\bfind and replace\b/,
|
|
216
|
+
/\bsnapshot\b/, /\bdiff\b/, /\bapi docs?\b/, /\bclass reference\b/, /\blook up (the )?(\w+ )?(api|class|method|property|signal)\b/,
|
|
217
|
+
/\bpublish (the |my )?\.?pck\b/, /\bcreator (api|release|log|config)\b/,
|
|
218
|
+
/\bcollision shape\b/, /\bmaterial (color|colour|property)\b/, /\bresource property\b/,
|
|
219
|
+
/\bclear (the )?console\b/, /\brun (a |an |this |the )?(editor ?script|gdscript|script) (in|against|on)\b/,
|
|
220
|
+
];
|
|
221
|
+
/** Imperative creative/design verbs that open a "build me a gameplay thing" ask. */
|
|
222
|
+
const SKILL_IMPERATIVE_OPENERS = /^(please |can you |could you |i want to |i need to |let's |lets |help me |i'd like to )?(make|build|design|create|give|put|turn|generate|draw|add|write|implement|animate|compose|render|blend|bake|pick|clean up|polish|tune|set up|setup|export|publish|ship|test|deploy)\b/;
|
|
223
|
+
/** "the X is broken" / symptom descriptions — the user is describing, not commanding. */
|
|
224
|
+
const SYMPTOM_PHRASES = /\b(crash(es|ed|ing)?|bug|broken|doesn't work|does not work|not working|stuck|glitch|lag|flat|floaty|mushy|too dark|too bright|blocky|drops?|falls? through|floats? above|clip(s|ping)? through|keeps? \w+ing|used to|feels?)\b/;
|
|
225
|
+
/** Asking for a starting point. */
|
|
226
|
+
const TEMPLATE_PHRASES = /\b(templates?|starters?|boilerplate|start(ing)? from|what can i start|example project|sample project|scaffold from|base(d)? on a)\b/;
|
|
227
|
+
/** Conceptual "what is / how does" questions — a reference answers, a skill acts. */
|
|
228
|
+
const REFERENCE_PHRASES = /^(what is|what's|what are|what does|how does|how do (the|these|those)|why does|why do|which (version|engine|godot)|when should i (say|use|call)|is it (safe|ok|okay) to)\b|\b(convention|style guide|protocol|reference for|difference between|terminology|which tool should)\b/;
|
|
229
|
+
/** "how do I / how should I" is a how-to ask, which a skill answers — not a reference. */
|
|
230
|
+
const HOWTO_PHRASES = /^(how (do|can|should|would) (i|we|you)\b|how to\b)/;
|
|
231
|
+
/**
|
|
232
|
+
* Derive a kind prior from the query alone.
|
|
233
|
+
*
|
|
234
|
+
* Rules (each may fire; effects multiply):
|
|
235
|
+
* R0 default — a user-phrased request with no engine-action vocabulary
|
|
236
|
+
* is a skill ask: skills are the entry point that names
|
|
237
|
+
* tools. skill x FAVOR, tool x DEMOTE. Skipped when R1
|
|
238
|
+
* fires.
|
|
239
|
+
* R1 tool-action — the query names a concrete engine/editor action
|
|
240
|
+
* (screenshot, add node, set property, import, console,
|
|
241
|
+
* stop the game ...). tool x FAVOR; R0 is suppressed. Skills
|
|
242
|
+
* stay neutral: the wrapping skill (e.g. skill/play) may
|
|
243
|
+
* still rank on lexical merit.
|
|
244
|
+
* R2 imperative — the query opens with a creative/design imperative
|
|
245
|
+
* ("make/build/design/add a ..."). skill x FAVOR again
|
|
246
|
+
* unless R1 fired (then only a mild skill lift so
|
|
247
|
+
* "add a Camera3D node" stays a tool ask).
|
|
248
|
+
* R3 symptom — the query describes a problem ("the character falls
|
|
249
|
+
* through the floor", "fps drops"). skill x FAVOR; template
|
|
250
|
+
* x DEMOTE (a starter never fixes a symptom).
|
|
251
|
+
* R4 template — asks for a template/starter/"start from". template x FAVOR.
|
|
252
|
+
* R5 reference — conceptual "what is / how does X work / convention".
|
|
253
|
+
* reference x FAVOR. Not triggered by "how do I ..." (R6).
|
|
254
|
+
* R6 how-to — "how do I / how should I": a skill answers. skill x FAVOR,
|
|
255
|
+
* reference x DEMOTE.
|
|
256
|
+
*/
|
|
257
|
+
export function inferKindPrior(query, tuning = DEFAULT_TUNING) {
|
|
258
|
+
const FAVOR = tuning.favor;
|
|
259
|
+
const DEMOTE = tuning.demote;
|
|
260
|
+
const q = query.toLowerCase().trim();
|
|
261
|
+
const prior = { skill: 1, tool: 1, template: 1, reference: 1, example: 1, rules: [] };
|
|
262
|
+
const toolAction = TOOL_ACTION_PHRASES.some((re) => re.test(q));
|
|
263
|
+
if (toolAction) {
|
|
264
|
+
prior.tool *= FAVOR;
|
|
265
|
+
prior.rules.push("R1:tool-action");
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
prior.skill *= FAVOR;
|
|
269
|
+
prior.tool *= DEMOTE;
|
|
270
|
+
prior.rules.push("R0:default-skill");
|
|
271
|
+
}
|
|
272
|
+
if (SKILL_IMPERATIVE_OPENERS.test(q)) {
|
|
273
|
+
prior.skill *= toolAction ? 1.1 : FAVOR;
|
|
274
|
+
prior.rules.push("R2:imperative");
|
|
275
|
+
}
|
|
276
|
+
if (SYMPTOM_PHRASES.test(q)) {
|
|
277
|
+
prior.skill *= FAVOR;
|
|
278
|
+
prior.template *= DEMOTE;
|
|
279
|
+
prior.rules.push("R3:symptom");
|
|
280
|
+
}
|
|
281
|
+
if (TEMPLATE_PHRASES.test(q)) {
|
|
282
|
+
prior.template *= FAVOR;
|
|
283
|
+
prior.rules.push("R4:template");
|
|
284
|
+
}
|
|
285
|
+
if (HOWTO_PHRASES.test(q)) {
|
|
286
|
+
prior.skill *= FAVOR;
|
|
287
|
+
prior.reference *= DEMOTE;
|
|
288
|
+
prior.rules.push("R6:how-to");
|
|
289
|
+
}
|
|
290
|
+
else if (REFERENCE_PHRASES.test(q)) {
|
|
291
|
+
prior.reference *= FAVOR;
|
|
292
|
+
prior.rules.push("R5:reference");
|
|
293
|
+
}
|
|
294
|
+
return prior;
|
|
295
|
+
}
|
|
296
|
+
function priorFor(prior, kind) {
|
|
297
|
+
switch (kind) {
|
|
298
|
+
case "skill": return prior.skill;
|
|
299
|
+
case "tool": return prior.tool;
|
|
300
|
+
case "template": return prior.template;
|
|
301
|
+
case "reference": return prior.reference;
|
|
302
|
+
case "example": return prior.example;
|
|
303
|
+
default: return 1;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
export function rankEntries(index, query, opts = {}) {
|
|
307
|
+
const limit = opts.limit ?? 5;
|
|
308
|
+
const useKindPrior = opts.kindPrior ?? true;
|
|
309
|
+
const useRelated = opts.relatedBoost ?? true;
|
|
310
|
+
const useTriggers = opts.triggerBonus ?? true;
|
|
311
|
+
const tuning = { ...DEFAULT_TUNING, ...(opts.tuning ?? {}) };
|
|
312
|
+
const terms = queryTerms(index, tokenize(query), tuning.compoundWeight);
|
|
313
|
+
const prior = useKindPrior ? inferKindPrior(query, tuning) : null;
|
|
314
|
+
const normQuery = normalizePhrase(query);
|
|
315
|
+
const hits = index.docs.map((d) => ({
|
|
316
|
+
id: d.id,
|
|
317
|
+
kind: d.kind,
|
|
318
|
+
lexical: bm25(index, terms, d),
|
|
319
|
+
triggerBonus: 0,
|
|
320
|
+
prior: prior ? priorFor(prior, d.kind) : 1,
|
|
321
|
+
relatedBoost: 0,
|
|
322
|
+
score: 0,
|
|
323
|
+
}));
|
|
324
|
+
if (useTriggers) {
|
|
325
|
+
const best = Math.max(0, ...hits.map((h) => h.lexical));
|
|
326
|
+
for (const h of hits) {
|
|
327
|
+
const doc = index.byId.get(h.id);
|
|
328
|
+
if (doc && doc.triggers.some((t) => matchesTrigger(normQuery, t)))
|
|
329
|
+
h.triggerBonus = tuning.triggerBonus * best;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
const combine = (h) => (h.lexical + h.triggerBonus) * h.prior + h.relatedBoost;
|
|
333
|
+
for (const h of hits)
|
|
334
|
+
h.score = combine(h);
|
|
335
|
+
const byId = new Map(hits.map((h) => [h.id, h]));
|
|
336
|
+
sortHits(hits);
|
|
337
|
+
if (useRelated) {
|
|
338
|
+
const lenders = hits.slice(0, tuning.relatedFromTop).filter((h) => h.score > 0);
|
|
339
|
+
for (const lender of lenders) {
|
|
340
|
+
const doc = index.byId.get(lender.id);
|
|
341
|
+
if (!doc)
|
|
342
|
+
continue;
|
|
343
|
+
for (const rid of doc.related) {
|
|
344
|
+
const target = byId.get(rid);
|
|
345
|
+
if (!target || target.id === lender.id)
|
|
346
|
+
continue;
|
|
347
|
+
target.relatedBoost += tuning.relatedBoost * lender.score;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
for (const h of hits)
|
|
351
|
+
h.score = combine(h);
|
|
352
|
+
sortHits(hits);
|
|
353
|
+
}
|
|
354
|
+
return hits.slice(0, limit);
|
|
355
|
+
}
|
|
356
|
+
function sortHits(hits) {
|
|
357
|
+
hits.sort((a, b) => b.score - a.score || a.id.localeCompare(b.id));
|
|
358
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export declare const AGENT_CLIENTS: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "kilo-code", "gemini", "github-copilot", "vscode-copilot", "opencode"];
|
|
2
|
+
export type AgentClient = (typeof AGENT_CLIENTS)[number];
|
|
3
|
+
/** resource.yaml `status` (registry/schemas/skill.schema.json). */
|
|
4
|
+
export type SkillStatus = "stable" | "preview" | "deprecated";
|
|
5
|
+
export interface SkillRegistryEntry {
|
|
6
|
+
/** Library resource id, e.g. "skill/3d-lighting". */
|
|
7
|
+
id: string;
|
|
8
|
+
/** Skill name (SKILL.md frontmatter name; equals the library slug). */
|
|
9
|
+
name: string;
|
|
10
|
+
description: string;
|
|
11
|
+
/** Installed by `summer skills install --recommended` (used by `summer setup`). */
|
|
12
|
+
recommended: boolean;
|
|
13
|
+
/** Bulk installs take `stable` and `preview` (preview is a label — "not yet
|
|
14
|
+
* exercised in-engine by the Summer team" — carried in the skill's guidance;
|
|
15
|
+
* --stable-only skips it); `deprecated` installs only by explicit name. A
|
|
16
|
+
* registry generated before this field existed reads as `stable`. */
|
|
17
|
+
status: SkillStatus;
|
|
18
|
+
/** Package-root-relative skill dir, e.g. "library/skills/3d-lighting/". */
|
|
19
|
+
path: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Load the generated skill registry (cached after first read).
|
|
23
|
+
* Throws if the generated file is missing or unparsable — the npm package
|
|
24
|
+
* always ships it, so a failure here means a broken build, not user error.
|
|
25
|
+
*/
|
|
26
|
+
export declare function getSkillRegistry(): readonly SkillRegistryEntry[];
|
|
27
|
+
/** Shape-tolerant parse of skills-registry.json. Exported for unit tests. */
|
|
28
|
+
export declare function parseSkillRegistry(json: unknown): SkillRegistryEntry[];
|
|
29
|
+
/**
|
|
30
|
+
* The one bulk-install rule (`skills install --all/--recommended` and
|
|
31
|
+
* `summer setup` both use it): `stable` and `preview` skills install —
|
|
32
|
+
* preview is a label ("not yet exercised in-engine by the Summer team"),
|
|
33
|
+
* carried in each skill's own guidance, not a reason to hide contributed work;
|
|
34
|
+
* `deprecated` never installs in bulk. `stableOnly` opts out of preview.
|
|
35
|
+
* The counts let the caller say how many preview skills it installed (or, with
|
|
36
|
+
* stableOnly, left out) instead of printing a bare total.
|
|
37
|
+
*/
|
|
38
|
+
export declare function selectSkillsForBulkInstall(skills: readonly SkillRegistryEntry[], options: {
|
|
39
|
+
recommended?: boolean;
|
|
40
|
+
stableOnly?: boolean;
|
|
41
|
+
}): {
|
|
42
|
+
selected: SkillRegistryEntry[];
|
|
43
|
+
previewIncluded: number;
|
|
44
|
+
previewSkipped: number;
|
|
45
|
+
};
|
|
46
|
+
/** Absolute directory of a skill's library files (contains SKILL.md). */
|
|
47
|
+
export declare function resolveSkillDir(entry: SkillRegistryEntry): string;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill registry — loaded from the generated registry (CONTRACT.md §6, §12).
|
|
3
|
+
*
|
|
4
|
+
* The single source of truth for installable skills is the library:
|
|
5
|
+
* `library/skills/<slug>/` (resource.yaml + SKILL.md), compiled by
|
|
6
|
+
* `npm run generate:registry` into `registry/generated/skills-registry.json`.
|
|
7
|
+
* This module reads that generated file at runtime; nothing here is
|
|
8
|
+
* hand-maintained per skill anymore. The old hand-written SKILL_REGISTRY
|
|
9
|
+
* (skills/<category>/<name> paths) was deleted at the v3 cutover.
|
|
10
|
+
*/
|
|
11
|
+
import { readFileSync } from "node:fs";
|
|
12
|
+
import { join } from "node:path";
|
|
13
|
+
import { PACKAGE_ROOT } from "./package-root.js";
|
|
14
|
+
export const AGENT_CLIENTS = [
|
|
15
|
+
"summer",
|
|
16
|
+
"codex",
|
|
17
|
+
"claude-code",
|
|
18
|
+
"cursor",
|
|
19
|
+
"windsurf",
|
|
20
|
+
"cline",
|
|
21
|
+
"roo-code",
|
|
22
|
+
"kilo-code",
|
|
23
|
+
"gemini",
|
|
24
|
+
"github-copilot",
|
|
25
|
+
"vscode-copilot",
|
|
26
|
+
"opencode",
|
|
27
|
+
];
|
|
28
|
+
const packageRoot = PACKAGE_ROOT;
|
|
29
|
+
const REGISTRY_RELPATH = join("registry", "generated", "skills-registry.json");
|
|
30
|
+
let cache = null;
|
|
31
|
+
/**
|
|
32
|
+
* Load the generated skill registry (cached after first read).
|
|
33
|
+
* Throws if the generated file is missing or unparsable — the npm package
|
|
34
|
+
* always ships it, so a failure here means a broken build, not user error.
|
|
35
|
+
*/
|
|
36
|
+
export function getSkillRegistry() {
|
|
37
|
+
if (cache)
|
|
38
|
+
return cache;
|
|
39
|
+
const file = join(packageRoot, REGISTRY_RELPATH);
|
|
40
|
+
cache = parseSkillRegistry(JSON.parse(readFileSync(file, "utf-8")));
|
|
41
|
+
return cache;
|
|
42
|
+
}
|
|
43
|
+
/** Shape-tolerant parse of skills-registry.json. Exported for unit tests. */
|
|
44
|
+
export function parseSkillRegistry(json) {
|
|
45
|
+
const raw = (json ?? {});
|
|
46
|
+
const skills = Array.isArray(raw.skills) ? raw.skills : [];
|
|
47
|
+
return skills
|
|
48
|
+
.filter((s) => typeof s.id === "string" &&
|
|
49
|
+
typeof s.name === "string" &&
|
|
50
|
+
typeof s.path === "string")
|
|
51
|
+
.map((s) => ({
|
|
52
|
+
id: s.id,
|
|
53
|
+
name: s.name,
|
|
54
|
+
description: typeof s.description === "string" ? s.description : "",
|
|
55
|
+
recommended: s.recommended === true,
|
|
56
|
+
status: s.status === "preview" || s.status === "deprecated" ? s.status : "stable",
|
|
57
|
+
path: s.path,
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* The one bulk-install rule (`skills install --all/--recommended` and
|
|
62
|
+
* `summer setup` both use it): `stable` and `preview` skills install —
|
|
63
|
+
* preview is a label ("not yet exercised in-engine by the Summer team"),
|
|
64
|
+
* carried in each skill's own guidance, not a reason to hide contributed work;
|
|
65
|
+
* `deprecated` never installs in bulk. `stableOnly` opts out of preview.
|
|
66
|
+
* The counts let the caller say how many preview skills it installed (or, with
|
|
67
|
+
* stableOnly, left out) instead of printing a bare total.
|
|
68
|
+
*/
|
|
69
|
+
export function selectSkillsForBulkInstall(skills, options) {
|
|
70
|
+
const candidates = options.recommended ? skills.filter((skill) => skill.recommended) : [...skills];
|
|
71
|
+
const stableOnly = options.stableOnly === true;
|
|
72
|
+
const selected = candidates.filter((skill) => skill.status === "stable" || (!stableOnly && skill.status === "preview"));
|
|
73
|
+
const preview = candidates.filter((skill) => skill.status === "preview").length;
|
|
74
|
+
return {
|
|
75
|
+
selected,
|
|
76
|
+
previewIncluded: stableOnly ? 0 : preview,
|
|
77
|
+
previewSkipped: stableOnly ? preview : 0,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/** Absolute directory of a skill's library files (contains SKILL.md). */
|
|
81
|
+
export function resolveSkillDir(entry) {
|
|
82
|
+
return join(packageRoot, entry.path);
|
|
83
|
+
}
|