summer-engine 2.8.1 → 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 +134 -41
- 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 +148 -23
- 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/{skills/multiplayer-and-networking → library/skills}/host-authoritative-state/SKILL.md +1 -1
- 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 +23 -23
- 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 +9 -1
- 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/{skills/multiplayer-and-networking → library/skills}/setup-multiplayer/SKILL.md +1 -1
- 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/{skills/ui-and-ux → library/skills}/ui-basics/SKILL.md +1 -1
- 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/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/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,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Frame-quality probe for engine screenshots (tool/screenshot).
|
|
3
|
+
*
|
|
4
|
+
* WHY THIS EXISTS. In the 2026-09-03 end-to-end run (docs/design/archive/E2E-2026-09-03.md,
|
|
5
|
+
* F-01) `summer_screenshot target:"viewport"` returned an entirely black
|
|
6
|
+
* 1072x1280 JPEG (src/core/capabilities/__fixtures__/frames/01-mcp-viewport-black.jpg)
|
|
7
|
+
* with a caption
|
|
8
|
+
* telling the agent to describe what it saw. It was the first viewport capture
|
|
9
|
+
* after scene mutations had flipped the editor from the 3D to the 2D tab; the
|
|
10
|
+
* same call 67 s later returned real content. Engine side, the ViewportSnapshot
|
|
11
|
+
* op (summerengine modules/1summer_engine/editor/ops/debug_ops.cpp) reads the
|
|
12
|
+
* editor SubViewport's texture with get_texture()->get_image() AS-IS — no forced
|
|
13
|
+
* RenderingServer draw and no blank-frame retry, both of which ScenePreview has
|
|
14
|
+
* (preview_ops.cpp "render-readiness hardening") because a not-yet-drawn
|
|
15
|
+
* texture reads back black. That is consistent with a 2D subviewport that had
|
|
16
|
+
* not been redrawn since the tab switch, but it has NOT been proven by
|
|
17
|
+
* instrumenting the engine, so this module detects the SYMPTOM (a flat frame)
|
|
18
|
+
* instead of asserting a cause.
|
|
19
|
+
*
|
|
20
|
+
* WHAT IT DOES. The engine encodes every snapshot as a baseline JPEG
|
|
21
|
+
* (Image::save_jpg_to_buffer -> libjpeg-turbo, quality 0.8, 4:2:0). A full
|
|
22
|
+
* decoder dependency is not acceptable for one heuristic, and nothing in
|
|
23
|
+
* node_modules decodes JPEG transitively. But baseline JPEG makes the question
|
|
24
|
+
* "is this frame flat?" cheap to answer exactly: each 8x8 block's DC coefficient
|
|
25
|
+
* IS its mean value (F(0,0) = 8 * mean of the level-shifted block). So this
|
|
26
|
+
* module Huffman-decodes the scan — the only way to find block boundaries — and
|
|
27
|
+
* keeps just the DC coefficient of every block, skipping the AC terms. No IDCT,
|
|
28
|
+
* no upsampling, no colour conversion. A frame whose blocks all share one DC per
|
|
29
|
+
* component is uniform by construction, not by threshold. A few hundred
|
|
30
|
+
* thousand Huffman symbols is a handful of milliseconds.
|
|
31
|
+
*
|
|
32
|
+
* Progressive/lossless/12-bit JPEGs (which the engine never writes) and
|
|
33
|
+
* anything that fails to parse come back `analyzable: false` — never a throw,
|
|
34
|
+
* and never a verdict.
|
|
35
|
+
*/
|
|
36
|
+
export interface FrameQuality {
|
|
37
|
+
/** False when the bytes are not a baseline JPEG this probe can walk. */
|
|
38
|
+
analyzable: boolean;
|
|
39
|
+
/** Why the frame could not be analysed (only when !analyzable). */
|
|
40
|
+
reason?: string;
|
|
41
|
+
width?: number;
|
|
42
|
+
height?: number;
|
|
43
|
+
/** Number of luma (first component) blocks decoded. */
|
|
44
|
+
lumaBlocks?: number;
|
|
45
|
+
/** Mean luminance of the frame, 0..255 (from block means). */
|
|
46
|
+
meanLuma?: number;
|
|
47
|
+
/** max - min of the luma block means, 0..255. 0 = every block identical. */
|
|
48
|
+
lumaSpread?: number;
|
|
49
|
+
/** Largest max - min over the chroma components' block means (0 for greyscale). */
|
|
50
|
+
chromaSpread?: number;
|
|
51
|
+
/** Every block of every component carries the same DC coefficient. Exact. */
|
|
52
|
+
uniform: boolean;
|
|
53
|
+
/** uniform, or all spreads within FLAT_SPREAD_MAX — a frame with no visible
|
|
54
|
+
* content: not-yet-drawn viewport texture, a solid fill, a black boot frame. */
|
|
55
|
+
flat: boolean;
|
|
56
|
+
/** Coarse tone of a flat frame, for the caption. */
|
|
57
|
+
tone?: "black" | "white" | "grey" | "color";
|
|
58
|
+
}
|
|
59
|
+
/** Block-mean spread (in 8-bit luma/chroma units) at or below which a frame is
|
|
60
|
+
* treated as content-free. One quantisation step at the engine's quality is
|
|
61
|
+
* well under 1 unit; real editor/game frames measured in the e2e set spread
|
|
62
|
+
* 100+ units. */
|
|
63
|
+
export declare const FLAT_SPREAD_MAX = 4;
|
|
64
|
+
/**
|
|
65
|
+
* Analyse a JPEG frame without decoding pixels. Never throws.
|
|
66
|
+
*/
|
|
67
|
+
export declare function analyzeJpegFrame(bytes: Uint8Array): FrameQuality;
|
|
68
|
+
/** Analyse a base64-encoded frame; non-JPEG mime types are not analysable. */
|
|
69
|
+
export declare function analyzeFrameBase64(base64: string, mime?: string): FrameQuality;
|
|
70
|
+
/** One clause for a caption, e.g. "uniformly black (mean luma 0/255)". */
|
|
71
|
+
export declare function describeFlatFrame(q: FrameQuality): string;
|
|
@@ -0,0 +1,449 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Frame-quality probe for engine screenshots (tool/screenshot).
|
|
3
|
+
*
|
|
4
|
+
* WHY THIS EXISTS. In the 2026-09-03 end-to-end run (docs/design/archive/E2E-2026-09-03.md,
|
|
5
|
+
* F-01) `summer_screenshot target:"viewport"` returned an entirely black
|
|
6
|
+
* 1072x1280 JPEG (src/core/capabilities/__fixtures__/frames/01-mcp-viewport-black.jpg)
|
|
7
|
+
* with a caption
|
|
8
|
+
* telling the agent to describe what it saw. It was the first viewport capture
|
|
9
|
+
* after scene mutations had flipped the editor from the 3D to the 2D tab; the
|
|
10
|
+
* same call 67 s later returned real content. Engine side, the ViewportSnapshot
|
|
11
|
+
* op (summerengine modules/1summer_engine/editor/ops/debug_ops.cpp) reads the
|
|
12
|
+
* editor SubViewport's texture with get_texture()->get_image() AS-IS — no forced
|
|
13
|
+
* RenderingServer draw and no blank-frame retry, both of which ScenePreview has
|
|
14
|
+
* (preview_ops.cpp "render-readiness hardening") because a not-yet-drawn
|
|
15
|
+
* texture reads back black. That is consistent with a 2D subviewport that had
|
|
16
|
+
* not been redrawn since the tab switch, but it has NOT been proven by
|
|
17
|
+
* instrumenting the engine, so this module detects the SYMPTOM (a flat frame)
|
|
18
|
+
* instead of asserting a cause.
|
|
19
|
+
*
|
|
20
|
+
* WHAT IT DOES. The engine encodes every snapshot as a baseline JPEG
|
|
21
|
+
* (Image::save_jpg_to_buffer -> libjpeg-turbo, quality 0.8, 4:2:0). A full
|
|
22
|
+
* decoder dependency is not acceptable for one heuristic, and nothing in
|
|
23
|
+
* node_modules decodes JPEG transitively. But baseline JPEG makes the question
|
|
24
|
+
* "is this frame flat?" cheap to answer exactly: each 8x8 block's DC coefficient
|
|
25
|
+
* IS its mean value (F(0,0) = 8 * mean of the level-shifted block). So this
|
|
26
|
+
* module Huffman-decodes the scan — the only way to find block boundaries — and
|
|
27
|
+
* keeps just the DC coefficient of every block, skipping the AC terms. No IDCT,
|
|
28
|
+
* no upsampling, no colour conversion. A frame whose blocks all share one DC per
|
|
29
|
+
* component is uniform by construction, not by threshold. A few hundred
|
|
30
|
+
* thousand Huffman symbols is a handful of milliseconds.
|
|
31
|
+
*
|
|
32
|
+
* Progressive/lossless/12-bit JPEGs (which the engine never writes) and
|
|
33
|
+
* anything that fails to parse come back `analyzable: false` — never a throw,
|
|
34
|
+
* and never a verdict.
|
|
35
|
+
*/
|
|
36
|
+
/** Block-mean spread (in 8-bit luma/chroma units) at or below which a frame is
|
|
37
|
+
* treated as content-free. One quantisation step at the engine's quality is
|
|
38
|
+
* well under 1 unit; real editor/game frames measured in the e2e set spread
|
|
39
|
+
* 100+ units. */
|
|
40
|
+
export const FLAT_SPREAD_MAX = 4;
|
|
41
|
+
const BLACK_LUMA_MAX = 24;
|
|
42
|
+
const WHITE_LUMA_MIN = 232;
|
|
43
|
+
/** Chroma this close to the 128 neutral point reads as achromatic. */
|
|
44
|
+
const NEUTRAL_CHROMA_TOLERANCE = 12;
|
|
45
|
+
const NOT_ANALYZABLE = (reason) => ({
|
|
46
|
+
analyzable: false,
|
|
47
|
+
reason,
|
|
48
|
+
uniform: false,
|
|
49
|
+
flat: false,
|
|
50
|
+
});
|
|
51
|
+
function buildHuffmanTable(bits, huffval) {
|
|
52
|
+
// C.2: HUFFSIZE / HUFFCODE generation, folded into the F.2.2.3 tables.
|
|
53
|
+
const maxcode = new Int32Array(18).fill(-1);
|
|
54
|
+
const mincode = new Int32Array(18);
|
|
55
|
+
const valptr = new Int32Array(18);
|
|
56
|
+
let code = 0;
|
|
57
|
+
let k = 0;
|
|
58
|
+
for (let len = 1; len <= 16; len++) {
|
|
59
|
+
const count = bits[len - 1];
|
|
60
|
+
if (count === 0) {
|
|
61
|
+
maxcode[len] = -1;
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
valptr[len] = k;
|
|
65
|
+
mincode[len] = code;
|
|
66
|
+
code += count;
|
|
67
|
+
k += count;
|
|
68
|
+
maxcode[len] = code - 1;
|
|
69
|
+
}
|
|
70
|
+
code <<= 1;
|
|
71
|
+
}
|
|
72
|
+
return { maxcode, mincode, valptr, huffval };
|
|
73
|
+
}
|
|
74
|
+
class ScanReader {
|
|
75
|
+
data;
|
|
76
|
+
pos;
|
|
77
|
+
bitBuf = 0;
|
|
78
|
+
bitCount = 0;
|
|
79
|
+
/** Set when the reader ran into a marker inside the entropy-coded data. */
|
|
80
|
+
markerHit = null;
|
|
81
|
+
constructor(data, start) {
|
|
82
|
+
this.data = data;
|
|
83
|
+
this.pos = start;
|
|
84
|
+
}
|
|
85
|
+
fill() {
|
|
86
|
+
while (this.bitCount <= 24) {
|
|
87
|
+
let byte = 0;
|
|
88
|
+
if (this.markerHit === null && this.pos < this.data.length) {
|
|
89
|
+
byte = this.data[this.pos];
|
|
90
|
+
if (byte === 0xff) {
|
|
91
|
+
const next = this.data[this.pos + 1];
|
|
92
|
+
if (next === 0x00) {
|
|
93
|
+
this.pos += 2; // stuffed 0xFF data byte
|
|
94
|
+
}
|
|
95
|
+
else if (next === 0xff) {
|
|
96
|
+
this.pos += 1; // fill byte, re-examine
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
this.markerHit = next; // RSTn / EOI / anything else: stop here
|
|
101
|
+
byte = 0;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
this.pos += 1;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Past a marker or the end: feed zeros. A well-formed scan never reads
|
|
109
|
+
// them; a corrupt one terminates through the k>63 / bad-code guards.
|
|
110
|
+
this.bitBuf = (this.bitBuf << 8) | byte;
|
|
111
|
+
this.bitCount += 8;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
readBit() {
|
|
115
|
+
if (this.bitCount === 0)
|
|
116
|
+
this.fill();
|
|
117
|
+
this.bitCount -= 1;
|
|
118
|
+
return (this.bitBuf >>> this.bitCount) & 1;
|
|
119
|
+
}
|
|
120
|
+
receive(n) {
|
|
121
|
+
if (n === 0)
|
|
122
|
+
return 0;
|
|
123
|
+
if (this.bitCount < n)
|
|
124
|
+
this.fill();
|
|
125
|
+
this.bitCount -= n;
|
|
126
|
+
return (this.bitBuf >>> this.bitCount) & ((1 << n) - 1);
|
|
127
|
+
}
|
|
128
|
+
decode(table) {
|
|
129
|
+
let code = this.readBit();
|
|
130
|
+
let len = 1;
|
|
131
|
+
while (len <= 16 && code > table.maxcode[len]) {
|
|
132
|
+
code = (code << 1) | this.readBit();
|
|
133
|
+
len += 1;
|
|
134
|
+
}
|
|
135
|
+
if (len > 16)
|
|
136
|
+
throw new Error("bad huffman code");
|
|
137
|
+
return table.huffval[table.valptr[len] + code - table.mincode[len]];
|
|
138
|
+
}
|
|
139
|
+
/** Byte-align and consume the RSTn marker expected at a restart boundary. */
|
|
140
|
+
restart() {
|
|
141
|
+
this.bitBuf = 0;
|
|
142
|
+
this.bitCount = 0;
|
|
143
|
+
if (this.markerHit !== null) {
|
|
144
|
+
if (this.markerHit < 0xd0 || this.markerHit > 0xd7) {
|
|
145
|
+
throw new Error(`expected RSTn at restart boundary, saw 0xFF${this.markerHit.toString(16)}`);
|
|
146
|
+
}
|
|
147
|
+
this.pos += 2;
|
|
148
|
+
this.markerHit = null;
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
// Marker not yet reached by the bit reader: it must be the next bytes.
|
|
152
|
+
if (this.data[this.pos] === 0xff && this.data[this.pos + 1] >= 0xd0 && this.data[this.pos + 1] <= 0xd7) {
|
|
153
|
+
this.pos += 2;
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
throw new Error("restart interval ended without an RSTn marker");
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
function extend(value, bits) {
|
|
160
|
+
return value < 1 << (bits - 1) ? value - (1 << bits) + 1 : value;
|
|
161
|
+
}
|
|
162
|
+
/** Decode one block: record its DC, skip its AC coefficients. */
|
|
163
|
+
function decodeBlock(reader, comp) {
|
|
164
|
+
const t = reader.decode(comp.dcTable);
|
|
165
|
+
const diff = t === 0 ? 0 : extend(reader.receive(t), t);
|
|
166
|
+
comp.pred += diff;
|
|
167
|
+
const dc = comp.pred;
|
|
168
|
+
if (comp.blocks === 0) {
|
|
169
|
+
comp.first = dc;
|
|
170
|
+
comp.min = dc;
|
|
171
|
+
comp.max = dc;
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
if (dc !== comp.first)
|
|
175
|
+
comp.allSame = false;
|
|
176
|
+
if (dc < comp.min)
|
|
177
|
+
comp.min = dc;
|
|
178
|
+
if (dc > comp.max)
|
|
179
|
+
comp.max = dc;
|
|
180
|
+
}
|
|
181
|
+
comp.blocks += 1;
|
|
182
|
+
comp.sum += dc;
|
|
183
|
+
let k = 1;
|
|
184
|
+
while (k < 64) {
|
|
185
|
+
const rs = reader.decode(comp.acTable);
|
|
186
|
+
const s = rs & 15;
|
|
187
|
+
const r = rs >> 4;
|
|
188
|
+
if (s === 0) {
|
|
189
|
+
if (r === 15) {
|
|
190
|
+
k += 16;
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
break; // EOB
|
|
194
|
+
}
|
|
195
|
+
k += r;
|
|
196
|
+
if (k > 63)
|
|
197
|
+
throw new Error("AC run past block end");
|
|
198
|
+
reader.receive(s);
|
|
199
|
+
k += 1;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Analyse a JPEG frame without decoding pixels. Never throws.
|
|
204
|
+
*/
|
|
205
|
+
export function analyzeJpegFrame(bytes) {
|
|
206
|
+
try {
|
|
207
|
+
return analyze(bytes);
|
|
208
|
+
}
|
|
209
|
+
catch (err) {
|
|
210
|
+
return NOT_ANALYZABLE(err instanceof Error ? err.message : String(err));
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
function analyze(data) {
|
|
214
|
+
if (data.length < 4 || data[0] !== 0xff || data[1] !== 0xd8) {
|
|
215
|
+
return NOT_ANALYZABLE("not a JPEG (missing SOI marker)");
|
|
216
|
+
}
|
|
217
|
+
const quant = [];
|
|
218
|
+
const dcTables = [];
|
|
219
|
+
const acTables = [];
|
|
220
|
+
let components = [];
|
|
221
|
+
let width = 0;
|
|
222
|
+
let height = 0;
|
|
223
|
+
let restartInterval = 0;
|
|
224
|
+
let pos = 2;
|
|
225
|
+
const u16 = (at) => (data[at] << 8) | data[at + 1];
|
|
226
|
+
while (pos < data.length) {
|
|
227
|
+
if (data[pos] !== 0xff)
|
|
228
|
+
return NOT_ANALYZABLE(`marker desync at byte ${pos}`);
|
|
229
|
+
let marker = data[pos + 1];
|
|
230
|
+
while (marker === 0xff) {
|
|
231
|
+
pos += 1;
|
|
232
|
+
marker = data[pos + 1];
|
|
233
|
+
}
|
|
234
|
+
pos += 2;
|
|
235
|
+
if (marker === 0xd8 || (marker >= 0xd0 && marker <= 0xd7) || marker === 0x01)
|
|
236
|
+
continue;
|
|
237
|
+
if (marker === 0xd9)
|
|
238
|
+
return NOT_ANALYZABLE("reached EOI before a scan");
|
|
239
|
+
if (pos + 2 > data.length)
|
|
240
|
+
return NOT_ANALYZABLE("truncated segment header");
|
|
241
|
+
const len = u16(pos);
|
|
242
|
+
const segEnd = pos + len;
|
|
243
|
+
if (len < 2 || segEnd > data.length)
|
|
244
|
+
return NOT_ANALYZABLE("truncated segment");
|
|
245
|
+
const body = pos + 2;
|
|
246
|
+
if (marker === 0xdb) {
|
|
247
|
+
// DQT
|
|
248
|
+
let p = body;
|
|
249
|
+
while (p < segEnd) {
|
|
250
|
+
const pq = data[p] >> 4;
|
|
251
|
+
const tq = data[p] & 15;
|
|
252
|
+
p += 1;
|
|
253
|
+
const table = new Uint16Array(64);
|
|
254
|
+
for (let i = 0; i < 64; i++) {
|
|
255
|
+
if (pq === 0) {
|
|
256
|
+
table[i] = data[p];
|
|
257
|
+
p += 1;
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
table[i] = u16(p);
|
|
261
|
+
p += 2;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
quant[tq] = table;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
else if (marker === 0xc0 || marker === 0xc1) {
|
|
268
|
+
// SOF0 baseline / SOF1 extended sequential (Huffman)
|
|
269
|
+
const precision = data[body];
|
|
270
|
+
if (precision !== 8)
|
|
271
|
+
return NOT_ANALYZABLE(`${precision}-bit JPEG not supported`);
|
|
272
|
+
height = u16(body + 1);
|
|
273
|
+
width = u16(body + 3);
|
|
274
|
+
const nf = data[body + 5];
|
|
275
|
+
if (nf < 1 || nf > 4)
|
|
276
|
+
return NOT_ANALYZABLE(`unsupported component count ${nf}`);
|
|
277
|
+
components = [];
|
|
278
|
+
for (let i = 0; i < nf; i++) {
|
|
279
|
+
const at = body + 6 + i * 3;
|
|
280
|
+
components.push({
|
|
281
|
+
id: data[at],
|
|
282
|
+
h: data[at + 1] >> 4,
|
|
283
|
+
v: data[at + 1] & 15,
|
|
284
|
+
tq: data[at + 2],
|
|
285
|
+
pred: 0,
|
|
286
|
+
blocks: 0,
|
|
287
|
+
first: 0,
|
|
288
|
+
allSame: true,
|
|
289
|
+
min: 0,
|
|
290
|
+
max: 0,
|
|
291
|
+
sum: 0,
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
else if (marker === 0xc2) {
|
|
296
|
+
return NOT_ANALYZABLE("progressive JPEG not supported");
|
|
297
|
+
}
|
|
298
|
+
else if ((marker >= 0xc3 && marker <= 0xcf && marker !== 0xc4 && marker !== 0xc8 && marker !== 0xcc)) {
|
|
299
|
+
return NOT_ANALYZABLE(`unsupported JPEG process (SOF${(marker - 0xc0).toString(16)})`);
|
|
300
|
+
}
|
|
301
|
+
else if (marker === 0xc4) {
|
|
302
|
+
// DHT
|
|
303
|
+
let p = body;
|
|
304
|
+
while (p < segEnd) {
|
|
305
|
+
const tc = data[p] >> 4;
|
|
306
|
+
const th = data[p] & 15;
|
|
307
|
+
p += 1;
|
|
308
|
+
const bits = data.subarray(p, p + 16);
|
|
309
|
+
p += 16;
|
|
310
|
+
let total = 0;
|
|
311
|
+
for (let i = 0; i < 16; i++)
|
|
312
|
+
total += bits[i];
|
|
313
|
+
const huffval = data.subarray(p, p + total);
|
|
314
|
+
p += total;
|
|
315
|
+
const table = buildHuffmanTable(bits, huffval);
|
|
316
|
+
if (tc === 0)
|
|
317
|
+
dcTables[th] = table;
|
|
318
|
+
else
|
|
319
|
+
acTables[th] = table;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
else if (marker === 0xdd) {
|
|
323
|
+
restartInterval = u16(body);
|
|
324
|
+
}
|
|
325
|
+
else if (marker === 0xda) {
|
|
326
|
+
// SOS — the scan follows the header.
|
|
327
|
+
if (components.length === 0)
|
|
328
|
+
return NOT_ANALYZABLE("SOS before SOF");
|
|
329
|
+
const ns = data[body];
|
|
330
|
+
if (ns !== components.length) {
|
|
331
|
+
return NOT_ANALYZABLE("non-interleaved scan not supported");
|
|
332
|
+
}
|
|
333
|
+
const scanComps = [];
|
|
334
|
+
for (let i = 0; i < ns; i++) {
|
|
335
|
+
const cs = data[body + 1 + i * 2];
|
|
336
|
+
const tables = data[body + 2 + i * 2];
|
|
337
|
+
const comp = components.find((c) => c.id === cs);
|
|
338
|
+
if (!comp)
|
|
339
|
+
return NOT_ANALYZABLE(`scan references unknown component ${cs}`);
|
|
340
|
+
comp.dcTable = dcTables[tables >> 4];
|
|
341
|
+
comp.acTable = acTables[tables & 15];
|
|
342
|
+
if (!comp.dcTable || !comp.acTable)
|
|
343
|
+
return NOT_ANALYZABLE("scan references a missing Huffman table");
|
|
344
|
+
if (!quant[comp.tq])
|
|
345
|
+
return NOT_ANALYZABLE("component references a missing quantisation table");
|
|
346
|
+
scanComps.push(comp);
|
|
347
|
+
}
|
|
348
|
+
return decodeScan(data, segEnd, scanComps, width, height, restartInterval, quant);
|
|
349
|
+
}
|
|
350
|
+
// APPn, COM, DNL, anything else: skipped.
|
|
351
|
+
pos = segEnd;
|
|
352
|
+
}
|
|
353
|
+
return NOT_ANALYZABLE("no scan found");
|
|
354
|
+
}
|
|
355
|
+
function decodeScan(data, scanStart, comps, width, height, restartInterval, quant) {
|
|
356
|
+
if (width === 0 || height === 0)
|
|
357
|
+
return NOT_ANALYZABLE("zero-sized frame");
|
|
358
|
+
const reader = new ScanReader(data, scanStart);
|
|
359
|
+
let mcusX;
|
|
360
|
+
let mcusY;
|
|
361
|
+
let blocksPerMcu;
|
|
362
|
+
if (comps.length === 1) {
|
|
363
|
+
// Non-interleaved single component: one block per MCU, sampling ignored.
|
|
364
|
+
mcusX = Math.ceil(width / 8);
|
|
365
|
+
mcusY = Math.ceil(height / 8);
|
|
366
|
+
blocksPerMcu = () => 1;
|
|
367
|
+
}
|
|
368
|
+
else {
|
|
369
|
+
let hmax = 1;
|
|
370
|
+
let vmax = 1;
|
|
371
|
+
for (const c of comps) {
|
|
372
|
+
if (c.h < 1 || c.h > 4 || c.v < 1 || c.v > 4)
|
|
373
|
+
return NOT_ANALYZABLE("bad sampling factors");
|
|
374
|
+
hmax = Math.max(hmax, c.h);
|
|
375
|
+
vmax = Math.max(vmax, c.v);
|
|
376
|
+
}
|
|
377
|
+
mcusX = Math.ceil(width / (8 * hmax));
|
|
378
|
+
mcusY = Math.ceil(height / (8 * vmax));
|
|
379
|
+
blocksPerMcu = (c) => c.h * c.v;
|
|
380
|
+
}
|
|
381
|
+
const totalMcus = mcusX * mcusY;
|
|
382
|
+
for (let m = 0; m < totalMcus; m++) {
|
|
383
|
+
if (restartInterval > 0 && m > 0 && m % restartInterval === 0) {
|
|
384
|
+
reader.restart();
|
|
385
|
+
for (const c of comps)
|
|
386
|
+
c.pred = 0;
|
|
387
|
+
}
|
|
388
|
+
for (const c of comps) {
|
|
389
|
+
const n = blocksPerMcu(c);
|
|
390
|
+
for (let b = 0; b < n; b++)
|
|
391
|
+
decodeBlock(reader, c);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
// DC -> block mean for 8-bit samples: mean = dc * Q[0] / 8 + 128.
|
|
395
|
+
const toMean = (c, dc) => {
|
|
396
|
+
const q0 = quant[c.tq][0];
|
|
397
|
+
return Math.min(255, Math.max(0, (dc * q0) / 8 + 128));
|
|
398
|
+
};
|
|
399
|
+
const luma = comps[0];
|
|
400
|
+
const lumaMean = toMean(luma, luma.sum / luma.blocks);
|
|
401
|
+
const lumaSpread = toMean(luma, luma.max) - toMean(luma, luma.min);
|
|
402
|
+
let chromaSpread = 0;
|
|
403
|
+
let chromaOffset = 0;
|
|
404
|
+
for (const c of comps.slice(1)) {
|
|
405
|
+
chromaSpread = Math.max(chromaSpread, toMean(c, c.max) - toMean(c, c.min));
|
|
406
|
+
chromaOffset = Math.max(chromaOffset, Math.abs(toMean(c, c.sum / c.blocks) - 128));
|
|
407
|
+
}
|
|
408
|
+
const uniform = comps.every((c) => c.allSame);
|
|
409
|
+
const flat = uniform || (lumaSpread <= FLAT_SPREAD_MAX && chromaSpread <= FLAT_SPREAD_MAX);
|
|
410
|
+
let tone;
|
|
411
|
+
if (flat) {
|
|
412
|
+
if (chromaOffset > NEUTRAL_CHROMA_TOLERANCE)
|
|
413
|
+
tone = "color";
|
|
414
|
+
else if (lumaMean <= BLACK_LUMA_MAX)
|
|
415
|
+
tone = "black";
|
|
416
|
+
else if (lumaMean >= WHITE_LUMA_MIN)
|
|
417
|
+
tone = "white";
|
|
418
|
+
else
|
|
419
|
+
tone = "grey";
|
|
420
|
+
}
|
|
421
|
+
return {
|
|
422
|
+
analyzable: true,
|
|
423
|
+
width,
|
|
424
|
+
height,
|
|
425
|
+
lumaBlocks: luma.blocks,
|
|
426
|
+
meanLuma: round1(lumaMean),
|
|
427
|
+
lumaSpread: round1(lumaSpread),
|
|
428
|
+
chromaSpread: round1(chromaSpread),
|
|
429
|
+
uniform,
|
|
430
|
+
flat,
|
|
431
|
+
tone,
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
function round1(value) {
|
|
435
|
+
return Math.round(value * 10) / 10;
|
|
436
|
+
}
|
|
437
|
+
/** Analyse a base64-encoded frame; non-JPEG mime types are not analysable. */
|
|
438
|
+
export function analyzeFrameBase64(base64, mime) {
|
|
439
|
+
if (mime && !/jpe?g/i.test(mime)) {
|
|
440
|
+
return NOT_ANALYZABLE(`content check only supports JPEG frames (got ${mime})`);
|
|
441
|
+
}
|
|
442
|
+
return analyzeJpegFrame(Buffer.from(base64, "base64"));
|
|
443
|
+
}
|
|
444
|
+
/** One clause for a caption, e.g. "uniformly black (mean luma 0/255)". */
|
|
445
|
+
export function describeFlatFrame(q) {
|
|
446
|
+
const tone = q.tone === "color" ? "a single flat colour" : `${q.tone ?? "flat"}`;
|
|
447
|
+
const how = q.uniform ? "uniformly" : "almost uniformly";
|
|
448
|
+
return `${how} ${tone} (mean luma ${Math.round(q.meanLuma ?? 0)}/255, spread ${q.lumaSpread ?? 0})`;
|
|
449
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const GAME_TASK_MODES: readonly ["auto", "new-game", "feature", "asset", "debug", "playtest", "polish", "ship"];
|
|
3
|
+
export declare const GAME_TASK_TARGETS: readonly ["auto", "2d", "3d", "ui", "audio", "animation", "level", "npc", "multiplayer"];
|
|
4
|
+
export declare const ASSET_POLICIES: readonly ["reuse-first", "ask-before-paid-generation", "no-paid-generation", "generate-when-clearly-needed"];
|
|
5
|
+
export declare const VERIFICATION_LEVELS: readonly ["none", "fast", "full"];
|
|
6
|
+
/**
|
|
7
|
+
* The one input contract for summer_start_game_task, shared by the MCP tool
|
|
8
|
+
* (pass `.shape` to server.tool) and the CLI dispatcher (`summer tool
|
|
9
|
+
* start-game-task`) so a typo like mode:"shipp" is rejected on both faces.
|
|
10
|
+
*/
|
|
11
|
+
export declare const gameTaskPlanInputSchema: z.ZodObject<{
|
|
12
|
+
goal: z.ZodString;
|
|
13
|
+
mode: z.ZodDefault<z.ZodEnum<["auto", "new-game", "feature", "asset", "debug", "playtest", "polish", "ship"]>>;
|
|
14
|
+
target: z.ZodDefault<z.ZodEnum<["auto", "2d", "3d", "ui", "audio", "animation", "level", "npc", "multiplayer"]>>;
|
|
15
|
+
assetPolicy: z.ZodDefault<z.ZodEnum<["reuse-first", "ask-before-paid-generation", "no-paid-generation", "generate-when-clearly-needed"]>>;
|
|
16
|
+
verification: z.ZodDefault<z.ZodEnum<["none", "fast", "full"]>>;
|
|
17
|
+
}, "strip", z.ZodTypeAny, {
|
|
18
|
+
mode: "auto" | "debug" | "new-game" | "feature" | "asset" | "playtest" | "polish" | "ship";
|
|
19
|
+
target: "auto" | "audio" | "level" | "npc" | "2d" | "3d" | "ui" | "animation" | "multiplayer";
|
|
20
|
+
goal: string;
|
|
21
|
+
assetPolicy: "reuse-first" | "ask-before-paid-generation" | "no-paid-generation" | "generate-when-clearly-needed";
|
|
22
|
+
verification: "none" | "fast" | "full";
|
|
23
|
+
}, {
|
|
24
|
+
goal: string;
|
|
25
|
+
mode?: "auto" | "debug" | "new-game" | "feature" | "asset" | "playtest" | "polish" | "ship" | undefined;
|
|
26
|
+
target?: "auto" | "audio" | "level" | "npc" | "2d" | "3d" | "ui" | "animation" | "multiplayer" | undefined;
|
|
27
|
+
assetPolicy?: "reuse-first" | "ask-before-paid-generation" | "no-paid-generation" | "generate-when-clearly-needed" | undefined;
|
|
28
|
+
verification?: "none" | "fast" | "full" | undefined;
|
|
29
|
+
}>;
|
|
30
|
+
export type GameTaskMode = (typeof GAME_TASK_MODES)[number];
|
|
31
|
+
export type GameTaskTarget = (typeof GAME_TASK_TARGETS)[number];
|
|
32
|
+
export type AssetPolicy = (typeof ASSET_POLICIES)[number];
|
|
33
|
+
export type VerificationLevel = (typeof VERIFICATION_LEVELS)[number];
|
|
34
|
+
export interface GameTaskPlanOptions {
|
|
35
|
+
goal: string;
|
|
36
|
+
mode?: GameTaskMode;
|
|
37
|
+
target?: GameTaskTarget;
|
|
38
|
+
assetPolicy?: AssetPolicy;
|
|
39
|
+
verification?: VerificationLevel;
|
|
40
|
+
}
|
|
41
|
+
export interface SkillRoute {
|
|
42
|
+
/** Library resource id, e.g. "skill/make-game". */
|
|
43
|
+
id: string;
|
|
44
|
+
name: string;
|
|
45
|
+
why: string;
|
|
46
|
+
}
|
|
47
|
+
export interface GameTaskPlan {
|
|
48
|
+
goal: string;
|
|
49
|
+
mode: Exclude<GameTaskMode, "auto">;
|
|
50
|
+
target: Exclude<GameTaskTarget, "auto"> | "general";
|
|
51
|
+
assetPolicy: AssetPolicy;
|
|
52
|
+
verification: VerificationLevel;
|
|
53
|
+
principles: string[];
|
|
54
|
+
recommendedSkills: SkillRoute[];
|
|
55
|
+
mcpToolPlan: {
|
|
56
|
+
start: string[];
|
|
57
|
+
mutate: string[];
|
|
58
|
+
assets: string[];
|
|
59
|
+
verify: string[];
|
|
60
|
+
};
|
|
61
|
+
hostFileWork: string[];
|
|
62
|
+
userGates: string[];
|
|
63
|
+
nextAgentSteps: string[];
|
|
64
|
+
antiPatterns: string[];
|
|
65
|
+
}
|
|
66
|
+
export declare function buildGameTaskPlan(options: GameTaskPlanOptions): GameTaskPlan;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { getSkillRegistry } from "../skills-registry.js";
|
|
2
3
|
export const GAME_TASK_MODES = [
|
|
3
4
|
"auto",
|
|
4
5
|
"new-game",
|
|
@@ -27,9 +28,61 @@ export const ASSET_POLICIES = [
|
|
|
27
28
|
"generate-when-clearly-needed",
|
|
28
29
|
];
|
|
29
30
|
export const VERIFICATION_LEVELS = ["none", "fast", "full"];
|
|
30
|
-
|
|
31
|
+
/**
|
|
32
|
+
* The one input contract for summer_start_game_task, shared by the MCP tool
|
|
33
|
+
* (pass `.shape` to server.tool) and the CLI dispatcher (`summer tool
|
|
34
|
+
* start-game-task`) so a typo like mode:"shipp" is rejected on both faces.
|
|
35
|
+
*/
|
|
36
|
+
export const gameTaskPlanInputSchema = z.object({
|
|
37
|
+
goal: z.string().trim().min(1, "goal is required"),
|
|
38
|
+
mode: z.enum(GAME_TASK_MODES).default("auto"),
|
|
39
|
+
target: z.enum(GAME_TASK_TARGETS).default("auto"),
|
|
40
|
+
assetPolicy: z.enum(ASSET_POLICIES).default("ask-before-paid-generation"),
|
|
41
|
+
verification: z.enum(VERIFICATION_LEVELS).default("full"),
|
|
42
|
+
});
|
|
43
|
+
let skillIndex = null;
|
|
44
|
+
/**
|
|
45
|
+
* Lazily load the generated skill registry on first use. Loading at module
|
|
46
|
+
* import made a missing or corrupt registry/generated/skills-registry.json
|
|
47
|
+
* crash the whole MCP server / CLI at import time; now only this tool fails,
|
|
48
|
+
* with an actionable message.
|
|
49
|
+
*/
|
|
50
|
+
function skillByName() {
|
|
51
|
+
if (skillIndex)
|
|
52
|
+
return skillIndex;
|
|
53
|
+
let skills;
|
|
54
|
+
try {
|
|
55
|
+
skills = getSkillRegistry();
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
59
|
+
throw new Error("The Summer skill registry could not be loaded (registry/generated/skills-registry.json): " +
|
|
60
|
+
`${reason}. Reinstall summer-engine, or in a source checkout run 'npm run generate:registry'.`);
|
|
61
|
+
}
|
|
62
|
+
skillIndex = new Map(skills.map((skill) => [skill.name, skill]));
|
|
63
|
+
return skillIndex;
|
|
64
|
+
}
|
|
65
|
+
const PATTERN_CACHE = new Map();
|
|
66
|
+
/**
|
|
67
|
+
* Whole-word / whole-phrase match with light plural tolerance ("model" also
|
|
68
|
+
* matches "models", "enemy" also matches "enemies"). Substring matching routed
|
|
69
|
+
* "spaceship" to ship mode, "build" to the ui target ("b-ui-ld"), "fortune" to
|
|
70
|
+
* playtest ("tune") and "terror" to debug ("error").
|
|
71
|
+
*/
|
|
72
|
+
function wordPattern(word) {
|
|
73
|
+
const cached = PATTERN_CACHE.get(word);
|
|
74
|
+
if (cached)
|
|
75
|
+
return cached;
|
|
76
|
+
const escaped = word.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
77
|
+
const plural = word.endsWith("y")
|
|
78
|
+
? `(?:${escaped}|${escaped.slice(0, -1)}ies)`
|
|
79
|
+
: `${escaped}(?:e?s)?`;
|
|
80
|
+
const pattern = new RegExp(`(?<![a-z0-9])${plural}(?![a-z0-9])`, "i");
|
|
81
|
+
PATTERN_CACHE.set(word, pattern);
|
|
82
|
+
return pattern;
|
|
83
|
+
}
|
|
31
84
|
function includesAny(text, words) {
|
|
32
|
-
return words.some((word) =>
|
|
85
|
+
return words.some((word) => wordPattern(word).test(text));
|
|
33
86
|
}
|
|
34
87
|
function inferMode(goal, requested) {
|
|
35
88
|
if (requested !== "auto")
|
|
@@ -85,7 +138,7 @@ function inferTarget(goal, requested) {
|
|
|
85
138
|
return "general";
|
|
86
139
|
}
|
|
87
140
|
function addSkill(routes, name, why, weight) {
|
|
88
|
-
if (!
|
|
141
|
+
if (!skillByName().has(name))
|
|
89
142
|
return;
|
|
90
143
|
const existing = routes.find((route) => route.name === name);
|
|
91
144
|
if (existing) {
|
|
@@ -255,13 +308,11 @@ function inferSkills(mode, target, goal) {
|
|
|
255
308
|
.sort((a, b) => b.weight - a.weight)
|
|
256
309
|
.slice(0, 7)
|
|
257
310
|
.map((route) => {
|
|
258
|
-
const skill =
|
|
311
|
+
const skill = skillByName().get(route.name);
|
|
259
312
|
return {
|
|
260
|
-
id:
|
|
313
|
+
id: skill.id,
|
|
261
314
|
name: skill.name,
|
|
262
|
-
category: skill.category,
|
|
263
315
|
why: route.why,
|
|
264
|
-
requiresMcpTools: skill.requiresMcpTools,
|
|
265
316
|
};
|
|
266
317
|
});
|
|
267
318
|
}
|