Skip to content

feat: add npm publish workflow for @comfyorg/design-system - #14080

Merged
DrJKL merged 12 commits into
mainfrom
feat/publish-design-system-clean
Jul 30, 2026
Merged

feat: add npm publish workflow for @comfyorg/design-system#14080
DrJKL merged 12 commits into
mainfrom
feat/publish-design-system-clean

Conversation

@christian-byrne

Copy link
Copy Markdown
Contributor

Summary

Add a GitHub Actions publish workflow and proper package.json metadata so @comfyorg/design-system can be published to npm and consumed by external repos.

Changes

  • What: New .github/workflows/publish-design-system.yaml — manual (workflow_dispatch) and composable (workflow_call) publish workflow for @comfyorg/design-system; adds files, exports (icons), publishConfig, license, repository, homepage, author to packages/design-system/package.json
  • Dependencies: None new

Review Focus

Workflow follows the existing publish-desktop-bridge-types pattern exactly: semver validation → version/npm existence check → publish with NPM_TOKEN. The files field scopes the tarball to src/css and src/icons only (no tsconfig, no devDependencies, no root package.json noise).

To trigger a first publish: bump version in packages/design-system/package.json, then run "Publish Design System" from Actions with that version.

@christian-byrne
christian-byrne requested a review from a team July 24, 2026 02:57
@dosubot dosubot Bot added the size:XS This PR changes 0-9 lines, ignoring generated files. label Jul 24, 2026
@coderabbitai

coderabbitai Bot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 598b9e63-d71e-4949-a054-b140d06e2294

📥 Commits

Reviewing files that changed from the base of the PR and between 4b07452 and ea88f49.

📒 Files selected for processing (1)
  • .github/workflows/ci-design-system-pack.yaml

📝 Walkthrough

Walkthrough

Adds package publishing metadata and automated workflows for version bumps, pack validation, npm publication, release comments, and Slack notifications.

Changes

Design system release automation

Layer / File(s) Summary
Package publishing contract
packages/design-system/package.json
Adds package metadata, restricts published assets to CSS and icons, exports icon paths, and enables public npm access.
Version bump pull request flow
.github/workflows/version-bump-design-system.yaml
Adds a manual workflow that bumps the package version and opens a labeled release pull request.
Pack content validation
.github/workflows/ci-design-system-pack.yaml, .gitignore
Adds pull request typechecking and verifies dry-run package contents contain only approved files while ignoring TypeScript build metadata.
Validated npm publication
.github/workflows/publish-design-system.yaml, .github/workflows/publish-design-system-on-merge.yaml, .github/actions/comment-release-links/action.yaml
Adds reusable and merge-triggered publication workflows that validate versions, avoid duplicate npm releases, publish missing versions, and report release links and Slack notifications.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
  participant ReleaseWorkflow
  participant PublishWorkflow
  participant PackageRepository
  participant NpmRegistry
  participant Slack
  ReleaseWorkflow->>PackageRepository: Resolve merged package version and dist-tag
  ReleaseWorkflow->>PublishWorkflow: Pass version, ref, dist-tag, and npm token
  PublishWorkflow->>PackageRepository: Validate ref and package manifest
  PublishWorkflow->>NpmRegistry: Query package version
  NpmRegistry-->>PublishWorkflow: Return version existence
  PublishWorkflow->>NpmRegistry: Publish missing version
  ReleaseWorkflow->>Slack: Send successful publication details
Loading

Possibly related PRs

Suggested reviewers: drjkl


Important

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
End-To-End Regression Coverage For Fixes ❓ Inconclusive PR title and commit subjects aren’t provided here, so the bug-fix signal can’t be checked from metadata alone. Provide the PR title or commit subjects so I can determine whether bug-fix language is present and apply the regression-test rule.
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: adding an npm publish workflow for the design system package.
Description check ✅ Passed The description covers the required Summary, Changes, and Review Focus sections and is complete enough for the template.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Adr Compliance For Entity/Litegraph Changes ✅ Passed No changed files touch src/lib/litegraph, src/ecs, or graph-entity paths, so ADR entity/litegraph checks don’t apply.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/publish-design-system-clean

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Jul 24, 2026

Copy link
Copy Markdown

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 07/30/2026, 07:54:36 AM UTC

Links

🎭 Playwright: ✅ 1764 passed, 0 failed · 3 flaky

📊 Browser Reports
  • chromium: View Report (✅ 1743 / ❌ 0 / ⚠️ 3 / ⏭️ 5)
  • chromium-2x: View Report (✅ 2 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • chromium-0.5x: View Report (✅ 1 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • mobile-chrome: View Report (✅ 18 / ❌ 0 / ⚠️ 0 / ⏭️ 0)

📦 Bundle: 8.18 MB gzip ⚪ 0 B

Details

Summary

  • Raw size: 34.4 MB baseline 34.4 MB — ⚪ 0 B
  • Gzip: 8.18 MB baseline 8.18 MB — ⚪ 0 B
  • Brotli: 5.67 MB baseline 5.67 MB — ⚪ 0 B
  • Bundles: 424 current • 424 baseline

Category Glance
Vendor & Third-Party ⚪ 0 B (15.7 MB) · Other ⚪ 0 B (12.6 MB) · Data & Services ⚪ 0 B (3.43 MB) · Graph Workspace ⚪ 0 B (1.29 MB) · Panels & Settings ⚪ 0 B (551 kB) · Utilities & Hooks ⚪ 0 B (386 kB) · + 5 more

App Entry Points — 3.66 kB (baseline 3.66 kB) • ⚪ 0 B

Main entry bundles and manifests

Status: 1 unchanged

Graph Workspace — 1.29 MB (baseline 1.29 MB) • ⚪ 0 B

Graph editor runtime, canvas, workflow orchestration

Status: 2 unchanged

Views & Navigation — 112 kB (baseline 112 kB) • ⚪ 0 B

Top-level views, pages, and routed surfaces

Status: 16 unchanged

Panels & Settings — 551 kB (baseline 551 kB) • ⚪ 0 B

Configuration panels, inspectors, and settings screens

Status: 26 unchanged

User & Accounts — 29.1 kB (baseline 29.1 kB) • ⚪ 0 B

Authentication, profile, and account management bundles

Status: 10 unchanged

Editors & Dialogs — 124 kB (baseline 124 kB) • ⚪ 0 B

Modals, dialogs, drawers, and in-app editors

Status: 7 unchanged

UI Components — 70.7 kB (baseline 70.7 kB) • ⚪ 0 B

Reusable component library chunks

Status: 15 unchanged

Data & Services — 3.43 MB (baseline 3.43 MB) • ⚪ 0 B

Stores, services, APIs, and repositories

Status: 17 unchanged

Utilities & Hooks — 386 kB (baseline 386 kB) • ⚪ 0 B

Helpers, composables, and utility bundles

Status: 36 unchanged

Vendor & Third-Party — 15.7 MB (baseline 15.7 MB) • ⚪ 0 B

External libraries and shared vendor chunks

Status: 16 unchanged

Other — 12.6 MB (baseline 12.6 MB) • ⚪ 0 B

Bundles that do not match a named category

Status: 278 unchanged

⚡ Performance Report

canvas-idle: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 69.2 MB heap
canvas-mouse-sweep: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 49.7 MB heap
canvas-zoom-sweep: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 72.3 MB heap
dom-widget-clipping: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 53.4 MB heap
large-graph-idle: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 70.8 MB heap
large-graph-pan: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 62.5 MB heap
large-graph-zoom: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 71.8 MB heap
minimap-idle: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 65.9 MB heap
subgraph-dom-widget-clipping: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 53.6 MB heap
subgraph-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 69.2 MB heap
subgraph-mouse-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 45.4 MB heap
subgraph-transition-enter: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 122ms TBT · 93.0 MB heap
viewport-pan-sweep: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 68.6 MB heap
vue-large-graph-idle: · 56.3 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 153.4 MB heap
vue-large-graph-pan: · 55.4 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 634ms TBT · 165.2 MB heap
workflow-execution: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 48.5 MB heap

⚠️ 10 regressions detected

Show regressions
Metric Baseline PR (median) Δ Sig
canvas-idle: task duration 404ms 576ms +43% ⚠️ z=5.8
canvas-zoom-sweep: layout duration 0ms 1ms +57% ⚠️ z=3.0
canvas-zoom-sweep: task duration 309ms 452ms +46% ⚠️ z=5.4
dom-widget-clipping: task duration 314ms 411ms +31% ⚠️ z=2.8
large-graph-idle: task duration 562ms 731ms +30% ⚠️ z=3.5
large-graph-pan: task duration 985ms 1369ms +39% ⚠️ z=6.7
minimap-idle: task duration 560ms 790ms +41% ⚠️ z=5.5
minimap-idle: script duration 85ms 128ms +51% ⚠️ z=3.0
subgraph-dom-widget-clipping: task duration 321ms 434ms +35% ⚠️ z=3.0
subgraph-idle: task duration 412ms 508ms +23% ⚠️ z=4.4
All metrics
Metric Baseline PR (median) Δ Sig
canvas-idle: avg frame time 17ms 17ms +0% z=-0.5
canvas-idle: p95 frame time 17ms 17ms +0%
canvas-idle: layout duration 0ms 0ms +0%
canvas-idle: style recalc duration 7ms 8ms +7% z=-3.4
canvas-idle: layout count 0 0 +0%
canvas-idle: style recalc count 10 8 -20% z=-5.6
canvas-idle: task duration 404ms 576ms +43% ⚠️ z=5.8
canvas-idle: script duration 18ms 24ms +35% z=-0.5
canvas-idle: TBT 0ms 0ms +0%
canvas-idle: heap used 69.4 MB 69.2 MB -0%
canvas-idle: DOM nodes 20 16 -20% z=-5.2
canvas-idle: event listeners 6 5 -17% z=-1.4
canvas-mouse-sweep: avg frame time 17ms 17ms +0% z=-0.4
canvas-mouse-sweep: p95 frame time 17ms 17ms +0%
canvas-mouse-sweep: layout duration 3ms 4ms +20% z=0.7
canvas-mouse-sweep: style recalc duration 31ms 43ms +38% z=0.1
canvas-mouse-sweep: layout count 12 12 +0%
canvas-mouse-sweep: style recalc count 73 76 +3% z=-1.4
canvas-mouse-sweep: task duration 776ms 942ms +21% z=1.3
canvas-mouse-sweep: script duration 101ms 126ms +24% z=-1.5
canvas-mouse-sweep: TBT 0ms 0ms +0%
canvas-mouse-sweep: heap used 47.4 MB 49.7 MB +5%
canvas-mouse-sweep: DOM nodes -279 -283 +1% z=-133.3
canvas-mouse-sweep: event listeners -144 -148 +3% z=-37.5
canvas-zoom-sweep: avg frame time 17ms 17ms +0% z=-0.3
canvas-zoom-sweep: p95 frame time 17ms 17ms +1%
canvas-zoom-sweep: layout duration 0ms 1ms +57% ⚠️ z=3.0
canvas-zoom-sweep: style recalc duration 14ms 21ms +52% z=0.9
canvas-zoom-sweep: layout count 6 6 +0%
canvas-zoom-sweep: style recalc count 31 33 +5% z=2.7
canvas-zoom-sweep: task duration 309ms 452ms +46% ⚠️ z=5.4
canvas-zoom-sweep: script duration 16ms 28ms +79% z=0.3
canvas-zoom-sweep: TBT 0ms 0ms +0%
canvas-zoom-sweep: heap used 72.2 MB 72.3 MB +0%
canvas-zoom-sweep: DOM nodes 77 78 +1% z=-1.6
canvas-zoom-sweep: event listeners 19 19 +0% z=-0.9
dom-widget-clipping: avg frame time 17ms 17ms -0% z=-0.2
dom-widget-clipping: p95 frame time 17ms 17ms +0%
dom-widget-clipping: layout duration 0ms 0ms +0%
dom-widget-clipping: style recalc duration 7ms 9ms +32% z=-1.3
dom-widget-clipping: layout count 0 0 +0%
dom-widget-clipping: style recalc count 12 12 +0% z=-2.2
dom-widget-clipping: task duration 314ms 411ms +31% ⚠️ z=2.8
dom-widget-clipping: script duration 47ms 60ms +28% z=-2.4
dom-widget-clipping: TBT 0ms 0ms +0%
dom-widget-clipping: heap used 53.0 MB 53.4 MB +1%
dom-widget-clipping: DOM nodes 20 20 +0% z=-1.5
dom-widget-clipping: event listeners 2 1 -50% variance too high
large-graph-idle: avg frame time 17ms 17ms -0% z=-1.0
large-graph-idle: p95 frame time 17ms 17ms +0%
large-graph-idle: layout duration 0ms 0ms +0%
large-graph-idle: style recalc duration 8ms 8ms -0% z=-3.7
large-graph-idle: layout count 0 0 +0%
large-graph-idle: style recalc count 10 9 -10% z=-8.3
large-graph-idle: task duration 562ms 731ms +30% ⚠️ z=3.5
large-graph-idle: script duration 84ms 115ms +36% z=1.2
large-graph-idle: TBT 0ms 0ms +0%
large-graph-idle: heap used 63.5 MB 70.8 MB +11%
large-graph-idle: DOM nodes -279 -280 +0% z=-336.6
large-graph-idle: event listeners -144 -160 +11% z=-30.5
large-graph-pan: avg frame time 17ms 17ms +0% z=-0.2
large-graph-pan: p95 frame time 17ms 17ms -1%
large-graph-pan: layout duration 0ms 0ms +0%
large-graph-pan: style recalc duration 14ms 16ms +15% z=-2.0
large-graph-pan: layout count 0 0 +0%
large-graph-pan: style recalc count 69 69 -1% z=-1.7
large-graph-pan: task duration 985ms 1369ms +39% ⚠️ z=6.7
large-graph-pan: script duration 323ms 436ms +35% z=1.4
large-graph-pan: TBT 0ms 0ms +0%
large-graph-pan: heap used 61.7 MB 62.5 MB +1%
large-graph-pan: DOM nodes -279 -285 +2% z=-184.3
large-graph-pan: event listeners -144 -143 -1% z=-178.6
large-graph-zoom: avg frame time 17ms 17ms +0%
large-graph-zoom: p95 frame time 17ms 17ms -0%
large-graph-zoom: layout duration 7ms 9ms +25%
large-graph-zoom: style recalc duration 14ms 17ms +20%
large-graph-zoom: layout count 60 60 +0%
large-graph-zoom: style recalc count 66 65 -2%
large-graph-zoom: task duration 1194ms 1604ms +34%
large-graph-zoom: script duration 424ms 572ms +35%
large-graph-zoom: TBT 0ms 0ms +0%
large-graph-zoom: heap used 80.4 MB 71.8 MB -11%
large-graph-zoom: DOM nodes 14 -137 -1079%
large-graph-zoom: event listeners 6 -70 -1267%
minimap-idle: avg frame time 17ms 17ms +0% z=0.1
minimap-idle: p95 frame time 17ms 17ms +0%
minimap-idle: layout duration 0ms 0ms +0%
minimap-idle: style recalc duration 7ms 8ms +9% z=-2.4
minimap-idle: layout count 0 0 +0%
minimap-idle: style recalc count 9 8 -11% z=-2.3
minimap-idle: task duration 560ms 790ms +41% ⚠️ z=5.5
minimap-idle: script duration 85ms 128ms +51% ⚠️ z=3.0
minimap-idle: TBT 0ms 0ms +0%
minimap-idle: heap used 65.4 MB 65.9 MB +1%
minimap-idle: DOM nodes -281 -283 +1% z=-220.5
minimap-idle: event listeners -144 -144 +0% z=-225.0
subgraph-dom-widget-clipping: avg frame time 17ms 17ms +0% z=0.1
subgraph-dom-widget-clipping: p95 frame time 17ms 17ms +1%
subgraph-dom-widget-clipping: layout duration 0ms 0ms +0%
subgraph-dom-widget-clipping: style recalc duration 10ms 12ms +20% z=-1.2
subgraph-dom-widget-clipping: layout count 0 0 +0%
subgraph-dom-widget-clipping: style recalc count 48 47 -2% z=-1.6
subgraph-dom-widget-clipping: task duration 321ms 434ms +35% ⚠️ z=3.0
subgraph-dom-widget-clipping: script duration 97ms 129ms +34% z=0.2
subgraph-dom-widget-clipping: TBT 0ms 0ms +0%
subgraph-dom-widget-clipping: heap used 53.3 MB 53.6 MB +1%
subgraph-dom-widget-clipping: DOM nodes 22 20 -9% z=-1.9
subgraph-dom-widget-clipping: event listeners 8 7 -13% z=-1.6
subgraph-idle: avg frame time 17ms 17ms -0% z=-0.7
subgraph-idle: p95 frame time 17ms 17ms +0%
subgraph-idle: layout duration 0ms 0ms +0%
subgraph-idle: style recalc duration 7ms 9ms +38% z=-1.7
subgraph-idle: layout count 0 0 +0%
subgraph-idle: style recalc count 10 10 +0% z=-1.4
subgraph-idle: task duration 412ms 508ms +23% ⚠️ z=4.4
subgraph-idle: script duration 14ms 20ms +42% z=-0.1
subgraph-idle: TBT 0ms 0ms +0%
subgraph-idle: heap used 68.9 MB 69.2 MB +1%
subgraph-idle: DOM nodes 20 20 +0% z=-1.2
subgraph-idle: event listeners 6 4 -33% variance too high
subgraph-mouse-sweep: avg frame time 17ms 17ms +0% z=1.2
subgraph-mouse-sweep: p95 frame time 17ms 17ms -0%
subgraph-mouse-sweep: layout duration 4ms 5ms +35% z=1.0
subgraph-mouse-sweep: style recalc duration 31ms 41ms +36% z=-0.3
subgraph-mouse-sweep: layout count 16 16 +0%
subgraph-mouse-sweep: style recalc count 76 77 +1% z=-1.6
subgraph-mouse-sweep: task duration 681ms 871ms +28% z=1.5
subgraph-mouse-sweep: script duration 79ms 99ms +26% z=-0.3
subgraph-mouse-sweep: TBT 0ms 0ms +0%
subgraph-mouse-sweep: heap used 45.6 MB 45.4 MB -1%
subgraph-mouse-sweep: DOM nodes -277 -282 +2% z=-155.9
subgraph-mouse-sweep: event listeners -146 -148 +1% variance too high
subgraph-transition-enter: avg frame time 17ms 17ms +0%
subgraph-transition-enter: p95 frame time 17ms 17ms -1%
subgraph-transition-enter: layout duration 9ms 12ms +27%
subgraph-transition-enter: style recalc duration 24ms 30ms +28%
subgraph-transition-enter: layout count 14 14 +0%
subgraph-transition-enter: style recalc count 18 18 +0%
subgraph-transition-enter: task duration 718ms 1002ms +39%
subgraph-transition-enter: script duration 22ms 50ms +130%
subgraph-transition-enter: TBT 77ms 122ms +58%
subgraph-transition-enter: heap used 92.5 MB 93.0 MB +1%
subgraph-transition-enter: DOM nodes 13673 13673 +0%
subgraph-transition-enter: event listeners 2371 2371 +0%
viewport-pan-sweep: avg frame time 17ms 17ms +0%
viewport-pan-sweep: p95 frame time 17ms 17ms +1%
viewport-pan-sweep: layout duration 0ms 0ms +0%
viewport-pan-sweep: style recalc duration 36ms 45ms +22%
viewport-pan-sweep: layout count 0 0 +0%
viewport-pan-sweep: style recalc count 249 251 +1%
viewport-pan-sweep: task duration 3475ms 4865ms +40%
viewport-pan-sweep: script duration 1052ms 1474ms +40%
viewport-pan-sweep: TBT 0ms 0ms +0%
viewport-pan-sweep: heap used 65.8 MB 68.6 MB +4%
viewport-pan-sweep: DOM nodes -279 -281 +1%
viewport-pan-sweep: event listeners -128 -127 -1%
vue-large-graph-idle: avg frame time 18ms 18ms +0%
vue-large-graph-idle: p95 frame time 17ms 17ms +0%
vue-large-graph-idle: layout duration 0ms 0ms +0%
vue-large-graph-idle: style recalc duration 0ms 0ms +0%
vue-large-graph-idle: layout count 0 0 +0%
vue-large-graph-idle: style recalc count 0 0 +0%
vue-large-graph-idle: task duration 14465ms 18314ms +27%
vue-large-graph-idle: script duration 449ms 602ms +34%
vue-large-graph-idle: TBT 0ms 0ms +0%
vue-large-graph-idle: heap used 160.1 MB 153.4 MB -4%
vue-large-graph-idle: DOM nodes -8312 -8312 +0%
vue-large-graph-idle: event listeners -16389 -16386 -0%
vue-large-graph-pan: avg frame time 18ms 18ms +2%
vue-large-graph-pan: p95 frame time 17ms 17ms -0%
vue-large-graph-pan: layout duration 0ms 0ms +0%
vue-large-graph-pan: style recalc duration 14ms 26ms +87%
vue-large-graph-pan: layout count 0 0 +0%
vue-large-graph-pan: style recalc count 118 166 +41%
vue-large-graph-pan: task duration 17067ms 22706ms +33%
vue-large-graph-pan: script duration 690ms 932ms +35%
vue-large-graph-pan: TBT 41ms 634ms +1446%
vue-large-graph-pan: heap used 169.1 MB 165.2 MB -2%
vue-large-graph-pan: DOM nodes -8316 -8312 -0%
vue-large-graph-pan: event listeners -16385 -16382 -0%
workflow-execution: avg frame time 17ms 17ms -0% z=0.1
workflow-execution: p95 frame time 17ms 17ms +1%
workflow-execution: layout duration 0ms 1ms +42% z=-7.0
workflow-execution: style recalc duration 16ms 19ms +22% z=-2.4
workflow-execution: layout count 2 3 +25% z=-4.5
workflow-execution: style recalc count 15 13 -13% z=-2.3
workflow-execution: task duration 92ms 116ms +25% z=-0.7
workflow-execution: script duration 8ms 10ms +23% z=-6.4
workflow-execution: TBT 0ms 0ms +0%
workflow-execution: heap used 48.6 MB 48.5 MB -0%
workflow-execution: DOM nodes 134 124 -8% z=-5.2
workflow-execution: event listeners 67 66 -1% z=3.2
Historical variance (last 15 runs)
Metric μ σ CV
canvas-idle: avg frame time 17ms 0ms 0.0%
canvas-idle: layout duration 0ms 0ms 0.0%
canvas-idle: style recalc duration 11ms 1ms 8.2%
canvas-idle: layout count 0 0 0.0%
canvas-idle: style recalc count 11 1 5.0%
canvas-idle: task duration 395ms 31ms 7.9%
canvas-idle: script duration 25ms 2ms 8.8%
canvas-idle: TBT 0ms 0ms 0.0%
canvas-idle: DOM nodes 23 1 5.6%
canvas-idle: event listeners 12 5 40.9%
canvas-mouse-sweep: avg frame time 17ms 0ms 0.0%
canvas-mouse-sweep: layout duration 4ms 0ms 5.4%
canvas-mouse-sweep: style recalc duration 43ms 3ms 7.4%
canvas-mouse-sweep: layout count 12 0 0.0%
canvas-mouse-sweep: style recalc count 79 2 3.0%
canvas-mouse-sweep: task duration 865ms 58ms 6.7%
canvas-mouse-sweep: script duration 136ms 6ms 4.8%
canvas-mouse-sweep: TBT 0ms 0ms 0.0%
canvas-mouse-sweep: DOM nodes 62 3 4.2%
canvas-mouse-sweep: event listeners 8 4 49.4%
canvas-zoom-sweep: avg frame time 17ms 0ms 0.0%
canvas-zoom-sweep: layout duration 1ms 0ms 7.0%
canvas-zoom-sweep: style recalc duration 19ms 2ms 8.0%
canvas-zoom-sweep: layout count 6 0 0.0%
canvas-zoom-sweep: style recalc count 31 0 1.5%
canvas-zoom-sweep: task duration 327ms 23ms 7.1%
canvas-zoom-sweep: script duration 27ms 3ms 11.1%
canvas-zoom-sweep: TBT 0ms 0ms 0.0%
canvas-zoom-sweep: DOM nodes 79 1 1.0%
canvas-zoom-sweep: event listeners 24 5 21.8%
dom-widget-clipping: avg frame time 17ms 0ms 0.0%
dom-widget-clipping: layout duration 0ms 0ms 0.0%
dom-widget-clipping: style recalc duration 10ms 1ms 8.0%
dom-widget-clipping: layout count 0 0 0.0%
dom-widget-clipping: style recalc count 13 0 3.8%
dom-widget-clipping: task duration 365ms 16ms 4.5%
dom-widget-clipping: script duration 68ms 3ms 4.8%
dom-widget-clipping: TBT 0ms 0ms 0.0%
dom-widget-clipping: DOM nodes 22 1 6.4%
dom-widget-clipping: event listeners 8 6 81.2%
large-graph-idle: avg frame time 17ms 0ms 0.0%
large-graph-idle: layout duration 0ms 0ms 0.0%
large-graph-idle: style recalc duration 12ms 1ms 8.6%
large-graph-idle: layout count 0 0 0.0%
large-graph-idle: style recalc count 12 0 2.7%
large-graph-idle: task duration 542ms 54ms 10.0%
large-graph-idle: script duration 102ms 11ms 10.3%
large-graph-idle: TBT 0ms 0ms 0.0%
large-graph-idle: DOM nodes 25 1 3.7%
large-graph-idle: event listeners 26 6 23.2%
large-graph-pan: avg frame time 17ms 0ms 0.0%
large-graph-pan: layout duration 0ms 0ms 0.0%
large-graph-pan: style recalc duration 17ms 1ms 4.6%
large-graph-pan: layout count 0 0 0.0%
large-graph-pan: style recalc count 70 1 0.9%
large-graph-pan: task duration 1082ms 43ms 4.0%
large-graph-pan: script duration 408ms 20ms 4.8%
large-graph-pan: TBT 0ms 0ms 0.0%
large-graph-pan: DOM nodes 19 2 8.7%
large-graph-pan: event listeners 5 1 16.8%
minimap-idle: avg frame time 17ms 0ms 0.0%
minimap-idle: layout duration 0ms 0ms 0.0%
minimap-idle: style recalc duration 10ms 1ms 8.6%
minimap-idle: layout count 0 0 0.0%
minimap-idle: style recalc count 10 1 7.1%
minimap-idle: task duration 527ms 47ms 9.0%
minimap-idle: script duration 98ms 10ms 10.1%
minimap-idle: TBT 0ms 0ms 0.0%
minimap-idle: DOM nodes 19 1 7.1%
minimap-idle: event listeners 5 1 14.4%
subgraph-dom-widget-clipping: avg frame time 17ms 0ms 0.0%
subgraph-dom-widget-clipping: layout duration 0ms 0ms 0.0%
subgraph-dom-widget-clipping: style recalc duration 13ms 1ms 7.4%
subgraph-dom-widget-clipping: layout count 0 0 0.0%
subgraph-dom-widget-clipping: style recalc count 48 1 1.2%
subgraph-dom-widget-clipping: task duration 378ms 18ms 4.9%
subgraph-dom-widget-clipping: script duration 128ms 6ms 4.9%
subgraph-dom-widget-clipping: TBT 0ms 0ms 0.0%
subgraph-dom-widget-clipping: DOM nodes 22 1 5.0%
subgraph-dom-widget-clipping: event listeners 16 6 36.0%
subgraph-idle: avg frame time 17ms 0ms 0.0%
subgraph-idle: layout duration 0ms 0ms 0.0%
subgraph-idle: style recalc duration 10ms 1ms 7.5%
subgraph-idle: layout count 0 0 0.0%
subgraph-idle: style recalc count 11 1 6.0%
subgraph-idle: task duration 370ms 31ms 8.5%
subgraph-idle: script duration 20ms 3ms 13.2%
subgraph-idle: TBT 0ms 0ms 0.0%
subgraph-idle: DOM nodes 22 1 6.9%
subgraph-idle: event listeners 10 7 64.5%
subgraph-mouse-sweep: avg frame time 17ms 0ms 0.0%
subgraph-mouse-sweep: layout duration 5ms 0ms 6.8%
subgraph-mouse-sweep: style recalc duration 42ms 3ms 7.8%
subgraph-mouse-sweep: layout count 16 0 0.0%
subgraph-mouse-sweep: style recalc count 80 2 2.4%
subgraph-mouse-sweep: task duration 766ms 69ms 9.0%
subgraph-mouse-sweep: script duration 101ms 7ms 6.5%
subgraph-mouse-sweep: TBT 0ms 0ms 0.0%
subgraph-mouse-sweep: DOM nodes 67 2 3.3%
subgraph-mouse-sweep: event listeners 8 4 52.6%
workflow-execution: avg frame time 17ms 0ms 0.0%
workflow-execution: layout duration 2ms 0ms 9.4%
workflow-execution: style recalc duration 24ms 2ms 9.1%
workflow-execution: layout count 5 1 11.0%
workflow-execution: style recalc count 18 2 11.5%
workflow-execution: task duration 123ms 11ms 8.8%
workflow-execution: script duration 29ms 3ms 10.2%
workflow-execution: TBT 0ms 0ms 0.0%
workflow-execution: DOM nodes 161 7 4.4%
workflow-execution: event listeners 52 4 8.4%
Trend (last 15 commits on main)
Metric Trend Dir Latest
canvas-idle: avg frame time ▆▃▆▁▆▃▆█▆▆▄▃▃▄▃ ➡️ 17ms
canvas-idle: p95 frame time ➡️ NaNms
canvas-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-idle: style recalc duration ▇▇▆▆▃█▄▃▄▃▇▄▁▆▇ ➡️ 11ms
canvas-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
canvas-idle: style recalc count █▃▅▂▅▆▃▁▂▁▂▅▆▅▆ ➡️ 12
canvas-idle: task duration ▃▃▃▆▂▃▃▅▆▂█▃▁▃▃ ➡️ 391ms
canvas-idle: script duration ▄▃▅▇▂▅▃▆▇▅█▄▁▅▆ ➡️ 27ms
canvas-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-idle: heap used ➡️ NaN MB
canvas-idle: DOM nodes █▇▆▅▃▇▃▁▂▂▅▆▆▆▇ ➡️ 24
canvas-idle: event listeners ▅█▅▄▁▅▁▁▁▄▅▅▁▅▄ 📉 11
canvas-mouse-sweep: avg frame time ▆█▆▃▁▃▁▆▆▁▃▆▆▃▃ ➡️ 17ms
canvas-mouse-sweep: p95 frame time ➡️ NaNms
canvas-mouse-sweep: layout duration ▁▃▂▄▁▂▁▃▆▂█▇▆▄▃ ➡️ 4ms
canvas-mouse-sweep: style recalc duration ▄▄▂▄▁▂▃▃▅▄█▆▂▄▄ ➡️ 43ms
canvas-mouse-sweep: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 12
canvas-mouse-sweep: style recalc count █▅▄▃▂▂▁▄▄▅▆▅▂▇▄ ➡️ 79
canvas-mouse-sweep: task duration █▆▄▂▂▃▂▄▄▅█▆▁▆▄ ➡️ 868ms
canvas-mouse-sweep: script duration ▄▅▄▆▄▆▆▆▅▅█▆▁▅▆ ➡️ 139ms
canvas-mouse-sweep: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-mouse-sweep: heap used ➡️ NaN MB
canvas-mouse-sweep: DOM nodes █▅▃▃▁▂▂▃▂▄▆▅▃▅▅ ➡️ 64
canvas-mouse-sweep: event listeners █▁▁▁▁▁▇▁▁▁██▇▁█ 📈 13
canvas-zoom-sweep: avg frame time ▅▅█▄▅▁▁▁▅▁▁▅▄▅▁ ➡️ 17ms
canvas-zoom-sweep: p95 frame time ➡️ NaNms
canvas-zoom-sweep: layout duration ▆▅▅▄▁▁█▅▃▅▇▆▁▂▆ ➡️ 1ms
canvas-zoom-sweep: style recalc duration ▆▅▄▆▅▃█▆▇▅▇▄▁▃▅ ➡️ 20ms
canvas-zoom-sweep: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 6
canvas-zoom-sweep: style recalc count ▁▁▃▄▆▃▆█▄▄▆▁▆▁▆ ➡️ 32
canvas-zoom-sweep: task duration ▄▂▁▇▂▂▄▅▆▃█▄▁▁▅ ➡️ 338ms
canvas-zoom-sweep: script duration ▃▃▂▇▂▂▅▇▆▅█▄▁▂▆ ➡️ 30ms
canvas-zoom-sweep: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-zoom-sweep: heap used ➡️ NaN MB
canvas-zoom-sweep: DOM nodes ▄▃▁▅█▁▃▆▄▅▅▃▃▄▃ ➡️ 79
canvas-zoom-sweep: event listeners ▁▁▂▅█▂▁▅▁▅▅▄▁▅▁ ➡️ 19
dom-widget-clipping: avg frame time ▂▄▅▅▂▄█▇▅▇▇▅▅▁▇ ➡️ 17ms
dom-widget-clipping: p95 frame time ➡️ NaNms
dom-widget-clipping: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
dom-widget-clipping: style recalc duration ▆▆▂▆▄▃██▄▁▆▇▆▃▅ ➡️ 10ms
dom-widget-clipping: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
dom-widget-clipping: style recalc count ▇█▅█▅▄█▇▇▁▇▄▇▂▅ ➡️ 13
dom-widget-clipping: task duration ▃▃▁▅▄▃▅▆▅▂▇█▁▅▅ ➡️ 371ms
dom-widget-clipping: script duration ▅▄▄▆▆▅▇▇▆▃█▇▁▇▇ ➡️ 71ms
dom-widget-clipping: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
dom-widget-clipping: heap used ➡️ NaN MB
dom-widget-clipping: DOM nodes ▇▇▄▇▅▄█▇▅▁▅▄▇▃▄ ➡️ 21
dom-widget-clipping: event listeners ▅▅▅▅▁▅██▁▁▁▁█▁▁ 📉 2
large-graph-idle: avg frame time ▅▅▅▅▅▂▁▂▄▅▄▂▂▅█ ➡️ 17ms
large-graph-idle: p95 frame time ➡️ NaNms
large-graph-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-idle: style recalc duration ▅▅▅▆▄▅▃▄▅▅▆█▁▄▆ ➡️ 13ms
large-graph-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
large-graph-idle: style recalc count █▆█▃▃▁▃▆▃▆▆▃▆██ ➡️ 12
large-graph-idle: task duration ▂▃▂▆▂▃▃▇▅▃██▁▂▅ ➡️ 569ms
large-graph-idle: script duration ▄▅▄▆▄▅▅▇▆▅█▆▁▃▆ ➡️ 110ms
large-graph-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-idle: heap used ➡️ NaN MB
large-graph-idle: DOM nodes ▆█▅▂▅▃▁▂▃▅▅▆▂▆▅ ➡️ 25
large-graph-idle: event listeners ███▇██▄▁▄▇▇█▂█▇ ➡️ 29
large-graph-pan: avg frame time ▆▃▃▆█▃▁█▆▆▆▆█▁▆ ➡️ 17ms
large-graph-pan: p95 frame time ➡️ NaNms
large-graph-pan: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-pan: style recalc duration ▃▂▄▄▁▅▂▂▁▄▄█▃▁▂ ➡️ 17ms
large-graph-pan: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
large-graph-pan: style recalc count ▆▃█▂▃▂▂▂▁▇▅▃█▆▃ ➡️ 69
large-graph-pan: task duration ▄▃▄▆▄▄▄▆▄▄█▆▁▂▅ ➡️ 1100ms
large-graph-pan: script duration ▅▄▅▆▆▅▄▆▄▅█▄▁▄▅ ➡️ 413ms
large-graph-pan: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-pan: heap used ➡️ NaN MB
large-graph-pan: DOM nodes ▅▃▆▂▄▁▃▁▁▅▁▂█▅▂ ➡️ 18
large-graph-pan: event listeners █▆█▁▁▆▁▁▃▆▁▃██▃ ➡️ 5
minimap-idle: avg frame time ▃▆▆▃█▁█▆▆▃▃▆█▆█ ➡️ 17ms
minimap-idle: p95 frame time ➡️ NaNms
minimap-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
minimap-idle: style recalc duration ▄█▁█▅▅█▅▅▃▅▁▁▄▆ ➡️ 10ms
minimap-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
minimap-idle: style recalc count ▃▅▂▄█▃▆▁▂▅▂▁▅▆▃ ➡️ 9
minimap-idle: task duration ▃▄▁▅▁▃▄▅▇▃█▅▁▁▅ ➡️ 547ms
minimap-idle: script duration ▄▆▃▇▃▅▆▆▇▅█▅▁▃▆ ➡️ 106ms
minimap-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
minimap-idle: heap used ➡️ NaN MB
minimap-idle: DOM nodes ▃▅▂▄█▃▆▁▂▅▂▁▅▆▃ ➡️ 19
minimap-idle: event listeners ▃▃▆▁▁▁▃▁▁▆▁▃█▆▁ ➡️ 4
subgraph-dom-widget-clipping: avg frame time ▅▄▄▄▄▄█▄▄▄▃▁▆▃▃ ➡️ 17ms
subgraph-dom-widget-clipping: p95 frame time ➡️ NaNms
subgraph-dom-widget-clipping: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-dom-widget-clipping: style recalc duration ▂▄▃▅▅▃▂▅▇▃▄█▁▄▆ ➡️ 14ms
subgraph-dom-widget-clipping: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
subgraph-dom-widget-clipping: style recalc count ▇█▆▃▆▃▁▆█▇▃▆▇█▅ ➡️ 48
subgraph-dom-widget-clipping: task duration ▂▃▃▆▅▅▂▅█▂▆█▁▂▇ ➡️ 398ms
subgraph-dom-widget-clipping: script duration ▃▃▃▄▅▅▂▄█▂▅▇▁▂▅ ➡️ 131ms
subgraph-dom-widget-clipping: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-dom-widget-clipping: heap used ➡️ NaN MB
subgraph-dom-widget-clipping: DOM nodes ▅▇▅▂▅▂▁▅▅▅▁▇▅█▄ ➡️ 22
subgraph-dom-widget-clipping: event listeners ▅▅▅▂▅▁▅██▁▁█▅█▅ 📈 16
subgraph-idle: avg frame time ▆▆█▁▆▃▆▆▆▃▆▁▃▆█ ➡️ 17ms
subgraph-idle: p95 frame time ➡️ NaNms
subgraph-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-idle: style recalc duration ▁▇▃▆▂▄▂▃▃▆▆▄▃▇█ ➡️ 12ms
subgraph-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
subgraph-idle: style recalc count ▃▆▃▃▂▅▁▂▁▆▃▃██▇ ➡️ 12
subgraph-idle: task duration ▁▃▁▇▁▁▃▆▅▂█▅▁▁▄ ➡️ 378ms
subgraph-idle: script duration ▁▃▂▇▁▂▃▇▆▂█▅▂▁▅ ➡️ 22ms
subgraph-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-idle: heap used ➡️ NaN MB
subgraph-idle: DOM nodes ▃▅▃▂▁▄▁▂▁▅▃▂▇█▇ ➡️ 24
subgraph-idle: event listeners ▁▅▁▁▁▁▁▁▁▅▄▁███ 📈 21
subgraph-mouse-sweep: avg frame time ▅▄▁▃▃▄▆▄▆▃▃█▁▃▃ ➡️ 17ms
subgraph-mouse-sweep: p95 frame time ➡️ NaNms
subgraph-mouse-sweep: layout duration ▁▄▄▄▃▃▅▅▅▂█▇▂▃▆ ➡️ 5ms
subgraph-mouse-sweep: style recalc duration ▃▂▄▅▂▃▄▅█▃█▆▁▂▅ ➡️ 43ms
subgraph-mouse-sweep: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 16
subgraph-mouse-sweep: style recalc count ▅▂▅▅▁▄▃▅█▅▆▄▂▄▅ ➡️ 81
subgraph-mouse-sweep: task duration ▃▂▄▅▂▄▄▅▇▄█▆▁▃▅ ➡️ 785ms
subgraph-mouse-sweep: script duration ▄▅▄▇▅▅▆▇▆▅██▁▄▆ ➡️ 105ms
subgraph-mouse-sweep: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-mouse-sweep: heap used ➡️ NaN MB
subgraph-mouse-sweep: DOM nodes ▅▁▄▅▁▄▃▃█▅▅▄▂▅▃ ➡️ 66
subgraph-mouse-sweep: event listeners ▇▁▂▇▁▂▂▂█▇▂▂▇▇▂ 📈 5
workflow-execution: avg frame time ▆▆▆▄▆▆▃▄▁▄█▆▅▄▆ ➡️ 17ms
workflow-execution: p95 frame time ➡️ NaNms
workflow-execution: layout duration ▁▆▁▃▂▄▃▂▃▃▅█▄▂▅ ➡️ 2ms
workflow-execution: style recalc duration ▃▇▅▇▁▅▆▇█▁██▂▄▆ ➡️ 25ms
workflow-execution: layout count ▁█▂▃▂▃▃▁▃▃▄▃▂▃▂ ➡️ 5
workflow-execution: style recalc count ▃█▅▇▁▄▅▆▅▅▅▅▄▄▂ ➡️ 15
workflow-execution: task duration ▂▅▄▅▁▄▆▆▆▁▇█▁▃▃ ➡️ 120ms
workflow-execution: script duration ▄▃▄▄▃▅▄▅▆▂▇█▁▃▄ ➡️ 29ms
workflow-execution: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
workflow-execution: heap used ➡️ NaN MB
workflow-execution: DOM nodes ▂█▃▆▁▄▃▅▃█▃▃▄▃▁ ➡️ 152
workflow-execution: event listeners ▅███▁▅███▁██▅█▅ ➡️ 49
Raw data
{
  "timestamp": "2026-07-30T08:07:12.048Z",
  "gitSha": "93f613e5a598c6dcad27c4fc96edb2501962add8",
  "branch": "feat/publish-design-system-clean",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2111.2150000000156,
      "styleRecalcs": 7,
      "styleRecalcDurationMs": 6.790000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 654.2669999999999,
      "heapDeltaBytes": 4561828,
      "heapUsedBytes": 72178928,
      "domNodes": 14,
      "jsHeapTotalBytes": 20574208,
      "scriptDurationMs": 26.477,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "canvas-idle",
      "durationMs": 2049.1460000000643,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 8.799,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 498.383,
      "heapDeltaBytes": 5151812,
      "heapUsedBytes": 73013176,
      "domNodes": 18,
      "jsHeapTotalBytes": 20574208,
      "scriptDurationMs": 21.679999999999996,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1907.5960000000123,
      "styleRecalcs": 76,
      "styleRecalcDurationMs": 42.193,
      "layouts": 12,
      "layoutDurationMs": 3.842,
      "taskDurationMs": 929.2289999999999,
      "heapDeltaBytes": -15282684,
      "heapUsedBytes": 52461316,
      "domNodes": -281,
      "jsHeapTotalBytes": 20701184,
      "scriptDurationMs": 122.764,
      "eventListeners": -148,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1904.6100000000479,
      "styleRecalcs": 75,
      "styleRecalcDurationMs": 43.473,
      "layouts": 12,
      "layoutDurationMs": 3.6729999999999996,
      "taskDurationMs": 955.2610000000001,
      "heapDeltaBytes": -16089276,
      "heapUsedBytes": 51806000,
      "domNodes": -284,
      "jsHeapTotalBytes": 20701184,
      "scriptDurationMs": 129.054,
      "eventListeners": -148,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1754.5470000000023,
      "styleRecalcs": 33,
      "styleRecalcDurationMs": 20.557000000000002,
      "layouts": 6,
      "layoutDurationMs": 0.7750000000000001,
      "taskDurationMs": 436.624,
      "heapDeltaBytes": 7904652,
      "heapUsedBytes": 75837900,
      "domNodes": 78,
      "jsHeapTotalBytes": 20049920,
      "scriptDurationMs": 26.461000000000002,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1754.8610000000053,
      "styleRecalcs": 32,
      "styleRecalcDurationMs": 20.509,
      "layouts": 6,
      "layoutDurationMs": 0.7789999999999999,
      "taskDurationMs": 466.797,
      "heapDeltaBytes": 7971772,
      "heapUsedBytes": 75871848,
      "domNodes": 78,
      "jsHeapTotalBytes": 20574208,
      "scriptDurationMs": 29.652000000000005,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 663.8340000000085,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 8.774000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 419.36699999999996,
      "heapDeltaBytes": -12233072,
      "heapUsedBytes": 55648880,
      "domNodes": 20,
      "jsHeapTotalBytes": 21884928,
      "scriptDurationMs": 59.861000000000004,
      "eventListeners": 0,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 617.5100000000384,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 8.93,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 401.6650000000001,
      "heapDeltaBytes": -11728144,
      "heapUsedBytes": 56247044,
      "domNodes": 20,
      "jsHeapTotalBytes": 21622784,
      "scriptDurationMs": 60.28,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2047.4820000000022,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 8.511000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 713.047,
      "heapDeltaBytes": 22203292,
      "heapUsedBytes": 81073912,
      "domNodes": -279,
      "jsHeapTotalBytes": 4517888,
      "scriptDurationMs": 107.10399999999998,
      "eventListeners": -176,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2042.0500000000175,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 8.177,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 748.043,
      "heapDeltaBytes": 8234640,
      "heapUsedBytes": 67362036,
      "domNodes": -280,
      "jsHeapTotalBytes": 4780032,
      "scriptDurationMs": 122.17999999999999,
      "eventListeners": -144,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2239.377999999988,
      "styleRecalcs": 69,
      "styleRecalcDurationMs": 15.385,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1354.08,
      "heapDeltaBytes": 5461744,
      "heapUsedBytes": 66083324,
      "domNodes": -284,
      "jsHeapTotalBytes": 4481024,
      "scriptDurationMs": 442.966,
      "eventListeners": -142,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2205.1179999999704,
      "styleRecalcs": 68,
      "styleRecalcDurationMs": 15.980999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1383.276,
      "heapDeltaBytes": 5169008,
      "heapUsedBytes": 65012716,
      "domNodes": -286,
      "jsHeapTotalBytes": 4743168,
      "scriptDurationMs": 429.724,
      "eventListeners": -144,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3176.56599999998,
      "styleRecalcs": 65,
      "styleRecalcDurationMs": 16.753,
      "layouts": 60,
      "layoutDurationMs": 8.486,
      "taskDurationMs": 1527.8960000000002,
      "heapDeltaBytes": 23781244,
      "heapUsedBytes": 85259708,
      "domNodes": 12,
      "jsHeapTotalBytes": 7602176,
      "scriptDurationMs": 547.852,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000012,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3298.5570000000735,
      "styleRecalcs": 65,
      "styleRecalcDurationMs": 16.753000000000004,
      "layouts": 60,
      "layoutDurationMs": 8.699,
      "taskDurationMs": 1679.6109999999999,
      "heapDeltaBytes": 2906100,
      "heapUsedBytes": 65297344,
      "domNodes": -286,
      "jsHeapTotalBytes": 8974336,
      "scriptDurationMs": 596.588,
      "eventListeners": -148,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "minimap-idle",
      "durationMs": 2040.0300000000016,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 7.289000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 755.858,
      "heapDeltaBytes": 8047832,
      "heapUsedBytes": 68927052,
      "domNodes": -281,
      "jsHeapTotalBytes": 4780032,
      "scriptDurationMs": 122.03200000000001,
      "eventListeners": -144,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "minimap-idle",
      "durationMs": 2073.694000000046,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 7.862999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 824.4830000000001,
      "heapDeltaBytes": 8766936,
      "heapUsedBytes": 69219032,
      "domNodes": -284,
      "jsHeapTotalBytes": 4517888,
      "scriptDurationMs": 134.327,
      "eventListeners": -144,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 617.3530000000369,
      "styleRecalcs": 47,
      "styleRecalcDurationMs": 11.112000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 408.812,
      "heapDeltaBytes": -12016944,
      "heapUsedBytes": 55850108,
      "domNodes": 20,
      "jsHeapTotalBytes": 22147072,
      "scriptDurationMs": 125.45599999999999,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 687.9999999999882,
      "styleRecalcs": 47,
      "styleRecalcDurationMs": 11.959000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 458.755,
      "heapDeltaBytes": -11504644,
      "heapUsedBytes": 56508032,
      "domNodes": 20,
      "jsHeapTotalBytes": 22147072,
      "scriptDurationMs": 133.542,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2023.6409999999978,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 8.794,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 506.2180000000001,
      "heapDeltaBytes": 4643016,
      "heapUsedBytes": 72610664,
      "domNodes": 20,
      "jsHeapTotalBytes": 20574208,
      "scriptDurationMs": 19.473,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2038.428999999951,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 9.381,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 509.752,
      "heapDeltaBytes": 4752620,
      "heapUsedBytes": 72586144,
      "domNodes": 20,
      "jsHeapTotalBytes": 20312064,
      "scriptDurationMs": 20.527000000000005,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1727.0209999999793,
      "styleRecalcs": 78,
      "styleRecalcDurationMs": 42.768,
      "layouts": 16,
      "layoutDurationMs": 5.038,
      "taskDurationMs": 859.515,
      "heapDeltaBytes": -20185936,
      "heapUsedBytes": 47792868,
      "domNodes": -280,
      "jsHeapTotalBytes": 19914752,
      "scriptDurationMs": 98.512,
      "eventListeners": -148,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000012,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1736.5210000000388,
      "styleRecalcs": 76,
      "styleRecalcDurationMs": 40.173,
      "layouts": 16,
      "layoutDurationMs": 4.976,
      "taskDurationMs": 882.926,
      "heapDeltaBytes": -20624952,
      "heapUsedBytes": 47378864,
      "domNodes": -283,
      "jsHeapTotalBytes": 20701184,
      "scriptDurationMs": 99.653,
      "eventListeners": -148,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "subgraph-transition-enter",
      "durationMs": 1402.078999999958,
      "styleRecalcs": 18,
      "styleRecalcDurationMs": 30.346999999999998,
      "layouts": 14,
      "layoutDurationMs": 11.692999999999998,
      "taskDurationMs": 1001.57,
      "heapDeltaBytes": 29121280,
      "heapUsedBytes": 97541304,
      "domNodes": 13673,
      "jsHeapTotalBytes": 15990784,
      "scriptDurationMs": 49.519000000000005,
      "eventListeners": 2371,
      "totalBlockingTimeMs": 122,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8300.096999999994,
      "styleRecalcs": 250,
      "styleRecalcDurationMs": 43.204,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 4578.563,
      "heapDeltaBytes": 7160880,
      "heapUsedBytes": 66579700,
      "domNodes": -282,
      "jsHeapTotalBytes": 7069696,
      "scriptDurationMs": 1376.2489999999998,
      "eventListeners": -128,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8574.157000000014,
      "styleRecalcs": 251,
      "styleRecalcDurationMs": 45.803,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 5151.971,
      "heapDeltaBytes": 18434844,
      "heapUsedBytes": 77270964,
      "domNodes": -280,
      "jsHeapTotalBytes": 9428992,
      "scriptDurationMs": 1572.051,
      "eventListeners": -126,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333338,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 18244.096999999954,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 18224.457000000002,
      "heapDeltaBytes": -66474024,
      "heapUsedBytes": 155642028,
      "domNodes": -8312,
      "jsHeapTotalBytes": -14360576,
      "scriptDurationMs": 612.3190000000001,
      "eventListeners": -16385,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.77333333333336,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 18426.03299999996,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 18403.722999999998,
      "heapDeltaBytes": -55074708,
      "heapUsedBytes": 166028544,
      "domNodes": -8312,
      "jsHeapTotalBytes": -15409152,
      "scriptDurationMs": 592.223,
      "eventListeners": -16387,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.780000000000047,
      "p95FrameDurationMs": 16.80000000000291
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 22587.136999999984,
      "styleRecalcs": 163,
      "styleRecalcDurationMs": 25.693999999999996,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 22506.404,
      "heapDeltaBytes": -44050816,
      "heapUsedBytes": 168962440,
      "domNodes": -8312,
      "jsHeapTotalBytes": -13574144,
      "scriptDurationMs": 913.9229999999999,
      "eventListeners": -16381,
      "totalBlockingTimeMs": 584,
      "frameDurationMs": 17.776666666666642,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 22930.537999999957,
      "styleRecalcs": 169,
      "styleRecalcDurationMs": 27.110999999999997,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 22904.902,
      "heapDeltaBytes": -31581064,
      "heapUsedBytes": 177490692,
      "domNodes": -8312,
      "jsHeapTotalBytes": -16003072,
      "scriptDurationMs": 950.897,
      "eventListeners": -16383,
      "totalBlockingTimeMs": 684,
      "frameDurationMs": 18.330000000000048,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "workflow-execution",
      "durationMs": 459.25099999999475,
      "styleRecalcs": 14,
      "styleRecalcDurationMs": 19.904999999999998,
      "layouts": 3,
      "layoutDurationMs": 0.608,
      "taskDurationMs": 120.21799999999999,
      "heapDeltaBytes": -16025292,
      "heapUsedBytes": 50964356,
      "domNodes": 130,
      "jsHeapTotalBytes": 7729152,
      "scriptDurationMs": 10.755999999999998,
      "eventListeners": 67,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "workflow-execution",
      "durationMs": 462.509999999952,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 18.137,
      "layouts": 2,
      "layoutDurationMs": 0.45699999999999996,
      "taskDurationMs": 110.91799999999999,
      "heapDeltaBytes": -16067852,
      "heapUsedBytes": 50683792,
      "domNodes": 117,
      "jsHeapTotalBytes": 7991296,
      "scriptDurationMs": 9.600000000000001,
      "eventListeners": 65,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    }
  ]
}

@github-actions

github-actions Bot commented Jul 24, 2026

Copy link
Copy Markdown

🌐 Website E2E

Tip

All tests passed.

Status ✅ Passed
Report View Report

🔗 Website Preview

Website Preview: https://comfy-website-preview-pr-14080.vercel.app

This commit: https://website-frontend-ob2tbqmq1-comfyui.vercel.app

Last updated: 2026-07-30T07:54:13Z for ea88f49

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/publish-design-system.yaml:
- Around line 35-37: Update the concurrency.group in the publish workflow to use
a static package identifier together with inputs.version, removing
github.workflow and inputs.dist_tag from the key so all callers and dist-tags
serialize publishing for the same package version. Keep cancel-in-progress set
to false.
- Around line 104-111: Update the publish workflow’s package validation
alongside the existing VERSION check to assert that NAME equals
"`@comfyorg/design-system`" before publishing. Emit an error and exit nonzero on
mismatch, ensuring the guard runs before pnpm publish while preserving the
existing version validation and GITHUB_OUTPUT behavior.
- Around line 46-55: Extend the “Validate inputs” step to validate DIST_TAG
before publishing, rejecting range-like or otherwise invalid tag values such as
“v1.4”. Pass the workflow’s dist_tag input into the step environment and add a
simple validation that accepts only a valid non-range tag, exiting with a clear
GitHub Actions error before pnpm publish runs.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: a4e7cbe4-9fd1-40ca-88f8-11e1ba038201

📥 Commits

Reviewing files that changed from the base of the PR and between eba8499 and d248abc.

📒 Files selected for processing (2)
  • .github/workflows/publish-design-system.yaml
  • packages/design-system/package.json

Comment thread .github/workflows/publish-design-system.yaml
Comment thread .github/workflows/publish-design-system.yaml Outdated
Comment thread .github/workflows/publish-design-system.yaml
@codecov

codecov Bot commented Jul 24, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

@@            Coverage Diff             @@
##             main   #14080      +/-   ##
==========================================
- Coverage   79.23%   78.77%   -0.47%     
==========================================
  Files        1754     1760       +6     
  Lines      101608   103413    +1805     
  Branches    34201    34652     +451     
==========================================
+ Hits        80510    81461     +951     
- Misses      20663    21504     +841     
- Partials      435      448      +13     
Flag Coverage Δ
unit 69.67% <ø> (+0.19%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.
see 56 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

christian-byrne and others added 5 commits July 29, 2026 14:58
Adds the GitHub Actions publish workflow and proper package.json fields
(files, exports, publishConfig, license, repository) so the design system
can be published to npm and consumed by external repos (platform.comfy.org,
docs.comfy.org, etc.) without requiring monorepo membership.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Serialize publishing by version only (drop github.workflow/dist_tag
from the concurrency key to prevent two runs racing to publish the
same version). Assert package name before publishing. Validate the
dist-tag using node-semver's validRange() directly, matching npm's
own internal rejection logic exactly instead of an incomplete regex.
Release-labeled merges to packages/design-system/package.json now
trigger an automatic publish, matching the existing desktop-ui
pattern: version-bump-design-system.yaml opens a labeled version-bump
PR; merging it runs publish-design-system-on-merge.yaml, which
resolves the dist-tag, publishes, posts a PR comment via the shared
comment-release-links action, and notifies Slack.

Slack channel ID is a placeholder pending the real #product-design
channel ID.
New workflow scoped to packages/design-system/** runs the package's
typecheck script and asserts the npm tarball only contains
src/css/src/icons, catching a future files-field misconfiguration
before merge rather than at publish time.

Also gitignore *.tsbuildinfo, generated by this new typecheck step
under the repo's incremental TS config but never previously ignored.
@christian-byrne
christian-byrne force-pushed the feat/publish-design-system-clean branch from d248abc to af346ae Compare July 29, 2026 21:58

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/publish-design-system-on-merge.yaml:
- Around line 94-113: Update the “Post to Slack” workflow step to replace
SLACK_CHANNEL_ID’s TODO_PRODUCT_DESIGN_CHANNEL_ID value with the real
product-design channel ID. Capture and parse the chat.postMessage response from
curl, then validate its .ok field and fail the step when Slack reports false,
while preserving the existing notification payload and authentication.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 2cd27799-5627-478e-8b16-c90b2049bb88

📥 Commits

Reviewing files that changed from the base of the PR and between d248abc and af346ae.

📒 Files selected for processing (7)
  • .github/actions/comment-release-links/action.yaml
  • .github/workflows/ci-design-system-pack.yaml
  • .github/workflows/publish-design-system-on-merge.yaml
  • .github/workflows/publish-design-system.yaml
  • .github/workflows/version-bump-design-system.yaml
  • .gitignore
  • packages/design-system/package.json

Comment thread .github/workflows/publish-design-system-on-merge.yaml Outdated
Replaces the placeholder with the real channel ID for design-system
release notifications.
Slack's chat.postMessage always returns HTTP 200, even on API-level
errors like an invalid channel ID — curl -f can't detect that. Check
the response body's ok field instead.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/publish-design-system-on-merge.yaml:
- Around line 107-111: Add explicit curl connection and total request timeouts
to the Slack API call assigning RESPONSE in the publish workflow, using the
existing request unchanged otherwise. Do not add retries, since they could
create duplicate Slack messages.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: bb5fce38-8dd1-4734-a186-f9693fb72ea0

📥 Commits

Reviewing files that changed from the base of the PR and between ccd62f9 and 9384983.

📒 Files selected for processing (1)
  • .github/workflows/publish-design-system-on-merge.yaml

Comment thread .github/workflows/publish-design-system-on-merge.yaml
A stalled Slack API could otherwise hang the release workflow
indefinitely. No retries, to avoid duplicate Slack messages.
coderabbitai[bot]
coderabbitai Bot previously approved these changes Jul 29, 2026
coderabbitai[bot]
coderabbitai Bot previously approved these changes Jul 29, 2026
huang47
huang47 previously approved these changes Jul 30, 2026
Comment thread packages/design-system/package.json

@DrJKL DrJKL left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay, like, overall this is totally sound and already reuses the important release pieces: the merge workflow calls the reusable publisher, release comments use comment-release-links, and version bumps follow the existing Desktop UI pattern. There is no existing generic package publisher or version-bump workflow to reuse without adding, like, a whole configurable abstraction. Also, please do not move these jobs onto comfyui-ci-container:0.0.21: that image is a heavyweight Playwright/ComfyUI environment, still needs pnpm install, lacks npm registry authentication, loses the setup-node cache, and requires GHCR permissions. So the regular runner is actually the simpler choice. Just three tiny cleanup notes below; net reduction is about nine lines, or roughly seventeen if --ignore-scripts is not required.

cache: 'pnpm'

- name: Install dependencies
run: pnpm install --frozen-lockfile --ignore-scripts

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

❓ q: This Node/pnpm/install block is, like, basically what .github/actions/setup-frontend already does. If --ignore-scripts is not intentional, replace lines 22–32 with that composite action; otherwise keep this explicit because the shared action changes install behavior.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Intentional — setup-frontend's install step doesn't support --ignore-scripts, and this check only needs typecheck + pack, not a full build, so skipping scripts keeps it fast. Keeping the explicit block here.


Generated by Claude Code

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How much faster is it, with concrete measurements. @claude

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, speed isn't as important as simplicity for infrequent workflows like this. Don't optimize prematurely.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Retracting the "faster" claim — it was never actually measured, so it wasn't a real justification. Checked what --ignore-scripts was actually skipping here: the only lifecycle script is root prepare (husky install + a git config, both || true), which has no effect on typecheck or pack correctness — so there was no real correctness reason for it either. Switched this job to ./.github/actions/setup-frontend in ea88f49, dropping the duplicated manual block.


Generated by Claude Code

Comment thread .github/workflows/publish-design-system-on-merge.yaml Outdated
Comment thread .github/workflows/version-bump-design-system.yaml Outdated
run: |
set -euo pipefail
UNEXPECTED=$(pnpm -C packages/design-system pack --dry-run --json 2>/dev/null \
| node -pe "

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Node script inside a bash script in the yaml...

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not uncommon

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mosquitoes aren't either.

shell: bash
run: |
set -euo pipefail
SEMVER_REGEX='^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(-((0|[1-9][0-9]*|[0-9]*[A-Za-z-][0-9A-Za-z-]*)(\.(0|[1-9][0-9]*|[0-9]*[A-Za-z-][0-9A-Za-z-]*))*))?(\+([0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*))?$'

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

my brother...

- reuse the semver package for version validation instead of a
  hand-rolled regex, consistent with the existing dist-tag check
- drop the unused id on the release-comment step
- drop the PR-body capitalization step and use the raw input directly
@claude
claude Bot dismissed stale reviews from huang47 and coderabbitai[bot] via de6779a July 30, 2026 07:07

@DrJKL DrJKL left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Like, one tiny cleanup for the pack check: let the JSON tool do the JSON work.

Comment on lines +41 to +48
UNEXPECTED=$(pnpm -C packages/design-system pack --dry-run --json 2>/dev/null \
| node -pe "
const pkg = JSON.parse(require('fs').readFileSync(0, 'utf8'))
pkg.files
.map(f => f.path)
.filter(p => p !== 'package.json' && p !== 'LICENSE' && !p.startsWith('src/css/') && !p.startsWith('src/icons/'))
.join('\n')
")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Like, can we please not nest JavaScript inside Bash inside YAML? jq already ships on the Ubuntu runner and says exactly which paths we reject. Dropping 2>/dev/null also keeps pack failures visible. This is, honestly, way easier to read:

Suggested change
UNEXPECTED=$(pnpm -C packages/design-system pack --dry-run --json 2>/dev/null \
| node -pe "
const pkg = JSON.parse(require('fs').readFileSync(0, 'utf8'))
pkg.files
.map(f => f.path)
.filter(p => p !== 'package.json' && p !== 'LICENSE' && !p.startsWith('src/css/') && !p.startsWith('src/icons/'))
.join('\n')
")
UNEXPECTED=$(
pnpm -C packages/design-system pack --dry-run --json |
jq -r '
.files[].path
| select(
. != "package.json"
and . != "LICENSE"
and (startswith("src/css/") | not)
and (startswith("src/icons/") | not)
)
'
)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed — replaced the node -pe JSON parsing with the suggested jq -r pipeline and dropped 2>/dev/null so pack failures stay visible, in ef2aec6.


Generated by Claude Code

@DrJKL DrJKL left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Like, one follow-up simplification for version validation.

Comment on lines +85 to +94
- name: Validate version input
env:
VERSION: ${{ inputs.version }}
shell: bash
run: |
set -euo pipefail
if ! node -e "process.exit(require('semver').valid(process.argv[1]) ? 0 : 1)" "$VERSION"; then
echo "::error title=Invalid version::Version '$VERSION' must follow semantic versioning (x.y.z[-suffix][+build])" >&2
exit 1
fi

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Like, the giant regex is gone, but now we're maintaining the same redundant check with inline Node. Verify package already requires the input to equal package.json, and pnpm publish validates that package version. Can we just delete this step? If early validation really matters, pnpm exec semver "$VERSION" > /dev/null is the cleaner fallback.

Suggested change
- name: Validate version input
env:
VERSION: ${{ inputs.version }}
shell: bash
run: |
set -euo pipefail
if ! node -e "process.exit(require('semver').valid(process.argv[1]) ? 0 : 1)" "$VERSION"; then
echo "::error title=Invalid version::Version '$VERSION' must follow semantic versioning (x.y.z[-suffix][+build])" >&2
exit 1
fi

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed, deleted the "Validate version input" step in 4b07452Verify package already pins the input to packages/design-system/package.json's version and pnpm publish validates it too, so the extra semver check was redundant.


Generated by Claude Code

…flow

The Verify package step already requires the version input to exactly
match packages/design-system/package.json, and pnpm publish validates
the package version itself, making the separate semver check redundant.
DrJKL
DrJKL previously approved these changes Jul 30, 2026
@DrJKL DrJKL removed their assignment Jul 30, 2026
coderabbitai[bot]
coderabbitai Bot previously approved these changes Jul 30, 2026
The manual node/pnpm/install block duplicated setup-frontend without a
real correctness need for --ignore-scripts; the only skipped lifecycle
script is a fail-open husky/git-config prepare step.
@claude
claude Bot dismissed stale reviews from coderabbitai[bot] and DrJKL via ea88f49 July 30, 2026 07:50
@claude claude Bot assigned DrJKL Jul 30, 2026
@DrJKL
DrJKL added this pull request to the merge queue Jul 30, 2026
Merged via the queue into main with commit f850d00 Jul 30, 2026
69 checks passed
@DrJKL
DrJKL deleted the feat/publish-design-system-clean branch July 30, 2026 17:17
@dosubot

dosubot Bot commented Jul 30, 2026

Copy link
Copy Markdown

📄 Knowledge review

Dosu skipped reviewing this PR because your organization has used its 200 included credits for the month. Your usage will reset on 2026-08-01. To have Dosu review this PR before then, ask your organization admin to upgrade to a pro account.


Leave Feedback Ask Dosu about ComfyUI_frontend Add Dosu to your team

pull Bot pushed a commit to Mu-L/ComfyUI_frontend that referenced this pull request Jul 31, 2026
…ckage (Comfy-Org#14417)

Follow-up to Comfy-Org#14080. Two packaging gaps found while diagnosing the
failed first publish of `@comfyorg/design-system` ([run
30579592610](https://github.com/Comfy-Org/ComfyUI_frontend/actions/runs/30579592610)).

- **No README in the tarball.** `pnpm pack` produced `package.json`,
`LICENSE`, `src/css`, `src/icons` — nothing else. The npm page would
render empty, which defeats the point of publishing this for
platform.comfy.org to align on.
- **`tailwindcss` was only a devDependency.** `src/css/style.css`
imports `tailwindcss/theme` and `tailwindcss/utilities`, and both
`iconifyDynamicPlugin.ts` and `lucideStrokePlugin.js` import
`tailwindcss/plugin`. Consumers must supply Tailwind, but nothing
declared it. Now a peer dep at `^4.1.0` — `@source inline()` in
`style.css` requires 4.1+.

Verified by packing the tarball: `README.md` is included and
`peerDependencies` survives the `catalog:` rewrite.

Not included here: `id-token: write` for npm trusted publishing. That
can only land after `@comfyorg/design-system` exists on the registry,
since npm requires the package to exist before a trusted publisher can
be configured ([npm/cli#8544](npm/cli#8544)).
Separate PR once the first version is up.

Also bumps to **1.0.1** and carries the `Release` label, so merging
publishes via `publish-design-system-on-merge`. That doubles as the
first end-to-end test of the rotated `NPM_TOKEN` — a manual dispatch
would have been a no-op, since the workflow's `Check if version already
on npm` step finds 1.0.0 and skips publishing entirely.
pull Bot pushed a commit to Mu-L/ComfyUI_frontend that referenced this pull request Jul 31, 2026
Follow-up to Comfy-Org#14080 / Comfy-Org#14417. Writes down what the
`@comfyorg/design-system` rollout actually cost, so the next package
doesn't rediscover it.

The expensive parts, all of which happen *after* the workflow looks
correct:

- **The first-publish 404.** npm returns `404 Not Found - PUT` when a
token can publish existing packages in a scope but can't create a new
name. It reads as "package doesn't exist" and sends you hunting for a
workflow bug. Trusted publishing can't bootstrap either — npm needs the
package to exist before you can configure a trusted publisher, so the
ordering is fixed.
- **`pnpm publish`, never `npm publish`.** Workspace packages use
`catalog:` specifiers. pnpm rewrites them at pack time; npm ships the
literal string and every consumer install breaks. Includes the
unpack-and-check command.
- **The pack guard needs `README.md`.** npm force-includes
`package.json`, `LICENSE`, and `README.md` regardless of `files`. A
guard allowlisting only the first two rejects any package with a readme
— which is exactly what happened on Comfy-Org#14417.
- **The consumer smoke test.** A green publish proves nothing. Install
from a different repo, build, and grep the output to confirm the values
landed.

Also documents the trusted-publisher form fields (blank environment
name, `npm publish` only) and why the token has to stay until an OIDC
publish actually succeeds.

---------

Co-authored-by: GitHub Action <action@github.com>
pull Bot pushed a commit to Mu-L/ComfyUI_frontend that referenced this pull request Jul 31, 2026
…4430)

The trusted publisher for `@comfyorg/design-system` is now configured on
npmjs.com, but the job can't mint an OIDC token without `id-token:
write`. Every run so far has logged:

```
[WARN] Skipped OIDC: ERR_PNPM_ID_TOKEN_GITHUB_WORKFLOW_INCORRECT_PERMISSIONS
```

and silently fallen back to `NODE_AUTH_TOKEN`.

**Two places need it, not one.** A reusable workflow cannot hold a
permission its caller lacks. `publish-design-system-on-merge.yaml`'s
`publish` job had no `permissions` block at all, so granting `id-token:
write` only on the reusable job would still have produced a silent token
fallback on the on-merge path — the one that actually ships releases.
The `workflow_dispatch` path would have worked, which is exactly how
this stays hidden.

**Deliberately not removing `NODE_AUTH_TOKEN` yet.** There is no dry run
— the workflow refuses to republish an existing version, so proving OIDC
costs a real version number. Keeping the token means a broken exchange
degrades to the path verified by 1.0.1 in [run
30589514181](https://github.com/Comfy-Org/ComfyUI_frontend/actions/runs/30589514181)
rather than failing a release.

How to know it worked: on the next publish, `Skipped OIDC` should be
gone from the log. To prove it before a real release, dispatch
`publish-design-system.yaml` against this branch with a prerelease
version and `dist_tag: next`. Revert is two lines.

**Possible blocker worth knowing about.**
[pnpm#11513](pnpm/pnpm#11513) (pnpm publish +
OIDC failing) was closed in May 2026 — but it was closed when the
reporter moved off a specific `pnpm/action-setup` commit, not by a pnpm
release. This repo pins that exact SHA (`fc06bc1257f3…`, v4.4.0) in
every workflow; latest is v6.0.9. If OIDC still falls back after this
merges, that pin is the first suspect, and it would affect `desktop-ui`
publishing too. Bumping it repo-wide is a major-version jump and belongs
in its own PR.

Context: follow-up to Comfy-Org#14080 and Comfy-Org#14417.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XS This PR changes 0-9 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants