Skip to content

Conversation

@snomiao
Copy link
Member

@snomiao snomiao commented Nov 20, 2025

Summary

Implements automated verification to ensure the OSS distribution complies with licensing requirements and properly removes proprietary/telemetry code.

This PR addresses the requirements from the Notion task:

  • ✅ Verifies no proprietary licenses in production dependencies
  • ✅ Checks ABCROM font is tree-shaken from OSS builds
  • ✅ Verifies Mixpanel telemetry is tree-shaken from OSS builds

Changes

New Verification Scripts

  1. scripts/verify-licenses.js

    • Validates all production dependencies use approved open-source licenses
    • Checks against a list of OSI-approved licenses
    • Flags any non-compliant or unknown licenses
  2. scripts/verify-oss-build.js

    • Scans the dist/ directory for violations
    • Checks for proprietary font files (ABCROM)
    • Searches JavaScript files for telemetry code (Mixpanel)
    • Reports all violations with file locations and code samples

CI Workflow

.github/workflows/ci-oss-compliance.yaml

  • Runs on all pushes to main/dev branches and pull requests
  • Two jobs:
    1. license-check: Verifies dependency licenses
    2. oss-build-check: Builds OSS distribution and verifies compliance
  • Uploads build artifacts on failure for debugging

NPM Scripts

pnpm verify:licenses      # Check dependency licenses
pnpm verify:oss          # Verify OSS build compliance
pnpm verify:compliance   # Run all checks (licenses + build + verify)
pnpm build:oss           # Build OSS distribution

Documentation

docs/OSS_COMPLIANCE.md

  • Complete guide for understanding and using the compliance checks
  • Explains tree-shaking mechanism
  • Troubleshooting guide
  • Instructions for adding new cloud-specific code

How It Works

Tree-Shaking Mechanism

The build uses compile-time constants for dead code elimination:

// vite.config.mts
define: {
  __DISTRIBUTION__: JSON.stringify(DISTRIBUTION)
}

// src/platform/distribution/types.ts
const DISTRIBUTION: Distribution = __DISTRIBUTION__
export const isCloud = DISTRIBUTION === 'cloud'

// src/platform/telemetry/index.ts
if (isCloud) {
  _telemetryProvider = new MixpanelTelemetryProvider()
}

When building with DISTRIBUTION=localhost:

  • isCloud evaluates to false
  • Vite's tree-shaking removes all cloud-specific code
  • Mixpanel library is never imported or bundled

Verification Patterns

The OSS build verifier checks for:

Proprietary Fonts:

  • .woff, .woff2, .ttf, .otf files containing "ABCROM"

Telemetry Code:

  • mixpanel / MixpanelTelemetryProvider
  • Tracking methods: trackWorkflow, trackEvent, .track(
  • API endpoints: mp.comfy.org

Test Plan

  • License check passes on current dependencies
  • Scripts handle missing dist/ directory gracefully
  • Scripts provide clear error messages and exit codes
  • Documentation is comprehensive and accurate
  • CI workflow runs successfully on this PR
  • OSS build verification passes after build

Testing Locally

# Check licenses
pnpm verify:licenses

# Build OSS distribution and verify
pnpm build:oss
pnpm verify:oss

# Or run all checks
pnpm verify:compliance

Notes

  • The license checker currently passes with 343 production dependencies
  • The OSS build verification requires building first (CI handles this automatically)
  • Build artifacts are uploaded for 7 days when CI checks fail

🤖 Generated with Claude Code

Fixes #10204

┆Issue is synchronized with this Notion page by Unito

…aking

Implements automated verification to ensure the OSS distribution:
1. Only includes open-source licensed dependencies
2. Properly tree-shakes proprietary fonts (ABCROM)
3. Removes telemetry code (Mixpanel) from OSS builds

New scripts:
- scripts/verify-licenses.js - Validates production dependency licenses
- scripts/verify-oss-build.js - Checks dist/ for violations

New CI workflow:
- .github/workflows/ci-oss-compliance.yaml - Runs compliance checks

New npm scripts:
- pnpm verify:licenses - Check dependency licenses
- pnpm verify:oss - Verify OSS build compliance
- pnpm verify:compliance - Run all checks
- pnpm build:oss - Build OSS distribution

Documentation:
- docs/OSS_COMPLIANCE.md - Complete guide for compliance checks

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
@github-actions
Copy link

github-actions bot commented Nov 20, 2025

🎨 Storybook Build Status

Build completed successfully!

⏰ Completed at: 11/20/2025, 06:15:27 AM UTC

🔗 Links


🎉 Your Storybook is ready for review!

@github-actions
Copy link

github-actions bot commented Nov 20, 2025

🎭 Playwright Test Results

⚠️ Tests passed with flaky tests

⏰ Completed at: 11/20/2025, 06:25:55 AM UTC

📈 Summary

  • Total Tests: 496
  • Passed: 484 ✅
  • Failed: 0
  • Flaky: 3 ⚠️
  • Skipped: 9 ⏭️

📊 Test Reports by Browser

  • chromium: View Report • ✅ 475 / ❌ 0 / ⚠️ 3 / ⏭️ 9
  • chromium-2x: View Report • ✅ 2 / ❌ 0 / ⚠️ 0 / ⏭️ 0
  • chromium-0.5x: View Report • ✅ 1 / ❌ 0 / ⚠️ 0 / ⏭️ 0
  • mobile-chrome: View Report • ✅ 6 / ❌ 0 / ⚠️ 0 / ⏭️ 0

🎉 Click on the links above to view detailed test results for each browser configuration.

@github-actions
Copy link

Bundle Size Report

Summary

  • Raw size: 13.7 MB baseline 13.7 MB — ⚪ 0 B
  • Gzip: 2.76 MB baseline 2.76 MB — ⚪ 0 B
  • Brotli: 2.16 MB baseline 2.16 MB — ⚪ 0 B
  • Bundles: 92 current • 92 baseline

Category Glance
Vendor & Third-Party ⚪ 0 B (5.32 MB) · Other ⚪ 0 B (3.87 MB) · App Entry Points ⚪ 0 B (3.13 MB) · Graph Workspace ⚪ 0 B (945 kB) · Panels & Settings ⚪ 0 B (306 kB) · UI Components ⚪ 0 B (141 kB) · + 3 more

Per-category breakdown
App Entry Points — 3.13 MB (baseline 3.13 MB) • ⚪ 0 B

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-6uRCaOM7.js 345 B 345 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/index-BQZ7gW7P.js 2.76 MB 2.76 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/index-BuWYeZhp.js 364 kB 364 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Graph Workspace — 945 kB (baseline 945 kB) • ⚪ 0 B

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-CPF3Ohcz.js 945 kB 945 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Views & Navigation — 7.97 kB (baseline 7.97 kB) • ⚪ 0 B

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/UserSelectView-CTaAEv1d.js 7.97 kB 7.97 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Panels & Settings — 306 kB (baseline 306 kB) • ⚪ 0 B

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/AboutPanel-B8tsWGjf.js 10.1 kB 10.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CreditsPanel-Do--WcwQ.js 22.9 kB 22.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ExtensionPanel-9U2_SWvw.js 11.9 kB 11.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/KeybindingPanel-B9yjevYB.js 15.1 kB 15.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ServerConfigPanel-DlIWyNiQ.js 8.02 kB 8.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BXTtSH4O.js 33.3 kB 33.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-C9Pzn-NG.js 25.2 kB 25.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CCy2fA_h.js 27.3 kB 27.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CQpqEFfl.js 26.6 kB 26.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DHcnxypw.js 21.7 kB 21.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DhFTK9fY.js 25.1 kB 25.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DlT4t_ui.js 25.9 kB 25.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DRgSrIdD.js 24.2 kB 24.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-tjkeqiZq.js 21.1 kB 21.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserPanel-ctKNANC-.js 7.74 kB 7.74 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
UI Components — 141 kB (baseline 141 kB) • ⚪ 0 B

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyQueueButton-Dw4au68w.js 9.27 kB 9.27 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/LazyImage.vue_vue_type_script_setup_true_lang-Wi-CcgaU.js 10.7 kB 10.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Load3D.vue_vue_type_script_setup_true_lang-DcMmlWVK.js 53.9 kB 53.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaTitle.vue_vue_type_script_setup_true_lang-DpzbJK5e.js 848 B 848 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar.vue_vue_type_script_setup_true_lang-D2s8tnS2.js 1.26 kB 1.26 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-ByrPd5jr.js 1.62 kB 1.62 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputNumber.vue_vue_type_script_setup_true_lang-B0V1aOQP.js 12.7 kB 12.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLayoutField.vue_vue_type_script_setup_true_lang-0f-d6p4U.js 2.14 kB 2.14 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetSelect.vue_vue_type_script_setup_true_lang-_laH8gKU.js 48.1 kB 48.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Data & Services — 12.5 kB (baseline 12.5 kB) • ⚪ 0 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/audioService-CvxNLHA8.js 2.2 kB 2.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/keybindingService-Dexeuju1.js 7.51 kB 7.51 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/serverConfigStore-BoHtzifw.js 2.79 kB 2.79 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Utilities & Hooks — 2.94 kB (baseline 2.94 kB) • ⚪ 0 B

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/audioUtils-C76lTTWU.js 1.41 kB 1.41 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/mathUtil-CTARWQ-l.js 1.07 kB 1.07 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeFilterUtil-CXKCRJ-m.js 460 B 460 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
Vendor & Third-Party — 5.32 MB (baseline 5.32 MB) • ⚪ 0 B

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-other-z0ajCJVX.js 3.22 MB 3.22 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-PESgPnbc.js 517 B 517 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-aR6ntw5X.js 1.37 MB 1.37 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-D2zb6Fg1.js 232 kB 232 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-aBQ_uOio.js 92.6 kB 92.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-BZLod3g9.js 407 kB 407 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Other — 3.87 MB (baseline 3.87 MB) • ⚪ 0 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/AudioPreviewPlayer-De_-cZWM.js 14.9 kB 14.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-_s-RvhJR.js 13.6 kB 13.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BuUILW6P.js 13 kB 13 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BV4R6fLx.js 14.9 kB 14.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CLwPdnT6.js 14.2 kB 14.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CWMchBmd.js 15.9 kB 15.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DazTQhtc.js 12.9 kB 12.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DmWrOe93.js 13.7 kB 13.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DwiH7Kr6.js 13.8 kB 13.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-mS3LCNPn.js 14.5 kB 14.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Load3D-BWbHPNHI.js 1.94 kB 1.94 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-5lOBdqcC.js 84.5 kB 84.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BOCuaVpE.js 73.4 kB 73.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-ClrEFGUz.js 72.4 kB 72.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CyNU0iQX.js 99.3 kB 99.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-D7gwLxft.js 114 kB 114 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DC8o4BCt.js 86.8 kB 86.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DKiesCV4.js 94.3 kB 94.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Hq2q-OtB.js 83.6 kB 83.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-USAlAlnj.js 82 kB 82 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DBottom-Bj3_Y2cM.js 2.98 kB 2.98 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DTop-CQQwlKVp.js 3 kB 3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioBottom-D06dnhiH.js 3 kB 3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-RTI8pWy9.js 1.42 kB 1.42 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageBottom-XEhj0VQw.js 3.05 kB 3.05 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-Cxl4dc80.js 1.68 kB 1.68 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoBottom-D63MmkO6.js 3 kB 3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-BB0lT7C5.js 2.7 kB 2.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-_Px5dSNW.js 306 kB 306 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-7z21KPoS.js 285 kB 285 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BWKZzBPK.js 346 kB 346 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CGbgH4Yl.js 320 kB 320 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CjjjdWkV.js 313 kB 313 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CVrNtxvj.js 288 kB 288 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DLRSA0IK.js 309 kB 309 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DQV2gnwA.js 372 kB 372 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-ofqLG5vz.js 310 kB 310 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetAudioUI-B_cH8m8o.js 4.33 kB 4.33 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-rDmYEWg5.js 2.39 kB 2.39 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetColorPicker-BQCGZ3wl.js 4.87 kB 4.87 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetGalleria-DsnzIi7E.js 5.56 kB 5.56 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-Ds3K3ULR.js 2.15 kB 2.15 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputNumber-DtX4gXCJ.js 2.12 kB 2.12 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputText-C2oeGs3B.js 3.45 kB 3.45 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLegacy-DNR7mKvs.js 1.88 kB 1.88 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetMarkdown--uMxjaGd.js 4.6 kB 4.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-BIbGSUAt.js 1.28 kB 1.28 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetRecordAudio-CcS4vD4E.js 21.9 kB 21.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetSelect-CRysjpSA.js 2.17 kB 2.17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetTextarea-CWWz9-E2.js 3.6 kB 3.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetToggleSwitch-BIP4jjO6.js 3.23 kB 3.23 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants