Commit Graph
41 Commits
Author SHA1 Message Date
WildAi 5dc56e2ce3 plan(P2.3): fix the Python 3.13 compatibility findings in the vendored closure 2026-10-23 17:19:26 +03:00
WildAi 80083c85b4 plan(P2.2): vendor the diffusers FeedForward and AdaLayerNorm classes 2026-10-23 17:12:39 +03:00
WildAi fc05d4fb49 plan(P2.1): strip the debug, breakage and pip-shim lines from the vendored closure 2026-10-23 16:53:44 +03:00
WildAi e7c08682d8 plan(P1): address review findings
Seven review findings of the P1 phase, each fixed at its root:

1. (high) The CI install list omitted PyYAML, but the vendored tree imports
   yaml eagerly (modules/deps/basicsr/utils/options.py:5), so the CI job
   failed on its first run. pyyaml is now installed and asserted by
   tests/test_ci_workflow.py.
2. (medium) tests/test_ci_workflow.py skipped the whole module without
   PyYAML. The module never skips now: a minimal indentation parser is the
   fallback, and it is cross-checked against the PyYAML parse.
3. (medium) Guard (e)'s self-test asserted that the tree still contains
   breakage (it would break exactly at P2.1). It now proves the guard
   instead; P2.1's work list is the scanner output and
   test_guard_e_flip_owner_covers_every_current_finding keeps plan and tree
   in sync.
4. (medium) The mock-fidelity tripwire skipped the comfy_api.latest
   symbols. Every mocked symbol is now checked against the real source
   (re-export / definition / instance attribute), including io.ComfyNode,
   ComfyExtension, ComfyAPI and ComfyAPISync, plus the reverse check that
   the mock invents nothing.
5. (low) The phase review listed committed work as outstanding and
   misstated the ruff ignore list; both are corrected.
6. (low) The reported whole-suite count was impossible; the phase review
   now carries the measured numbers.
7. (low) The root conftest installed the mocks unconditionally. The
   KEEP_NO_COMFY_MOCKS=1 opt-out lets the headless tier import the real
   comfy/comfy_api modules in-process.

tools/ci_env_sim.py runs the gate in an environment without the packages
the CI install list omits.
2026-10-23 16:34:37 +03:00
WildAi c0f9ea7c6f plan(P1): update the progress table and record the phase review
- plan section 9: P1.1-P1.5 marked done (2026-10-23)
- docs/audit/2026-10-23-p1-test-infrastructure.md: the deviations of the
  phase (the pytest collection artifact had to stay, the CI install list was
  completed, the ruff scope, the shadowed tests package)
- docs/2026-10-23-comfyui-keep-p1-phase.md: the phase review with the gate
  results
2026-10-23 15:59:10 +03:00
WildAi 12f8ba8c16 plan(P1.5): add the CI workflow with real install steps
.github/workflows/tests.yml:
- lint job: pip install 'ruff==0.8.*' (pinned major) + ruff check .
- test job: matrix python 3.10/3.12/3.13, CPU torch + torchvision from the
  pytorch CPU index, numpy<2.3 and tomli on 3.10 only, opencv-python-headless,
  einops, scipy, Pillow, tqdm, pytest; runs
  python -m pytest -q -m 'unit or mock_integration or headless' with
  COMFYUI_ROOT empty so the env-dependent tests skip
- publish.yml untouched
pyproject.toml: [tool.ruff] scope (E9+F, F401/F541 ignored) and the vendored
tree modules/deps excluded - with the default rules the repo has 127 findings.
tests/test_ci_workflow.py: parses the workflow and asserts the jobs, the
matrix, the install steps, COMFYUI_ROOT='' and that the CI command equals the
local gate command.
2026-10-23 15:55:10 +03:00
WildAi 56f8f0b4b1 plan(P1.4): add the headless bootstrap helper
tests/_headless.py resolves the ComfyUI tree from COMFYUI_ROOT and the weight
directory from KEEP_MODEL_DIR (no hardcoded paths, actionable errors), loads
extra_model_paths.yaml through utils.extra_config like the server does,
registers a package under an importable alias with __path__ set and can stub
only the ui preview helpers.
tests/test_headless_bootstrap.py proves the helper on a dummy package: alias
resolution, submodule import, the missing-environment-variable errors and the
absence of machine-specific paths.
2026-10-23 15:51:21 +03:00
WildAi f47d9e6123 plan(P1.3): add the source-text structure guards
tests/test_structure.py implements the five plan guards as pure functions over
a repository root, each xfail(strict=False) with the step that flips it
strict in the reason:
  (a) nodes/ classes exported by nodes/__init__.py  -> P3.1
  (b) no io.Schema(/define_schema in src/           -> P3.2
  (c) __init__.py exposes exactly comfy_entrypoint  -> P4.4
  (d) no sys.path mutation outside modules/deps/    -> P2.5
  (e) no pdb/profiler/pip in the vendored closure   -> P2.1
The self-tests copy the repository into tmp_path and prove that each guard
fails on a deliberately violating file.
2026-10-23 15:48:52 +03:00
WildAi 11ff635757 plan(P1.2): install the ComfyUI mocks in the root conftest
- conftest.py: comfy_api.latest (io/ui as siblings, ComfyExtension,
  ComfyAPI/ComfyAPISync with an instance-only progress recorder),
  comfy.model_management, comfy.model_patcher, comfy.utils and folder_paths
  are installed before collection; the package alias ComfyUI_KEEP keeps
  __path__ + submodule_search_locations and provides the logger the
  modules/* code imports
- fixtures: deterministic sample_image and an autouse per-test
  models_dir/folder-registry reset
- tests/test_conftest_mocks.py: dummy V3 node end-to-end through the mock
  io, folder_paths isolation, mock-fidelity tripwire against the real
  ComfyUI source (skips cleanly without COMFYUI_ROOT)
2026-10-23 15:46:18 +03:00
WildAi 699a12f403 plan(P1.1): configure the pytest harness and add the sanity test
- pyproject: [tool.pytest.ini_options] with testpaths=tests, the four plan
  markers (unit/mock_integration/headless/gpu_acceptance), addopts
  '-v --tb=short --import-mode=importlib', consider_namespace_packages and
  pythonpath=['.']
- tests/test_sanity.py::test_python_and_torch pins the supported interpreter
  and the torch import
- 'python -m pytest --collect-only -q' exits 0 (40 tests collected)
2026-10-23 15:30:52 +03:00
WildAi 988833ee4b plan(P0): address review findings
All 7 P0 review findings were verified by execution and fixed.

F1 (medium) - the compat scanner modelled only the basicsr/archs eager scan.
The vendored basicsr also scans data/, losses/ and models/ eagerly
(basicsr/__init__.py:3-11 imports all of them), so the closure missed 32
files that the repaired package really imports (incl. models/keep_model.py and
models/keep_gan_model.py, both with 'import pdb' at line 4).  The scanner now
models all four scans plus 'from <package> import <submodule>': closure
100 -> 132 files, findings 8 -> 10, and 0 runtime-loaded vendored files are
missing from the closure (verified on a temp copy of modules/deps).
The audit doc's opposite claim is corrected and P2.4 in the plan now has to
rewrite basicsr/__init__.py and prove 'import basicsr' still succeeds after
pruning (otherwise ModuleNotFoundError is swallowed into DummyArchRegistry).

F2 (medium) - the Asian manifest entry is now decided (P0.4 section 4.1):
url 404, sha256 null, sha256_prefix '4765ebe0', unverified true, available
false, required FALSE (a required entry would break the default KEEP model
through P5.3's fail-fast rule).  Plan P5.0/P5.1/P5.3 and the weights scanner
were aligned.

F3 (low) - the plan's section 8 decision 1, the B3 baseline row, Goal 5, the
risk table and P5.5 carried the superseded GMFlow premise; they now match the
P0.4 decision (the shipped checkpoint carries the flownet weights; the GMFlow
file is defensive and resolved only when the checkpoint has no flownet.* keys).

F4 (low) - the P0.1 fixture asserted rc == 0 before checking the probe's fatal
report, so the documented skip was unreachable.  It now handles the probe's
exit code 2 + fatal report and skips with a reason.

F5 (low) - the baseline-import doc claimed all eight stub symbols fire in the
ffmpeg-blocked run; it is 7 of 8 (loader_face_restore_helper_is_dummy does not
fire - the real facelib imports fine).

F6 (low) - the scanner's exit-code contract (0 = no findings, 1 = findings) is
documented in the tool docstring and in the audit doc.

F7 (low) - the root conftest registered '__init__' and the invalid directory
basename; it now registers the plan's alias 'ComfyUI_KEEP' and provides
execute_package_init() so the V3 entrypoint is executed rather than bypassed.
P1.2 is specified to replace that bootstrap.

Gates: pytest tests/ -q -> 37 passed, 1 xfailed; scan_compat.py --quiet ->
closure 132, 10 findings, exit 1; baseline_probe.py -> import ok / model build
fails (unchanged baseline); scan_weights.py -> 0 of 8 present.
2026-10-23 15:19:55 +03:00
WildAi b38ce96f1b plan(P0): update progress table and record the phase review 2026-10-23 14:03:22 +03:00
WildAi 264c47cdc7 plan(P0.5): canonicalize the examples directory (example_workflows/) 2026-10-23 14:00:48 +03:00
WildAi eaf07ce3a9 plan(P0.4): record GMFlow and diffusers dependency decisions 2026-10-23 13:59:37 +03:00
WildAi a618bff2f6 plan(P0.3): scan the vendored runtime closure for py3.13/numpy2 breaks 2026-10-23 13:56:02 +03:00
WildAi 9601d5b47d plan(P0.2): inventory local weights (all 8 absent on this host) 2026-10-23 13:51:31 +03:00
WildAi 2622b01230 plan(P0.1): record the broken baseline (import ok, model build fails) 2026-10-23 13:48:30 +03:00
WildAi 6fd2c2bf67 docs(audit): record the verified comfy_api.latest surface for P1/P4 2026-10-23 13:17:38 +03:00
WildAi d8e252afa6 docs: correct comfy_api mock spec and progress API in the plan
- P1.2: io and ui are sibling modules (from . import _io_public as io /
  _ui_public as ui); ui is not an attribute of io. Mock also exposes
  ComfyAPI/ComfyAPISync with a no-op execution.set_progress recorder.
- P4.2: progress API verified by probe - class-level ComfyAPI.execution /
  ComfyAPISync.execution raise AttributeError; use ComfyAPISync().execution
  .set_progress(value, max_value) (sync) or await ComfyAPI().execution
  .set_progress(...) (async), with one cached instance and try/except fallback.
- Replace the stale 2026-10-22 status review with the 2026-10-23 one.
2026-10-23 13:12:22 +03:00
WildAi e42420ec96 fix(workflow): scope pytest gates to tests/ and record amended run id 2026-10-23 13:05:42 +03:00
WildAi d93484e6f1 chore: keep docs/audit artifacts trackable 2026-10-23 13:02:22 +03:00
WildAi c159f7a914 docs: record workflow run id and branch state 2026-10-23 13:01:25 +03:00
WildAi e7f608d91d plan: add KEEP v3 modernization plan and execution workflow 2026-10-23 12:59:08 +03:00
WildAi fcb9b4cce4 bump ver 1.1 2025-07-03 13:34:07 +03:00
WildAi 3025add474 update v1.1. Fixes, Upscale Model, final_upscale_factor 2025-07-03 13:30:04 +03:00
WildAi 05fa028285 update README.md 2025-07-03 12:55:38 +03:00
WildAi 6bb0cf603e update README.md 2025-05-31 00:02:01 +03:00
wildminder d77ea5c46f update README.md 2025-05-30 22:51:30 +03:00
Art K bec2fba845 Update README.md 2025-05-23 23:12:19 +03:00
Art K eb767489bc Merge pull request #3 from ComfyNodePRs/pyproject
Add pyproject.toml for Custom Node Registry
2025-05-23 23:02:38 +03:00
Art K 1079a75b9e Update pyproject.toml 2025-05-23 23:01:11 +03:00
Art K 8a5a38438c Delete 2025-05-23 22:58:35 +03:00
Art K fde14d4721 Merge pull request #2 from ComfyNodePRs/publish
Add Github Action for Publishing to Comfy Registry
2025-05-23 22:54:11 +03:00
Art K 0ee0a39541 Create publish_action.yml 2025-05-23 22:46:56 +03:00
async () = process.env.GIT_USERNAME || (await ghUser()).email && (await ghUser()).name || DIE("Missing env.GIT_USERNAME") 5342048593 chore(publish): Add Github Action for Publishing to Comfy Registry 2025-05-23 07:59:42 +00:00
async () = process.env.GIT_USERNAME || (await ghUser()).email && (await ghUser()).name || DIE("Missing env.GIT_USERNAME") 388dd77b06 chore(pyproject): Add pyproject.toml for Custom Node Registry 2025-05-23 06:58:55 +00:00
Art K f93da71bf1 Update README.md 2025-05-22 21:17:00 +03:00
wildminder 2b906f9d2f fix yolo, added ProgressBar 2025-05-22 21:11:39 +03:00
Art K 19a19c4497 Update README.md 2025-05-21 23:58:05 +03:00
wildminder e2a0a97ae9 init 2025-05-21 23:41:19 +03:00
wildminder b69b0a434d init 2025-05-21 23:40:55 +03:00