Skip to content

[pull] main from Comfy-Org:main - #32

Merged
pull[bot] merged 9 commits into
Penguinjanator:mainfrom
Comfy-Org:main
Aug 13, 2026
Merged

[pull] main from Comfy-Org:main#32
pull[bot] merged 9 commits into
Penguinjanator:mainfrom
Comfy-Org:main

Conversation

@pull

@pull pull Bot commented Aug 13, 2026

Copy link
Copy Markdown

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

DrJKL and others added 9 commits August 12, 2026 21:28
## Summary

Adds a reusable agent skill for finding repeated test setup and teardown
and moving it to the narrowest correct lifecycle owner.

## Changes

- **What**: Adds framework-neutral consolidation principles and
workflow, with progressively loaded Vitest and Playwright references.

## Review Focus

- Whether the main skill remains framework-neutral and principle-driven
- Whether the runner-specific references capture the important lifecycle
boundaries without duplicating canonical testing guidance

---------

Co-authored-by: Amp <amp@ampcode.com>
## Summary

Use the Playwright CI ComfyUI container for local development and Amp
orbs without running cloud and local frontends together.

## Changes

- **What**: Use `GH_TOKEN` plus a username derived through `gh api
user`, with `COMFY_CI_CONTAINER_*` overrides and explicit fallback
messages.
- **What**: Fail CI when workflow and launcher container versions drift.
- **What**: Document local setup and Amp project credentials.

## Review Focus

Check mode selection in `.amp/services.yaml`, credential-gated image
pulls, the public-source fallback, and exact container-version drift
validation.

## Testing

- `pnpm test:browser:local browserTabTitle.spec.ts --project=chromium`
(3 passed)
- Mocked credential/no-credential launcher paths and confirmed no
private pull occurs without both values
- Verified cloud mode skips Docker and the local backend; invalid modes
fail clearly
- Verified concurrent startup cannot stop the active backend
- ShellCheck, formatter, positive/negative drift checks, and service
health checks

---------

Co-authored-by: Amp <amp@ampcode.com>
*PR Created by the Glary-Bot Agent*

---

Markdown Note headers render with noticeably more space before the next
line in Vue nodes than in classic litegraph.

The two renderers use entirely separate markdown pipelines with
unrelated heading styles:

| | classic litegraph (UI 2.0 off) | Vue nodes (UI 2.0 on) |
|---|---|---|
| pipeline | Tiptap/ProseMirror DOM widget (`useMarkdownWidget.ts`) |
`marked` + DOMPurify + `v-html` (`WidgetMarkdown.vue`) |
| container | `.comfy-markdown .tiptap` | `.comfy-markdown-content` |
| heading rules | none — UA defaults (`0.67em` margins) | `margin-top:
2rem; margin-bottom: 1rem` + `line-height: 1.6` |

Those fixed `rem` margins never tracked `--comfy-textarea-font-size`, so
at the default 10px widget font a heading carried a **16px** gap under a
**15.7px** heading, and `line-height: 1.6` added another ~4.7px of
half-leading below the heading text.

## Change

Both renderers now share one em-relative heading rhythm, so margins
scale with the heading instead of the root font size:

```css
.comfy-markdown .tiptap h1, /* …h2–h6 */
.comfy-markdown-content h1, /* …h2–h6 */ {
  margin-block: 0.67em;
  line-height: 1.2;
}
```

`0.67em` / `1.2` are exactly what classic litegraph already resolved to,
so classic h1 is pixel-identical. The per-level `margin-top: 2rem;
margin-bottom: 1rem` declarations and their now-redundant `:first-child`
overrides are removed from `.comfy-markdown-content` (the existing
`*:first-child { margin-top: 0 }` still wins on specificity and keeps a
leading heading flush).

## Measured (default 10px widget font, 100% zoom)

| | before | after |
|---|---|---|
| Vue h1 `margin-bottom` | 16px (fixed) | 10.53px (0.67em) |
| Vue h1 line box | 25.14px | 18.86px |
| Vue h1 top → paragraph top | 41.1px | 29.4px |
| Vue h2 `margin-top` / `margin-bottom` | 32px / 16px | 8.61px / 8.61px
|
| classic h1 `margin-bottom`, line box | 13.4px, 24px | **unchanged** |

Margin-to-heading ratio is now 0.67 at every level in both renderers
(h1/h2/h3 verified). Margins also scale correctly now: at
`Comfy.TextareaWidget.FontSize: 20` the Vue h1 margin becomes 21.06px
instead of remaining stuck at 16px.

Classic h2–h6 tighten slightly (e.g. h2 `margin-block` 12.45px →
10.05px) because they previously followed the UA's inverted scale, where
*smaller* headings got *larger* margins. h1 — the reported case — is
untouched.

## Verification

- Reproduced live against a running backend + dev server, toggling
`Comfy.VueNodes.Enabled` and measuring `getComputedStyle` in both
states, at 100% and 220% canvas zoom.
- `pnpm lint` (stylelint + oxlint + eslint), `pnpm format:check` pass.
- `WidgetMarkdown`, `useMarkdownWidget`, `markdownRendererUtil` unit
tests pass (36 passed, 4 skipped).
- No test added — per `AGENTS.md`, tests should not depend on
non-behavioral features like styles.

## Notes

- `.comfy-markdown-content` is also used by `WidgetTextPreview.vue`,
which picks up the same tightened rhythm.
- The node help panel (`NodeHelpContent.vue`) keeps its own duplicate
`2rem`/`1rem` heading rules — a different surface, left alone
deliberately.
- Remaining absolute difference between the two renderers comes from
their different heading font-size scales (classic uses UA
`2em`/`1.5em`/`1.17em`; Vue uses `22/14`, `18/14`, `16/14` of the base)
and body `line-height` (`1.6` vs `normal`). Those are design decisions,
not spacing bugs, so they are out of scope here.

Screenshots below are the same Markdown Note at 220% zoom.

## Screenshots

![Before - Vue nodes (UI 2.0 on): large gap under each
heading](https://pub-0c501c1cf38f477fa8efc67068523b33.r2.dev/sessions/5d01fa01a4a3d65a6a5b4010dee30304c3a16309205cf8dc8a54c1d815881816/pr-images/1786511639295-77692117-5639-498f-bbfb-058ba69fe29f.png)

![After - Vue nodes (UI 2.0 on): heading spacing tightened to match
classic](https://pub-0c501c1cf38f477fa8efc67068523b33.r2.dev/sessions/5d01fa01a4a3d65a6a5b4010dee30304c3a16309205cf8dc8a54c1d815881816/pr-images/1786511639554-9fe3d81c-0750-43f1-9365-6dccd604565b.png)

![Before - classic litegraph (UI 2.0
off)](https://pub-0c501c1cf38f477fa8efc67068523b33.r2.dev/sessions/5d01fa01a4a3d65a6a5b4010dee30304c3a16309205cf8dc8a54c1d815881816/pr-images/1786511639821-40578941-e27d-4259-a604-8e8ea4cd3d12.png)

![After - classic litegraph (UI 2.0 off): h1 unchanged, h2 slightly
tighter](https://pub-0c501c1cf38f477fa8efc67068523b33.r2.dev/sessions/5d01fa01a4a3d65a6a5b4010dee30304c3a16309205cf8dc8a54c1d815881816/pr-images/1786511640099-e9903a31-beee-4b2a-825b-df78eff249dc.png)

---------

Co-authored-by: glary-bot <bot@glary.dev>
## Summary

Split the existing user-facing and correctness repairs out of #15062 so
the framework migration can be reviewed independently.

## Changes

- Applies the locale-data repairs already present in #15062 onto current
`main`, preserving translations that were independently updated on
`main` in the meantime.
- Repairs the stale, corrupted, missing, and leftover locale values
already included in #15062.
- Fixes the custom-node locale workflow copy path (`temp/diff`, not
`ComfyUI_frontend/temp/diff`).
- Contains no i18n framework or dependency migration and no newly
authored translations.

## Validation

- Semantic three-way comparison against #15062 original repair patch for
all 26 affected locale files.
- JSON parse and format validation passed.
- Pre-commit checks, including `knip`, passed.

Extracted mechanically from #15062; no repair content was reauthored.
## Summary

Enrolls ComfyUI_frontend in the shared advisory PR risk grader with a
repo-specific risk map and a controlled bot runbook that proves the full
R0-R3 range before merge.

## Changes

- **What**: Adds the pinned reusable grader caller, maps actual frontend
risk surfaces (auth, billing, workflow serialization, extension/API
contracts, rollout/build/core infrastructure, and low-risk
docs/i18n/tests/storybook), and registers the `comfy-pr-bot` R0 demo
lane. Grading is deterministic: `grade = worst(path floor, provenance,
reversibility)`. It syncs exactly one advisory `risk:*` label;
`risk-dispute` remains the human override path.
- **Breaking**: None. Labels are advisory and do not gate, route, or
merge PRs.
- **Dependencies**: None. The workflow pins `Comfy-Org/github-workflows`
at `e4a8f7cd4a073da082b03950136530d4df50738f`.

## Verification

- `risk:R0`: #15034, bot-authored runbook test change after all checks
became green.
- `risk:R1`: #14890, human-authored low-risk docs change.
- `risk:R2`: #14891 and #14892, store changes.
- `risk:R3`: #14893 and this PR, grader-owned configuration or workflow
changes.

## Review Focus

- The risk map and runbook registry are read from the base ref, so a PR
cannot lower its own grade.
- `default_tier` remains `R0`; human provenance floors ordinary PRs at
`R1`.
- R0 requires all three axes to be R0. Pending or failed checks raise
reversibility to R2.
- Workflow dispatch supports enrollment backfill and manual re-grading;
the `RISK_CONFIG` repository variable remains the kill switch.

Created by Codex

---------

Co-authored-by: huang47 <157390+huang47@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…outes (IR-105) (#15063)

## Summary

Two durable fixes for the IR-105 splash-screen hang incident.

### Fix 1 — Bootstrap auth wait timeout (`bootstrapStore.ts`)

**Root cause:** `until(isInitialized).toBe(true)` and
`until(isAuthenticated).toBe(true)` in `startStoreBootstrap` have no
timeout. A stale Firebase session or broken auth response hangs
bootstrap silently and indefinitely — no error, no log, just a forever
splash screen.

**Fix:** Extract `waitForCloudAuth()` with:
- 16 s timeout (matching `router.ts:176` and `WorkspaceAuthGate.vue:78`
— existing convention)
- One retry after 3 s backoff
- On second timeout: `captureException` to Sentry + **continue
bootstrap** rather than blocking

This means the worst case is now 35 s to a usable (logged-out) state
instead of infinity.

### Fix 2 — Catch-all route for unknown paths (`router.ts`)

**Root cause:** A request to e.g. `cloud.comfy.org/woiadawd` gets a 200
+ app shell from the static host, Vue boots, finds **no matching
route**, and the global auth guard's `until(isInitialized)` then hangs
(see Fix 1). Even with Fix 1, a no-match route leaves the app on the
splash screen.

**Fix:** Add `{ path: '/:pathMatch(.*)*', redirect: '/' }` at the end of
the route list. Unknown paths redirect to root; the global auth guard
then sends unauthenticated users to `/cloud/login` as normal.

## Red-Green Verification

| Commit | Purpose |
|--------|---------|
| `test: add failing tests for unbounded auth wait in
startStoreBootstrap` | 🔴 Proves test catches the bug — the
"gives up" test times out in 5 s against the unpatched code |
| `fix: bound auth wait in startStoreBootstrap and add catch-all route`
| 🟢 Both new tests pass, all 18 tests in the two affected
files pass |

## Relation to open PRs

- Supersedes / closes the scope of #15032
(`fix/bootstrap-auth-wait-timeout`) — same fix, same tests. If reviewers
prefer to land #15032 first this PR can drop Fix 1.
- Companion to #15022 (marketing-site redirect) and #15026 (`/login` →
`cloud-login` route, already on main).

## Test Plan

- [x] `pnpm vitest run src/stores/bootstrapStore.test.ts` — 7/7 pass
(including 2 new timeout tests)
- [x] `pnpm vitest run
src/platform/cloud/onboarding/onboardingCloudRoutes.test.ts` — 11/11
pass
- [x] `pnpm typecheck` — clean
- [x] `pnpm exec eslint src/stores/bootstrapStore.ts src/router.ts` —
clean
- [ ] CI green (Playwright, Storybook, Codecov)

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

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: GitHub Action <action@github.com>
Pressing spacebar while dragging vue nodes will now initiate a pan
operation.

Followup to #8998

---------

Co-authored-by: Alexander Brown <drjkl@comfy.org>
Co-authored-by: Amp <amp@ampcode.com>
…5062)

## Summary

Replace the `@lobehub/i18n-cli` translation step with an in-house
pipeline (`scripts/i18n/`) so changed English source strings are
retranslated, removed keys are pruned, and protected syntax survives
translation byte-for-byte.

The user-facing and correctness repairs were split into #15137 (merged).
This PR is strictly the framework migration.

## Changes

- `pnpm locale` now runs `scripts/i18n/update-locales.ts`. It records
the English sources of the last successful run as git blob hashes in
`src/locales/.source-manifest.json`, diffs them against the current
`src/locales/en/*.json` to invalidate changed and deleted keys, and
rebuilds every output locale from the English structure.
- Validates interpolation placeholders and protected literals (`<Picture
N>`, `17k+5`, quoted `match` and `max`), retries corrupted translations,
and aborts without writing if corruption persists.
- `pnpm locale:check` reports pending work offline.
- Normalizes English entry files to the committed serialization before
hashing so manifest hashes match workflow commits regardless of
`collect-i18n` and formatting order.
- Removes `@lobehub/i18n-cli` and `.i18nrc.cjs`; configuration now lives
in `scripts/i18n/config.ts`.
- Translation requests go through the official `openai` SDK (the one new
dependency, dev-only with no transitive dependencies), which owns
transport retries, timeouts, and typed completion parsing; the pipeline
keeps only domain-level retries for truncated or malformed completions.
- Uses a blobless full-history checkout in the i18n workflows so
recorded English source blobs can be fetched on demand.

## Review Focus

Manifest advancement only after full validation; rebuild-from-source
semantics; translation retry and validation behavior; and
source-provenance handling.

Depends on #15137 (merged). Supersedes #15024.


[FE-1499](https://linear.app/comfyorg/issue/FE-1499/fix-i18n-release-workflow-changed-source-strings-stay-stale-and)
Patch version increment to 1.51.3

**Base branch:** `main`

---------

Co-authored-by: christian-byrne <72887196+christian-byrne@users.noreply.github.com>
Co-authored-by: github-actions <github-actions@github.com>
@pull pull Bot locked and limited conversation to collaborators Aug 13, 2026
@pull pull Bot added the ⤵️ pull label Aug 13, 2026
@pull
pull Bot merged commit e236151 into Penguinjanator:main Aug 13, 2026
22 of 25 checks passed
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants