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
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import { lstat, mkdir, realpath } from "fs/promises";
|
|
2
|
-
import { join, resolve, sep } from "path";
|
|
3
|
-
import { validateCloudPath } from "./validate-path.js";
|
|
4
|
-
/**
|
|
5
|
-
* Write containment (spec 9): after joining a manifest key to the project
|
|
6
|
-
* root, resolve the parent chain and assert the final absolute path is
|
|
7
|
-
* strictly inside the realpath of the project root; refuse to write through
|
|
8
|
-
* any symlinked directory component; create nested parents per component so
|
|
9
|
-
* a hostile manifest can never escape the project.
|
|
10
|
-
*/
|
|
11
|
-
export async function containedProjectPath(projectRoot, key) {
|
|
12
|
-
const valid = validateCloudPath(key);
|
|
13
|
-
if (!valid.ok) {
|
|
14
|
-
throw new Error(`Refusing unsafe path ${key}: ${valid.reason}`);
|
|
15
|
-
}
|
|
16
|
-
const rootReal = await realpath(projectRoot);
|
|
17
|
-
const segments = key.split("/");
|
|
18
|
-
let current = rootReal;
|
|
19
|
-
for (let i = 0; i < segments.length - 1; i += 1) {
|
|
20
|
-
current = join(current, segments[i]);
|
|
21
|
-
let info;
|
|
22
|
-
try {
|
|
23
|
-
info = await lstat(current);
|
|
24
|
-
}
|
|
25
|
-
catch {
|
|
26
|
-
await mkdir(current);
|
|
27
|
-
continue;
|
|
28
|
-
}
|
|
29
|
-
if (info.isSymbolicLink()) {
|
|
30
|
-
throw new Error(`Refusing to write through symlinked directory component: ${current}`);
|
|
31
|
-
}
|
|
32
|
-
if (!info.isDirectory()) {
|
|
33
|
-
throw new Error(`Path component is not a directory: ${current}`);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
const target = join(current, segments[segments.length - 1]);
|
|
37
|
-
const normalizedRoot = rootReal.endsWith(sep) ? rootReal : rootReal + sep;
|
|
38
|
-
if (!resolve(target).startsWith(normalizedRoot)) {
|
|
39
|
-
throw new Error(`Path escapes project root: ${key}`);
|
|
40
|
-
}
|
|
41
|
-
try {
|
|
42
|
-
const info = await lstat(target);
|
|
43
|
-
if (info.isSymbolicLink()) {
|
|
44
|
-
throw new Error(`Refusing to replace a symlink: ${key}`);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
catch (err) {
|
|
48
|
-
if (err.code !== "ENOENT")
|
|
49
|
-
throw err;
|
|
50
|
-
}
|
|
51
|
-
return target;
|
|
52
|
-
}
|
package/dist/lib/cloud/diff.d.ts
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import type { CloudManifest, ManifestFile } from "./types.js";
|
|
2
|
-
export type DecisionKind = "push" | "pull" | "delete-local" | "delete-remote" | "conflict-remote-wins" | "keep-local" | "converged";
|
|
3
|
-
export interface PathDecision {
|
|
4
|
-
path: string;
|
|
5
|
-
kind: DecisionKind;
|
|
6
|
-
base?: ManifestFile;
|
|
7
|
-
local?: ManifestFile;
|
|
8
|
-
remote?: ManifestFile;
|
|
9
|
-
}
|
|
10
|
-
export interface DiffPlan {
|
|
11
|
-
decisions: PathDecision[];
|
|
12
|
-
pushPaths: string[];
|
|
13
|
-
pullPaths: string[];
|
|
14
|
-
deleteLocalPaths: string[];
|
|
15
|
-
deleteRemotePaths: string[];
|
|
16
|
-
conflictPaths: string[];
|
|
17
|
-
/** Row 14: local edit beat a remote delete; surfaced as a notice. */
|
|
18
|
-
keepLocalPaths: string[];
|
|
19
|
-
/** Row 15: remote edit beat a local delete; surfaced as a notice. */
|
|
20
|
-
restoredRemotePaths: string[];
|
|
21
|
-
}
|
|
22
|
-
export declare function diffManifests(base: CloudManifest, local: CloudManifest, remote: CloudManifest): DiffPlan;
|
|
23
|
-
/**
|
|
24
|
-
* Sidecar pairing (spec 8.4): foo.png + foo.png.import and foo.gd + foo.gd.uid
|
|
25
|
-
* diff, transfer, delete, and conflict-resolve as one atomic unit. When the
|
|
26
|
-
* primary and its sidecar disagree about which side wins, the primary's
|
|
27
|
-
* direction wins and the sidecar decision is recomputed under that direction.
|
|
28
|
-
*/
|
|
29
|
-
export declare function sidecarPrimary(path: string): string | null;
|
|
30
|
-
/**
|
|
31
|
-
* Mass-deletion guardrail (spec 8.5). Confirmation required when deletions
|
|
32
|
-
* exceed 10 files, reach 20% of the base, or cover the entire base.
|
|
33
|
-
*/
|
|
34
|
-
export declare function assertDeleteGuard(plan: DiffPlan, baseFileCount: number, confirmDeletes?: boolean): void;
|
|
35
|
-
/**
|
|
36
|
-
* Hard abort (spec 8.5): base non-empty and the local tree reads as completely
|
|
37
|
-
* empty (unmounted volume, wrong directory). No confirmation can override this.
|
|
38
|
-
*/
|
|
39
|
-
export declare function assertNotEmptyLocalTree(baseFileCount: number, localFileCount: number): void;
|
package/dist/lib/cloud/diff.js
DELETED
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
export function diffManifests(base, local, remote) {
|
|
2
|
-
const paths = new Set([...Object.keys(base.files), ...Object.keys(local.files), ...Object.keys(remote.files)]);
|
|
3
|
-
const decisions = [];
|
|
4
|
-
for (const path of [...paths].sort()) {
|
|
5
|
-
const b = base.files[path];
|
|
6
|
-
const l = local.files[path];
|
|
7
|
-
const r = remote.files[path];
|
|
8
|
-
const kind = decide(b, l, r);
|
|
9
|
-
decisions.push({ path, kind, base: b, local: l, remote: r });
|
|
10
|
-
}
|
|
11
|
-
pairSidecars(decisions);
|
|
12
|
-
return planFromDecisions(decisions);
|
|
13
|
-
}
|
|
14
|
-
function planFromDecisions(decisions) {
|
|
15
|
-
return {
|
|
16
|
-
decisions,
|
|
17
|
-
pushPaths: decisions.filter((d) => d.kind === "push").map((d) => d.path),
|
|
18
|
-
pullPaths: decisions.filter((d) => d.kind === "pull").map((d) => d.path),
|
|
19
|
-
deleteLocalPaths: decisions.filter((d) => d.kind === "delete-local").map((d) => d.path),
|
|
20
|
-
deleteRemotePaths: decisions.filter((d) => d.kind === "delete-remote").map((d) => d.path),
|
|
21
|
-
conflictPaths: decisions.filter((d) => d.kind === "conflict-remote-wins").map((d) => d.path),
|
|
22
|
-
keepLocalPaths: decisions.filter((d) => d.kind === "keep-local").map((d) => d.path),
|
|
23
|
-
restoredRemotePaths: decisions
|
|
24
|
-
.filter((d) => d.kind === "pull" && d.base && !d.local && d.remote && !same(d.remote, d.base))
|
|
25
|
-
.map((d) => d.path),
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
function decide(base, local, remote) {
|
|
29
|
-
if (same(local, remote))
|
|
30
|
-
return "converged";
|
|
31
|
-
if (!base && local && !remote)
|
|
32
|
-
return "push";
|
|
33
|
-
if (!base && !local && remote)
|
|
34
|
-
return "pull";
|
|
35
|
-
if (!base && local && remote)
|
|
36
|
-
return same(local, remote) ? "converged" : "conflict-remote-wins";
|
|
37
|
-
if (base && same(local, base) && remote && !same(remote, base))
|
|
38
|
-
return "pull";
|
|
39
|
-
if (base && local && !same(local, base) && same(remote, base))
|
|
40
|
-
return "push";
|
|
41
|
-
if (base && local && remote && same(local, remote))
|
|
42
|
-
return "converged";
|
|
43
|
-
if (base && local && remote && !same(local, base) && !same(remote, base))
|
|
44
|
-
return "conflict-remote-wins";
|
|
45
|
-
if (base && !local && same(remote, base))
|
|
46
|
-
return "delete-remote";
|
|
47
|
-
if (base && same(local, base) && !remote)
|
|
48
|
-
return "delete-local";
|
|
49
|
-
if (base && !local && remote && !same(remote, base))
|
|
50
|
-
return "pull";
|
|
51
|
-
if (base && local && !same(local, base) && !remote)
|
|
52
|
-
return "keep-local";
|
|
53
|
-
return "converged";
|
|
54
|
-
}
|
|
55
|
-
function same(a, b) {
|
|
56
|
-
if (!a && !b)
|
|
57
|
-
return true;
|
|
58
|
-
if (!a || !b)
|
|
59
|
-
return false;
|
|
60
|
-
return a.sha256 === b.sha256 && a.size === b.size;
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Sidecar pairing (spec 8.4): foo.png + foo.png.import and foo.gd + foo.gd.uid
|
|
64
|
-
* diff, transfer, delete, and conflict-resolve as one atomic unit. When the
|
|
65
|
-
* primary and its sidecar disagree about which side wins, the primary's
|
|
66
|
-
* direction wins and the sidecar decision is recomputed under that direction.
|
|
67
|
-
*/
|
|
68
|
-
export function sidecarPrimary(path) {
|
|
69
|
-
if (path.endsWith(".import"))
|
|
70
|
-
return path.slice(0, -".import".length);
|
|
71
|
-
if (path.endsWith(".uid"))
|
|
72
|
-
return path.slice(0, -".uid".length);
|
|
73
|
-
return null;
|
|
74
|
-
}
|
|
75
|
-
const REMOTE_WINS = new Set(["pull", "delete-local", "conflict-remote-wins"]);
|
|
76
|
-
const LOCAL_WINS = new Set(["push", "delete-remote", "keep-local"]);
|
|
77
|
-
function pairSidecars(decisions) {
|
|
78
|
-
const byPath = new Map(decisions.map((d) => [d.path, d]));
|
|
79
|
-
for (const sidecar of decisions) {
|
|
80
|
-
const primaryPath = sidecarPrimary(sidecar.path);
|
|
81
|
-
if (!primaryPath)
|
|
82
|
-
continue;
|
|
83
|
-
const primary = byPath.get(primaryPath);
|
|
84
|
-
if (!primary)
|
|
85
|
-
continue;
|
|
86
|
-
// A converged sidecar (L == R) is compatible with either side and a
|
|
87
|
-
// converged primary lets the sidecar act alone; only direction
|
|
88
|
-
// disagreement inside the pair is overridden, with the primary winning.
|
|
89
|
-
if (sidecar.kind === "converged" || primary.kind === "converged")
|
|
90
|
-
continue;
|
|
91
|
-
if (REMOTE_WINS.has(primary.kind) && !REMOTE_WINS.has(sidecar.kind)) {
|
|
92
|
-
sidecar.kind = forceRemoteSide(sidecar);
|
|
93
|
-
}
|
|
94
|
-
else if (LOCAL_WINS.has(primary.kind) && !LOCAL_WINS.has(sidecar.kind)) {
|
|
95
|
-
sidecar.kind = forceLocalSide(sidecar);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
function forceRemoteSide(sidecar) {
|
|
100
|
-
if (sidecar.remote && sidecar.local && !same(sidecar.local, sidecar.remote))
|
|
101
|
-
return "conflict-remote-wins";
|
|
102
|
-
if (sidecar.remote && !sidecar.local)
|
|
103
|
-
return "pull";
|
|
104
|
-
if (!sidecar.remote && sidecar.local)
|
|
105
|
-
return "delete-local";
|
|
106
|
-
return "converged";
|
|
107
|
-
}
|
|
108
|
-
function forceLocalSide(sidecar) {
|
|
109
|
-
if (sidecar.local && !same(sidecar.local, sidecar.remote))
|
|
110
|
-
return "push";
|
|
111
|
-
if (!sidecar.local && sidecar.remote)
|
|
112
|
-
return "delete-remote";
|
|
113
|
-
return "converged";
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Mass-deletion guardrail (spec 8.5). Confirmation required when deletions
|
|
117
|
-
* exceed 10 files, reach 20% of the base, or cover the entire base.
|
|
118
|
-
*/
|
|
119
|
-
export function assertDeleteGuard(plan, baseFileCount, confirmDeletes) {
|
|
120
|
-
const deletes = plan.deleteRemotePaths.length;
|
|
121
|
-
if (!deletes)
|
|
122
|
-
return;
|
|
123
|
-
const tooMany = deletes > 10 ||
|
|
124
|
-
(baseFileCount > 0 && deletes >= Math.ceil(baseFileCount * 0.2)) ||
|
|
125
|
-
deletes === baseFileCount;
|
|
126
|
-
if (tooMany && !confirmDeletes) {
|
|
127
|
-
throw new Error(`Push would delete ${deletes} cloud files. Re-run with --confirm-deletes after verifying the project path.`);
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* Hard abort (spec 8.5): base non-empty and the local tree reads as completely
|
|
132
|
-
* empty (unmounted volume, wrong directory). No confirmation can override this.
|
|
133
|
-
*/
|
|
134
|
-
export function assertNotEmptyLocalTree(baseFileCount, localFileCount) {
|
|
135
|
-
if (baseFileCount > 0 && localFileCount === 0) {
|
|
136
|
-
throw new Error("Local project tree is empty but the sync base is not. This looks like an unmounted volume or wrong directory. Aborting sync; no confirmation can push this.");
|
|
137
|
-
}
|
|
138
|
-
}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Engine coordination (spec 8.6.1 and 8.7). All calls degrade gracefully: an
|
|
3
|
-
* unreachable engine never blocks a sync; the stability check and conflict
|
|
4
|
-
* routing cover the gaps.
|
|
5
|
-
*/
|
|
6
|
-
/** sha256 hex of the stable .summer/local/.project_id (mirrors SummerEngineIdentity::project_id_hash). */
|
|
7
|
-
export declare function readProjectIdHash(projectRoot: string): Promise<string | null>;
|
|
8
|
-
export declare function readProjectPathMarker(projectRoot: string): Promise<string | null>;
|
|
9
|
-
export declare function writeProjectPathMarker(projectRoot: string): Promise<void>;
|
|
10
|
-
/**
|
|
11
|
-
* Before hashing (spec 8.6.1): ask the running engine to flush dirty scenes
|
|
12
|
-
* to disk so the walk hashes what the user actually sees.
|
|
13
|
-
*/
|
|
14
|
-
export declare function saveDirtyScenesIfRunning(projectRoot: string): Promise<boolean>;
|
|
15
|
-
/**
|
|
16
|
-
* After apply (spec 8.7): tell the open editor that files changed underneath it.
|
|
17
|
-
*
|
|
18
|
-
* BOTH HALVES OF THIS ARE CURRENTLY DEAD, and the user-visible symptom is that
|
|
19
|
-
* after a cloud pull the editor keeps showing the pre-pull bytes:
|
|
20
|
-
*
|
|
21
|
-
* - `ScanChanges` is not an engine op. The dispatch ladder
|
|
22
|
-
* (modules/1summer_engine/editor/ops_executor.cpp:1060-1290) has 84 op kinds and
|
|
23
|
-
* no ScanChanges branch, so this fails on EVERY build, not just older ones. The
|
|
24
|
-
* engine-side capability exists as EditorFileSystem::scan_changes() but is
|
|
25
|
-
* exposed neither as an op nor to GDScript, so there is no caller-reachable
|
|
26
|
-
* rescan verb at all. O2 owns adding one.
|
|
27
|
-
* - The scene reload depends on `session.scene`, which /api/health never returns
|
|
28
|
-
* (see the note in lib/engine.ts), so it is always undefined and never fires.
|
|
29
|
-
*
|
|
30
|
-
* Until the engine exposes a rescan, say so out loud rather than swallowing it —
|
|
31
|
-
* a stale editor that looks correct is exactly the failure this codebase is trying
|
|
32
|
-
* to stop shipping.
|
|
33
|
-
*/
|
|
34
|
-
export declare function notifyEngineAfterApply(projectRoot: string, appliedPaths: readonly string[]): Promise<void>;
|
|
@@ -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;
|