Commit graph

76 commits

Author SHA1 Message Date
Danila Poyarkov c2ab9cc621 ci: pin Bun setup in routing and result jobs 2026-09-13 20:11:27 +03:00
Danila Poyarkov d5b7834b7f ci: route documentation changes through a required result gate 2026-09-13 19:53:58 +03:00
Danila Poyarkov c2aec9bacb
fix(packages): make packed exports runtime-safe (#665)
* fix(packages): make packed exports runtime-safe

Make checked-in package manifests truthful for ordinary npm and Bun packing, and verify installed artifacts under both runtimes. Centralize package discovery, artifact inspection, and bounded process execution so CI and release publication share the same contracts.

* ci: build package dependencies before checks

Keep workspace jobs independent of ignored dist output now that public package exports consistently resolve built artifacts.

* ci: preserve source-first engine tests

Keep the broader dependency build for package and repository validation, but retain Core-only setup for engine shards so workspace tests continue exercising source modules.

* ci: build engine shard dependencies

Build the seven workspace packages imported by engine tests in dependency order. This preserves a single module instance per package and keeps each clean CI shard independent of ignored dist output.

* ci: restore established package build boundaries

Keep the original repository and engine job setup, and add installed artifact verification only after the existing package build. Avoid changing which module copies unrelated tests execute.

* fix(packages): preserve Bun source identity in tarballs

Retain source-first workspace resolution and ship complete source trees for Bun conditions. Verify clean installed consumers without overlaying archives, reuse consumer validation before release publication, and repair Bun 1.3.10 private source alias resolution.

* refactor(tooling): reuse package and process utilities

Use pkg-types for manifest I/O and types, tinyexec for subprocess lifecycle, and npm's pack listing for release staging. Preserve archive verification and project release invariants rather than reimplementing package-manager file selection.

* refactor(tooling): resolve workspace roots at CLI boundaries

Discover and validate the nearest workspace once, support explicit roots, and pass roots to reusable checks. Replace subprocess entrypoint dispatch with direct calls and preserve aggregate package diagnostics without adding arbitrary test timeout increases.

* fix(release): enforce publication boundaries

Use root version alignment and shared validated npm output parsing. Enforce the public npm registry policy and test verification-before-publication, mismatched artifacts, and partial retries without registry writes.

* refactor(tooling): validate package responses with Valibot

Express npm pack and manifest identity contracts as schemas, infer parsed output types, and preserve contextual failures and relative-path safety. Document Valibot as the first-party validation convention while retaining Zod at SDK boundaries.

* refactor(tooling): validate manifests at input boundaries

Share Valibot schemas for consumed manifest fields, recursive exports, supported workspace declarations, and npm registry responses. Infer domain types and reject malformed metadata instead of silently skipping it downstream.

* refactor(tooling): group package helpers by ownership

Colocate manifest and workspace contracts, separate npm response parsing from generic JSON handling, and split smoke packing, installation, and runtime checks. Remove the release tarball forwarding shim and consolidate its coverage in package-artifacts. Preserve public tooling exports and CLI commands.
2026-09-09 18:25:22 +03:00
Danila Poyarkov 62ba072b26
refactor(ai): ship Harness as optional companion (#561)
* Revert "feat(ai): add HarnessAgent sidecar foundation (#560)"

This reverts commit 83a5ea1b42.

* Revert "Revert "feat(ai): add HarnessAgent sidecar foundation (#560)""

This reverts commit 0d8c03515888c62dc47186d4a3b0b7b04e78f8af.

* refactor(ai): ship Harness as optional companion

* fix(ai): support Harness companion on Windows

* test(ai): restore navigator after Harness Windows test
2026-08-19 20:04:35 +03:00
Danila Poyarkov 83a5ea1b42
feat(ai): add HarnessAgent sidecar foundation (#560)
* feat(ai): add HarnessAgent sidecar foundation

* feat(ai): integrate Pi as a Harness provider

* fix(ai): harden Harness provider integration

* fix(ai): address Harness integration review

* fix(ai): align Harness code with project conventions

* fix(ai): preserve Harness sessions on cancellation

* test(ai): cover Harness JSONL framing

* refactor(ai): generalize Harness sidecar adapters

* fix(ci): build Harness sidecar for native checks
2026-08-19 17:41:10 +03:00
Danila Poyarkov d44c1f9d82
ci: parallelize quality and trim shard builds (#558)
* ci: parallelize quality and trim shard builds

- Split source, package, repository, and Storybook checks into independent jobs

- Build only Core before quick unit shards instead of all public packages

- Keep full package and dist validation in the dedicated package-quality job

- Disable duplicate Storybook component metadata extraction

* fix(ci): build declarations before source checks

* fix(ci): apply review security and docgen settings

- Pin checkout and disable credential persistence

- Declare read-only workflow permissions

- Explicitly disable Storybook Vue docgen

* ci: clarify check and step names

* fix(ci): cap workflow job runtimes

- Limit the WebView dependency install to three minutes

- Limit native contracts to eight minutes

- Limit all other CI jobs to ten minutes

* ci: retry native contracts on a fresh runner

* ci: move native contracts to Ubuntu 24

- Leave the deprecated Ubuntu 22 hosted image

- Retry WebKit dependency provisioning on the current runner image

* ci: prebuild native contract dependencies

* ci: pin native contracts image digest

* fix(ci): authenticate native image pulls

* fix(ci): include Bun archive tooling

* ci: pin updated native contracts image

* fix(tools): register CI image tooling
2026-08-18 22:52:18 +03:00
Danila Poyarkov 54c1373d3e
ci: derive GitHub Release metadata from changelog (#536)
- Extract the release body from the changelog section matching the pushed tag.\n- Keep the GitHub Release title identical to the tag.\n- Document signing, updater, publication, deployment, and Homebrew handoff.
2026-08-17 11:07:13 +03:00
Danila Poyarkov 780221b006
test(tauri): add native WebView interaction harness (#532) 2026-08-15 14:17:05 +03:00
Danila Poyarkov 3ef554ab2d docs: reorganize documentation and improve integrity
- Replace the ambiguous Guide section with explicit overview, reference, and development routes while preserving legacy URLs with redirects
- Route missing localized content to maintained canonical pages and emit SEO alternates only for real translations
- Add parser-backed documentation integrity checks and make the optimized local build the default while retaining a complete production build
2026-08-13 14:19:12 +03:00
Danila Poyarkov ecb1effcf1 ci(docs): build packages before VitePress
- Resolve workspace package exports during Twoslash and demo builds\n- Keep release and manual docs deploys reproducible from a clean checkout
2026-08-11 15:36:49 +03:00
Danila Poyarkov 80a3cd8bd3
ci: update GitHub Actions to Node 24 (#460)
* ci: update GitHub Actions to Node 24

* ci: skip privileged previews for forks

* ci: isolate preview deployment secrets
2026-08-01 19:50:08 +03:00
Danila Poyarkov f525c0f4fb feat(ui): add themed panel foundations
- Introduce Nuxt UI-style Tailwind Variants themes and 26px panel primitives\n- Align section and field action rails across labeled property rows\n- Add Storybook with dark/light states, accessibility tooling, and CI build coverage\n- Standardize UI acronym casing across app and Vue SDK types
2026-07-10 18:16:21 +03:00
Danila Poyarkov de230f2f70 ci: deploy web only on releases or manually 2026-07-01 20:52:36 +03:00
Danila Poyarkov 58dab31c41 fix(release): publish split packages 2026-06-30 11:05:28 +03:00
Danila Poyarkov f18b0c9237 ci: build packages inside unit shards 2026-06-30 10:55:04 +03:00
Danila Poyarkov f5afb2e671 ci: share package builds with unit shards 2026-06-30 10:55:04 +03:00
Danila Poyarkov 4b75212c0c ci: shard engine tests for PR checks 2026-06-30 10:55:04 +03:00
Danila Poyarkov 7d516bf82b ci: move workflow helpers into tools 2026-06-07 09:15:15 +03:00
Danila Poyarkov e870e01521 ci: soften PR review guidance workflow 2026-06-07 09:10:47 +03:00
Danila Poyarkov 3d6ade211c ci: stop auto-closing PR hygiene failures 2026-06-07 08:51:37 +03:00
Danila Poyarkov ae4a0f9882 docs: clarify low-effort PR handling 2026-06-07 01:23:23 +03:00
Danila Poyarkov e66a20747e
fix: react to edited CodeRabbit hygiene comments (#330)
* fix: react to edited CodeRabbit hygiene comments

* fix: harden CodeRabbit PR hygiene detection

* fix: clarify CodeRabbit hygiene close trigger

* fix: scope ignored hygiene rows to check name
2026-06-07 01:07:42 +03:00
Danila Poyarkov 280b51e666
ci: gate invalid pull requests with CodeRabbit (#327)
* ci: gate invalid pull requests with CodeRabbit

* fix: harden CodeRabbit PR hygiene gate

* fix: make invalid PR label creation idempotent
2026-06-07 00:36:47 +03:00
Danila Poyarkov 2dc51375ad Release v0.13.2 2026-05-30 19:14:12 +03:00
Danila Poyarkov 2d4e2a7b10 Release v0.13.1 2026-05-30 01:12:58 +03:00
Danila Poyarkov 227ee97448 ci: share Bun setup across workflows 2026-05-24 12:33:58 +03:00
Danila Poyarkov abd795bd9a chore: format codebase 2026-05-24 12:15:29 +03:00
Danila Poyarkov c1b2678533 ci: make heavy fig tests manual 2026-05-05 21:25:23 +03:00
Danila Poyarkov 92265a56c1 ci: add scheduled heavy fig tests 2026-05-05 21:21:41 +03:00
Danila Poyarkov 25ea361fd7
feat(app): cache downloaded fonts
- Add a downloaded font cache hook to FontManager
- Store Tauri font downloads under AppLocalData with manifest validation
- Prefer cached downloads before system font lookup on desktop
- Skip opt-in heavy .fig parsing tests in PR CI
2026-05-05 21:14:38 +03:00
Danila Poyarkov b248e0c53a feat(tauri): add signed updater 2026-05-01 13:00:50 +03:00
Danila Poyarkov 35f3bb7f54 ci: create GitHub releases as drafts
Auto-generated release notes from CHANGELOG.md are often wrong.
Create as draft so the changelog section can be reviewed and
pasted manually before publishing.
2026-04-23 17:16:58 +03:00
Danila Poyarkov 2c3191cf96 Release v0.11.5 2026-04-08 21:38:44 +03:00
Danila Poyarkov e18c8660e3 Stabilize npm publishing workflow 2026-03-30 18:36:46 +03:00
Danila Poyarkov 36bc879421 Fix package publishing pipeline 2026-03-30 17:21:20 +03:00
Danila Poyarkov 79357f3afe Add Vue package publishing in CI 2026-03-30 16:21:57 +03:00
Danila Poyarkov 9ad69f459d Fix Homebrew workflow: authenticated clone for tap push 2026-03-17 15:28:53 +03:00
Danila Poyarkov d1d0e9c513 Add workflow_dispatch trigger to Homebrew workflow 2026-03-17 15:12:06 +03:00
Danila Poyarkov 86d201b29e Split preview deploy into pull_request_target workflow
Fork PRs can't access repo secrets with pull_request trigger.
pull_request_target runs in the base repo context so Cloudflare
secrets are available for all PRs.
2026-03-14 18:18:35 +03:00
Anton Soldatov e939025f7d
Fix auto-layout overflow, grid layout, AI chat UX (#86)
* Fix auto-layout overflow: MeasureFunc, min/max, absolute positioning, text wrap

Layout engine (layout.ts):
- Use Yoga MeasureFunc for text nodes instead of static pre-measurement,
  so text wraps correctly when width is determined by flex layout
- Add min/max width/height constraint support (minWidth, maxWidth, etc.)
- Translate counterAxisAlignContent to Yoga setAlignContent for wrap layouts
- Extract configureFlexContainer to share between root and nested frames

JSX renderer (render/renderer.ts):
- Auto-set layoutPositioning ABSOLUTE for elements with x/y inside auto-layout
- Fix text auto-resize: set HEIGHT when text fills parent in auto-layout

Text measurer (renderer/renderer.ts):
- Accept optional maxWidth parameter for constraint-based measurement

* AI prompt: prefer describe over export_image for post-render verification

* Strip TS casts from AI-generated JSX before sucrase parse

AI models sometimes emit `as any`, `as const` etc. in JSX props.
Sucrase with jsx-only transform can't handle these, causing parse errors.

- Strip TypeScript cast expressions before passing to sucrase
- Add forbidden patterns to AI prompt: as any, template literals for
  sizes, Math.random()

* Cache text MeasureFunc results to avoid repeated buildParagraph calls

Yoga calls MeasureFunc multiple times per node during calculateLayout.
Each call was creating a full CanvasKit Paragraph — expensive for layouts
with many text nodes. Cache by rounded constraint width.

* AI chat: fix provider settings popover, add max output tokens, fix paste in chat input

- Fix ProviderSettings popover not visible (remove tooltip/popover trigger
  conflict, add collision-padding, isolate z-[51])
- Add configurable max output tokens (default 16384) in provider settings
- Pass maxOutputTokens to ToolLoopAgent to prevent truncated tool calls
- Add system prompt size limits: split render calls at ~40 elements
- Fix paste/copy/cut in chat input (stop event propagation to canvas handler)

* Fix 6 layout engine bugs: hidden size, FILL basis, SPACE_EVENLY, alignSelf range, grid stretch, absolute children

Layout engine (layout.ts):
- Guard applyYogaLayout to preserve hidden children dimensions
- Add setFlexBasis(0) for FILL sizing so children share space from zero
- Add SPACE_EVENLY to mapJustify via Justify.SpaceEvenly
- Replace hardcoded STRETCH checks with mapAlignSelf for full range
- Use setWidthStretch/setHeightStretch for grid children instead of flexGrow
- Insert absolute children in Yoga tree via configureAbsoluteChild with
  PositionType.Absolute, keeping manual x/y (no write-back)

Types (scene-graph.ts):
- Add SPACE_EVENLY to LayoutAlign union
- New LayoutAlignSelf type: AUTO | MIN | CENTER | MAX | STRETCH | BASELINE

Import (kiwi-convert.ts):
- Map SPACE_EVENLY correctly instead of collapsing to SPACE_BETWEEN
- New mapAlignSelf function for full StackCounterAlign range

Tools (modify.ts):
- Expand set_layout align enum with SPACE_EVENLY
- Expand set_layout_child align_self enum with MIN/CENTER/MAX/BASELINE

Tests: 86 pass (+13 new covering all 6 fixes)

* Grid layout support in JSX renderer, auto-height grids, flex children stretch in cells

Renderer:
- Parse grid/columns/rows/columnGap/rowGap/gap props
- Parse grid child positioning: colStart/col/rowStart/row/colSpan/rowSpan
- Grid prop takes precedence over padding-triggered auto-layout
- SPACE_EVENLY added to ALIGN_MAP
- Numeric columns shorthand (columns={3} → 3×1fr)
- Auto-height: grid without rows sets height=0 for Yoga auto-sizing
- fill sizing in grid children → layoutAlignSelf: STRETCH
- Component builders accept variadic children: Frame(props, ...children)

Layout:
- Grid auto-height: skip setHeight when no gridTemplateRows
- Write back computed height for auto-height grids
- Grid children with layoutMode stretch width to fill cell
- recomputeGridChild: re-run flex layout after grid assigns cell size
  (temporarily sets sizing to FIXED so HUG doesn't override grid width)

Export:
- Skip height export for auto-height grids (no rows template)

Tests: 18 new grid render tests covering all paths

* Auto-enable flex for justify/items props, discourage export_image in AI prompt

* Address review: use sucrase typescript transform, don't reset chat on maxOutputTokens change

* Fix lint errors: extract applyFrameSize, wrap nested ternary, remove unnecessary cast

* Remove SPACE_EVENLY — not a valid Figma layout value

* CI: debug LFS pull from R2

* Apply maxOutputTokens dynamically via prepareCall instead of at agent creation

* Fix heavy .fig parse: restore GUID/defID guards, fix optional types

Commit f3eac5a removed null guards from fig-import and
instance-overrides as 'unnecessary conditions', but Kiwi-decoded data
can have NodeChanges without GUIDs and ComponentPropAssignments/Refs
without defIDs. Made the types optional to match reality.

Also fix CI LFS: add git lfs install --force before pull (R2 endpoint
needs the filter registered first).

* Fix Google AI model IDs: gemini-3.1-pro → gemini-3.1-pro-preview

Closes #91

---------

Co-authored-by: Danila Poyarkov <dev@dannote.net>
2026-03-10 15:43:04 +03:00
Danila Poyarkov fa3d7b8a8f Enable type-aware linting with tsgo in oxlint
Add oxlint-tsgolint dependency and --type-aware --type-check flags.
This replaces the separate tsgo --noEmit step — oxlint now handles
both linting and type checking in a single pass.

Add typescript/no-floating-promises as a warning rule.
2026-03-08 23:02:25 +03:00
Danila Poyarkov e2e4a2543f Fix release notes: extract from CHANGELOG.md directly (drop ffurrer2 action) 2026-03-08 02:06:52 +03:00
Danila Poyarkov f2b70579e7 Fix npm publish: use OIDC trusted publisher, remove empty NPM_TOKEN override 2026-03-08 01:41:11 +03:00
Danila Poyarkov e6984629fd Fix MCP publish: pre-build then publish with --ignore-scripts 2026-03-08 01:07:32 +03:00
Danila Poyarkov a6ea74014a Fix publish: resolve workspace deps then npm publish with provenance 2026-03-08 00:54:22 +03:00
Danila Poyarkov 65e40a2570 Fix pnpm publish auth: write .npmrc in project root 2026-03-08 00:37:24 +03:00
Danila Poyarkov 5c68ab0dee Fix npm publish auth: write .npmrc for pnpm 2026-03-08 00:34:19 +03:00
Danila Poyarkov 9882375b4f Release v0.8.0 2026-03-08 00:20:47 +03:00
Danila Poyarkov df8e303498
Add Homebrew tap with auto-update workflow (#61) 2026-03-06 18:08:47 +03:00
Anton Soldatov 168c25c189
feat: mobile layout, PWA support (#27) (#27)
- Mobile-responsive editor with bottom drawer, ribbon nav, HUD overlay
- Touch support: single-finger tools, two-finger pinch-zoom
- PWA: manifest, service worker, installability
- Extract LayerTree from LayersPanel, shared utils (colorToCSS, initials, toolIcons)
- Constants moved to src/constants.ts, clipboard state to editor store
- reka-ui Popover/DropdownMenu in MobileHud

Co-authored-by: Danila Poyarkov <dev@dannote.net>
2026-03-05 19:51:51 +03:00