@playcraft/cli 0.1.36-beta1 → 0.1.37-beta
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/README.md +58 -3
- package/SKILLS_REGISTRY.md +149 -0
- package/dist/agent/local-backend.js +1 -1
- package/dist/auth/account-activation.js +157 -0
- package/dist/auth/messages.js +30 -0
- package/dist/cli-root-help.js +2 -0
- package/dist/commands/build-all.js +5 -19
- package/dist/commands/build-temp.js +26 -0
- package/dist/commands/build.js +15 -28
- package/dist/commands/create.js +26 -33
- package/dist/commands/image.js +2 -6
- package/dist/commands/login.js +84 -42
- package/dist/commands/platform-skills.generated.js +19 -0
- package/dist/commands/playable.js +53 -0
- package/dist/commands/skills.js +4 -0
- package/dist/commands/tools-3d.js +11 -0
- package/dist/commands/tools-batch.js +87 -0
- package/dist/commands/tools-generation.js +68 -109
- package/dist/commands/tools.js +2 -2
- package/dist/commands/video.js +111 -0
- package/dist/commands/workspace-runtime.js +54 -0
- package/dist/commands/workspace.js +35 -0
- package/dist/config.js +59 -4
- package/dist/index.js +40 -3
- package/dist/project-skills/builtin-import.js +225 -0
- package/dist/project-skills/commands.js +77 -0
- package/dist/project-skills/lifecycle.js +28 -0
- package/dist/project-skills/local-run.js +112 -0
- package/dist/project-skills/local-store.js +221 -0
- package/dist/project-skills/messages.js +80 -0
- package/dist/project-skills/reconcile.js +62 -0
- package/dist/project-skills/remote-cache.js +51 -0
- package/dist/project-skills/validation.js +19 -0
- package/dist/recording/messages.js +40 -0
- package/dist/recording/project-digest.js +85 -0
- package/dist/recording/recorder.js +293 -0
- package/dist/recording/scenario.js +50 -0
- package/dist/remix/clone.js +2 -0
- package/dist/remix/init-template.js +2 -0
- package/dist/remix/pull.js +2 -0
- package/dist/remix/push.js +21 -1
- package/dist/skill-registry/client.js +345 -0
- package/dist/skill-registry/commands.js +180 -0
- package/dist/skill-registry/evaluation-client.js +156 -0
- package/dist/skill-registry/evaluation-commands.js +174 -0
- package/dist/skill-registry/messages.js +177 -0
- package/dist/skill-registry/package.js +275 -0
- package/dist/skill-registry/platform-package.js +100 -0
- package/dist/utils/agent-api-client.js +185 -30
- package/dist/utils/environment-endpoints.js +17 -0
- package/dist/utils/playcraft-http-client.js +6 -4
- package/dist/utils/tool-operation-journal.js +124 -0
- package/dist/utils/video-evidence-git.js +81 -0
- package/dist/video-replication/client.js +222 -0
- package/dist/video-replication/comparison-evidence.js +149 -0
- package/dist/video-replication/comparison-files.js +57 -0
- package/dist/video-replication/comparison-log.js +72 -0
- package/dist/video-replication/comparison-messages.js +104 -0
- package/dist/video-replication/comparison-output.js +63 -0
- package/dist/video-replication/comparison-preflight.js +66 -0
- package/dist/video-replication/comparison.js +216 -0
- package/dist/video-replication/evidence.js +165 -0
- package/dist/video-replication/media.js +111 -0
- package/dist/video-replication/messages.js +89 -0
- package/dist/workspace/messages.js +35 -0
- package/dist/workspace/transfer-client.js +174 -0
- package/dist/workspace-runtime/codex/app-server.js +1040 -0
- package/dist/workspace-runtime/codex/compact.js +46 -0
- package/dist/workspace-runtime/codex/config-toml.js +107 -0
- package/dist/workspace-runtime/codex/jsonrpc-stdio.js +145 -0
- package/dist/workspace-runtime/codex/launcher-client.js +177 -0
- package/dist/workspace-runtime/codex/loopback.js +146 -0
- package/dist/workspace-runtime/codex/mcp-config.js +39 -0
- package/dist/workspace-runtime/codex/model-broker.js +263 -0
- package/dist/workspace-runtime/codex/native-adapter.js +9 -0
- package/dist/workspace-runtime/codex/permissions.js +70 -0
- package/dist/workspace-runtime/codex/thread-image.js +38 -0
- package/dist/workspace-runtime/codex/ui-instructions.js +4 -0
- package/dist/workspace-runtime/codex/ui-tools.js +183 -0
- package/dist/workspace-runtime/codex/work-mode.js +15 -0
- package/dist/workspace-runtime/main.js +10 -0
- package/dist/workspace-runtime/persistence/journal.js +358 -0
- package/dist/workspace-runtime/persistence/native-subagents.js +162 -0
- package/dist/workspace-runtime/persistence/sqlite-client.js +77 -0
- package/dist/workspace-runtime/persistence/sqlite-worker.js +1161 -0
- package/dist/workspace-runtime/persistence/stopped-execution.js +77 -0
- package/dist/workspace-runtime/previews/output.js +36 -0
- package/dist/workspace-runtime/previews/publish.js +262 -0
- package/dist/workspace-runtime/previews/single-file.js +43 -0
- package/dist/workspace-runtime/processes/managed-writes.js +69 -0
- package/dist/workspace-runtime/production/contracts.js +19 -0
- package/dist/workspace-runtime/production/controller.js +218 -0
- package/dist/workspace-runtime/production/dependencies.js +60 -0
- package/dist/workspace-runtime/production/native.js +212 -0
- package/dist/workspace-runtime/production/processes.js +102 -0
- package/dist/workspace-runtime/production/save-command.js +35 -0
- package/dist/workspace-runtime/production/source-archive.js +137 -0
- package/dist/workspace-runtime/production/source-copy.js +91 -0
- package/dist/workspace-runtime/production/stages.js +303 -0
- package/dist/workspace-runtime/production/storage.js +60 -0
- package/dist/workspace-runtime/serve.js +214 -0
- package/dist/workspace-runtime/server/auth.js +21 -0
- package/dist/workspace-runtime/server/connectivity.js +201 -0
- package/dist/workspace-runtime/server/desktop-host.js +429 -0
- package/dist/workspace-runtime/server/desktop-preview-config.js +81 -0
- package/dist/workspace-runtime/server/desktop-preview-service.js +157 -0
- package/dist/workspace-runtime/server/desktop-preview-static.js +53 -0
- package/dist/workspace-runtime/server/desktop-preview.js +189 -0
- package/dist/workspace-runtime/server/dispatch.js +1217 -0
- package/dist/workspace-runtime/server/endpoints.js +21 -0
- package/dist/workspace-runtime/server/execution-group.js +90 -0
- package/dist/workspace-runtime/server/http.js +1243 -0
- package/dist/workspace-runtime/server/lock.js +53 -0
- package/dist/workspace-runtime/server/rfb-watch-gate.js +168 -0
- package/dist/workspace-runtime/server/source-uploader.js +138 -0
- package/dist/workspace-runtime/server/terminal-host.js +366 -0
- package/dist/workspace-runtime/server/types.js +1 -0
- package/dist/workspace-runtime/server/workspace-transfer.js +99 -0
- package/dist/workspace-runtime/workspaces/archive.js +207 -0
- package/dist/workspace-runtime/workspaces/artifact-events.js +55 -0
- package/dist/workspace-runtime/workspaces/artifact-files.js +197 -0
- package/dist/workspace-runtime/workspaces/artifact-receipts.js +89 -0
- package/dist/workspace-runtime/workspaces/artifacts.js +282 -0
- package/dist/workspace-runtime/workspaces/attachment-content.js +123 -0
- package/dist/workspace-runtime/workspaces/attachments.js +185 -0
- package/dist/workspace-runtime/workspaces/batch-commit.js +142 -0
- package/dist/workspace-runtime/workspaces/cli-context.js +23 -0
- package/dist/workspace-runtime/workspaces/cli-credentials.js +111 -0
- package/dist/workspace-runtime/workspaces/composer-context.js +147 -0
- package/dist/workspace-runtime/workspaces/context-error.js +2 -0
- package/dist/workspace-runtime/workspaces/dependencies.js +264 -0
- package/dist/workspace-runtime/workspaces/developer-command.js +64 -0
- package/dist/workspace-runtime/workspaces/directories.js +133 -0
- package/dist/workspace-runtime/workspaces/directory-access.js +37 -0
- package/dist/workspace-runtime/workspaces/directory-attachments.js +245 -0
- package/dist/workspace-runtime/workspaces/directory-maintenance.js +111 -0
- package/dist/workspace-runtime/workspaces/directory-stats.js +49 -0
- package/dist/workspace-runtime/workspaces/disk-snapshot.js +31 -0
- package/dist/workspace-runtime/workspaces/empty-template.js +42 -0
- package/dist/workspace-runtime/workspaces/files-search.js +116 -0
- package/dist/workspace-runtime/workspaces/files.js +120 -0
- package/dist/workspace-runtime/workspaces/git-credential-broker.js +312 -0
- package/dist/workspace-runtime/workspaces/git-credential-helper.js +68 -0
- package/dist/workspace-runtime/workspaces/git-direct-store.js +155 -0
- package/dist/workspace-runtime/workspaces/git.js +670 -0
- package/dist/workspace-runtime/workspaces/instructions.js +56 -0
- package/dist/workspace-runtime/workspaces/json5-edit.js +170 -0
- package/dist/workspace-runtime/workspaces/library-attachments.js +268 -0
- package/dist/workspace-runtime/workspaces/optional-platform-skills.js +14 -0
- package/dist/workspace-runtime/workspaces/parameters.js +272 -0
- package/dist/workspace-runtime/workspaces/prepare.js +278 -0
- package/dist/workspace-runtime/workspaces/registry.js +251 -0
- package/dist/workspace-runtime/workspaces/remix-references.js +301 -0
- package/dist/workspace-runtime/workspaces/revisions.js +31 -0
- package/dist/workspace-runtime/workspaces/session-image.js +104 -0
- package/dist/workspace-runtime/workspaces/shared-git.js +40 -0
- package/dist/workspace-runtime/workspaces/skill-artifact-loader.js +95 -0
- package/dist/workspace-runtime/workspaces/skills.js +191 -0
- package/dist/workspace-runtime/workspaces/transfer.js +288 -0
- package/dist/workspace-runtime/workspaces/turn-changes.js +75 -0
- package/dist/workspace-runtime/workspaces/video-attachments.js +49 -0
- package/package.json +15 -5
- package/project-template/.claude/agents/refs/ta-image-generation-detail.md +123 -67
- package/project-template/.claude/skills/playcraft-image-generation/SKILL.md +44 -105
- package/project-template/.claude/skills/playcraft-image-generation/reference/gen-batch-sprite.template.mjs +33 -42
- package/project-template/.claude/skills/playcraft-image-generation/reference/gen-batch.template.mjs +20 -18
- package/project-template/.claude/skills/playcraft-image-generation/reference/process-batch.template.mjs +7 -6
- package/project-template/.claude/skills/playcraft-image-generation/reference/prompt-cookbook.md +39 -36
- package/project-template/.claude/skills/playcraft-replica-validation/SKILL.md +25 -0
- package/project-template/.claude/skills/playcraft-replica-validation/references/contracts.md +79 -0
- package/project-template/.claude/skills/playcraft-video-understanding/SKILL.md +29 -0
- package/project-template/.claude/skills/playcraft-video-understanding/references/contracts.md +37 -0
- package/project-template-v2/.claude/agents/artist.md +82 -0
- package/project-template-v2/.claude/agents/developer.md +153 -0
- package/project-template-v2/.claude/agents/game-designer.md +264 -0
- package/project-template-v2/.claude/agents/refs/artist-art-style-catalog.md +533 -0
- package/project-template-v2/.claude/agents/refs/artist-color-audio-recipes.md +153 -0
- package/project-template-v2/.claude/agents/refs/artist-dimension-axis.md +27 -0
- package/project-template-v2/.claude/agents/refs/artist-master-composite-recipes.md +208 -0
- package/project-template-v2/.claude/agents/refs/atom-skill-library.md +81 -0
- package/project-template-v2/.claude/agents/refs/developer-impl-cookbook.md +432 -0
- package/project-template-v2/.claude/agents/refs/framework-5-component-filter.md +252 -0
- package/project-template-v2/.claude/agents/refs/framework-game-feel-juice.md +266 -0
- package/project-template-v2/.claude/agents/refs/framework-mda.md +147 -0
- package/project-template-v2/.claude/agents/refs/game-designer-gameplay-sufficiency.md +123 -0
- package/project-template-v2/.claude/agents/refs/ta-3d-flip-recipe.md +88 -0
- package/project-template-v2/.claude/agents/refs/ta-atlas-deliverable-standard.md +67 -0
- package/project-template-v2/.claude/agents/refs/ta-batch-pipeline-recipes.md +120 -0
- package/project-template-v2/.claude/agents/refs/ta-image-generation-detail.md +300 -0
- package/project-template-v2/.claude/agents/refs/ta-image-ops-reference.md +495 -0
- package/project-template-v2/.claude/agents/refs/ta-pipeline-cookbook.md +1141 -0
- package/project-template-v2/.claude/agents/refs/ta-tools-reference.md +111 -0
- package/project-template-v2/.claude/agents/refs/ta-vfx-preset-catalog.md +365 -0
- package/project-template-v2/.claude/agents/refs/threejs-cannon-pitfalls.md +412 -0
- package/project-template-v2/.claude/agents/reviewer.md +75 -0
- package/project-template-v2/.claude/agents/technical-artist.md +86 -0
- package/project-template-v2/.claude/hooks/snapshot-milestone.mjs +243 -0
- package/project-template-v2/.claude/hooks/user-prompt.mjs +133 -0
- package/project-template-v2/.claude/settings.json +33 -0
- package/project-template-v2/.claude/skills/brainstorming/SKILL.md +161 -0
- package/project-template-v2/.claude/skills/brainstorming/scripts/frame-template.html +270 -0
- package/project-template-v2/.claude/skills/brainstorming/scripts/helper.js +177 -0
- package/project-template-v2/.claude/skills/brainstorming/scripts/server.cjs +354 -0
- package/project-template-v2/.claude/skills/brainstorming/scripts/start-server.sh +148 -0
- package/project-template-v2/.claude/skills/brainstorming/scripts/stop-server.sh +56 -0
- package/project-template-v2/.claude/skills/brainstorming/scripts/wait-for-selection.sh +62 -0
- package/project-template-v2/.claude/skills/brainstorming/spec-document-reviewer-prompt.md +49 -0
- package/project-template-v2/.claude/skills/brainstorming/visual-companion.md +309 -0
- package/project-template-v2/.claude/skills/playcraft-ad-psychology/SKILL.md +182 -0
- package/project-template-v2/.claude/skills/playcraft-art-style-guide/SKILL.md +123 -0
- package/project-template-v2/.claude/skills/playcraft-asset-state-sheet/SKILL.md +205 -0
- package/project-template-v2/.claude/skills/playcraft-audio-generation/SKILL.md +280 -0
- package/project-template-v2/.claude/skills/playcraft-batch-pipeline/SKILL.md +184 -0
- package/project-template-v2/.claude/skills/playcraft-build-optimizer/SKILL.md +306 -0
- package/project-template-v2/.claude/skills/playcraft-image-generation/SKILL.md +298 -0
- package/project-template-v2/.claude/skills/playcraft-image-generation/reference/build-sprite-sheet.template.mjs +123 -0
- package/project-template-v2/.claude/skills/playcraft-image-generation/reference/compare-style.template.mjs +254 -0
- package/project-template-v2/.claude/skills/playcraft-image-generation/reference/gen-batch-sprite.template.mjs +324 -0
- package/project-template-v2/.claude/skills/playcraft-image-generation/reference/gen-batch.template.mjs +97 -0
- package/project-template-v2/.claude/skills/playcraft-image-generation/reference/gen-edit-variants.template.mjs +118 -0
- package/project-template-v2/.claude/skills/playcraft-image-generation/reference/process-batch.template.mjs +137 -0
- package/project-template-v2/.claude/skills/playcraft-image-generation/reference/prompt-cookbook.md +397 -0
- package/project-template-v2/.claude/skills/playcraft-image-generation/reference/validate-sprite-sheet.template.mjs +296 -0
- package/project-template-v2/.claude/skills/playcraft-image-ops/SKILL.md +122 -0
- package/project-template-v2/.claude/skills/playcraft-image-processing/SKILL.md +219 -0
- package/project-template-v2/.claude/skills/playcraft-masking/SKILL.md +373 -0
- package/project-template-v2/.claude/skills/playcraft-playable-optimization/SKILL.md +161 -0
- package/project-template-v2/.claude/skills/playcraft-research/SKILL.md +215 -0
- package/project-template-v2/.claude/skills/playcraft-skill-recommender/SKILL.md +382 -0
- package/project-template-v2/.claude/skills/playcraft-sprite-generation/SKILL.md +423 -0
- package/project-template-v2/.claude/skills/playcraft-sprite-remix/SKILL.md +158 -0
- package/project-template-v2/.claude/skills/playcraft-sprite-sheet/SKILL.md +100 -0
- package/project-template-v2/.claude/skills/playcraft-storyboard/SKILL.md +167 -0
- package/project-template-v2/.claude/skills/playcraft-style-qa/SKILL.md +270 -0
- package/project-template-v2/.claude/skills/playcraft-text-rendering/SKILL.md +236 -0
- package/project-template-v2/.claude/skills/playcraft-vfx-animation/SKILL.md +130 -0
- package/project-template-v2/.claude/skills/playwright-cli/SKILL.md +390 -0
- package/project-template-v2/.claude/skills/playwright-cli/references/element-attributes.md +23 -0
- package/project-template-v2/.claude/skills/playwright-cli/references/playwright-tests.md +39 -0
- package/project-template-v2/.claude/skills/playwright-cli/references/request-mocking.md +87 -0
- package/project-template-v2/.claude/skills/playwright-cli/references/running-code.md +240 -0
- package/project-template-v2/.claude/skills/playwright-cli/references/session-management.md +226 -0
- package/project-template-v2/.claude/skills/playwright-cli/references/spec-driven-testing.md +308 -0
- package/project-template-v2/.claude/skills/playwright-cli/references/storage-state.md +275 -0
- package/project-template-v2/.claude/skills/playwright-cli/references/test-generation.md +134 -0
- package/project-template-v2/.claude/skills/playwright-cli/references/tracing.md +142 -0
- package/project-template-v2/.claude/skills/playwright-cli/references/video-recording.md +153 -0
- package/project-template-v2/.claude/skills/session-analyzer/SKILL.md +386 -0
- package/project-template-v2/.claude/skills/session-analyzer/scripts/execution-breakdown.mjs +182 -0
- package/project-template-v2/.claude/skills/session-analyzer/scripts/find-turns.mjs +72 -0
- package/project-template-v2/.claude/skills/session-analyzer/scripts/heavy-output.mjs +121 -0
- package/project-template-v2/.claude/skills/session-analyzer/scripts/resolve-session.mjs +102 -0
- package/project-template-v2/.claude/skills/session-analyzer/scripts/subagent-stats.mjs +127 -0
- package/project-template-v2/.claude/skills/session-analyzer/scripts/subagent-tool-timeline.mjs +106 -0
- package/project-template-v2/.claude/skills/session-analyzer/scripts/time-gaps.mjs +128 -0
- package/project-template-v2/.claude/skills/session-analyzer/scripts/turn-timeline.mjs +67 -0
- package/project-template-v2/.claude/snapshot.mjs +263 -0
- package/project-template-v2/.playcraft/skills.lock.json +152 -0
- package/project-template-v2/CLAUDE.md +146 -0
- package/project-template-v2/assets/audio/bgm/.gitkeep +0 -0
- package/project-template-v2/assets/audio/sfx/.gitkeep +0 -0
- package/project-template-v2/assets/bundles/.gitkeep +0 -0
- package/project-template-v2/assets/images/bg/.gitkeep +0 -0
- package/project-template-v2/assets/images/reference/.gitkeep +0 -0
- package/project-template-v2/assets/images/storyboard/.gitkeep +0 -0
- package/project-template-v2/assets/images/tiles/.gitkeep +0 -0
- package/project-template-v2/assets/images/ui/.gitkeep +0 -0
- package/project-template-v2/assets/images/vfx/.gitkeep +0 -0
- package/project-template-v2/assets/models/.gitkeep +0 -0
- package/project-template-v2/docs/harness/iteration-1/context-flow.md +254 -0
- package/project-template-v2/docs/harness/iteration-1/generate-flow.md +91 -0
- package/project-template-v2/docs/harness/iteration-1/ideate-flow.md +214 -0
- package/project-template-v2/docs/harness/iteration-1/optimize-flow.md +75 -0
- package/project-template-v2/docs/harness/iteration-1/wrapup-flow.md +63 -0
- package/project-template-v2/docs/harness/iteration-2/context-flow.md +223 -0
- package/project-template-v2/docs/harness/iteration-2/generate-flow.md +129 -0
- package/project-template-v2/docs/harness/iteration-2/ideate-flow.md +267 -0
- package/project-template-v2/docs/harness/iteration-2/optimize-flow.md +164 -0
- package/project-template-v2/docs/harness/iteration-2/wrapup-flow.md +115 -0
- package/project-template-v2/docs/harness/orchestrator-flow.md +364 -0
- package/project-template-v2/docs/project-state.json +60 -0
- package/project-template-v2/docs/project-state.md +72 -0
- package/project-template-v2/docs/standards/README.md +225 -0
- package/project-template-v2/docs/standards/agent-behavior-standards.md +174 -0
- package/project-template-v2/docs/standards/artifacts/design-brief.md +19 -0
- package/project-template-v2/docs/standards/artifacts/design.md +22 -0
- package/project-template-v2/docs/standards/artifacts/game-code.md +41 -0
- package/project-template-v2/docs/standards/artifacts/todo-list.md +41 -0
- package/project-template-v2/docs/standards/iter1-agent-behavior-standards.md +343 -0
- package/project-template-v2/game/index.ts +18 -0
- package/project-template-v2/globals.d.ts +51 -0
- package/project-template-v2/index.css +34 -0
- package/project-template-v2/index.html +18 -0
- package/project-template-v2/main.ts +9 -0
- package/project-template-v2/package.json +46 -0
- package/project-template-v2/skills/_shared/scripts/dispatch-clear.mjs +31 -0
- package/project-template-v2/skills/_shared/scripts/dispatch-set.mjs +86 -0
- package/project-template-v2/skills/_shared/scripts/dod-check.mjs +153 -0
- package/project-template-v2/skills/_shared/scripts/handoff-append.mjs +70 -0
- package/project-template-v2/skills/_shared/scripts/lib/validator-artifacts.mjs +91 -0
- package/project-template-v2/skills/_shared/scripts/pipeline/dod-config.mjs +131 -0
- package/project-template-v2/skills/_shared/scripts/pipeline/index.mjs +80 -0
- package/project-template-v2/skills/_shared/scripts/pipeline/iteration-1-core.mjs +90 -0
- package/project-template-v2/skills/_shared/scripts/pipeline/iteration-2-wrap.mjs +93 -0
- package/project-template-v2/skills/_shared/scripts/pipeline/iteration-3-visual.mjs +23 -0
- package/project-template-v2/skills/_shared/scripts/render-project-state.mjs +230 -0
- package/project-template-v2/skills/_shared/scripts/state-advance-stage.mjs +58 -0
- package/project-template-v2/skills/_shared/scripts/state-get.mjs +339 -0
- package/project-template-v2/skills/_shared/scripts/state-handoff.mjs +39 -0
- package/project-template-v2/skills/_shared/scripts/state-set.mjs +94 -0
- package/project-template-v2/skills/_shared/scripts/state-store.mjs +783 -0
- package/project-template-v2/skills/_shared/scripts/todo-add.mjs +88 -0
- package/project-template-v2/skills/_shared/scripts/todo-get.mjs +130 -0
- package/project-template-v2/skills/_shared/scripts/todo-remove.mjs +33 -0
- package/project-template-v2/skills/_shared/scripts/todo-set.mjs +47 -0
- package/project-template-v2/skills/_shared/scripts/verify-asset-code-sync.mjs +268 -0
- package/project-template-v2/skills/_shared/scripts/verify-env.mjs +285 -0
- package/project-template-v2/skills/_shared/scripts/verify-placeholders.mjs +161 -0
- package/project-template-v2/skills/playable-autoplay/SKILL.md +176 -0
- package/project-template-v2/skills/playable-autoplay/agents/openai.yaml +4 -0
- package/project-template-v2/skills/playable-debug/SKILL.md +116 -0
- package/project-template-v2/skills/playable-debug/agents/openai.yaml +4 -0
- package/project-template-v2/skills/playable-debug/references/debug-config.md +40 -0
- package/project-template-v2/skills/playable-record/SKILL.md +140 -0
- package/project-template-v2/skills/playable-record/scripts/lib/dev-server.mjs +104 -0
- package/project-template-v2/skills/playable-record/scripts/lib/record-audio-bridge.js +141 -0
- package/project-template-v2/skills/playable-record/scripts/record-playable.mjs +425 -0
- package/project-template-v2/skills/playable-record/scripts/verify-contract.mjs +261 -0
- package/project-template-v2/skills/playable-record/scripts/verify-firstwin.mjs +398 -0
- package/project-template-v2/skills/playable-record/scripts/verify-fusion.mjs +322 -0
- package/project-template-v2/skills/playable-record/scripts/verify-lifecycle.mjs +105 -0
- package/project-template-v2/skills/playable-record/scripts/verify-vlm-video.mjs +230 -0
- package/project-template-v2/skills/playable-validate/SKILL.md +61 -0
- package/project-template-v2/skills/playable-validate/validation-rules.md +14 -0
- package/project-template-v2/skills/playable-verify-ui/SKILL.md +63 -0
- package/project-template-v2/skills/playable-verify-ui/scripts/lib/__init__.py +1 -0
- package/project-template-v2/skills/playable-verify-ui/scripts/lib/config_expr.js +218 -0
- package/project-template-v2/skills/playable-verify-ui/scripts/lib/node_utils.js +51 -0
- package/project-template-v2/skills/playable-verify-ui/scripts/lib/profile_loader.py +59 -0
- package/project-template-v2/skills/playable-verify-ui/scripts/lib/report.py +106 -0
- package/project-template-v2/skills/playable-verify-ui/scripts/lib/runtime_contract.js +116 -0
- package/project-template-v2/skills/playable-verify-ui/scripts/verify_fetch_antipatterns.py +59 -0
- package/project-template-v2/skills/playable-verify-ui/scripts/verify_hardcoded_layout.js +64 -0
- package/project-template-v2/skills/playable-verify-ui/scripts/verify_runtime_contract.js +58 -0
- package/project-template-v2/skills/playable-verify-ui/scripts/verify_text_overlap.py +333 -0
- package/project-template-v2/ta-workspace/scripts/.gitkeep +0 -0
- package/project-template-v2/tsconfig.json +20 -0
- package/project-template-v2/vite.config.ts +27 -0
- package/project-templates/batch-locks/phaser.yaml +922 -0
- package/project-templates/batch-locks/threejs.yaml +978 -0
- package/project-templates/empty/AGENTS.md +41 -0
- package/project-templates/empty/gitignore +33 -0
- package/project-templates/phaser/.claude/agents/refs/ta-image-generation-detail.md +59 -59
- package/project-templates/phaser/.claude/skills/playcraft-image-generation/SKILL.md +44 -105
- package/project-templates/phaser/.claude/skills/playcraft-image-generation/reference/gen-batch-sprite.template.mjs +33 -42
- package/project-templates/phaser/.claude/skills/playcraft-image-generation/reference/gen-batch.template.mjs +20 -18
- package/project-templates/phaser/.claude/skills/playcraft-image-generation/reference/process-batch.template.mjs +7 -6
- package/project-templates/phaser/.claude/skills/playcraft-image-generation/reference/prompt-cookbook.md +39 -36
- package/project-templates/threejs/.claude/agents/refs/ta-image-generation-detail.md +59 -59
- package/project-templates/threejs/.claude/skills/playcraft-image-generation/SKILL.md +44 -105
- package/project-templates/threejs/.claude/skills/playcraft-image-generation/reference/gen-batch-sprite.template.mjs +33 -42
- package/project-templates/threejs/.claude/skills/playcraft-image-generation/reference/gen-batch.template.mjs +20 -18
- package/project-templates/threejs/.claude/skills/playcraft-image-generation/reference/process-batch.template.mjs +7 -6
- package/project-templates/threejs/.claude/skills/playcraft-image-generation/reference/prompt-cookbook.md +39 -36
- package/dist/commands/tools-image-context.js +0 -23
- package/dist/utils/image-asset-context.js +0 -105
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// ============================================================
|
|
2
|
-
// gen-batch-sprite.template.mjs — 精灵图直出脚本模板
|
|
2
|
+
// gen-batch-sprite.template.mjs — gpt-image-2 精灵图直出脚本模板
|
|
3
3
|
//
|
|
4
|
-
//
|
|
4
|
+
// 核心原则:让 gpt-image-2 一次 API 调用直接生成包含多个元素的
|
|
5
5
|
// 网格精灵图,然后用 sprite-split 切分。比逐个生成效率高 N 倍。
|
|
6
6
|
//
|
|
7
7
|
// 适用场景:
|
|
@@ -34,11 +34,11 @@ function playcraft(args, { capture = false, timeout } = {}) {
|
|
|
34
34
|
// ============ CONFIG — 修改这里 ============
|
|
35
35
|
const CONFIG = {
|
|
36
36
|
/**
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
37
|
+
* 精灵图直出模型:永远用 gpt-image-2(图像理解 + 布局能力最强)
|
|
38
|
+
* mulerouter 质量更高(建议作为主模型),iegg 更快(备用)
|
|
39
|
+
* 注意:精灵图生成比单图慢,通常需要 90-150s,timeout 设 240 以上
|
|
40
40
|
*/
|
|
41
|
-
model: '
|
|
41
|
+
model: 'mulerouter/gpt-image-2',
|
|
42
42
|
|
|
43
43
|
/**
|
|
44
44
|
* 每批精灵图的列数
|
|
@@ -64,20 +64,21 @@ const CONFIG = {
|
|
|
64
64
|
/**
|
|
65
65
|
* 通用风格描述(追加到每个批次 prompt 末尾)
|
|
66
66
|
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
67
|
+
* 元素需要透明背景(独立元素:角色/车/道具/图标)→ 绿幕策略:
|
|
68
|
+
* style: 'flat 2D illustration, isolated on solid bright green #00FF00 background, centered, no shadow'
|
|
69
|
+
* removeBg: true (切分后逐帧去背景)
|
|
70
|
+
*
|
|
71
|
+
* 元素本身就是矩形(卡牌/棋子/UI 面板)→ 白底策略:
|
|
72
|
+
* style: 'flat 2D, white background, no shadow, no drop shadow, clean edges'
|
|
73
|
+
* removeBg: false
|
|
69
74
|
*/
|
|
70
|
-
style: 'flat 2D illustration, isolated
|
|
75
|
+
style: 'flat 2D illustration, isolated on solid bright green #00FF00 background, centered, no shadow',
|
|
71
76
|
/**
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
*
|
|
77
|
+
* 切分后是否对每帧执行 remove-background(绿幕去背景)
|
|
78
|
+
* true → 独立元素(需透明通道):remove-background --tolerance 25
|
|
79
|
+
* false → 卡牌/UI 面板等矩形元素:直接 resize,不去背景
|
|
75
80
|
*/
|
|
76
81
|
removeBg: true,
|
|
77
|
-
backgroundMode: 'automatic',
|
|
78
|
-
/** 独立色幕才使用;按主体颜色选择,金/黄/橙/绿用蓝幕,蓝/紫用绿幕。 */
|
|
79
|
-
chromaColor: '#00FF00',
|
|
80
|
-
chromaTolerance: 25,
|
|
81
82
|
|
|
82
83
|
/**
|
|
83
84
|
* 切分单元尺寸(像素)。留空(null)= 自动按精灵图实际像素尺寸 ÷ 网格推导(推荐)。
|
|
@@ -118,7 +119,7 @@ const BATCHES = [
|
|
|
118
119
|
// ============ 精灵图 Prompt 构建器 ============
|
|
119
120
|
/**
|
|
120
121
|
* 根据 items 列表构建精灵图网格 prompt
|
|
121
|
-
*
|
|
122
|
+
* 关键词组合让 gpt-image-2 理解"网格布局"意图
|
|
122
123
|
*/
|
|
123
124
|
/**
|
|
124
125
|
* 读取精灵图实际像素尺寸(用于自动推导切分单元尺寸)。
|
|
@@ -137,7 +138,7 @@ function readSheetDims(sheetPath) {
|
|
|
137
138
|
return null;
|
|
138
139
|
}
|
|
139
140
|
|
|
140
|
-
function buildSpriteSheetPrompt(items, columns,
|
|
141
|
+
function buildSpriteSheetPrompt(items, columns, style, removeBg) {
|
|
141
142
|
const actualRows = Math.ceil(items.length / columns);
|
|
142
143
|
const cellDescs = items.map((item, i) => {
|
|
143
144
|
const col = (i % columns) + 1;
|
|
@@ -145,13 +146,10 @@ function buildSpriteSheetPrompt(items, columns, config) {
|
|
|
145
146
|
return `[Row${row},Col${col}]: ${item.desc}`;
|
|
146
147
|
}).join('; ');
|
|
147
148
|
|
|
148
|
-
//
|
|
149
|
-
const
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
? `Each element isolated on a uniform solid ${config.chromaColor} background, no shadow, no gradient background.`
|
|
153
|
-
: nativeBackground ? ''
|
|
154
|
-
: 'Render all foreground elements on a uniform solid pure white background for subsequent background removal. Preserve all elements, text, white details, colors and style.';
|
|
149
|
+
// 绿幕模式强制在 prompt 里明确背景色,避免模型用白底
|
|
150
|
+
const bgInstruction = removeBg
|
|
151
|
+
? 'Each element isolated on solid bright green #00FF00 background, no shadow, no gradient background.'
|
|
152
|
+
: 'Each element on clean white background.';
|
|
155
153
|
|
|
156
154
|
return [
|
|
157
155
|
`Sprite sheet grid layout, ${columns} columns × ${actualRows} rows.`,
|
|
@@ -159,19 +157,13 @@ function buildSpriteSheetPrompt(items, columns, config) {
|
|
|
159
157
|
bgInstruction,
|
|
160
158
|
`Grid layout, uniform cell size, equal spacing, elements perfectly centered in each cell.`,
|
|
161
159
|
`No borders between cells, no labels, no numbers on cells.`,
|
|
162
|
-
|
|
163
|
-
].
|
|
160
|
+
style,
|
|
161
|
+
].join(' ');
|
|
164
162
|
}
|
|
165
163
|
|
|
166
164
|
// ============ LOGIC — 通常不需要修改 ============
|
|
167
165
|
|
|
168
166
|
const LOG_FILE = 'ta-workspace/logs/gen-batch-sprite.log';
|
|
169
|
-
if (!['automatic', 'chroma'].includes(CONFIG.backgroundMode)) {
|
|
170
|
-
throw new Error('backgroundMode must be automatic or chroma.');
|
|
171
|
-
}
|
|
172
|
-
if (CONFIG.backgroundMode === 'chroma' && !/^#[\da-f]{6}$/i.test(CONFIG.chromaColor)) {
|
|
173
|
-
throw new Error('chromaColor must be one six-digit hex color.');
|
|
174
|
-
}
|
|
175
167
|
mkdirSync(CONFIG.sheetDir, { recursive: true });
|
|
176
168
|
mkdirSync(CONFIG.outputDir, { recursive: true });
|
|
177
169
|
mkdirSync('ta-workspace/logs', { recursive: true });
|
|
@@ -198,7 +190,7 @@ for (let bi = 0; bi < BATCHES.length; bi++) {
|
|
|
198
190
|
log(`[SKIP-SHEET] (${bi + 1}/${BATCHES.length}) ${batch.sheetName} already exists`);
|
|
199
191
|
} else {
|
|
200
192
|
log(`[GEN-SHEET ] (${bi + 1}/${BATCHES.length}) Generating ${batch.sheetName} (${batch.items.length} elements)`);
|
|
201
|
-
const prompt = buildSpriteSheetPrompt(batch.items, CONFIG.columns, CONFIG);
|
|
193
|
+
const prompt = buildSpriteSheetPrompt(batch.items, CONFIG.columns, CONFIG.style, CONFIG.removeBg);
|
|
202
194
|
|
|
203
195
|
try {
|
|
204
196
|
playcraft(
|
|
@@ -208,9 +200,9 @@ for (let bi = 0; bi < BATCHES.length; bi++) {
|
|
|
208
200
|
'--output', sheetPath,
|
|
209
201
|
'--aspect-ratio', CONFIG.aspectRatio,
|
|
210
202
|
'--image-model', CONFIG.model,
|
|
211
|
-
|
|
212
|
-
? '--remove-background' : '--no-remove-background',
|
|
203
|
+
'--timeout', '240',
|
|
213
204
|
],
|
|
205
|
+
{ timeout: 300_000 },
|
|
214
206
|
);
|
|
215
207
|
log(`[OK-SHEET ] ${batch.sheetName}`);
|
|
216
208
|
} catch (e) {
|
|
@@ -277,11 +269,10 @@ for (let bi = 0; bi < BATCHES.length; bi++) {
|
|
|
277
269
|
continue;
|
|
278
270
|
}
|
|
279
271
|
|
|
280
|
-
// ── Step 3:
|
|
272
|
+
// ── Step 3: 重命名(+可选绿幕去背景)切分结果到最终位置 ─────────
|
|
281
273
|
// 任何缺帧 / 处理失败都视为该批次失败(FAIL,不是 WARN):一个不完整的
|
|
282
274
|
// 批次绝不能被报成 OK-BATCH,否则下游会拿到缺图的资产集。
|
|
283
|
-
|
|
284
|
-
log(`[RENAME ] Renaming ${batch.items.length} cells${removeCellBackground ? ' + remove-background' : ''}`);
|
|
275
|
+
log(`[RENAME ] Renaming ${batch.items.length} cells${CONFIG.removeBg ? ' + remove-background' : ''}`);
|
|
285
276
|
let processedOk = 0;
|
|
286
277
|
let batchFailed = false;
|
|
287
278
|
for (let j = 0; j < batch.items.length; j++) {
|
|
@@ -298,13 +289,13 @@ for (let bi = 0; bi < BATCHES.length; bi++) {
|
|
|
298
289
|
continue;
|
|
299
290
|
}
|
|
300
291
|
try {
|
|
301
|
-
if (
|
|
302
|
-
//
|
|
292
|
+
if (CONFIG.removeBg) {
|
|
293
|
+
// 绿幕去背景(tolerance 25 适合纯绿色 #00FF00 背景)
|
|
303
294
|
playcraft([
|
|
304
295
|
'image', 'remove-background',
|
|
305
296
|
'--input', srcPath,
|
|
306
297
|
'--output', dstPath,
|
|
307
|
-
'--tolerance',
|
|
298
|
+
'--tolerance', '25',
|
|
308
299
|
]);
|
|
309
300
|
} else {
|
|
310
301
|
copyFileSync(srcPath, dstPath);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// ============================================================
|
|
2
|
-
// gen-batch.template.mjs — 批量 AI
|
|
2
|
+
// gen-batch.template.mjs — 批量 AI 生图脚本模板
|
|
3
3
|
// 用途:从零批量生成一组风格一致的素材(reference-image 模式)
|
|
4
4
|
//
|
|
5
5
|
// 使用方式:
|
|
@@ -8,18 +8,22 @@
|
|
|
8
8
|
// 3. node ta-workspace/scripts/gen-<name>.mjs
|
|
9
9
|
// ============================================================
|
|
10
10
|
|
|
11
|
-
import {
|
|
11
|
+
import { execSync } from 'child_process';
|
|
12
12
|
import { existsSync, mkdirSync, appendFileSync } from 'fs';
|
|
13
13
|
|
|
14
14
|
// ============ CONFIG — 修改这里 ============
|
|
15
15
|
const CONFIG = {
|
|
16
16
|
/**
|
|
17
17
|
* 生图模型。
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
18
|
+
* - Phase 1 概念图(追求质量):用 gpt-image-2
|
|
19
|
+
* model: 'iegg-litellm/gpt-image-2'
|
|
20
|
+
* - Phase 2 批量(reference-image 一致性):用 google/,更稳定
|
|
21
|
+
* model: 'google/gemini-3.1-flash-image-preview'
|
|
22
|
+
*
|
|
23
|
+
* 后端按优先级自动 fallback 多个 provider,无需手动指定 provider。
|
|
24
|
+
* text+image CAPABILITY 的模型才支持 --reference-image
|
|
21
25
|
*/
|
|
22
|
-
model: '
|
|
26
|
+
model: 'google/gemini-3.1-flash-image-preview',
|
|
23
27
|
/** 概念图路径(确认过风格的样本,所有后续图的参考来源) */
|
|
24
28
|
referenceImage: 'assets/images/concept/approved_sample.png',
|
|
25
29
|
/** 输出目录 */
|
|
@@ -28,11 +32,9 @@ const CONFIG = {
|
|
|
28
32
|
aspectRatio: '1:1',
|
|
29
33
|
/**
|
|
30
34
|
* 统一风格描述(从 design-brief.md 复制,粘贴到每个 prompt 末尾)
|
|
31
|
-
* 示例:"flat 2D icon, vibrant colors, clean edges, no shadow"
|
|
35
|
+
* 示例:"flat 2D icon, vibrant colors, clean edges, white background, no shadow"
|
|
32
36
|
*/
|
|
33
37
|
style: '<从 design-brief 复制的统一风格描述>',
|
|
34
|
-
/** 最终透明设 true;完整场景或不透明牌面设 false。独立色幕使用精灵图模板。 */
|
|
35
|
-
removeBackground: true,
|
|
36
38
|
};
|
|
37
39
|
// ============ DATA — 定义要生成的素材列表 ============
|
|
38
40
|
const ITEMS = [
|
|
@@ -70,17 +72,17 @@ for (let i = 0; i < ITEMS.length; i++) {
|
|
|
70
72
|
|
|
71
73
|
log(`[GEN ] (${i + 1}/${ITEMS.length}) ${item.name}`);
|
|
72
74
|
|
|
73
|
-
const
|
|
74
|
-
const
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
75
|
+
const promptEscaped = `${item.desc}. ${CONFIG.style}`.replace(/"/g, '\\"');
|
|
76
|
+
const cmd =
|
|
77
|
+
`playcraft tools generate-image` +
|
|
78
|
+
` --prompt "${promptEscaped}"` +
|
|
79
|
+
` --output "${outPath}"` +
|
|
80
|
+
` --aspect-ratio ${CONFIG.aspectRatio}` +
|
|
81
|
+
` --reference-image "${CONFIG.referenceImage}"` +
|
|
82
|
+
` --image-model "${CONFIG.model}"`;
|
|
81
83
|
|
|
82
84
|
try {
|
|
83
|
-
|
|
85
|
+
execSync(cmd, { stdio: 'inherit', timeout: 120_000 });
|
|
84
86
|
done++;
|
|
85
87
|
log(`[OK ] ${item.name}`);
|
|
86
88
|
} catch (e) {
|
|
@@ -8,9 +8,10 @@
|
|
|
8
8
|
// 3. node ta-workspace/scripts/process-<name>.mjs
|
|
9
9
|
//
|
|
10
10
|
// 背景处理决策(修改 CONFIG.skipRemoveBg 前请阅读):
|
|
11
|
-
// -
|
|
12
|
-
//
|
|
13
|
-
//
|
|
11
|
+
// - 独立元素(角色/道具/图标)需透明背景 → skipRemoveBg = false(默认)
|
|
12
|
+
// 建议生图时 prompt 加 "on solid bright green #00FF00 background, isolated"
|
|
13
|
+
// - 卡牌/棋子/UI面板(矩形本体不需透明)→ skipRemoveBg = true
|
|
14
|
+
// 生图时 prompt 加 "flat 2D, no shadow, no 3D effect, clean edges"
|
|
14
15
|
// ============================================================
|
|
15
16
|
|
|
16
17
|
import { execSync } from 'child_process';
|
|
@@ -31,10 +32,10 @@ const CONFIG = {
|
|
|
31
32
|
targetH: 128,
|
|
32
33
|
/**
|
|
33
34
|
* 跳过去背景步骤
|
|
34
|
-
* -
|
|
35
|
-
* -
|
|
35
|
+
* - false(默认):执行 remove-background(绿幕素材/独立元素)
|
|
36
|
+
* - true:跳过,只做 trim + resize(卡牌/棋子等矩形本体素材)
|
|
36
37
|
*/
|
|
37
|
-
skipRemoveBg:
|
|
38
|
+
skipRemoveBg: false,
|
|
38
39
|
/**
|
|
39
40
|
* floodfill 容差(0–255)
|
|
40
41
|
* 绿幕背景建议 25;默认白背景可用 15
|
|
@@ -1,23 +1,21 @@
|
|
|
1
1
|
# Image Generation Prompt Cookbook
|
|
2
2
|
|
|
3
|
-
> 适用于 PlayCraft CLI
|
|
3
|
+
> 适用于 PlayCraft CLI `playcraft tools generate-image`。
|
|
4
4
|
> 所有模型均适用;gpt-image-2 类模型对英文 prompt 理解最准确,优先写英文。
|
|
5
5
|
|
|
6
|
-
透明交付通过 `removeBackground: true` / `--remove-background` 或目标字段配置表达。下方常规前景模板描述主体、文字、风格、构图与材质;源图背景遵循主文第 2 节:Image 2.5 由后端组装,不追加背景后缀;明确选用其他模型时,首次请求需追加单一 `on a uniform solid pure white background for subsequent background removal`。不要同时要求透明、白底与色幕。完整场景可以描述背景内容,矩形本体的白色牌面也应保留。独立色幕流程见主文第 3 节,中间图必须关闭自动去背。
|
|
7
|
-
|
|
8
6
|
---
|
|
9
7
|
|
|
10
8
|
## 一、Prompt 万能公式
|
|
11
9
|
|
|
12
10
|
```
|
|
13
|
-
[主体描述] + [风格/介质] + [构图/视角] + [
|
|
11
|
+
[主体描述] + [风格/介质] + [构图/视角] + [背景] + [质量修饰词]
|
|
14
12
|
```
|
|
15
13
|
|
|
16
14
|
**示例**:
|
|
17
15
|
|
|
18
16
|
```
|
|
19
17
|
A golden sword icon, flat 2D vector style, centered composition,
|
|
20
|
-
|
|
18
|
+
white background, clean crisp edges, game UI asset, high quality
|
|
21
19
|
```
|
|
22
20
|
|
|
23
21
|
---
|
|
@@ -28,13 +26,12 @@ isolated subject, clean crisp edges, game UI asset, high quality
|
|
|
28
26
|
|
|
29
27
|
```
|
|
30
28
|
A [物品名] icon, flat 2D vector illustration, bold outlines,
|
|
31
|
-
vibrant colors, centered composition,
|
|
29
|
+
vibrant colors, centered composition, white background,
|
|
32
30
|
no shadow, no gradient, game UI style, sharp crisp edges
|
|
33
31
|
```
|
|
34
32
|
|
|
35
33
|
- 关键词:`flat 2D` / `bold outlines` / `centered` / `no shadow` / `game UI style`
|
|
36
34
|
- 避免:`3D` / `realistic` / `photographic` / `drop shadow`
|
|
37
|
-
- 需要透明交付时传 `removeBackground: true` / `--remove-background`。
|
|
38
35
|
|
|
39
36
|
### 🃏 卡牌 / 棋子 / 方块(Rectangular Tiles)
|
|
40
37
|
|
|
@@ -53,11 +50,12 @@ sharp clean edges, centered on white background
|
|
|
53
50
|
```
|
|
54
51
|
A [角色描述] character, full body visible, game sprite style,
|
|
55
52
|
[艺术风格: pixel art / cartoon / chibi / realistic],
|
|
56
|
-
isolated
|
|
53
|
+
isolated on solid bright green #00FF00 background,
|
|
57
54
|
centered, facing forward / side view, clean silhouette
|
|
58
55
|
```
|
|
59
56
|
|
|
60
|
-
-
|
|
57
|
+
- 需要透明背景 → **绿幕策略**,prompt 加 `"on solid bright green #00FF00 background, isolated"`
|
|
58
|
+
- 后处理:`remove-background --tolerance 25`
|
|
61
59
|
|
|
62
60
|
### 🌄 场景背景(Backgrounds)
|
|
63
61
|
|
|
@@ -122,7 +120,7 @@ Grid layout, equal cell size, no borders between cells. Bold black ink for spade
|
|
|
122
120
|
**图标集示例**(一批 9 个图标):
|
|
123
121
|
|
|
124
122
|
```
|
|
125
|
-
Sprite sheet grid, 3 columns × 3 rows. Flat 2D game icon style,
|
|
123
|
+
Sprite sheet grid, 3 columns × 3 rows. Flat 2D game icon style, white background.
|
|
126
124
|
[Row1,Col1]: sword icon; [Row1,Col2]: shield icon; [Row1,Col3]: bow and arrow icon;
|
|
127
125
|
[Row2,Col1]: magic staff icon; [Row2,Col2]: potion bottle icon; [Row2,Col3]: scroll icon;
|
|
128
126
|
[Row3,Col1]: coin gold icon; [Row3,Col2]: gem diamond icon; [Row3,Col3]: key icon.
|
|
@@ -131,17 +129,17 @@ Each icon centered in its cell, bold outlines, vibrant colors, no shadow.
|
|
|
131
129
|
|
|
132
130
|
**背景选择(重要!)**:
|
|
133
131
|
|
|
134
|
-
| 素材类型 |
|
|
135
|
-
| ----------------------------------- |
|
|
136
|
-
| 独立元素(角色/车/道具/图标)需透明 |
|
|
137
|
-
| 卡牌/棋子/UI 面板(矩形本体) |
|
|
132
|
+
| 素材类型 | prompt 背景写法 | 切分后处理 |
|
|
133
|
+
| ----------------------------------- | --------------------------------------------------- | ---------------------------------- |
|
|
134
|
+
| 独立元素(角色/车/道具/图标)需透明 | `isolated on solid bright green #00FF00 background` | `remove-background --tolerance 25` |
|
|
135
|
+
| 卡牌/棋子/UI 面板(矩形本体) | `white background, no shadow` | 直接 resize,不去背景 |
|
|
138
136
|
|
|
139
137
|
**注意事项**:
|
|
140
138
|
|
|
141
139
|
- 每批最多 **4×4 = 16 个元素**,超过会出现混乱
|
|
142
140
|
- 每个格的描述要精确,包含特征性视觉元素
|
|
143
141
|
- 切分后用 `sprite-split --rows N --columns M` 按网格切分
|
|
144
|
-
- 模板:[gen-batch-sprite.template.mjs](gen-batch-sprite.template.mjs)
|
|
142
|
+
- 模板:[gen-batch-sprite.template.mjs](gen-batch-sprite.template.mjs)
|
|
145
143
|
|
|
146
144
|
---
|
|
147
145
|
|
|
@@ -185,7 +183,7 @@ gpt-image-2 是目前质量最高的文生图模型,prompt 套路略有不同
|
|
|
185
183
|
- **英文 prompt 效果最佳**,中文理解也不错但英文更稳定
|
|
186
184
|
- 对**复杂场景**、**细节描述**处理能力远超其他模型
|
|
187
185
|
- 支持**图生图 edit 模式**(传 `--reference-image`),局部编辑能力强
|
|
188
|
-
-
|
|
186
|
+
- 不支持透明 PNG 输出(ALPHA = no),需绿幕策略
|
|
189
187
|
|
|
190
188
|
### prompt 格式建议
|
|
191
189
|
|
|
@@ -272,8 +270,6 @@ playcraft tools generate-image \
|
|
|
272
270
|
>
|
|
273
271
|
> 注意:`figer_icon.aiimage`、`win_result_panel.aiimage` 等 atom Skills 提供了带参考图的生成配方,Game Designer `playcraft skills match` 能匹配到时优先使用。本节模板用于无对应 atom Skill 的场景。
|
|
274
272
|
|
|
275
|
-
下方独立界面前景通过 `removeBackground: true` / `--remove-background` 要求最终透明;模板描述主体,调用前按主文第 2 节补充适用于所选模型的源图背景。
|
|
276
|
-
|
|
277
273
|
### 🟠 CTA 按钮(Call-to-Action Button)
|
|
278
274
|
|
|
279
275
|
```
|
|
@@ -284,13 +280,13 @@ Important details: [bright orange / gold / green] gradient fill,
|
|
|
284
280
|
subtle drop shadow below button, glossy highlight on top edge,
|
|
285
281
|
3px white inner border, corners rounded radius 24px
|
|
286
282
|
Use case: Game ad install button, isolated asset, HTML5 playable ad
|
|
287
|
-
Constraints:
|
|
283
|
+
Constraints: Transparent background, no extra elements, centered, clean crisp edges,
|
|
288
284
|
no watermark
|
|
289
285
|
```
|
|
290
286
|
|
|
291
287
|
- CTA 颜色必须是游戏画面中**最少使用**的颜色(对比稀缺性原则)
|
|
292
288
|
- 触控目标区域 ≥ 48×48px,生成建议尺寸 360×120px(9:3 比例)
|
|
293
|
-
-
|
|
289
|
+
- 后处理:不需要去背景(直接生成透明背景或用绿幕)
|
|
294
290
|
|
|
295
291
|
---
|
|
296
292
|
|
|
@@ -303,7 +299,7 @@ Important details: [color] filled portion [80% of total width], unfilled portion
|
|
|
303
299
|
rounded end caps, thin outer frame in [darker shade],
|
|
304
300
|
optional inner glow on filled section
|
|
305
301
|
Use case: Game HUD progress indicator, isolated UI element
|
|
306
|
-
Constraints:
|
|
302
|
+
Constraints: Transparent background, horizontal orientation, no text labels,
|
|
307
303
|
clean edges, no watermark
|
|
308
304
|
```
|
|
309
305
|
|
|
@@ -321,7 +317,8 @@ Important details: warm skin tone, white sleeve cuff visible at wrist,
|
|
|
321
317
|
soft drop shadow beneath finger tip, friendly approachable style,
|
|
322
318
|
[optional: subtle animated glow ring around fingertip]
|
|
323
319
|
Use case: Tutorial overlay tap gesture for playable ad, points toward target element
|
|
324
|
-
Constraints:
|
|
320
|
+
Constraints: Transparent background, PNG with alpha channel,
|
|
321
|
+
no extra limbs or elements, finger pointing at bottom-center
|
|
325
322
|
```
|
|
326
323
|
|
|
327
324
|
**箭头变体**(更简洁):
|
|
@@ -331,7 +328,7 @@ Subject: Bold cartoon arrow pointing [down / right], game tutorial UI
|
|
|
331
328
|
Style: flat 2D, thick outline 4px, rounded arrowhead
|
|
332
329
|
Important details: [bright yellow / white] fill, [dark outline],
|
|
333
330
|
slight perspective tilt for depth, attention-grabbing
|
|
334
|
-
Constraints:
|
|
331
|
+
Constraints: Transparent background, single clean arrow shape, no text
|
|
335
332
|
```
|
|
336
333
|
|
|
337
334
|
---
|
|
@@ -345,7 +342,7 @@ Important details: white or [light color] fill, [2–3px] dark outline,
|
|
|
345
342
|
tail pointing [down-left / down-center], interior empty for text overlay,
|
|
346
343
|
subtle inner shadow or gradient
|
|
347
344
|
Use case: Game tutorial hint tooltip, isolated UI asset
|
|
348
|
-
Constraints:
|
|
345
|
+
Constraints: Transparent background, no text inside, clean edges,
|
|
349
346
|
no watermark, no extra decorations
|
|
350
347
|
```
|
|
351
348
|
|
|
@@ -365,7 +362,7 @@ Important details: [treasure chest]: lid slightly ajar, golden glow escaping fro
|
|
|
365
362
|
[gold coins]: scattered pile, gleaming highlights, not neatly stacked (implies uncollected);
|
|
366
363
|
[gem crystal]: large, brilliant facets, floating above ground, clearly valuable
|
|
367
364
|
Use case: EndCard reward visual, creates FOMO and drives install
|
|
368
|
-
Constraints:
|
|
365
|
+
Constraints: Transparent background, centered, isolated subject,
|
|
369
366
|
no CTA text (added separately), warm celebratory lighting
|
|
370
367
|
```
|
|
371
368
|
|
|
@@ -376,19 +373,25 @@ Constraints: Centered, isolated subject,
|
|
|
376
373
|
|
|
377
374
|
### 📊 UI 元素背景处理规则速查
|
|
378
375
|
|
|
379
|
-
|
|
376
|
+
| UI 元素类型 | prompt 背景写法 | 后处理 |
|
|
377
|
+
| ---------------- | ----------------------------------------------- | ------------------------------ |
|
|
378
|
+
| CTA 按钮 | `transparent background` 或绿幕 | floodfill 去背 |
|
|
379
|
+
| 进度条 | `transparent background` 或绿幕 | floodfill 去背 |
|
|
380
|
+
| 引导手势 | `transparent background, PNG with alpha` | floodfill 去背(tolerance 25) |
|
|
381
|
+
| 对话气泡 | `transparent background` 或绿幕 | floodfill 去背 |
|
|
382
|
+
| EndCard 奖励图标 | 绿幕(`solid bright green #00FF00 background`) | floodfill 去背(tolerance 25) |
|
|
380
383
|
|
|
381
384
|
---
|
|
382
385
|
|
|
383
386
|
## 六、常见问题 & 修正方案
|
|
384
387
|
|
|
385
|
-
| 问题 | 原因 | 修正
|
|
386
|
-
| ------------------ | -------------------- |
|
|
387
|
-
| 图标边缘有阴影 | 模型默认加立体效果 | 加 `no shadow, no drop shadow, flat 2D`
|
|
388
|
-
| 构图不居中 | 没有明确指定 | 加 `centered composition, subject centered`
|
|
389
|
-
| 背景不干净 |
|
|
390
|
-
| 多个物体出现 | 主体不够明确 | 加 `a single [物体]`, `only one [物体]`
|
|
391
|
-
| 文字拼写错误 | 所有模型通病 | 尝试 gpt-image-2(最好),或多生成几张
|
|
392
|
-
| 风格不一致(批量) | 没用 reference image | Phase 2 必须加 `--reference-image`
|
|
393
|
-
| 细节过于复杂 | 素材尺寸小但细节太多 | 加 `simple design, minimal details, bold shapes`
|
|
394
|
-
| 生成极慢/超时 | 模型负载高 | 换另一个 provider 或换模型
|
|
388
|
+
| 问题 | 原因 | 修正 |
|
|
389
|
+
| ------------------ | -------------------- | ------------------------------------------------ |
|
|
390
|
+
| 图标边缘有阴影 | 模型默认加立体效果 | 加 `no shadow, no drop shadow, flat 2D` |
|
|
391
|
+
| 构图不居中 | 没有明确指定 | 加 `centered composition, subject centered` |
|
|
392
|
+
| 背景不干净 | 背景描述不够明确 | 加 `solid white background, isolated` 或绿幕策略 |
|
|
393
|
+
| 多个物体出现 | 主体不够明确 | 加 `a single [物体]`, `only one [物体]` |
|
|
394
|
+
| 文字拼写错误 | 所有模型通病 | 尝试 gpt-image-2(最好),或多生成几张 |
|
|
395
|
+
| 风格不一致(批量) | 没用 reference image | Phase 2 必须加 `--reference-image` |
|
|
396
|
+
| 细节过于复杂 | 素材尺寸小但细节太多 | 加 `simple design, minimal details, bold shapes` |
|
|
397
|
+
| 生成极慢/超时 | 模型负载高 | 换另一个 provider 或换模型 |
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { readImageAssetContext } from '../utils/image-asset-context.js';
|
|
2
|
-
import { collectReferenceImagePaths, handleError } from './tools-utils.js';
|
|
3
|
-
export function registerImageContextCommand(tools) {
|
|
4
|
-
tools.command('image-context')
|
|
5
|
-
.description('Read image asset reference and delivery constraints locally; does not generate an image')
|
|
6
|
-
.requiredOption('--asset-path <path>', 'Existing image asset path relative to the project')
|
|
7
|
-
.option('--reference-image <path>', 'Explicit local reference; may be repeated', collectReferenceImagePaths, [])
|
|
8
|
-
.option('--no-target-reference', 'Do not use the target schema or current asset as a reference')
|
|
9
|
-
.option('--prompt <text>', 'Generation request used to resolve background intent')
|
|
10
|
-
.option('--remove-background', 'Explicitly request verified transparency')
|
|
11
|
-
.option('--no-remove-background', 'Explicitly keep an opaque background')
|
|
12
|
-
.action(async (opts) => {
|
|
13
|
-
try {
|
|
14
|
-
console.log(JSON.stringify(await readImageAssetContext(opts.assetPath, process.cwd(), {
|
|
15
|
-
referenceImagePaths: opts.referenceImage, useTargetReference: opts.targetReference,
|
|
16
|
-
prompt: opts.prompt, removeBackground: opts.removeBackground,
|
|
17
|
-
})));
|
|
18
|
-
}
|
|
19
|
-
catch (error) {
|
|
20
|
-
handleError(error);
|
|
21
|
-
}
|
|
22
|
-
});
|
|
23
|
-
}
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
import { existsSync, readFileSync, realpathSync } from 'node:fs';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import JSON5 from 'json5';
|
|
4
|
-
import sharp from 'sharp';
|
|
5
|
-
import { extractAssetFields, getByPath, resolveAiImageTargetConstraints, resolveImageBackgroundRequirement, THEME_SCHEMA_PATH, themeDataPath, } from '@playcraft/common/prefab';
|
|
6
|
-
/** Resolve only real files in this project, including legacy /project aliases. */
|
|
7
|
-
function projectFile(root, input) {
|
|
8
|
-
const mapped = input.startsWith('/project/') ? input.slice('/project/'.length) : input;
|
|
9
|
-
const file = path.resolve(root, mapped);
|
|
10
|
-
const prefix = path.resolve(root) + path.sep;
|
|
11
|
-
if (!file.startsWith(prefix))
|
|
12
|
-
throw new Error(`Image asset path is outside the project: ${input}`);
|
|
13
|
-
const real = realpathSync(file);
|
|
14
|
-
if (!real.startsWith(realpathSync(root) + path.sep))
|
|
15
|
-
throw new Error(`Image asset symlink is outside the project: ${input}`);
|
|
16
|
-
return file;
|
|
17
|
-
}
|
|
18
|
-
/** Read the same per-field constraints used by the asset image dialog. */
|
|
19
|
-
export async function readImageAssetContext(assetPath, projectDir = process.cwd(), options = {}) {
|
|
20
|
-
const root = path.resolve(projectDir);
|
|
21
|
-
const target = projectFile(root, assetPath);
|
|
22
|
-
const relativeTarget = path.relative(root, target).replace(/\\/g, '/');
|
|
23
|
-
const themeMatch = relativeTarget.match(/^src\/theme\/([^/]+)\/assets\//);
|
|
24
|
-
let field;
|
|
25
|
-
const schemaFile = path.join(root, THEME_SCHEMA_PATH);
|
|
26
|
-
if (themeMatch && existsSync(schemaFile)) {
|
|
27
|
-
const schema = JSON5.parse(readFileSync(projectFile(root, THEME_SCHEMA_PATH), 'utf8'));
|
|
28
|
-
const dataPath = themeDataPath(themeMatch[1]);
|
|
29
|
-
const data = existsSync(path.join(root, dataPath))
|
|
30
|
-
? JSON5.parse(readFileSync(projectFile(root, dataPath), 'utf8')) : {};
|
|
31
|
-
const themeRoot = path.dirname(path.join(root, dataPath));
|
|
32
|
-
const matches = extractAssetFields(schema, data).filter(candidate => {
|
|
33
|
-
let configured = getByPath(data, candidate.path);
|
|
34
|
-
if (configured === undefined && ['gameplay', 'gamePlay'].includes(candidate.path[0])) {
|
|
35
|
-
configured = getByPath(data, [candidate.path[0] === 'gameplay' ? 'gamePlay' : 'gameplay', ...candidate.path.slice(1)]);
|
|
36
|
-
}
|
|
37
|
-
const value = typeof configured === 'string' ? configured : candidate.schema.default;
|
|
38
|
-
if (typeof value !== 'string' || /^https?:\/\//i.test(value))
|
|
39
|
-
return false;
|
|
40
|
-
return path.resolve(themeRoot, value) === target;
|
|
41
|
-
});
|
|
42
|
-
if (matches.length > 1)
|
|
43
|
-
throw new Error('Multiple image fields use this asset; specify an unambiguous target asset.');
|
|
44
|
-
field = matches[0];
|
|
45
|
-
if (!field)
|
|
46
|
-
throw new Error(`No image schema field matches ${relativeTarget}; check theme.data.json5 before generating.`);
|
|
47
|
-
}
|
|
48
|
-
const xp = field?.schema.xplatform;
|
|
49
|
-
const ext = xp?.ext;
|
|
50
|
-
// Schema references follow the dialog's root/theme conventions; explicit tool paths do not change.
|
|
51
|
-
const schemaReferences = Array.isArray(ext?.reference_image)
|
|
52
|
-
? ext.reference_image.filter(ref => typeof ref === 'string' && ref.trim()).map(ref => {
|
|
53
|
-
const raw = ref.trim().replace(/\\/g, '/');
|
|
54
|
-
const normalized = raw.replace(/^\.\/+/, '').replace(/^\/+/, '').replace(/\/{2,}/g, '/');
|
|
55
|
-
if (/^\/?(?:assets|src|public)\//.test(raw) || normalized.startsWith('src/'))
|
|
56
|
-
return normalized;
|
|
57
|
-
if (!themeMatch || path.isAbsolute(raw) || /^https?:\/\//i.test(raw))
|
|
58
|
-
return raw;
|
|
59
|
-
return path.posix.join('src/theme', themeMatch[1], normalized);
|
|
60
|
-
}) : [];
|
|
61
|
-
const referenceImagePaths = options.referenceImagePaths?.length ? options.referenceImagePaths
|
|
62
|
-
: options.useTargetReference === false ? [] : schemaReferences.length ? schemaReferences : [relativeTarget];
|
|
63
|
-
if (referenceImagePaths.length > 8)
|
|
64
|
-
throw new Error('At most 8 reference images are allowed.');
|
|
65
|
-
for (const ref of referenceImagePaths) {
|
|
66
|
-
if (/^https?:\/\//i.test(ref))
|
|
67
|
-
throw new Error('Download the schema reference into the project before generating.');
|
|
68
|
-
await sharp(projectFile(root, ref)).metadata();
|
|
69
|
-
}
|
|
70
|
-
const targetMeta = await sharp(target).metadata();
|
|
71
|
-
const hasSchemaBackground = typeof ext?.remove_background === 'boolean';
|
|
72
|
-
const targetStats = !hasSchemaBackground && targetMeta.hasAlpha ? await sharp(target).stats() : undefined;
|
|
73
|
-
const targetHasTransparency = !!targetStats && targetStats.channels.at(-1).min < 250;
|
|
74
|
-
const removeBackground = resolveImageBackgroundRequirement({
|
|
75
|
-
prompt: options.prompt ?? '',
|
|
76
|
-
schemaRemoveBackground: hasSchemaBackground ? ext.remove_background : undefined,
|
|
77
|
-
removeBackground: options.removeBackground,
|
|
78
|
-
fallbackRemoveBackground: targetHasTransparency,
|
|
79
|
-
});
|
|
80
|
-
const delivery = resolveAiImageTargetConstraints({
|
|
81
|
-
schemaResolution: ext?.resolution,
|
|
82
|
-
schemaMimeType: xp?.mime_type,
|
|
83
|
-
schemaFitMode: xp?.fit_mode ?? ext?.fit_mode,
|
|
84
|
-
schemaRemoveBackground: removeBackground,
|
|
85
|
-
schemaPaddingColor: ext?.padding_color,
|
|
86
|
-
assetPath: relativeTarget,
|
|
87
|
-
referenceWidth: targetMeta.width,
|
|
88
|
-
referenceHeight: targetMeta.height,
|
|
89
|
-
referenceFormat: targetMeta.format,
|
|
90
|
-
});
|
|
91
|
-
if (!['png', 'webp', 'jpeg'].includes(delivery.format))
|
|
92
|
-
throw new Error('Unsupported image delivery format; use a dedicated animation or vector workflow.');
|
|
93
|
-
return {
|
|
94
|
-
targetAssetPath: relativeTarget,
|
|
95
|
-
fieldPath: field?.path,
|
|
96
|
-
referenceImagePaths,
|
|
97
|
-
width: delivery.width, height: delivery.height,
|
|
98
|
-
aspectRatio: typeof ext?.ratio === 'string' ? ext.ratio : `${delivery.width}:${delivery.height}`,
|
|
99
|
-
outputFormat: (removeBackground && delivery.format === 'jpeg' && !delivery.fromSchemaMimeType
|
|
100
|
-
? 'png' : delivery.format),
|
|
101
|
-
fitMode: delivery.fitMode, removeBackground: delivery.removeBackground, paddingColor: delivery.paddingColor,
|
|
102
|
-
removeBackgroundFromSchema: hasSchemaBackground,
|
|
103
|
-
imageModelRef: typeof ext?.imageModelRef === 'string' ? ext.imageModelRef : undefined,
|
|
104
|
-
};
|
|
105
|
-
}
|