From 0935b37b92c07c66aecb4ac4305095ffce75de0e Mon Sep 17 00:00:00 2001 From: Adachi Date: Wed, 28 Oct 2026 11:39:24 +0800 Subject: [PATCH] Prepare stable 1.0.0 release --- .github/workflows/ci.yml | 3 +++ CHANGELOG.md | 5 +++++ README.md | 8 ++++---- README.zh-CN.md | 8 ++++---- ROLLBACK.md | 8 +++++--- VERIFICATION.md | 2 ++ examples/05-inline-crop-blend.json | 4 ++-- pyproject.toml | 2 +- registry/README.md | 11 +++++------ 9 files changed, 31 insertions(+), 20 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f76c203..6c7dc47 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -37,6 +37,9 @@ jobs: - name: Check comparison result history run: node --experimental-default-type=module tests/test_compare_history.mjs + - name: Check upload transport + run: node --experimental-default-type=module tests/test_upload_transport.mjs + - name: Check crop geometry run: | node --experimental-default-type=module tests/test_crop_geometry.mjs diff --git a/CHANGELOG.md b/CHANGELOG.md index 33ccaba..3bf1cc6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## 1.0.0 + +- First stable release of the inline inpainting workspace, comparison, crop blending and workflow switching tools. +- Includes in-memory comparisons and source upload progress from 0.9.0. Update the bilingual crop instructions and example to match the current editing controls. + ## 0.9.0 - Keep new comparison originals and results in a bounded in-memory cache instead of creating preview files. Existing disk-backed preview references remain supported; adopted sources and layers remain persistent input files. The cache defaults to 512 MiB, adjustable with `ADACHI_COMPARE_MEMORY_MIB` (64–4096 MiB); restart or eviction expires old previews. diff --git a/README.md b/README.md index d6b66a3..c7edc28 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ In Crop & Blend mode, choose one of six 64-aligned presets spanning 512–2048 p Generate, inspect the result in **Image Compare**, then click **Adopt this result** to return it. There is no feedback wire and generation does not automatically replace the editor image. Use the inpaint node's **image** output for comparison; its `crop` output is the sampling canvas and can have a different size. [Open the ready-wired example](examples/05-inline-crop-blend.json). -After adoption, **◐ blend layers** shows the original under the new result. Paint to keep new pixels, hold **Alt** to restore original pixels, and use soft brush edges to blend seams. This layer mask is independent of the repaint mask and is kept for another pass at the same coordinates. Before merging, **hold the right mouse button** to preview the original; release it to restore the workspace without changing either mask or the selection. **✓** merges the visible layers. Once merged, right-click releases the selection, then the next left-click locks a new region. The **↶ Undo** button sits to the right of ✓ and undoes mask strokes in the active mask or blend layer. Hover the bottom controls for instructions; canvas tooltips follow the current editing stage. There is no crop version timeline. For a generated batch, choose the desired result in Image Compare before adopting it. A result tagged with an older crop is rejected after selecting another region. +After adoption, the result appears in the selected area and the editor returns to the repaint mask, ready for another pass. Select **◐ blend layers** to paint the layer mask: brush keeps new pixels, **Alt** restores original pixels, and soft edges blend seams. The blend mask is independent of the repaint mask. While editing the blend mask, **hold the right mouse button** to preview the original and release it to return to the workspace. To select a new region, switch to **◌ repaint mask** and right-click (or press Escape); the visible result is merged before the selection is released. Left-click places the next region. The **↶ Undo** button undoes strokes in the active mask. Hover the bottom controls for instructions. For a generated batch, select the desired result in Image Compare before adopting it. A result tagged with an older crop is rejected after selecting another region. ### Inpaint the whole image or just the masked region @@ -129,7 +129,7 @@ git clone https://github.com/adachi0130/Adachi-Inpaint-Workbench.git ### Other installation options -- **ComfyUI Manager:** use its Git URL installation option, if available, with this repository's URL. Git URL installation and visibility in Manager's search index are separate; see the [publishing notes](registry/README.md). +- **ComfyUI Manager:** search for `Adachi-Inpaint-Workbench` in the Registry-backed Manager. Version availability depends on Registry validation; check the [Registry listing](https://registry.comfy.org/nodes/adachi-inpaint-workbench). You can also use the Manager's Git URL installation option with this repository's URL. - **ZIP:** [download the repository](https://github.com/adachi0130/Adachi-Inpaint-Workbench/archive/refs/heads/main.zip), extract it, and place the plugin folder at `ComfyUI/custom_nodes/Adachi-Inpaint-Workbench/`. Keep `web/`, `backend.py` and `__init__.py` together. - **Windows installer:** from the extracted plugin folder, run the following, pointing to the ComfyUI directory containing `main.py`: @@ -193,8 +193,8 @@ For modular sampling: `Prepare.pixels → VAE Encode → Set Latent Noise Mask | Temporary eraser | Hold `Alt`; release to return to the previous tool | | Brush size | `Ctrl` + wheel, or `[` / `]` | | Brush hardness | `Shift` + wheel | -| Preview original before merging | Hold right mouse button; release to restore the workspace | -| Release crop selection | After merging with ✓ (or with no adopted layer), right-click, then left-click to select a new region | +| Preview original while blending | In **◐ blend layers**, hold right mouse button; release to restore the workspace | +| Release crop selection | In **◌ repaint mask**, right-click or press Escape; left-click to select a new region | | Undo / redo | `Ctrl+Z` / `Ctrl+Shift+Z`, or `Ctrl+Y` | | Image zoom / pan, when unpinned | Wheel / Space + drag, middle-button drag, or the pan tool (`H`) | | Keep the image fitted | Pin beside **Fit**; click again to unlock | diff --git a/README.zh-CN.md b/README.zh-CN.md index 418548c..234c792 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -74,7 +74,7 @@ 先生成,在**图像对比**中查看,满意后点击**采用此结果**,才会嵌回当前裁切位置;没有回接输入线,也不会生成后自动替换。比较结果使用重绘节点的 **image** 输出;`crop` 是采样画布,尺寸可能不同。[已连好的示例](examples/05-inline-crop-blend.json)。 -采用后自动进入 **◐ 图层融合**:底层原图、上层重绘结果,画笔保留新图,按住 **Alt** 擦回原图,软笔刷可融合接缝。融合蒙版与重绘蒙版相互独立,同一区域继续生成会保留融合蒙版。合并前**按住右键看原图,松开恢复工作区**,不改动蒙版或选区。**✓** 合并当前可见图层;合并后在图片内右键取消选定,再左键选择新区域。**↶ 撤销**位于 ✓ 右边,可撤销当前重绘蒙版或融合蒙版的涂抹。鼠标悬停底部控件可查看操作说明,画布提示也会跟随当前编辑阶段变化。没有裁切版本列表。批量生成时,在图像对比中选中想要的结果再采用;换到其他选区后,带有旧选区标记的结果会拒绝回贴,避免贴错位置。 +采用后结果显示在选区中,编辑器回到重绘蒙版,可直接继续生成。点击 **◐ 图层融合**可编辑融合蒙版:画笔保留新图,按住 **Alt** 擦回原图,软笔刷可融合接缝;融合蒙版与重绘蒙版相互独立。编辑融合蒙版时,**按住右键看原图,松开恢复工作区**。要选择新区域,请切回 **◌ 重绘蒙版**后右键,或按 Escape;当前可见结果会先合并,再取消选定,接着左键选择新区域。**↶ 撤销**可撤销当前蒙版的涂抹,鼠标悬停底部控件可查看说明。批量生成时,在图像对比中选中想要的结果再采用;换到其他选区后,带有旧选区标记的结果会拒绝回贴。 ### 整图重绘与蒙版区域重绘 @@ -129,7 +129,7 @@ git clone https://github.com/adachi0130/Adachi-Inpaint-Workbench.git ### 其他安装方式 -- **ComfyUI Manager:**如果当前版本提供 Git URL 安装,可以填入本仓库地址。Git URL 安装与能否在 Manager 搜索索引中找到是两回事,收录说明见[发布文档](registry/README.md)。 +- **ComfyUI Manager:**可搜索 `Adachi-Inpaint-Workbench`;各版本的可用性取决于注册表验证结果,参见[注册表页面](https://registry.comfy.org/nodes/adachi-inpaint-workbench)。也可以使用 Manager 的 Git URL 安装方式填写本仓库地址。 - **ZIP:**[下载仓库压缩包](https://github.com/adachi0130/Adachi-Inpaint-Workbench/archive/refs/heads/main.zip),解压后放到 `ComfyUI/custom_nodes/Adachi-Inpaint-Workbench/`,保留完整的 `web/`、`backend.py` 和 `__init__.py`。 - **Windows 安装脚本:**在解压后的插件目录运行以下命令,路径指向包含 `main.py` 的 ComfyUI 目录: @@ -193,8 +193,8 @@ Refiner 输入是可选项。只有需要兼容的第二阶段模型时才连接 | 临时橡皮擦 | 按住 `Alt`,松开后恢复之前的工具 | | 调整笔径 | `Ctrl` + 滚轮,或 `[` / `]` | | 调整硬度 | `Shift` + 滚轮 | -| 合并前临时看原图 | 按住右键;松开恢复当前工作区 | -| 取消裁切选定 | 点击 ✓ 合并后(或没有回贴图层时),图片内右键,再左键选择新区域 | +| 融合时临时看原图 | 在 **◐ 图层融合**中按住右键,松开恢复工作区 | +| 取消裁切选定 | 在 **◌ 重绘蒙版**中右键或按 Escape,再左键选择新区域 | | 撤销 / 重做 | `Ctrl+Z` / `Ctrl+Shift+Z`,或 `Ctrl+Y` | | 未固定时的图片缩放 / 移动 | 滚轮 / 空格拖动、中键拖动,或移动工具 `H` | | 保持图片适应 | 点击「适应」旁的图钉,再点一次解除 | diff --git a/ROLLBACK.md b/ROLLBACK.md index 24203d2..94a7ccd 100644 --- a/ROLLBACK.md +++ b/ROLLBACK.md @@ -1,11 +1,13 @@ # Git versions and rollback -The current version is **v0.9.0**. Git history lives in the source repository. The installed custom-node folder may be a ZIP/file copy without its own `.git`; do not run rollback commands in ComfyUI's parent repository. +The current version is **v1.0.0**. Git history lives in the source repository. The installed custom-node folder may be a ZIP/file copy without its own `.git`; do not run rollback commands in ComfyUI's parent repository. Before installing, the installer saves the previous plugin directory under `ComfyUI/user/adachi-workbench-backups/`. Restore that ZIP to roll back a copied installation. For a Git clone, use the tags below. | Tag | Contents | |---|---| +| `v1.0.0` | First stable release with current bilingual crop instructions | +| `local-before-v1.0.0` / `v0.9.0` | Source before stable-release documentation and metadata | | `v0.9.0` | In-memory comparison previews and real upload progress | | `local-before-v0.9.0` / `v0.8.2` | Source before memory previews and upload progress | | `v0.8.2` | Refresh different-sized uploads and synchronize inpaint dimensions | @@ -45,13 +47,13 @@ To undo only this update, run in the plugin folder: ```powershell git status --short -git switch --detach local-before-v0.9.0 +git switch --detach local-before-v1.0.0 ``` Return to this version with: ```powershell -git switch --detach v0.9.0 +git switch --detach v1.0.0 ``` Restart ComfyUI and hard-refresh the browser (`Ctrl+F5`) after switching versions. diff --git a/VERIFICATION.md b/VERIFICATION.md index 82fe088..579af29 100644 --- a/VERIFICATION.md +++ b/VERIFICATION.md @@ -1,5 +1,7 @@ # Verification record +- 1.0.0: all 54 CPU backend tests and all seven JavaScript regression suites pass; every frontend module passes syntax checking and all bundled examples parse as JSON. The release updates documentation and metadata on top of 0.9.0; no full model generation was run for this release. + - 0.9.0: 54 backend CPU tests cover in-memory PNG pixels, atomic batch storage, LRU eviction, cached execution invalidation and oversized batch rejection. Actual CPU image queues in frontend 1.52.7 and both node renderers verify comparison history, download bytes, ordinary and crop adoption, mask retention, layer blending, workflow reload and legacy disk-backed references; no new comparison temp files are created. Real Chrome network throttling confirms intermediate upload percentages, loading indication, user header, failure and concurrent upload behavior in both renderers. Proxy paths and auth fallback were separately tested; the user's actual cloud environment and full model inference were not tested. - 0.8.2: Chrome interaction with an isolated ComfyUI and frontend 1.52.7 passes in classic nodes and Nodes 2.0. Actual uploads confirm different-size source pixels and canvas display update, same-size masks are preserved, connected inpaint dimensions follow ordinary uploads and crop selection, switching back restores image dimensions, a newly connected inpaint node receives the size, and reopening a saved workflow preserves manually saved dimensions. No model inference was run. diff --git a/examples/05-inline-crop-blend.json b/examples/05-inline-crop-blend.json index ac8b059..69e1bd1 100644 --- a/examples/05-inline-crop-blend.json +++ b/examples/05-inline-crop-blend.json @@ -673,10 +673,10 @@ "outputs": [], "properties": {}, "widgets_values": [ - "Inline Mask: Crop & Blend\n1. Select your checkpoint and upload the full source.\n2. Choose Crop & Blend and a size preset, then left-click to lock the black dashed frame. Inpaint width/height follow the crop automatically.\n3. Paint inside the empty crop mask and run the workflow.\n4. Inspect Image Compare and click Adopt this result. The patch returns to this crop; Inline Mask has no result input.\n5. Paint the blend layer mask to keep new pixels; Alt restores original pixels. The repaint mask is retained.\n6. full_image is the current adopted full composite. Before Merge, hold right-click to preview the original and release to restore the workspace. Click the check mark to merge; then right-click releases the selection and left-click chooses a new area. Undo is the return arrow after Merge. Hover the bottom controls for instructions." + "Inline Mask: Crop & Blend\n1. Select your checkpoint and upload the full source.\n2. Choose Crop & Blend and a size preset, then left-click to lock the black dashed frame. Inpaint width/height follow the crop automatically.\n3. Paint inside the empty crop mask and run the workflow.\n4. Inspect Image Compare and click Adopt this result. The patch returns to this crop; Inline Mask has no result input.\n5. Click the blend button to edit the blend mask: paint keeps new pixels and Alt restores original pixels. The repaint mask is retained.\n6. full_image is the current adopted full composite. In blend mode, hold right-click to preview the original. Switch to the repaint mask and right-click or press Escape to merge the visible result and release the selection, then left-click a new area. Hover the bottom controls for instructions." ], "widgets_values_named": { - "text": "Inline Mask: Crop & Blend\n1. Select your checkpoint and upload the full source.\n2. Choose Crop & Blend and a size preset, then left-click to lock the black dashed frame. Inpaint width/height follow the crop automatically.\n3. Paint inside the empty crop mask and run the workflow.\n4. Inspect Image Compare and click Adopt this result. The patch returns to this crop; Inline Mask has no result input.\n5. Paint the blend layer mask to keep new pixels; Alt restores original pixels. The repaint mask is retained.\n6. full_image is the current adopted full composite. Reselect merges it before choosing a new area." + "text": "Inline Mask: Crop & Blend\n1. Select your checkpoint and upload the full source.\n2. Choose Crop & Blend and a size preset, then left-click to lock the black dashed frame. Inpaint width/height follow the crop automatically.\n3. Paint inside the empty crop mask and run the workflow.\n4. Inspect Image Compare and click Adopt this result. The patch returns to this crop; Inline Mask has no result input.\n5. Click the blend button to edit the blend mask: paint keeps new pixels and Alt restores original pixels. The repaint mask is retained.\n6. full_image is the current adopted full composite. Reselect merges it before choosing a new area." }, "color": "#432", "bgcolor": "#653" diff --git a/pyproject.toml b/pyproject.toml index 97242de..819e3e9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "adachi-inpaint-workbench" -version = "0.9.0" +version = "1.0.0" description = "Inline mask painting and WebUI-style inpainting nodes for ComfyUI" requires-python = ">=3.10" license = { file = "LICENSE" } diff --git a/registry/README.md b/registry/README.md index 389e10b..3187fc4 100644 --- a/registry/README.md +++ b/registry/README.md @@ -1,22 +1,21 @@ # Manager / Registry publishing -A public GitHub repository does not by itself mean the plugin is listed in the Manager search index or in the Comfy Registry. -The previous Manager listing submission is [PR #3378](https://github.com/Comfy-Org/ComfyUI-Manager/pull/3378). It was closed without merging; it is not confirmation that the plugin is searchable. Check the live Registry/Manager index for current availability. +The node is registered under publisher `adachi0130` in [Comfy Registry](https://registry.comfy.org/nodes/adachi-inpaint-workbench). Version visibility and installation can depend on Registry validation, so check the current status there. ## Manager listing [manager-entry.json](manager-entry.json) records the legacy list entry submitted to [ComfyUI-Manager](https://github.com/Comfy-Org/ComfyUI-Manager). For current registration requirements, follow the [official Manager instructions](https://github.com/Comfy-Org/ComfyUI-Manager#how-to-register-your-custom-node-into-comfyui-manager) and the Registry publishing guide below. -Until it is listed you can still install through the Manager's Git URL option, using `https://github.com/adachi0130/Adachi-Inpaint-Workbench`. +You can also install through the Manager's Git URL option, using `https://github.com/adachi0130/Adachi-Inpaint-Workbench`. ## Comfy Registry -Per the [official publishing guide](https://docs.comfy.org/registry/publishing), the first publish requires you to create your own Publisher and API key. +Per the [official publishing guide](https://docs.comfy.org/registry/publishing), publishing requires the registered Publisher and its API key. -1. Sign in at [Comfy Registry](https://registry.comfy.org/) and create a Publisher, then note the actual Publisher ID. +1. Sign in at [Comfy Registry](https://registry.comfy.org/) as the owner of publisher `adachi0130`. 2. Check `[tool.comfy].PublisherId` in `pyproject.toml` (currently `adachi0130`) and confirm it matches the Publisher you own before publishing. 3. In the repository Settings → Secrets and variables → Actions, add `REGISTRY_ACCESS_TOKEN` with the Registry publishing API key. 4. Run **Publish to Comfy Registry** manually from the Actions tab and check the publish and platform validation results. -The publishing workflow is manual-only. A Publisher ID in project metadata does not prove that an API key is configured or that a Registry release has been published. +The publishing workflow is manual-only. Check its result and the Registry version status after publishing. A Registry version cannot be overwritten once published, so later releases have to bump the version in `pyproject.toml`.