comfygit-core 0.6.0__tar.gz → 0.7.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- comfygit_core-0.6.0/README.md → comfygit_core-0.7.0/PKG-INFO +53 -0
- comfygit_core-0.6.0/PKG-INFO → comfygit_core-0.7.0/README.md +31 -19
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/docs/architecture.md +5 -1
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/pyproject.toml +7 -3
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/analyzers/model_scanner.py +7 -1
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/analyzers/unmanaged_comfyui_analyzer.py +6 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/caching/comfyui_cache.py +28 -6
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/caching/custom_node_cache.py +13 -2
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/clients/civitai_client.py +6 -5
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/constants.py +1 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/core/environment.py +115 -34
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/core/workspace.py +205 -30
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/factories/environment_factory.py +39 -9
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/factories/workspace_factory.py +46 -21
- comfygit_core-0.7.0/src/comfygit_core/lifecycle/runtime_control.py +186 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/lifecycle/switch_observer.py +60 -1
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/environment_model_manager.py +80 -3
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/node_manager.py +6 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/workflow_manager.py +13 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/manifest/models.py +9 -3
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/manifest/pyproject_manifest.py +13 -1
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/manifest/workflows.py +1 -1
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/merging/semantic_merger.py +8 -1
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/__init__.py +15 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/build_readiness.py +6 -0
- comfygit_core-0.7.0/src/comfygit_core/models/credentials.py +71 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/exceptions.py +12 -5
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/manifest.py +23 -2
- comfygit_core-0.7.0/src/comfygit_core/models/resource_inventory.py +236 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/shared.py +33 -1
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/unmanaged_import.py +1 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/workflow.py +17 -4
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/workspace_config.py +4 -1
- comfygit_core-0.7.0/src/comfygit_core/repositories/credential_store.py +62 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/repositories/workspace_config_repository.py +100 -80
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/runtime.py +16 -0
- comfygit_core-0.7.0/src/comfygit_core/security.py +21 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/build_readiness.py +25 -3
- comfygit_core-0.7.0/src/comfygit_core/services/credential_service.py +201 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/environment_readiness.py +4 -2
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/environment_sync_coordinator.py +12 -2
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/import_analyzer.py +4 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/model_downloader.py +35 -7
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/model_source_lookup.py +1 -1
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/node_lookup_service.py +1 -1
- comfygit_core-0.7.0/src/comfygit_core/services/resource_inventory.py +514 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/unmanaged_environment_import.py +5 -1
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_execution.py +9 -2
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_manifest_reconciler.py +10 -1
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_model_download_coordinator.py +136 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/comfyui_ops.py +99 -7
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/filesystem.py +18 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/git.py +3 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/pytorch_prober.py +22 -3
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/redaction.py +55 -2
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/requirements.py +2 -2
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/conftest.py +38 -1
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_create_with_version_spec.py +16 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_import_comfyui_version_bug.py +17 -11
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_per_environment_manager.py +2 -2
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_repair_node_removal.py +1 -1
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/test_public_api.py +32 -2
- comfygit_core-0.7.0/tests/unit/analyzers/test_model_scanner_symlinks.py +44 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/caching/test_comfyui_cache.py +32 -4
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/caching/test_custom_node_cache_refactor.py +13 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/core/test_import_download_failures.py +4 -3
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/core/test_import_no_manager.py +32 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/core/test_workspace_environment_creation.py +0 -1
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_environment_model_manager.py +40 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_node_manager.py +34 -1
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_pyproject_manager.py +8 -1
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_workflow_manager.py +34 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/models/test_workflow_subgraph.py +24 -0
- comfygit_core-0.7.0/tests/unit/repositories/test_credential_store.py +57 -0
- comfygit_core-0.7.0/tests/unit/services/test_credential_service.py +275 -0
- comfygit_core-0.7.0/tests/unit/services/test_environment_model_requirements.py +142 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_environment_readiness.py +2 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_model_downloader.py +36 -4
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_node_lookup_version_fallback.py +7 -7
- comfygit_core-0.7.0/tests/unit/services/test_resource_inventory.py +437 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_unmanaged_environment_import.py +1 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_workflow_execution.py +11 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_workflow_model_download_coordinator.py +110 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_github_auth_config.py +10 -5
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_materialization.py +34 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_model_downloader_errors.py +3 -3
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_workspace_config_facade.py +22 -3
- comfygit_core-0.7.0/tests/unit/test_workspace_credential_overrides.py +81 -0
- comfygit_core-0.7.0/tests/unit/utils/test_comfyui_ops_source.py +99 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/utils/test_environment_cleanup.py +0 -1
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/utils/test_filesystem.py +0 -1
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/utils/test_git.py +10 -0
- comfygit_core-0.7.0/tests/unit/utils/test_provider_auth_hardening.py +80 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/utils/test_pytorch_prober.py +60 -1
- comfygit_core-0.6.0/tests/unit/utils/test_provider_auth_hardening.py +0 -33
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/.gitignore +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/.python-version +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/AGENTS.md +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/CLAUDE.md +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/LICENSE.txt +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/docs/architecture-deep-dive.md +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/docs/knowledge/comfyui-node-loader-base-directories.md +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/docs/knowledge/model-tracking-system.md +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/docs/knowledge/node-resolution-behavior.md +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/docs/layer-hierarchy.md +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/docs/plans/uv-overlay-system.md +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/__init__.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/analyzers/__init__.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/analyzers/config_comparison.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/analyzers/custom_node_scanner.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/analyzers/git_change_parser.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/analyzers/node_classifier.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/analyzers/node_git_analyzer.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/analyzers/ref_diff_analyzer.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/analyzers/status_scanner.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/analyzers/workflow_dependency_parser.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/assets.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/build_readiness.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/caching/__init__.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/caching/api_cache.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/caching/base.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/caching/workflow_cache.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/clients/__init__.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/clients/github_client.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/clients/registry_client.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/configs/__init__.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/configs/comfyui_builtin_nodes.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/configs/comfyui_models.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/configs/model_config.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/configs/package_config.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/confirmation.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/core/__init__.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/data/overlays/stock/sageattention.toml +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/data/overlays/stock/triton.toml +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/data/overlays/stock/xformers.toml +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/factories/__init__.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/factories/uv_factory.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/git.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/imports.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/infrastructure/__init__.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/infrastructure/sqlite_manager.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/integrations/__init__.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/integrations/uv_command.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/lifecycle/__init__.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/lifecycle/comfyui_readiness.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/logging/__init__.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/logging/logging_config.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/__init__.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/environment_git_orchestrator.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/export_import_manager.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/git_manager.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/model_symlink_manager.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/overlay_manager.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/pyproject_manager.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/pytorch_backend_manager.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/system_node_symlink_manager.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/user_content_symlink_manager.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/uv_project_manager.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/manifest/__init__.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/manifest/base.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/manifest/dependencies.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/manifest/disposable_project.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/manifest/migrations.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/manifest/nodes.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/manifest/overlays.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/manifest/store.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/manifest/sync_config.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/manifest/uv_config.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/merging/__init__.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/merging/atomic_executor.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/merging/merge_validator.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/civitai.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/comfyui_builtin_versions.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/commit.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/dependency_resolution.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/environment.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/git.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/lifecycle.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/materialization.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/merge_plan.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/model_scan.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/node_mapping.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/overlay.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/protocols.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/readiness.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/ref_diff.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/registry.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/runtime_config.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/sync.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/system.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/workflow_contract.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/workflow_execution.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/py.typed +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/readiness.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/repositories/__init__.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/repositories/comfyui_builtin_versions_repository.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/repositories/migrate_paths.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/repositories/model_repository.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/repositories/node_mappings_repository.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/repositories/workflow_repository.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/resolvers/__init__.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/resolvers/global_node_resolver.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/resolvers/model_resolver.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/__init__.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/dependency_resolution_preview.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/environment_lifecycle.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/huggingface_url.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/registry_data_manager.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_analysis_cache.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_analysis_service.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_file_store.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_input.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_manual_model_policy.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_model_dependency_service.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_model_path_policy.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_node_package_policy.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_resolution_context_builder.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_resolution_fixer.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_resolution_service.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_state_cleanup.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/strategies/__init__.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/strategies/auto.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/strategies/confirmation.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/__init__.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/builtin_extractor.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/common.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/conflict_analyzer.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/conflict_parser.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/dependency_parser.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/dependency_probe.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/download.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/environment_cleanup.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/environment_lock.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/folder_paths_extractor.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/input_signature.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/model_categories.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/model_loader_extractor.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/node_identity.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/provider_urls.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/pytorch.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/retry.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/symlink_utils.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/system_detector.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/toml_compat.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/uuid.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/uv_error_handler.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/version.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/workflow_hash.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/validation/__init__.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/validation/resolution_tester.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/workflow.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/README.md +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/caching/TEST_REDUCTION_SUMMARY.md +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/caching/__init__.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/caching/test_workflow_cache.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/caching/test_workflow_cache_context_hash.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/fixtures/models/test_models.json +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/fixtures/workflows/checkpoint_loader_with_missing_model.json +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/fixtures/workflows/kjnodes_workflow.json +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/fixtures/workflows/simple_txt2img.json +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/fixtures/workflows/with_custom_node.json +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/fixtures/workflows/with_missing_model.json +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/fixtures/workflows/workflow_with_duplicates.json +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/fixtures/workflows/workflow_with_properties.json +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/fixtures/workflows/workflow_without_properties.json +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/helpers/__init__.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/helpers/model_index_builder.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/helpers/pyproject_assertions.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/helpers/workflow_builder.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_atomic_semantic_merge.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_auto_model_index_sync.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_branch_workflow_preservation.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_cache_invalidation_on_model_deletion.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_cache_node_version_invalidation.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_checkout_b_with_modified_workflow.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_commit_git_changes.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_commit_git_changes_SUMMARY.md +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_commit_history.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_context_aware_node_resolution.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_custom_node_path_preservation.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_deferred_model_downloads.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_deleted_model_download_intent.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_dependency_group_removal.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_dev_node_git_references.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_dev_node_improvements.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_download_cleanup.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_download_intent_cache_invalidation.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_environment_basic.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_environment_branching.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_environment_create_progress.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_export_import.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_git_branching.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_git_import.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_git_pull_push.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_git_remote.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_git_subdirectory_import.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_import_auto_remote.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_import_preview.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_lifecycle_status.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_model_category_mismatch_detection.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_model_directory_switch.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_model_download_integration.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_model_index_mismatch_bug_SUMMARY.md +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_model_path_sync_detection.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_model_resolution_stale_directory.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_model_show_command.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_model_source_management.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_model_source_preservation.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_model_source_preservation_SUMMARY.md +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_model_source_removal.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_multiple_optional_group_failures.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_node_prune.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_node_version_replacement.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_opencv_conflict_resolution.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_optional_dependency_groups.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_overlay_e2e.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_overlay_git_integration.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_overlay_system_integration.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_package_config.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_pyproject_batch_writes.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_pytorch_reconfiguration.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_registry_git_fallback.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_registry_node_update_empty_download_url.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_repair_completion_marker.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_repair_model_download.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_repair_workflow.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_requirements_inline_comments_bug.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_runtime_restart_workflow_preservation.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_status_abstraction.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_status_uninstalled_nodes.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_workflow_cache_metadata_invalidation.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_workflow_caching_integration.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_workflow_commit_flow.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_workflow_deletion_cleanup.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_workflow_model_criticality_update.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_workflow_path_update_after_interactive_resolution.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_workflow_resolution_cleanup.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_workflow_resolution_pipeline.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_workflow_resolve_install.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_workflow_subgraph_resolution.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/test_architecture_boundaries.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/analyzers/test_config_comparison.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/analyzers/test_custom_node_scanner.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/analyzers/test_node_git_analyzer.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/analyzers/test_ref_diff_analyzer.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/analyzers/test_status_scanner.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/analyzers/test_status_scanner_disabled_nodes.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/analyzers/test_status_scanner_package_sync.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/analyzers/test_workflow_dependency_parser.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/caching/test_cache_base.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/caching/test_workspace_relative_caching.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/clients/test_civitai_client.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/clients/test_civitai_parsing.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/clients/test_github_releases.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/configs/__init__.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/configs/test_package_config.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/core/test_environment_facades.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/core/test_environment_operation_locking.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/core/test_environment_run.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/core/test_environment_sync.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/core/test_environment_uninstalled_nodes.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/core/test_reserved_environment_names.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/core/test_sync_node_dependency_provisioning.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/core/test_workflow_contract_access.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/core/test_workspace_model_delete.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/factories/test_environment_factory_manager_install.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/lifecycle/test_comfyui_readiness.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_export_import_overlays.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_git_manager_gitignore.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_git_manager_log_refs.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_model_index_manager.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_model_short_hash.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_node_conflict_detection.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_overlay_fuzz.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_overlay_manager.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_overlay_materialization.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_pyproject_schema_version.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_pytorch_backend_manager.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_pytorch_overlay_materialization.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_pytorch_stripping.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_sqlite_manager.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_uv_no_build_isolation.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_workflow_node_cleanup.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_workflow_status.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/merging/__init__.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/merging/test_atomic_executor.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/merging/test_merge_validator.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/merging/test_semantic_merger.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/models/test_comfyui_builtin_versions.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/models/test_lifecycle.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/models/test_overlay.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/models/test_ref_diff.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/models/test_workflow_contract.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/models/test_workflow_dependencies.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/models/test_workflow_roundtrip.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/resolvers/test_global_node_resolver_v2.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/resolvers/test_model_resolver.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_build_readiness.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_dependency_resolution_preview.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_environment_lifecycle.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_global_node_resolver.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_huggingface_url.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_import_analyzer.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_model_source_lookup.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_node_lookup_api_first.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_registry_data_manager.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_scan_requirements_substitution.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_workflow_analysis_cache.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_workflow_analysis_service.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_workflow_file_store.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_workflow_input.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_workflow_model_dependency_service.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_workflow_model_path_policy.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_workflow_resolution_context_builder.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_workflow_resolution_fixer.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_workflow_resolution_service.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_workflow_state_cleanup.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_add_dependencies_substitution.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_auto_strategies.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_builtin_extractor.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_dev_node_rename_detection.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_environment_py_dependencies.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_external_uv_cache.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_folder_paths_extractor.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_github_url_installation.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_headless_import.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_minimal_schema_compatibility.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_model_config_dynamic_loading.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_model_loader_extractor.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_model_repository_cleanup.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_model_symlink_manager.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_node_callbacks.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_node_conflict_context.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_node_mappings_repository.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_node_resolution_context.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_unified_node_search.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_user_content_symlink_manager.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_uv_error_handling.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_uv_error_parser.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_workflow_manager_deduplication.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_workspace_config_resilience.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/utils/test_conflict_analyzer.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/utils/test_conflict_parser.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/utils/test_dependency_parser.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/utils/test_dependency_probe.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/utils/test_input_signature.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/utils/test_node_identity.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/utils/test_pytorch.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/utils/test_requirements.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/utils/test_symlink_utils.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/utils/test_uuid.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/utils/test_version.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/utils/__init__.py +0 -0
- {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/utils/test_workflow_hash.py +0 -0
|
@@ -1,3 +1,25 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: comfygit-core
|
|
3
|
+
Version: 0.7.0
|
|
4
|
+
Summary: ComfyGit Core - Git-based ComfyUI environment manager
|
|
5
|
+
Project-URL: Documentation, https://docs.comfygit.org/
|
|
6
|
+
Project-URL: Repository, https://github.com/comfygit-ai/comfygit
|
|
7
|
+
Project-URL: Issues, https://github.com/comfygit-ai/comfygit/issues
|
|
8
|
+
License-File: LICENSE.txt
|
|
9
|
+
Requires-Python: >=3.10
|
|
10
|
+
Requires-Dist: blake3>=0.3.3
|
|
11
|
+
Requires-Dist: huggingface-hub>=0.15.1
|
|
12
|
+
Requires-Dist: packaging>=16.2
|
|
13
|
+
Requires-Dist: requests>=2.32.4
|
|
14
|
+
Requires-Dist: requirements-parser>=0.11.0
|
|
15
|
+
Requires-Dist: tomli>=2.0.1; python_version < '3.11'
|
|
16
|
+
Requires-Dist: tomlkit>=0.11.0
|
|
17
|
+
Requires-Dist: uv>=0.11.15
|
|
18
|
+
Requires-Dist: xxhash>=2.0.0
|
|
19
|
+
Provides-Extra: keyring
|
|
20
|
+
Requires-Dist: keyring>=25.7.0; extra == 'keyring'
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
|
|
1
23
|
# ComfyGit Core
|
|
2
24
|
|
|
3
25
|
Core library for programmatic ComfyUI environment and package management. Build custom tools, GUIs, web interfaces, or CI/CD integrations on top of ComfyGit's architecture.
|
|
@@ -466,3 +488,34 @@ dependencies = [
|
|
|
466
488
|
"comfygit-core>=0.3.14,<0.4.0" # Pin to minor version
|
|
467
489
|
]
|
|
468
490
|
```
|
|
491
|
+
|
|
492
|
+
## Credentials in headless applications
|
|
493
|
+
|
|
494
|
+
The base `comfygit-core` installation does not require `keyring`. Install
|
|
495
|
+
`comfygit-core[keyring]` when OS-backed credential persistence is wanted; the
|
|
496
|
+
normal `comfygit` CLI includes this extra. An unavailable package or OS backend
|
|
497
|
+
produces a structured error when saving credentials, never plaintext fallback.
|
|
498
|
+
|
|
499
|
+
`Workspace.open`, `create`, `from_path`, and `open_or_create` accept an optional
|
|
500
|
+
`credential_overrides` mapping keyed by `CredentialProvider`. A nonempty token
|
|
501
|
+
is process-local and takes priority over environment variables, workspace secure
|
|
502
|
+
storage and provider-native login. An explicit `None` requests anonymous
|
|
503
|
+
provider access; omitted providers follow the normal resolution chain. For
|
|
504
|
+
Hugging Face downloads and lookup, anonymous access disables the SDK's saved
|
|
505
|
+
login discovery too. External git helpers/SSH and URL-embedded authentication
|
|
506
|
+
remain the embedding application's responsibility.
|
|
507
|
+
|
|
508
|
+
```python
|
|
509
|
+
from comfygit_core import Workspace
|
|
510
|
+
from comfygit_core.models import CredentialProvider
|
|
511
|
+
|
|
512
|
+
workspace = Workspace.open(
|
|
513
|
+
workspace_path,
|
|
514
|
+
credential_overrides={CredentialProvider.HUGGINGFACE: None},
|
|
515
|
+
)
|
|
516
|
+
```
|
|
517
|
+
|
|
518
|
+
No login is required for local operations or public resources that allow
|
|
519
|
+
anonymous access. For authenticated access without keyring, set the appropriate
|
|
520
|
+
provider environment variable or use an existing Hugging Face login. Tokens
|
|
521
|
+
are never exported in environment manifests.
|
|
@@ -1,22 +1,3 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: comfygit-core
|
|
3
|
-
Version: 0.6.0
|
|
4
|
-
Summary: ComfyGit Core - Git-based ComfyUI environment manager
|
|
5
|
-
Project-URL: Documentation, https://docs.comfygit.org/
|
|
6
|
-
Project-URL: Repository, https://github.com/comfygit-ai/comfygit
|
|
7
|
-
Project-URL: Issues, https://github.com/comfygit-ai/comfygit/issues
|
|
8
|
-
License-File: LICENSE.txt
|
|
9
|
-
Requires-Python: >=3.10
|
|
10
|
-
Requires-Dist: blake3>=0.3.3
|
|
11
|
-
Requires-Dist: huggingface-hub>=0.11.0
|
|
12
|
-
Requires-Dist: packaging>=16.2
|
|
13
|
-
Requires-Dist: requests>=2.32.4
|
|
14
|
-
Requires-Dist: requirements-parser>=0.11.0
|
|
15
|
-
Requires-Dist: tomlkit>=0.11.0
|
|
16
|
-
Requires-Dist: uv>=0.11.8
|
|
17
|
-
Requires-Dist: xxhash>=2.0.0
|
|
18
|
-
Description-Content-Type: text/markdown
|
|
19
|
-
|
|
20
1
|
# ComfyGit Core
|
|
21
2
|
|
|
22
3
|
Core library for programmatic ComfyUI environment and package management. Build custom tools, GUIs, web interfaces, or CI/CD integrations on top of ComfyGit's architecture.
|
|
@@ -485,3 +466,34 @@ dependencies = [
|
|
|
485
466
|
"comfygit-core>=0.3.14,<0.4.0" # Pin to minor version
|
|
486
467
|
]
|
|
487
468
|
```
|
|
469
|
+
|
|
470
|
+
## Credentials in headless applications
|
|
471
|
+
|
|
472
|
+
The base `comfygit-core` installation does not require `keyring`. Install
|
|
473
|
+
`comfygit-core[keyring]` when OS-backed credential persistence is wanted; the
|
|
474
|
+
normal `comfygit` CLI includes this extra. An unavailable package or OS backend
|
|
475
|
+
produces a structured error when saving credentials, never plaintext fallback.
|
|
476
|
+
|
|
477
|
+
`Workspace.open`, `create`, `from_path`, and `open_or_create` accept an optional
|
|
478
|
+
`credential_overrides` mapping keyed by `CredentialProvider`. A nonempty token
|
|
479
|
+
is process-local and takes priority over environment variables, workspace secure
|
|
480
|
+
storage and provider-native login. An explicit `None` requests anonymous
|
|
481
|
+
provider access; omitted providers follow the normal resolution chain. For
|
|
482
|
+
Hugging Face downloads and lookup, anonymous access disables the SDK's saved
|
|
483
|
+
login discovery too. External git helpers/SSH and URL-embedded authentication
|
|
484
|
+
remain the embedding application's responsibility.
|
|
485
|
+
|
|
486
|
+
```python
|
|
487
|
+
from comfygit_core import Workspace
|
|
488
|
+
from comfygit_core.models import CredentialProvider
|
|
489
|
+
|
|
490
|
+
workspace = Workspace.open(
|
|
491
|
+
workspace_path,
|
|
492
|
+
credential_overrides={CredentialProvider.HUGGINGFACE: None},
|
|
493
|
+
)
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
No login is required for local operations or public resources that allow
|
|
497
|
+
anonymous access. For authenticated access without keyring, set the appropriate
|
|
498
|
+
provider environment variable or use an existing Hugging Face login. Tokens
|
|
499
|
+
are never exported in environment manifests.
|
|
@@ -41,7 +41,7 @@ ComfyGit Core is a **library-first Python package** providing environment manage
|
|
|
41
41
|
|--------|---------|--------------|
|
|
42
42
|
| **core/** | Public API | Workspace (multi-env), Environment (single env) |
|
|
43
43
|
| **models/** | Public typed contracts | Exported data classes, protocols, exceptions with context |
|
|
44
|
-
| **readiness.py**, **workflow.py**, **runtime.py**, **assets.py**, **git.py** | Public facades | Reusable domain helpers promoted for adapters |
|
|
44
|
+
| **readiness.py**, **workflow.py**, **runtime.py**, **assets.py**, **git.py**, **security.py** | Public facades | Reusable domain helpers promoted for adapters |
|
|
45
45
|
| **managers/** | Orchestration | Environment orchestrators (Git, Model), Resource managers (Node, Workflow, Model symlinks), Config managers (PyProject, UV, PyTorch backend) |
|
|
46
46
|
| **manifest/** | Internal manifest abstraction | Pyproject-backed store, section handlers, edit helpers, overlay materialization, migration cleanup |
|
|
47
47
|
| **analyzers/** | Analysis | Parse workflows/git/status; classify nodes |
|
|
@@ -79,6 +79,10 @@ ComfyGit Core is a **library-first Python package** providing environment manage
|
|
|
79
79
|
- `Workspace.create()` - Create new workspace with validation
|
|
80
80
|
- `Workspace.open_or_create()` - Setup-friendly load-or-create entry point
|
|
81
81
|
- `Workspace.list_environments()` / `get_environment()` - List/get environments
|
|
82
|
+
- `Workspace.get_resource_inventory()` / `get_model_inventory()` - Typed model,
|
|
83
|
+
environment, source, and storage inventory for adapters
|
|
84
|
+
- `Workspace.plan_model_deletion()` / `apply_model_deletion_plan()` - Dry-run-first,
|
|
85
|
+
location-specific model reclaim with conservative blockers
|
|
82
86
|
- `Workspace.get_schema_version()` / `is_legacy_schema()` - Check workspace version
|
|
83
87
|
- `Workspace.upgrade_schema_if_needed()` - Migrate to current schema
|
|
84
88
|
|
|
@@ -1,20 +1,24 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "comfygit-core"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.7.0"
|
|
4
4
|
description = "ComfyGit Core - Git-based ComfyUI environment manager"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.10"
|
|
7
7
|
dependencies = [
|
|
8
8
|
"blake3>=0.3.3",
|
|
9
|
-
"
|
|
9
|
+
"huggingface-hub>=0.15.1",
|
|
10
10
|
"packaging>=16.2",
|
|
11
11
|
"requests>=2.32.4",
|
|
12
12
|
"requirements-parser>=0.11.0",
|
|
13
13
|
"tomlkit>=0.11.0",
|
|
14
|
-
"
|
|
14
|
+
"tomli>=2.0.1; python_version < '3.11'",
|
|
15
|
+
"uv>=0.11.15",
|
|
15
16
|
"xxhash>=2.0.0",
|
|
16
17
|
]
|
|
17
18
|
|
|
19
|
+
[project.optional-dependencies]
|
|
20
|
+
keyring = ["keyring>=25.7.0"]
|
|
21
|
+
|
|
18
22
|
[project.urls]
|
|
19
23
|
Documentation = "https://docs.comfygit.org/"
|
|
20
24
|
Repository = "https://github.com/comfygit-ai/comfygit"
|
|
@@ -208,7 +208,13 @@ class ModelScanner:
|
|
|
208
208
|
continue
|
|
209
209
|
|
|
210
210
|
try:
|
|
211
|
-
|
|
211
|
+
# Model libraries commonly use file symlinks to share large
|
|
212
|
+
# weights between ComfyUI installations or expose a loader's
|
|
213
|
+
# expected filename as an alias. ``Path.stat()`` and the hash
|
|
214
|
+
# reader intentionally follow a valid file symlink, while the
|
|
215
|
+
# indexed location remains the alias path under ``models/``.
|
|
216
|
+
# Broken links and links to directories still fail is_file().
|
|
217
|
+
if not file_path.is_file():
|
|
212
218
|
skipped_not_file += 1
|
|
213
219
|
continue
|
|
214
220
|
|
|
@@ -77,6 +77,11 @@ def scan_unmanaged_comfyui(
|
|
|
77
77
|
ignored_custom_node_names=ignored_custom_node_names,
|
|
78
78
|
)
|
|
79
79
|
version, commit = _detect_comfyui_version(comfyui_path)
|
|
80
|
+
repository = (
|
|
81
|
+
_git_output(comfyui_path, "remote", "get-url", "origin")
|
|
82
|
+
if _is_git_checkout(comfyui_path)
|
|
83
|
+
else None
|
|
84
|
+
)
|
|
80
85
|
|
|
81
86
|
if not workflows:
|
|
82
87
|
warnings.append("No saved workflow JSON files were found.")
|
|
@@ -88,6 +93,7 @@ def scan_unmanaged_comfyui(
|
|
|
88
93
|
python_version=f"{sys.version_info.major}.{sys.version_info.minor}",
|
|
89
94
|
comfyui_version=version,
|
|
90
95
|
comfyui_commit=commit,
|
|
96
|
+
comfyui_repository=repository,
|
|
91
97
|
workflows=workflows,
|
|
92
98
|
model_references=model_references,
|
|
93
99
|
models_scanned=models_scanned,
|
|
@@ -4,9 +4,15 @@ Caches ComfyUI installations by version to avoid re-downloading and re-cloning.
|
|
|
4
4
|
Supports releases, commits, and branches.
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
|
+
import hashlib
|
|
7
8
|
from dataclasses import dataclass
|
|
8
9
|
from pathlib import Path
|
|
9
10
|
|
|
11
|
+
from ..constants import DEFAULT_COMFYUI_REPOSITORY
|
|
12
|
+
from ..utils.comfyui_ops import (
|
|
13
|
+
comfyui_repository_identity,
|
|
14
|
+
normalize_comfyui_repository,
|
|
15
|
+
)
|
|
10
16
|
from .base import ContentCacheBase
|
|
11
17
|
|
|
12
18
|
|
|
@@ -16,6 +22,7 @@ class ComfyUISpec:
|
|
|
16
22
|
version: str # "v0.3.20", "abc123", "main"
|
|
17
23
|
version_type: str # "release", "commit", "branch"
|
|
18
24
|
commit_sha: str | None = None # Actual commit SHA (for branches)
|
|
25
|
+
repository: str = DEFAULT_COMFYUI_REPOSITORY
|
|
19
26
|
|
|
20
27
|
|
|
21
28
|
class ComfyUICacheManager(ContentCacheBase):
|
|
@@ -60,12 +67,20 @@ class ComfyUICacheManager(ContentCacheBase):
|
|
|
60
67
|
# Simple string version
|
|
61
68
|
return f"version_{spec}"
|
|
62
69
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
70
|
+
repository = normalize_comfyui_repository(spec.repository)
|
|
71
|
+
repository_identity = comfyui_repository_identity(repository)
|
|
72
|
+
repository_key = hashlib.sha256(
|
|
73
|
+
repository_identity.encode("utf-8")
|
|
74
|
+
).hexdigest()[:12]
|
|
66
75
|
|
|
67
|
-
#
|
|
68
|
-
|
|
76
|
+
# Any captured commit is the immutable cache authority, including
|
|
77
|
+
# snapshots originally described by a branch or release.
|
|
78
|
+
if spec.commit_sha:
|
|
79
|
+
revision_key = f"commit_{spec.commit_sha}"
|
|
80
|
+
else:
|
|
81
|
+
revision_key = f"{spec.version_type}_{spec.version}"
|
|
82
|
+
|
|
83
|
+
return f"source_{repository_key}_{revision_key}"
|
|
69
84
|
|
|
70
85
|
def cache_comfyui(self, spec: ComfyUISpec, source_path: Path) -> Path:
|
|
71
86
|
"""Cache a ComfyUI installation.
|
|
@@ -82,7 +97,8 @@ class ComfyUICacheManager(ContentCacheBase):
|
|
|
82
97
|
metadata = {
|
|
83
98
|
"version": spec.version,
|
|
84
99
|
"version_type": spec.version_type,
|
|
85
|
-
"commit_sha": spec.commit_sha
|
|
100
|
+
"commit_sha": spec.commit_sha,
|
|
101
|
+
"repository": normalize_comfyui_repository(spec.repository),
|
|
86
102
|
}
|
|
87
103
|
|
|
88
104
|
return self.cache_content(cache_key, source_path, metadata)
|
|
@@ -96,5 +112,11 @@ class ComfyUICacheManager(ContentCacheBase):
|
|
|
96
112
|
Returns:
|
|
97
113
|
Path to cached ComfyUI content, or None if not cached
|
|
98
114
|
"""
|
|
115
|
+
if (
|
|
116
|
+
isinstance(spec, ComfyUISpec)
|
|
117
|
+
and spec.version_type == "branch"
|
|
118
|
+
and not spec.commit_sha
|
|
119
|
+
):
|
|
120
|
+
return None
|
|
99
121
|
cache_key = self.generate_cache_key(spec)
|
|
100
122
|
return self.get_cached_path(cache_key)
|
|
@@ -127,9 +127,20 @@ class CustomNodeCacheManager(ContentCacheBase):
|
|
|
127
127
|
cache_dir = self.store_dir / cache_key
|
|
128
128
|
content_dir = cache_dir / "content"
|
|
129
129
|
|
|
130
|
+
if node_info.source == "git" and (content_dir / ".gitmodules").is_file():
|
|
131
|
+
from ..utils.git import _git
|
|
132
|
+
|
|
133
|
+
if not (content_dir / ".git").exists():
|
|
134
|
+
return False
|
|
135
|
+
try:
|
|
136
|
+
status = _git(["submodule", "status", "--recursive"], content_dir)
|
|
137
|
+
if any(line.startswith(("-", "+", "U")) for line in status.stdout.splitlines()):
|
|
138
|
+
return False
|
|
139
|
+
except (OSError, ValueError):
|
|
140
|
+
return False
|
|
130
141
|
return content_dir.exists() and any(content_dir.iterdir())
|
|
131
142
|
|
|
132
|
-
def
|
|
143
|
+
def get_cached_node_path(self, node_info: NodeInfo) -> Path | None:
|
|
133
144
|
"""Get the path to cached node content if it exists.
|
|
134
145
|
|
|
135
146
|
Returns:
|
|
@@ -225,7 +236,7 @@ class CustomNodeCacheManager(ContentCacheBase):
|
|
|
225
236
|
Returns:
|
|
226
237
|
True if successfully copied, False otherwise
|
|
227
238
|
"""
|
|
228
|
-
cached_path = self.
|
|
239
|
+
cached_path = self.get_cached_node_path(node_info)
|
|
229
240
|
if not cached_path:
|
|
230
241
|
return False
|
|
231
242
|
|
|
@@ -82,12 +82,13 @@ class CivitAIClient:
|
|
|
82
82
|
self.cache_manager = cache_manager
|
|
83
83
|
self.workspace_config = workspace_config
|
|
84
84
|
|
|
85
|
-
#
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
if not self._api_key and workspace_config:
|
|
85
|
+
# Workspace resolution owns overrides, environment and secure-store order.
|
|
86
|
+
if api_key is not None:
|
|
87
|
+
self._api_key = api_key
|
|
88
|
+
elif workspace_config is not None:
|
|
90
89
|
self._api_key = workspace_config.get_civitai_token()
|
|
90
|
+
else:
|
|
91
|
+
self._api_key = os.environ.get("CIVITAI_API_TOKEN") or os.environ.get("CIVITAI_API_KEY")
|
|
91
92
|
|
|
92
93
|
self.rate_limiter = RateLimitManager(min_interval=0.1)
|
|
93
94
|
self.retry_config = RetryConfig(
|
|
@@ -93,6 +93,7 @@ PYPROJECT_SCHEMA_VERSION = 2
|
|
|
93
93
|
DEFAULT_REGISTRY_URL = "https://api.comfy.org"
|
|
94
94
|
DEFAULT_GITHUB_URL = "https://github.com"
|
|
95
95
|
GITHUB_API_BASE = "https://api.github.com"
|
|
96
|
+
DEFAULT_COMFYUI_REPOSITORY = "https://github.com/Comfy-Org/ComfyUI.git"
|
|
96
97
|
|
|
97
98
|
GITHUB_NODE_MAPPINGS_URL = "https://raw.githubusercontent.com/comfygit-ai/comfygit-registry-data/main/data/node_mappings.json"
|
|
98
99
|
GITHUB_COMFYUI_BUILTINS_BY_VERSION_URL = "https://raw.githubusercontent.com/comfygit-ai/comfygit-registry-data/main/data/comfyui_builtins_by_version.json"
|
|
@@ -636,6 +636,31 @@ class Environment:
|
|
|
636
636
|
missing_models=missing_models
|
|
637
637
|
)
|
|
638
638
|
|
|
639
|
+
def _missing_required_materialized_nodes(self) -> list[str]:
|
|
640
|
+
"""Return required manifest nodes absent from the ComfyUI checkout."""
|
|
641
|
+
scanner = StatusScanner(
|
|
642
|
+
comfyui_path=self.comfyui_path,
|
|
643
|
+
venv_path=self.venv_path,
|
|
644
|
+
uv=self.uv_manager,
|
|
645
|
+
pyproject=self.pyproject,
|
|
646
|
+
pytorch_manager=self.pytorch_manager,
|
|
647
|
+
)
|
|
648
|
+
comparison = scanner.get_full_comparison(check_package_sync=False)
|
|
649
|
+
missing = {
|
|
650
|
+
str(name).casefold()
|
|
651
|
+
for name in (
|
|
652
|
+
*comparison.missing_nodes,
|
|
653
|
+
*comparison.dev_nodes_missing,
|
|
654
|
+
)
|
|
655
|
+
}
|
|
656
|
+
required = []
|
|
657
|
+
for node in self.pyproject.nodes.get_existing().values():
|
|
658
|
+
if node.criticality == "optional":
|
|
659
|
+
continue
|
|
660
|
+
if node.name.casefold() in missing:
|
|
661
|
+
required.append(node.name)
|
|
662
|
+
return sorted(required, key=str.casefold)
|
|
663
|
+
|
|
639
664
|
def get_lifecycle_status(
|
|
640
665
|
self,
|
|
641
666
|
*,
|
|
@@ -992,6 +1017,7 @@ class Environment:
|
|
|
992
1017
|
overlay_names: list[str] | None = None,
|
|
993
1018
|
extras: list[str] | None = None,
|
|
994
1019
|
all_extras: bool = False,
|
|
1020
|
+
mark_complete: bool = True,
|
|
995
1021
|
) -> SyncResult:
|
|
996
1022
|
"""Apply changes: sync packages, nodes, workflows, and models with environment.
|
|
997
1023
|
|
|
@@ -1009,6 +1035,7 @@ class Environment:
|
|
|
1009
1035
|
overlay_names: One-time overlay names for this sync call.
|
|
1010
1036
|
extras: Optional list of extras to install
|
|
1011
1037
|
all_extras: Install all optional extras
|
|
1038
|
+
mark_complete: False when import still has acquisition steps to finish.
|
|
1012
1039
|
|
|
1013
1040
|
Returns:
|
|
1014
1041
|
SyncResult with details of what was synced
|
|
@@ -1035,6 +1062,7 @@ class Environment:
|
|
|
1035
1062
|
overlay_names=overlay_names,
|
|
1036
1063
|
extras=extras,
|
|
1037
1064
|
all_extras=all_extras,
|
|
1065
|
+
mark_complete=mark_complete,
|
|
1038
1066
|
)
|
|
1039
1067
|
|
|
1040
1068
|
# =====================================================
|
|
@@ -2992,8 +3020,12 @@ class Environment:
|
|
|
2992
3020
|
ValueError: If ComfyUI already exists or .cec not properly initialized
|
|
2993
3021
|
"""
|
|
2994
3022
|
from ..caching.comfyui_cache import ComfyUICacheManager, ComfyUISpec
|
|
2995
|
-
from ..utils.comfyui_ops import
|
|
2996
|
-
|
|
3023
|
+
from ..utils.comfyui_ops import (
|
|
3024
|
+
clone_comfyui,
|
|
3025
|
+
normalize_comfyui_commit_sha,
|
|
3026
|
+
normalize_comfyui_repository,
|
|
3027
|
+
verify_comfyui_checkout,
|
|
3028
|
+
)
|
|
2997
3029
|
|
|
2998
3030
|
logger.info(f"Finalizing import for environment: {self.name}")
|
|
2999
3031
|
|
|
@@ -3016,10 +3048,18 @@ class Environment:
|
|
|
3016
3048
|
comfyui_manifest_version = self.pyproject.manifest.get_comfyui_version()
|
|
3017
3049
|
comfyui_version = comfyui_manifest_version.version
|
|
3018
3050
|
comfyui_version_type = comfyui_manifest_version.version_type
|
|
3051
|
+
comfyui_repository = normalize_comfyui_repository(
|
|
3052
|
+
comfyui_manifest_version.repository
|
|
3053
|
+
)
|
|
3054
|
+
comfyui_commit_sha = normalize_comfyui_commit_sha(
|
|
3055
|
+
comfyui_manifest_version.commit_sha
|
|
3056
|
+
)
|
|
3019
3057
|
except Exception as e:
|
|
3020
3058
|
logger.warning(f"Could not read comfyui_version from pyproject.toml: {e}")
|
|
3021
3059
|
comfyui_version = None
|
|
3022
3060
|
comfyui_version_type = None
|
|
3061
|
+
comfyui_repository = normalize_comfyui_repository(None)
|
|
3062
|
+
comfyui_commit_sha = None
|
|
3023
3063
|
|
|
3024
3064
|
if comfyui_version:
|
|
3025
3065
|
version_desc = f"{comfyui_version_type} {comfyui_version}" if comfyui_version_type else comfyui_version
|
|
@@ -3039,8 +3079,10 @@ class Environment:
|
|
|
3039
3079
|
spec = ComfyUISpec(
|
|
3040
3080
|
version=comfyui_version or "main",
|
|
3041
3081
|
version_type=comfyui_version_type or "branch",
|
|
3042
|
-
commit_sha=
|
|
3082
|
+
commit_sha=comfyui_commit_sha,
|
|
3083
|
+
repository=comfyui_repository,
|
|
3043
3084
|
)
|
|
3085
|
+
clone_ref = comfyui_commit_sha or comfyui_version
|
|
3044
3086
|
|
|
3045
3087
|
# Check cache first
|
|
3046
3088
|
cached_path = comfyui_cache.get_cached_comfyui(spec)
|
|
@@ -3050,14 +3092,35 @@ class Environment:
|
|
|
3050
3092
|
callbacks.on_phase("restore_comfyui", f"Restoring ComfyUI {spec.version} from cache...")
|
|
3051
3093
|
logger.info(f"Restoring ComfyUI {spec.version} from cache")
|
|
3052
3094
|
shutil.copytree(cached_path, self.comfyui_path)
|
|
3095
|
+
actual_commit = verify_comfyui_checkout(
|
|
3096
|
+
self.comfyui_path,
|
|
3097
|
+
repository=comfyui_repository,
|
|
3098
|
+
commit_sha=comfyui_commit_sha,
|
|
3099
|
+
)
|
|
3100
|
+
logger.info(
|
|
3101
|
+
"Verified cached ComfyUI origin and commit %s",
|
|
3102
|
+
actual_commit[:12],
|
|
3103
|
+
)
|
|
3053
3104
|
else:
|
|
3054
3105
|
if callbacks:
|
|
3055
3106
|
callbacks.on_phase("clone_comfyui", f"Cloning ComfyUI {spec.version}...")
|
|
3056
|
-
logger.info(
|
|
3057
|
-
|
|
3107
|
+
logger.info(
|
|
3108
|
+
"Cloning ComfyUI %s from %s",
|
|
3109
|
+
clone_ref or "default branch",
|
|
3110
|
+
comfyui_repository,
|
|
3111
|
+
)
|
|
3112
|
+
clone_comfyui(
|
|
3113
|
+
self.comfyui_path,
|
|
3114
|
+
clone_ref,
|
|
3115
|
+
repository=comfyui_repository,
|
|
3116
|
+
)
|
|
3058
3117
|
|
|
3059
3118
|
# Cache the fresh clone
|
|
3060
|
-
commit_sha =
|
|
3119
|
+
commit_sha = verify_comfyui_checkout(
|
|
3120
|
+
self.comfyui_path,
|
|
3121
|
+
repository=comfyui_repository,
|
|
3122
|
+
commit_sha=comfyui_commit_sha,
|
|
3123
|
+
)
|
|
3061
3124
|
if commit_sha:
|
|
3062
3125
|
spec.commit_sha = commit_sha
|
|
3063
3126
|
comfyui_cache.cache_comfyui(spec, self.comfyui_path)
|
|
@@ -3238,7 +3301,7 @@ class Environment:
|
|
|
3238
3301
|
try:
|
|
3239
3302
|
# During import, don't remove ComfyUI builtins (fresh clone has example files)
|
|
3240
3303
|
# Enable verbose to show real-time uv output during dependency installation
|
|
3241
|
-
sync_result = self.sync(remove_extra_nodes=False, sync_callbacks=callbacks, verbose=True)
|
|
3304
|
+
sync_result = self.sync(remove_extra_nodes=False, sync_callbacks=callbacks, verbose=True, mark_complete=False)
|
|
3242
3305
|
if sync_result.success and sync_result.nodes_installed and callbacks:
|
|
3243
3306
|
for node_name in sync_result.nodes_installed:
|
|
3244
3307
|
callbacks.on_node_installed(node_name)
|
|
@@ -3248,6 +3311,13 @@ class Environment:
|
|
|
3248
3311
|
if fail_on_sync_errors and not sync_result.success:
|
|
3249
3312
|
error_text = "; ".join(sync_result.errors) if sync_result.errors else "unknown sync error"
|
|
3250
3313
|
raise RuntimeError(f"Environment sync failed during materialization: {error_text}")
|
|
3314
|
+
if fail_on_sync_errors:
|
|
3315
|
+
missing_required_nodes = self._missing_required_materialized_nodes()
|
|
3316
|
+
if missing_required_nodes:
|
|
3317
|
+
raise RuntimeError(
|
|
3318
|
+
"Environment materialization is missing required custom nodes: "
|
|
3319
|
+
+ ", ".join(missing_required_nodes)
|
|
3320
|
+
)
|
|
3251
3321
|
except Exception as e:
|
|
3252
3322
|
if callbacks:
|
|
3253
3323
|
callbacks.on_error(f"Node sync failed: {e}")
|
|
@@ -3258,19 +3328,6 @@ class Environment:
|
|
|
3258
3328
|
if callbacks:
|
|
3259
3329
|
callbacks.on_phase("resolve_models", f"Resolving workflows ({model_strategy} strategy)...")
|
|
3260
3330
|
|
|
3261
|
-
# Always prepare models to copy sources from global table, even for "skip"
|
|
3262
|
-
# This ensures download intents are preserved for later resolution
|
|
3263
|
-
workflows_with_intents = self.model_manager.prepare_import_with_model_strategy(model_strategy)
|
|
3264
|
-
|
|
3265
|
-
# Only auto-resolve if not "skip" strategy
|
|
3266
|
-
workflows_to_resolve = [] if model_strategy == "skip" else workflows_with_intents
|
|
3267
|
-
|
|
3268
|
-
# prepare_import_with_model_strategy() may update pyproject model entries.
|
|
3269
|
-
# Invalidate per-workflow cache entries so resolve_workflow() sees fresh
|
|
3270
|
-
# download intents instead of stale session-cached resolutions.
|
|
3271
|
-
for workflow_name in workflows_to_resolve:
|
|
3272
|
-
self.workflow_cache.invalidate(self.name, workflow_name)
|
|
3273
|
-
|
|
3274
3331
|
# Resolve workflows with download intents
|
|
3275
3332
|
from ..models.workflow import BatchDownloadCallbacks
|
|
3276
3333
|
from ..strategies.auto import AutoModelStrategy, AutoNodeStrategy
|
|
@@ -3288,8 +3345,30 @@ class Environment:
|
|
|
3288
3345
|
on_batch_complete=callbacks.on_download_batch_complete
|
|
3289
3346
|
)
|
|
3290
3347
|
|
|
3348
|
+
for download in self.model_manager.download_environment_models(model_strategy, download_callbacks):
|
|
3349
|
+
if not download.success:
|
|
3350
|
+
download_failures.append(("environment", download.filename))
|
|
3351
|
+
|
|
3352
|
+
# Always prepare models to copy sources from global table, even for "skip"
|
|
3353
|
+
# This ensures download intents are preserved for later resolution
|
|
3354
|
+
workflows_with_intents = self.model_manager.prepare_import_with_model_strategy(model_strategy)
|
|
3355
|
+
|
|
3356
|
+
# Only auto-resolve if not "skip" strategy
|
|
3357
|
+
workflows_to_resolve = [] if model_strategy == "skip" else workflows_with_intents
|
|
3358
|
+
|
|
3359
|
+
# prepare_import_with_model_strategy() may update pyproject model entries.
|
|
3360
|
+
# Invalidate per-workflow cache entries so resolve_workflow() sees fresh
|
|
3361
|
+
# download intents instead of stale session-cached resolutions.
|
|
3362
|
+
for workflow_name in workflows_to_resolve:
|
|
3363
|
+
self.workflow_cache.invalidate(self.name, workflow_name)
|
|
3364
|
+
|
|
3291
3365
|
for workflow_name in workflows_to_resolve:
|
|
3292
3366
|
try:
|
|
3367
|
+
manifest_downloads = self.workflow_manager.execute_manifest_downloads(
|
|
3368
|
+
workflow_name,
|
|
3369
|
+
self.pyproject.workflows.get_workflow_models(workflow_name),
|
|
3370
|
+
download_callbacks,
|
|
3371
|
+
)
|
|
3293
3372
|
result = self.resolve_workflow(
|
|
3294
3373
|
name=workflow_name,
|
|
3295
3374
|
model_strategy=AutoModelStrategy(),
|
|
@@ -3298,10 +3377,11 @@ class Environment:
|
|
|
3298
3377
|
)
|
|
3299
3378
|
|
|
3300
3379
|
# Track successful vs failed downloads from actual download results
|
|
3301
|
-
|
|
3380
|
+
all_downloads = [*manifest_downloads, *result.download_results]
|
|
3381
|
+
successful_downloads = sum(1 for dr in all_downloads if dr.success)
|
|
3302
3382
|
failed_downloads = [
|
|
3303
3383
|
(workflow_name, dr.filename)
|
|
3304
|
-
for dr in
|
|
3384
|
+
for dr in all_downloads
|
|
3305
3385
|
if not dr.success
|
|
3306
3386
|
]
|
|
3307
3387
|
|
|
@@ -3311,6 +3391,7 @@ class Environment:
|
|
|
3311
3391
|
callbacks.on_workflow_resolved(workflow_name, successful_downloads)
|
|
3312
3392
|
|
|
3313
3393
|
except Exception as e:
|
|
3394
|
+
download_failures.append((workflow_name, str(e)))
|
|
3314
3395
|
if callbacks:
|
|
3315
3396
|
callbacks.on_error(f"Failed to resolve {workflow_name}: {e}")
|
|
3316
3397
|
|
|
@@ -3318,6 +3399,18 @@ class Environment:
|
|
|
3318
3399
|
if download_failures and callbacks:
|
|
3319
3400
|
callbacks.on_download_failures(download_failures)
|
|
3320
3401
|
|
|
3402
|
+
if download_failures and model_strategy != "skip":
|
|
3403
|
+
from ..models.exceptions import CDModelDownloadError
|
|
3404
|
+
|
|
3405
|
+
formatted_failures = ", ".join(
|
|
3406
|
+
f"{model_name} (from {workflow_name})"
|
|
3407
|
+
for workflow_name, model_name in download_failures
|
|
3408
|
+
)
|
|
3409
|
+
raise CDModelDownloadError(
|
|
3410
|
+
f"{len(download_failures)} model(s) failed to download: {formatted_failures}",
|
|
3411
|
+
failures=download_failures
|
|
3412
|
+
)
|
|
3413
|
+
|
|
3321
3414
|
if no_manager:
|
|
3322
3415
|
self._set_headless_marker()
|
|
3323
3416
|
|
|
@@ -3331,18 +3424,6 @@ class Environment:
|
|
|
3331
3424
|
self.git_manager.commit_with_identity("Imported environment", add_all=True)
|
|
3332
3425
|
logger.info("Committed import changes")
|
|
3333
3426
|
|
|
3334
|
-
if download_failures and model_strategy != "skip":
|
|
3335
|
-
from ..models.exceptions import CDModelDownloadError
|
|
3336
|
-
|
|
3337
|
-
formatted_failures = ", ".join(
|
|
3338
|
-
f"{model_name} (from {workflow_name})"
|
|
3339
|
-
for workflow_name, model_name in download_failures
|
|
3340
|
-
)
|
|
3341
|
-
raise CDModelDownloadError(
|
|
3342
|
-
f"{len(download_failures)} model(s) failed to download: {formatted_failures}",
|
|
3343
|
-
failures=download_failures
|
|
3344
|
-
)
|
|
3345
|
-
|
|
3346
3427
|
logger.info("Import finalization completed successfully")
|
|
3347
3428
|
|
|
3348
3429
|
def _strip_local_path_sources(self) -> None:
|