diff --git a/.claude/commands/add-missing-i18n.md b/.claude/commands/add-missing-i18n.md
index 4b8414189..b88a2005e 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 1b4047e78..b801fff9e 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 f16189d42..ae2240462 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,6 +388,7 @@ 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}
@@ -384,7 +398,9 @@ 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
@@ -468,14 +486,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 +502,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 +512,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 +532,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 +556,7 @@ echo "Workflow triggered. Waiting for PR creation..."
```
3. **npm Package:**
+
```bash
# Check npm availability
for i in {1..10}; do
@@ -550,15 +574,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 +615,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 +653,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 +693,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 +702,7 @@ git clean -fd
```
**Post-Merge Rollback:**
+
```bash
# Create immediate patch release with reverts
git revert ${RELEASE_COMMIT}
@@ -680,6 +710,7 @@ git revert ${RELEASE_COMMIT}
```
**Emergency Procedures:**
+
```bash
# Document incident
cat > release-incident-${NEW_VERSION}.md << EOF
@@ -713,31 +744,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 +786,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 +799,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 +808,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 +823,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 cc9c37ef5..8c68ef888 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
@@ -122,7 +123,7 @@ echo " pnpm build - Build for production"
echo " pnpm test:unit - Run unit tests"
echo " pnpm typecheck - Run TypeScript checks"
echo " pnpm lint - Run ESLint"
-echo " pnpm format - Format code with Prettier"
+echo " pnpm format - Format code with oxfmt"
echo ""
echo "Next steps:"
echo "1. Run 'pnpm dev' to start developing"
@@ -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 66260b159..7258d4b11 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/.cursor/rules/unit-test.mdc b/.cursor/rules/unit-test.mdc
deleted file mode 100644
index 2c6704f3e..000000000
--- a/.cursor/rules/unit-test.mdc
+++ /dev/null
@@ -1,21 +0,0 @@
----
-description: Creating unit tests
-globs:
-alwaysApply: false
----
-
-# Creating unit tests
-
-- This project uses `vitest` for unit testing
-- Tests are stored in the `test/` directory
-- Tests should be cross-platform compatible; able to run on Windows, macOS, and linux
- - e.g. the use of `path.resolve`, or `path.join` and `path.sep` to ensure that tests work the same on all platforms
-- Tests should be mocked properly
- - Mocks should be cleanly written and easy to understand
- - Mocks should be re-usable where possible
-
-## Unit test style
-
-- Prefer the use of `test.extend` over loose variables
- - To achieve this, import `test as baseTest` from `vitest`
-- Never use `it`; `test` should be used in place of this
\ No newline at end of file
diff --git a/.github/AGENTS.md b/.github/AGENTS.md
new file mode 100644
index 000000000..36ee825b4
--- /dev/null
+++ b/.github/AGENTS.md
@@ -0,0 +1,15 @@
+# PR Review Context
+
+Context for automated PR review system.
+
+## Review Scope
+
+This automated review performs comprehensive analysis:
+
+- Architecture and design patterns
+- Security vulnerabilities
+- Performance implications
+- Code quality and maintainability
+- Integration concerns
+
+For implementation details, see `.claude/commands/comprehensive-pr-review.md`.
diff --git a/.github/CLAUDE.md b/.github/CLAUDE.md
index 9a95d8cd0..fc844bc41 100644
--- a/.github/CLAUDE.md
+++ b/.github/CLAUDE.md
@@ -1,36 +1,4 @@
-# ComfyUI Frontend - Claude Review Context
+
-This file provides additional context for the automated PR review system.
-
-## Quick Reference
-
-### PrimeVue Component Migrations
-
-When reviewing, flag these deprecated components:
-- `Dropdown` → Use `Select` from 'primevue/select'
-- `OverlayPanel` → Use `Popover` from 'primevue/popover'
-- `Calendar` → Use `DatePicker` from 'primevue/datepicker'
-- `InputSwitch` → Use `ToggleSwitch` from 'primevue/toggleswitch'
-- `Sidebar` → Use `Drawer` from 'primevue/drawer'
-- `Chips` → Use `AutoComplete` with multiple enabled and typeahead disabled
-- `TabMenu` → Use `Tabs` without panels
-- `Steps` → Use `Stepper` without panels
-- `InlineMessage` → Use `Message` component
-
-### API Utilities Reference
-
-- `api.apiURL()` - Backend API calls (/prompt, /queue, /view, etc.)
-- `api.fileURL()` - Static file access (templates, extensions)
-- `$t()` / `i18n.global.t()` - Internationalization
-- `DOMPurify.sanitize()` - HTML sanitization
-
-## Review Scope
-
-This automated review performs comprehensive analysis including:
-- Architecture and design patterns
-- Security vulnerabilities
-- Performance implications
-- Code quality and maintainability
-- Integration concerns
-
-For implementation details, see `.claude/commands/comprehensive-pr-review.md`.
\ No newline at end of file
+@AGENTS.md
diff --git a/.github/ISSUE_TEMPLATE/bug-report.yaml b/.github/ISSUE_TEMPLATE/bug-report.yaml
index 2ed7cf206..f59926d26 100644
--- a/.github/ISSUE_TEMPLATE/bug-report.yaml
+++ b/.github/ISSUE_TEMPLATE/bug-report.yaml
@@ -60,7 +60,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/copilot-instructions.md b/.github/copilot-instructions.md
index 551b03721..14874c099 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/ci-json-validation.yaml b/.github/workflows/ci-json-validation.yaml
index 8c55705e7..9fd6f915b 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:
diff --git a/.github/workflows/ci-lint-format.yaml b/.github/workflows/ci-lint-format.yaml
index 3ce6d6aa9..e001dc234 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:
@@ -42,7 +42,7 @@ jobs:
- name: Run Stylelint with auto-fix
run: pnpm stylelint:fix
- - name: Run Prettier with auto-format
+ - name: Run oxfmt with auto-format
run: pnpm format
- name: Check for changes
@@ -60,7 +60,7 @@ jobs:
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
git add .
- git commit -m "[automated] Apply ESLint and Prettier fixes"
+ git commit -m "[automated] Apply ESLint and Oxfmt fixes"
git push
- name: Final validation
@@ -80,7 +80,7 @@ jobs:
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
- body: '## 🔧 Auto-fixes Applied\n\nThis PR has been automatically updated to fix linting and formatting issues.\n\n**⚠️ Important**: Your local branch is now behind. Run `git pull` before making additional changes to avoid conflicts.\n\n### Changes made:\n- ESLint auto-fixes\n- Prettier formatting'
+ body: '## 🔧 Auto-fixes Applied\n\nThis PR has been automatically updated to fix linting and formatting issues.\n\n**⚠️ Important**: Your local branch is now behind. Run `git pull` before making additional changes to avoid conflicts.\n\n### Changes made:\n- ESLint auto-fixes\n- Oxfmt formatting'
})
- name: Comment on PR about manual fix needed
diff --git a/.github/workflows/ci-python-validation.yaml b/.github/workflows/ci-python-validation.yaml
index 1625ca29f..b06296391 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:
diff --git a/.github/workflows/ci-shell-validation.yaml b/.github/workflows/ci-shell-validation.yaml
index 783d1b03c..72ac4be23 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 a21c93110..c88be8ad5 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:
diff --git a/.github/workflows/ci-tests-storybook-forks.yaml b/.github/workflows/ci-tests-storybook-forks.yaml
index e93b5bb90..3012f61f2 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:
diff --git a/.github/workflows/ci-tests-storybook.yaml b/.github/workflows/ci-tests-storybook.yaml
index 8158787a2..e900a6f0f 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:
@@ -88,7 +88,7 @@ jobs:
- name: Checkout code
uses: actions/checkout@v5
with:
- fetch-depth: 0 # Required for Chromatic baseline
+ fetch-depth: 0 # Required for Chromatic baseline
- name: Install pnpm
uses: pnpm/action-setup@v4
@@ -110,9 +110,9 @@ jobs:
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
diff --git a/.github/workflows/ci-tests-unit.yaml b/.github/workflows/ci-tests-unit.yaml
index 8a97a9128..c2a8c1f15 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:
@@ -26,8 +26,8 @@ jobs:
- name: Use Node.js
uses: actions/setup-node@v4
with:
- node-version: "lts/*"
- cache: "pnpm"
+ node-version: 'lts/*'
+ cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
diff --git a/.github/workflows/ci-yaml-validation.yaml b/.github/workflows/ci-yaml-validation.yaml
index cf2a3b648..788c6b188 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:
diff --git a/.github/workflows/i18n-update-core.yaml b/.github/workflows/i18n-update-core.yaml
index a4e73f538..0ceaf7397 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
diff --git a/.github/workflows/i18n-update-nodes.yaml b/.github/workflows/i18n-update-nodes.yaml
index 46db1661e..9afc1f195 100644
--- a/.github/workflows/i18n-update-nodes.yaml
+++ b/.github/workflows/i18n-update-nodes.yaml
@@ -43,8 +43,8 @@ jobs:
uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e
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 c38a8081e..968fcfd81 100644
--- a/.github/workflows/pr-backport.yaml
+++ b/.github/workflows/pr-backport.yaml
@@ -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 ec4159c1c..56fcc8c9b 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
@@ -46,7 +46,7 @@ jobs:
- name: Run Claude PR Review
uses: anthropics/claude-code-action@v1.0.6
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 968888aa9..38b742054 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:
diff --git a/.github/workflows/pr-update-playwright-expectations.yaml b/.github/workflows/pr-update-playwright-expectations.yaml
index 0ca696721..628bc3039 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:
@@ -39,11 +39,11 @@ jobs:
- name: Find Update Comment
uses: peter-evans/find-comment@b30e6a3c0ed37e7c023ccd3f1db5c6c0b0c23aad
- id: "find-update-comment"
+ 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
diff --git a/.github/workflows/release-biweekly-comfyui.yaml b/.github/workflows/release-biweekly-comfyui.yaml
index 6eb45a00e..8c75548ce 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)
diff --git a/.github/workflows/release-version-bump.yaml b/.github/workflows/release-version-bump.yaml
index ca08e25bd..4f0d033d9 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:
diff --git a/.github/workflows/weekly-docs-check.yaml b/.github/workflows/weekly-docs-check.yaml
index 317e4d8fe..d5c8dc51e 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
diff --git a/.i18nrc.cjs b/.i18nrc.cjs
index 86ce06eaa..4369f0a70 100644
--- a/.i18nrc.cjs
+++ b/.i18nrc.cjs
@@ -1,7 +1,7 @@
// This file is intentionally kept in CommonJS format (.cjs)
// to resolve compatibility issues with dependencies that require CommonJS.
// Do not convert this file to ESModule format unless all dependencies support it.
-const { defineConfig } = require('@lobehub/i18n-cli');
+const { defineConfig } = require('@lobehub/i18n-cli')
module.exports = defineConfig({
modelName: 'gpt-4.1',
@@ -10,7 +10,19 @@ module.exports = defineConfig({
entry: 'src/locales/en',
entryLocale: 'en',
output: 'src/locales',
- outputLocales: ['zh', 'zh-TW', 'ru', 'ja', 'ko', 'fr', 'es', 'ar', 'tr', 'pt-BR', 'fa'],
+ outputLocales: [
+ 'zh',
+ 'zh-TW',
+ 'ru',
+ 'ja',
+ 'ko',
+ 'fr',
+ 'es',
+ 'ar',
+ 'tr',
+ 'pt-BR',
+ 'fa'
+ ],
reference: `Special names to keep untranslated: flux, photomaker, clip, vae, cfg, stable audio, stable cascade, stable zero, controlnet, lora, HiDream, Civitai, Hugging Face.
'latent' is the short form of 'latent space'.
'mask' is in the context of image processing.
@@ -26,4 +38,4 @@ module.exports = defineConfig({
- Use Arabic-Indic numerals (۰-۹) for numbers where appropriate.
- Maintain consistency with terminology used in Persian software and design applications.
`
-});
+})
diff --git a/.oxfmtrc.json b/.oxfmtrc.json
new file mode 100644
index 000000000..1278864b2
--- /dev/null
+++ b/.oxfmtrc.json
@@ -0,0 +1,14 @@
+{
+ "$schema": "./node_modules/oxfmt/configuration_schema.json",
+ "singleQuote": true,
+ "tabWidth": 2,
+ "semi": false,
+ "trailingComma": "none",
+ "printWidth": 80,
+ "ignorePatterns": [
+ "packages/registry-types/src/comfyRegistryTypes.ts",
+ "public/materialdesignicons.min.css",
+ "src/types/generatedManagerTypes.ts",
+ "**/__fixtures__/**/*.json"
+ ]
+}
diff --git a/.oxlintrc.json b/.oxlintrc.json
index 276ef5461..a0769d8f4 100644
--- a/.oxlintrc.json
+++ b/.oxlintrc.json
@@ -31,10 +31,7 @@
"no-console": [
"error",
{
- "allow": [
- "warn",
- "error"
- ]
+ "allow": ["warn", "error"]
}
],
"no-control-regex": "off",
@@ -66,12 +63,7 @@
},
{
"name": "@/i18n--to-enable",
- "importNames": [
- "st",
- "t",
- "te",
- "d"
- ],
+ "importNames": ["st", "t", "te", "d"],
"message": "Don't import `@/i18n` directly, prefer `useI18n()`"
}
]
@@ -85,10 +77,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 +106,10 @@
},
"overrides": [
{
- "files": [
- "**/*.{stories,test,spec}.ts",
- "**/*.stories.vue"
- ],
+ "files": ["**/*.{stories,test,spec}.ts", "**/*.stories.vue"],
"rules": {
"no-console": "allow"
}
}
]
-}
\ No newline at end of file
+}
diff --git a/.prettierignore b/.prettierignore
deleted file mode 100644
index 4403edd8e..000000000
--- a/.prettierignore
+++ /dev/null
@@ -1,2 +0,0 @@
-packages/registry-types/src/comfyRegistryTypes.ts
-src/types/generatedManagerTypes.ts
diff --git a/.prettierrc b/.prettierrc
deleted file mode 100644
index aa43a43ac..000000000
--- a/.prettierrc
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "singleQuote": true,
- "tabWidth": 2,
- "semi": false,
- "trailingComma": "none",
- "printWidth": 80,
- "importOrder": ["^@core/(.*)$", "", "^@/(.*)$", "^[./]"],
- "importOrderSeparation": true,
- "importOrderSortSpecifiers": true,
- "plugins": ["@prettier/plugin-oxc", "@trivago/prettier-plugin-sort-imports"]
-}
diff --git a/.storybook/AGENTS.md b/.storybook/AGENTS.md
new file mode 100644
index 000000000..aff114239
--- /dev/null
+++ b/.storybook/AGENTS.md
@@ -0,0 +1,18 @@
+# Storybook Guidelines
+
+See `@docs/guidance/storybook.md` for story patterns (auto-loaded for `*.stories.ts`).
+
+## Available Context
+
+Stories have access to:
+
+- All ComfyUI stores
+- PrimeVue with ComfyUI theming
+- i18n system
+- CSS variables and styling
+
+## Troubleshooting
+
+1. **Import Errors**: Verify `@/` alias works
+2. **Missing Styles**: Check CSS imports in `preview.ts`
+3. **Store Errors**: Check store initialization in setup
diff --git a/.storybook/CLAUDE.md b/.storybook/CLAUDE.md
index ca8248784..4837fdae9 100644
--- a/.storybook/CLAUDE.md
+++ b/.storybook/CLAUDE.md
@@ -1,197 +1,4 @@
-# Storybook Development Guidelines for Claude
+
-## Quick Commands
-
-- `pnpm storybook`: Start Storybook development server
-- `pnpm build-storybook`: Build static Storybook
-- `pnpm test:unit`: Run unit tests (includes Storybook components)
-
-## Development Workflow for Storybook
-
-1. **Creating New Stories**:
- - Place `*.stories.ts` files alongside components
- - Follow the naming pattern: `ComponentName.stories.ts`
- - Use realistic mock data that matches ComfyUI schemas
-
-2. **Testing Stories**:
- - Verify stories render correctly in Storybook UI
- - Test different component states and edge cases
- - Ensure proper theming and styling
-
-3. **Code Quality**:
- - Run `pnpm typecheck` to verify TypeScript
- - Run `pnpm lint` to check for linting issues
- - Follow existing story patterns and conventions
-
-## Story Creation Guidelines
-
-### Basic Story Structure
-
-```typescript
-import type { Meta, StoryObj } from '@storybook/vue3'
-import ComponentName from './ComponentName.vue'
-
-const meta: Meta = {
- title: 'Category/ComponentName',
- component: ComponentName,
- parameters: {
- layout: 'centered' // or 'fullscreen', 'padded'
- }
-}
-
-export default meta
-type Story = StoryObj
-
-export const Default: Story = {
- args: {
- // Component props
- }
-}
-```
-
-### Mock Data Patterns
-
-For ComfyUI components, use realistic mock data:
-
-```typescript
-// Node definition mock
-const mockNodeDef = {
- input: {
- required: {
- prompt: ["STRING", { multiline: true }]
- }
- },
- output: ["CONDITIONING"],
- output_is_list: [false],
- category: "conditioning"
-}
-
-// Component instance mock
-const mockComponent = {
- id: "1",
- type: "CLIPTextEncode",
- // ... other properties
-}
-```
-
-### Common Story Variants
-
-Always include these story variants when applicable:
-
-- **Default**: Basic component with minimal props
-- **WithData**: Component with realistic data
-- **Loading**: Component in loading state
-- **Error**: Component with error state
-- **LongContent**: Component with edge case content
-- **Empty**: Component with no data
-
-### Storybook-Specific Code Patterns
-
-#### Store Access
-```typescript
-// In stories, access stores through the setup function
-export const WithStore: Story = {
- render: () => ({
- setup() {
- const store = useMyStore()
- return { store }
- },
- template: ''
- })
-}
-```
-
-#### Event Testing
-```typescript
-export const WithEvents: Story = {
- args: {
- onUpdate: fn() // Use Storybook's fn() for action logging
- }
-}
-```
-
-## Configuration Notes
-
-### Vue App Setup
-The Storybook preview is configured with:
-- Pinia stores initialized
-- PrimeVue with ComfyUI theme
-- i18n internationalization
-- All necessary CSS imports
-
-### Build Configuration
-- Vite integration with proper alias resolution
-- Manual chunking for better performance
-- TypeScript support with strict checking
-- CSS processing for Vue components
-
-## Troubleshooting
-
-### Common Issues
-
-1. **Import Errors**: Verify `@/` alias is working correctly
-2. **Missing Styles**: Ensure CSS imports are in `preview.ts`
-3. **Store Errors**: Check store initialization in setup
-4. **Type Errors**: Use proper TypeScript types for story args
-
-### Debug Commands
-
-```bash
-# Check TypeScript issues
-pnpm typecheck
-
-# Lint Storybook files
-pnpm lint .storybook/
-
-# Build to check for production issues
-pnpm build-storybook
-```
-
-## File Organization
-
-```
-.storybook/
-├── main.ts # Core configuration
-├── preview.ts # Global setup and decorators
-├── README.md # User documentation
-└── CLAUDE.md # This file - Claude guidelines
-
-src/
-├── components/
-│ └── MyComponent/
-│ ├── MyComponent.vue
-│ └── MyComponent.stories.ts
-```
-
-## Integration with ComfyUI
-
-### Available Context
-
-Stories have access to:
-- All ComfyUI stores (widgetStore, colorPaletteStore, etc.)
-- PrimeVue components with ComfyUI theming
-- Internationalization system
-- ComfyUI CSS variables and styling
-
-### Testing Components
-
-When testing ComfyUI-specific components:
-1. Use realistic node definitions and data structures
-2. Test with different node types (sampling, conditioning, etc.)
-3. Verify proper CSS theming and dark/light modes
-4. Check component behavior with various input combinations
-
-### Performance Considerations
-
-- Use manual chunking for large dependencies
-- Minimize bundle size by avoiding unnecessary imports
-- Leverage Storybook's lazy loading capabilities
-- Profile build times and optimize as needed
-
-## Best Practices
-
-1. **Keep Stories Focused**: Each story should demonstrate one specific use case
-2. **Use Descriptive Names**: Story names should clearly indicate what they show
-3. **Document Complex Props**: Use JSDoc comments for complex prop types
-4. **Test Edge Cases**: Create stories for unusual but valid use cases
-5. **Maintain Consistency**: Follow established patterns in existing stories
\ No newline at end of file
+@AGENTS.md
diff --git a/.storybook/README.md b/.storybook/README.md
index be5405e51..ba09b24d5 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
-
+
@@ -226,4 +232,3 @@ In this project, only the `` syntax from unpl
```
This approach ensures icons render correctly in Storybook and remain consistent with the rest of the app.
-
diff --git a/.storybook/main.ts b/.storybook/main.ts
index 5b7c126e9..90fbb138a 100644
--- a/.storybook/main.ts
+++ b/.storybook/main.ts
@@ -96,15 +96,15 @@ const config: StorybookConfig = {
}
]
},
- esbuild: {
- // Prevent minification of identifiers to preserve _sfc_main
- minifyIdentifiers: false,
- keepNames: true
- },
build: {
- rollupOptions: {
- // Disable tree-shaking for Storybook to prevent Vue SFC exports from being removed
+ rolldownOptions: {
+ experimental: {
+ strictExecutionOrder: true
+ },
treeshake: false,
+ output: {
+ keepNames: true
+ },
onwarn: (warning, warn) => {
// Suppress specific warnings
if (
diff --git a/.storybook/preview-head.html b/.storybook/preview-head.html
index 05e082ef0..5ad063ab9 100644
--- a/.storybook/preview-head.html
+++ b/.storybook/preview-head.html
@@ -1,7 +1,9 @@
\ No newline at end of file
+
diff --git a/.vscode/custom-css.json b/.vscode/custom-css.json
index 67aa038b4..89e04c3e8 100644
--- a/.vscode/custom-css.json
+++ b/.vscode/custom-css.json
@@ -47,4 +47,4 @@
"status": "obsolete"
}
]
-}
\ No newline at end of file
+}
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
index 54f28d400..9cbac42d7 100644
--- a/.vscode/extensions.json
+++ b/.vscode/extensions.json
@@ -1,25 +1,22 @@
{
"recommendations": [
+ "antfu.vite",
"austenc.tailwind-docs",
"bradlc.vscode-tailwindcss",
"davidanson.vscode-markdownlint",
"dbaeumer.vscode-eslint",
+ "donjayamanne.githistory",
"eamodio.gitlens",
- "esbenp.prettier-vscode",
- "figma.figma-vscode-extension",
"github.vscode-github-actions",
"github.vscode-pull-request-github",
"hbenl.vscode-test-explorer",
+ "kisstkondoros.vscode-codemetrics",
"lokalise.i18n-ally",
"ms-playwright.playwright",
+ "oxc.oxc-vscode",
+ "sonarsource.sonarlint-vscode",
"vitest.explorer",
"vue.volar",
- "sonarsource.sonarlint-vscode",
- "deque-systems.vscode-axe-linter",
- "kisstkondoros.vscode-codemetrics",
- "donjayamanne.githistory",
- "wix.vscode-import-cost",
- "prograhammer.tslint-vue",
- "antfu.vite"
+ "wix.vscode-import-cost"
]
}
diff --git a/AGENTS.md b/AGENTS.md
index 743572be3..3eeac44cc 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -1,5 +1,7 @@
# Repository Guidelines
+See @docs/guidance/\*.md for file-type-specific conventions (auto-loaded by glob).
+
## Project Structure & Module Organization
- Source: `src/`
@@ -25,10 +27,10 @@
- Build output: `dist/`
- Configs
- `vite.config.mts`
- - `vitest.config.ts`
- `playwright.config.ts`
- `eslint.config.ts`
- - `.prettierrc`
+ - `.oxfmtrc.json`
+ - `.oxlintrc.json`
- etc.
## Monorepo Architecture
@@ -44,8 +46,23 @@ The project uses **Nx** for build orchestration and task management
- `pnpm test:unit`: Run Vitest unit tests
- `pnpm test:browser`: Run Playwright E2E tests (`browser_tests/`)
- `pnpm lint` / `pnpm lint:fix`: Lint (ESLint)
-- `pnpm format` / `pnpm format:check`: Prettier
+- `pnpm format` / `pnpm format:check`: oxfmt
- `pnpm typecheck`: Vue TSC type checking
+- `pnpm storybook`: Start Storybook development server
+
+## Development Workflow
+
+1. Make code changes
+2. Run relevant tests
+3. Run `pnpm typecheck`, `pnpm lint`, `pnpm format`
+4. Check if README updates are needed
+5. Suggest docs.comfy.org updates for user-facing changes
+
+## Git Conventions
+
+- Use `prefix:` format: `feat:`, `fix:`, `test:`
+- Add "Fixes #n" to PR descriptions
+- Never mention Claude/AI in commits
## Coding Style & Naming Conventions
@@ -55,7 +72,7 @@ The project uses **Nx** for build orchestration and task management
- Composition API only
- Tailwind 4 styling
- Avoid `
+
-
+
-
+