pixelweaver 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.development +1 -0
- package/.github/workflows/ci.yml +22 -0
- package/.github/workflows/publish.yml +18 -0
- package/.prettierignore +5 -0
- package/.prettierrc +16 -0
- package/.python-version +1 -0
- package/.rlsbl/bases/.github/workflows/ci.yml +21 -0
- package/.rlsbl/bases/.github/workflows/publish.yml +18 -0
- package/.rlsbl/bases/.rlsbl/changes/unreleased.jsonl +0 -0
- package/.rlsbl/bases/.rlsbl/hooks/post-release.sh +8 -0
- package/.rlsbl/bases/.rlsbl/hooks/pre-checks.sh +5 -0
- package/.rlsbl/bases/.rlsbl/hooks/pre-release.sh +8 -0
- package/.rlsbl/bases/.rlsbl/lint/go.toml +17 -0
- package/.rlsbl/bases/.rlsbl/lint/npm.toml +19 -0
- package/.rlsbl/bases/.rlsbl/lint/python.toml +25 -0
- package/.rlsbl/bases/CHANGELOG.md +5 -0
- package/.rlsbl/bases/LICENSE +21 -0
- package/.rlsbl/changes/.validated +1 -0
- package/.rlsbl/changes/0.1.0.jsonl +85 -0
- package/.rlsbl/changes/0.1.0.md +13 -0
- package/.rlsbl/changes/unreleased.jsonl +0 -0
- package/.rlsbl/config.json +6 -0
- package/.rlsbl/hashes.json +14 -0
- package/.rlsbl/hooks/post-release.sh +8 -0
- package/.rlsbl/hooks/pre-checks.sh +5 -0
- package/.rlsbl/hooks/pre-release.sh +8 -0
- package/.rlsbl/lint/go.toml +17 -0
- package/.rlsbl/lint/npm.toml +19 -0
- package/.rlsbl/lint/python.toml +25 -0
- package/.rlsbl/releases/unreleased.toml +0 -0
- package/.rlsbl/releases/v0.1.0.toml +3 -0
- package/.rlsbl/version +1 -0
- package/.selfdoc/hashes/hashes.json +146 -0
- package/.strictcli/schema.json +227 -0
- package/CHANGELOG.md +17 -0
- package/CLAUDE.md +100 -0
- package/LICENSE +21 -0
- package/README.md +116 -0
- package/assets/icon.png +0 -0
- package/docs/_README.md +117 -0
- package/docs/cli-config.md +35 -0
- package/docs/cli-dev.md +21 -0
- package/docs/cli-diagnose.md +12 -0
- package/docs/cli-index.md +30 -0
- package/docs/cli-list.md +18 -0
- package/docs/cli-mcp.md +18 -0
- package/docs/cli-new.md +26 -0
- package/docs/cli-open.md +21 -0
- package/docs/cli-serve.md +21 -0
- package/docs/cli-stop.md +12 -0
- package/docs/gen-index.md +36 -0
- package/docs/index.md +13 -0
- package/docs/server-src-pixelweaver-__main__.md +12 -0
- package/docs/server-src-pixelweaver-autosave.md +12 -0
- package/docs/server-src-pixelweaver-bridge.md +12 -0
- package/docs/server-src-pixelweaver-cli.md +12 -0
- package/docs/server-src-pixelweaver-config.md +12 -0
- package/docs/server-src-pixelweaver-connections.md +12 -0
- package/docs/server-src-pixelweaver-main.md +12 -0
- package/docs/server-src-pixelweaver-mcp_bridge.md +12 -0
- package/docs/server-src-pixelweaver-mcp_drawing_tools.md +12 -0
- package/docs/server-src-pixelweaver-mcp_export_tools.md +12 -0
- package/docs/server-src-pixelweaver-mcp_frame_tools.md +12 -0
- package/docs/server-src-pixelweaver-mcp_history_tools.md +12 -0
- package/docs/server-src-pixelweaver-mcp_layer_tools.md +12 -0
- package/docs/server-src-pixelweaver-mcp_lock.md +12 -0
- package/docs/server-src-pixelweaver-mcp_project_tools.md +12 -0
- package/docs/server-src-pixelweaver-mcp_read_tools.md +12 -0
- package/docs/server-src-pixelweaver-mcp_registry.md +12 -0
- package/docs/server-src-pixelweaver-mcp_resources.md +12 -0
- package/docs/server-src-pixelweaver-mcp_server.md +12 -0
- package/docs/server-src-pixelweaver-protocol.md +12 -0
- package/docs/server-src-pixelweaver-state.md +12 -0
- package/docs/server-src-pixelweaver-storage.md +12 -0
- package/docs/server-src-pixelweaver-websocket.md +12 -0
- package/docs/server-src-pixelweaver.md +12 -0
- package/e2e/app-launch.test.ts +35 -0
- package/e2e/menus.test.ts +26 -0
- package/e2e/tools.test.ts +27 -0
- package/e2e/undo-redo.test.ts +11 -0
- package/eslint.config.js +62 -0
- package/index.html +13 -0
- package/package.json +48 -0
- package/playwright.config.ts +19 -0
- package/plugins/builtin/.gitkeep +0 -0
- package/plugins/builtin/advanced-fill-tool.ts +146 -0
- package/plugins/builtin/circle-tool.ts +186 -0
- package/plugins/builtin/diamond-tool.ts +182 -0
- package/plugins/builtin/dither-tool.ts +186 -0
- package/plugins/builtin/drawing-primitives-plugin.ts +362 -0
- package/plugins/builtin/drawing-utils.test.ts +495 -0
- package/plugins/builtin/drawing-utils.ts +431 -0
- package/plugins/builtin/effects/blur.ts +97 -0
- package/plugins/builtin/effects/color-effects.ts +278 -0
- package/plugins/builtin/effects/flip.ts +83 -0
- package/plugins/builtin/effects/glow.ts +118 -0
- package/plugins/builtin/effects/outline.ts +110 -0
- package/plugins/builtin/effects/rotate.ts +357 -0
- package/plugins/builtin/effects/scale.ts +258 -0
- package/plugins/builtin/effects/shadow.ts +111 -0
- package/plugins/builtin/effects/sharpen.ts +102 -0
- package/plugins/builtin/effects.test.ts +715 -0
- package/plugins/builtin/eraser-tool.ts +23 -0
- package/plugins/builtin/eyedropper-tool.ts +83 -0
- package/plugins/builtin/fill-tool.ts +93 -0
- package/plugins/builtin/gradient-tool.ts +204 -0
- package/plugins/builtin/gradient.test.ts +142 -0
- package/plugins/builtin/importers/aseprite-importer-plugin.ts +174 -0
- package/plugins/builtin/importers/aseprite-parser.ts +497 -0
- package/plugins/builtin/importers/piskel-importer-plugin.ts +222 -0
- package/plugins/builtin/importers/sky-spec-plugin.ts +409 -0
- package/plugins/builtin/line-tool.ts +267 -0
- package/plugins/builtin/make-stroke-tool.ts +271 -0
- package/plugins/builtin/noise-dither.test.ts +151 -0
- package/plugins/builtin/noise-tool.ts +131 -0
- package/plugins/builtin/pattern-stamp-tool.ts +162 -0
- package/plugins/builtin/pencil-tool.ts +25 -0
- package/plugins/builtin/rect-tool.ts +179 -0
- package/plugins/builtin/selection-tool.ts +388 -0
- package/plugins/builtin/selection.test.ts +195 -0
- package/plugins/builtin/tool-plugins.test.ts +529 -0
- package/public/favicon.svg +7 -0
- package/public/sw.js +91 -0
- package/pyproject.toml +49 -0
- package/scripts/eslint-wave-a-list.sh +24 -0
- package/scripts/eslint-wave-a-status.sh +25 -0
- package/scripts/fix-index-signature-access.py +127 -0
- package/scripts/fix-unchecked-index.py +128 -0
- package/scripts/fix-unchecked-vars.py +127 -0
- package/scripts/fix-wave-a-bangs.py +36 -0
- package/scripts/fix-wave-a-templates.py +108 -0
- package/scripts/fix-wave-b-void-expr.py +167 -0
- package/scripts/generate-command-params.py +540 -0
- package/scripts/migrate-single-frame-to-multi.py +171 -0
- package/scripts/smoke-test.sh +77 -0
- package/selfdoc.json +10 -0
- package/server/README.md +0 -0
- package/server/src/pixelweaver/__init__.py +1 -0
- package/server/src/pixelweaver/__main__.py +4 -0
- package/server/src/pixelweaver/autosave.py +114 -0
- package/server/src/pixelweaver/bridge.py +127 -0
- package/server/src/pixelweaver/cli.py +199 -0
- package/server/src/pixelweaver/config.py +24 -0
- package/server/src/pixelweaver/connections.py +54 -0
- package/server/src/pixelweaver/main.py +271 -0
- package/server/src/pixelweaver/mcp_bridge.py +189 -0
- package/server/src/pixelweaver/mcp_drawing_tools.py +178 -0
- package/server/src/pixelweaver/mcp_export_tools.py +291 -0
- package/server/src/pixelweaver/mcp_frame_tools.py +423 -0
- package/server/src/pixelweaver/mcp_history_tools.py +106 -0
- package/server/src/pixelweaver/mcp_layer_tools.py +64 -0
- package/server/src/pixelweaver/mcp_lock.py +37 -0
- package/server/src/pixelweaver/mcp_project_tools.py +302 -0
- package/server/src/pixelweaver/mcp_read_tools.py +163 -0
- package/server/src/pixelweaver/mcp_registry.py +247 -0
- package/server/src/pixelweaver/mcp_resources.py +312 -0
- package/server/src/pixelweaver/mcp_server.py +234 -0
- package/server/src/pixelweaver/protocol.py +219 -0
- package/server/src/pixelweaver/state.py +267 -0
- package/server/src/pixelweaver/storage.py +293 -0
- package/server/src/pixelweaver/websocket.py +282 -0
- package/server/tests/__init__.py +0 -0
- package/server/tests/conftest.py +17 -0
- package/server/tests/test_api.py +96 -0
- package/server/tests/test_bridge.py +161 -0
- package/server/tests/test_health.py +9 -0
- package/server/tests/test_integration.py +86 -0
- package/server/tests/test_mcp_bridge.py +293 -0
- package/server/tests/test_mcp_lock.py +34 -0
- package/server/tests/test_mcp_registry.py +679 -0
- package/server/tests/test_mcp_resources.py +648 -0
- package/server/tests/test_protocol.py +125 -0
- package/server/tests/test_state.py +87 -0
- package/server/tests/test_storage.py +306 -0
- package/server/tests/test_websocket.py +275 -0
- package/src/App.svelte +107 -0
- package/src/app.css +215 -0
- package/src/lib/animation/AnimationPreviewPanel.svelte +667 -0
- package/src/lib/animation/animation-commands.test.ts +228 -0
- package/src/lib/animation/animation-commands.ts +540 -0
- package/src/lib/animation/animation-preview-panel-plugin.ts +25 -0
- package/src/lib/animation/animation-preview.svelte.ts +151 -0
- package/src/lib/animation/clipboard.ts +134 -0
- package/src/lib/animation/frame-model.svelte.ts +437 -0
- package/src/lib/animation/frame-model.test.ts +314 -0
- package/src/lib/animation/frame-selection.svelte.ts +77 -0
- package/src/lib/animation/frame-tags.svelte.ts +238 -0
- package/src/lib/animation/frame-tags.test.ts +136 -0
- package/src/lib/animation/import.test.ts +141 -0
- package/src/lib/animation/import.ts +112 -0
- package/src/lib/animation/spritesheet-export.test.ts +239 -0
- package/src/lib/animation/spritesheet-export.ts +314 -0
- package/src/lib/canvas/CanvasViewport.svelte +216 -0
- package/src/lib/canvas/canvas-init-plugin.ts +178 -0
- package/src/lib/canvas/canvas-renderer.ts +408 -0
- package/src/lib/canvas/canvas-state.svelte.ts +232 -0
- package/src/lib/canvas/canvas-state.test.ts +139 -0
- package/src/lib/canvas/input-handler.ts +221 -0
- package/src/lib/canvas/input-plugin.ts +150 -0
- package/src/lib/canvas/onion-skin.ts +94 -0
- package/src/lib/canvas/pixel-buffer.test.ts +249 -0
- package/src/lib/canvas/pixel-buffer.ts +151 -0
- package/src/lib/canvas/render-state.svelte.ts +18 -0
- package/src/lib/canvas/shape-preview-state.svelte.ts +36 -0
- package/src/lib/canvas/tile-mode.test.ts +53 -0
- package/src/lib/canvas/tile-mode.ts +92 -0
- package/src/lib/canvas/viewport-utils.ts +24 -0
- package/src/lib/canvas/zoom-utils.ts +31 -0
- package/src/lib/color/.gitkeep +0 -0
- package/src/lib/color/color-commands.ts +87 -0
- package/src/lib/color/color-state.svelte.ts +98 -0
- package/src/lib/color/color-state.test.ts +91 -0
- package/src/lib/color/color-utils.test.ts +220 -0
- package/src/lib/color/color-utils.ts +243 -0
- package/src/lib/color/palette-state.svelte.ts +127 -0
- package/src/lib/color/palette-state.test.ts +154 -0
- package/src/lib/color/palette.ts +79 -0
- package/src/lib/core/bootstrap.ts +66 -0
- package/src/lib/core/command-params.generated.ts +1549 -0
- package/src/lib/core/command-params.ts +20 -0
- package/src/lib/core/command-runner.ts +79 -0
- package/src/lib/core/commands.ts +134 -0
- package/src/lib/core/dispatcher.test.ts +548 -0
- package/src/lib/core/dispatcher.ts +361 -0
- package/src/lib/core/index.test.ts +7 -0
- package/src/lib/core/notification-state.svelte.ts +119 -0
- package/src/lib/core/plugin-api.ts +210 -0
- package/src/lib/core/plugin-discovery.test.ts +53 -0
- package/src/lib/core/plugin-discovery.ts +65 -0
- package/src/lib/core/plugin-loader.test.ts +159 -0
- package/src/lib/core/plugin-loader.ts +240 -0
- package/src/lib/core/plugin-types.ts +286 -0
- package/src/lib/core/registries.svelte.ts +74 -0
- package/src/lib/core/tool-options-state.svelte.ts +61 -0
- package/src/lib/dock/DockLayout.svelte +375 -0
- package/src/lib/dock/TabAddMenu.svelte +90 -0
- package/src/lib/dock/dock-persistence.ts +46 -0
- package/src/lib/dock/dock-plugin.ts +49 -0
- package/src/lib/dock/dock-presets.ts +156 -0
- package/src/lib/dock/dock-state.svelte.ts +77 -0
- package/src/lib/dock/dock-types.ts +2 -0
- package/src/lib/dock/dockview-theme.css +226 -0
- package/src/lib/dock/dockview-theme.ts +17 -0
- package/src/lib/dock/header-action-renderer.ts +77 -0
- package/src/lib/edit/clipboard-state.ts +34 -0
- package/src/lib/export/download.ts +201 -0
- package/src/lib/export/png-metadata.ts +181 -0
- package/src/lib/history/ActionLogPanel.svelte +418 -0
- package/src/lib/history/action-log-panel-plugin.ts +24 -0
- package/src/lib/history/action-log.svelte.ts +172 -0
- package/src/lib/history/action-log.test.ts +168 -0
- package/src/lib/history/history-commands.ts +403 -0
- package/src/lib/history/macros.svelte.ts +320 -0
- package/src/lib/history/macros.test.ts +224 -0
- package/src/lib/history/replay-engine.test.ts +241 -0
- package/src/lib/history/replay-engine.ts +149 -0
- package/src/lib/history/spec-format.test.ts +250 -0
- package/src/lib/history/spec-format.ts +210 -0
- package/src/lib/iso/SeamCheckerPanel.svelte +251 -0
- package/src/lib/iso/iso-math.test.ts +77 -0
- package/src/lib/iso/iso-math.ts +77 -0
- package/src/lib/iso/seam-checker-panel-plugin.ts +25 -0
- package/src/lib/iso/seam-checker.test.ts +126 -0
- package/src/lib/iso/seam-checker.ts +93 -0
- package/src/lib/iso/tessellation.ts +67 -0
- package/src/lib/layers/compositor.test.ts +193 -0
- package/src/lib/layers/compositor.ts +175 -0
- package/src/lib/layers/layer-commands.test.ts +263 -0
- package/src/lib/layers/layer-commands.ts +429 -0
- package/src/lib/layers/layer-tree.svelte.ts +516 -0
- package/src/lib/layers/layer-tree.test.ts +383 -0
- package/src/lib/layers/layer-types.ts +56 -0
- package/src/lib/leveleditor/LevelEditorViewport.svelte +1808 -0
- package/src/lib/leveleditor/MapPropertiesPanel.svelte +266 -0
- package/src/lib/leveleditor/TilePickerPanel.svelte +324 -0
- package/src/lib/leveleditor/depth-sort.test.ts +70 -0
- package/src/lib/leveleditor/depth-sort.ts +39 -0
- package/src/lib/leveleditor/level-editor-commands.ts +353 -0
- package/src/lib/leveleditor/level-editor-viewport-plugin.ts +25 -0
- package/src/lib/leveleditor/map-properties-panel-plugin.ts +25 -0
- package/src/lib/leveleditor/map-state.svelte.ts +372 -0
- package/src/lib/leveleditor/map-state.test.ts +243 -0
- package/src/lib/leveleditor/tile-picker-panel-plugin.ts +25 -0
- package/src/lib/leveleditor/tile-source-registry.svelte.ts +91 -0
- package/src/lib/leveleditor/tiled-export.test.ts +144 -0
- package/src/lib/leveleditor/tiled-export.ts +374 -0
- package/src/lib/pywebview.d.ts +15 -0
- package/src/lib/recovery/.gitkeep +0 -0
- package/src/lib/recovery/idb-store.ts +118 -0
- package/src/lib/recovery/recovery-manager.test.ts +321 -0
- package/src/lib/recovery/recovery-manager.ts +115 -0
- package/src/lib/recovery/recovery-plugin.ts +55 -0
- package/src/lib/recovery/recovery-state.svelte.ts +21 -0
- package/src/lib/recovery/sw-plugin.ts +18 -0
- package/src/lib/recovery/sw-register.ts +17 -0
- package/src/lib/save/directory-format.ts +42 -0
- package/src/lib/save/project-snapshot.ts +139 -0
- package/src/lib/save/recent-projects.ts +56 -0
- package/src/lib/save/save-state.svelte.ts +35 -0
- package/src/lib/save/storage.ts +167 -0
- package/src/lib/save/zip-format.ts +45 -0
- package/src/lib/shortcuts/.gitkeep +0 -0
- package/src/lib/shortcuts/ShortcutEditorPanel.svelte +690 -0
- package/src/lib/shortcuts/default-bindings.ts +61 -0
- package/src/lib/shortcuts/shortcut-editor-panel-plugin.ts +25 -0
- package/src/lib/shortcuts/shortcut-init.ts +380 -0
- package/src/lib/shortcuts/shortcut-manager.test.ts +466 -0
- package/src/lib/shortcuts/shortcut-manager.ts +281 -0
- package/src/lib/shortcuts/shortcut-state.svelte.ts +78 -0
- package/src/lib/shortcuts/shortcuts-plugin.ts +17 -0
- package/src/lib/sync/patch-applicator.ts +300 -0
- package/src/lib/sync/patch-types.ts +65 -0
- package/src/lib/sync/project-manager.ts +108 -0
- package/src/lib/sync/sync-init.ts +152 -0
- package/src/lib/sync/sync-plugin.ts +19 -0
- package/src/lib/sync/sync-state.svelte.ts +56 -0
- package/src/lib/sync/ws-client.test.ts +604 -0
- package/src/lib/sync/ws-client.ts +574 -0
- package/src/lib/tools/.gitkeep +0 -0
- package/src/lib/ui/.gitkeep +0 -0
- package/src/lib/ui/AboutDialog.svelte +113 -0
- package/src/lib/ui/ColorPicker.svelte +761 -0
- package/src/lib/ui/ContextMenu.svelte +216 -0
- package/src/lib/ui/ExportDialog.svelte +747 -0
- package/src/lib/ui/FrameStrip.svelte +854 -0
- package/src/lib/ui/LayerPanel.svelte +810 -0
- package/src/lib/ui/MenuBar.svelte +590 -0
- package/src/lib/ui/NewProjectDialog.svelte +803 -0
- package/src/lib/ui/PluginManagerPanel.svelte +475 -0
- package/src/lib/ui/PromptDialog.svelte +252 -0
- package/src/lib/ui/RecoveryDialog.svelte +295 -0
- package/src/lib/ui/ResizeDialog.svelte +416 -0
- package/src/lib/ui/StatusBar.svelte +145 -0
- package/src/lib/ui/ToolbarPanel.svelte +488 -0
- package/src/lib/ui/animation-menu-commands.ts +194 -0
- package/src/lib/ui/command-palette/CommandPalette.svelte +232 -0
- package/src/lib/ui/command-palette/command-palette-plugin.ts +30 -0
- package/src/lib/ui/command-palette/command-palette-state.svelte.ts +190 -0
- package/src/lib/ui/command-palette/command-palette.test.ts +129 -0
- package/src/lib/ui/dialog-state.svelte.ts +70 -0
- package/src/lib/ui/edit-commands.ts +271 -0
- package/src/lib/ui/file-commands.ts +275 -0
- package/src/lib/ui/file-open.ts +99 -0
- package/src/lib/ui/help-commands.ts +93 -0
- package/src/lib/ui/image-commands.ts +181 -0
- package/src/lib/ui/layer-menu-commands.ts +420 -0
- package/src/lib/ui/menu-builder.ts +224 -0
- package/src/lib/ui/notifications/NotificationBanner.svelte +137 -0
- package/src/lib/ui/notifications/notification-plugin.ts +29 -0
- package/src/lib/ui/notifications/notification-state.svelte.ts +9 -0
- package/src/lib/ui/plugin-manager-panel-plugin.ts +26 -0
- package/src/lib/ui/plugin-state.svelte.ts +62 -0
- package/src/lib/ui/select-commands.ts +75 -0
- package/src/lib/ui/theme-plugin.ts +18 -0
- package/src/lib/ui/theme.svelte.ts +45 -0
- package/src/lib/ui/theme.test.ts +51 -0
- package/src/lib/ui/toolbar-config.ts +90 -0
- package/src/lib/ui/toolbar-plugin.ts +39 -0
- package/src/lib/ui/view-commands.ts +629 -0
- package/src/lib/variants/BisectionExportDialog.svelte +500 -0
- package/src/lib/variants/VariantPanel.svelte +822 -0
- package/src/lib/variants/bisection-export.test.ts +113 -0
- package/src/lib/variants/bisection-export.ts +148 -0
- package/src/lib/variants/palette-extraction.test.ts +111 -0
- package/src/lib/variants/palette-extraction.ts +84 -0
- package/src/lib/variants/palette-interpolation.test.ts +113 -0
- package/src/lib/variants/palette-interpolation.ts +87 -0
- package/src/lib/variants/palette-swap.test.ts +101 -0
- package/src/lib/variants/palette-swap.ts +114 -0
- package/src/lib/variants/variant-commands.ts +594 -0
- package/src/lib/variants/variant-panel-plugin.ts +27 -0
- package/src/lib/variants/variant-randomizer.ts +101 -0
- package/src/lib/variants/variant-state.svelte.ts +166 -0
- package/src/lib/variants/variant-state.test.ts +138 -0
- package/src/main.ts +14 -0
- package/src/vite-env.d.ts +3 -0
- package/svelte.config.js +2 -0
- package/todo/.done/audit-design-decisions.md +812 -0
- package/todo/.done/audit-implementation-plan.md +1235 -0
- package/todo/.done/happy-path-polish.md +177 -0
- package/todo/.done/pixelweaver-full-build.md +937 -0
- package/todo/.done/server-multi-frame-design.md +405 -0
- package/todo/.done/typed-dispatcher-design.md +435 -0
- package/todo/.done/unified-toolbar-and-action-system.md +323 -0
- package/todo/.obsolete/comprehensive-audit-obsolete-items.md +33 -0
- package/todo/.obsolete/tauri-desktop-bundle.md +424 -0
- package/todo/comprehensive-audit.md +1085 -0
- package/tsconfig.app.json +26 -0
- package/tsconfig.json +7 -0
- package/tsconfig.node.json +20 -0
- package/uv.lock +1167 -0
- package/vite.config.ts +32 -0
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
# Happy Path Polish: End-to-End UX Gaps
|
|
2
|
+
|
|
3
|
+
The core user journey -- launch app, draw sprites, animate them, build
|
|
4
|
+
isometric variants, compose a world, automate with MCP, export for a game
|
|
5
|
+
engine -- is architecturally complete but feels like a tech demo rather than
|
|
6
|
+
a product. Every phase has the plumbing but is missing the finish that makes
|
|
7
|
+
the experience feel intentional and delightful. This document catalogs what
|
|
8
|
+
a user actually bumps into when walking through that journey, without
|
|
9
|
+
prescribing solutions.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 1. First Launch & Project Setup
|
|
14
|
+
|
|
15
|
+
- App opens to a silent 32x32 canvas with no context. A new user has no idea
|
|
16
|
+
what this app is or what to do first. There is no welcome, no onboarding,
|
|
17
|
+
no hint.
|
|
18
|
+
- Recovery data from a prior crash is detected in code but never surfaced to
|
|
19
|
+
the user. Work is silently lost.
|
|
20
|
+
- Creating a new project over existing work gives no "unsaved changes"
|
|
21
|
+
warning. The old state just vanishes.
|
|
22
|
+
- The 300ms layout-settle delay for dockview can cause a visible reflow on
|
|
23
|
+
startup.
|
|
24
|
+
- No recent-projects list or templates. Every session starts from scratch
|
|
25
|
+
unless the server is running.
|
|
26
|
+
|
|
27
|
+
## 2. Drawing & Painting
|
|
28
|
+
|
|
29
|
+
- Shape tools (rect, circle, line, diamond, gradient, dither) show nothing
|
|
30
|
+
while dragging. The result appears only on pointer-up. This makes precise
|
|
31
|
+
placement guesswork.
|
|
32
|
+
- Every tool is locked to a 1px brush. There is no size control anywhere.
|
|
33
|
+
- Pressure data is captured from the pointer event but never used by any tool.
|
|
34
|
+
Tablet users get no benefit from their hardware.
|
|
35
|
+
- No modifier-key behaviors: Shift doesn't constrain to straight lines,
|
|
36
|
+
Alt doesn't eyedrop, Ctrl doesn't do anything contextual.
|
|
37
|
+
- Eyedropper tool doesn't actually sample pixels from the canvas. A code
|
|
38
|
+
comment says "actual pixel sampling will be handled by canvas integration
|
|
39
|
+
layer" -- it was never finished.
|
|
40
|
+
- Shape tools are hard-coded to outline mode. No filled-shape option.
|
|
41
|
+
- Color picker is physically small (100x60 HSV area, 16x16 swatches).
|
|
42
|
+
Picking precise colors in that space is fiddly.
|
|
43
|
+
|
|
44
|
+
## 3. Animation
|
|
45
|
+
|
|
46
|
+
- No onion skinning. Drawing frame-by-frame animation without seeing the
|
|
47
|
+
previous/next frame as a ghost is the single biggest friction for
|
|
48
|
+
animators.
|
|
49
|
+
- The preview panel has a speed multiplier (0.1x-10x) in the code but no
|
|
50
|
+
UI control to change it.
|
|
51
|
+
- "Side-by-side" playback mode doesn't actually show frames side by side.
|
|
52
|
+
It just highlights the current frame in the strip.
|
|
53
|
+
- Per-frame duration exists in the model but isn't displayed or editable
|
|
54
|
+
inline in the frame strip. Requires a separate dialog.
|
|
55
|
+
- No frame copy-paste across non-adjacent positions. Only duplicate-in-place.
|
|
56
|
+
- No bulk frame operations (select range, delete multiple, move a sequence).
|
|
57
|
+
- Drag-to-reorder frames has no clear insertion indicator until you're
|
|
58
|
+
exactly over a target.
|
|
59
|
+
|
|
60
|
+
## 4. Layers
|
|
61
|
+
|
|
62
|
+
- No layer thumbnails. The layer panel is a text list. You can't visually
|
|
63
|
+
tell what's on a layer without selecting it and looking at the canvas.
|
|
64
|
+
- Four blend modes are implemented in the compositor (normal, multiply,
|
|
65
|
+
screen, overlay) but there is no UI to change them. The dropdown doesn't
|
|
66
|
+
exist.
|
|
67
|
+
- "Merge Down" removes the top layer but doesn't actually composite its
|
|
68
|
+
pixels into the layer below. It's a structural placeholder.
|
|
69
|
+
- "Flatten Group" converts a group to a pixel layer but doesn't composite
|
|
70
|
+
the children. The resulting layer is empty.
|
|
71
|
+
- The lock flag is stored per-layer but never enforced. Drawing tools don't
|
|
72
|
+
check it. You can paint on a "locked" layer.
|
|
73
|
+
- No default keyboard shortcuts for any layer operation.
|
|
74
|
+
|
|
75
|
+
## 5. Isometric Sprite Creation & Variants
|
|
76
|
+
|
|
77
|
+
- Tile mode (3x3 seamless preview + coordinate wrapping) is fully
|
|
78
|
+
implemented but not connected to any UI toggle. Users can't activate it.
|
|
79
|
+
- Seam checker (detect edge mismatches + suggest fixes) is implemented and
|
|
80
|
+
tested but has no panel or button. Users can't access it.
|
|
81
|
+
- Variant generation only offers random mode in the UI. Interpolation
|
|
82
|
+
(smooth blending between two palettes) exists in code but isn't reachable
|
|
83
|
+
from the panel.
|
|
84
|
+
- Individual variant colors can't be manually edited in the UI. After
|
|
85
|
+
generating a random variant, there's no way to tweak one color that came
|
|
86
|
+
out wrong without using API calls.
|
|
87
|
+
- The bisection atlas exports immediately with no preview. Users can't
|
|
88
|
+
verify the layout before it downloads.
|
|
89
|
+
- No isometric drawing guides or grid overlay on the sprite canvas to help
|
|
90
|
+
align edges to tile boundaries.
|
|
91
|
+
|
|
92
|
+
## 6. Level Editor / World Builder
|
|
93
|
+
|
|
94
|
+
- No tile picker. This is the critical missing piece. Users can't browse
|
|
95
|
+
available sprites, select one, and paint it onto the map. The
|
|
96
|
+
`activeTile` must be set programmatically. The level editor is basically
|
|
97
|
+
non-functional for real use without this.
|
|
98
|
+
- No eraser tool. Once a tile is placed, the only way to remove it is to
|
|
99
|
+
paint over it with another tile.
|
|
100
|
+
- No undo/redo. Every tile placement is permanent until overwritten.
|
|
101
|
+
- No layer management UI. Tile, entity, and collision layers exist in state
|
|
102
|
+
but there are no visibility toggles, no reordering controls, no layer
|
|
103
|
+
list.
|
|
104
|
+
- No entity placement or collision drawing UI. The data structures support
|
|
105
|
+
entities (free-positioned sprites with properties) and collision shapes
|
|
106
|
+
(rects, polygons), but no tools to create or edit them.
|
|
107
|
+
- No map properties UI. Grid size, tile size, and grid mode (iso/ortho) can
|
|
108
|
+
only be changed in code.
|
|
109
|
+
- No keyboard shortcuts for panning, zooming, or tool switching.
|
|
110
|
+
- The level editor is a tab in the center dock but there's no prominent
|
|
111
|
+
mode-switch affordance. Users may not discover it exists.
|
|
112
|
+
- Silent failures -- clicking with no active tile shows a fleeting
|
|
113
|
+
notification that auto-dismisses before many users would read it.
|
|
114
|
+
- Tiled export produces one tileset per unique tile (non-standard) and
|
|
115
|
+
omits image file references, so the .tmj can't render in Tiled without
|
|
116
|
+
manual assembly.
|
|
117
|
+
|
|
118
|
+
## 7. MCP Automation & Insight
|
|
119
|
+
|
|
120
|
+
- The MCP server and the browser UI run as completely independent processes
|
|
121
|
+
with separate state. Changes made via MCP don't appear in the UI. Changes
|
|
122
|
+
in the UI aren't visible to MCP introspection tools. There is no shared
|
|
123
|
+
truth.
|
|
124
|
+
- The concurrency lock (MCPLock) is created but never acquired in any tool
|
|
125
|
+
execution path. Concurrent MCP calls can corrupt project state.
|
|
126
|
+
- The `--data-dir` flag is ignored due to a wrong-module import in the save
|
|
127
|
+
handler. Projects always write to `./projects` regardless.
|
|
128
|
+
- Spritesheet export via MCP only returns the first frame. Multi-frame
|
|
129
|
+
export doesn't work.
|
|
130
|
+
- No MCP resources -- only tools. There's no way to subscribe to project
|
|
131
|
+
state or access canvases as readable resources.
|
|
132
|
+
- Broadcast from MCP tool execution goes to an empty WebSocket list (no
|
|
133
|
+
clients). The notification infrastructure is wired but has no audience.
|
|
134
|
+
|
|
135
|
+
## 8. Export
|
|
136
|
+
|
|
137
|
+
- PNG export is pure raster. No metadata is embedded in the file (no tEXt
|
|
138
|
+
chunks, no EXIF, nothing).
|
|
139
|
+
- Spritesheet export options are hardcoded: always horizontal layout,
|
|
140
|
+
always zero padding, always PixelWeaver metadata format. The code supports
|
|
141
|
+
grid layout, custom padding, and four metadata formats (PixelWeaver,
|
|
142
|
+
TexturePacker, Aseprite, CSS) but the dialog doesn't expose any of them.
|
|
143
|
+
- Metadata is generated in code but never downloadable as a companion file.
|
|
144
|
+
There's no way to get the .json alongside the .png.
|
|
145
|
+
- No export preview. Users can't see the spritesheet layout before
|
|
146
|
+
downloading.
|
|
147
|
+
- The "atlas" layout is identical to "horizontal" in code -- incomplete.
|
|
148
|
+
- No Tauri native file dialog. Export uses browser download (file goes to
|
|
149
|
+
~/Downloads, no "Save As" location picker).
|
|
150
|
+
- File > Save is registered as a menu command but not implemented.
|
|
151
|
+
- No batch export (all canvases, all variants, etc.).
|
|
152
|
+
- Variant atlas export has no companion metadata.
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## Cross-Cutting Concerns
|
|
157
|
+
|
|
158
|
+
These problems span multiple phases:
|
|
159
|
+
|
|
160
|
+
- **Discoverability**: Many implemented features (tile mode, seam checker,
|
|
161
|
+
interpolation variants, blend modes) are invisible because they have no
|
|
162
|
+
UI entry point. The code is there but users can't reach it.
|
|
163
|
+
- **Feedback**: Silent failures and fleeting notifications throughout. When
|
|
164
|
+
something doesn't work (locked layer, no active tile, out-of-bounds
|
|
165
|
+
click), the app often does nothing with no explanation.
|
|
166
|
+
- **Keyboard-first workflow**: Almost no default shortcuts beyond basic
|
|
167
|
+
tool selection. Power users have no fast path for layer operations,
|
|
168
|
+
frame management, mode switching, or map editing.
|
|
169
|
+
- **State continuity**: No local file save/load (only server sync).
|
|
170
|
+
Recovery exists but doesn't surface. No "Save As" anywhere. Projects
|
|
171
|
+
feel ephemeral.
|
|
172
|
+
- **Placeholder implementations**: Merge down, flatten group, eyedropper,
|
|
173
|
+
atlas layout, MCP lock, MCP save path -- multiple features exist as
|
|
174
|
+
structural shells without the core behavior wired up.
|
|
175
|
+
- **UI density**: The layer panel, frame strip, and variant panel are all
|
|
176
|
+
text-heavy / thumbnail-light. Professional pixel art tools communicate
|
|
177
|
+
visually; PixelWeaver communicates textually.
|