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,146 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cli-config.md": {
|
|
3
|
+
"content": "184954f0ee21151227fcbad758e1e01478fa9c1fec123eb3ef664584589aa4b8",
|
|
4
|
+
"description": "5e3ac11586aad6a54fac3d0ffc7347a2a43b28c62874c71b66ae8800ddd0e47e"
|
|
5
|
+
},
|
|
6
|
+
"cli-dev.md": {
|
|
7
|
+
"content": "ac8e9d0f80f2e6e7052e9d8d8f736eb05553e7d51d9f7a6d2460a453b5a230c3",
|
|
8
|
+
"description": "37c4c1460971dea3c29a39549f7103c944ef360d002d33c7978a131479423887"
|
|
9
|
+
},
|
|
10
|
+
"cli-diagnose.md": {
|
|
11
|
+
"content": "d4983d1dcb2a0c2d08369ccd667a8cc79e961adbbfac0b51e3cecc469e6dce44",
|
|
12
|
+
"description": "5a5c5d09a300c7fc2a878d0c53b9c66461d0010f6dd3a3a640e6dfc3b95449ea"
|
|
13
|
+
},
|
|
14
|
+
"cli-index.md": {
|
|
15
|
+
"content": "9f14f34e8a916bdc6d4f133b84906d5cd0f9636013bdc225557a866ee4bab9b6",
|
|
16
|
+
"description": "0657e4c5d654629945d9aba8b852f3239b910f3aa661a544198c1b8e62415e22"
|
|
17
|
+
},
|
|
18
|
+
"cli-list.md": {
|
|
19
|
+
"content": "960c44ec74e467873f1b5315115fa0c20fd282a34c328eb05ad93c273a234ffd",
|
|
20
|
+
"description": "2ebf987dfad37e10ccfb35e3472c53cce1b056baebe27544e99ab8c7d4570be2"
|
|
21
|
+
},
|
|
22
|
+
"cli-mcp.md": {
|
|
23
|
+
"content": "9796c1e40e18fecdd09ab776eb072bae13048fa2044e461abe99fff7bd915c6c",
|
|
24
|
+
"description": "1ae7ae9046c22869216b60151d3054fc12b7397f921f19ff33e403a85dbb2ecd"
|
|
25
|
+
},
|
|
26
|
+
"cli-new.md": {
|
|
27
|
+
"content": "a13b90132e3a863fec98e09b3669eef02d08422943a6def943b147186b795fb6",
|
|
28
|
+
"description": "ec6253508f56ed7cb2ff03ad014f8c4a9a531d257bdae541c2fa05d9d4a36660"
|
|
29
|
+
},
|
|
30
|
+
"cli-open.md": {
|
|
31
|
+
"content": "4ceafc5e0cdf9eb1fc7f1004139566e3175dac136724b73a831e7d9bb641bceb",
|
|
32
|
+
"description": "2858890c81f8c62493e54d99c8774fe321c9b7836659b40b7f0bec7661ac6c88"
|
|
33
|
+
},
|
|
34
|
+
"cli-serve.md": {
|
|
35
|
+
"content": "28ffebdc1bd41ca8cff78501d8a2fedd93151101edea976ef60482aa2fb65e74",
|
|
36
|
+
"description": "11d086f456102ac1dc60ae9c8aacc2170b03b114f044122e16a4868075914c49"
|
|
37
|
+
},
|
|
38
|
+
"cli-stop.md": {
|
|
39
|
+
"content": "2026d934a95ff159bfe0f5040e273dbfe2e29f7fc6645875f7541e88b2b7b2f6",
|
|
40
|
+
"description": "3c513ec4509411d4832c93a80058fb239901cbf058d19a2685f0d7d1690b3072"
|
|
41
|
+
},
|
|
42
|
+
"gen-index.md": {
|
|
43
|
+
"content": "b966605dfa2850ffb931390546d6011f60e22962d3975d9cdeb7a8b948705bc2",
|
|
44
|
+
"description": "bb3cd9d34f014c0674a9285c25ee14b5b4abc5cf941f0d83594c301405e8f3b6"
|
|
45
|
+
},
|
|
46
|
+
"index.md": {
|
|
47
|
+
"content": "901cd3a6ea0862c2ab7fc7469d4cf0b60e50a4b994da3ae165abe7cf06360d73",
|
|
48
|
+
"description": "69cbe9bbc9c2481fbb3f35c034e74389c5440a5a51eb3e04cbf2cd2880c5c2b1"
|
|
49
|
+
},
|
|
50
|
+
"server-src-pixelweaver-__main__.md": {
|
|
51
|
+
"content": "07ad2c6d6880579e8fedf78495e53f963fee5d7449b1eb56dc41f4ba03a0db3e",
|
|
52
|
+
"description": "4fbba20ee6f7401a051787b4b636c269f4321d4c52adfaef99aa152467e4e00a"
|
|
53
|
+
},
|
|
54
|
+
"server-src-pixelweaver-autosave.md": {
|
|
55
|
+
"content": "a5ff1954c1e1de14f809e8cea8e0e508761582cfdd8c4f4a929a8848f7e06c7d",
|
|
56
|
+
"description": "86cf08e89b4fae75853cab4556598ab1b621c1c1e6b57e74204ebe5e31487c3b"
|
|
57
|
+
},
|
|
58
|
+
"server-src-pixelweaver-bridge.md": {
|
|
59
|
+
"content": "ec22b6094a62369b5bd2c1dab13e1cf9ffe2e4def7a59f3cd7dd24c13706695e",
|
|
60
|
+
"description": "f59149fb88c04d693199315d77663ff121e2af71a700eaf0c7867e9373b9b99a"
|
|
61
|
+
},
|
|
62
|
+
"server-src-pixelweaver-cli.md": {
|
|
63
|
+
"content": "0b8bca66ef5ac8650ce6b0e36044bc00a2b241c6f15455e464c3e3449004643b",
|
|
64
|
+
"description": "d9a5d5f6ff0f3b9c67110a03038b65764f60d902b91409de441cf798c13ba933"
|
|
65
|
+
},
|
|
66
|
+
"server-src-pixelweaver-config.md": {
|
|
67
|
+
"content": "a70d05d45ff90395b77e339a9f1a314e50155e3973adff720bce28aac4bd8442",
|
|
68
|
+
"description": "5cf2925e02788d64975d2ec3e536dd699ffa5a2fb2a5ccfa415951430aa9134b"
|
|
69
|
+
},
|
|
70
|
+
"server-src-pixelweaver-connections.md": {
|
|
71
|
+
"content": "b42e0eb5fd45c303fd28e77f4b3c28162d096f284deecc76afc194579002e3cc",
|
|
72
|
+
"description": "542ce4bf0510f8bf8933561d640ce854063146a7456365e0ddead312252c8960"
|
|
73
|
+
},
|
|
74
|
+
"server-src-pixelweaver-main.md": {
|
|
75
|
+
"content": "0b77f4fab2273870937b8315a455d05777405c9efa38e51c3157fbd2433b10bf",
|
|
76
|
+
"description": "6a7b41e1196b43f9a6fc2cea0ccc46c5f2ec41d293ca510ab1a206c2c53f9d70"
|
|
77
|
+
},
|
|
78
|
+
"server-src-pixelweaver-mcp_bridge.md": {
|
|
79
|
+
"content": "8de99cd0a7c36a119db67cb1477a3f350c813d68b844438c346cea1b6186fa49",
|
|
80
|
+
"description": "d1cc47f696014e830caba4fe84f3fc4a4d211ff93e282f2351b096b327173a75"
|
|
81
|
+
},
|
|
82
|
+
"server-src-pixelweaver-mcp_drawing_tools.md": {
|
|
83
|
+
"content": "88f6aa24aaac1ee24ec6c87853ccdcc133cf5f18c092fdbcdb24a2caa363c6c8",
|
|
84
|
+
"description": "4aff70fa933c27cefa5ad633852a344dc15f770ecf68824bf4c6e6ce17d78a55"
|
|
85
|
+
},
|
|
86
|
+
"server-src-pixelweaver-mcp_export_tools.md": {
|
|
87
|
+
"content": "11a9c21c0271e10326af7e96acfa785d4038960f5615e8f6cbb14039d692fde4",
|
|
88
|
+
"description": "4c86a67fba51559397a13750723841024851061a3e96dd851f9d8709f8b65f33"
|
|
89
|
+
},
|
|
90
|
+
"server-src-pixelweaver-mcp_frame_tools.md": {
|
|
91
|
+
"content": "7a75ab97ca30d4dd62fb06c82999d0dc099ed64b08bef04843850cfa7e13d00e",
|
|
92
|
+
"description": "7daa1909b5b4302d4047271360201b46e8efb298f322054442bcfc1777312174"
|
|
93
|
+
},
|
|
94
|
+
"server-src-pixelweaver-mcp_history_tools.md": {
|
|
95
|
+
"content": "09086ace9cb0018588918c626f2503136baa7e3f3b62c05f2a9280c319dcf497",
|
|
96
|
+
"description": "d81b9fb13b588e4a6f169d5b4e3685c3a0646b6632fa7c771f4afbe3e694de94"
|
|
97
|
+
},
|
|
98
|
+
"server-src-pixelweaver-mcp_layer_tools.md": {
|
|
99
|
+
"content": "46c9bdc7cdd37889812dd1eeea351b573e1eeca10a7a7879d55303502fba67b0",
|
|
100
|
+
"description": "3b48da0bd9be722d0f57b321a017b2ef7e04eb347bdd945f9a411611cd2e1fd4"
|
|
101
|
+
},
|
|
102
|
+
"server-src-pixelweaver-mcp_lock.md": {
|
|
103
|
+
"content": "db2c6b4dc2beac801ee2a64b759ce8c68042e573515c51ab6dbdc3f3b451f38c",
|
|
104
|
+
"description": "632bc9647051cb6c9b1771ebe0e15b3c1074a1e8b8e0d6ca9d01c524863ae53a"
|
|
105
|
+
},
|
|
106
|
+
"server-src-pixelweaver-mcp_project_tools.md": {
|
|
107
|
+
"content": "5cda203da7a744485c3f66c046954e1092f1124ef1a09243d5eb97a899dbf1c2",
|
|
108
|
+
"description": "dfc011a4b43661a4e6b4f2fd27bf12bfa5577c94de0af03485c775d363bed992"
|
|
109
|
+
},
|
|
110
|
+
"server-src-pixelweaver-mcp_read_tools.md": {
|
|
111
|
+
"content": "2379a1484b6cbac64f9287cdcf860bafb0e060f9ac4fa88a3fe45fa837a883a2",
|
|
112
|
+
"description": "0f7fa89081635721805fa37f4103121c3d6bf3fdc732bd91ad4b51269b786238"
|
|
113
|
+
},
|
|
114
|
+
"server-src-pixelweaver-mcp_registry.md": {
|
|
115
|
+
"content": "5047e6a0bd45486135e781af7223a5c508d138298db79c5623ff669fb1f8a42d",
|
|
116
|
+
"description": "fbfb1e648de1065359b30aef271234666617d5509b479f85168cee248ff0ad57"
|
|
117
|
+
},
|
|
118
|
+
"server-src-pixelweaver-mcp_resources.md": {
|
|
119
|
+
"content": "feb210489920434384e9bb89795174279ebeab162e4135718111448b63351dd3",
|
|
120
|
+
"description": "9b6f3ee38889382994427f068fabfa84640f73f76cd3170f9f5ad6475a44d513"
|
|
121
|
+
},
|
|
122
|
+
"server-src-pixelweaver-mcp_server.md": {
|
|
123
|
+
"content": "768205ae8712884937f2af681c770d74295eb7516c3dd9c7a54db64a56ce8d41",
|
|
124
|
+
"description": "c78b20be64bacaaaa5cb13020160f91e26dc30e0b70c0df1fb8cc02e12433f4a"
|
|
125
|
+
},
|
|
126
|
+
"server-src-pixelweaver-protocol.md": {
|
|
127
|
+
"content": "04fdc924b15eb8cbd39d6e20a1ab29e2de7594f244c2a4f6a30cebf6b10dd3fe",
|
|
128
|
+
"description": "7185fc586ecc35223768aed96bccac159f77ce9a54358f5aabe317e67d96df33"
|
|
129
|
+
},
|
|
130
|
+
"server-src-pixelweaver-state.md": {
|
|
131
|
+
"content": "edfe1d67f76043a4de0c798c1894931c7a88a762e24c689edc57a004966165b0",
|
|
132
|
+
"description": "0ba44b97965174f658d27777573756d8426724a43f6097224cfec5c82f529523"
|
|
133
|
+
},
|
|
134
|
+
"server-src-pixelweaver-storage.md": {
|
|
135
|
+
"content": "9814dd26bacd306bbbf86a0bcc6b59723ccc8dad5baa8a6a7ea18f85e9889f76",
|
|
136
|
+
"description": "259e01e845e3186b605eb8b2347217526630897352879927beabf6f115a0d0b1"
|
|
137
|
+
},
|
|
138
|
+
"server-src-pixelweaver-websocket.md": {
|
|
139
|
+
"content": "cbf606e1a462082843ad494c7f0a3acf8f15ed0b93b73aacfa6f4646791c48d0",
|
|
140
|
+
"description": "ce2742c41dba8f9a1ecee8b1dab95ae395e4be8bf3126c6f12ad89770efdf86c"
|
|
141
|
+
},
|
|
142
|
+
"server-src-pixelweaver.md": {
|
|
143
|
+
"content": "c5a9b6230677e69865eea75b57802a27c7ec3b9063f4c339c92661bb95b3dd77",
|
|
144
|
+
"description": "01ed8b72d9677d61224caea2a280aa706a8f5ac05625e30fad5a6e1d7072b662"
|
|
145
|
+
}
|
|
146
|
+
}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
{
|
|
2
|
+
"defaults": {
|
|
3
|
+
"app": {
|
|
4
|
+
"env_prefix": null,
|
|
5
|
+
"config": false,
|
|
6
|
+
"global_flags": [],
|
|
7
|
+
"commands": {},
|
|
8
|
+
"groups": {},
|
|
9
|
+
"deprecated": {}
|
|
10
|
+
},
|
|
11
|
+
"flag": {
|
|
12
|
+
"short": null,
|
|
13
|
+
"default": null,
|
|
14
|
+
"env": null,
|
|
15
|
+
"choices": null,
|
|
16
|
+
"repeatable": false,
|
|
17
|
+
"negatable": null,
|
|
18
|
+
"hidden": false
|
|
19
|
+
},
|
|
20
|
+
"arg": {
|
|
21
|
+
"required": true,
|
|
22
|
+
"variadic": false
|
|
23
|
+
},
|
|
24
|
+
"command": {
|
|
25
|
+
"passthrough": false,
|
|
26
|
+
"flags": [],
|
|
27
|
+
"args": []
|
|
28
|
+
},
|
|
29
|
+
"group": {
|
|
30
|
+
"commands": {},
|
|
31
|
+
"groups": {},
|
|
32
|
+
"deprecated": {}
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"name": "pixelweaver",
|
|
36
|
+
"version": "0.1.0",
|
|
37
|
+
"help": "PixelWeaver collaboration server",
|
|
38
|
+
"config": true,
|
|
39
|
+
"commands": {
|
|
40
|
+
"serve": {
|
|
41
|
+
"name": "serve",
|
|
42
|
+
"help": "Start the server",
|
|
43
|
+
"flags": [
|
|
44
|
+
{
|
|
45
|
+
"name": "host",
|
|
46
|
+
"type": "str",
|
|
47
|
+
"help": "Bind address",
|
|
48
|
+
"default": "127.0.0.1"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"name": "port",
|
|
52
|
+
"type": "int",
|
|
53
|
+
"help": "Port",
|
|
54
|
+
"default": 7779
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"name": "reload",
|
|
58
|
+
"type": "bool",
|
|
59
|
+
"help": "Auto-reload on file changes",
|
|
60
|
+
"default": false,
|
|
61
|
+
"negatable": true
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"name": "data-dir",
|
|
65
|
+
"type": "str",
|
|
66
|
+
"help": "Projects directory",
|
|
67
|
+
"default": "./projects"
|
|
68
|
+
}
|
|
69
|
+
]
|
|
70
|
+
},
|
|
71
|
+
"new": {
|
|
72
|
+
"name": "new",
|
|
73
|
+
"help": "Create a new project on disk",
|
|
74
|
+
"flags": [
|
|
75
|
+
{
|
|
76
|
+
"name": "width",
|
|
77
|
+
"type": "int",
|
|
78
|
+
"help": "Canvas width in pixels"
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"name": "height",
|
|
82
|
+
"type": "int",
|
|
83
|
+
"help": "Canvas height in pixels"
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"name": "data-dir",
|
|
87
|
+
"type": "str",
|
|
88
|
+
"help": "Projects directory",
|
|
89
|
+
"default": "./projects"
|
|
90
|
+
}
|
|
91
|
+
],
|
|
92
|
+
"args": [
|
|
93
|
+
{
|
|
94
|
+
"name": "name",
|
|
95
|
+
"help": "Project name"
|
|
96
|
+
}
|
|
97
|
+
]
|
|
98
|
+
},
|
|
99
|
+
"list": {
|
|
100
|
+
"name": "list",
|
|
101
|
+
"help": "List projects on disk",
|
|
102
|
+
"flags": [
|
|
103
|
+
{
|
|
104
|
+
"name": "data-dir",
|
|
105
|
+
"type": "str",
|
|
106
|
+
"help": "Projects directory",
|
|
107
|
+
"default": "./projects"
|
|
108
|
+
}
|
|
109
|
+
]
|
|
110
|
+
},
|
|
111
|
+
"mcp": {
|
|
112
|
+
"name": "mcp",
|
|
113
|
+
"help": "Start the MCP tool server (stdio)",
|
|
114
|
+
"flags": [
|
|
115
|
+
{
|
|
116
|
+
"name": "data-dir",
|
|
117
|
+
"type": "str",
|
|
118
|
+
"help": "Projects directory",
|
|
119
|
+
"default": "./projects"
|
|
120
|
+
}
|
|
121
|
+
]
|
|
122
|
+
},
|
|
123
|
+
"dev": {
|
|
124
|
+
"name": "dev",
|
|
125
|
+
"help": "Development mode with Vite HMR",
|
|
126
|
+
"flags": [
|
|
127
|
+
{
|
|
128
|
+
"name": "host",
|
|
129
|
+
"type": "str",
|
|
130
|
+
"help": "Bind address",
|
|
131
|
+
"default": "127.0.0.1"
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
"name": "port",
|
|
135
|
+
"type": "int",
|
|
136
|
+
"help": "Port",
|
|
137
|
+
"default": 7779
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
"name": "vite-port",
|
|
141
|
+
"type": "int",
|
|
142
|
+
"help": "Vite dev server port",
|
|
143
|
+
"default": 5173
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
"name": "data-dir",
|
|
147
|
+
"type": "str",
|
|
148
|
+
"help": "Projects directory",
|
|
149
|
+
"default": "./projects"
|
|
150
|
+
}
|
|
151
|
+
]
|
|
152
|
+
},
|
|
153
|
+
"open": {
|
|
154
|
+
"name": "open",
|
|
155
|
+
"help": "Launch desktop window",
|
|
156
|
+
"flags": [
|
|
157
|
+
{
|
|
158
|
+
"name": "host",
|
|
159
|
+
"type": "str",
|
|
160
|
+
"help": "Bind address",
|
|
161
|
+
"default": "127.0.0.1"
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
"name": "port",
|
|
165
|
+
"type": "int",
|
|
166
|
+
"help": "Port",
|
|
167
|
+
"default": 7779
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
"name": "browser",
|
|
171
|
+
"type": "bool",
|
|
172
|
+
"help": "Open in browser instead of native window",
|
|
173
|
+
"default": false,
|
|
174
|
+
"negatable": true
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
"name": "data-dir",
|
|
178
|
+
"type": "str",
|
|
179
|
+
"help": "Projects directory",
|
|
180
|
+
"default": "./projects"
|
|
181
|
+
}
|
|
182
|
+
]
|
|
183
|
+
},
|
|
184
|
+
"diagnose": {
|
|
185
|
+
"name": "diagnose",
|
|
186
|
+
"help": "Check runtime environment and dependencies"
|
|
187
|
+
},
|
|
188
|
+
"stop": {
|
|
189
|
+
"name": "stop",
|
|
190
|
+
"help": "Stop the running server"
|
|
191
|
+
}
|
|
192
|
+
},
|
|
193
|
+
"groups": {
|
|
194
|
+
"config": {
|
|
195
|
+
"name": "config",
|
|
196
|
+
"help": "Manage configuration",
|
|
197
|
+
"commands": {
|
|
198
|
+
"path": {
|
|
199
|
+
"name": "path",
|
|
200
|
+
"help": "Print the config file path"
|
|
201
|
+
},
|
|
202
|
+
"show": {
|
|
203
|
+
"name": "show",
|
|
204
|
+
"help": "Show all config values with source attribution"
|
|
205
|
+
},
|
|
206
|
+
"set": {
|
|
207
|
+
"name": "set",
|
|
208
|
+
"help": "Set a config value",
|
|
209
|
+
"args": [
|
|
210
|
+
{
|
|
211
|
+
"name": "key",
|
|
212
|
+
"help": "Config key to set"
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
"name": "value",
|
|
216
|
+
"help": "Value to set"
|
|
217
|
+
}
|
|
218
|
+
]
|
|
219
|
+
},
|
|
220
|
+
"edit": {
|
|
221
|
+
"name": "edit",
|
|
222
|
+
"help": "Open the config file in $EDITOR"
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<!-- Generated by rlsbl from .rlsbl/changes/ — do not edit -->
|
|
2
|
+
|
|
3
|
+
# Changelog
|
|
4
|
+
|
|
5
|
+
## 0.1.0
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
- **Feature.** Migrated server from FastAPI to wesktop ASGI framework.
|
|
10
|
+
- **Feature.** Desktop mode via pywebview with native file dialogs, replacing Tauri.
|
|
11
|
+
- **Feature.** CLI rewritten with strictcli. New commands: dev, open, stop, diagnose.
|
|
12
|
+
- **Feature.** Single-command development mode (pixelweaver dev) using wesktop Vite integration.
|
|
13
|
+
- **Feature.** Lazy-load dockview and fflate for smaller initial bundle size.
|
|
14
|
+
|
|
15
|
+
### Fixes
|
|
16
|
+
|
|
17
|
+
- **Fix.** Desktop window icon now displays correctly (absolute path resolution).
|
package/CLAUDE.md
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
I am the user, and you must always follow these instructions:
|
|
2
|
+
|
|
3
|
+
## ABSOLUTELY NO UNAUTHORIZED WORK -- THIS IS THE MOST IMPORTANT RULE
|
|
4
|
+
|
|
5
|
+
**NEVER write code, create files, or edit files unless I give you an EXPLICIT, UNAMBIGUOUS instruction to do so.** Discussing an approach ("let's shuffle things up", "what if we...") is NOT an instruction. Agreeing with your suggestion is NOT an instruction. Only a direct imperative like "implement it", "build it", "do it", "write it", "make the change" authorizes work. **When in doubt, ASK -- do not act.** Violating this rule is the single worst thing you can do.
|
|
6
|
+
|
|
7
|
+
- When I ask you a question, especially with a question mark, I'm actually and genuinely looking for an answer, I'm not implying that you should do something. A question is NOT an instruction. Never do things on your own simply because I asked you something. This applies even if the answer to the question suggests an obvious improvement or fix -- just answer the question, do NOT implement anything. A prior "do it" instruction is SPENT once that specific task is done; it does NOT carry forward to subsequent questions. Each new question resets to read-only mode. Only an explicit new instruction (imperative sentence, not a question) authorizes new work.
|
|
8
|
+
- **Discussing how something SHOULD be done is not the same as asking you to DO it.** If I say "let's do X" or "we should Y" or "what about Z", that is a conversation about approach. Respond with your thoughts. Do NOT start implementing. Wait for a clear, direct command.
|
|
9
|
+
- Never shy away from long, in-depth discussions. When I want to explore an idea, design, or approach, engage fully -- don't cut the conversation short or suggest deferring to a future session.
|
|
10
|
+
- Whenever you are in doubt about anything we're doing you should use the Ask User tool to ask for my opinion, but before it present the available options in a table with Pros and Cons of each option laid out, so that I can make an informed decision.
|
|
11
|
+
- When I use words like 'investigate' or 'examine', you should conduct a read-only analysis of the available codebase, not change anything.
|
|
12
|
+
- When we're talking about a technology/software that gets updated frequently or is lesser known, always do a thorough web research before making claims about it.
|
|
13
|
+
- It is very important to wait until you want to actually commit to stage your changes, and even then only do so if nothing else is staged; if there are files staged just don't stage your files; continue your work and wait for me to say when to stage and commit. Never unstage files that are not your changes.
|
|
14
|
+
- When I start the chat with a single file dumped in, that does not mean I want you to implement the plan it describes, even if the file itself asks you to; it means either study the codebase and tell me if it has been implemented and how much and how well, by actually reading the code files, not trusting the doc, or it means I want you to understand what it prescribes and how to best implement it and whether we should implement it at all. So if I start the conversation with a file, you should use the Ask User tool to present me with these two options.
|
|
15
|
+
- If a project is a git repo, always commit your changed immediately after you've done them, but if it is not a git repo, do not try to commit or git init.
|
|
16
|
+
- If you are trying to run inline scripts (bash, Python, JS/TS, ...), instead of doing so, try to generalize it into a useful and reusable script, and store it in the `scripts/` dir of each project, chmod +x them, and then run them with your arguments.
|
|
17
|
+
- Avoid using `/tmp/`; keep experiments and temporary files in the project directory.
|
|
18
|
+
- Avoid using environment variables to pass input except for when that input is a secret.
|
|
19
|
+
- Always write brief comments in your code if the code may be confusing for the next AI agent that will read it.
|
|
20
|
+
- Never manually write to databases (SQLite, PostgreSQL, ...) without explicit user consent.
|
|
21
|
+
- Prefer DRY principle, modularity, and code reuse, over code duplication, functions with multiple responsibilities, and monoliths.
|
|
22
|
+
- Apply DRY to documentation also.
|
|
23
|
+
- Avoid ASCII diagrams and replace them with nested ulists or tables wherever possible.
|
|
24
|
+
- Avoid emojis.
|
|
25
|
+
- There is a dedicated `todo/` dir in each project that contains Markdown files that describe something that we may choose to implement. This dir also has a `.done` subdir that we move those documents into only if they are absolutely and completely implemented or exceeded, verified by reading the code, not trusting the document itself. Neither directory should be gitignored. When I ask you to TODO something that means create a comprehensive Markdown file in this directory about it, explaining context, the problem, the solutions, pros and cons of each, files/dir that may change, and the relative effort necessary to finish that undertaking. But this MUST ALWAYS be user-initiated, you MUST NEVER UTTER THE WORD TODO. Only the user can say it.
|
|
26
|
+
- Never enter plan mode on your own, even I say things like "plan this"; I will put you in plan mode myself if I need to. Never do so on your own.
|
|
27
|
+
- You receive timestamps from system hooks (e.g. `UserPromptSubmit hook success: 2026-03-09 21:15:57 CET`). Use these to measure durations between events, notice passage of time (hours between messages may imply context shifts), detect late-night sessions, and generally maintain temporal awareness without needing to run date commands.
|
|
28
|
+
- When fixing a bug, always investigate for the SAME bug pattern in related/sibling functions, nearby files, and analogous code paths, present evidence, and offer to fix it.
|
|
29
|
+
- When given multiple items to fix or implement, make ONE COMMIT PER FIX/ITEM separately as you go. Never bundle unrelated changes into a single commit.
|
|
30
|
+
- When using AskUserQuestion, NEVER use the `preview` field on options. It renders an ugly monospace layout instead of the clean default UI. Just use `label` and `description`.
|
|
31
|
+
- Always use `uv` for Python projects -- never pip. Use `uv init`, `uv add`, `uv run`, `uv sync`, etc.
|
|
32
|
+
- When I choose "Let me pick" on an AskUserQuestion, it means show me another AskUserQuestion with multiSelect: true listing all the individual items so I can check the ones I want. Do NOT respond with a plain text "What do you want?" -- always use the tool.
|
|
33
|
+
- Last but not least: always use subagents for reading/writing files to avoid clogging your own context window. When there are N similar tasks, launch N subagents with similar and ample contexts, in parallel if possible. Once they all finish, synthesize their findings and present them to me. When implementing phases and subphases, launch managers for each phase that launchers implementors and auditor agent pairs, where one does the investigation and implementation, and the other does checks if the code is actually complete, correct, introduces no bugs or unintended consequences, is consistent with the rest of the patterns in the codebase, etc. NEVER DO THE WORK YOURSELF, ALWAYS USE HIGH EFFORT OPUS SUB-AGENTS. Never use other models like Haiku or Sonnet, only Opus. Even when I tell you to do something that doesn't mean you should do it yourself, that means spawn subagents with clear contexts, tell them what they need to know and do and accomplish in clear terms.
|
|
34
|
+
- Never add backward compatibility shims, wrapper methods, or legacy API surfaces to unreleased projects. If the project has not been released or has no external consumers, the old API is dead -- delete it and update all callers. Backward compatibility in immature codebases is not a virtue, it is clutter that misleads future developers and adds maintenance cost for zero users.
|
|
35
|
+
- Never use worktree isolation (`isolation: "worktree"`) when launching subagents. It creates confusing orphan branches and doesn't work as expected. All subagents must work directly in the main working directory.
|
|
36
|
+
- When auditing or reviewing code, always read the actual files on disk (Read tool, not `git show` or `git diff`). The working tree is the truth -- committed code that has been reverted on disk is not real. `git show` reads from the object store, not the filesystem. Auditors must verify what actually runs, not what was once committed.
|
|
37
|
+
- The only exception for any of these rules is when I explicitly and emphatically ask you to go against them, and even then double check with me.
|
|
38
|
+
|
|
39
|
+
## PixelWeaver Architecture
|
|
40
|
+
|
|
41
|
+
### Tech Stack
|
|
42
|
+
- Svelte 5 (runes: $state, $derived, $effect, $props), SvelteKit-free (vanilla Vite)
|
|
43
|
+
- dockview-core for panel docking (framework-agnostic, imperative API)
|
|
44
|
+
- unplugin-icons with Iconify (lucide icon set ONLY -- no pixelarticons)
|
|
45
|
+
- wesktop for server (ASGI micro-router + granian) and desktop (pywebview)
|
|
46
|
+
- strictcli for CLI
|
|
47
|
+
- TypeScript with .js extensions in imports (ESM)
|
|
48
|
+
|
|
49
|
+
### Development Workflow
|
|
50
|
+
- `pixelweaver dev` -- single-terminal development (starts Vite + wesktop server with ViteDevProxy)
|
|
51
|
+
- `pixelweaver serve` -- headless API server (port 7779)
|
|
52
|
+
- `pixelweaver open` -- desktop mode (pywebview native window, serves built frontend from dist/)
|
|
53
|
+
- `pixelweaver open --browser` -- like open but launches default browser instead of native window
|
|
54
|
+
- `npm run dev` -- Vite dev server only (port 5173, for frontend-only work)
|
|
55
|
+
- `npm run build` -- build frontend to dist/
|
|
56
|
+
- Frontend build must exist in dist/ for `pixelweaver serve` to serve the SPA
|
|
57
|
+
|
|
58
|
+
### Plugin System
|
|
59
|
+
- Plugins discovered via `import.meta.glob` in `bootstrap.ts`
|
|
60
|
+
- Each plugin exports a `PluginModule` with `register(api)`
|
|
61
|
+
- `PluginAPI` provides: addCommand, addTool, addPanel, addExporter, addImporter, addShortcut, addMenuItem, addToolbarItem, notify, dismissNotification, dispatch, onCommand
|
|
62
|
+
- 8 reactive registries backed by SvelteMap: command, tool, panel, exporter, importer, shortcut, menu, toolbar
|
|
63
|
+
|
|
64
|
+
### Dockview Gotchas (CRITICAL -- read before touching dock code)
|
|
65
|
+
- `position: fixed` is BROKEN inside dockview panels (transform creates containing block). Portal to document.body instead.
|
|
66
|
+
- Constraints (min/max width/height) are NOT serialized. Must reapply after every fromJSON() via applyPanelConstraints().
|
|
67
|
+
- `initialWidth`/`initialHeight` are suggestions, not enforced. Use maxWidth/maxHeight constraints for hard caps.
|
|
68
|
+
- Panel addition ORDER determines layout tree nesting. Current order: center, top, right, bottom, left (left last = full height).
|
|
69
|
+
- CSS overrides need high specificity to beat dockview's own rules. Match their selector depth.
|
|
70
|
+
- Bump LAYOUT_VERSION in dock-persistence.ts whenever the default layout changes.
|
|
71
|
+
- Detect toolbars by fixed dimensions (min===max), NOT by closeable===false (canvas is also non-closeable).
|
|
72
|
+
- ResizeObserver fires before dockview finishes layout. Debounce initial callbacks by 300ms.
|
|
73
|
+
|
|
74
|
+
### Toolbar System
|
|
75
|
+
- ToolbarPanel.svelte reads from toolbarRegistry filtered by toolbarId
|
|
76
|
+
- Orientation derived from container aspect ratio (ResizeObserver), not configurable
|
|
77
|
+
- Fixed-dimension panels (min===max) get: hidden header, locked group (no-drop-target), fixed size constraints
|
|
78
|
+
- Drawing tools: position left, fixed 50px width
|
|
79
|
+
- View controls: position top, fixed 48px height
|
|
80
|
+
- Only iconSize is persisted in localStorage (toolbar-config.ts)
|
|
81
|
+
|
|
82
|
+
### Menu System
|
|
83
|
+
- MenuContribution registered via api.addMenuItem() with menuPath (slash-separated hierarchy)
|
|
84
|
+
- menu-builder.ts transforms flat contributions into nested tree
|
|
85
|
+
- MENU_ORDER controls top-level ordering: file, edit, view, image, layer, animation, select, effects, context, help
|
|
86
|
+
- Commands need icon field for toolbar/palette display
|
|
87
|
+
- Context menus use menuPath starting with 'context/' (e.g., 'context/canvas')
|
|
88
|
+
|
|
89
|
+
### Design Tokens
|
|
90
|
+
- All colors via CSS custom properties in app.css (--bg-*, --text-*, --border, --accent)
|
|
91
|
+
- Dark theme on :root, light theme on [data-theme="light"]
|
|
92
|
+
- Theme transition: 150ms ease on background-color, color, border-color
|
|
93
|
+
- Canvas workspace background reads --bg-canvas CSS variable at render time
|
|
94
|
+
- Never hardcode colors -- always use design tokens
|
|
95
|
+
|
|
96
|
+
### Notification System
|
|
97
|
+
- notification-state.svelte.ts: priority queue, auto-dismiss timers
|
|
98
|
+
- NotificationBanner.svelte between MenuBar and workspace
|
|
99
|
+
- Plugins use api.notify() / api.dismissNotification()
|
|
100
|
+
- Missing panel detection on layout restore pushes info notification
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 smm-h
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
<!-- Auto-generated by selfdoc from docs/_README.md — do not edit -->
|
|
2
|
+
|
|
3
|
+
# PixelWeaver
|
|
4
|
+
|
|
5
|
+
A pixel art sprite editor built with Svelte 5 and wesktop.
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
PixelWeaver is a desktop-class pixel art editor that runs in a native window or browser. The frontend is built with Svelte 5 (runes, vanilla Vite) and dockview-core for panel docking. The backend is a Python server using wesktop (ASGI micro-router + granian) with pywebview for native desktop windows. An MCP server exposes drawing and project tools for AI agent integration.
|
|
10
|
+
|
|
11
|
+
## Tech Stack
|
|
12
|
+
|
|
13
|
+
| Layer | Technology |
|
|
14
|
+
|-------|-----------|
|
|
15
|
+
| Frontend | Svelte 5, TypeScript, dockview-core, Vite |
|
|
16
|
+
| Server | Python 3.13+, wesktop (ASGI + granian), Pydantic, Pillow |
|
|
17
|
+
| Desktop | pywebview (native OS window) |
|
|
18
|
+
| CLI | strictcli |
|
|
19
|
+
| Icons | unplugin-icons with Iconify (lucide set) |
|
|
20
|
+
| AI integration | MCP server (stdio) |
|
|
21
|
+
|
|
22
|
+
## Install
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
npm install
|
|
26
|
+
uv sync
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Quick Start
|
|
30
|
+
|
|
31
|
+
Development mode (Vite HMR + wesktop server):
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
pixelweaver dev
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Headless server (port 7779):
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
pixelweaver serve
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Desktop window:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
npm run build
|
|
47
|
+
pixelweaver open
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Browser mode:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
npm run build
|
|
54
|
+
pixelweaver open --browser
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Commands
|
|
58
|
+
|
|
59
|
+
| Command | Description |
|
|
60
|
+
|---------|-------------|
|
|
61
|
+
| `pixelweaver dev` | Development mode with Vite HMR |
|
|
62
|
+
| `pixelweaver serve` | Start the headless API server |
|
|
63
|
+
| `pixelweaver open` | Launch desktop window (pywebview) |
|
|
64
|
+
| `pixelweaver open --browser` | Launch in default browser |
|
|
65
|
+
| `pixelweaver new <name>` | Create a new project on disk |
|
|
66
|
+
| `pixelweaver list` | List projects on disk |
|
|
67
|
+
| `pixelweaver mcp` | Start the MCP tool server (stdio) |
|
|
68
|
+
| `pixelweaver diagnose` | Check runtime environment and dependencies |
|
|
69
|
+
| `pixelweaver config show` | Display current configuration |
|
|
70
|
+
| `pixelweaver config set <key> <value>` | Set a config value |
|
|
71
|
+
| `pixelweaver config edit` | Open config file in editor |
|
|
72
|
+
| `pixelweaver config path` | Print config file path |
|
|
73
|
+
|
|
74
|
+
## Architecture
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
src/ Svelte 5 frontend (Vite)
|
|
78
|
+
lib/
|
|
79
|
+
plugins/ Plugin system (tools, panels, exporters, importers)
|
|
80
|
+
...
|
|
81
|
+
server/
|
|
82
|
+
src/pixelweaver/
|
|
83
|
+
cli.py CLI entry point (strictcli)
|
|
84
|
+
main.py ASGI app factory and routes
|
|
85
|
+
state.py In-memory project state
|
|
86
|
+
storage.py Project persistence
|
|
87
|
+
bridge.py pywebview desktop bridge
|
|
88
|
+
websocket.py WebSocket handlers
|
|
89
|
+
mcp_server.py MCP server for AI agents
|
|
90
|
+
protocol.py Shared protocol types
|
|
91
|
+
...
|
|
92
|
+
docs/ Documentation (selfdoc)
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
The frontend communicates with the server over HTTP and WebSocket. In desktop mode, pywebview opens a native window pointing at the local server. In development mode, `pixelweaver dev` starts both Vite (with HMR) and the wesktop server behind a proxy.
|
|
96
|
+
|
|
97
|
+
## Plugin System
|
|
98
|
+
|
|
99
|
+
Plugins are discovered via `import.meta.glob` at bootstrap. Each plugin exports a `register(api)` function that receives a `PluginAPI` with methods for registering commands, tools, panels, exporters, importers, shortcuts, menu items, and toolbar items. Eight reactive registries (backed by SvelteMap) power the UI.
|
|
100
|
+
|
|
101
|
+
## Development
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
npm install # Install frontend dependencies
|
|
105
|
+
uv sync # Install server dependencies
|
|
106
|
+
pixelweaver dev # Start dev server (Vite + wesktop)
|
|
107
|
+
npm run build # Build frontend to dist/
|
|
108
|
+
npm run check # TypeScript checks
|
|
109
|
+
npm run lint # ESLint
|
|
110
|
+
npm run test # Vitest (frontend)
|
|
111
|
+
uv run pytest # Pytest (server)
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## License
|
|
115
|
+
|
|
116
|
+
MIT
|
package/assets/icon.png
ADDED
|
Binary file
|