summer-engine 2.8.2 → 3.1.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 +149 -44
- package/CLAUDE.md +4 -2
- package/GEMINI.md +7 -53
- package/NOTICE +31 -0
- package/README.md +161 -393
- 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/cli/commands/setup.js +158 -0
- package/dist/{commands → cli/commands}/skills.js +121 -251
- 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 +55 -0
- package/dist/core/skills-registry.js +106 -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/installer/agent-config.d.ts +63 -0
- package/dist/installer/agent-config.js +540 -0
- package/dist/installer/agent-table.d.ts +103 -0
- package/dist/installer/agent-table.js +584 -0
- 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 +148 -0
- package/dist/installer/skill-locations.d.ts +36 -0
- package/dist/installer/skill-locations.js +91 -0
- package/dist/installer/version-check.d.ts +178 -0
- package/dist/installer/version-check.js +479 -0
- 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 +99 -0
- package/integrations/amp/README.md +12 -0
- package/integrations/amp/manifest-target.json +3 -0
- package/integrations/antigravity/README.md +12 -0
- package/integrations/antigravity/manifest-target.json +3 -0
- package/integrations/claude/README.md +19 -0
- package/integrations/claude/manifest-target.json +16 -0
- package/integrations/claude-desktop/README.md +12 -0
- package/integrations/claude-desktop/manifest-target.json +3 -0
- package/integrations/cline/README.md +12 -0
- package/integrations/cline/manifest-target.json +3 -0
- package/integrations/cline-cli/README.md +12 -0
- package/integrations/cline-cli/manifest-target.json +3 -0
- package/integrations/codex/README.md +15 -0
- package/integrations/codex/manifest-target.json +5 -0
- package/integrations/copilot-jetbrains/README.md +12 -0
- package/integrations/copilot-jetbrains/manifest-target.json +3 -0
- package/integrations/crush/README.md +12 -0
- package/integrations/crush/manifest-target.json +3 -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/goose/README.md +12 -0
- package/integrations/goose/manifest-target.json +3 -0
- package/integrations/grok-build/README.md +12 -0
- package/integrations/grok-build/manifest-target.json +3 -0
- package/integrations/hermes/README.md +12 -0
- package/integrations/hermes/manifest-target.json +3 -0
- package/integrations/junie/README.md +12 -0
- package/integrations/junie/manifest-target.json +3 -0
- package/integrations/kilo-code/README.md +12 -0
- package/integrations/kilo-code/manifest-target.json +3 -0
- package/integrations/kimi-code/README.md +12 -0
- package/integrations/kimi-code/manifest-target.json +3 -0
- package/integrations/kiro/README.md +12 -0
- package/integrations/kiro/manifest-target.json +3 -0
- package/integrations/lm-studio/README.md +12 -0
- package/integrations/lm-studio/manifest-target.json +3 -0
- package/integrations/mistral-vibe/README.md +12 -0
- package/integrations/mistral-vibe/manifest-target.json +3 -0
- package/integrations/opencode/README.md +12 -0
- package/integrations/opencode/manifest-target.json +3 -0
- package/integrations/qoder/README.md +12 -0
- package/integrations/qoder/manifest-target.json +3 -0
- package/integrations/qwen-code/README.md +12 -0
- package/integrations/qwen-code/manifest-target.json +3 -0
- package/integrations/roo-code/README.md +14 -0
- package/integrations/roo-code/manifest-target.json +3 -0
- package/integrations/rovo-dev/README.md +12 -0
- package/integrations/rovo-dev/manifest-target.json +3 -0
- package/integrations/trae/README.md +12 -0
- package/integrations/trae/manifest-target.json +3 -0
- package/integrations/visual-studio/README.md +12 -0
- package/integrations/visual-studio/manifest-target.json +3 -0
- package/integrations/vscode-copilot/README.md +12 -0
- package/integrations/vscode-copilot/manifest-target.json +3 -0
- package/integrations/warp/README.md +12 -0
- package/integrations/warp/manifest-target.json +3 -0
- package/integrations/windsurf/README.md +12 -0
- package/integrations/windsurf/manifest-target.json +3 -0
- package/integrations/zed/README.md +12 -0
- package/integrations/zed/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/library/skills/README.md +242 -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 +21 -15
- 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-index.md +242 -0
- package/registry/generated/skills-registry.json +1249 -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/setup.js +0 -217
- package/dist/commands/status.js +0 -46
- package/dist/lib/agent-config.d.ts +0 -39
- package/dist/lib/agent-config.js +0 -626
- 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/lib/version-check.js +0 -338
- 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,143 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { type EmbeddingsFile } from "./embeddings.js";
|
|
3
|
+
export declare const LIBRARY_KINDS: readonly ["tool", "skill", "example", "template", "collection", "reference"];
|
|
4
|
+
export type LibraryKind = (typeof LIBRARY_KINDS)[number];
|
|
5
|
+
/** library/<dir>/<slug> per kind (CONTRACT §2). */
|
|
6
|
+
export declare const LIBRARY_KIND_DIRS: Record<LibraryKind, string>;
|
|
7
|
+
export declare const LIBRARY_ID_PATTERN: RegExp;
|
|
8
|
+
export declare const DEFAULT_SEARCH_LIMIT = 8;
|
|
9
|
+
export declare const MAX_SEARCH_LIMIT = 20;
|
|
10
|
+
export declare const MAX_QUERY_LENGTH = 300;
|
|
11
|
+
/**
|
|
12
|
+
* Status factor applied to every candidate's score before ordering — the
|
|
13
|
+
* lexical score and the semantic cosine alike, so both sides of the fusion
|
|
14
|
+
* see the same order. A `preview` entry has not been exercised in-engine by
|
|
15
|
+
* the Summer team, so with comparable evidence the stable entry must win: a
|
|
16
|
+
* preview hit needs a lexical margin of more than 1/PREVIEW_SCORE_FACTOR
|
|
17
|
+
* (25%) over a stable one to outrank it. include_preview:false still removes
|
|
18
|
+
* preview entries entirely; this only orders them. Applied here, not in the
|
|
19
|
+
* index ranker (registry-search.ts), because status is a catalog attribute the
|
|
20
|
+
* routing eval corpus does not carry.
|
|
21
|
+
*
|
|
22
|
+
* Calibration (E2E 2026-09-03 F-18): "make the platformer jump feel better"
|
|
23
|
+
* ranked preview skill/celeste-momentum-platforming (44.6) above stable
|
|
24
|
+
* skill/debugging-game-feel (38.6); at 0.8 the stable entry leads (35.7 vs 38.6)
|
|
25
|
+
* while every preview entry the routing queries expect keeps its top-5 slot.
|
|
26
|
+
*/
|
|
27
|
+
export declare const PREVIEW_SCORE_FACTOR = 0.8;
|
|
28
|
+
export declare function statusScoreFactor(status: string | undefined): number;
|
|
29
|
+
/** Hard cap on the query-embedding round trip: search must never feel slow. */
|
|
30
|
+
export declare const QUERY_EMBED_TIMEOUT_MS = 1500;
|
|
31
|
+
/** One record of registry/generated/index.json (the compiler's buildIndex). */
|
|
32
|
+
export interface LibraryIndexEntry {
|
|
33
|
+
id: string;
|
|
34
|
+
kind: string;
|
|
35
|
+
version?: string;
|
|
36
|
+
content_hash?: string;
|
|
37
|
+
summary?: string;
|
|
38
|
+
use_when?: string[];
|
|
39
|
+
facets?: {
|
|
40
|
+
lifecycle?: string[];
|
|
41
|
+
domains?: string[];
|
|
42
|
+
modalities?: string[];
|
|
43
|
+
};
|
|
44
|
+
compatibility?: Record<string, string>;
|
|
45
|
+
related?: Record<string, string[] | undefined>;
|
|
46
|
+
status?: string;
|
|
47
|
+
mcp_tool_name?: string;
|
|
48
|
+
remote?: boolean;
|
|
49
|
+
cli_command?: string;
|
|
50
|
+
authority?: Record<string, boolean>;
|
|
51
|
+
recommended?: boolean;
|
|
52
|
+
}
|
|
53
|
+
export type MatchedBy = "lexical" | "semantic";
|
|
54
|
+
export interface LibrarySearchHit {
|
|
55
|
+
id: string;
|
|
56
|
+
kind: string;
|
|
57
|
+
status: string;
|
|
58
|
+
summary: string;
|
|
59
|
+
use_when: string[];
|
|
60
|
+
/** Lexical: the ranker's score. Fused: the RRF score. Comparable only within one response. */
|
|
61
|
+
score: number;
|
|
62
|
+
matched_by: MatchedBy[];
|
|
63
|
+
/** Tool hits carry the MCP name so a hit can be turned into a call. */
|
|
64
|
+
mcp_tool_name?: string;
|
|
65
|
+
}
|
|
66
|
+
export interface LibrarySearchOptions {
|
|
67
|
+
kinds?: readonly string[];
|
|
68
|
+
limit?: number;
|
|
69
|
+
includePreview?: boolean;
|
|
70
|
+
}
|
|
71
|
+
/** Seams for tests and for callers that hold the data already. Every field
|
|
72
|
+
* optional; the defaults read the shipped package. */
|
|
73
|
+
export interface LibrarySearchDeps {
|
|
74
|
+
entries?: LibraryIndexEntry[];
|
|
75
|
+
/** `null` = no embeddings file. `undefined` = read the shipped one. */
|
|
76
|
+
embeddings?: EmbeddingsFile | null;
|
|
77
|
+
/** Query embedder. Return null to signal "unavailable" (never throw). */
|
|
78
|
+
embedQuery?: (query: string) => Promise<number[] | null>;
|
|
79
|
+
env?: NodeJS.ProcessEnv;
|
|
80
|
+
}
|
|
81
|
+
export interface LibrarySearchResult {
|
|
82
|
+
hits: LibrarySearchHit[];
|
|
83
|
+
/** True when a query vector was obtained and fused into the ranking. */
|
|
84
|
+
semantic: boolean;
|
|
85
|
+
}
|
|
86
|
+
export declare const searchLibraryInputShape: {
|
|
87
|
+
query: z.ZodString;
|
|
88
|
+
kinds: z.ZodOptional<z.ZodArray<z.ZodEnum<["tool", "skill", "example", "template", "collection", "reference"]>, "many">>;
|
|
89
|
+
limit: z.ZodOptional<z.ZodNumber>;
|
|
90
|
+
include_preview: z.ZodOptional<z.ZodBoolean>;
|
|
91
|
+
};
|
|
92
|
+
export declare const searchLibraryInputSchema: z.ZodObject<{
|
|
93
|
+
query: z.ZodString;
|
|
94
|
+
kinds: z.ZodOptional<z.ZodArray<z.ZodEnum<["tool", "skill", "example", "template", "collection", "reference"]>, "many">>;
|
|
95
|
+
limit: z.ZodOptional<z.ZodNumber>;
|
|
96
|
+
include_preview: z.ZodOptional<z.ZodBoolean>;
|
|
97
|
+
}, "strict", z.ZodTypeAny, {
|
|
98
|
+
query: string;
|
|
99
|
+
kinds?: ("template" | "tool" | "skill" | "reference" | "example" | "collection")[] | undefined;
|
|
100
|
+
limit?: number | undefined;
|
|
101
|
+
include_preview?: boolean | undefined;
|
|
102
|
+
}, {
|
|
103
|
+
query: string;
|
|
104
|
+
kinds?: ("template" | "tool" | "skill" | "reference" | "example" | "collection")[] | undefined;
|
|
105
|
+
limit?: number | undefined;
|
|
106
|
+
include_preview?: boolean | undefined;
|
|
107
|
+
}>;
|
|
108
|
+
export type SearchLibraryArgs = z.infer<typeof searchLibraryInputSchema>;
|
|
109
|
+
/** Test-only seam: forget the cached index and embeddings file. */
|
|
110
|
+
export declare function _resetLibrarySearchForTests(): void;
|
|
111
|
+
/**
|
|
112
|
+
* The shipped catalog. Throws when the generated file is missing or
|
|
113
|
+
* unparsable — the npm package always ships it, so that is a broken install,
|
|
114
|
+
* not a search miss.
|
|
115
|
+
*/
|
|
116
|
+
export declare function loadLibraryIndex(): LibraryIndexEntry[];
|
|
117
|
+
/** The shipped embeddings sidecar, or null when absent/unusable. Cached. */
|
|
118
|
+
export declare function loadEmbeddingsFile(): EmbeddingsFile | null;
|
|
119
|
+
/**
|
|
120
|
+
* Embed the query with the configured provider. Returns null on ANY problem
|
|
121
|
+
* — offline, timeout, non-2xx, bad body, invalid gateway config — so search
|
|
122
|
+
* degrades to lexical instead of failing. `SUMMER_EMBED_URL=off` disables the
|
|
123
|
+
* network call entirely (the query text is otherwise sent to the provider).
|
|
124
|
+
*/
|
|
125
|
+
export declare function embedQueryWithConfiguredProvider(query: string, env?: NodeJS.ProcessEnv): Promise<number[] | null>;
|
|
126
|
+
/**
|
|
127
|
+
* Rank the library for `query`. Deprecated entries never surface (they exist
|
|
128
|
+
* for alias continuity); preview entries surface unless includePreview is
|
|
129
|
+
* false. Never throws for provider/embeddings reasons.
|
|
130
|
+
*/
|
|
131
|
+
export declare function searchLibraryDetailed(query: string, options?: LibrarySearchOptions, deps?: LibrarySearchDeps): Promise<LibrarySearchResult>;
|
|
132
|
+
/** The ranked hits for `query` (see searchLibraryDetailed). */
|
|
133
|
+
export declare function searchLibrary(query: string, options?: LibrarySearchOptions, deps?: LibrarySearchDeps): Promise<LibrarySearchHit[]>;
|
|
134
|
+
export interface SearchLibraryPayload {
|
|
135
|
+
query: string;
|
|
136
|
+
semantic: boolean;
|
|
137
|
+
count: number;
|
|
138
|
+
results: LibrarySearchHit[];
|
|
139
|
+
hint: string;
|
|
140
|
+
}
|
|
141
|
+
export declare function searchHint(hits: readonly LibrarySearchHit[]): string;
|
|
142
|
+
/** What summer_search_library and `summer tool search-library` return. */
|
|
143
|
+
export declare function runSearchLibrary(args: SearchLibraryArgs, deps?: LibrarySearchDeps): Promise<SearchLibraryPayload>;
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Library search — the runtime librarian's first half (CONTRACT §6, §9).
|
|
3
|
+
*
|
|
4
|
+
* `searchLibrary(query, options)` ranks every entry of the shipped
|
|
5
|
+
* registry/generated/index.json for a plain-language task:
|
|
6
|
+
*
|
|
7
|
+
* 1. LEXICAL — `rankEntries` from ./registry-search.ts, the SAME kind-aware
|
|
8
|
+
* BM25 ranker the routing eval gates on, so runtime search and the eval
|
|
9
|
+
* measure one ranking.
|
|
10
|
+
* 2. SEMANTIC (optional) — when the install ships
|
|
11
|
+
* registry/generated/embeddings.json AND a query-embedding provider
|
|
12
|
+
* answers (SUMMER_EMBED_URL, or <gateway>/api/mcp/embed; 1.5s timeout;
|
|
13
|
+
* Summer account token attached when logged in), the query is embedded
|
|
14
|
+
* and scored by cosine over every stored vector (brute force — 10k x 384
|
|
15
|
+
* floats is well under a millisecond of arithmetic).
|
|
16
|
+
* 3. FUSION — lexical and semantic rankings merge by reciprocal rank fusion
|
|
17
|
+
* (k = 60). `matched_by` tells the agent which side found each hit.
|
|
18
|
+
*
|
|
19
|
+
* Offline, no embeddings file, provider error, dims mismatch, unparsable
|
|
20
|
+
* file: lexical only, `matched_by: ["lexical"]`, never a throw for that
|
|
21
|
+
* reason. Ties break on id so output is stable across runs.
|
|
22
|
+
*
|
|
23
|
+
* One behavior, two faces: `runSearchLibrary` is what both
|
|
24
|
+
* src/mcp/tools/library-tools.ts (summer_search_library) and
|
|
25
|
+
* src/core/capabilities/tool-dispatch.ts (`summer tool search-library`) call.
|
|
26
|
+
*/
|
|
27
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
28
|
+
import { join } from "node:path";
|
|
29
|
+
import { z } from "zod";
|
|
30
|
+
import { getAuthToken } from "./auth.js";
|
|
31
|
+
import { resolveGatewayUrl } from "./config.js";
|
|
32
|
+
import { EMBED_PATH, EMBEDDINGS_FILE, cosineSimilarity, createEmbedProvider, decodeVector, parseEmbeddingsFile, reciprocalRankFusion, } from "./embeddings.js";
|
|
33
|
+
import { PACKAGE_ROOT } from "./package-root.js";
|
|
34
|
+
import { buildSearchIndex, rankEntries } from "./registry-search.js";
|
|
35
|
+
export const LIBRARY_KINDS = ["tool", "skill", "example", "template", "collection", "reference"];
|
|
36
|
+
/** library/<dir>/<slug> per kind (CONTRACT §2). */
|
|
37
|
+
export const LIBRARY_KIND_DIRS = {
|
|
38
|
+
tool: "tools",
|
|
39
|
+
skill: "skills",
|
|
40
|
+
example: "examples",
|
|
41
|
+
template: "templates",
|
|
42
|
+
collection: "collections",
|
|
43
|
+
reference: "references",
|
|
44
|
+
};
|
|
45
|
+
export const LIBRARY_ID_PATTERN = /^(tool|skill|example|template|collection|reference)\/[a-z0-9]+(-[a-z0-9]+)*$/;
|
|
46
|
+
export const DEFAULT_SEARCH_LIMIT = 8;
|
|
47
|
+
export const MAX_SEARCH_LIMIT = 20;
|
|
48
|
+
export const MAX_QUERY_LENGTH = 300;
|
|
49
|
+
/**
|
|
50
|
+
* Status factor applied to every candidate's score before ordering — the
|
|
51
|
+
* lexical score and the semantic cosine alike, so both sides of the fusion
|
|
52
|
+
* see the same order. A `preview` entry has not been exercised in-engine by
|
|
53
|
+
* the Summer team, so with comparable evidence the stable entry must win: a
|
|
54
|
+
* preview hit needs a lexical margin of more than 1/PREVIEW_SCORE_FACTOR
|
|
55
|
+
* (25%) over a stable one to outrank it. include_preview:false still removes
|
|
56
|
+
* preview entries entirely; this only orders them. Applied here, not in the
|
|
57
|
+
* index ranker (registry-search.ts), because status is a catalog attribute the
|
|
58
|
+
* routing eval corpus does not carry.
|
|
59
|
+
*
|
|
60
|
+
* Calibration (E2E 2026-09-03 F-18): "make the platformer jump feel better"
|
|
61
|
+
* ranked preview skill/celeste-momentum-platforming (44.6) above stable
|
|
62
|
+
* skill/debugging-game-feel (38.6); at 0.8 the stable entry leads (35.7 vs 38.6)
|
|
63
|
+
* while every preview entry the routing queries expect keeps its top-5 slot.
|
|
64
|
+
*/
|
|
65
|
+
export const PREVIEW_SCORE_FACTOR = 0.8;
|
|
66
|
+
export function statusScoreFactor(status) {
|
|
67
|
+
return (status ?? "stable") === "preview" ? PREVIEW_SCORE_FACTOR : 1;
|
|
68
|
+
}
|
|
69
|
+
/** Hard cap on the query-embedding round trip: search must never feel slow. */
|
|
70
|
+
export const QUERY_EMBED_TIMEOUT_MS = 1500;
|
|
71
|
+
/** How deep each ranking is read before fusion. */
|
|
72
|
+
const FUSION_CANDIDATES = 50;
|
|
73
|
+
// ── Input schema (mirrors library/tools/search-library/resource.yaml; parity-tested) ──
|
|
74
|
+
export const searchLibraryInputShape = {
|
|
75
|
+
query: z
|
|
76
|
+
.string()
|
|
77
|
+
.min(1)
|
|
78
|
+
.max(MAX_QUERY_LENGTH)
|
|
79
|
+
.describe("The task in plain words — what you are building, fixing, or looking for (e.g. 'make stylized water', 'the player falls through the floor', 'which tool reads script errors')."),
|
|
80
|
+
kinds: z
|
|
81
|
+
.array(z.enum(LIBRARY_KINDS))
|
|
82
|
+
.optional()
|
|
83
|
+
.describe("Restrict to these kinds (tool, skill, example, template, collection, reference). Omit for all kinds."),
|
|
84
|
+
limit: z
|
|
85
|
+
.number()
|
|
86
|
+
.int()
|
|
87
|
+
.min(1)
|
|
88
|
+
.max(MAX_SEARCH_LIMIT)
|
|
89
|
+
.optional()
|
|
90
|
+
.describe(`Maximum results, 1-${MAX_SEARCH_LIMIT} (default ${DEFAULT_SEARCH_LIMIT}).`),
|
|
91
|
+
include_preview: z
|
|
92
|
+
.boolean()
|
|
93
|
+
.optional()
|
|
94
|
+
.describe("Include status: preview entries — not yet exercised in-engine by the Summer team (default true). false = stable only."),
|
|
95
|
+
};
|
|
96
|
+
export const searchLibraryInputSchema = z.object(searchLibraryInputShape).strict();
|
|
97
|
+
// ── Index loading (cached per process) ─────────────────────────────────────
|
|
98
|
+
const INDEX_RELPATH = join("registry", "generated", "index.json");
|
|
99
|
+
const EMBEDDINGS_RELPATH = join("registry", "generated", EMBEDDINGS_FILE);
|
|
100
|
+
let indexCache = null;
|
|
101
|
+
let embeddingsCache;
|
|
102
|
+
const searchIndexCache = new WeakMap();
|
|
103
|
+
/** Test-only seam: forget the cached index and embeddings file. */
|
|
104
|
+
export function _resetLibrarySearchForTests() {
|
|
105
|
+
indexCache = null;
|
|
106
|
+
embeddingsCache = undefined;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* The shipped catalog. Throws when the generated file is missing or
|
|
110
|
+
* unparsable — the npm package always ships it, so that is a broken install,
|
|
111
|
+
* not a search miss.
|
|
112
|
+
*/
|
|
113
|
+
export function loadLibraryIndex() {
|
|
114
|
+
if (indexCache)
|
|
115
|
+
return indexCache;
|
|
116
|
+
const file = join(PACKAGE_ROOT, INDEX_RELPATH);
|
|
117
|
+
let parsed;
|
|
118
|
+
try {
|
|
119
|
+
parsed = JSON.parse(readFileSync(file, "utf-8"));
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
123
|
+
throw new Error(`registry/generated/index.json is missing or unreadable in this install (${reason}). The summer-engine package always ships it — reinstall or update the package.`);
|
|
124
|
+
}
|
|
125
|
+
const resources = Array.isArray(parsed.resources) ? parsed.resources : [];
|
|
126
|
+
indexCache = resources.filter((entry) => !!entry && typeof entry === "object" && typeof entry.id === "string" && typeof entry.kind === "string");
|
|
127
|
+
return indexCache;
|
|
128
|
+
}
|
|
129
|
+
function searchIndexFor(entries) {
|
|
130
|
+
let index = searchIndexCache.get(entries);
|
|
131
|
+
if (!index) {
|
|
132
|
+
index = buildSearchIndex(entries);
|
|
133
|
+
searchIndexCache.set(entries, index);
|
|
134
|
+
}
|
|
135
|
+
return index;
|
|
136
|
+
}
|
|
137
|
+
/** The shipped embeddings sidecar, or null when absent/unusable. Cached. */
|
|
138
|
+
export function loadEmbeddingsFile() {
|
|
139
|
+
if (embeddingsCache !== undefined)
|
|
140
|
+
return embeddingsCache;
|
|
141
|
+
const file = join(PACKAGE_ROOT, EMBEDDINGS_RELPATH);
|
|
142
|
+
try {
|
|
143
|
+
embeddingsCache = existsSync(file) ? parseEmbeddingsFile(JSON.parse(readFileSync(file, "utf-8"))) : null;
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
embeddingsCache = null;
|
|
147
|
+
}
|
|
148
|
+
return embeddingsCache;
|
|
149
|
+
}
|
|
150
|
+
// ── Query embedding (default provider wiring) ──────────────────────────────
|
|
151
|
+
/**
|
|
152
|
+
* Embed the query with the configured provider. Returns null on ANY problem
|
|
153
|
+
* — offline, timeout, non-2xx, bad body, invalid gateway config — so search
|
|
154
|
+
* degrades to lexical instead of failing. `SUMMER_EMBED_URL=off` disables the
|
|
155
|
+
* network call entirely (the query text is otherwise sent to the provider).
|
|
156
|
+
*/
|
|
157
|
+
export async function embedQueryWithConfiguredProvider(query, env = process.env) {
|
|
158
|
+
try {
|
|
159
|
+
const override = env.SUMMER_EMBED_URL?.trim();
|
|
160
|
+
if (override === "off")
|
|
161
|
+
return null;
|
|
162
|
+
const url = override || `${await resolveGatewayUrl()}${EMBED_PATH}`;
|
|
163
|
+
let token = null;
|
|
164
|
+
try {
|
|
165
|
+
token = await getAuthToken();
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
token = null;
|
|
169
|
+
}
|
|
170
|
+
const provider = createEmbedProvider({ url, token, timeoutMs: QUERY_EMBED_TIMEOUT_MS });
|
|
171
|
+
return (await provider(query)).vector;
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// ── Search ─────────────────────────────────────────────────────────────────
|
|
178
|
+
function round4(n) {
|
|
179
|
+
return Math.round(n * 10000) / 10000;
|
|
180
|
+
}
|
|
181
|
+
function toHit(entry, score, matchedBy) {
|
|
182
|
+
const hit = {
|
|
183
|
+
id: entry.id,
|
|
184
|
+
kind: entry.kind,
|
|
185
|
+
status: entry.status ?? "stable",
|
|
186
|
+
summary: entry.summary ?? "",
|
|
187
|
+
use_when: Array.isArray(entry.use_when) ? entry.use_when : [],
|
|
188
|
+
score: round4(score),
|
|
189
|
+
matched_by: matchedBy,
|
|
190
|
+
};
|
|
191
|
+
if (entry.kind === "tool" && typeof entry.mcp_tool_name === "string")
|
|
192
|
+
hit.mcp_tool_name = entry.mcp_tool_name;
|
|
193
|
+
return hit;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Rank the library for `query`. Deprecated entries never surface (they exist
|
|
197
|
+
* for alias continuity); preview entries surface unless includePreview is
|
|
198
|
+
* false. Never throws for provider/embeddings reasons.
|
|
199
|
+
*/
|
|
200
|
+
export async function searchLibraryDetailed(query, options = {}, deps = {}) {
|
|
201
|
+
const entries = deps.entries ?? loadLibraryIndex();
|
|
202
|
+
const env = deps.env ?? process.env;
|
|
203
|
+
const limit = Math.min(MAX_SEARCH_LIMIT, Math.max(1, Math.floor(options.limit ?? DEFAULT_SEARCH_LIMIT)));
|
|
204
|
+
const kinds = options.kinds && options.kinds.length > 0 ? new Set(options.kinds) : null;
|
|
205
|
+
const includePreview = options.includePreview ?? true;
|
|
206
|
+
const byId = new Map(entries.map((entry) => [entry.id, entry]));
|
|
207
|
+
const eligible = (entry) => {
|
|
208
|
+
if (!entry)
|
|
209
|
+
return false;
|
|
210
|
+
if (kinds && !kinds.has(entry.kind))
|
|
211
|
+
return false;
|
|
212
|
+
const status = entry.status ?? "stable";
|
|
213
|
+
if (status === "deprecated")
|
|
214
|
+
return false;
|
|
215
|
+
if (!includePreview && status === "preview")
|
|
216
|
+
return false;
|
|
217
|
+
return true;
|
|
218
|
+
};
|
|
219
|
+
const factorFor = (id) => statusScoreFactor(byId.get(id)?.status);
|
|
220
|
+
const byScoreThenId = (a, b) => b.score - a.score || a.id.localeCompare(b.id);
|
|
221
|
+
const index = searchIndexFor(entries);
|
|
222
|
+
const lexical = rankEntries(index, query, { limit: index.docs.length })
|
|
223
|
+
.filter((hit) => hit.score > 0 && eligible(byId.get(hit.id)))
|
|
224
|
+
.map((hit) => ({ id: hit.id, score: hit.score * factorFor(hit.id) }))
|
|
225
|
+
.sort(byScoreThenId);
|
|
226
|
+
// Semantic side — every failure mode collapses to "not available".
|
|
227
|
+
let semanticRanked = [];
|
|
228
|
+
let semantic = false;
|
|
229
|
+
if (env.SUMMER_EMBED_URL?.trim() !== "off") {
|
|
230
|
+
const embeddings = deps.embeddings !== undefined ? deps.embeddings : loadEmbeddingsFile();
|
|
231
|
+
if (embeddings && Object.keys(embeddings.entries).length > 0) {
|
|
232
|
+
const embed = deps.embedQuery ?? ((q) => embedQueryWithConfiguredProvider(q, env));
|
|
233
|
+
let vector = null;
|
|
234
|
+
try {
|
|
235
|
+
vector = await embed(query);
|
|
236
|
+
}
|
|
237
|
+
catch {
|
|
238
|
+
vector = null;
|
|
239
|
+
}
|
|
240
|
+
if (vector && vector.length === embeddings.dims) {
|
|
241
|
+
semanticRanked = scoreSemantic(embeddings, vector, (id) => eligible(byId.get(id)), factorFor);
|
|
242
|
+
semantic = true;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
if (!semantic) {
|
|
247
|
+
return { hits: lexical.slice(0, limit).map((hit) => toHit(byId.get(hit.id), hit.score, ["lexical"])), semantic };
|
|
248
|
+
}
|
|
249
|
+
const lexicalIds = lexical.slice(0, FUSION_CANDIDATES).map((hit) => hit.id);
|
|
250
|
+
const semanticIds = semanticRanked.slice(0, FUSION_CANDIDATES).map((hit) => hit.id);
|
|
251
|
+
const lexicalSet = new Set(lexicalIds);
|
|
252
|
+
const semanticSet = new Set(semanticIds);
|
|
253
|
+
const fused = reciprocalRankFusion([lexicalIds, semanticIds]);
|
|
254
|
+
const hits = fused.slice(0, limit).map((f) => {
|
|
255
|
+
const matchedBy = [];
|
|
256
|
+
if (lexicalSet.has(f.id))
|
|
257
|
+
matchedBy.push("lexical");
|
|
258
|
+
if (semanticSet.has(f.id))
|
|
259
|
+
matchedBy.push("semantic");
|
|
260
|
+
return toHit(byId.get(f.id), f.score, matchedBy);
|
|
261
|
+
});
|
|
262
|
+
return { hits, semantic };
|
|
263
|
+
}
|
|
264
|
+
/** Cosine over every stored vector for eligible ids, times the status
|
|
265
|
+
* factor; positive scores only, sorted desc then by id. */
|
|
266
|
+
function scoreSemantic(embeddings, queryVector, eligible, factorFor) {
|
|
267
|
+
const scored = [];
|
|
268
|
+
for (const [id, entry] of Object.entries(embeddings.entries)) {
|
|
269
|
+
if (!eligible(id))
|
|
270
|
+
continue;
|
|
271
|
+
let vector;
|
|
272
|
+
try {
|
|
273
|
+
vector = decodeVector(entry.vector);
|
|
274
|
+
}
|
|
275
|
+
catch {
|
|
276
|
+
continue;
|
|
277
|
+
}
|
|
278
|
+
if (vector.length !== queryVector.length)
|
|
279
|
+
continue;
|
|
280
|
+
const score = cosineSimilarity(queryVector, vector);
|
|
281
|
+
if (score > 0)
|
|
282
|
+
scored.push({ id, score: score * factorFor(id) });
|
|
283
|
+
}
|
|
284
|
+
return scored.sort((a, b) => b.score - a.score || a.id.localeCompare(b.id));
|
|
285
|
+
}
|
|
286
|
+
/** The ranked hits for `query` (see searchLibraryDetailed). */
|
|
287
|
+
export async function searchLibrary(query, options = {}, deps = {}) {
|
|
288
|
+
return (await searchLibraryDetailed(query, options, deps)).hits;
|
|
289
|
+
}
|
|
290
|
+
export function searchHint(hits) {
|
|
291
|
+
if (hits.length === 0) {
|
|
292
|
+
return "No entry matched. Rephrase in task words (what you are building or fixing), or drop the kinds filter; if the library truly has nothing, say so instead of guessing.";
|
|
293
|
+
}
|
|
294
|
+
const top = hits[0].id;
|
|
295
|
+
return `Read one with summer_read_library {"id": "${top}"} before acting on it (shell: summer tool read-library --args '{"id":"${top}"}'). Scores compare only within this response.`;
|
|
296
|
+
}
|
|
297
|
+
/** What summer_search_library and `summer tool search-library` return. */
|
|
298
|
+
export async function runSearchLibrary(args, deps = {}) {
|
|
299
|
+
const { hits, semantic } = await searchLibraryDetailed(args.query, { kinds: args.kinds, limit: args.limit, includePreview: args.include_preview }, deps);
|
|
300
|
+
return { query: args.query, semantic, count: hits.length, results: hits, hint: searchHint(hits) };
|
|
301
|
+
}
|
|
@@ -71,10 +71,12 @@ export function filterAndDedupe(entries, opts = {}) {
|
|
|
71
71
|
}
|
|
72
72
|
}
|
|
73
73
|
}
|
|
74
|
-
// Pass 3: truncate
|
|
74
|
+
// Pass 3: truncate — keep the NEWEST entries. Engine logs are chronological
|
|
75
|
+
// and the failure being debugged is at the end; keeping the head returned
|
|
76
|
+
// startup noise and hid the current error.
|
|
75
77
|
let final = deduped;
|
|
76
78
|
if (deduped.length > maxEntries) {
|
|
77
|
-
final = deduped.slice(
|
|
79
|
+
final = deduped.slice(-maxEntries);
|
|
78
80
|
summary.truncated = deduped.length - maxEntries;
|
|
79
81
|
}
|
|
80
82
|
summary.totalOut = final.length;
|
|
@@ -2,27 +2,12 @@ import { appendFileSync, mkdirSync, readFileSync, statSync, writeFileSync } from
|
|
|
2
2
|
import { readFile } from "node:fs/promises";
|
|
3
3
|
import { join } from "node:path";
|
|
4
4
|
import { getSummerDir } from "./auth.js";
|
|
5
|
+
import { redactSensitive } from "./redact.js";
|
|
5
6
|
const MAX_LOG_BYTES = 512 * 1024;
|
|
6
7
|
const RETAIN_LOG_BYTES = 256 * 1024;
|
|
7
8
|
export function getMcpLogPath() {
|
|
8
9
|
return join(getSummerDir(), "mcp.log");
|
|
9
10
|
}
|
|
10
|
-
function redact(value) {
|
|
11
|
-
if (Array.isArray(value))
|
|
12
|
-
return value.map((item) => redact(item));
|
|
13
|
-
if (!value || typeof value !== "object")
|
|
14
|
-
return value;
|
|
15
|
-
const out = {};
|
|
16
|
-
for (const [key, nested] of Object.entries(value)) {
|
|
17
|
-
if (/token|secret|password|authorization|cookie|api[-_]?key/i.test(key)) {
|
|
18
|
-
out[key] = "[REDACTED]";
|
|
19
|
-
}
|
|
20
|
-
else {
|
|
21
|
-
out[key] = redact(nested);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
return out;
|
|
25
|
-
}
|
|
26
11
|
function rotateIfNeeded(path) {
|
|
27
12
|
try {
|
|
28
13
|
if (statSync(path).size < MAX_LOG_BYTES)
|
|
@@ -44,7 +29,7 @@ export function appendMcpLogEvent(event, details = {}) {
|
|
|
44
29
|
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
45
30
|
const path = getMcpLogPath();
|
|
46
31
|
rotateIfNeeded(path);
|
|
47
|
-
const safeDetails =
|
|
32
|
+
const safeDetails = redactSensitive(details, { strings: true });
|
|
48
33
|
const payload = {
|
|
49
34
|
ts: new Date().toISOString(),
|
|
50
35
|
event,
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Absolute path of the installed package root.
|
|
3
|
+
*
|
|
4
|
+
* Resolved from this module's own location so it is correct both from the
|
|
5
|
+
* compiled tree (`dist/core/package-root.js`) and from source under vitest
|
|
6
|
+
* (`src/core/package-root.ts`), and independent of `process.cwd()` — the CLI
|
|
7
|
+
* runs from arbitrary project directories and from a global npm install.
|
|
8
|
+
*/
|
|
9
|
+
export declare const PACKAGE_ROOT: string;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { dirname, join } from "node:path";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
/**
|
|
4
|
+
* Absolute path of the installed package root.
|
|
5
|
+
*
|
|
6
|
+
* Resolved from this module's own location so it is correct both from the
|
|
7
|
+
* compiled tree (`dist/core/package-root.js`) and from source under vitest
|
|
8
|
+
* (`src/core/package-root.ts`), and independent of `process.cwd()` — the CLI
|
|
9
|
+
* runs from arbitrary project directories and from a global npm install.
|
|
10
|
+
*/
|
|
11
|
+
export const PACKAGE_ROOT = join(dirname(fileURLToPath(import.meta.url)), "..", "..");
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One redaction implementation for every place local diagnostics leave the
|
|
3
|
+
* machine (the MCP lifecycle log, the debug report). Previously duplicated in
|
|
4
|
+
* mcp-log.ts and debug-report.ts, and neither touched free-text `error` /
|
|
5
|
+
* `message` strings that routinely embed a bearer token or an sc_ key.
|
|
6
|
+
*/
|
|
7
|
+
export interface RedactOptions {
|
|
8
|
+
/** Additional key names to blank out entirely (e.g. /hostname/i). */
|
|
9
|
+
extraKeys?: RegExp;
|
|
10
|
+
/** Also scrub credential-shaped substrings out of string VALUES. */
|
|
11
|
+
strings?: boolean;
|
|
12
|
+
}
|
|
13
|
+
/** Scrub credential-shaped substrings out of free text. */
|
|
14
|
+
export declare function redactText(text: string): string;
|
|
15
|
+
/** Deep-copy `value`, blanking any property whose KEY looks sensitive and,
|
|
16
|
+
* with `strings: true`, scrubbing credential-shaped substrings from values. */
|
|
17
|
+
export declare function redactSensitive(value: unknown, options?: RedactOptions): unknown;
|
|
18
|
+
/** Redact one JSONL log line: structured keys AND free-text values. Non-JSON
|
|
19
|
+
* lines are scrubbed as text. */
|
|
20
|
+
export declare function redactLogLine(line: string): string;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One redaction implementation for every place local diagnostics leave the
|
|
3
|
+
* machine (the MCP lifecycle log, the debug report). Previously duplicated in
|
|
4
|
+
* mcp-log.ts and debug-report.ts, and neither touched free-text `error` /
|
|
5
|
+
* `message` strings that routinely embed a bearer token or an sc_ key.
|
|
6
|
+
*/
|
|
7
|
+
const SENSITIVE_KEY = /token|secret|password|passwd|authorization|cookie|api[-_]?key/i;
|
|
8
|
+
const TEXT_PATTERNS = [
|
|
9
|
+
// "Authorization: Bearer eyJ..." / "Basic dXNlcjpwdw==" inside an error string.
|
|
10
|
+
[/\b(bearer|basic)\s+[A-Za-z0-9._~+/=-]{8,}/gi, "$1 [REDACTED]"],
|
|
11
|
+
// key=value / key: value / "key":"value" where the key is a secret name. The
|
|
12
|
+
// scheme word after "Authorization:" is left alone (its credential was
|
|
13
|
+
// already scrubbed above), so the output still says what kind of auth failed.
|
|
14
|
+
[
|
|
15
|
+
/\b(token|secret|password|passwd|authorization|cookie|api[-_]?key)(["']?\s*[:=]\s*["']?)(?!(?:bearer|basic)\b)([^"'\s,;&}]+)/gi,
|
|
16
|
+
"$1$2[REDACTED]",
|
|
17
|
+
],
|
|
18
|
+
// Known credential shapes: Summer creator tokens, sk- style API keys, JWTs.
|
|
19
|
+
[/\bsc_[A-Za-z0-9]{20,}\b/g, "[REDACTED]"],
|
|
20
|
+
[/\bsk-[A-Za-z0-9_-]{16,}/g, "[REDACTED]"],
|
|
21
|
+
[/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{5,}\.[A-Za-z0-9_-]{5,}/g, "[REDACTED]"],
|
|
22
|
+
];
|
|
23
|
+
/** Scrub credential-shaped substrings out of free text. */
|
|
24
|
+
export function redactText(text) {
|
|
25
|
+
let out = text;
|
|
26
|
+
for (const [pattern, replacement] of TEXT_PATTERNS) {
|
|
27
|
+
out = out.replace(pattern, replacement);
|
|
28
|
+
}
|
|
29
|
+
return out;
|
|
30
|
+
}
|
|
31
|
+
/** Deep-copy `value`, blanking any property whose KEY looks sensitive and,
|
|
32
|
+
* with `strings: true`, scrubbing credential-shaped substrings from values. */
|
|
33
|
+
export function redactSensitive(value, options = {}) {
|
|
34
|
+
if (Array.isArray(value))
|
|
35
|
+
return value.map((item) => redactSensitive(item, options));
|
|
36
|
+
if (typeof value === "string")
|
|
37
|
+
return options.strings ? redactText(value) : value;
|
|
38
|
+
if (!value || typeof value !== "object")
|
|
39
|
+
return value;
|
|
40
|
+
const out = {};
|
|
41
|
+
for (const [key, nested] of Object.entries(value)) {
|
|
42
|
+
if (SENSITIVE_KEY.test(key) || options.extraKeys?.test(key)) {
|
|
43
|
+
out[key] = "[REDACTED]";
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
out[key] = redactSensitive(nested, options);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return out;
|
|
50
|
+
}
|
|
51
|
+
/** Redact one JSONL log line: structured keys AND free-text values. Non-JSON
|
|
52
|
+
* lines are scrubbed as text. */
|
|
53
|
+
export function redactLogLine(line) {
|
|
54
|
+
try {
|
|
55
|
+
const parsed = JSON.parse(line);
|
|
56
|
+
if (parsed && typeof parsed === "object") {
|
|
57
|
+
return JSON.stringify(redactSensitive(parsed, { strings: true }));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// not JSON — fall through
|
|
62
|
+
}
|
|
63
|
+
return redactText(line);
|
|
64
|
+
}
|