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
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
import { createHash } from "crypto";
|
|
2
|
-
import { mkdir, readFile, writeFile } from "fs/promises";
|
|
3
|
-
import { join } from "path";
|
|
4
|
-
import { EngineApiClient } from "../api-client.js";
|
|
5
|
-
import { checkEngineHealth, getApiPort, getApiToken } from "../engine.js";
|
|
6
|
-
/**
|
|
7
|
-
* Engine coordination (spec 8.6.1 and 8.7). All calls degrade gracefully: an
|
|
8
|
-
* unreachable engine never blocks a sync; the stability check and conflict
|
|
9
|
-
* routing cover the gaps.
|
|
10
|
-
*/
|
|
11
|
-
/** sha256 hex of the stable .summer/local/.project_id (mirrors SummerEngineIdentity::project_id_hash). */
|
|
12
|
-
export async function readProjectIdHash(projectRoot) {
|
|
13
|
-
try {
|
|
14
|
-
const id = (await readFile(join(projectRoot, ".summer", "local", ".project_id"), "utf8")).trim();
|
|
15
|
-
if (!id)
|
|
16
|
-
return null;
|
|
17
|
-
return createHash("sha256").update(id, "utf8").digest("hex");
|
|
18
|
-
}
|
|
19
|
-
catch {
|
|
20
|
-
return null;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
export async function readProjectPathMarker(projectRoot) {
|
|
24
|
-
try {
|
|
25
|
-
const marker = (await readFile(join(projectRoot, ".summer", "local", ".project_path"), "utf8")).trim();
|
|
26
|
-
return marker || null;
|
|
27
|
-
}
|
|
28
|
-
catch {
|
|
29
|
-
return null;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
export async function writeProjectPathMarker(projectRoot) {
|
|
33
|
-
const dir = join(projectRoot, ".summer", "local");
|
|
34
|
-
await mkdir(dir, { recursive: true });
|
|
35
|
-
await writeFile(join(dir, ".project_path"), projectRoot, "utf8");
|
|
36
|
-
}
|
|
37
|
-
async function connectForProject(projectRoot) {
|
|
38
|
-
const projectIdHash = await readProjectIdHash(projectRoot);
|
|
39
|
-
if (!projectIdHash)
|
|
40
|
-
return null;
|
|
41
|
-
try {
|
|
42
|
-
const port = await getApiPort();
|
|
43
|
-
const token = await getApiToken();
|
|
44
|
-
if (!token)
|
|
45
|
-
return null;
|
|
46
|
-
const health = await checkEngineHealth(port);
|
|
47
|
-
if (!health)
|
|
48
|
-
return null;
|
|
49
|
-
// A different project's engine instance must never be asked to save or
|
|
50
|
-
// rescan; the executor rejects mismatches too, but skip the round trip.
|
|
51
|
-
if (health.projectIdHash && health.projectIdHash !== projectIdHash)
|
|
52
|
-
return null;
|
|
53
|
-
return {
|
|
54
|
-
client: new EngineApiClient(port, token, {
|
|
55
|
-
instanceId: health.instanceId,
|
|
56
|
-
projectId: health.projectId,
|
|
57
|
-
projectIdHash,
|
|
58
|
-
}),
|
|
59
|
-
projectIdHash,
|
|
60
|
-
scene: health.scene,
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
catch {
|
|
64
|
-
return null;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Before hashing (spec 8.6.1): ask the running engine to flush dirty scenes
|
|
69
|
-
* to disk so the walk hashes what the user actually sees.
|
|
70
|
-
*/
|
|
71
|
-
export async function saveDirtyScenesIfRunning(projectRoot) {
|
|
72
|
-
const session = await connectForProject(projectRoot);
|
|
73
|
-
if (!session)
|
|
74
|
-
return false;
|
|
75
|
-
try {
|
|
76
|
-
await session.client.executeOps([{ op: "SaveDirtyScenes" }], { projectIdHash: session.projectIdHash });
|
|
77
|
-
return true;
|
|
78
|
-
}
|
|
79
|
-
catch {
|
|
80
|
-
return false;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* After apply (spec 8.7): tell the open editor that files changed underneath it.
|
|
85
|
-
*
|
|
86
|
-
* BOTH HALVES OF THIS ARE CURRENTLY DEAD, and the user-visible symptom is that
|
|
87
|
-
* after a cloud pull the editor keeps showing the pre-pull bytes:
|
|
88
|
-
*
|
|
89
|
-
* - `ScanChanges` is not an engine op. The dispatch ladder
|
|
90
|
-
* (modules/1summer_engine/editor/ops_executor.cpp:1060-1290) has 84 op kinds and
|
|
91
|
-
* no ScanChanges branch, so this fails on EVERY build, not just older ones. The
|
|
92
|
-
* engine-side capability exists as EditorFileSystem::scan_changes() but is
|
|
93
|
-
* exposed neither as an op nor to GDScript, so there is no caller-reachable
|
|
94
|
-
* rescan verb at all. O2 owns adding one.
|
|
95
|
-
* - The scene reload depends on `session.scene`, which /api/health never returns
|
|
96
|
-
* (see the note in lib/engine.ts), so it is always undefined and never fires.
|
|
97
|
-
*
|
|
98
|
-
* Until the engine exposes a rescan, say so out loud rather than swallowing it —
|
|
99
|
-
* a stale editor that looks correct is exactly the failure this codebase is trying
|
|
100
|
-
* to stop shipping.
|
|
101
|
-
*/
|
|
102
|
-
export async function notifyEngineAfterApply(projectRoot, appliedPaths) {
|
|
103
|
-
if (!appliedPaths.length)
|
|
104
|
-
return;
|
|
105
|
-
const session = await connectForProject(projectRoot);
|
|
106
|
-
if (!session)
|
|
107
|
-
return;
|
|
108
|
-
let rescanned = false;
|
|
109
|
-
try {
|
|
110
|
-
await session.client.executeOps([{ op: "ScanChanges" }], { projectIdHash: session.projectIdHash });
|
|
111
|
-
rescanned = true;
|
|
112
|
-
}
|
|
113
|
-
catch {
|
|
114
|
-
rescanned = false;
|
|
115
|
-
}
|
|
116
|
-
let reloaded = false;
|
|
117
|
-
try {
|
|
118
|
-
const scene = session.scene;
|
|
119
|
-
if (scene && scene.startsWith("res://")) {
|
|
120
|
-
const sceneRel = scene.slice("res://".length);
|
|
121
|
-
if (appliedPaths.includes(sceneRel)) {
|
|
122
|
-
await session.client.executeOps([{ op: "OpenScene", path: scene }], { projectIdHash: session.projectIdHash });
|
|
123
|
-
reloaded = true;
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
catch {
|
|
128
|
-
reloaded = false;
|
|
129
|
-
}
|
|
130
|
-
if (!rescanned) {
|
|
131
|
-
console.warn(`Pulled ${appliedPaths.length} file(s), but could not tell the running editor to rescan ` +
|
|
132
|
-
"(this engine build exposes no rescan op). The editor may still be showing the old " +
|
|
133
|
-
"contents — click into its window, or reopen the affected scene, before trusting what you see.");
|
|
134
|
-
}
|
|
135
|
-
else if (!reloaded) {
|
|
136
|
-
console.warn("Pulled files and rescanned, but could not confirm which scene is open, so an open " +
|
|
137
|
-
"scene replaced by the pull was not reloaded. Reopen it before trusting what you see.");
|
|
138
|
-
}
|
|
139
|
-
}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
export interface HashCacheEntry {
|
|
2
|
-
sha256: string;
|
|
3
|
-
size: number;
|
|
4
|
-
mtimeNs: string;
|
|
5
|
-
ctimeNs: string;
|
|
6
|
-
inode: string;
|
|
7
|
-
}
|
|
8
|
-
export type HashCache = Record<string, HashCacheEntry>;
|
|
9
|
-
export declare function readHashCache(projectRoot: string): Promise<HashCache>;
|
|
10
|
-
export declare function writeHashCache(projectRoot: string, cache: HashCache): Promise<void>;
|
|
11
|
-
export interface StatLike {
|
|
12
|
-
size: bigint;
|
|
13
|
-
mtimeNs: bigint;
|
|
14
|
-
ctimeNs: bigint;
|
|
15
|
-
ino: bigint;
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Cache hit rule (spec 6.2): rehash when any field differs, and apply Git's
|
|
19
|
-
* racily-clean rule: any file whose mtime is at or after the sync start time
|
|
20
|
-
* is rehashed regardless of cache.
|
|
21
|
-
*/
|
|
22
|
-
export declare function cacheHit(entry: HashCacheEntry | undefined, stat: StatLike, syncStartMs: number): boolean;
|
|
23
|
-
export declare function cacheEntryFor(sha256: string, stat: StatLike): HashCacheEntry;
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { readFile } from "fs/promises";
|
|
2
|
-
import { hashCachePath, writeJsonAtomic } from "./paths.js";
|
|
3
|
-
export async function readHashCache(projectRoot) {
|
|
4
|
-
try {
|
|
5
|
-
const parsed = JSON.parse(await readFile(hashCachePath(projectRoot), "utf8"));
|
|
6
|
-
return parsed && typeof parsed === "object" ? parsed : {};
|
|
7
|
-
}
|
|
8
|
-
catch {
|
|
9
|
-
return {};
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
export async function writeHashCache(projectRoot, cache) {
|
|
13
|
-
await writeJsonAtomic(hashCachePath(projectRoot), cache);
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Cache hit rule (spec 6.2): rehash when any field differs, and apply Git's
|
|
17
|
-
* racily-clean rule: any file whose mtime is at or after the sync start time
|
|
18
|
-
* is rehashed regardless of cache.
|
|
19
|
-
*/
|
|
20
|
-
export function cacheHit(entry, stat, syncStartMs) {
|
|
21
|
-
if (!entry)
|
|
22
|
-
return false;
|
|
23
|
-
if (BigInt(entry.size) !== stat.size)
|
|
24
|
-
return false;
|
|
25
|
-
if (entry.mtimeNs !== stat.mtimeNs.toString())
|
|
26
|
-
return false;
|
|
27
|
-
if (entry.ctimeNs !== stat.ctimeNs.toString())
|
|
28
|
-
return false;
|
|
29
|
-
if (entry.inode !== stat.ino.toString())
|
|
30
|
-
return false;
|
|
31
|
-
const mtimeMs = Number(stat.mtimeNs / 1000000n);
|
|
32
|
-
if (mtimeMs >= syncStartMs)
|
|
33
|
-
return false;
|
|
34
|
-
return true;
|
|
35
|
-
}
|
|
36
|
-
export function cacheEntryFor(sha256, stat) {
|
|
37
|
-
return {
|
|
38
|
-
sha256,
|
|
39
|
-
size: Number(stat.size),
|
|
40
|
-
mtimeNs: stat.mtimeNs.toString(),
|
|
41
|
-
ctimeNs: stat.ctimeNs.toString(),
|
|
42
|
-
inode: stat.ino.toString(),
|
|
43
|
-
};
|
|
44
|
-
}
|
package/dist/lib/cloud/hash.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { type TrackedRules } from "./rules.js";
|
|
2
|
-
import type { WalkResult } from "./types.js";
|
|
3
|
-
export interface WalkOptions {
|
|
4
|
-
/** Sync start time for the racily-clean rule. Defaults to now. */
|
|
5
|
-
syncStartMs?: number;
|
|
6
|
-
/** Skip reading/writing hash-cache.json (used by tests). */
|
|
7
|
-
noCache?: boolean;
|
|
8
|
-
}
|
|
9
|
-
export declare function walkProject(projectRoot: string, options?: WalkOptions): Promise<WalkResult>;
|
|
10
|
-
export type { TrackedRules };
|
package/dist/lib/cloud/hash.js
DELETED
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
import { createHash } from "crypto";
|
|
2
|
-
import { open, readdir } from "fs/promises";
|
|
3
|
-
import { join } from "path";
|
|
4
|
-
import { cacheEntryFor, cacheHit, readHashCache, writeHashCache } from "./hash-cache.js";
|
|
5
|
-
import { isHardExcludedDir, isHardExcludedFile, isIgnoredByRules, loadTrackedRules } from "./rules.js";
|
|
6
|
-
import { findPathCollisions, validateCloudPath } from "./validate-path.js";
|
|
7
|
-
export async function walkProject(projectRoot, options = {}) {
|
|
8
|
-
const rules = await loadTrackedRules(projectRoot);
|
|
9
|
-
const syncStartMs = options.syncStartMs ?? Date.now();
|
|
10
|
-
const cache = options.noCache ? {} : await readHashCache(projectRoot);
|
|
11
|
-
const nextCache = {};
|
|
12
|
-
const files = {};
|
|
13
|
-
const fileByHash = new Map();
|
|
14
|
-
const diskPathByKey = new Map();
|
|
15
|
-
const statByKey = new Map();
|
|
16
|
-
const skippedSymlinks = [];
|
|
17
|
-
const unstablePaths = [];
|
|
18
|
-
async function walk(dir, relKey) {
|
|
19
|
-
const entries = await readdir(dir, { withFileTypes: true });
|
|
20
|
-
const siblingNames = new Set(entries.map((entry) => entry.name.normalize("NFC")));
|
|
21
|
-
for (const entry of entries) {
|
|
22
|
-
// Manifest keys are NFC; diskPathByKey keeps the actual byte names for I/O.
|
|
23
|
-
const nfcName = entry.name.normalize("NFC");
|
|
24
|
-
const fullPath = join(dir, entry.name);
|
|
25
|
-
const key = relKey ? `${relKey}/${nfcName}` : nfcName;
|
|
26
|
-
if (!key || key === "summer-cloud.json")
|
|
27
|
-
continue;
|
|
28
|
-
if (entry.isSymbolicLink()) {
|
|
29
|
-
skippedSymlinks.push(key);
|
|
30
|
-
continue;
|
|
31
|
-
}
|
|
32
|
-
if (entry.isDirectory()) {
|
|
33
|
-
if (isHardExcludedDir(key, nfcName))
|
|
34
|
-
continue;
|
|
35
|
-
if (isIgnoredByRules(key, true, rules))
|
|
36
|
-
continue;
|
|
37
|
-
await walk(fullPath, key);
|
|
38
|
-
continue;
|
|
39
|
-
}
|
|
40
|
-
if (!entry.isFile())
|
|
41
|
-
continue;
|
|
42
|
-
if (isHardExcludedFile(key, nfcName, siblingNames))
|
|
43
|
-
continue;
|
|
44
|
-
if (isIgnoredByRules(key, false, rules))
|
|
45
|
-
continue;
|
|
46
|
-
const valid = validateCloudPath(key);
|
|
47
|
-
if (!valid.ok) {
|
|
48
|
-
throw new Error(`Refusing to sync invalid path ${key}: ${valid.reason}`);
|
|
49
|
-
}
|
|
50
|
-
const hashed = await hashStableFile(fullPath, cache[key], syncStartMs);
|
|
51
|
-
if (!hashed) {
|
|
52
|
-
unstablePaths.push(key);
|
|
53
|
-
continue;
|
|
54
|
-
}
|
|
55
|
-
files[key] = { sha256: hashed.sha256, size: hashed.size };
|
|
56
|
-
nextCache[key] = cacheEntryFor(hashed.sha256, hashed.stat);
|
|
57
|
-
diskPathByKey.set(key, fullPath);
|
|
58
|
-
statByKey.set(key, {
|
|
59
|
-
size: hashed.size,
|
|
60
|
-
mtimeNs: hashed.stat.mtimeNs.toString(),
|
|
61
|
-
inode: hashed.stat.ino.toString(),
|
|
62
|
-
});
|
|
63
|
-
if (!fileByHash.has(hashed.sha256)) {
|
|
64
|
-
fileByHash.set(hashed.sha256, fullPath);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
await walk(projectRoot, "");
|
|
69
|
-
const collisions = findPathCollisions(Object.keys(files));
|
|
70
|
-
if (collisions.length) {
|
|
71
|
-
const lines = collisions.map((c) => `${c.a} and ${c.b} (${c.kind})`).join("; ");
|
|
72
|
-
throw new Error(`On-disk file names collide after normalization and cannot sync: ${lines}. Rename one of each pair.`);
|
|
73
|
-
}
|
|
74
|
-
if (!options.noCache) {
|
|
75
|
-
await writeHashCache(projectRoot, nextCache).catch(() => { });
|
|
76
|
-
}
|
|
77
|
-
return { files, fileByHash, diskPathByKey, statByKey, skippedSymlinks, unstablePaths };
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Per-file stability check (spec 8.6.2): fstat the open fd before hashing,
|
|
81
|
-
* hash, fstat again; on any difference re-read; after 3 attempts return null
|
|
82
|
-
* so the caller excludes the file from THIS push and carries forward its
|
|
83
|
-
* previous manifest entry. Never throws for instability.
|
|
84
|
-
*/
|
|
85
|
-
async function hashStableFile(path, cached, syncStartMs) {
|
|
86
|
-
for (let attempt = 0; attempt < 3; attempt += 1) {
|
|
87
|
-
const handle = await open(path, "r");
|
|
88
|
-
try {
|
|
89
|
-
const before = statLike(await handle.stat({ bigint: true }));
|
|
90
|
-
if (cacheHit(cached, before, syncStartMs)) {
|
|
91
|
-
return { sha256: cached.sha256, size: Number(before.size), stat: before };
|
|
92
|
-
}
|
|
93
|
-
const bytes = await handle.readFile();
|
|
94
|
-
const after = statLike(await handle.stat({ bigint: true }));
|
|
95
|
-
if (before.size === after.size && before.mtimeNs === after.mtimeNs && before.ino === after.ino) {
|
|
96
|
-
return {
|
|
97
|
-
sha256: createHash("sha256").update(bytes).digest("hex"),
|
|
98
|
-
size: bytes.length,
|
|
99
|
-
stat: after,
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
finally {
|
|
104
|
-
await handle.close();
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
return null;
|
|
108
|
-
}
|
|
109
|
-
function statLike(stat) {
|
|
110
|
-
return { size: stat.size, mtimeNs: stat.mtimeNs, ctimeNs: stat.ctimeNs, ino: stat.ino };
|
|
111
|
-
}
|
package/dist/lib/cloud/http.d.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Blob transport boundary. Production talks to presigned R2 URLs; tests swap
|
|
3
|
-
* in a double so no test ever needs the network.
|
|
4
|
-
*/
|
|
5
|
-
export interface BlobTransport {
|
|
6
|
-
/** Streams a GET to a file, hashing as it goes. Returns sha256 hex and size. */
|
|
7
|
-
getToFile(url: string, destPath: string): Promise<{
|
|
8
|
-
sha256: string;
|
|
9
|
-
size: number;
|
|
10
|
-
status: number;
|
|
11
|
-
}>;
|
|
12
|
-
/** PUTs bytes from a file or buffer. Returns the HTTP status. */
|
|
13
|
-
put(url: string, headers: Record<string, string>, body: Buffer): Promise<number>;
|
|
14
|
-
}
|
|
15
|
-
export declare function getBlobTransport(): BlobTransport;
|
|
16
|
-
export declare function setBlobTransportForTests(transport: BlobTransport | null): void;
|
|
17
|
-
export declare function readFileBytes(path: string): Promise<Buffer>;
|
package/dist/lib/cloud/http.js
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import { createHash } from "crypto";
|
|
2
|
-
import { createWriteStream } from "fs";
|
|
3
|
-
import { open, readFile } from "fs/promises";
|
|
4
|
-
import { Readable } from "stream";
|
|
5
|
-
import { pipeline } from "stream/promises";
|
|
6
|
-
const realTransport = {
|
|
7
|
-
async getToFile(url, destPath) {
|
|
8
|
-
const res = await fetch(url);
|
|
9
|
-
if (!res.ok || !res.body) {
|
|
10
|
-
return { sha256: "", size: 0, status: res.status };
|
|
11
|
-
}
|
|
12
|
-
const hash = createHash("sha256");
|
|
13
|
-
let size = 0;
|
|
14
|
-
const out = createWriteStream(destPath, { mode: 0o600 });
|
|
15
|
-
await pipeline(Readable.fromWeb(res.body), async function* (source) {
|
|
16
|
-
for await (const chunk of source) {
|
|
17
|
-
const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
18
|
-
hash.update(buf);
|
|
19
|
-
size += buf.length;
|
|
20
|
-
yield buf;
|
|
21
|
-
}
|
|
22
|
-
}, out);
|
|
23
|
-
// fsync so a staged blob survives a crash before apply.
|
|
24
|
-
const handle = await open(destPath, "r+");
|
|
25
|
-
try {
|
|
26
|
-
await handle.sync();
|
|
27
|
-
}
|
|
28
|
-
finally {
|
|
29
|
-
await handle.close();
|
|
30
|
-
}
|
|
31
|
-
return { sha256: hash.digest("hex"), size, status: res.status };
|
|
32
|
-
},
|
|
33
|
-
async put(url, headers, body) {
|
|
34
|
-
const res = await fetch(url, { method: "PUT", headers, body: new Uint8Array(body) });
|
|
35
|
-
return res.status;
|
|
36
|
-
},
|
|
37
|
-
};
|
|
38
|
-
let activeTransport = realTransport;
|
|
39
|
-
export function getBlobTransport() {
|
|
40
|
-
return activeTransport;
|
|
41
|
-
}
|
|
42
|
-
export function setBlobTransportForTests(transport) {
|
|
43
|
-
activeTransport = transport ?? realTransport;
|
|
44
|
-
}
|
|
45
|
-
export async function readFileBytes(path) {
|
|
46
|
-
return readFile(path);
|
|
47
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function lockPath(projectRoot: string): string;
|
package/dist/lib/cloud/lock.d.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export interface CloudLock {
|
|
2
|
-
release(): Promise<void>;
|
|
3
|
-
}
|
|
4
|
-
type Face = "cli" | "mcp" | "engine";
|
|
5
|
-
/**
|
|
6
|
-
* Per-project sync mutex (spec 8.2). O_EXCL create, 30s heartbeat, stale only
|
|
7
|
-
* by heartbeat age (120s). Two fixed races: the payload is written to the fd
|
|
8
|
-
* before close and verified by token after create (a contender that reads an
|
|
9
|
-
* empty just-created file treats parse failure as FRESH while the file is
|
|
10
|
-
* young); takeover goes through an atomic rename so two waiters can never
|
|
11
|
-
* both remove the same stale lock and both proceed.
|
|
12
|
-
*/
|
|
13
|
-
export declare function acquireCloudLock(projectRoot: string, face?: Face): Promise<CloudLock>;
|
|
14
|
-
export {};
|
package/dist/lib/cloud/lock.js
DELETED
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
import { randomUUID } from "crypto";
|
|
2
|
-
import { open, readFile, rename, rm, stat, writeFile } from "fs/promises";
|
|
3
|
-
import { lockPath } from "./lock-path.js";
|
|
4
|
-
const STALE_MS = 120_000;
|
|
5
|
-
const WAIT_MS = 10_000;
|
|
6
|
-
const HEARTBEAT_MS = 30_000;
|
|
7
|
-
/**
|
|
8
|
-
* Per-project sync mutex (spec 8.2). O_EXCL create, 30s heartbeat, stale only
|
|
9
|
-
* by heartbeat age (120s). Two fixed races: the payload is written to the fd
|
|
10
|
-
* before close and verified by token after create (a contender that reads an
|
|
11
|
-
* empty just-created file treats parse failure as FRESH while the file is
|
|
12
|
-
* young); takeover goes through an atomic rename so two waiters can never
|
|
13
|
-
* both remove the same stale lock and both proceed.
|
|
14
|
-
*/
|
|
15
|
-
export async function acquireCloudLock(projectRoot, face = "cli") {
|
|
16
|
-
const path = lockPath(projectRoot);
|
|
17
|
-
const started = Date.now();
|
|
18
|
-
const token = randomUUID();
|
|
19
|
-
while (Date.now() - started < WAIT_MS) {
|
|
20
|
-
const acquired = await tryCreate(path, face, token);
|
|
21
|
-
if (acquired)
|
|
22
|
-
return acquired;
|
|
23
|
-
if (await isStale(path)) {
|
|
24
|
-
await takeoverStale(path);
|
|
25
|
-
continue;
|
|
26
|
-
}
|
|
27
|
-
await sleep(250);
|
|
28
|
-
}
|
|
29
|
-
throw new Error("Summer Cloud sync already in progress");
|
|
30
|
-
}
|
|
31
|
-
async function tryCreate(path, face, token) {
|
|
32
|
-
const startedAt = new Date().toISOString();
|
|
33
|
-
let file;
|
|
34
|
-
try {
|
|
35
|
-
file = await open(path, "wx", 0o600);
|
|
36
|
-
}
|
|
37
|
-
catch {
|
|
38
|
-
return null;
|
|
39
|
-
}
|
|
40
|
-
try {
|
|
41
|
-
await file.writeFile(JSON.stringify(payload(face, token, startedAt)), { encoding: "utf8" });
|
|
42
|
-
await file.sync();
|
|
43
|
-
}
|
|
44
|
-
finally {
|
|
45
|
-
await file.close();
|
|
46
|
-
}
|
|
47
|
-
// Re-check ownership: a racing waiter may have taken the file over between
|
|
48
|
-
// our create and write. If the token on disk is not ours, we lost.
|
|
49
|
-
if (!(await ownsLock(path, token))) {
|
|
50
|
-
return null;
|
|
51
|
-
}
|
|
52
|
-
const heartbeat = setInterval(() => {
|
|
53
|
-
void writeFile(path, JSON.stringify(payload(face, token, startedAt)), { encoding: "utf8" }).catch(() => { });
|
|
54
|
-
}, HEARTBEAT_MS);
|
|
55
|
-
heartbeat.unref?.();
|
|
56
|
-
return {
|
|
57
|
-
async release() {
|
|
58
|
-
clearInterval(heartbeat);
|
|
59
|
-
if (await ownsLock(path, token)) {
|
|
60
|
-
await rm(path, { force: true });
|
|
61
|
-
}
|
|
62
|
-
},
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
function payload(face, token, startedAt) {
|
|
66
|
-
return { pid: process.pid, face, token, startedAt, heartbeatAt: new Date().toISOString() };
|
|
67
|
-
}
|
|
68
|
-
async function ownsLock(path, token) {
|
|
69
|
-
try {
|
|
70
|
-
const raw = JSON.parse(await readFile(path, "utf8"));
|
|
71
|
-
return raw.token === token;
|
|
72
|
-
}
|
|
73
|
-
catch {
|
|
74
|
-
return false;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
async function isStale(path) {
|
|
78
|
-
let raw;
|
|
79
|
-
try {
|
|
80
|
-
raw = await readFile(path, "utf8");
|
|
81
|
-
}
|
|
82
|
-
catch {
|
|
83
|
-
// Gone already; the create loop will race for it.
|
|
84
|
-
return false;
|
|
85
|
-
}
|
|
86
|
-
try {
|
|
87
|
-
const parsed = JSON.parse(raw);
|
|
88
|
-
const heartbeat = parsed.heartbeatAt ? Date.parse(parsed.heartbeatAt) : NaN;
|
|
89
|
-
if (!Number.isFinite(heartbeat))
|
|
90
|
-
throw new Error("no heartbeat");
|
|
91
|
-
return Date.now() - heartbeat > STALE_MS;
|
|
92
|
-
}
|
|
93
|
-
catch {
|
|
94
|
-
// Unparseable: probably a holder between open('wx') and write. Treat as
|
|
95
|
-
// fresh while the file is young; stale only once the mtime ages out.
|
|
96
|
-
try {
|
|
97
|
-
const info = await stat(path);
|
|
98
|
-
return Date.now() - info.mtimeMs > STALE_MS;
|
|
99
|
-
}
|
|
100
|
-
catch {
|
|
101
|
-
return false;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
async function takeoverStale(path) {
|
|
106
|
-
// Atomic claim: only one waiter wins the rename; the loser's rename fails
|
|
107
|
-
// with ENOENT and it simply retries the exclusive create.
|
|
108
|
-
const claimed = `${path}.takeover.${process.pid}.${Date.now()}`;
|
|
109
|
-
try {
|
|
110
|
-
await rename(path, claimed);
|
|
111
|
-
}
|
|
112
|
-
catch {
|
|
113
|
-
return;
|
|
114
|
-
}
|
|
115
|
-
// Verify what we actually grabbed. If it turned fresh under us (the holder
|
|
116
|
-
// heartbeated between our staleness read and the rename), restore it
|
|
117
|
-
// without ever clobbering a lock someone else created in the gap.
|
|
118
|
-
try {
|
|
119
|
-
const content = await readFile(claimed, "utf8");
|
|
120
|
-
const parsed = JSON.parse(content);
|
|
121
|
-
const heartbeat = parsed.heartbeatAt ? Date.parse(parsed.heartbeatAt) : NaN;
|
|
122
|
-
if (Number.isFinite(heartbeat) && Date.now() - heartbeat <= STALE_MS) {
|
|
123
|
-
try {
|
|
124
|
-
const file = await open(path, "wx", 0o600);
|
|
125
|
-
await file.writeFile(content, { encoding: "utf8" });
|
|
126
|
-
await file.close();
|
|
127
|
-
}
|
|
128
|
-
catch {
|
|
129
|
-
// Someone else already created a new lock; the displaced holder's
|
|
130
|
-
// next heartbeat write will contend through ownsLock on release.
|
|
131
|
-
}
|
|
132
|
-
await rm(claimed, { force: true });
|
|
133
|
-
return;
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
catch {
|
|
137
|
-
// Unparseable claimed file: it aged past staleness to get here; discard.
|
|
138
|
-
}
|
|
139
|
-
await rm(claimed, { force: true });
|
|
140
|
-
}
|
|
141
|
-
function sleep(ms) {
|
|
142
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
143
|
-
}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import type { CloudManifest } from "./types.js";
|
|
2
|
-
export declare function sha256Hex(bytes: Buffer | Uint8Array | string): string;
|
|
3
|
-
/** Spec 6.3: keys sorted bytewise (UTF-8), no whitespace, then gzip. */
|
|
4
|
-
export declare function compareKeysBytewise(a: string, b: string): number;
|
|
5
|
-
export declare function serializeManifest(manifest: CloudManifest): Buffer;
|
|
6
|
-
export declare function parseManifest(bytes: Buffer, expectedProjectId?: string): CloudManifest;
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { createHash } from "crypto";
|
|
2
|
-
import { gunzipSync, gzipSync } from "zlib";
|
|
3
|
-
import { findPathCollisions, validateCloudPath } from "./validate-path.js";
|
|
4
|
-
export function sha256Hex(bytes) {
|
|
5
|
-
return createHash("sha256").update(bytes).digest("hex");
|
|
6
|
-
}
|
|
7
|
-
/** Spec 6.3: keys sorted bytewise (UTF-8), no whitespace, then gzip. */
|
|
8
|
-
export function compareKeysBytewise(a, b) {
|
|
9
|
-
return Buffer.compare(Buffer.from(a, "utf8"), Buffer.from(b, "utf8"));
|
|
10
|
-
}
|
|
11
|
-
export function serializeManifest(manifest) {
|
|
12
|
-
const files = Object.fromEntries(Object.entries(manifest.files).sort(([a], [b]) => compareKeysBytewise(a, b)));
|
|
13
|
-
const document = {
|
|
14
|
-
schemaVersion: manifest.schemaVersion,
|
|
15
|
-
projectId: manifest.projectId,
|
|
16
|
-
rulesVersion: manifest.rulesVersion,
|
|
17
|
-
files,
|
|
18
|
-
};
|
|
19
|
-
return gzipSync(Buffer.from(JSON.stringify(document), "utf8"));
|
|
20
|
-
}
|
|
21
|
-
export function parseManifest(bytes, expectedProjectId) {
|
|
22
|
-
const parsed = JSON.parse(gunzipSync(bytes).toString("utf8"));
|
|
23
|
-
if (parsed.schemaVersion !== 1 || typeof parsed.projectId !== "string" || typeof parsed.files !== "object") {
|
|
24
|
-
throw new Error("Invalid Summer Cloud manifest");
|
|
25
|
-
}
|
|
26
|
-
if (expectedProjectId && parsed.projectId !== expectedProjectId) {
|
|
27
|
-
throw new Error("Manifest projectId mismatch");
|
|
28
|
-
}
|
|
29
|
-
const keys = Object.keys(parsed.files);
|
|
30
|
-
for (const path of keys) {
|
|
31
|
-
const valid = validateCloudPath(path);
|
|
32
|
-
if (!valid.ok)
|
|
33
|
-
throw new Error(`Invalid manifest path ${path}: ${valid.reason}`);
|
|
34
|
-
}
|
|
35
|
-
const collisions = findPathCollisions(keys);
|
|
36
|
-
if (collisions.length) {
|
|
37
|
-
const first = collisions[0];
|
|
38
|
-
throw new Error(`Manifest path collision (${first.kind}): ${first.a} and ${first.b}`);
|
|
39
|
-
}
|
|
40
|
-
return parsed;
|
|
41
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import type { BaseState, CloudBinding, PullJournal } from "./types.js";
|
|
2
|
-
export declare function resolveProjectRoot(project?: string): string;
|
|
3
|
-
export declare function bindingPath(projectRoot: string): string;
|
|
4
|
-
export declare function localCloudDir(projectRoot: string): string;
|
|
5
|
-
export declare function basePath(projectRoot: string): string;
|
|
6
|
-
export declare function journalPath(projectRoot: string): string;
|
|
7
|
-
export declare function hashCachePath(projectRoot: string): string;
|
|
8
|
-
export declare function stagingDir(projectRoot: string): string;
|
|
9
|
-
export declare function conflictsDir(projectRoot: string): string;
|
|
10
|
-
export declare function ensureCloudDirs(projectRoot: string): Promise<void>;
|
|
11
|
-
export declare function readBinding(projectRoot: string): Promise<CloudBinding | null>;
|
|
12
|
-
export declare function writeBinding(projectRoot: string, binding: CloudBinding): Promise<void>;
|
|
13
|
-
export declare function readBase(projectRoot: string): Promise<BaseState | null>;
|
|
14
|
-
export declare function writeBase(projectRoot: string, base: BaseState): Promise<void>;
|
|
15
|
-
export declare function readJournal(projectRoot: string): Promise<PullJournal | null>;
|
|
16
|
-
export declare function writeJournal(projectRoot: string, journal: PullJournal): Promise<void>;
|
|
17
|
-
export declare function removeJournal(projectRoot: string): Promise<void>;
|
|
18
|
-
export declare function writeJsonAtomic(path: string, value: unknown): Promise<void>;
|
|
19
|
-
export declare function projectDisplayName(projectRoot: string): Promise<string>;
|
|
20
|
-
export declare function isCloudEnabled(projectRoot: string): boolean;
|