mirror of
https://github.com/ZSeven-W/openpencil.git
synced 2026-06-01 03:14:29 +07:00
6 commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
bdf37908fd
|
V0.4.3 (#50)
* chore(ai): update dependencies and enhance logging functionality - Bump version of `@github/copilot-sdk` and related packages to `0.1.32` and `1.0.7` for improved features and bug fixes. - Update Discord invite links across multiple README files to the new server. - Introduce a new logging utility in `server/utils/server-logger.ts` for better server process logging, including automatic log cleanup and directory management. - Enhance the `connect-agent.ts` and `install-agent.ts` files to improve OpenCode binary resolution and installation commands. - Refactor `resolve-claude-cli.ts` and `resolve-copilot-cli.ts` to include detailed logging for CLI binary resolution processes. This update improves dependency management, enhances user experience with updated links, and provides better insights into server operations through logging. * chore: bump version from 0.4.0 to 0.4.3 in package.json |
||
|
|
efaa56a9e4
|
V0.4.2 (#46)
* feat(docker): add Docker support with multi-stage build and CI workflow - Introduced a `.dockerignore` file to exclude unnecessary files from the Docker context. - Added a `Dockerfile` for multi-stage builds, optimizing the application for production with a slim runtime. - Created a GitHub Actions workflow (`docker.yml`) to automate the building and pushing of Docker images on version tag pushes. - Enhanced the `connect-agent.ts` and `install-agent.ts` files to improve OpenCode binary resolution and installation commands. - Updated the canvas components to support new polygon shape and related functionalities, including UI adjustments for shape tools and appearance settings. This update significantly enhances the deployment process and expands the application's capabilities with Docker integration. * feat(docker): enhance Dockerfile with multi-stage builds and CLI variants - Updated the Dockerfile to include multiple image variants for different CLI tools, including Claude, Codex, OpenCode, and Copilot, alongside the base web app. - Improved the build process by separating the build stage and production stage, optimizing the final image size. - Added environment variables and commands for each variant to ensure proper execution in production. - Enhanced the README files in multiple languages to document the new Docker deployment options and usage instructions. This update significantly expands the Docker deployment capabilities, allowing users to choose the appropriate image variant based on their needs. |
||
|
|
90bbcb16fd
|
V0.4.0 (#44)
* perf(canvas): bitmap cache during zoom/pan, fix save for large files - Add canvas-zoom-cache: captures pixel snapshot on first viewport change, draws cached bitmap with transform delta (~0.1ms vs ~15ms per frame). Refreshes snapshot every 200ms during continuous interaction. - Integrate zoom cache into wheel zoom and space+drag panning. - Set renderOnAddRemove: false on Fabric canvas to avoid per-object renders. - Remove depth/size LOD from viewport culling (zoom cache handles perf). - Rewrite syncCanvasPositionsToStore: single tree walk + single store set instead of per-object updateNode (was O(n²) with 200+ history pushes). - Unify save/save-as: .op files save in-place, non-.op triggers save-as. - Add Electron filePath storage for reliable native IPC saves. - Add error handling with fallback for all save paths. * feat(canvas): integrate CanvasKit for enhanced rendering and layout - Added support for CanvasKit WASM to improve rendering performance and capabilities. - Introduced a new SkiaCanvas component for rendering using CanvasKit. - Implemented spatial indexing with RBush for efficient hit testing in the Skia engine. - Enhanced text measurement and layout handling using Canvas 2D for accurate word wrapping. - Updated layout engine to accommodate badge and overlay nodes without affecting layout flow. - Bumped version from 0.3.3 to 0.3.4 to reflect these significant changes. * fix(electron): add graceful-fs to devDependencies for Node.js v25 compat (#38) * feat(figma): enhance instance override handling and derived data processing - Added support for symbol tree context in instance conversion. - Improved the application of instance overrides by filtering derived data to exclude nested instances. - Implemented a two-strategy approach for resolving overrides and derived data, accommodating both direct index mapping and expanded DFS for nested instances. - Updated FigmaSymbolOverride interface to extend FigmaNodeChange, enhancing the handling of overridable node properties. * refactor(canvas): remove loading state and enhance error handling in SkiaCanvas - Eliminated the loading state management from SkiaCanvas, simplifying the component. - Updated error handling to directly display error messages without loading indicators. - Adjusted the EditorLayout to directly render SkiaCanvas without suspense, improving performance. - Introduced drag-and-drop file handling in the canvas store for better user experience. - Enhanced Figma import dialog to auto-process pending files from drag-and-drop. * fix(ai): improve error messages for API authentication and connection issues - Updated error hints in chat.ts to provide clearer instructions for API authentication, including running "claude login" or setting the ANTHROPIC_API_KEY in settings.json. - Enhanced friendly error messages in connect-agent.ts to guide users on authentication steps when encountering connection errors. - Refactored resolve-claude-agent-env.ts to improve environment variable normalization, allowing for better handling of ANTHROPIC_CUSTOM_HEADERS and ensuring proper serialization of object values. * refactor(env): streamline environment variable reading and enhance settings handling - Renamed and refactored the function for reading Claude settings to improve clarity and maintainability. - Introduced a new function to read settings from both `settings.json` and `settings.local.json`, ensuring local settings take precedence. - Updated test setup to use the system's temporary directory for security tests, enhancing compatibility across environments. * feat(ai): add fallback models for third-party API proxies in connect-agent - Introduced FALLBACK_CLAUDE_MODELS to provide default model options when supportedModels() fails, enhancing connectivity with third-party API proxies. - Updated error handling in connectClaudeCode to return fallback models on specific connection errors, ensuring users can still connect and select a model. * chore: bump version from 0.3.4 to 0.4.0 in package.json * feat(ai): enhance prompt handling for basic-tier models - Introduced logic to inline system prompts into user messages for basic-tier models (e.g., MiniMax, GLM) to ensure proper instruction visibility. - Updated design modification and orchestrator functions to accommodate this change, improving interaction with third-party routers. - Added a utility function to strip non-standard XML-like tags from AI responses, enhancing JSON extraction reliability. * fix(server): add ESM-compatible __dirname polyfill (#42) - Add fileURLToPath/dirname polyfill to mcp-install.ts - Add fileURLToPath/dirname polyfill to mcp-server-manager.ts Fixes browser version crash with "__dirname is not defined" Fixes MCP over HTTP transport failure since v3.3 Closes #37 * fix(server): make MCP HTTP server survive parent process lifecycle (#43) ## Problem The MCP HTTP server process died when: 1. User closed the Settings/Agent dialog in the UI 2. User interacted with the editor canvas 3. Nitro server hot-reloaded or restarted 4. Electron app sent SIGTERM to Nitro on window close This made the MCP server unusable for HTTP transport, requiring users to keep the settings dialog open constantly. ## Root Cause Analysis The MCP server was spawned as a regular child process without detached mode. This created several fatal dependencies: 1. **Signal propagation**: Lines 29-34 registered handlers for SIGINT, SIGTERM, SIGHUP that killed the MCP process when the parent received these signals (e.g., Electron closing Nitro) 2. **Parent-child lifecycle binding**: Without detached mode, the child process is tied to the parent's event loop. Any parent instability (hot reload, dialog closure causing microtasks, etc.) could affect the child 3. **In-memory process tracking**: The mcpProcess variable was stored in module memory, so Nitro restarts/hot-reloads would lose track of the running server ## Solution 1. **Detached spawn mode**: Use `detached: true` + `unref()` to make the MCP process completely independent of the parent 2. **PID file persistence**: Track the process via files in /tmp instead of in-memory variables, surviving parent restarts 3. **Remove signal handlers**: Delete the SIGINT/SIGTERM/SIGHUP handlers that were killing the MCP process 4. **Cross-platform kill**: Use process.kill() instead of execSync with taskkill for safer process termination ## Testing ### Test Case 1: Settings Dialog Close - Open OpenPencil → Settings → Start MCP HTTP Server - Close settings dialog - Reopen settings → MCP server still running ✅ ### Test Case 2: Editor Interaction - Start MCP HTTP Server - Draw on canvas, create shapes, use all tools - Check MCP server status → Still running ✅ ### Test Case 3: Browser Version - Run `npx vite --port 3000` - Start MCP from browser UI - Close tab, reopen → Server still running ✅ ### Test Case 4: Electron App - Start MCP from installed app - Close app window - Reopen app → Server still running (tracked via PID file) ✅ ### Test Case 5: Stop/Restart Cycle - Start → Stop → Start again - Works correctly ✅ ## Files Changed - server/utils/mcp-server-manager.ts - Complete rewrite with detached mode - server/api/ai/mcp-install.ts - Add ESM __dirname polyfill Fixes #37 Co-authored-by: Kayshen Xu <kayshen.xu@gmail.com> * fix(canvas): respect node-level theme overrides during variable resolution (#41) Previously, resolveNodeForCanvas was called with a single activeTheme for all nodes, ignoring any per-node theme property. This meant nodes with theme: {"Mode": "Light"} would still render using Dark mode colors. This fix merges each node's theme property with the default activeTheme, allowing individual nodes to override theme axes for proper themed variable resolution. Fixes design documents where some panels need different theme variants than the default (e.g., Light mode components in a Dark mode document). Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Kayshen Xu <kayshen.xu@gmail.com> * feat(ai): enhance text processing by stripping tool call blocks - Added a new function to strip fake tool call blocks emitted by basic-tier models, ensuring cleaner JSON extraction. - Updated the existing text processing flow to incorporate this new function, improving the handling of non-standard model artifacts. - Modified orchestrator prompts to disallow function calls and tool call syntax in JSON outputs, enhancing response consistency. * fix(server): resolve merge conflict and clean up ESM __dirname polyfill - Removed merge conflict markers from mcp-install.ts and mcp-server-manager.ts. - Ensured consistent implementation of ESM-compatible __dirname polyfill across both files. * feat(ai): add node availability check and HTTP fallback for MCP server installation - Implemented a function to check for the availability of Node.js on the system, enhancing compatibility for environments without Node.js. - Added a fallback mechanism to install the MCP server using an HTTP URL when Node.js is not found, ensuring functionality remains intact. - Updated the installation response to include a flag indicating if the HTTP fallback was used, allowing the UI to reflect the server status accurately. - Enhanced the agent settings dialog to synchronize the MCP server status when the HTTP server is auto-started. * refactor(canvas): replace Fabric.js with CanvasKit/Skia for enhanced rendering performance - Removed Fabric.js dependencies and related code, transitioning to CanvasKit/Skia as the primary canvas engine. - Updated documentation and README files to reflect the new canvas technology. - Adjusted data flow and component interactions to accommodate the new rendering engine. - Ensured backward compatibility by retaining legacy Fabric.js files for specific utilities until full removal is feasible. * refactor(canvas): update layout engine and remove Fabric.js dependencies - Enhanced the canvas layout engine by integrating Skia and CanvasKit, replacing Fabric.js references. - Improved type safety by refining type assertions and imports across various components. - Added a new function to retrieve canvas dimensions, defaulting to 800x600 if no engine is mounted. - Removed obsolete rendering logic related to Fabric.js, streamlining the layout indicator functionality. - Updated multiple components to utilize the new canvas size retrieval method, ensuring consistent behavior across the application. * fix(figma): resolve multiple .fig import rendering issues - Fix layout properties in preserve mode: only apply auto-layout (gap, padding, justify, align) for frames with stackMode, use absolute positioning for non-auto-layout frames - Reverse children order for auto-layout frames in preserve mode to match Figma's layout flow order (tree builder sorts descending for z-stacking but layout needs ascending) - Fix instance inlining: always inline symbol content when instance has no local children, regardless of override/derived data presence - Fix derived data mapping: use direct GUID matching (Strategy 0) when derived guidPath GUIDs are actual symbol node GUIDs, preventing the off-by-one size/transform misassignment from index-based mapping - Add styleIdForFill/styleIdForStrokeFill resolution: resolve fill style references to inline paints before tree building, fixing missing fills on 448+ nodes including active menu items and styled elements - Fix collectImageBlobs to detect JPEG/GIF/WebP in addition to PNG - Fix instance override application: apply overrides even when derived data is absent * fix(figma): skip opacity=0 nodes during import to fix breadcrumb visibility Nodes with opacity <= 0 are now skipped in convertChildren, along with all their descendants. This fixes the breadcrumb "Page / Page / Page" text showing through despite the parent items having opacity=0, since the Skia renderer does not propagate parent opacity to child nodes. * fix(figma): resolve styleIdForFill in instance override entries Style references (styleIdForFill, styleIdForStrokeFill) inside symbolOverrides were not being resolved to inline paints. This caused text nodes in overridden instances (e.g. "All Products" card on blue background) to retain the symbol's default colors instead of the instance-specific white fills. The resolveStyleReferences pre-processing step now iterates into each node's symbolData.symbolOverrides array and resolves style references there as well. * fix(figma): apply icon colors and fix arc rendering in .fig import - Fix donut chart missing segment: swap start/end angles when endingAngle < startingAngle instead of adding 2π, producing correct clockwise arc equivalents for counter-clockwise Figma arcs - Fix icon stroke thickness: scale strokeWeight proportionally in scaleTreeChildren, applyInstanceOverrides derived sizing, and convertVector for Lucide icons rendered smaller than 24×24 - Fix nested instance color overrides: build nestedOverrideMap from multi-guid override paths (e.g. instanceGuid/childGuid) and inject child-scoped overrides into nested INSTANCE symbolOverrides, enabling Dashboard Summary Card icons to receive white/blue stroke colors - Fix override-only instances: when derivedSymbolData is empty but symbolOverrides exist (e.g. sidebar icon instances with stroke color overrides but no size changes), fall through to direct GUID matching so stroke paints are correctly applied - Include strokePaints in hasVisualOverrides check so instances with stroke-only overrides are properly inlined with their symbol children * feat(canvas): add vector text rendering with bundled fonts for Figma import Replace bitmap text fallback with CanvasKit Paragraph API for true vector text rendering. Bundle 11 popular font families locally via @fontsource packages to ensure reliable rendering in regions where Google Fonts CDN is unavailable. Key changes: - SkiaFontManager: local-first font loading with Google Fonts fallback - Paragraph API rendering with caching, styled segments, and alignment - Fixed-width text tolerance to prevent unwanted line wrapping from font metric differences between Figma and CanvasKit - Auto-width text manual alignment offset (center/right) to avoid infinite layout width issues - Figma text mapper: support RAW lineHeight units - Figma import dialog: pre-load fonts after conversion * fix(canvas): align text centering with CanvasKit and improve font fallback - Replace Fabric.js FONT_SIZE_MULT (1.13) with actual paragraph height (fontSize * lineHeight) for cross-axis text centering, fixing icon vertical misalignment in horizontal layouts - Remove Fabric-specific optical correction (getTextOpticalCenterYOffset) since CanvasKit halfLeading handles this correctly - Add font fallback chain with separate Inter Ext family for latin-ext glyph coverage (₦ U+20A6 etc.) - Cache failed font loads to prevent repeated fetch attempts per frame - Skip Google Fonts requests for known system/proprietary fonts (PingFang SC, Microsoft YaHei, D-DIN-PRO, etc.) * fix(figma): recursive nested instance expansion and CJK font support - Fix 3 bugs in applyInstanceOverrides() that broke deeply nested Figma component instances (6+ levels): propagate multi-guid derivedSymbolData to nested instances, resolve virtual GUIDs via pkToNodeGuid map, and build nestedDerivedMap alongside nestedOverrideMap for recursive expansion - Bundle Noto Sans SC (chinese-simplified + latin subsets, 400/700 weights) for offline CJK vector text rendering without Google Fonts dependency - Add Noto Sans SC to font fallback chain for CJK glyph coverage - Add China CDN mirror (fonts.font.im) as fallback when Google Fonts is inaccessible, with 4s timeout on primary CDN - Increase .fig file size limits to 150MB compressed / 300MB decompressed * fix(canvas): enhance CJK font support and pre-load Noto Sans SC - Update SkiaEngine to pre-load Noto Sans SC alongside Inter for improved CJK glyph coverage in the font fallback chain, preventing rendering issues with system fonts. - Modify FigmaImportDialog to ensure Noto Sans SC is included when primary fonts are system fonts, ensuring proper rendering of CJK text. * refactor(figma): optimize instance override handling with full DFS strategy - Replace hybrid skip-INSTANCE and expanded DFS with a unified full DFS approach for handling all node types, including INSTANCE nodes. - Update the mapping logic to ensure correct localID assignments and improve the handling of overflow entries during instance expansion. - Enhance the overall structure and readability of the applyInstanceOverrides function by consolidating the traversal methods. * refactor(figma): improve layout mapping and instance override logic - Enhance the mapFigmaLayout function to conditionally set gap based on stackSpacing and justifyContent, ensuring compatibility with Figma's layout behavior. - Simplify the applyInstanceOverrides function by removing redundant logic and focusing on a unified full DFS approach for node mapping, improving clarity and performance. - Ensure derivedSymbolData is correctly replaced with nested data from outer instances, preventing incorrect merging of entries. * refactor(figma): enhance instance override logic with root-inclusive DFS - Introduce a root-inclusive depth-first search (DFS) to accurately detect and skip overrides targeting the symbol root during instance processing. - Update the applyInstanceOverrides function to improve clarity and performance by refining the handling of derived data and overrides. - Ensure that overrides targeting the root are excluded from child nodes, preventing incorrect application of overrides in nested instances. --------- Co-authored-by: Fini <fini.yang@gmail.com> Co-authored-by: Related8919 <191752213+Related8919@users.noreply.github.com> Co-authored-by: Hrijul Dey <44521405+hr1juldey@users.noreply.github.com> Co-authored-by: Claude <noreply@anthropic.com> |
||
|
|
4af8ef412b
|
V0.3.3 (#33)
* fix(ai): add icon name aliases and fix multi-path SVG concatenation Add 55+ common icon name aliases (burger→hamburger, sushi→fish, etc.) to both client icon-resolver and server icon API for robust AI-generated icon resolution. Register Lucide's own aliases for broader coverage. Fix SVG path concatenation bug where joining multiple <path> d-values caused incorrect rendering — a standalone <path> treats initial lowercase "m" as absolute, but after concatenation it becomes relative to the previous sub-path endpoint. Now ensures each sub-path starts with absolute "M". Add tryAsyncIconFontResolution for icon_font nodes that miss local lookup — fetches from server API, caches result, and triggers canvas re-render. * fix(canvas): preserve badge/overlay absolute positioning in auto-layout Add isBadgeOverlayNode() detector for badge, indicator, notification-dot, and overlay nodes. These nodes now retain their x/y coordinates instead of being stripped by layout sanitization. Update computeLayoutPositions to exclude badge nodes from the layout flow — they keep absolute positioning and render on top (prepended for correct z-order in reverse iteration). * fix(ai): prevent duplicate canvas objects and fix emoji-to-icon pipeline Streaming path: add ensureUniqueNodeIds before inserting nodes to prevent ID collisions across multiple AI generations. Track newly inserted IDs so subsequent streaming nodes don't collide either. Canvas sync: deduplicate Fabric objects sharing the same penNodeId — keep only the one tracked in objMap, remove stale duplicates. Badge nodes: use shared isBadgeOverlayNode() for z-order insertion and skip x/y stripping in layout parents. Fix emoji-to-icon pipeline: re-run applyIconPathResolution after applyNoEmojiIconHeuristic converts emoji text nodes to path nodes, so the icon resolver can match by name (e.g. "Pizza Emoji Path" → pizza). * fix(canvas): add async icon resolution fallback for icon_font nodes When lookupIconByName fails locally, queue tryAsyncIconFontResolution to fetch from server API. Cache result in ICON_PATH_MAP and trigger canvas re-render via store update. Store iconFontName and iconStyle on Fabric object for sync tracking. * fix(ai): strengthen emoji ban in prompts and improve orchestrator defaults Update all AI prompts to explicitly ban emoji characters with concrete examples and redirect to icon_font nodes instead of the previously incorrect "path nodes" guidance. Add z-order rule to orchestrator prompt: overlay elements must come before content they overlap. Add padding support to OrchestratorPlan rootFrame type. Default mobile root frame gap to 16 for consistent spacing. * feat(electron): add publisher name to Windows build configuration Updated the `electron-builder.yml` to include a publisher name for Windows builds, enhancing the identification of the application during installation. Additionally, revised the README files across multiple languages to reflect the new project description and features, emphasizing OpenPencil as the world's first AI-native open-source vector design tool with concurrent agent teams and design-as-code capabilities. --------- Co-authored-by: Fini <fini.yang@gmail.com> |
||
|
|
ca1b5370ae
|
V0.3.0 (#24)
* feat(boolean-operations): implement boolean operations in the editor - Added a new BooleanToolbar component for union, subtract, and intersect operations. - Integrated boolean operations into the layer context menu and keyboard shortcuts. - Enhanced the editor layout to include the boolean toolbar for improved user interaction. - Updated internationalization support with new translation keys for boolean operations. - Bumped version to 0.3.0 to reflect the addition of these features. * refactor(editor): update editor layout and panels for improved functionality - Replaced the PropertyPanel with a new RightPanel that includes both Property and Code panels. - Removed the CodePanel from the main editor layout and integrated it into the RightPanel. - Updated keyboard shortcuts to switch the right panel to the code tab. - Enhanced the LayerPanel with a resizable width feature for better user experience. - Added internationalization support for new right panel labels and code panel features. - Introduced new code generation capabilities for various frameworks in the CodePanel. - Improved overall layout structure for better responsiveness and usability. * feat(electron): implement .op file association and enhance file handling - Added support for .op file association in electron-builder, allowing OpenPencil documents to be opened directly from the file system. - Implemented IPC handlers for opening and reading .op files, ensuring proper loading of document content. - Enhanced the main process to handle file opening events on macOS and single-instance locking on Windows/Linux. - Updated the renderer to listen for file open events and load documents accordingly. - Improved README to reflect new file association feature. * fix(canvas): improve layout accuracy for AI-generated designs - Unify lineHeight default via canonical defaultLineHeight() function - Unify text measurement by removing duplicate estimators in generation-utils - Fix optical centering formula to scale proportionally with fontSize - Round layout positions to whole pixels to prevent sub-pixel artifacts - Recursively sanitize nested x/y in streaming layout containers - Fix input trailing icon alignment using fill_container instead of space_between * feat(canvas): right-align agent badge and add breathing glow border - Agent badge now right-aligned to frame's right edge instead of after label - Added breathing glow border around agent-owned frames during generation - Glow border uses same color and lifecycle as the agent badge - Removed unused BADGE_GAP constant and useDocumentStore import * feat(code-panel): enhance tab scrolling functionality and add scrollbar utility - Introduced left and right scroll buttons for tab navigation in the CodePanel, improving user experience for navigating long tab lists. - Added a custom utility to hide scrollbars for a cleaner interface. - Updated styles for better responsiveness and usability in the CodePanel layout. * fix(docs): update Discord invite links in multiple README files - Replaced outdated Discord invite links with the new link across all language-specific README files. - Ensured consistency in the documentation for community engagement. * feat(code-panel): enhance system prompt for responsive design - Updated the ENHANCE_SYSTEM_PROMPT to emphasize the importance of responsive design in code rewriting. - Added detailed guidelines for converting fixed pixel widths to relative units and using responsive Tailwind breakpoints. - Ensured that the output remains visually faithful on desktop while adapting gracefully across screen sizes. * feat(docs): add WeChat group information to README.zh.md and include group image - Introduced a new section in the Chinese README to provide details about the WeChat group for community engagement. - Added an image representing the WeChat group for better visibility and user interaction. * feat(electron): enhance theme management and title bar overlay for Windows/Linux - Updated the `setTheme` method in the Electron API to accept custom colors for the title bar overlay, improving theme synchronization across platforms. - Adjusted title bar overlay colors for Windows and Linux to ensure proper visibility and aesthetics. - Enhanced the top bar component to read computed CSS colors and apply them dynamically, ensuring a consistent user interface. - Improved handling of theme changes in the application to support background and foreground color customization. * fix(screenshot): update screenshot image for improved clarity and quality * fix(docs): update WeChat group image path in README.zh.md for consistency * fix(ai): fix post-generation validation pipeline and text centering - Fix Agent SDK validation: save temp screenshots inside project dir (.openpencil-tmp/) so Claude Code plan mode can read them, instead of /tmp/ which is outside the project sandbox - Enrich validation tree dump with fill colors, stroke, fontSize, fontWeight, textAlign, cornerRadius, opacity for comprehensive visual analysis - Add multi-round validation with quality scoring (threshold 8/10), 500ms stabilization delay between rounds - Add detailed debug logging to applyValidationFixes showing which nodes were found/skipped and property changes - Fix canvas sync needsTextbox check to also account for textAlign (matching isFixedWidthText in factory), preventing IText↔Textbox thrashing on every sync tick - Auto-center text in vertical+center layouts by expanding to full container width and injecting textAlign:'center' - Force Textbox for non-left-aligned text so textAlign is respected (IText ignores width and computes its own) * fix(canvas): use precise text width estimation for fit-content layout Remove the 14% safety factor from text width estimation when computing fit-content/natural-width text dimensions. IText auto-computes its own width and ignores our setting, so the safety margin only inflated the layout allocation, making text appear left-shifted within its container. * fix(canvas): center fit-content text in horizontal layouts For text nodes with fit-content width in horizontal layouts, set textAlign:'center' to compensate for width estimation inaccuracy. The estimated box is typically wider than the actual rendered text, causing left-aligned text to appear visually shifted. Centering distributes the estimation error evenly on both sides. * feat(ai): show validation details in checklist panel - Accumulate validation log (screenshot, analysis, fixes) instead of overwriting status messages, so the full process is visible - Preserve step thinking content in buildFinalStepTags (was discarded) - Add details field to pipeline items and render in checklist UI - Each validation step now shows: screenshot captured, issues found, quality score, fixes applied * feat(ai): add visual reference pipeline types and integration hooks - Add DesignSystem and VisualReference types to ai-types - Add 'visual-ref' mode to AIDesignRequest and SubTask.htmlReference - Detect visual-ref candidates in chat handlers (landing pages, websites) - Wire visual-ref mode in design-generator and orchestrator - Inject HTML reference snippets into sub-agent prompts * feat(ai): add modular design principles for sub-agent context - Add design-principles module with topic files: color, typography, spacing, composition, components - Selectively load relevant principles based on prompt content - Inject design principles into sub-agent system prompts * feat(ai): implement visual reference pipeline - Add design-system-generator: generates color/typography/spacing tokens - Add design-code-generator: generates HTML/CSS from design system - Add html-renderer: renders HTML to screenshot via html2canvas - Add visual-ref-orchestrator: coordinates the full pipeline (design system → HTML code → screenshot → enrich subtasks) - Add html2canvas dependency for client-side HTML rendering * feat(mcp): default filePath to live canvas and fix cross-platform issues - Default all MCP tool filePath to live://canvas when omitted, so tools operate on the real-time canvas instead of stale files - Remove filePath from required params in all tool schemas (21 interfaces) - Fix mcp-server-manager.ts using process.cwd() which fails in Electron production on Linux — now checks ELECTRON_RESOURCES_PATH first - Fix stopMcpHttpServer using SIGTERM on Windows — use taskkill instead - Force new children reference in applyExternalDocument to ensure canvas sync subscriber always detects MCP-pushed document updates * feat(mcp): enhance design prompt with semantic roles, CJK typography, and layout rules Add comprehensive design knowledge to MCP design prompt for better AI-generated designs: design type detection (mobile vs desktop), full semantic role reference with context-aware defaults, CJK typography rules, expanded text/layout/form guidelines, and detailed post-processing documentation. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat(ai): implement intent classification for chat handlers - Replace hardcoded keyword matching with a lightweight LLM call to classify user intent in chat messages. - Introduce a new function `classifyIntent` to determine if the request is for design generation or conversation. - Update design request handling in `useChatHandlers` to utilize the new classification method. - Enhance design prompt documentation to reflect changes in design type detection based on intent rather than keywords. * fix(ai): handle string qualityScore in validation response parsing The LLM sometimes returns qualityScore as a string (e.g. "8" instead of 8), causing it to fall through to 0. Also hide misleading "quality: 0/10" display when the score couldn't be determined, and log raw response for debugging. * fix(ai): increase validation timeout to 90s and fix quality score parsing Agent SDK validation requires spawning a process, reading the image, and analyzing it — 30s was consistently timing out. Also handle string qualityScore values from LLM responses and hide misleading 0/10 display. * fix(ai): fix validation timeout and response parsing - Increase validation timeout from 30s to 180s (Agent SDK needs time for subprocess spawn + OAuth auth + multi-turn image reading) - Strip <tool_use> XML blocks from Agent SDK response before extracting JSON — the tool call XML was confusing the regex, causing qualityScore to parse as 0 despite valid JSON being present - Handle string qualityScore values and hide misleading "quality: 0/10" - Revert unnecessary direct API key approach for validation * fix(ai): prevent node ID collisions between generations When generating new content on a canvas with existing nodes, AI-generated IDs (e.g. brand-spacer) would collide with previous generations. Now captures pre-existing node IDs at generation start and checks against them during upsert sanitization. Remapped IDs are tracked in generationRemappedIds so progressive streaming updates can still find their nodes. * fix(ai): require styleGuide in orchestrator plan and fix validation detail icons - Add fallback default styleGuide when orchestrator LLM omits it - Strengthen prompt to mark styleGuide as REQUIRED - Replace emoji icons in validation details with [done]/[pending]/[error] markers for consistent styling with the checklist design system * feat(server): add port file plugin for server instance discovery - Introduce a new Nitro plugin that writes a port file on server startup to allow the MCP server to discover the running instance, whether it's a development server or Electron. - Implement error handling in the Electron main process for writing the port file, logging any failures. - Update Vite configuration to include additional external dependencies in the rollup configuration. * feat(electron): implement IPC for retrieving pending file paths - Added a new IPC handler `file:getPending` to retrieve and clear the pending file path when the React app mounts. - Updated the Electron API to include `getPendingFile` for renderer access. - Enhanced the `useElectronMenu` hook to load any pending file on application startup. - Updated UI components to reflect changes in file handling and improved user experience. * fix(panels): replace emoji icons with styled icons in validation checklist - Parse [done]/[pending]/[error] prefixes in detail lines and render as styled circle icons matching the parent checklist design system - Replace remaining emoji markers in design-validation.ts with text prefixes - Fix isApplied detection to recognize new [done] Applied marker * refactor(electron): update settings path to use platform-standard app data directory - Changed the settings file path to utilize Electron's user data directory for better cross-platform compatibility. - Updated the settings writing function to ensure the user data directory is created if it doesn't exist. - Added comments to clarify the storage location for different operating systems. - Implemented a fixed partition for localStorage/cookies to maintain data across server port changes. * feat(ai): enhance validation with pre-checks, structural fixes, and border detection - Add design-pre-validation.ts: pure code checks before LLM validation - Invisible container detection (same fill as parent → auto-add border) - Sibling consistency (majority-rule for height/cornerRadius) - Add structural fixes to validation: addChild/removeNode operations - Icon injection via lookupIconByName with server fallback - autoFixParentLayout with child count guard to prevent layout breakage - Add strokeColor/strokeWidth to safe fix properties for border fixes - Simplify intent classification: all design requests use visual-ref pipeline - Fix checklist: "Found N issues" now shows [done] instead of [pending] - Fix qualityScore: only update when > 0 to preserve valid round scores * fix(ai): cherry-pick safe validation improvements, drop aggressive pre-checks Keep: stroke tree dump bug fix (object not array), qualityScore=0 false positive detection, fit_content→fixed safety guard, empty path removal, type-specific sibling consistency, repeated fix filtering, screenshot extraction to design-screenshot.ts. Drop: detectForcedFixedHeight (destroyed input/button heights), MAX_VALIDATION_ROUNDS 5 (too many rounds), removal of quality threshold early stop, section regeneration phase. --------- Co-authored-by: Fini <fini.yang@gmail.com> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> |
||
|
|
3fb029d9a7
|
V0.2.0 (#21)
* feat(ai): add agent identity system with visual indicators for concurrent generation - Agent identity: assign unique colors and names to each sub-agent - Canvas indicators: breathing glow border + name pill above streaming nodes - Preview effect: outline appears 500ms before element materializes - Screen grouping: subtasks with same `screen` field share one root frame, fixing multi-page apps being split into too many frames - Screen-level parallelism: subtasks within same screen run sequentially (preserving section order), different screens run in parallel * fix(canvas): make agent indicator visual effect much more dramatic - Outer glow: 8px soft border for visible halo effect - Inner border: 2.5px sharp crisp border at high alpha - Preview fill: 10-15% alpha (was ~1% before, essentially invisible) - Breathing: faster cycle (400ms), higher range [0.35, 0.95] - Name pill: larger font (11px), bold 700, drop shadow - Pill dedup: only draw one name pill per agent (not per node) - Rounded rect helper for polished pill rendering * fix(canvas): use globalThis for agent indicator state to prevent module isolation Vite module splitting can create separate module instances for the same file when imported from different chunks. This causes the indicator Map written by the orchestrator (services/ai/) to be a different instance than the one read by the canvas hook (canvas/). Using globalThis guarantees a single shared instance across all chunks. * feat(i18n): enhance internationalization support by integrating i18next for translation in various components. Added new dependencies: i18next, i18next-browser-languagedetector, and react-i18next. Updated UI elements in the editor, toolbar, and status bar to utilize translation keys for improved localization. Enhanced README with language options for better accessibility. * feat(auto-update): implement auto-update functionality with settings management - Added auto-update feature to check for updates at app startup and periodically while running. - Introduced settings for enabling/disabling auto-update, stored in a JSON file. - Integrated IPC handlers to manage auto-update settings from the renderer process. - Created new API endpoints for managing MCP server status, including start/stop functionality. - Enhanced the UI to support theme presets, allowing users to save and load variable presets. - Updated internationalization support for new UI elements related to auto-update and presets. * feat(ai): add element boundaries to orchestrator subtask planning Orchestrator now outputs an "elements" field per subtask listing the specific UI elements it owns. Sub-agent prompts display these boundaries so each agent knows exactly what to generate and what belongs to other sections, preventing content duplication across subtasks. Also includes: sequential cascade reveal animation, agent indicator recursive tagging, delayed indicator removal, single-agent identity for sequential mode, model name truncation fix. --------- Co-authored-by: Fini <fini.yang@gmail.com> |