diff --git a/.claude/commands/add-missing-i18n.md b/.claude/commands/add-missing-i18n.md index 4b84141891..b88a2005e2 100644 --- a/.claude/commands/add-missing-i18n.md +++ b/.claude/commands/add-missing-i18n.md @@ -3,12 +3,15 @@ ## Task: Add English translations for all new localized strings ### Step 1: Identify new translation keys + Find all translation keys that were added in the current branch's changes. These keys appear as arguments to translation functions: `t()`, `st()`, `$t()`, or similar i18n functions. ### Step 2: Add translations to English locale file + For each new translation key found, add the corresponding English text to the file `src/locales/en/main.json`. ### Key-to-JSON mapping rules: + - Translation keys use dot notation to represent nested JSON structure - Convert dot notation to nested JSON objects when adding to the locale file - Example: The key `g.user.name` maps to: @@ -23,6 +26,7 @@ For each new translation key found, add the corresponding English text to the fi ``` ### Important notes: + 1. **Only modify the English locale file** (`src/locales/en/main.json`) 2. **Do not modify other locale files** - translations for other languages are automatically generated by the `i18n.yaml` workflow 3. **Exception for manual translations**: Only add translations to non-English locale files if: @@ -30,6 +34,7 @@ For each new translation key found, add the corresponding English text to the fi - The automated translation would likely be incorrect due to technical terminology or context-specific meaning ### Example workflow: + 1. If you added `t('settings.advanced.enable')` in a Vue component 2. Add to `src/locales/en/main.json`: ```json diff --git a/.claude/commands/comprehensive-pr-review.md b/.claude/commands/comprehensive-pr-review.md index 1b4047e782..b801fff9e1 100644 --- a/.claude/commands/comprehensive-pr-review.md +++ b/.claude/commands/comprehensive-pr-review.md @@ -15,6 +15,7 @@ To post inline comments, you will use the GitHub API via the `gh` command. Here' - Run: `gh pr view $PR_NUMBER --json commits --jq '.commits[-1].oid'` to get the latest commit SHA 2. For each issue you find, post an inline comment using this exact command structure (as a single line): + ``` gh api --method POST -H "Accept: application/vnd.github+json" -H "X-GitHub-Api-Version: 2022-11-28" /repos/OWNER/REPO/pulls/$PR_NUMBER/comments -f body="YOUR_COMMENT_BODY" -f commit_id="COMMIT_SHA" -f path="FILE_PATH" -F line=LINE_NUMBER -f side="RIGHT" ``` @@ -22,13 +23,15 @@ To post inline comments, you will use the GitHub API via the `gh` command. Here' 3. Format your comment body using actual newlines in the command. Use a heredoc or construct the body with proper line breaks: ``` COMMENT_BODY="**[category] severity Priority** + ``` **Issue**: Brief description of the problem **Context**: Why this matters **Suggestion**: How to fix it" - ``` - - Then use: `-f body="$COMMENT_BODY"` + +``` + +Then use: `-f body="$COMMENT_BODY"` ## Phase 1: Environment Setup and PR Context @@ -58,10 +61,12 @@ This is critical for better file inspection: 1. Get PR metadata: `gh pr view $PR_NUMBER --json files,title,body,additions,deletions,baseRefName,headRefName > pr_info.json` 2. Extract branch names from pr_info.json using jq 3. Fetch and checkout the PR branch: - ``` - git fetch origin "pull/$PR_NUMBER/head:pr-$PR_NUMBER" - git checkout "pr-$PR_NUMBER" - ``` +``` + +git fetch origin "pull/$PR_NUMBER/head:pr-$PR_NUMBER" +git checkout "pr-$PR_NUMBER" + +``` ### Step 1.4: Get Changed Files and Diffs @@ -100,9 +105,9 @@ Intelligently load only relevant knowledge: 1. Use GitHub API to discover available knowledge folders: `https://api.github.com/repos/Comfy-Org/comfy-claude-prompt-library/contents/.claude/knowledge` 2. For each knowledge folder, check if it's relevant by searching for the folder name in: - - Changed file paths - - PR title - - PR body +- Changed file paths +- PR title +- PR body 3. If relevant, download all files from that knowledge folder ### Step 2.4: Load Validation Rules @@ -193,12 +198,14 @@ Consider: For each issue found, create a concise inline comment with this structure: ``` + **[category] severity Priority** **Issue**: Brief description of the problem **Context**: Why this matters **Suggestion**: How to fix it -``` + +```` Categories: architecture/security/performance/quality Severities: critical/high/medium/low @@ -214,7 +221,7 @@ For EACH issue: ```bash gh api --method POST -H "Accept: application/vnd.github+json" -H "X-GitHub-Api-Version: 2022-11-28" /repos/OWNER/REPO/pulls/$PR_NUMBER/comments -f body="$COMMENT_BODY" -f commit_id="COMMIT_SHA" -f path="FILE_PATH" -F line=LINE_NUMBER -f side="RIGHT" -``` +```` CRITICAL: The entire command must be on one line. Use actual values, not placeholders. @@ -223,12 +230,14 @@ CRITICAL: The entire command must be on one line. Use actual values, not placeho Here's an example of how to review a file with a security issue: 1. First, get the repository info: + ```bash gh repo view --json owner,name # Output: {"owner":{"login":"Comfy-Org"},"name":"ComfyUI_frontend"} ``` 2. Get the commit SHA: + ```bash gh pr view $PR_NUMBER --json commits --jq '.commits[-1].oid' # Output: abc123def456 @@ -240,14 +249,17 @@ Here's an example of how to review a file with a security issue: ```bash # First, create the comment body with proper newlines COMMENT_BODY="**[security] critical Priority** + ``` **Issue**: SQL injection vulnerability - user input directly concatenated into query **Context**: Allows attackers to execute arbitrary SQL commands **Suggestion**: Use parameterized queries or prepared statements" - - # Then post the comment (as a single line) - gh api --method POST -H "Accept: application/vnd.github+json" -H "X-GitHub-Api-Version: 2022-11-28" /repos/Comfy-Org/ComfyUI_frontend/pulls/$PR_NUMBER/comments -f body="$COMMENT_BODY" -f commit_id="abc123def456" -f path="src/db/queries.js" -F line=42 -f side="RIGHT" - ``` + +# Then post the comment (as a single line) + +gh api --method POST -H "Accept: application/vnd.github+json" -H "X-GitHub-Api-Version: 2022-11-28" /repos/Comfy-Org/ComfyUI_frontend/pulls/$PR_NUMBER/comments -f body="$COMMENT_BODY" -f commit_id="abc123def456" -f path="src/db/queries.js" -F line=42 -f side="RIGHT" + +``` Repeat this process for every issue you find in the PR. @@ -282,9 +294,9 @@ Analyze the PR to determine its type: 1. Extract PR title and body from pr_info.json 2. Count files, additions, and deletions 3. Determine PR type: - - Feature: Check for tests, documentation, backward compatibility - - Bug fix: Verify root cause addressed, includes regression tests - - Refactor: Ensure behavior preservation, tests still pass +- Feature: Check for tests, documentation, backward compatibility +- Bug fix: Verify root cause addressed, includes regression tests +- Refactor: Ensure behavior preservation, tests still pass ## Phase 7: Generate Comprehensive Summary @@ -292,16 +304,17 @@ After ALL inline comments are posted, create a summary: 1. Calculate total issues by category and severity 2. Use `gh pr review $PR_NUMBER --comment` to post a summary with: - - Review disclaimer - - Issue distribution (counts by severity) - - Category breakdown - - Key findings for each category - - Positive observations - - References to guidelines - - Next steps +- Review disclaimer +- Issue distribution (counts by severity) +- Category breakdown +- Key findings for each category +- Positive observations +- References to guidelines +- Next steps Include in the summary: ``` + # Comprehensive PR Review This review is generated by Claude. It may not always be accurate, as with human reviewers. If you believe that any of the comments are invalid or incorrect, please state why for each. For others, please implement the changes in one way or another. @@ -312,12 +325,14 @@ This review is generated by Claude. It may not always be accurate, as with human **Impact**: [X] additions, [Y] deletions across [Z] files ### Issue Distribution + - Critical: [CRITICAL_COUNT] - High: [HIGH_COUNT] - Medium: [MEDIUM_COUNT] - Low: [LOW_COUNT] ### Category Breakdown + - Architecture: [ARCHITECTURE_ISSUES] issues - Security: [SECURITY_ISSUES] issues - Performance: [PERFORMANCE_ISSUES] issues @@ -326,33 +341,42 @@ This review is generated by Claude. It may not always be accurate, as with human ## Key Findings ### Architecture & Design + [Detailed architectural analysis based on repository patterns] ### Security Considerations + [Security implications beyond basic vulnerabilities] ### Performance Impact + [Performance analysis including bundle size, render impact] ### Integration Points + [How this affects other systems, extensions, etc.] ## Positive Observations + [What was done well, good patterns followed] ## References + - [Repository Architecture Guide](https://github.com/Comfy-Org/comfy-claude-prompt-library/blob/master/project-summaries-for-agents/ComfyUI_frontend/REPOSITORY_GUIDE.md) - [Frontend Standards](https://github.com/Comfy-Org/comfy-claude-prompt-library/blob/master/.claude/commands/validation/frontend-code-standards.md) - [Security Guidelines](https://github.com/Comfy-Org/comfy-claude-prompt-library/blob/master/.claude/commands/validation/security-audit.md) ## Next Steps + 1. Address critical issues before merge 2. Consider architectural feedback for long-term maintainability 3. Add tests for uncovered scenarios 4. Update documentation if needed --- -*This is a comprehensive automated review. For architectural decisions requiring human judgment, please request additional manual review.* + +_This is a comprehensive automated review. For architectural decisions requiring human judgment, please request additional manual review._ + ``` ## Important Guidelines @@ -375,4 +399,5 @@ This is a COMPREHENSIVE review, not a linting pass. Provide the same quality fee 5. Phase 6: Consider PR type for additional checks 6. Phase 7: Post comprehensive summary ONLY after all inline comments -Remember: Individual inline comments for each issue, then one final summary. Never batch issues into a single comment. \ No newline at end of file +Remember: Individual inline comments for each issue, then one final summary. Never batch issues into a single comment. +``` diff --git a/.claude/commands/create-frontend-release.md b/.claude/commands/create-frontend-release.md index f16189d428..5554b69557 100644 --- a/.claude/commands/create-frontend-release.md +++ b/.claude/commands/create-frontend-release.md @@ -7,8 +7,9 @@ Create a frontend release with version type: $ARGUMENTS Expected format: Version increment type and optional description Examples: + - `patch` - Bug fixes only -- `minor` - New features, backward compatible +- `minor` - New features, backward compatible - `major` - Breaking changes - `prerelease` - Alpha/beta/rc releases - `patch "Critical security fixes"` - With custom description @@ -21,8 +22,9 @@ If no arguments provided, the command will always perform prerelease if the curr ## Prerequisites Before starting, ensure: + - You have push access to the repository -- GitHub CLI (`gh`) is authenticated +- GitHub CLI (`gh`) is authenticated - You're on a clean main branch working tree - All intended changes are merged to main - You understand the scope of changes being released @@ -30,6 +32,7 @@ Before starting, ensure: ## Critical Checks Before Starting ### 1. Check Current Version Status + ```bash # Get current version and check if it's a pre-release CURRENT_VERSION=$(node -p "require('./package.json').version") @@ -40,6 +43,7 @@ fi ``` ### 2. Find Last Stable Release + ```bash # Get last stable release tag (no pre-release suffix) LAST_STABLE=$(git tag -l "v*" | grep -v "\-" | sort -V | tail -1) @@ -49,6 +53,7 @@ echo "Last stable release: $LAST_STABLE" ## Configuration Options **Environment Variables:** + - `RELEASE_SKIP_SECURITY_SCAN=true` - Skip security audit - `RELEASE_AUTO_APPROVE=true` - Skip some confirmation prompts - `RELEASE_DRY_RUN=true` - Simulate release without executing @@ -129,13 +134,14 @@ echo "Last stable release: $LAST_STABLE" ### Step 4: Analyze Dependency Updates 1. **Use pnpm's built-in dependency analysis:** + ```bash # Get outdated dependencies with pnpm pnpm outdated --format table > outdated-deps-${NEW_VERSION}.txt - + # Check for license compliance pnpm licenses ls --json > licenses-${NEW_VERSION}.json - + # Analyze why specific dependencies exist echo "Dependency analysis:" > dep-analysis-${NEW_VERSION}.md MAJOR_DEPS=("vue" "vite" "@vitejs/plugin-vue" "typescript" "pinia") @@ -147,22 +153,23 @@ echo "Last stable release: $LAST_STABLE" ``` 2. **Check for significant dependency updates:** + ```bash # Extract all dependency changes for major version bumps OTHER_DEP_CHANGES="" - + # Compare major dependency versions (you can extend this list) MAJOR_DEPS=("vue" "vite" "@vitejs/plugin-vue" "typescript" "pinia") - + for dep in "${MAJOR_DEPS[@]}"; do PREV_VER=$(echo "$PREV_PACKAGE_JSON" | grep -o "\"$dep\": \"[^\"]*\"" | grep -o '[0-9][^"]*' | head -1 || echo "") CURR_VER=$(echo "$CURRENT_PACKAGE_JSON" | grep -o "\"$dep\": \"[^\"]*\"" | grep -o '[0-9][^"]*' | head -1 || echo "") - + if [ "$PREV_VER" != "$CURR_VER" ] && [ -n "$PREV_VER" ] && [ -n "$CURR_VER" ]; then # Check if it's a major version change PREV_MAJOR=$(echo "$PREV_VER" | cut -d. -f1 | sed 's/[^0-9]//g') CURR_MAJOR=$(echo "$CURR_VER" | cut -d. -f1 | sed 's/[^0-9]//g') - + if [ "$PREV_MAJOR" != "$CURR_MAJOR" ]; then OTHER_DEP_CHANGES="${OTHER_DEP_CHANGES}\n- **${dep}**: ${PREV_VER} → ${CURR_VER} (Major version change)" fi @@ -173,11 +180,12 @@ echo "Last stable release: $LAST_STABLE" ### Step 5: Generate GTM Feature Summary 1. **Collect PR data for analysis:** + ```bash # Get list of PR numbers from commits PR_NUMBERS=$(git log ${BASE_TAG}..HEAD --oneline --no-merges --first-parent | \ grep -oE "#[0-9]+" | tr -d '#' | sort -u) - + # Save PR data for each PR echo "[" > prs-${NEW_VERSION}.json first=true @@ -189,16 +197,17 @@ echo "Last stable release: $LAST_STABLE" ``` 2. **Analyze for GTM-worthy features:** + ``` Review these PRs to identify features worthy of marketing attention. - + A feature is GTM-worthy if it meets ALL of these criteria: - Introduces a NEW capability users didn't have before (not just improvements) - Would be a compelling reason for users to upgrade to this version - Can be demonstrated visually or has clear before/after comparison - Affects a significant portion of the user base - + NOT GTM-worthy: - Bug fixes (even important ones) - Minor UI tweaks or color changes @@ -206,19 +215,20 @@ echo "Last stable release: $LAST_STABLE" - Internal refactoring - Small convenience features - Features that only improve existing functionality marginally - + For each GTM-worthy feature, note: - PR number, title, and author - Media links from the PR description - One compelling sentence on why users should care - + If there are no GTM-worthy features, just say "No marketing-worthy features in this release." - + PR data: [contents of prs-${NEW_VERSION}.json] ``` 3. **Generate GTM notification using this EXACT Slack-compatible format:** + ```bash # Only create file if GTM-worthy features exist: if [ "$GTM_FEATURES_FOUND" = "true" ]; then @@ -252,8 +262,8 @@ echo "Last stable release: $LAST_STABLE" ``` **CRITICAL Formatting Requirements:** - - Use single asterisk (*) for emphasis, NOT double (**) - - Use underscore (_) for italics + - Use single asterisk (\*) for emphasis, NOT double (\*\*) + - Use underscore (\_) for italics - Use 4 spaces for indentation (not tabs) - Convert author names to @username format (e.g., "John Smith" → "@john") - No section headers (#), no code language specifications @@ -263,6 +273,7 @@ echo "Last stable release: $LAST_STABLE" ### Step 6: Version Preview **Version Preview:** + - Current: `${CURRENT_VERSION}` - Proposed: Show exact version number based on analysis: - Major version if breaking changes detected @@ -326,6 +337,7 @@ echo "Last stable release: $LAST_STABLE" done ``` 3. Create standardized release notes using this exact template: + ```bash cat > release-notes-${NEW_VERSION}.md << 'EOF' ## ⚠️ Breaking Changes @@ -359,6 +371,7 @@ echo "Last stable release: $LAST_STABLE" **Full Changelog**: https://github.com/Comfy-Org/ComfyUI_frontend/compare/${BASE_TAG}...v${NEW_VERSION} EOF ``` + 4. **Parse commits and populate template:** - Group commits by conventional commit type (feat:, fix:, chore:, etc.) - Extract PR numbers from commit messages @@ -375,16 +388,19 @@ echo "Last stable release: $LAST_STABLE" ### Step 10: Create Version Bump PR **For standard version bumps (patch/minor/major):** + ```bash # Trigger the workflow -gh workflow run version-bump.yaml -f version_type=${VERSION_TYPE} +gh workflow run release-version-bump.yaml -f version_type=${VERSION_TYPE} # Workflow runs quickly - usually creates PR within 30 seconds echo "Workflow triggered. Waiting for PR creation..." ``` **For releasing a stable version:** + 1. Must manually create branch and update version: + ```bash git checkout -b version-bump-${NEW_VERSION} # Edit package.json to remove pre-release suffix @@ -394,23 +410,25 @@ echo "Workflow triggered. Waiting for PR creation..." ``` 2. Wait for PR creation (if using workflow) or create manually: + ```bash # For workflow-created PRs - wait and find it sleep 30 # Look for PR from comfy-pr-bot (not github-actions) PR_NUMBER=$(gh pr list --author comfy-pr-bot --limit 1 --json number --jq '.[0].number') - + # Verify we got the PR if [ -z "$PR_NUMBER" ]; then echo "PR not found yet. Checking recent PRs..." gh pr list --limit 5 --json number,title,author fi - + # For manual PRs gh pr create --title "${NEW_VERSION}" \ --body-file release-notes-${NEW_VERSION}.md \ --label "Release" ``` + 3. **Update PR with release notes:** ```bash # For workflow-created PRs, update the body with our release notes @@ -425,28 +443,21 @@ echo "Workflow triggered. Waiting for PR creation..." gh pr view ${PR_NUMBER} --json labels | jq -r '.labels[].name' | grep -q "Release" || \ echo "ERROR: Release label missing! Add it immediately!" ``` -2. Check for update-locales commits: - ```bash - # WARNING: update-locales may add [skip ci] which blocks release workflow! - gh pr view ${PR_NUMBER} --json commits | grep -q "skip ci" && \ - echo "WARNING: [skip ci] detected - release workflow may not trigger!" - ``` -3. Verify version number in package.json -4. Review all changed files -5. Ensure no unintended changes included -6. Wait for required PR checks: +2. Verify version number in package.json +3. Review all changed files +4. Ensure no unintended changes included +5. Wait for required PR checks: ```bash gh pr checks ${PR_NUMBER} --watch ``` -7. **FINAL CODE REVIEW**: Release label present and no [skip ci]? +6. **FINAL CODE REVIEW**: Release label present and no [skip ci]? ### Step 12: Pre-Merge Validation 1. **Review Requirements**: Release PRs require approval -2. Monitor CI checks - watch for update-locales -3. **CRITICAL WARNING**: If update-locales adds [skip ci], the release workflow won't trigger! -4. Check no new commits to main since PR creation -5. **DEPLOYMENT READINESS**: Ready to merge? +2. Monitor CI checks +3. Check no new commits to main since PR creation +4. **DEPLOYMENT READINESS**: Ready to merge? ### Step 13: Execute Release @@ -468,14 +479,14 @@ echo "Workflow triggered. Waiting for PR creation..." # Monitor branch creation (for minor/major releases) gh run list --workflow=release-branch-create.yaml --limit=1 ``` -4. If workflow didn't trigger due to [skip ci]: +5. If workflow didn't trigger due to [skip ci]: ```bash echo "ERROR: Release workflow didn't trigger!" echo "Options:" echo "1. Create patch release (e.g., 1.24.1) to trigger workflow" echo "2. Investigate manual release options" ``` -5. If workflow triggered, monitor execution: +6. If workflow triggered, monitor execution: ```bash WORKFLOW_RUN_ID=$(gh run list --workflow=release-draft-create.yaml --limit=1 --json databaseId --jq '.[0].databaseId') gh run watch ${WORKFLOW_RUN_ID} @@ -484,6 +495,7 @@ echo "Workflow triggered. Waiting for PR creation..." ### Step 14: Enhance GitHub Release 1. Wait for automatic release creation: + ```bash # Wait for release to be created while ! gh release view v${NEW_VERSION} >/dev/null 2>&1; do @@ -493,13 +505,14 @@ echo "Workflow triggered. Waiting for PR creation..." ``` 2. **Enhance the GitHub release:** + ```bash # Update release with our release notes gh release edit v${NEW_VERSION} \ --title "🚀 ComfyUI Frontend v${NEW_VERSION}" \ --notes-file release-notes-${NEW_VERSION}.md \ --latest - + # Add any additional assets if needed # gh release upload v${NEW_VERSION} additional-assets.zip ``` @@ -512,14 +525,17 @@ echo "Workflow triggered. Waiting for PR creation..." ### Step 15: Verify Multi-Channel Distribution 1. **GitHub Release:** + ```bash gh release view v${NEW_VERSION} --json assets,body,createdAt,tagName ``` + - ✅ Check release notes - ✅ Verify dist.zip attachment - ✅ Confirm release marked as latest (for main branch) 2. **PyPI Package:** + ```bash # Check PyPI availability (may take a few minutes) for i in {1..10}; do @@ -533,6 +549,7 @@ echo "Workflow triggered. Waiting for PR creation..." ``` 3. **npm Package:** + ```bash # Check npm availability for i in {1..10}; do @@ -550,15 +567,17 @@ echo "Workflow triggered. Waiting for PR creation..." ### Step 16: Post-Release Monitoring Setup 1. **Monitor immediate release health:** + ```bash # Check for immediate issues gh issue list --label "bug" --state open --limit 5 --json title,number,createdAt - + # Monitor download metrics (if accessible) gh release view v${NEW_VERSION} --json assets --jq '.assets[].downloadCount' ``` 2. **Update documentation tracking:** + ```bash cat > post-release-checklist.md << EOF # Post-Release Checklist for v${NEW_VERSION} @@ -589,6 +608,7 @@ echo "Workflow triggered. Waiting for PR creation..." ``` 3. **Create release summary:** + ```bash cat > release-summary-${NEW_VERSION}.md << EOF # Release Summary: ComfyUI Frontend v${NEW_VERSION} @@ -626,6 +646,7 @@ echo "Workflow triggered. Waiting for PR creation..." ### Step 17: Create Release Summary 1. **Create comprehensive release summary:** + ```bash cat > release-summary-${NEW_VERSION}.md << EOF # Release Summary: ComfyUI Frontend v${NEW_VERSION} @@ -665,6 +686,7 @@ echo "Workflow triggered. Waiting for PR creation..." ### Rollback Procedures **Pre-Merge Rollback:** + ```bash # Close version bump PR and reset gh pr close ${PR_NUMBER} @@ -673,6 +695,7 @@ git clean -fd ``` **Post-Merge Rollback:** + ```bash # Create immediate patch release with reverts git revert ${RELEASE_COMMIT} @@ -680,6 +703,7 @@ git revert ${RELEASE_COMMIT} ``` **Emergency Procedures:** + ```bash # Document incident cat > release-incident-${NEW_VERSION}.md << EOF @@ -713,31 +737,39 @@ The command implements multiple quality gates: ## Common Scenarios ### Scenario 1: Regular Feature Release + ```bash /project:create-frontend-release minor ``` + - Analyzes features since last release - Generates changelog automatically - Creates comprehensive release notes ### Scenario 2: Critical Security Patch + ```bash /project:create-frontend-release patch "Security fixes for CVE-2024-XXXX" ``` + - Expedited security scanning - Enhanced monitoring setup ### Scenario 3: Major Version with Breaking Changes + ```bash /project:create-frontend-release major ``` + - Comprehensive breaking change analysis - Migration guide generation ### Scenario 4: Pre-release Testing + ```bash /project:create-frontend-release prerelease ``` + - Creates alpha/beta/rc versions - Draft release status - Python package specs require that prereleases use alpha/beta/rc as the preid @@ -747,10 +779,12 @@ The command implements multiple quality gates: When executing this release process, pay attention to these key aspects: ### Version Handling + - For pre-release versions (e.g., 1.24.0-rc.1), the next stable release should be the same version without the suffix (1.24.0) - Never skip version numbers - follow semantic versioning strictly ### Commit History Analysis + - **ALWAYS** use `--first-parent` flag with git log to avoid including commits from merged feature branches - Verify PR merge targets before including them in changelogs: ```bash @@ -758,6 +792,7 @@ When executing this release process, pay attention to these key aspects: ``` ### Release Workflow Triggers + - The "Release" label on the PR is **CRITICAL** - without it, PyPI/npm publishing won't occur - Check for `[skip ci]` in commit messages before merging - this blocks the release workflow - If you encounter `[skip ci]`, push an empty commit to override it: @@ -766,11 +801,13 @@ When executing this release process, pay attention to these key aspects: ``` ### PR Creation Details + - Version bump PRs come from `comfy-pr-bot`, not `github-actions` - The workflow typically completes in 20-30 seconds - Always wait for the PR to be created before trying to edit it ### Breaking Changes Detection + - Analyze changes to public-facing APIs: - The `app` object and its methods - The `api` module exports @@ -779,9 +816,10 @@ When executing this release process, pay attention to these key aspects: - Any modifications to these require marking as breaking changes ### Recovery Procedures + If the release workflow fails to trigger: + 1. Create a revert PR to restore the previous version 2. Merge the revert 3. Re-run the version bump workflow 4. This approach is cleaner than creating extra version numbers - diff --git a/.claude/commands/create-hotfix-release.md b/.claude/commands/create-hotfix-release.md index cc9c37ef5b..8c68ef8880 100644 --- a/.claude/commands/create-hotfix-release.md +++ b/.claude/commands/create-hotfix-release.md @@ -3,10 +3,11 @@ This command creates patch/hotfix releases for ComfyUI Frontend by backporting fixes to stable core branches. It handles both automated backports (preferred) and manual cherry-picking (fallback). **Process Overview:** + 1. **Check automated backports first** (via labels) 2. **Skip to version bump** if backports already merged 3. **Manual cherry-picking** if automation failed -4. **Create patch release** with version bump +4. **Create patch release** with version bump 5. **Publish GitHub release** (manually uncheck "latest") 6. **Update ComfyUI requirements.txt** via PR @@ -14,7 +15,8 @@ This command creates patch/hotfix releases for ComfyUI Frontend by backporting f Create a hotfix release by backporting commits/PRs from main to a core branch: $ARGUMENTS Expected format: Comma-separated list of commits or PR numbers -Examples: +Examples: + - `#1234,#5678` (PRs - preferred) - `abc123,def456` (commit hashes) - `#1234,abc123` (mixed) @@ -25,7 +27,7 @@ If no arguments provided, the command will guide you through identifying commits ## Prerequisites - Push access to repository -- GitHub CLI (`gh`) authenticated +- GitHub CLI (`gh`) authenticated - Clean working tree - Understanding of what fixes need backporting @@ -36,11 +38,13 @@ If no arguments provided, the command will guide you through identifying commits **Check if automated backports were attempted:** 1. **For each PR, check existing backport labels:** + ```bash gh pr view #1234 --json labels | jq -r '.labels[].name' ``` 2. **If no backport labels exist, add them now:** + ```bash # Add backport labels (this triggers automated backports) gh pr edit #1234 --add-label "needs-backport" @@ -48,6 +52,7 @@ If no arguments provided, the command will guide you through identifying commits ``` 3. **Check for existing backport PRs:** + ```bash # Check for backport PRs created by automation PR_NUMBER=${ARGUMENTS%%,*} # Extract first PR number from arguments @@ -58,18 +63,22 @@ If no arguments provided, the command will guide you through identifying commits 4. **Handle existing backport scenarios:** **Scenario A: Automated backports already merged** + ```bash # Check if backport PRs were merged to core branches gh pr list --search "backport-${PR_NUMBER}-to" --state merged ``` + - If backport PRs are merged → Skip to Step 10 (Version Bump) - **CONFIRMATION**: Automated backports completed, proceeding to version bump? **Scenario B: Automated backport PRs exist but not merged** + ```bash # Show open backport PRs that need merging gh pr list --search "backport-${PR_NUMBER}-to" --state open ``` + - **ACTION REQUIRED**: Merge the existing backport PRs first - Use: `gh pr merge [PR_NUMBER] --merge` for each backport PR - After merging, return to this command and skip to Step 10 (Version Bump) @@ -127,6 +136,7 @@ If no arguments provided, the command will guide you through identifying commits ### Step 6: Cherry-pick Changes For each commit: + 1. Attempt cherry-pick: `git cherry-pick ` 2. If conflicts occur: - Display conflict details @@ -198,6 +208,7 @@ For each commit: ``` 3. **CRITICAL**: Verify "Release" label is added 4. Create standardized release notes: + ```bash cat > release-notes-${NEW_VERSION}.md << 'EOF' ## ⚠️ Breaking Changes @@ -231,12 +242,14 @@ For each commit: **Full Changelog**: https://github.com/Comfy-Org/ComfyUI_frontend/compare/v${CURRENT_VERSION}...v${NEW_VERSION} EOF ``` + - For hotfixes, typically only populate the "Bug Fixes" section - Include links to the cherry-picked PRs/commits - Update the PR body with the release notes: ```bash gh pr edit ${PR_NUMBER} --body-file release-notes-${NEW_VERSION}.md ``` + 5. **CONFIRMATION REQUIRED**: Release PR has "Release" label? ### Step 12: Monitor Release Process @@ -262,7 +275,7 @@ For each commit: 2. **Find the DRAFT release** (e.g., "v1.23.5 Draft") 3. **Click "Edit release"** 4. **UNCHECK "Set as the latest release"** ⚠️ **CRITICAL** - - This prevents the hotfix from showing as "latest" + - This prevents the hotfix from showing as "latest" - Main branch should always be "latest release" 5. **Click "Publish release"** 6. **CONFIRMATION REQUIRED**: Draft release published with "latest" unchecked? @@ -272,6 +285,7 @@ For each commit: **IMPORTANT**: Create PR to update ComfyUI's requirements.txt via fork: 1. **Setup fork (if needed):** + ```bash # Check if fork already exists if gh repo view ComfyUI --json owner | jq -r '.owner.login' | grep -q "$(gh api user --jq .login)"; then @@ -284,30 +298,32 @@ For each commit: ``` 2. **Clone fork and create branch:** + ```bash # Clone your fork (or use existing clone) GITHUB_USER=$(gh api user --jq .login) if [ ! -d "ComfyUI-fork" ]; then gh repo clone ${GITHUB_USER}/ComfyUI ComfyUI-fork fi - + cd ComfyUI-fork git checkout master git pull origin master - + # Create update branch BRANCH_NAME="update-frontend-${NEW_VERSION}" git checkout -b ${BRANCH_NAME} ``` 3. **Update requirements.txt:** + ```bash # Update the version in requirements.txt sed -i "s/comfyui-frontend-package==[0-9].*$/comfyui-frontend-package==${NEW_VERSION}/" requirements.txt - + # Verify the change grep "comfyui-frontend-package" requirements.txt - + # Commit the change git add requirements.txt git commit -m "Bump frontend to ${NEW_VERSION}" @@ -321,7 +337,8 @@ For each commit: --repo comfyanonymous/ComfyUI \ --title "Bump frontend to ${NEW_VERSION}" \ --body "$(cat < /dev/null 2>&1; then echo "✅ Development server started successfully at http://localhost:5173" - + # Kill the background server kill $SERVER_PID wait $SERVER_PID 2>/dev/null @@ -154,4 +155,4 @@ After running the setup, manually verify: - Node.js >= 24 - Git repository - Internet connection for package downloads -- Available ports (typically 5173 for dev server) \ No newline at end of file +- Available ports (typically 5173 for dev server) diff --git a/.claude/commands/verify-visually.md b/.claude/commands/verify-visually.md index 66260b159f..7258d4b114 100644 --- a/.claude/commands/verify-visually.md +++ b/.claude/commands/verify-visually.md @@ -12,10 +12,10 @@ Follow these steps systematically to verify our changes: 2. **Visual Testing Process** - Navigate to http://localhost:5173/ - For each target page (specified in arguments or recently changed files): - * Navigate to the page using direct URL or site navigation - * Take a high-quality screenshot - * Analyze the screenshot for the specific changes we implemented - * Document any visual issues or improvements needed + - Navigate to the page using direct URL or site navigation + - Take a high-quality screenshot + - Analyze the screenshot for the specific changes we implemented + - Document any visual issues or improvements needed 3. **Quality Verification** Check each page for: @@ -27,7 +27,7 @@ Follow these steps systematically to verify our changes: - Typography and readability - Color scheme consistency - Interactive elements (buttons, links, forms) - + Common issues to watch for: @@ -48,10 +48,11 @@ For each page tested, provide: 4. Overall assessment of visual quality If you find issues, be specific about: + - Exact location of the problem - Expected vs actual behavior - Severity level (critical, important, minor) - Suggested fix if obvious - + -Remember: Take your time with each screenshot and analysis. Visual quality directly impacts user experience and our project's professional appearance. \ No newline at end of file +Remember: Take your time with each screenshot and analysis. Visual quality directly impacts user experience and our project's professional appearance. diff --git a/.claude/skills/writing-playwright-tests/SKILL.md b/.claude/skills/writing-playwright-tests/SKILL.md new file mode 100644 index 0000000000..02212038f9 --- /dev/null +++ b/.claude/skills/writing-playwright-tests/SKILL.md @@ -0,0 +1,200 @@ +--- +name: writing-playwright-tests +description: 'Writes Playwright e2e tests for ComfyUI_frontend. Use when creating, modifying, or debugging browser tests. Triggers on: playwright, e2e test, browser test, spec file.' +--- + +# Writing Playwright Tests for ComfyUI_frontend + +## Golden Rules + +1. **ALWAYS look at existing tests first.** Search `browser_tests/tests/` for similar patterns before writing new tests. + +2. **ALWAYS read the fixture code.** The APIs are in `browser_tests/fixtures/` - read them directly instead of guessing. + +3. **Use premade JSON workflow assets** instead of building workflows programmatically. + - Assets live in `browser_tests/assets/` + - Load with `await comfyPage.workflow.loadWorkflow('feature/my_workflow')` + - Create new assets by starting with `browser_tests/assets/default.json` and manually editing the JSON to match your desired graph state + +## Vue Nodes vs LiteGraph: Decision Guide + +Choose based on **what you're testing**, not personal preference: + +| Testing... | Use | Why | +| ---------------------------------------------- | -------------------------------- | ---------------------------------------- | +| Vue-rendered node UI, DOM widgets, CSS states | `comfyPage.vueNodes.*` | Nodes are DOM elements, use locators | +| Canvas interactions, connections, legacy nodes | `comfyPage.nodeOps.*` | Canvas-based, use coordinates/references | +| Both in same test | Pick primary, minimize switching | Avoid confusion | + +**Vue Nodes requires explicit opt-in:** + +```typescript +await comfyPage.settings.setSetting('Comfy.VueNodes.Enabled', true) +await comfyPage.vueNodes.waitForNodes() +``` + +**Vue Node state uses CSS classes:** + +```typescript +const BYPASS_CLASS = /before:bg-bypass\/60/ +await expect(node).toHaveClass(BYPASS_CLASS) +``` + +## Common Issues + +These are frequent causes of flaky tests - check them first, but investigate if they don't apply: + +| Symptom | Common Cause | Typical Fix | +| ---------------------------------- | ------------------------- | -------------------------------------------------------------------------------------- | +| Test passes locally, fails in CI | Missing nextFrame() | Add `await comfyPage.nextFrame()` after canvas ops (not needed after `loadWorkflow()`) | +| Keyboard shortcuts don't work | Missing focus | Add `await comfyPage.canvas.click()` first | +| Double-click doesn't trigger | Timing too fast | Add `{ delay: 5 }` option | +| Elements end up in wrong position | Drag animation incomplete | Use `{ steps: 10 }` not `{ steps: 1 }` | +| Widget value wrong after drag-drop | Upload incomplete | Add `{ waitForUpload: true }` | +| Test fails when run with others | Test pollution | Add `afterEach` with `resetView()` | +| Local screenshots don't match CI | Platform differences | Screenshots are Linux-only, use PR label | + +## Test Tags + +Add appropriate tags to every test: + +| Tag | When to Use | +| ------------- | ----------------------------------------- | +| `@smoke` | Quick essential tests | +| `@slow` | Tests > 10 seconds | +| `@screenshot` | Visual regression tests | +| `@canvas` | Canvas interactions | +| `@node` | Node-related | +| `@widget` | Widget-related | +| `@mobile` | Mobile viewport (runs on Pixel 5 project) | +| `@2x` | HiDPI tests (runs on 2x scale project) | + +```typescript +test.describe('Feature', { tag: ['@screenshot', '@canvas'] }, () => { +``` + +## Retry Patterns + +**Never use `waitForTimeout`** - it's always wrong. + +| Pattern | Use Case | +| ------------------------ | ---------------------------------------------------- | +| Auto-retrying assertions | `toBeVisible()`, `toHaveText()`, etc. (prefer these) | +| `expect.poll()` | Single value polling | +| `expect().toPass()` | Multiple assertions that must all pass | + +```typescript +// Prefer auto-retrying assertions when possible +await expect(node).toBeVisible() + +// Single value polling +await expect.poll(() => widget.getValue(), { timeout: 2000 }).toBe(100) + +// Multiple conditions +await expect(async () => { + expect(await node1.getValue()).toBe('foo') + expect(await node2.getValue()).toBe('bar') +}).toPass({ timeout: 2000 }) +``` + +## Screenshot Baselines + +- **Screenshots are Linux-only.** Don't commit local screenshots. +- **To update baselines:** Add PR label `New Browser Test Expectations` +- **Mask dynamic content:** + ```typescript + await expect(comfyPage.canvas).toHaveScreenshot('page.png', { + mask: [page.locator('.timestamp')] + }) + ``` + +## CI Debugging + +1. Download artifacts from failed CI run +2. Extract and view trace: `npx playwright show-trace trace.zip` +3. CI deploys HTML report to Cloudflare Pages (link in PR comment) +4. Reproduce CI: `CI=true pnpm test:browser` +5. Local runs: `pnpm test:browser:local` + +## Anti-Patterns + +Avoid these common mistakes: + +1. **Arbitrary waits** - Use retrying assertions instead + + ```typescript + // ❌ await page.waitForTimeout(500) + // ✅ await expect(element).toBeVisible() + ``` + +2. **Implementation-tied selectors** - Use test IDs or semantic selectors + + ```typescript + // ❌ page.locator('div.container > button.btn-primary') + // ✅ page.getByTestId('submit-button') + ``` + +3. **Missing nextFrame after canvas ops** - Canvas needs sync time + + ```typescript + await node.drag({ x: 50, y: 50 }) + await comfyPage.nextFrame() // Required + ``` + +4. **Shared state between tests** - Tests must be independent + ```typescript + // ❌ let sharedData // Outside test + // ✅ Define state inside each test + ``` + +## Quick Start Template + +```typescript +// Path depends on test file location - adjust '../' segments accordingly +import { + comfyPageFixture as test, + comfyExpect as expect +} from '../fixtures/ComfyPage' + +test.describe('FeatureName', { tag: ['@canvas'] }, () => { + test.afterEach(async ({ comfyPage }) => { + await comfyPage.canvasOps.resetView() + }) + + test('should do something', async ({ comfyPage }) => { + await comfyPage.workflow.loadWorkflow('myWorkflow') + + const node = (await comfyPage.nodeOps.getNodeRefsByTitle('KSampler'))[0] + // ... test logic + + await expect(comfyPage.canvas).toHaveScreenshot('expected.png') + }) +}) +``` + +## Finding Patterns + +```bash +# Find similar tests +grep -r "KSampler" browser_tests/tests/ + +# Find usage of a fixture method +grep -r "loadWorkflow" browser_tests/tests/ + +# Find tests with specific tag +grep -r '@screenshot' browser_tests/tests/ +``` + +## Key Files to Read + +| Purpose | Path | +| ----------------- | ------------------------------------------ | +| Main fixture | `browser_tests/fixtures/ComfyPage.ts` | +| Helper classes | `browser_tests/fixtures/helpers/` | +| Component objects | `browser_tests/fixtures/components/` | +| Test selectors | `browser_tests/fixtures/selectors.ts` | +| Vue Node helpers | `browser_tests/fixtures/VueNodeHelpers.ts` | +| Test assets | `browser_tests/assets/` | +| Existing tests | `browser_tests/tests/` | + +**Read the fixture code directly** - it's the source of truth for available methods. diff --git a/.coderabbit.yaml b/.coderabbit.yaml new file mode 100644 index 0000000000..d101998e22 --- /dev/null +++ b/.coderabbit.yaml @@ -0,0 +1,7 @@ +issue_enrichment: + auto_enrich: + enabled: true +reviews: + high_level_summary: false + auto_review: + drafts: true diff --git a/.gitattributes b/.gitattributes index 39d7f722cd..c153cc3202 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,16 +1,5 @@ -# Default -* text=auto - -# Force TS to LF to make the unixy scripts not break on Windows -*.cjs text eol=lf -*.js text eol=lf -*.json text eol=lf -*.mjs text eol=lf -*.mts text eol=lf -*.snap text eol=lf -*.ts text eol=lf -*.vue text eol=lf -*.yaml text eol=lf +# Force all text files to use LF line endings +* text=auto eol=lf # Generated files packages/registry-types/src/comfyRegistryTypes.ts linguist-generated=true diff --git a/.github/AGENTS.md b/.github/AGENTS.md index 0b64ac21b9..36ee825b4d 100644 --- a/.github/AGENTS.md +++ b/.github/AGENTS.md @@ -5,6 +5,7 @@ Context for automated PR review system. ## Review Scope This automated review performs comprehensive analysis: + - Architecture and design patterns - Security vulnerabilities - Performance implications diff --git a/.github/CLAUDE.md b/.github/CLAUDE.md index 3c928db393..fc844bc41f 100644 --- a/.github/CLAUDE.md +++ b/.github/CLAUDE.md @@ -1,3 +1,4 @@ + @AGENTS.md diff --git a/.github/ISSUE_TEMPLATE/bug-report.yaml b/.github/ISSUE_TEMPLATE/bug-report.yaml index 2ed7cf2064..bde3829f75 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.yaml +++ b/.github/ISSUE_TEMPLATE/bug-report.yaml @@ -10,10 +10,7 @@ body: options: - label: I am running the latest version of ComfyUI required: true - - label: I have searched existing issues to make sure this isn't a duplicate - required: true - - label: I have tested with all custom nodes disabled ([see how](https://docs.comfy.org/troubleshooting/custom-node-issues#step-1%3A-test-with-all-custom-nodes-disabled)) - required: true + - label: I have custom nodes enabled - type: textarea id: description @@ -60,7 +57,7 @@ body: attributes: label: ComfyUI Frontend Version description: Found in Settings > About (e.g., "1.3.45") - placeholder: "1.3.45" + placeholder: '1.3.45' validations: required: true diff --git a/.github/ISSUE_TEMPLATE/feature-request.yaml b/.github/ISSUE_TEMPLATE/feature-request.yaml index 0d8173b285..2d26a09812 100644 --- a/.github/ISSUE_TEMPLATE/feature-request.yaml +++ b/.github/ISSUE_TEMPLATE/feature-request.yaml @@ -4,13 +4,6 @@ labels: [] type: Feature body: - - type: checkboxes - attributes: - label: Is there an existing issue for this? - description: Please search to see if an issue already exists for the problem you're experiencing, and that it's not addressed in a recent build/commit. - options: - - label: I have searched the existing issues and checked the recent builds/commits - required: true - type: markdown attributes: value: | diff --git a/.github/actions/comment-release-links/action.yaml b/.github/actions/comment-release-links/action.yaml index a198604e9d..3fc7046166 100644 --- a/.github/actions/comment-release-links/action.yaml +++ b/.github/actions/comment-release-links/action.yaml @@ -104,14 +104,14 @@ runs: - name: Find existing comment id: find - uses: peter-evans/find-comment@b30e6a3c0ed37e7c023ccd3f1db5c6c0b0c23aad + uses: peter-evans/find-comment@b30e6a3c0ed37e7c023ccd3f1db5c6c0b0c23aad # v4.0.0 with: issue-number: ${{ inputs.issue-number || github.event.pull_request.number }} comment-author: github-actions[bot] body-includes: ${{ steps.build.outputs.marker_search }} - name: Post or update comment - uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5.0.0 with: issue-number: ${{ inputs.issue-number || github.event.pull_request.number }} comment-id: ${{ steps.find.outputs.comment-id }} diff --git a/.github/actions/setup-comfyui-server/action.yml b/.github/actions/setup-comfyui-server/action.yaml similarity index 96% rename from .github/actions/setup-comfyui-server/action.yml rename to .github/actions/setup-comfyui-server/action.yaml index d1aa1bd578..721b47e34a 100644 --- a/.github/actions/setup-comfyui-server/action.yml +++ b/.github/actions/setup-comfyui-server/action.yaml @@ -16,7 +16,7 @@ runs: # Checkout ComfyUI repo, install the dev_tools node and start server - name: Checkout ComfyUI - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: repository: 'comfyanonymous/ComfyUI' path: 'ComfyUI' @@ -33,7 +33,7 @@ runs: fi - name: Setup Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v6 with: python-version: '3.10' diff --git a/.github/actions/setup-frontend/action.yml b/.github/actions/setup-frontend/action.yaml similarity index 61% rename from .github/actions/setup-frontend/action.yml rename to .github/actions/setup-frontend/action.yaml index 6787552ea7..c4d5d4eedf 100644 --- a/.github/actions/setup-frontend/action.yml +++ b/.github/actions/setup-frontend/action.yaml @@ -12,29 +12,17 @@ runs: # Install pnpm, Node.js, build frontend - name: Install pnpm - uses: pnpm/action-setup@v4 + uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 with: version: 10 - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: 'lts/*' cache: 'pnpm' cache-dependency-path: './pnpm-lock.yaml' - # Restore tool caches before running any build/lint operations - - name: Restore tool output cache - uses: actions/cache/restore@v4 - with: - path: | - ./.cache - ./tsconfig.tsbuildinfo - key: tool-cache-${{ runner.os }}-${{ hashFiles('./pnpm-lock.yaml') }}-${{ hashFiles('./src/**/*.{ts,vue,js,mts}', './*.config.*') }} - restore-keys: | - tool-cache-${{ runner.os }}-${{ hashFiles('./pnpm-lock.yaml') }}- - tool-cache-${{ runner.os }}- - - name: Install dependencies shell: bash run: pnpm install --frozen-lockfile diff --git a/.github/actions/setup-playwright/action.yml b/.github/actions/setup-playwright/action.yaml similarity index 96% rename from .github/actions/setup-playwright/action.yml rename to .github/actions/setup-playwright/action.yaml index 89629fb2c4..63e0c03621 100644 --- a/.github/actions/setup-playwright/action.yml +++ b/.github/actions/setup-playwright/action.yaml @@ -11,7 +11,7 @@ runs: echo "playwright-version=$PLAYWRIGHT_VERSION" >> $GITHUB_OUTPUT - name: Cache Playwright Browsers - uses: actions/cache@v4 + uses: actions/cache@v5 # v5.0.2 id: cache-playwright-browsers with: path: '~/.cache/ms-playwright' diff --git a/.github/actions/start-comfyui-server/action.yml b/.github/actions/start-comfyui-server/action.yaml similarity index 100% rename from .github/actions/start-comfyui-server/action.yml rename to .github/actions/start-comfyui-server/action.yaml diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 551b037212..14874c099b 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -34,4 +34,4 @@ Follow Vue 3 style guide and naming conventions Use Vite for fast development and building -Use vue-i18n in composition API for any string literals. Place new translation entries in src/locales/en/main.json. \ No newline at end of file +Use vue-i18n in composition API for any string literals. Place new translation entries in src/locales/en/main.json. diff --git a/.github/workflows/api-update-electron-api-types.yaml b/.github/workflows/api-update-electron-api-types.yaml index b7c5bce710..fb9398a1b1 100644 --- a/.github/workflows/api-update-electron-api-types.yaml +++ b/.github/workflows/api-update-electron-api-types.yaml @@ -13,15 +13,15 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Install pnpm - uses: pnpm/action-setup@v4 + uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 with: version: 10 - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: lts/* cache: 'pnpm' @@ -36,7 +36,7 @@ jobs: echo "NEW_VERSION=$NEW_VERSION" >> $GITHUB_OUTPUT - name: Create Pull Request - uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e + uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v8.1.0 with: token: ${{ secrets.PR_GH_TOKEN }} commit-message: '[chore] Update electron-types to ${{ steps.get-version.outputs.NEW_VERSION }}' diff --git a/.github/workflows/api-update-manager-api-types.yaml b/.github/workflows/api-update-manager-api-types.yaml index a709baecf4..82b39978f4 100644 --- a/.github/workflows/api-update-manager-api-types.yaml +++ b/.github/workflows/api-update-manager-api-types.yaml @@ -18,15 +18,15 @@ jobs: pull-requests: write steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Install pnpm - uses: pnpm/action-setup@v4 + uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 with: version: 10 - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: lts/* cache: 'pnpm' @@ -35,7 +35,7 @@ jobs: run: pnpm install --frozen-lockfile - name: Checkout ComfyUI-Manager repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: repository: Comfy-Org/ComfyUI-Manager path: ComfyUI-Manager @@ -86,7 +86,7 @@ jobs: - name: Create Pull Request if: steps.check-changes.outputs.changed == 'true' - uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e + uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v8.1.0 with: token: ${{ secrets.PR_GH_TOKEN }} commit-message: '[chore] Update ComfyUI-Manager API types from ComfyUI-Manager@${{ steps.manager-info.outputs.commit }}' diff --git a/.github/workflows/api-update-registry-api-types.yaml b/.github/workflows/api-update-registry-api-types.yaml index 5ae701dc22..41521cf944 100644 --- a/.github/workflows/api-update-registry-api-types.yaml +++ b/.github/workflows/api-update-registry-api-types.yaml @@ -17,15 +17,15 @@ jobs: pull-requests: write steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Install pnpm - uses: pnpm/action-setup@v4 + uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 with: version: 10 - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: lts/* cache: 'pnpm' @@ -34,7 +34,7 @@ jobs: run: pnpm install --frozen-lockfile - name: Checkout comfy-api repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: repository: Comfy-Org/comfy-api path: comfy-api @@ -87,7 +87,7 @@ jobs: - name: Create Pull Request if: steps.check-changes.outputs.changed == 'true' - uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e + uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v8.1.0 with: token: ${{ secrets.PR_GH_TOKEN }} commit-message: '[chore] Update Comfy Registry API types from comfy-api@${{ steps.api-info.outputs.commit }}' diff --git a/.github/workflows/ci-dist-telemetry-scan.yaml b/.github/workflows/ci-dist-telemetry-scan.yaml new file mode 100644 index 0000000000..cc4f1a2082 --- /dev/null +++ b/.github/workflows/ci-dist-telemetry-scan.yaml @@ -0,0 +1,52 @@ +name: 'CI: Dist Telemetry Scan' + +on: + pull_request: + branches-ignore: [wip/*, draft/*, temp/*] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + scan: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + + - name: Install pnpm + uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 + with: + version: 10 + + - name: Use Node.js + uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 + with: + node-version: 'lts/*' + cache: 'pnpm' + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Build project + run: pnpm build + + - name: Scan dist for telemetry references + run: | + set -euo pipefail + if rg --no-ignore -n \ + -g '*.html' \ + -g '*.js' \ + -e 'Google Tag Manager' \ + -e '(?i)\bgtm\.js\b' \ + -e '(?i)googletagmanager\.com/gtm\.js\\?id=' \ + -e '(?i)googletagmanager\.com/ns\.html\\?id=' \ + dist; then + echo 'Telemetry references found in dist assets.' + exit 1 + fi + echo 'No telemetry references found in dist assets.' diff --git a/.github/workflows/ci-json-validation.yaml b/.github/workflows/ci-json-validation.yaml index 8c55705e71..20a2743d19 100644 --- a/.github/workflows/ci-json-validation.yaml +++ b/.github/workflows/ci-json-validation.yaml @@ -1,5 +1,5 @@ # Description: Validates JSON syntax in all tracked .json files (excluding tsconfig*.json) using jq -name: "CI: JSON Validation" +name: 'CI: JSON Validation' on: push: @@ -13,6 +13,6 @@ jobs: json-lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Validate JSON syntax run: ./scripts/cicd/check-json.sh diff --git a/.github/workflows/ci-lint-format.yaml b/.github/workflows/ci-lint-format.yaml index c97f6255ca..df3f30c38c 100644 --- a/.github/workflows/ci-lint-format.yaml +++ b/.github/workflows/ci-lint-format.yaml @@ -1,5 +1,5 @@ # Description: Linting and code formatting validation for pull requests -name: "CI: Lint Format" +name: 'CI: Lint Format' on: pull_request: @@ -18,23 +18,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout PR - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: ref: ${{ !github.event.pull_request.head.repo.fork && github.head_ref || github.ref }} + token: ${{ secrets.PR_GH_TOKEN }} - - name: Install pnpm - uses: pnpm/action-setup@v4 - with: - version: 10 - - - name: Use Node.js - uses: actions/setup-node@v4 - with: - node-version: 'lts/*' - cache: 'pnpm' - - - name: Install dependencies - run: pnpm install --frozen-lockfile + - name: Setup frontend + uses: ./.github/actions/setup-frontend - name: Run ESLint with auto-fix run: pnpm lint:fix @@ -73,7 +63,7 @@ jobs: - name: Comment on PR about auto-fix if: steps.verify-changed-files.outputs.changed == 'true' && github.event.pull_request.head.repo.full_name == github.repository continue-on-error: true - uses: actions/github-script@v7 + uses: actions/github-script@v8 with: script: | github.rest.issues.createComment({ @@ -86,7 +76,7 @@ jobs: - name: Comment on PR about manual fix needed if: steps.verify-changed-files.outputs.changed == 'true' && github.event.pull_request.head.repo.full_name != github.repository continue-on-error: true - uses: actions/github-script@v7 + uses: actions/github-script@v8 with: script: | github.rest.issues.createComment({ diff --git a/.github/workflows/ci-python-validation.yaml b/.github/workflows/ci-python-validation.yaml index 1625ca29fc..cf392f1bf3 100644 --- a/.github/workflows/ci-python-validation.yaml +++ b/.github/workflows/ci-python-validation.yaml @@ -1,5 +1,5 @@ # Description: Validates Python code in tools/devtools directory -name: "CI: Python Validation" +name: 'CI: Python Validation' on: pull_request: @@ -16,10 +16,10 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Set up Python - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: '3.11' diff --git a/.github/workflows/ci-shell-validation.yaml b/.github/workflows/ci-shell-validation.yaml index 783d1b03cc..72ac4be230 100644 --- a/.github/workflows/ci-shell-validation.yaml +++ b/.github/workflows/ci-shell-validation.yaml @@ -1,5 +1,5 @@ # Description: Runs shellcheck on tracked shell scripts when they change -name: "CI: Shell Validation" +name: 'CI: Shell Validation' on: push: diff --git a/.github/workflows/ci-size-data.yaml b/.github/workflows/ci-size-data.yaml index a21c93110f..f56c0d17d4 100644 --- a/.github/workflows/ci-size-data.yaml +++ b/.github/workflows/ci-size-data.yaml @@ -1,4 +1,4 @@ -name: "CI: Size Data" +name: 'CI: Size Data' on: push: @@ -17,21 +17,10 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - - name: Install pnpm - uses: pnpm/action-setup@v4.1.0 - with: - version: 10 - - - name: Install Node.js - uses: actions/setup-node@v5 - with: - node-version: '24.x' - cache: pnpm - - - name: Install dependencies - run: pnpm install + - name: Setup frontend + uses: ./.github/actions/setup-frontend - name: Build project run: pnpm build @@ -46,7 +35,7 @@ jobs: echo ${{ github.base_ref }} > ./temp/size/base.txt - name: Upload size data - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: size-data path: temp/size diff --git a/.github/workflows/ci-tests-e2e-forks.yaml b/.github/workflows/ci-tests-e2e-forks.yaml index 8f039f1c4c..3aaeccb307 100644 --- a/.github/workflows/ci-tests-e2e-forks.yaml +++ b/.github/workflows/ci-tests-e2e-forks.yaml @@ -31,11 +31,11 @@ jobs: echo "Is forked: ${{ github.event.workflow_run.head_repository.full_name != github.event.workflow_run.repository.full_name }}" - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Get PR Number id: pr - uses: actions/github-script@v7 + uses: actions/github-script@v8 with: script: | const { data: prs } = await github.rest.pulls.list({ @@ -68,7 +68,7 @@ jobs: - name: Download and Deploy Reports if: steps.pr.outputs.result != 'null' && github.event.action == 'completed' - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v7 with: github-token: ${{ secrets.GITHUB_TOKEN }} run-id: ${{ github.event.workflow_run.id }} diff --git a/.github/workflows/ci-tests-e2e.yaml b/.github/workflows/ci-tests-e2e.yaml index c1e0af411e..34d24f7f04 100644 --- a/.github/workflows/ci-tests-e2e.yaml +++ b/.github/workflows/ci-tests-e2e.yaml @@ -5,8 +5,8 @@ on: push: branches: [main, master, core/*, desktop/*] pull_request: - branches-ignore: - [wip/*, draft/*, temp/*, vue-nodes-migration, sno-playwright-*] + branches-ignore: [wip/*, draft/*, temp/*] + workflow_dispatch: concurrency: group: ${{ github.workflow }}-${{ github.ref }} @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Setup frontend uses: ./.github/actions/setup-frontend with: @@ -25,7 +25,7 @@ jobs: # Upload only built dist/ (containerized test jobs will pnpm install without cache) - name: Upload built frontend - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: frontend-dist path: dist/ @@ -37,7 +37,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 60 container: - image: ghcr.io/comfy-org/comfyui-ci-container:0.0.10 + image: ghcr.io/comfy-org/comfyui-ci-container:0.0.12 credentials: username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} @@ -51,9 +51,9 @@ jobs: shardTotal: [8] steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Download built frontend - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v7 with: name: frontend-dist path: dist/ @@ -72,7 +72,7 @@ jobs: PLAYWRIGHT_BLOB_OUTPUT_DIR: ./blob-report - name: Upload blob report - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 if: ${{ !cancelled() }} with: name: blob-report-chromium-${{ matrix.shardIndex }} @@ -85,7 +85,7 @@ jobs: needs: setup runs-on: ubuntu-latest container: - image: ghcr.io/comfy-org/comfyui-ci-container:0.0.10 + image: ghcr.io/comfy-org/comfyui-ci-container:0.0.12 credentials: username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} @@ -98,9 +98,9 @@ jobs: browser: [chromium-2x, chromium-0.5x, mobile-chrome] steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Download built frontend - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v7 with: name: frontend-dist path: dist/ @@ -128,7 +128,7 @@ jobs: pnpm exec playwright merge-reports --reporter=json ./blob-report - name: Upload Playwright report - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 if: always() with: name: playwright-report-${{ matrix.browser }} @@ -141,16 +141,13 @@ jobs: runs-on: ubuntu-latest if: ${{ !cancelled() }} steps: - - name: Checkout repository - uses: actions/checkout@v5 - - name: Install pnpm - uses: pnpm/action-setup@v4 + uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 with: version: 10 - name: Download blob reports - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v7 with: path: ./all-blob-reports pattern: blob-report-chromium-* @@ -165,7 +162,7 @@ jobs: pnpm dlx @playwright/test merge-reports --reporter=json ./all-blob-reports - name: Upload HTML report - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: playwright-report-chromium path: ./playwright-report/ @@ -183,7 +180,7 @@ jobs: pull-requests: write steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Get start time id: start-time @@ -210,10 +207,10 @@ jobs: contents: read steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Download all playwright reports - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v7 with: pattern: playwright-report-* path: reports diff --git a/.github/workflows/ci-tests-storybook-forks.yaml b/.github/workflows/ci-tests-storybook-forks.yaml index e93b5bb904..d4f18d37b0 100644 --- a/.github/workflows/ci-tests-storybook-forks.yaml +++ b/.github/workflows/ci-tests-storybook-forks.yaml @@ -1,9 +1,9 @@ # Description: Deploys Storybook previews from forked PRs (forks can't access deployment secrets) -name: "CI: Tests Storybook (Deploy for Forks)" +name: 'CI: Tests Storybook (Deploy for Forks)' on: workflow_run: - workflows: ["CI: Tests Storybook"] + workflows: ['CI: Tests Storybook'] types: [requested, completed] env: @@ -31,11 +31,11 @@ jobs: echo "Is forked: ${{ github.event.workflow_run.head_repository.full_name != github.event.workflow_run.repository.full_name }}" - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Get PR Number id: pr - uses: actions/github-script@v7 + uses: actions/github-script@v8 with: script: | const { data: prs } = await github.rest.pulls.list({ @@ -68,7 +68,7 @@ jobs: - name: Download and Deploy Storybook if: steps.pr.outputs.result != 'null' && github.event.action == 'completed' && github.event.workflow_run.conclusion == 'success' - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v7 with: github-token: ${{ secrets.GITHUB_TOKEN }} run-id: ${{ github.event.workflow_run.id }} diff --git a/.github/workflows/ci-tests-storybook.yaml b/.github/workflows/ci-tests-storybook.yaml index 8158787a24..7a91e7a014 100644 --- a/.github/workflows/ci-tests-storybook.yaml +++ b/.github/workflows/ci-tests-storybook.yaml @@ -1,8 +1,8 @@ # Description: Builds Storybook and runs visual regression testing via Chromatic, deploys previews to Cloudflare Pages -name: "CI: Tests Storybook" +name: 'CI: Tests Storybook' on: - workflow_dispatch: # Allow manual triggering + workflow_dispatch: # Allow manual triggering pull_request: jobs: @@ -14,7 +14,7 @@ jobs: pull-requests: write steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Post starting comment env: @@ -36,21 +36,10 @@ jobs: workflow-url: ${{ steps.workflow-url.outputs.url }} steps: - name: Checkout code - uses: actions/checkout@v5 + uses: actions/checkout@v6 - - name: Install pnpm - uses: pnpm/action-setup@v4 - with: - version: 10 - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: '20' - cache: 'pnpm' - - - name: Install dependencies - run: pnpm install --frozen-lockfile + - name: Setup frontend + uses: ./.github/actions/setup-frontend - name: Build Storybook run: pnpm build-storybook @@ -69,7 +58,7 @@ jobs: - name: Upload Storybook build if: success() && github.event.pull_request.head.repo.fork == false - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: storybook-static path: storybook-static/ @@ -86,33 +75,22 @@ jobs: chromatic-storybook-url: ${{ steps.chromatic.outputs.storybookUrl }} steps: - name: Checkout code - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: - fetch-depth: 0 # Required for Chromatic baseline + fetch-depth: 0 # Required for Chromatic baseline - - name: Install pnpm - uses: pnpm/action-setup@v4 - with: - version: 10 - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: '20' - cache: 'pnpm' - - - name: Install dependencies - run: pnpm install --frozen-lockfile + - name: Setup frontend + uses: ./.github/actions/setup-frontend - name: Build Storybook and run Chromatic id: chromatic - uses: chromaui/action@latest + uses: chromaui/action@07791f8243f4cb2698bf4d00426baf4b2d1cb7e0 # v13.3.5 with: projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }} buildScriptName: build-storybook - autoAcceptChanges: 'main' # Auto-accept changes on main branch - exitOnceUploaded: true # Don't wait for UI tests to complete - onlyChanged: true # Only capture changed stories + autoAcceptChanges: 'main' # Auto-accept changes on main branch + exitOnceUploaded: true # Don't wait for UI tests to complete + onlyChanged: true # Only capture changed stories - name: Set job status id: job-status @@ -136,11 +114,11 @@ jobs: contents: read steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Download Storybook build if: needs.storybook-build.outputs.conclusion == 'success' - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v7 with: name: storybook-static path: storybook-static @@ -170,7 +148,7 @@ jobs: pull-requests: write steps: - name: Update comment with Chromatic URLs - uses: actions/github-script@v7 + uses: actions/github-script@v8 with: script: | const buildUrl = '${{ needs.chromatic-deployment.outputs.chromatic-build-url }}'; diff --git a/.github/workflows/ci-tests-unit.yaml b/.github/workflows/ci-tests-unit.yaml index 8a97a9128a..e1ba5b5d98 100644 --- a/.github/workflows/ci-tests-unit.yaml +++ b/.github/workflows/ci-tests-unit.yaml @@ -1,5 +1,5 @@ # Description: Unit and component testing with Vitest -name: "CI: Tests Unit" +name: 'CI: Tests Unit' on: push: @@ -16,21 +16,10 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - - name: Install pnpm - uses: pnpm/action-setup@v4 - with: - version: 10 - - - name: Use Node.js - uses: actions/setup-node@v4 - with: - node-version: "lts/*" - cache: "pnpm" - - - name: Install dependencies - run: pnpm install --frozen-lockfile + - name: Setup frontend + uses: ./.github/actions/setup-frontend - name: Run Vitest tests run: pnpm test:unit diff --git a/.github/workflows/ci-validate-action-pins.yaml b/.github/workflows/ci-validate-action-pins.yaml new file mode 100644 index 0000000000..3cd66cd7ea --- /dev/null +++ b/.github/workflows/ci-validate-action-pins.yaml @@ -0,0 +1,21 @@ +name: Validate Action SHA Pins + +on: + pull_request: + paths: + - '.github/workflows/**' + - '.github/actions/**' + - '.pinact.yaml' + +permissions: + contents: read + +jobs: + validate-pins: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + + - uses: suzuki-shunsuke/pinact-action@3d49c6412901042473ffa78becddab1aea46bbea # v1.3.1 + with: + skip_push: 'true' diff --git a/.github/workflows/ci-yaml-validation.yaml b/.github/workflows/ci-yaml-validation.yaml index cf2a3b6485..876fcfc4c0 100644 --- a/.github/workflows/ci-yaml-validation.yaml +++ b/.github/workflows/ci-yaml-validation.yaml @@ -1,5 +1,5 @@ # Description: Validates YAML syntax and style using yamllint with relaxed rules -name: "CI: YAML Validation" +name: 'CI: YAML Validation' on: push: @@ -17,10 +17,10 @@ jobs: yaml-lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Set up Python - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: '3.x' diff --git a/.github/workflows/cloud-backport-tag.yaml b/.github/workflows/cloud-backport-tag.yaml index c0edec170e..73b01c682b 100644 --- a/.github/workflows/cloud-backport-tag.yaml +++ b/.github/workflows/cloud-backport-tag.yaml @@ -18,12 +18,12 @@ jobs: steps: - name: Checkout merge commit - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: ref: ${{ github.event.pull_request.merge_commit_sha }} - name: Setup Node.js - uses: actions/setup-node@v5 + uses: actions/setup-node@v6 with: node-version-file: '.nvmrc' diff --git a/.github/workflows/i18n-update-core.yaml b/.github/workflows/i18n-update-core.yaml index a4e73f5382..5f0985b93f 100644 --- a/.github/workflows/i18n-update-core.yaml +++ b/.github/workflows/i18n-update-core.yaml @@ -1,5 +1,5 @@ # Description: Generates and updates translations for core ComfyUI components using OpenAI -name: "i18n: Update Core" +name: 'i18n: Update Core' on: # Manual dispatch for urgent translation updates @@ -16,7 +16,9 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 + with: + token: ${{ secrets.PR_GH_TOKEN }} # Setup playwright environment - name: Setup ComfyUI Frontend @@ -41,7 +43,7 @@ jobs: env: PLAYWRIGHT_TEST_URL: http://localhost:5173 - name: Update translations - run: pnpm locale + run: pnpm locale && pnpm format env: OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} - name: Commit updated locales diff --git a/.github/workflows/i18n-update-custom-nodes.yaml b/.github/workflows/i18n-update-custom-nodes.yaml index 5844065ad4..225c1b3e36 100644 --- a/.github/workflows/i18n-update-custom-nodes.yaml +++ b/.github/workflows/i18n-update-custom-nodes.yaml @@ -22,7 +22,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 # Setup playwright environment with custom node repository - name: Setup ComfyUI Server (without launching) @@ -36,7 +36,7 @@ jobs: # Install the custom node repository - name: Checkout custom node repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: repository: ${{ inputs.owner }}/${{ inputs.repository }} path: 'ComfyUI/custom_nodes/${{ inputs.repository }}' @@ -113,7 +113,7 @@ jobs: git commit -m "Update locales" - name: Install SSH key For PUSH - uses: shimataro/ssh-key-action@d4fffb50872869abe2d9a9098a6d9c5aa7d16be4 + uses: shimataro/ssh-key-action@d4fffb50872869abe2d9a9098a6d9c5aa7d16be4 # v2.7.0 with: # PR private key from action server key: ${{ secrets.PR_SSH_PRIVATE_KEY }} diff --git a/.github/workflows/i18n-update-nodes.yaml b/.github/workflows/i18n-update-nodes.yaml index 46db1661e2..5a72e5b109 100644 --- a/.github/workflows/i18n-update-nodes.yaml +++ b/.github/workflows/i18n-update-nodes.yaml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 # Setup playwright environment - name: Setup ComfyUI Server (and start) uses: ./.github/actions/setup-comfyui-server @@ -40,11 +40,11 @@ jobs: env: OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} - name: Create Pull Request - uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e + uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v8.1.0 with: token: ${{ secrets.PR_GH_TOKEN }} - commit-message: "Update locales for node definitions" - title: "Update locales for node definitions" + commit-message: 'Update locales for node definitions' + title: 'Update locales for node definitions' body: | Automated PR to update locales for node definitions diff --git a/.github/workflows/pr-backport.yaml b/.github/workflows/pr-backport.yaml index c38a8081e7..a6b15db5f0 100644 --- a/.github/workflows/pr-backport.yaml +++ b/.github/workflows/pr-backport.yaml @@ -64,7 +64,7 @@ jobs: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: fetch-depth: 0 @@ -462,7 +462,6 @@ jobs: fi done < "$FILE" - - name: Remove needs-backport label if: steps.filter-targets.outputs.skip != 'true' && success() run: gh pr edit ${{ github.event_name == 'workflow_dispatch' && inputs.pr_number || github.event.pull_request.number }} --remove-label "needs-backport" diff --git a/.github/workflows/pr-claude-review.yaml b/.github/workflows/pr-claude-review.yaml index ec4159c1c8..b1f3d1a7f6 100644 --- a/.github/workflows/pr-claude-review.yaml +++ b/.github/workflows/pr-claude-review.yaml @@ -1,5 +1,5 @@ # Description: AI-powered code review triggered by adding the 'claude-review' label to a PR -name: "PR: Claude Review" +name: 'PR: Claude Review' permissions: contents: read @@ -23,18 +23,18 @@ jobs: timeout-minutes: 30 steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: fetch-depth: 0 ref: refs/pull/${{ github.event.pull_request.number }}/head - name: Install pnpm - uses: pnpm/action-setup@v4 + uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 with: version: 10 - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: '20' cache: 'pnpm' @@ -44,9 +44,9 @@ jobs: pnpm install -g typescript @vue/compiler-sfc - name: Run Claude PR Review - uses: anthropics/claude-code-action@v1.0.6 + uses: anthropics/claude-code-action@ff34ce0ff04a470bd3fa56c1ef391c8f1c19f8e9 # v1.0.38 with: - label_trigger: "claude-review" + label_trigger: 'claude-review' prompt: | Read the file .claude/commands/comprehensive-pr-review.md and follow ALL the instructions exactly. diff --git a/.github/workflows/pr-size-report.yaml b/.github/workflows/pr-size-report.yaml index 968888aa91..769ce0e1a7 100644 --- a/.github/workflows/pr-size-report.yaml +++ b/.github/workflows/pr-size-report.yaml @@ -1,4 +1,4 @@ -name: "PR: Size Report" +name: 'PR: Size Report' on: workflow_run: @@ -33,24 +33,13 @@ jobs: github.event_name == 'workflow_dispatch' ) steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - - name: Install pnpm - uses: pnpm/action-setup@v4.1.0 - with: - version: 10 - - - name: Install Node.js - uses: actions/setup-node@v5 - with: - node-version: '24.x' - cache: pnpm - - - name: Install dependencies - run: pnpm install + - name: Setup frontend + uses: ./.github/actions/setup-frontend - name: Download size data - uses: dawidd6/action-download-artifact@v11 + uses: dawidd6/action-download-artifact@0bd50d53a6d7fb5cb921e607957e9cc12b4ce392 # v12 with: name: size-data run_id: ${{ github.event_name == 'workflow_dispatch' && inputs.run_id || github.event.workflow_run.id }} @@ -75,7 +64,7 @@ jobs: fi - name: Download previous size data - uses: dawidd6/action-download-artifact@v11 + uses: dawidd6/action-download-artifact@0bd50d53a6d7fb5cb921e607957e9cc12b4ce392 # v12 with: branch: ${{ steps.pr-base.outputs.content }} workflow: ci-size-data.yaml @@ -89,12 +78,12 @@ jobs: - name: Read size report id: size-report - uses: juliangruber/read-file-action@v1 + uses: juliangruber/read-file-action@b549046febe0fe86f8cb4f93c24e284433f9ab58 # v1.1.7 with: path: ./size-report.md - name: Create or update PR comment - uses: actions-cool/maintain-one-comment@v3 + uses: actions-cool/maintain-one-comment@4b2dbf086015f892dcb5e8c1106f5fccd6c1476b # v3.2.0 with: token: ${{ secrets.GITHUB_TOKEN }} number: ${{ steps.pr-number.outputs.content }} diff --git a/.github/workflows/pr-update-playwright-expectations.yaml b/.github/workflows/pr-update-playwright-expectations.yaml index 0ca6967217..14fd5e2f89 100644 --- a/.github/workflows/pr-update-playwright-expectations.yaml +++ b/.github/workflows/pr-update-playwright-expectations.yaml @@ -1,5 +1,5 @@ # Setting test expectation screenshots for Playwright -name: "PR: Update Playwright Expectations" +name: 'PR: Update Playwright Expectations' on: pull_request: @@ -38,15 +38,15 @@ jobs: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Find Update Comment - uses: peter-evans/find-comment@b30e6a3c0ed37e7c023ccd3f1db5c6c0b0c23aad - id: "find-update-comment" + uses: peter-evans/find-comment@b30e6a3c0ed37e7c023ccd3f1db5c6c0b0c23aad # v4.0.0 + id: 'find-update-comment' with: issue-number: ${{ steps.pr-info.outputs.pr-number }} - comment-author: "github-actions[bot]" - body-includes: "Updating Playwright Expectations" + comment-author: 'github-actions[bot]' + body-includes: 'Updating Playwright Expectations' - name: Add Starting Reaction - uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5.0.0 with: comment-id: ${{ steps.find-update-comment.outputs.comment-id }} issue-number: ${{ steps.pr-info.outputs.pr-number }} @@ -56,7 +56,7 @@ jobs: reactions: eyes - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: ref: ${{ steps.pr-info.outputs.branch }} - name: Setup frontend @@ -66,7 +66,7 @@ jobs: # Upload built dist/ (containerized test jobs will pnpm install without cache) - name: Upload built frontend - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: frontend-dist path: dist/ @@ -77,7 +77,7 @@ jobs: needs: setup runs-on: ubuntu-latest container: - image: ghcr.io/comfy-org/comfyui-ci-container:0.0.10 + image: ghcr.io/comfy-org/comfyui-ci-container:0.0.12 credentials: username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} @@ -91,11 +91,11 @@ jobs: shardTotal: [4] steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: ref: ${{ needs.setup.outputs.branch }} - name: Download built frontend - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v7 with: name: frontend-dist path: dist/ @@ -109,7 +109,7 @@ jobs: # Run sharded tests with snapshot updates (browsers pre-installed in container) - name: Update snapshots (Shard ${{ matrix.shardIndex }}/${{ matrix.shardTotal }}) id: playwright-tests - run: pnpm exec playwright test --update-snapshots --shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }} + run: pnpm exec playwright test --update-snapshots --grep @screenshot --shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }} continue-on-error: true - name: Stage changed snapshot files @@ -149,7 +149,7 @@ jobs: # Upload ONLY the changed files from this shard - name: Upload changed snapshots - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 if: steps.changed-snapshots.outputs.has-changes == 'true' with: name: snapshots-shard-${{ matrix.shardIndex }} @@ -157,7 +157,7 @@ jobs: retention-days: 1 - name: Upload test report - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 if: always() with: name: playwright-report-shard-${{ matrix.shardIndex }} @@ -170,17 +170,18 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: ref: ${{ needs.setup.outputs.branch }} + token: ${{ secrets.PR_GH_TOKEN }} # Download all changed snapshot files from shards - name: Download snapshot artifacts - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v7 with: pattern: snapshots-shard-* path: ./downloaded-snapshots - merge-multiple: false + merge-multiple: true - name: List downloaded files run: | @@ -206,13 +207,13 @@ jobs: echo "MERGING CHANGED SNAPSHOTS" echo "==========================================" - # Check if any artifacts were downloaded + # Check if any artifacts were downloaded (merge-multiple puts files directly in path) if [ ! -d "./downloaded-snapshots" ]; then echo "No snapshot artifacts to merge" echo "==========================================" echo "MERGE COMPLETE" echo "==========================================" - echo "Shards merged: 0" + echo "Files merged: 0" exit 0 fi @@ -222,37 +223,29 @@ jobs: exit 1 fi - merged_count=0 + # Count files to merge + file_count=$(find ./downloaded-snapshots -type f | wc -l) - # For each shard's changed files, copy them directly - for shard_dir in ./downloaded-snapshots/snapshots-shard-*/; do - if [ ! -d "$shard_dir" ]; then - continue - fi + if [ "$file_count" -eq 0 ]; then + echo "No snapshot files found in downloaded artifacts" + echo "==========================================" + echo "MERGE COMPLETE" + echo "==========================================" + echo "Files merged: 0" + exit 0 + fi - shard_name=$(basename "$shard_dir") - file_count=$(find "$shard_dir" -type f | wc -l) + echo "Merging $file_count snapshot file(s)..." - if [ "$file_count" -eq 0 ]; then - echo " $shard_name: no files" - continue - fi - - echo "Processing $shard_name ($file_count file(s))..." - - # Copy files directly, preserving directory structure - # Since files are already in correct structure (no browser_tests/ prefix), just copy them all - cp -v -r "$shard_dir"* browser_tests/ 2>&1 | sed 's/^/ /' - - merged_count=$((merged_count + 1)) - echo " ✓ Merged" - echo "" - done + # Copy all files directly, preserving directory structure + # With merge-multiple: true, files are directly in ./downloaded-snapshots/ without shard subdirs + cp -v -r ./downloaded-snapshots/* browser_tests/ 2>&1 | sed 's/^/ /' + echo "" echo "==========================================" echo "MERGE COMPLETE" echo "==========================================" - echo "Shards merged: $merged_count" + echo "Files merged: $file_count" - name: Show changes run: | @@ -301,7 +294,7 @@ jobs: echo "✓ Commit and push successful" - name: Add Done Reaction - uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5.0.0 if: github.event_name == 'issue_comment' && steps.commit.outputs.has-changes == 'true' with: comment-id: ${{ needs.setup.outputs.comment-id }} diff --git a/.github/workflows/publish-desktop-ui-on-merge.yaml b/.github/workflows/publish-desktop-ui-on-merge.yaml index 253f73cabb..5036bc97b2 100644 --- a/.github/workflows/publish-desktop-ui-on-merge.yaml +++ b/.github/workflows/publish-desktop-ui-on-merge.yaml @@ -20,13 +20,13 @@ jobs: dist_tag: ${{ steps.dist.outputs.dist_tag }} steps: - name: Checkout code - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: ref: ${{ github.event.pull_request.merge_commit_sha }} persist-credentials: false - name: Setup Node.js - uses: actions/setup-node@v5 + uses: actions/setup-node@v6 with: node-version: '24.x' @@ -71,7 +71,7 @@ jobs: pull-requests: write steps: - name: Checkout merge commit - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: ref: ${{ github.event.pull_request.merge_commit_sha }} fetch-depth: 2 diff --git a/.github/workflows/publish-desktop-ui.yaml b/.github/workflows/publish-desktop-ui.yaml index d2741d792d..2a40445a5e 100644 --- a/.github/workflows/publish-desktop-ui.yaml +++ b/.github/workflows/publish-desktop-ui.yaml @@ -77,19 +77,19 @@ jobs: fi - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: ref: ${{ steps.resolve_ref.outputs.ref }} fetch-depth: 1 persist-credentials: false - name: Install pnpm - uses: pnpm/action-setup@v4 + uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 with: version: 10 - name: Setup Node.js - uses: actions/setup-node@v5 + uses: actions/setup-node@v6 with: node-version: '24.x' cache: 'pnpm' diff --git a/.github/workflows/release-biweekly-comfyui.yaml b/.github/workflows/release-biweekly-comfyui.yaml index 6eb45a00e0..be25e5ed70 100644 --- a/.github/workflows/release-biweekly-comfyui.yaml +++ b/.github/workflows/release-biweekly-comfyui.yaml @@ -1,5 +1,5 @@ # Automated bi-weekly workflow to bump ComfyUI frontend RC releases -name: "Release: Bi-weekly ComfyUI" +name: 'Release: Bi-weekly ComfyUI' on: # Schedule for Monday at 12:00 PM PST (20:00 UTC) @@ -61,13 +61,13 @@ jobs: steps: - name: Checkout ComfyUI_frontend - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: fetch-depth: 0 path: frontend - name: Checkout ComfyUI (sparse) - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: repository: Comfy-Org/ComfyUI sparse-checkout: | @@ -75,12 +75,12 @@ jobs: path: comfyui - name: Install pnpm - uses: pnpm/action-setup@v4 + uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 with: version: 10 - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: lts/* @@ -169,7 +169,7 @@ jobs: steps: - name: Checkout ComfyUI fork - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: repository: ${{ inputs.comfyui_fork || 'Comfy-Org/ComfyUI' }} token: ${{ secrets.PR_GH_TOKEN }} diff --git a/.github/workflows/release-branch-create.yaml b/.github/workflows/release-branch-create.yaml index 3e7290fdf0..3ea488fdfe 100644 --- a/.github/workflows/release-branch-create.yaml +++ b/.github/workflows/release-branch-create.yaml @@ -18,13 +18,13 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: fetch-depth: 0 token: ${{ secrets.PR_GH_TOKEN || secrets.GITHUB_TOKEN }} - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: 'lts/*' diff --git a/.github/workflows/release-draft-create.yaml b/.github/workflows/release-draft-create.yaml index 0bcb29159e..74d6c98981 100644 --- a/.github/workflows/release-draft-create.yaml +++ b/.github/workflows/release-draft-create.yaml @@ -19,12 +19,12 @@ jobs: is_prerelease: ${{ steps.check_prerelease.outputs.is_prerelease }} steps: - name: Checkout code - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Install pnpm - uses: pnpm/action-setup@v4 + uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 with: version: 10 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v6 with: node-version: 'lts/*' cache: 'pnpm' @@ -50,12 +50,13 @@ jobs: ALGOLIA_API_KEY: ${{ secrets.ALGOLIA_API_KEY }} ENABLE_MINIFY: 'true' USE_PROD_CONFIG: 'true' + IS_NIGHTLY: ${{ case(github.ref == 'refs/heads/main', 'true', 'false') }} run: | pnpm install --frozen-lockfile pnpm build pnpm zipdist - name: Upload dist artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: dist-files path: | @@ -66,16 +67,13 @@ jobs: needs: build runs-on: ubuntu-latest steps: - - name: Checkout code - uses: actions/checkout@v5 - name: Download dist artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v7 with: name: dist-files - name: Create release id: create_release - uses: >- - softprops/action-gh-release@da05d552573ad5aba039eaac05058a918a7bf631 + uses: softprops/action-gh-release@a06a81a03ee405af7f2048a818ed3f03bbf83c7b # v2.5.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: @@ -98,13 +96,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout code - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Download dist artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v7 with: name: dist-files - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v6 with: python-version: '3.x' - name: Install build dependencies @@ -119,8 +117,7 @@ jobs: env: COMFYUI_FRONTEND_VERSION: ${{ needs.build.outputs.version }} - name: Publish pypi package - uses: >- - pypa/gh-action-pypi-publish@76f52bc884231f62b9a034ebfe128415bbaabdfc + uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # v1.13.0 with: password: ${{ secrets.PYPI_TOKEN }} packages-dir: comfyui_frontend_package/dist @@ -147,7 +144,7 @@ jobs: pull-requests: write steps: - name: Checkout merge commit - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: ref: ${{ github.event.pull_request.merge_commit_sha }} fetch-depth: 2 diff --git a/.github/workflows/release-npm-types.yaml b/.github/workflows/release-npm-types.yaml index 23f0cc016b..21614c8a4e 100644 --- a/.github/workflows/release-npm-types.yaml +++ b/.github/workflows/release-npm-types.yaml @@ -69,18 +69,18 @@ jobs: fi - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: ref: ${{ steps.resolve_ref.outputs.ref }} fetch-depth: 1 - name: Install pnpm - uses: pnpm/action-setup@v4 + uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 with: version: 10 - name: Setup Node.js - uses: actions/setup-node@v5 + uses: actions/setup-node@v6 with: node-version: 'lts/*' cache: 'pnpm' diff --git a/.github/workflows/release-pypi-dev.yaml b/.github/workflows/release-pypi-dev.yaml index 8683217594..5b102dbe86 100644 --- a/.github/workflows/release-pypi-dev.yaml +++ b/.github/workflows/release-pypi-dev.yaml @@ -15,12 +15,12 @@ jobs: version: ${{ steps.current_version.outputs.version }} steps: - name: Checkout code - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Install pnpm - uses: pnpm/action-setup@v4 + uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 with: version: 10 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v6 with: node-version: 'lts/*' cache: 'pnpm' @@ -40,7 +40,7 @@ jobs: pnpm build pnpm zipdist - name: Upload dist artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: dist-files path: | @@ -52,13 +52,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout code - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Download dist artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v7 with: name: dist-files - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v6 with: python-version: '3.x' - name: Install build dependencies @@ -73,7 +73,7 @@ jobs: env: COMFYUI_FRONTEND_VERSION: ${{ format('{0}.dev{1}', needs.build.outputs.version, inputs.devVersion) }} - name: Publish pypi package - uses: pypa/gh-action-pypi-publish@76f52bc884231f62b9a034ebfe128415bbaabdfc + uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # v1.13.0 with: password: ${{ secrets.PYPI_TOKEN }} packages-dir: comfyui_frontend_package/dist diff --git a/.github/workflows/release-version-bump.yaml b/.github/workflows/release-version-bump.yaml index ca08e25bdd..d7ba7358ea 100644 --- a/.github/workflows/release-version-bump.yaml +++ b/.github/workflows/release-version-bump.yaml @@ -1,5 +1,5 @@ # Description: Manual workflow to increment package version with semantic versioning support -name: "Release: Version Bump" +name: 'Release: Version Bump' on: workflow_dispatch: @@ -65,7 +65,7 @@ jobs: - name: Close stale nightly version bump PRs if: github.event_name == 'schedule' - uses: actions/github-script@v7 + uses: actions/github-script@v8 with: github-token: ${{ github.token }} script: | @@ -118,7 +118,7 @@ jobs: core.info(`Closed ${closed.length} stale PR(s).`) - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: ref: ${{ steps.prepared-inputs.outputs.branch }} fetch-depth: 0 @@ -142,12 +142,12 @@ jobs: echo "✅ Branch '$BRANCH' exists" - name: Install pnpm - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 + uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 with: version: 10 - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: lts/* @@ -180,7 +180,7 @@ jobs: echo "capitalised=${CAPITALISED_TYPE@u}" >> "$GITHUB_OUTPUT" - name: Create Pull Request - uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e + uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v8.1.0 with: token: ${{ secrets.PR_GH_TOKEN }} commit-message: '[release] Increment version to ${{ steps.bump-version.outputs.NEW_VERSION }}' diff --git a/.github/workflows/version-bump-desktop-ui.yaml b/.github/workflows/version-bump-desktop-ui.yaml index 0a8aca1b70..0ae9406391 100644 --- a/.github/workflows/version-bump-desktop-ui.yaml +++ b/.github/workflows/version-bump-desktop-ui.yaml @@ -29,7 +29,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: ref: ${{ github.event.inputs.branch }} fetch-depth: 0 @@ -51,12 +51,12 @@ jobs: echo "✅ Branch '$BRANCH' exists" - name: Install pnpm - uses: pnpm/action-setup@v4 + uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 with: version: 10 - name: Setup Node.js - uses: actions/setup-node@v5 + uses: actions/setup-node@v6 with: node-version: '24.x' cache: 'pnpm' @@ -79,7 +79,7 @@ jobs: echo "capitalised=${VERSION_TYPE@u}" >> $GITHUB_OUTPUT - name: Create Pull Request - uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e + uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v8.1.0 with: token: ${{ secrets.PR_GH_TOKEN }} commit-message: '[release] Increment desktop-ui to ${{ steps.bump-version.outputs.NEW_VERSION }}' diff --git a/.github/workflows/weekly-docs-check.yaml b/.github/workflows/weekly-docs-check.yaml index 317e4d8fec..81519e49ed 100644 --- a/.github/workflows/weekly-docs-check.yaml +++ b/.github/workflows/weekly-docs-check.yaml @@ -1,5 +1,5 @@ # Description: Automated weekly documentation accuracy check and update via Claude -name: "Weekly Documentation Check" +name: 'Weekly Documentation Check' permissions: contents: write @@ -22,18 +22,18 @@ jobs: timeout-minutes: 45 steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: - fetch-depth: 0 + fetch-depth: 50 ref: main - name: Install pnpm - uses: pnpm/action-setup@v4 + uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 with: version: 10 - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: '20' cache: 'pnpm' @@ -49,7 +49,7 @@ jobs: fi - name: Run Claude Documentation Review - uses: anthropics/claude-code-action@v1.0.6 + uses: anthropics/claude-code-action@ff34ce0ff04a470bd3fa56c1ef391c8f1c19f8e9 # v1.0.38 with: prompt: | Is all documentation still 100% accurate? @@ -130,7 +130,7 @@ jobs: - name: Create or Update Pull Request if: steps.check_changes.outputs.has_changes == 'true' - uses: peter-evans/create-pull-request@v7 + uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v8.1.0 with: token: ${{ secrets.PR_GH_TOKEN }} commit-message: 'docs: weekly documentation accuracy update' diff --git a/.gitignore b/.gitignore index 3e400ba39c..6eddbcb531 100644 --- a/.gitignore +++ b/.gitignore @@ -96,3 +96,5 @@ vitest.config.*.timestamp* # Weekly docs check output /output.txt + +.amp \ No newline at end of file diff --git a/.oxfmtrc.json b/.oxfmtrc.json index 5da4febe23..1278864b21 100644 --- a/.oxfmtrc.json +++ b/.oxfmtrc.json @@ -7,14 +7,8 @@ "printWidth": 80, "ignorePatterns": [ "packages/registry-types/src/comfyRegistryTypes.ts", + "public/materialdesignicons.min.css", "src/types/generatedManagerTypes.ts", - "**/*.md", - "**/*.json", - "**/*.css", - "**/*.yaml", - "**/*.yml", - "**/*.html", - "**/*.svg", - "**/*.xml" + "**/__fixtures__/**/*.json" ] } diff --git a/.oxlintrc.json b/.oxlintrc.json index 276ef5461d..36eef37a96 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -31,10 +31,7 @@ "no-console": [ "error", { - "allow": [ - "warn", - "error" - ] + "allow": ["warn", "error"] } ], "no-control-regex": "off", @@ -63,16 +60,6 @@ { "name": "primevue/sidebar", "message": "Sidebar is deprecated in PrimeVue 4+. Use Drawer instead: import Drawer from 'primevue/drawer'" - }, - { - "name": "@/i18n--to-enable", - "importNames": [ - "st", - "t", - "te", - "d" - ], - "message": "Don't import `@/i18n` directly, prefer `useI18n()`" } ] } @@ -85,10 +72,7 @@ "import/export": "error", "import/namespace": "error", "import/no-duplicates": "error", - "import/consistent-type-specifier-style": [ - "error", - "prefer-top-level" - ], + "import/consistent-type-specifier-style": ["error", "prefer-top-level"], "jest/expect-expect": "off", "jest/no-conditional-expect": "off", "jest/no-disabled-tests": "off", @@ -117,13 +101,21 @@ }, "overrides": [ { - "files": [ - "**/*.{stories,test,spec}.ts", - "**/*.stories.vue" - ], + "files": ["**/*.{stories,test,spec}.ts", "**/*.stories.vue"], "rules": { "no-console": "allow" } + }, + { + "files": ["browser_tests/**/*.ts"], + "rules": { + "typescript/no-explicit-any": "error", + "no-async-promise-executor": "error", + "no-control-regex": "error", + "no-useless-rename": "error", + "no-unused-private-class-members": "error", + "unicorn/no-empty-file": "error" + } } ] -} \ No newline at end of file +} diff --git a/.pinact.yaml b/.pinact.yaml new file mode 100644 index 0000000000..03fade044d --- /dev/null +++ b/.pinact.yaml @@ -0,0 +1,24 @@ +# pinact configuration +# https://github.com/suzuki-shunsuke/pinact +version: 3 + +files: + - pattern: .github/workflows/*.yaml + - pattern: .github/actions/**/*.yaml + +# Actions that don't need SHA pinning (official GitHub actions are trusted) +ignore_actions: + - name: actions/cache + ref: v5 + - name: actions/checkout + ref: v6 + - name: actions/setup-node + ref: v6 + - name: actions/setup-python + ref: v6 + - name: actions/upload-artifact + ref: v6 + - name: actions/download-artifact + ref: v7 + - name: actions/github-script + ref: v8 diff --git a/.storybook/AGENTS.md b/.storybook/AGENTS.md index 5f6373f4be..aff1142397 100644 --- a/.storybook/AGENTS.md +++ b/.storybook/AGENTS.md @@ -5,6 +5,7 @@ See `@docs/guidance/storybook.md` for story patterns (auto-loaded for `*.stories ## Available Context Stories have access to: + - All ComfyUI stores - PrimeVue with ComfyUI theming - i18n system diff --git a/.storybook/CLAUDE.md b/.storybook/CLAUDE.md index 320b788155..4837fdae9f 100644 --- a/.storybook/CLAUDE.md +++ b/.storybook/CLAUDE.md @@ -1,3 +1,4 @@ + @AGENTS.md diff --git a/.storybook/README.md b/.storybook/README.md index be5405e513..ba09b24d5d 100644 --- a/.storybook/README.md +++ b/.storybook/README.md @@ -12,16 +12,17 @@ Storybook is a frontend workshop for building UI components and pages in isolati ## Storybook vs Other Testing Tools -| Tool | Purpose | Use Case | -|------|---------|----------| -| **Storybook** | Component isolation & documentation | Developing, testing, and showcasing individual UI components | -| **Playwright** | End-to-end testing | Full user workflow testing across multiple pages | -| **Vitest** | Unit testing | Testing business logic, utilities, and component behavior | -| **Vue Testing Library** | Component testing | Testing component interactions and DOM output | +| Tool | Purpose | Use Case | +| ----------------------- | ----------------------------------- | ------------------------------------------------------------ | +| **Storybook** | Component isolation & documentation | Developing, testing, and showcasing individual UI components | +| **Playwright** | End-to-end testing | Full user workflow testing across multiple pages | +| **Vitest** | Unit testing | Testing business logic, utilities, and component behavior | +| **Vue Testing Library** | Component testing | Testing component interactions and DOM output | ### When to Use Storybook **✅ Use Storybook for:** + - Developing new UI components in isolation - Creating component documentation and examples - Testing different component states and props @@ -30,6 +31,7 @@ Storybook is a frontend workshop for building UI components and pages in isolati - Building a component library or design system **❌ Don't use Storybook for:** + - Testing complex user workflows (use Playwright) - Testing business logic (use Vitest) - Integration testing between components (use Vue Testing Library) @@ -96,6 +98,7 @@ export const WithVariant: Story = { ## ComfyUI Storybook Guidelines ### Scope – When to Create Stories + - **PrimeVue components**: No need to create stories. Just refer to the official PrimeVue documentation. - **Custom shared components (design system components)**: @@ -104,6 +107,7 @@ export const WithVariant: Story = { Do not create stories. Only the underlying pure UI components should be included in Storybook. ### Maintenance Philosophy + - Stories are lightweight and generally stable. Once created, they rarely need updates unless: - The design changes @@ -111,10 +115,12 @@ export const WithVariant: Story = { - For existing usage patterns, simply copy real code examples into Storybook to create stories. ### File Placement -- Keep `*.stories.ts` files at the **same level as the component** (similar to test files). + +- Keep `*.stories.ts` files at the **same level as the component** (similar to test files). - This makes it easier to check usage examples without navigating to another directory. ### Developer/Designer Workflow + - **UI vs Container**: Separate pure UI components from container components. Only UI components should live in Storybook. - **Communication Tool**: Storybook is not just about code quality—it enables designers and developers to see: @@ -126,9 +132,10 @@ export const WithVariant: Story = { → Only create a story for the base UI button, not for the wrapper. ### Suggested Workflow -1. Use PrimeVue docs for standard components -2. Use Storybook for **shared/custom components** that define our design system -3. Keep story files alongside components + +1. Use PrimeVue docs for standard components +2. Use Storybook for **shared/custom components** that define our design system +3. Keep story files alongside components 4. When in doubt, focus on components reused across the app or those that need to be showcased to designers ### Best Practices @@ -211,13 +218,12 @@ This Storybook setup includes: ## Icon Usage in Storybook -In this project, only the `` syntax from unplugin-icons is supported in Storybook. +In this project, only the `` syntax from unplugin-icons is supported in Storybook. **Example:** ```vue - +