Skip to main content

CMS Changelog Sync

Push draft release notes to Strapi (release-notes content type). Docs changelog stays full; CMS uses committed staging with popup-sized copy.

Architecture

Three separate steps — stop for human review between each:
Never edit docs zh/changelog/ for CMS. Never auto-publish in Strapi. Never use pnpm translate for CMS — that pipeline is for Mintlify docs only.

Three-step workflow (local)

pnpm cms:prepare without --en-only / --translate-only prints help and exits — use the step-specific scripts above.

Translation workflow (CMS staging)

Step 2 only. Input = simplified EN staging, not docs changelog.
Key points:
  • cms:prepare:locales does not re-simplify English — it reads each project’s own staging EN (staging/en/ and staging/cloud/en/)
  • If staging EN is missing the version, translate fails — run cms:prepare:en first
  • Target locales: zh, ja, ko, fr, ru, es (see cms-config.json)
  • --force re-translates existing locale blocks (common after manual EN edits)
  • Never copy comfyui locale files onto cloud; cloud campaign shortlinks live on cloud EN

Environment (.env.local)

CI: CMS_BASE_URL / TRANSLATE_API_BASE_URL → GitHub Variables; tokens → Secrets.

Simplification rules (EN popup)

Prompt: .github/scripts/cms/cms-simplify-prompt.ts
Config: .github/scripts/cms/cms-config.jsonsimplify
Style: principle-only prompt in cms-simplify-prompt.ts (no concrete version examples — avoids LLM contamination). prepare:en copies docs URLs and local-length copy into Cloud. After it runs, rewrite Cloud EN (links and wording) before translating. Never invent URLs. Copy length (local vs Cloud): Cloud popup users skim. After merge, shorten Cloud bullets so they do not list every node, mode, or task type. One short clause is enough: added the model, or one capability. Local CMS (staging/en/) and docs changelog/index.mdx can keep the fuller scope (which nodes, which modes). Do not shorten local to match Cloud. Example: docs/local may say H3 Max landed on text-to-video, first-last-frame, and reference nodes. Cloud: Added H3 Max model support. Lifecycle bullets stay on Cloud; only shorten the wording, do not omit the deprecation, removal, replacement, or EOL. Resolve each feature bullet before cms:prepare:locales. Search these sources every time a new version lands: Match a template by name, title, or models to the changelog item. Match a blog post only if it covers this product or version (MiniMax H3 day-0 is not MiniMax H3 Max). Video templates: when several templates exist, pick one by suffix on name, in this order: r2v → i2v → t2v. Example: api_minimax_h3_max_r2v over _i2v / _t2v. If none of those suffixes exist, use the remaining matching template (flf2v, edit, and similar). Cloud URL shape: https://cloud.comfy.org/?template=<name> (no UTM unless the user supplied one). Do not put Cloud ?template= URLs on docs or local popup. Do not copy local blog/PR links onto Cloud when a template (or user UTM) exists. After prepare:en merges comfyui → cloud, replace Cloud bullets that still point at PRs if the index has a template.

ComfyUI-WIKI commits (omit from changelog)

When curating changelog/index.mdx from ComfyUI git history, do not add bullets for commits routinely opened by ComfyUI-WIKI — they are dependency/content syncs, not core release features: Also omit standalone frontend package semver bumps unless tied to a user-visible fix worth its own bullet. CMS simplify must never promote WIKI-only items into popup copy even if they appear in the full docs block.

Node lifecycle (deprecation, removal, replacement, EOL)

When curating changelog/index.mdx or simplifying CMS staging, do not skip user-facing node lifecycle changes. These are not “minor cleanup.” Users need to know a node or model option is going away, already gone, or swapped for a successor. Section placement:
  • Partner / API nodes (including a partner model option dropped from an existing node): put the bullet under Partner Node Updates. Partner removals, deprecations, replacements, and EOL are first-class partner updates, not an optional extra.
  • Core / built-in nodes (non-partner): put the bullet under New Node Updates (or New Nodes if that is the heading already in the docs block). For CMS, emit New Node Updates when the only reason to include that section is a lifecycle change, even if nobody asked to list ordinary new nodes.
Writing rules:
  • Prefer a title that states the event: Kling EOL, Reve deprecated, Google Veo with “Removed …” in the body. Do not bury a removal inside an unrelated “added X” bullet.
  • If the same PR both adds a successor and removes the old node, you may use one bullet that names both. If they are separate products, use two bullets (add under the usual new-item style; lifecycle under this rule).
  • Keep Cloud copy short, but still mention the event: Removed retiring Veo 2 and Veo 3.0. Do not drop lifecycle bullets when shortening Cloud.
  • CMS simplify must keep these items. They are not in the Drop list. Do not treat “removed” or “deprecated” as internal refactors.

Example staging shape

Placeholders only. New Node Updates is optional for ordinary new nodes, and required when a core/built-in lifecycle change is in the source:
Only when a human asks to include ordinary new nodes, or when a core/built-in node is deprecated, removed, replaced, or EOL:
Sync adds header: # ComfyUI vX.Y.Z via format-cms-content.ts.

Projects (comfyui + cloud)

cms:prepare may generate both projects so staging stays mirrored. For cms:sync and cms:publish, agents must treat comfyui as the default project and pass --project comfyui. Only sync or publish cloud after the user explicitly confirms cloud, using --project cloud. Same changelog content; Strapi project field and CMS header differ (# ComfyUI vs # Cloud). When prepare:en targets both projects, it runs the LLM once on comfyui, then merges those version blocks into cloud while keeping any tracking shortlinks already on cloud EN for that version. prepare:locales translates each project from its own staging EN. It does not copy comfyui locale files onto cloud. With --project cloud alone, cloud is prepared directly. Sync/publish must be project-scoped by agents: --project comfyui first, then --project cloud only after explicit cloud approval. Single project: --project comfyui, --project cloud, or CMS_PROJECT=<project>. Mark a version high attention:

Commands

Flags (after --):
  • --force — re-simplify/re-translate even if staging has the version; on sync, update already-published CMS entries (default skips published)
  • --preview / --dry-run — no API writes
  • --project cloud — single project only (default = both)
  • v0.25.1 — explicit version(s)
Env:
  • CMS_SYNC_ALL=1 — include already-published versions (backfill)
  • Without it, local default = all unpublished EN versions per published-versions.json
Requires Bun. Loads .env.local automatically.

Standard workflow

New release version

  1. Add full <Update> block to changelog/index.mdx (docs quality, unchanged). Set each bullet URL using Bullet links (blog → PR → repo for docs). If the release deprecates, removes, replaces, or EOLs a node (especially a Partner Node), add that under Partner Node Updates or New Node Updates per Node lifecycle.
  2. Step 1 — Simplify EN — review before translating:
    Inspect: .github/scripts/cms/staging/en/changelog/index.mdx (blog/PR/repo, fuller copy). Rewrite .github/scripts/cms/staging/cloud/en/changelog/index.mdx: user UTM or ?template= from the index, and shorter bullets (model support, not every node). → stop until approved
  3. Step 2 — Translate — from approved staging EN only:
    Inspect: .github/scripts/cms/staging/zh/changelog/index.mdx (and other locales) → stop until approved
  4. Step 3 — Push ComfyUI drafts (only after user confirms staging):
  5. Publish ComfyUI after Strapi review:
  6. Cloud is separate: run cloud preview/sync/publish only after the user explicitly confirms cloud, using --project cloud.
  7. Commit .github/scripts/cms/staging/ and .github/scripts/cms/published-versions.json after publish.

Catch up all unpublished versions locally

After prompt or config changes

Re-run with --force. Staging without --force skips existing <Update> blocks.

Version selection logic

cms:sync skips locales already published per registry. Published EN in CMS is never overwritten.

Key files

Agent checklist

When user asks to update CMS release notes:
  • Confirm changelog/index.mdx has the new <Update> block
  • Resolve bullet URLs: search template index.json and blog.comfy.org/archive; Cloud = user UTM then ?template= (video r2v → i2v → t2v); docs/local = blog then PR then repo
  • Shorten Cloud EN bullets (added model support, skip node lists). Keep local/docs more detailed
  • Record node lifecycle in the matching section: partner deprecation / removal / replacement / EOL under Partner Node Updates; core/built-in lifecycle under New Node Updates. Name the replacement node when one exists. Do not drop these from docs or CMS
  • Omit ComfyUI-WIKI items (embedded docs, workflow templates, model blueprints) unless user explicitly asks
  • Run pnpm cms:prepare:en; rewrite Cloud EN links; show staging EN → wait for user approval
  • Run pnpm cms:prepare:locales (not cms:prepare:en) → wait for user approval
  • Run pnpm cms:preview -- --project comfyui ... then pnpm cms:sync -- --project comfyui ... only after user confirms staging
  • Run cloud cms:sync / cms:publish only after separate explicit cloud confirmation
  • Remind: Strapi publish is manual; then --write on published-versions
  • Commit .github/scripts/cms/staging/ together with published-versions.json after publish
  • Do not shorten docs changelog for CMS — staging is separate
  • Do not run bulk CMS_SYNC_ALL prepare/sync without user consent (many API calls)

Troubleshooting

  • docs-i18n-translate — Mintlify docs ja/zh/ko (pnpm translate)
  • docs-i18n-review — translation quality review (pnpm translate:review)

Docs vs CMS (do not confuse)