comfygit-core 0.4.2__tar.gz → 0.6.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.4.2 → comfygit_core-0.6.0}/AGENTS.md +5 -5
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/CLAUDE.md +5 -5
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/PKG-INFO +2 -2
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/docs/architecture-deep-dive.md +3 -4
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/docs/architecture.md +20 -5
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/docs/layer-hierarchy.md +1 -2
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/docs/plans/uv-overlay-system.md +33 -21
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/pyproject.toml +2 -2
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/analyzers/__init__.py +2 -1
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/analyzers/model_scanner.py +1 -29
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/analyzers/node_classifier.py +1 -1
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/analyzers/node_git_analyzer.py +1 -1
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/analyzers/status_scanner.py +53 -16
- comfygit_core-0.6.0/src/comfygit_core/analyzers/unmanaged_comfyui_analyzer.py +733 -0
- comfygit_core-0.6.0/src/comfygit_core/assets.py +24 -0
- comfygit_core-0.6.0/src/comfygit_core/build_readiness.py +41 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/caching/api_cache.py +1 -2
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/caching/base.py +1 -1
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/caching/workflow_cache.py +351 -230
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/clients/civitai_client.py +10 -11
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/clients/registry_client.py +1 -1
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/configs/comfyui_models.py +2 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/configs/package_config.py +2 -2
- comfygit_core-0.6.0/src/comfygit_core/confirmation.py +8 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/constants.py +11 -2
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/core/environment.py +1001 -400
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/core/workspace.py +415 -54
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/factories/environment_factory.py +12 -4
- comfygit_core-0.6.0/src/comfygit_core/git.py +34 -0
- comfygit_core-0.6.0/src/comfygit_core/imports.py +31 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/infrastructure/sqlite_manager.py +18 -7
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/integrations/uv_command.py +75 -7
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/lifecycle/switch_observer.py +16 -3
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/managers/__init__.py +0 -1
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/managers/environment_git_orchestrator.py +35 -62
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/managers/environment_model_manager.py +4 -13
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/managers/export_import_manager.py +53 -3
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/managers/git_manager.py +4 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/managers/model_symlink_manager.py +2 -2
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/managers/node_manager.py +71 -15
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/managers/overlay_manager.py +2 -2
- comfygit_core-0.6.0/src/comfygit_core/managers/pyproject_manager.py +442 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/managers/pytorch_backend_manager.py +3 -3
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/managers/user_content_symlink_manager.py +2 -2
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/managers/uv_project_manager.py +130 -57
- comfygit_core-0.6.0/src/comfygit_core/managers/workflow_manager.py +1066 -0
- comfygit_core-0.6.0/src/comfygit_core/manifest/__init__.py +24 -0
- comfygit_core-0.6.0/src/comfygit_core/manifest/base.py +66 -0
- comfygit_core-0.6.0/src/comfygit_core/manifest/dependencies.py +117 -0
- comfygit_core-0.6.0/src/comfygit_core/manifest/disposable_project.py +154 -0
- comfygit_core-0.6.0/src/comfygit_core/manifest/migrations.py +111 -0
- comfygit_core-0.6.0/src/comfygit_core/manifest/models.py +139 -0
- comfygit_core-0.6.0/src/comfygit_core/manifest/nodes.py +135 -0
- comfygit_core-0.6.0/src/comfygit_core/manifest/overlays.py +260 -0
- comfygit_core-0.6.0/src/comfygit_core/manifest/pyproject_manifest.py +339 -0
- comfygit_core-0.6.0/src/comfygit_core/manifest/store.py +257 -0
- comfygit_core-0.6.0/src/comfygit_core/manifest/sync_config.py +87 -0
- comfygit_core-0.6.0/src/comfygit_core/manifest/uv_config.py +294 -0
- comfygit_core-0.6.0/src/comfygit_core/manifest/workflows.py +411 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/merging/atomic_executor.py +1 -1
- comfygit_core-0.6.0/src/comfygit_core/models/__init__.py +209 -0
- comfygit_core-0.6.0/src/comfygit_core/models/build_readiness.py +240 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/comfyui_builtin_versions.py +1 -1
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/environment.py +28 -7
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/exceptions.py +2 -2
- comfygit_core-0.6.0/src/comfygit_core/models/git.py +174 -0
- comfygit_core-0.6.0/src/comfygit_core/models/lifecycle.py +346 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/manifest.py +26 -2
- comfygit_core-0.6.0/src/comfygit_core/models/model_scan.py +32 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/overlay.py +47 -9
- comfygit_core-0.6.0/src/comfygit_core/models/readiness.py +195 -0
- comfygit_core-0.6.0/src/comfygit_core/models/runtime_config.py +80 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/shared.py +70 -3
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/sync.py +22 -0
- comfygit_core-0.6.0/src/comfygit_core/models/unmanaged_import.py +120 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/workflow.py +22 -15
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/workflow_contract.py +29 -4
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/workflow_execution.py +2 -1
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/workspace_config.py +0 -6
- comfygit_core-0.6.0/src/comfygit_core/readiness.py +47 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/repositories/comfyui_builtin_versions_repository.py +5 -1
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/repositories/model_repository.py +42 -12
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/repositories/node_mappings_repository.py +5 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/repositories/workspace_config_repository.py +13 -30
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/resolvers/model_resolver.py +1 -1
- comfygit_core-0.6.0/src/comfygit_core/runtime.py +84 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/services/__init__.py +3 -0
- comfygit_core-0.6.0/src/comfygit_core/services/build_readiness.py +742 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/services/dependency_resolution_preview.py +4 -4
- comfygit_core-0.6.0/src/comfygit_core/services/environment_lifecycle.py +1037 -0
- comfygit_core-0.6.0/src/comfygit_core/services/environment_readiness.py +372 -0
- comfygit_core-0.6.0/src/comfygit_core/services/environment_sync_coordinator.py +323 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/services/model_downloader.py +10 -8
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/services/node_lookup_service.py +90 -5
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/services/registry_data_manager.py +1 -1
- comfygit_core-0.6.0/src/comfygit_core/services/unmanaged_environment_import.py +252 -0
- comfygit_core-0.6.0/src/comfygit_core/services/workflow_analysis_cache.py +109 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/services/workflow_analysis_service.py +2 -2
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/services/workflow_execution.py +29 -5
- comfygit_core-0.6.0/src/comfygit_core/services/workflow_file_store.py +261 -0
- comfygit_core-0.6.0/src/comfygit_core/services/workflow_manifest_reconciler.py +432 -0
- comfygit_core-0.6.0/src/comfygit_core/services/workflow_manual_model_policy.py +46 -0
- comfygit_core-0.6.0/src/comfygit_core/services/workflow_model_dependency_service.py +218 -0
- comfygit_core-0.6.0/src/comfygit_core/services/workflow_model_download_coordinator.py +229 -0
- comfygit_core-0.6.0/src/comfygit_core/services/workflow_model_path_policy.py +308 -0
- comfygit_core-0.6.0/src/comfygit_core/services/workflow_node_package_policy.py +47 -0
- comfygit_core-0.6.0/src/comfygit_core/services/workflow_resolution_context_builder.py +325 -0
- comfygit_core-0.6.0/src/comfygit_core/services/workflow_resolution_fixer.py +397 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/services/workflow_resolution_service.py +1 -1
- comfygit_core-0.6.0/src/comfygit_core/services/workflow_state_cleanup.py +238 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/strategies/confirmation.py +1 -28
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/common.py +81 -17
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/conflict_analyzer.py +2 -2
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/dependency_probe.py +82 -3
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/download.py +63 -29
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/environment_cleanup.py +50 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/environment_lock.py +6 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/filesystem.py +19 -3
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/git.py +12 -2
- comfygit_core-0.6.0/src/comfygit_core/utils/provider_urls.py +32 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/pytorch_prober.py +100 -20
- comfygit_core-0.6.0/src/comfygit_core/utils/redaction.py +98 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/requirements.py +48 -0
- comfygit_core-0.6.0/src/comfygit_core/utils/toml_compat.py +10 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/validation/resolution_tester.py +5 -5
- comfygit_core-0.6.0/src/comfygit_core/workflow.py +32 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/caching/test_workflow_cache.py +10 -6
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/caching/test_workflow_cache_context_hash.py +128 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_branch_workflow_preservation.py +65 -34
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_context_aware_node_resolution.py +4 -7
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_dev_node_git_references.py +16 -4
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_download_cleanup.py +16 -9
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_download_intent_cache_invalidation.py +1 -1
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_environment_branching.py +14 -15
- comfygit_core-0.6.0/tests/integration/test_lifecycle_status.py +158 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_model_directory_switch.py +24 -17
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_model_resolution_stale_directory.py +2 -2
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_model_show_command.py +22 -9
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_model_source_management.py +2 -4
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_model_source_preservation.py +3 -6
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_multiple_optional_group_failures.py +39 -67
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_node_version_replacement.py +3 -1
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_optional_dependency_groups.py +36 -13
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_overlay_e2e.py +40 -29
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_overlay_git_integration.py +29 -1
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_overlay_system_integration.py +18 -43
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_pyproject_batch_writes.py +2 -2
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_pytorch_reconfiguration.py +4 -4
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_registry_node_update_empty_download_url.py +1 -1
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_runtime_restart_workflow_preservation.py +37 -0
- comfygit_core-0.6.0/tests/integration/test_workflow_cache_metadata_invalidation.py +172 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_workflow_caching_integration.py +15 -15
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_workflow_commit_flow.py +8 -9
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_workflow_deletion_cleanup.py +1 -1
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_workflow_resolution_pipeline.py +1 -1
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_workflow_subgraph_resolution.py +187 -0
- comfygit_core-0.6.0/tests/test_architecture_boundaries.py +30 -0
- comfygit_core-0.6.0/tests/test_public_api.py +340 -0
- comfygit_core-0.6.0/tests/unit/analyzers/test_node_git_analyzer.py +37 -0
- comfygit_core-0.6.0/tests/unit/analyzers/test_status_scanner.py +21 -0
- comfygit_core-0.6.0/tests/unit/analyzers/test_status_scanner_package_sync.py +25 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/caching/test_workspace_relative_caching.py +2 -1
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/clients/test_civitai_client.py +15 -5
- comfygit_core-0.6.0/tests/unit/core/test_environment_facades.py +338 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/core/test_environment_operation_locking.py +11 -0
- comfygit_core-0.6.0/tests/unit/core/test_environment_run.py +50 -0
- comfygit_core-0.6.0/tests/unit/core/test_environment_sync.py +27 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/core/test_sync_node_dependency_provisioning.py +4 -6
- comfygit_core-0.6.0/tests/unit/core/test_workflow_contract_access.py +12 -0
- comfygit_core-0.6.0/tests/unit/core/test_workspace_environment_creation.py +62 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/core/test_workspace_model_delete.py +41 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/managers/test_export_import_overlays.py +39 -1
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/managers/test_git_manager_gitignore.py +2 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/managers/test_node_manager.py +56 -1
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/managers/test_overlay_fuzz.py +68 -103
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/managers/test_overlay_manager.py +1 -2
- comfygit_core-0.4.2/tests/unit/managers/test_overlay_injection.py → comfygit_core-0.6.0/tests/unit/managers/test_overlay_materialization.py +93 -73
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/managers/test_pyproject_manager.py +249 -81
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/managers/test_pyproject_schema_version.py +53 -0
- comfygit_core-0.6.0/tests/unit/managers/test_pytorch_overlay_materialization.py +740 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/managers/test_uv_no_build_isolation.py +41 -3
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/managers/test_workflow_manager.py +72 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/managers/test_workflow_node_cleanup.py +27 -0
- comfygit_core-0.6.0/tests/unit/models/test_lifecycle.py +161 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/models/test_overlay.py +20 -3
- comfygit_core-0.6.0/tests/unit/models/test_workflow_contract.py +59 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/resolvers/test_global_node_resolver_v2.py +7 -5
- comfygit_core-0.6.0/tests/unit/services/test_build_readiness.py +573 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/services/test_dependency_resolution_preview.py +2 -2
- comfygit_core-0.6.0/tests/unit/services/test_environment_lifecycle.py +644 -0
- comfygit_core-0.6.0/tests/unit/services/test_environment_readiness.py +458 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/services/test_model_downloader.py +33 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/services/test_node_lookup_api_first.py +20 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/services/test_node_lookup_version_fallback.py +57 -1
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/services/test_scan_requirements_substitution.py +42 -0
- comfygit_core-0.6.0/tests/unit/services/test_unmanaged_environment_import.py +597 -0
- comfygit_core-0.6.0/tests/unit/services/test_workflow_analysis_cache.py +123 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/services/test_workflow_execution.py +35 -3
- comfygit_core-0.6.0/tests/unit/services/test_workflow_file_store.py +145 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/services/test_workflow_input.py +0 -1
- comfygit_core-0.6.0/tests/unit/services/test_workflow_model_dependency_service.py +176 -0
- comfygit_core-0.6.0/tests/unit/services/test_workflow_model_download_coordinator.py +238 -0
- comfygit_core-0.6.0/tests/unit/services/test_workflow_model_path_policy.py +149 -0
- comfygit_core-0.6.0/tests/unit/services/test_workflow_resolution_context_builder.py +264 -0
- comfygit_core-0.6.0/tests/unit/services/test_workflow_resolution_fixer.py +290 -0
- comfygit_core-0.6.0/tests/unit/services/test_workflow_state_cleanup.py +124 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_add_dependencies_substitution.py +1 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_environment_py_dependencies.py +25 -19
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_user_content_symlink_manager.py +22 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_workflow_manager_deduplication.py +46 -22
- comfygit_core-0.6.0/tests/unit/test_workspace_config_facade.py +58 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/utils/test_dependency_probe.py +167 -6
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/utils/test_environment_cleanup.py +43 -0
- comfygit_core-0.6.0/tests/unit/utils/test_filesystem.py +74 -0
- comfygit_core-0.6.0/tests/unit/utils/test_provider_auth_hardening.py +33 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/utils/test_pytorch_prober.py +192 -23
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/utils/test_requirements.py +21 -0
- comfygit_core-0.4.2/src/comfygit_core/managers/model_download_manager.py +0 -253
- comfygit_core-0.4.2/src/comfygit_core/managers/pyproject_manager.py +0 -2322
- comfygit_core-0.4.2/src/comfygit_core/managers/workflow_manager.py +0 -2298
- comfygit_core-0.4.2/src/comfygit_core/models/__init__.py +0 -71
- comfygit_core-0.4.2/src/comfygit_core/models/readiness.py +0 -90
- comfygit_core-0.4.2/src/comfygit_core/services/environment_readiness.py +0 -361
- comfygit_core-0.4.2/tests/test_public_api.py +0 -62
- comfygit_core-0.4.2/tests/unit/managers/test_pytorch_injection.py +0 -562
- comfygit_core-0.4.2/tests/unit/services/test_environment_readiness.py +0 -322
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/.gitignore +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/.python-version +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/LICENSE.txt +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/README.md +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/docs/knowledge/comfyui-node-loader-base-directories.md +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/docs/knowledge/model-tracking-system.md +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/docs/knowledge/node-resolution-behavior.md +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/__init__.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/analyzers/config_comparison.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/analyzers/custom_node_scanner.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/analyzers/git_change_parser.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/analyzers/ref_diff_analyzer.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/analyzers/workflow_dependency_parser.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/caching/__init__.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/caching/comfyui_cache.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/caching/custom_node_cache.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/clients/__init__.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/clients/github_client.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/configs/__init__.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/configs/comfyui_builtin_nodes.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/configs/model_config.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/core/__init__.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/data/overlays/stock/sageattention.toml +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/data/overlays/stock/triton.toml +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/data/overlays/stock/xformers.toml +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/factories/__init__.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/factories/uv_factory.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/factories/workspace_factory.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/infrastructure/__init__.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/integrations/__init__.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/lifecycle/__init__.py +2 -2
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/lifecycle/comfyui_readiness.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/logging/__init__.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/logging/logging_config.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/managers/system_node_symlink_manager.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/merging/__init__.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/merging/merge_validator.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/merging/semantic_merger.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/civitai.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/commit.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/dependency_resolution.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/materialization.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/merge_plan.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/node_mapping.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/protocols.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/ref_diff.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/registry.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/system.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/py.typed +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/repositories/__init__.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/repositories/migrate_paths.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/repositories/workflow_repository.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/resolvers/__init__.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/resolvers/global_node_resolver.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/services/huggingface_url.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/services/import_analyzer.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/services/model_source_lookup.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/services/workflow_input.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/strategies/__init__.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/strategies/auto.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/__init__.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/builtin_extractor.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/comfyui_ops.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/conflict_parser.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/dependency_parser.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/folder_paths_extractor.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/input_signature.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/model_categories.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/model_loader_extractor.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/node_identity.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/pytorch.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/retry.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/symlink_utils.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/system_detector.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/uuid.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/uv_error_handler.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/version.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/workflow_hash.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/validation/__init__.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/README.md +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/caching/TEST_REDUCTION_SUMMARY.md +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/caching/__init__.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/conftest.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/fixtures/models/test_models.json +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/fixtures/workflows/checkpoint_loader_with_missing_model.json +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/fixtures/workflows/kjnodes_workflow.json +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/fixtures/workflows/simple_txt2img.json +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/fixtures/workflows/with_custom_node.json +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/fixtures/workflows/with_missing_model.json +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/fixtures/workflows/workflow_with_duplicates.json +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/fixtures/workflows/workflow_with_properties.json +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/fixtures/workflows/workflow_without_properties.json +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/helpers/__init__.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/helpers/model_index_builder.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/helpers/pyproject_assertions.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/helpers/workflow_builder.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_atomic_semantic_merge.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_auto_model_index_sync.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_cache_invalidation_on_model_deletion.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_cache_node_version_invalidation.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_checkout_b_with_modified_workflow.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_commit_git_changes.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_commit_git_changes_SUMMARY.md +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_commit_history.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_create_with_version_spec.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_custom_node_path_preservation.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_deferred_model_downloads.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_deleted_model_download_intent.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_dependency_group_removal.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_dev_node_improvements.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_environment_basic.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_environment_create_progress.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_export_import.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_git_branching.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_git_import.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_git_pull_push.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_git_remote.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_git_subdirectory_import.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_import_auto_remote.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_import_comfyui_version_bug.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_import_preview.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_model_category_mismatch_detection.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_model_download_integration.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_model_index_mismatch_bug_SUMMARY.md +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_model_path_sync_detection.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_model_source_preservation_SUMMARY.md +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_model_source_removal.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_node_prune.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_opencv_conflict_resolution.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_package_config.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_per_environment_manager.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_registry_git_fallback.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_repair_completion_marker.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_repair_model_download.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_repair_node_removal.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_repair_workflow.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_requirements_inline_comments_bug.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_status_abstraction.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_status_uninstalled_nodes.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_workflow_model_criticality_update.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_workflow_path_update_after_interactive_resolution.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_workflow_resolution_cleanup.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_workflow_resolve_install.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/analyzers/test_config_comparison.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/analyzers/test_custom_node_scanner.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/analyzers/test_ref_diff_analyzer.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/analyzers/test_status_scanner_disabled_nodes.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/analyzers/test_workflow_dependency_parser.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/caching/test_cache_base.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/caching/test_comfyui_cache.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/caching/test_custom_node_cache_refactor.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/clients/test_civitai_parsing.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/clients/test_github_releases.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/configs/__init__.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/configs/test_package_config.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/core/test_environment_uninstalled_nodes.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/core/test_import_download_failures.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/core/test_import_no_manager.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/core/test_reserved_environment_names.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/factories/test_environment_factory_manager_install.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/lifecycle/test_comfyui_readiness.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/managers/test_environment_model_manager.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/managers/test_git_manager_log_refs.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/managers/test_model_index_manager.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/managers/test_model_short_hash.py +1 -1
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/managers/test_node_conflict_detection.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/managers/test_pytorch_backend_manager.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/managers/test_pytorch_stripping.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/managers/test_sqlite_manager.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/managers/test_workflow_status.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/merging/__init__.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/merging/test_atomic_executor.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/merging/test_merge_validator.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/merging/test_semantic_merger.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/models/test_comfyui_builtin_versions.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/models/test_ref_diff.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/models/test_workflow_dependencies.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/models/test_workflow_roundtrip.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/models/test_workflow_subgraph.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/resolvers/test_model_resolver.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/services/test_global_node_resolver.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/services/test_huggingface_url.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/services/test_import_analyzer.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/services/test_model_source_lookup.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/services/test_registry_data_manager.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/services/test_workflow_analysis_service.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/services/test_workflow_resolution_service.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_auto_strategies.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_builtin_extractor.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_dev_node_rename_detection.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_external_uv_cache.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_folder_paths_extractor.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_github_auth_config.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_github_url_installation.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_headless_import.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_materialization.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_minimal_schema_compatibility.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_model_config_dynamic_loading.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_model_downloader_errors.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_model_loader_extractor.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_model_repository_cleanup.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_model_symlink_manager.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_node_callbacks.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_node_conflict_context.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_node_mappings_repository.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_node_resolution_context.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_unified_node_search.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_uv_error_handling.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_uv_error_parser.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_workspace_config_resilience.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/utils/test_conflict_analyzer.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/utils/test_conflict_parser.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/utils/test_dependency_parser.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/utils/test_git.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/utils/test_input_signature.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/utils/test_node_identity.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/utils/test_pytorch.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/utils/test_symlink_utils.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/utils/test_uuid.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/utils/test_version.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/utils/__init__.py +0 -0
- {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/utils/test_workflow_hash.py +0 -0
|
@@ -54,7 +54,7 @@ Check existing managers/services before adding new abstractions.
|
|
|
54
54
|
|
|
55
55
|
| Manager | File | Main responsibility |
|
|
56
56
|
| --- | --- | --- |
|
|
57
|
-
| `PyprojectManager` | `managers/pyproject_manager.py` | Manifest CRUD and
|
|
57
|
+
| `PyprojectManager` | `managers/pyproject_manager.py` | Manifest CRUD and disposable UV overlay materialization. |
|
|
58
58
|
| `UVProjectManager` | `managers/uv_project_manager.py` | uv sync/add/remove operations. |
|
|
59
59
|
| `OverlayManager` | `managers/overlay_manager.py` | Overlay loading and legacy `.local-uv-config` migration. |
|
|
60
60
|
| `PyTorchBackendManager` | `managers/pytorch_backend_manager.py` | `.pytorch-backend`, GPU probing, torch source config. |
|
|
@@ -76,9 +76,9 @@ Machine-local sync inputs are not portable manifest truth:
|
|
|
76
76
|
- Local uv overrides now flow through overlays, with legacy `.local-uv-config`
|
|
77
77
|
migrated by `OverlayManager`.
|
|
78
78
|
|
|
79
|
-
`
|
|
80
|
-
PyTorch backend config
|
|
81
|
-
|
|
79
|
+
`UVProjectManager` copies the tracked manifest into a disposable project before
|
|
80
|
+
materializing local overlays and PyTorch backend config for uv operations. Keep
|
|
81
|
+
machine-local overlay materialization out of the tracked manifest.
|
|
82
82
|
|
|
83
83
|
## Dependency Criticality
|
|
84
84
|
|
|
@@ -101,7 +101,7 @@ Run tests from the repo root with uv:
|
|
|
101
101
|
```bash
|
|
102
102
|
uv run pytest packages/core/tests/ -v
|
|
103
103
|
uv run pytest packages/core/tests/unit/managers/test_pyproject_manager.py -v
|
|
104
|
-
uv run pytest packages/core/tests/ -k "
|
|
104
|
+
uv run pytest packages/core/tests/ -k "overlay or pytorch" -v
|
|
105
105
|
```
|
|
106
106
|
|
|
107
107
|
Core tests should usually exercise core APIs and fixtures rather than subprocess
|
|
@@ -54,7 +54,7 @@ Check existing managers/services before adding new abstractions.
|
|
|
54
54
|
|
|
55
55
|
| Manager | File | Main responsibility |
|
|
56
56
|
| --- | --- | --- |
|
|
57
|
-
| `PyprojectManager` | `managers/pyproject_manager.py` | Manifest CRUD and
|
|
57
|
+
| `PyprojectManager` | `managers/pyproject_manager.py` | Manifest CRUD and disposable UV overlay materialization. |
|
|
58
58
|
| `UVProjectManager` | `managers/uv_project_manager.py` | uv sync/add/remove operations. |
|
|
59
59
|
| `OverlayManager` | `managers/overlay_manager.py` | Overlay loading and legacy `.local-uv-config` migration. |
|
|
60
60
|
| `PyTorchBackendManager` | `managers/pytorch_backend_manager.py` | `.pytorch-backend`, GPU probing, torch source config. |
|
|
@@ -76,9 +76,9 @@ Machine-local sync inputs are not portable manifest truth:
|
|
|
76
76
|
- Local uv overrides now flow through overlays, with legacy `.local-uv-config`
|
|
77
77
|
migrated by `OverlayManager`.
|
|
78
78
|
|
|
79
|
-
`
|
|
80
|
-
PyTorch backend config
|
|
81
|
-
|
|
79
|
+
`UVProjectManager` copies the tracked manifest into a disposable project before
|
|
80
|
+
materializing local overlays and PyTorch backend config for uv operations. Keep
|
|
81
|
+
machine-local overlay materialization out of the tracked manifest.
|
|
82
82
|
|
|
83
83
|
## Dependency Criticality
|
|
84
84
|
|
|
@@ -101,7 +101,7 @@ Run tests from the repo root with uv:
|
|
|
101
101
|
```bash
|
|
102
102
|
uv run pytest packages/core/tests/ -v
|
|
103
103
|
uv run pytest packages/core/tests/unit/managers/test_pyproject_manager.py -v
|
|
104
|
-
uv run pytest packages/core/tests/ -k "
|
|
104
|
+
uv run pytest packages/core/tests/ -k "overlay or pytorch" -v
|
|
105
105
|
```
|
|
106
106
|
|
|
107
107
|
Core tests should usually exercise core APIs and fixtures rather than subprocess
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: comfygit-core
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.6.0
|
|
4
4
|
Summary: ComfyGit Core - Git-based ComfyUI environment manager
|
|
5
5
|
Project-URL: Documentation, https://docs.comfygit.org/
|
|
6
6
|
Project-URL: Repository, https://github.com/comfygit-ai/comfygit
|
|
@@ -10,7 +10,7 @@ Requires-Python: >=3.10
|
|
|
10
10
|
Requires-Dist: blake3>=0.3.3
|
|
11
11
|
Requires-Dist: huggingface-hub>=0.11.0
|
|
12
12
|
Requires-Dist: packaging>=16.2
|
|
13
|
-
Requires-Dist: requests>=2.
|
|
13
|
+
Requires-Dist: requests>=2.32.4
|
|
14
14
|
Requires-Dist: requirements-parser>=0.11.0
|
|
15
15
|
Requires-Dist: tomlkit>=0.11.0
|
|
16
16
|
Requires-Dist: uv>=0.11.8
|
|
@@ -301,12 +301,12 @@ flowchart TB
|
|
|
301
301
|
factories_uv["factories/uv_factory.py"]
|
|
302
302
|
end
|
|
303
303
|
|
|
304
|
-
subgraph L3["LAYER 3: Managers
|
|
304
|
+
subgraph L3["LAYER 3: Managers"]
|
|
305
305
|
direction LR
|
|
306
306
|
mgr_orchestrators["Orchestrators:<br/>environment_git_orchestrator<br/>environment_model_manager<br/>node_manager<br/>workflow_manager"]
|
|
307
307
|
mgr_config["Config:<br/>pyproject_manager<br/>uv_project_manager<br/>pytorch_backend_manager<br/>git_manager"]
|
|
308
308
|
mgr_symlink["Symlinks:<br/>model_symlink_manager<br/>user_content_symlink_manager<br/>system_node_symlink_manager"]
|
|
309
|
-
mgr_other["Other:<br/>export_import_manager
|
|
309
|
+
mgr_other["Other:<br/>export_import_manager"]
|
|
310
310
|
end
|
|
311
311
|
|
|
312
312
|
subgraph L4["LAYER 4: Services"]
|
|
@@ -405,7 +405,7 @@ flowchart TB
|
|
|
405
405
|
|---------|---------|
|
|
406
406
|
| `PyprojectManager` | All pyproject.toml operations via 5 handlers (deps, nodes, uv, workflows, models) |
|
|
407
407
|
| `UVProjectManager` | UV commands + pyproject coordination |
|
|
408
|
-
| `PyTorchBackendManager` | .pytorch-backend file management and config
|
|
408
|
+
| `PyTorchBackendManager` | .pytorch-backend file management and overlay config generation |
|
|
409
409
|
| `GitManager` | High-level git workflows (commit, pull, push, branch, merge) |
|
|
410
410
|
|
|
411
411
|
#### Symlink Managers
|
|
@@ -419,7 +419,6 @@ flowchart TB
|
|
|
419
419
|
| Manager | Purpose |
|
|
420
420
|
|---------|---------|
|
|
421
421
|
| `ExportImportManager` | Environment bundling for portability |
|
|
422
|
-
| `ModelDownloadManager` | Model downloads from various sources |
|
|
423
422
|
|
|
424
423
|
---
|
|
425
424
|
|
|
@@ -7,7 +7,7 @@ ComfyGit Core is a **library-first Python package** providing environment manage
|
|
|
7
7
|
```
|
|
8
8
|
┌─────────────────────────────────────────┐
|
|
9
9
|
│ Public API Layer │
|
|
10
|
-
│ Workspace, Environment
|
|
10
|
+
│ Workspace, Environment, facade exports │
|
|
11
11
|
└──────────────┬──────────────────────────┘
|
|
12
12
|
│
|
|
13
13
|
┌──────────────▼──────────────────────────┐
|
|
@@ -40,14 +40,16 @@ ComfyGit Core is a **library-first Python package** providing environment manage
|
|
|
40
40
|
| Module | Purpose | Key Concepts |
|
|
41
41
|
|--------|---------|--------------|
|
|
42
42
|
| **core/** | Public API | Workspace (multi-env), Environment (single env) |
|
|
43
|
-
| **models/** |
|
|
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
45
|
| **managers/** | Orchestration | Environment orchestrators (Git, Model), Resource managers (Node, Workflow, Model symlinks), Config managers (PyProject, UV, PyTorch backend) |
|
|
46
|
+
| **manifest/** | Internal manifest abstraction | Pyproject-backed store, section handlers, edit helpers, overlay materialization, migration cleanup |
|
|
45
47
|
| **analyzers/** | Analysis | Parse workflows/git/status; classify nodes |
|
|
46
48
|
| **resolvers/** | Resolution | Map workflow nodes to packages; resolve model sources |
|
|
47
49
|
| **services/** | Business logic | Lookup, registry, downloads, import analysis |
|
|
48
50
|
| **repositories/** | Persistence | SQLite caching, workflow cache, config storage |
|
|
49
51
|
| **clients/** | External APIs | CivitAI, GitHub, ComfyUI registry |
|
|
50
|
-
| **factories/** | DI | Create Workspace/Environment with dependencies |
|
|
52
|
+
| **factories/** | Internal DI | Create Workspace/Environment with dependencies behind public facades |
|
|
51
53
|
| **utils/** | Low-level | Git, filesystem, parsing, version, download |
|
|
52
54
|
| **caching/** | Cache layer | API cache, custom node cache, workflow cache |
|
|
53
55
|
| **configs/** | Reference data | Builtin nodes, model categories |
|
|
@@ -73,9 +75,10 @@ ComfyGit Core is a **library-first Python package** providing environment manage
|
|
|
73
75
|
## Key Entry Points
|
|
74
76
|
|
|
75
77
|
**Workspace Operations:**
|
|
78
|
+
- `Workspace.open()` - Discover and load an existing workspace
|
|
76
79
|
- `Workspace.create()` - Create new workspace with validation
|
|
77
|
-
- `Workspace.
|
|
78
|
-
- `
|
|
80
|
+
- `Workspace.open_or_create()` - Setup-friendly load-or-create entry point
|
|
81
|
+
- `Workspace.list_environments()` / `get_environment()` - List/get environments
|
|
79
82
|
- `Workspace.get_schema_version()` / `is_legacy_schema()` - Check workspace version
|
|
80
83
|
- `Workspace.upgrade_schema_if_needed()` - Migrate to current schema
|
|
81
84
|
|
|
@@ -92,6 +95,18 @@ ComfyGit Core is a **library-first Python package** providing environment manage
|
|
|
92
95
|
- `GlobalNodeResolver.search_packages()` - Fuzzy search with heuristic boosting
|
|
93
96
|
- `ModelResolver.resolve_model()` - Resolve model sources using multiple strategies
|
|
94
97
|
|
|
98
|
+
Low-level resolvers, managers, repositories, factories, and utilities are
|
|
99
|
+
implementation details unless re-exported through a public facade module.
|
|
100
|
+
Adapters should import from `comfygit_core`, `comfygit_core.models`, or the
|
|
101
|
+
explicit facade modules instead of deep implementation paths.
|
|
102
|
+
|
|
103
|
+
The `manifest/` package is the internal boundary around the current
|
|
104
|
+
`pyproject.toml` implementation. `PyprojectManager` remains the compatibility
|
|
105
|
+
facade for existing core internals, but document storage, section ownership,
|
|
106
|
+
overlay materialization, and disposable uv project sync should live behind
|
|
107
|
+
manifest helpers. New callers should prefer `Environment.get_manifest_snapshot()`
|
|
108
|
+
or the public Environment/Workspace facade methods instead of reading raw TOML.
|
|
109
|
+
|
|
95
110
|
## Dependencies
|
|
96
111
|
|
|
97
112
|
**External:** aiohttp, requests, uv, pyyaml, tomlkit, blake3, packaging, psutil, requirements-parser
|
|
@@ -167,7 +167,6 @@ This document defines the import hierarchy and functional responsibilities for t
|
|
|
167
167
|
- `workflow_manager.py` - Workflow analysis/resolution/commit operations
|
|
168
168
|
- `model_path_manager.py` - Model path configuration
|
|
169
169
|
- `model_manifest_manager.py` - Model manifest operations
|
|
170
|
-
- `model_download_manager.py` - Model download operations
|
|
171
170
|
- `git_manager.py` - Git commit/rollback operations
|
|
172
171
|
|
|
173
172
|
---
|
|
@@ -323,4 +322,4 @@ environment_factory.py (Layer 7)
|
|
|
323
322
|
→ git_manager.py (Layer 6)
|
|
324
323
|
→ utils/git.py (Layer 1)
|
|
325
324
|
→ models/exceptions.py (Layer 0)
|
|
326
|
-
```
|
|
325
|
+
```
|
|
@@ -7,25 +7,37 @@
|
|
|
7
7
|
|
|
8
8
|
ComfyGit environments currently embed ALL dependencies (including platform-specific packages like `sageattention`) directly in pyproject.toml. UV resolves all dependencies — including optional ones — during `uv sync`, which means packages that cannot be built on the local machine (e.g., CUDA-only packages on macOS) cause resolution failures even when the user never requested that extra.
|
|
9
9
|
|
|
10
|
-
The
|
|
10
|
+
The earlier machine-local dependency system had two separate mechanisms:
|
|
11
11
|
- `.pytorch-backend` — auto-detected PyTorch backend (custom format, auto-gitignored)
|
|
12
12
|
- `.local-uv-config` — machine-specific UV sources/indexes (TOML, auto-gitignored)
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
Those paths have converged on overlays. Sync/run copy the tracked
|
|
15
|
+
`pyproject.toml` into a disposable project, materialize overlay-derived UV
|
|
16
|
+
configuration there, run uv from the disposable project, then discard it.
|
|
17
|
+
The tracked manifest is not mutated by local overlays.
|
|
15
18
|
|
|
16
|
-
**The goal:** A composable overlay system where `.toml` files can
|
|
19
|
+
**The goal:** A composable overlay system where `.toml` files can add
|
|
20
|
+
additional dependencies, UV sources, constraints, and settings into resolution,
|
|
21
|
+
layered on top of the base pyproject.toml in a disposable project. Some
|
|
22
|
+
overlays are shareable (checked into git), others are machine-local
|
|
23
|
+
(gitignored). This enables environments to ship minimal portable dependencies
|
|
24
|
+
while letting users opt into platform-specific acceleration packages.
|
|
17
25
|
|
|
18
26
|
## Proposed Solution
|
|
19
27
|
|
|
20
28
|
### Concept: UV Overlays
|
|
21
29
|
|
|
22
|
-
An **overlay** is a standalone TOML file that declares additional packages and
|
|
30
|
+
An **overlay** is a standalone TOML file that declares additional packages and
|
|
31
|
+
UV configuration to merge into a disposable pyproject during sync/run. Overlays
|
|
32
|
+
compose additively — multiple overlays can be stacked.
|
|
23
33
|
|
|
24
34
|
**Two types:**
|
|
25
35
|
1. **Shared overlays** — Checked into git alongside the environment (e.g., `sageattention.toml`). Available to anyone who clones the environment. Opt-in at runtime.
|
|
26
36
|
2. **Local overlays** — Machine-specific, auto-gitignored (e.g., dev source paths, private indexes). Always active when present.
|
|
27
37
|
|
|
28
|
-
**PyTorch becomes a special-cased auto-generated overlay** — the probing logic
|
|
38
|
+
**PyTorch becomes a special-cased auto-generated overlay** — the probing logic
|
|
39
|
+
stays, but it produces config in the same format as any other overlay, and
|
|
40
|
+
disposable materialization treats it uniformly.
|
|
29
41
|
|
|
30
42
|
### Overlay File Format
|
|
31
43
|
|
|
@@ -38,7 +50,7 @@ Overlays use a flat TOML structure (similar to `uv.toml`, not the nested `[tool.
|
|
|
38
50
|
description = "SageAttention GPU acceleration for CUDA systems"
|
|
39
51
|
|
|
40
52
|
[dependencies]
|
|
41
|
-
# Packages to
|
|
53
|
+
# Packages to materialize into [project.dependencies]
|
|
42
54
|
packages = ["sageattention"]
|
|
43
55
|
|
|
44
56
|
[sources]
|
|
@@ -57,7 +69,7 @@ requires-dist = ["torch"]
|
|
|
57
69
|
requires-python = ">=3.9"
|
|
58
70
|
|
|
59
71
|
[constraints]
|
|
60
|
-
# Version constraints to
|
|
72
|
+
# Version constraints to materialize (maps to [tool.uv.constraint-dependencies])
|
|
61
73
|
packages = []
|
|
62
74
|
|
|
63
75
|
[[index]]
|
|
@@ -89,7 +101,7 @@ Overlays can be activated three ways:
|
|
|
89
101
|
|
|
90
102
|
1. **CLI flag (one-time):** `cg run --overlay sageattention` or `cg sync --overlay sageattention`
|
|
91
103
|
2. **Persistent config:** `cg env-config overlays enable sageattention` (writes to `.overlay-config.toml`)
|
|
92
|
-
3. **Always-on local:** `.local.toml` overlay is always
|
|
104
|
+
3. **Always-on local:** `.local.toml` overlay is always applied when present (replaces `.local-uv-config`)
|
|
93
105
|
|
|
94
106
|
`.overlay-config.toml` format:
|
|
95
107
|
```toml
|
|
@@ -114,11 +126,11 @@ Overlays merge **additively** in order: base pyproject.toml → local overlay
|
|
|
114
126
|
|
|
115
127
|
### PyTorch Integration
|
|
116
128
|
|
|
117
|
-
PyTorch stays special-cased for **probing** (auto-detection logic remains in `PyTorchBackendManager`), but
|
|
129
|
+
PyTorch stays special-cased for **probing** (auto-detection logic remains in `PyTorchBackendManager`), but materialization now goes through the same overlay pipeline:
|
|
118
130
|
|
|
119
131
|
1. `PyTorchBackendManager.get_pytorch_config()` returns the same dict format it does now
|
|
120
|
-
2. The
|
|
121
|
-
3. PyTorch is always
|
|
132
|
+
2. The overlay manager converts it to overlay format internally
|
|
133
|
+
3. PyTorch is always applied **last** so it wins on torch/torchvision/torchaudio conflicts
|
|
122
134
|
|
|
123
135
|
The `.pytorch-backend` file stays as-is (probing state storage). No migration needed — it's an implementation detail of the PyTorch overlay generation.
|
|
124
136
|
|
|
@@ -132,7 +144,7 @@ Per project philosophy of "no legacy/backwards-compatible code": auto-migrate on
|
|
|
132
144
|
|
|
133
145
|
1. **Create `OverlayConfig` model** — Dataclass for parsed overlay
|
|
134
146
|
- Fields: description, dependencies, sources, settings, dependency_metadata, constraints, indexes
|
|
135
|
-
- `
|
|
147
|
+
- `to_uv_payload() -> dict` — Convert to the UV pyproject payload format
|
|
136
148
|
- Files: `packages/core/src/comfygit_core/models/overlay.py`
|
|
137
149
|
|
|
138
150
|
2. **Create `OverlayManager`** — New manager class
|
|
@@ -144,12 +156,12 @@ Per project philosophy of "no legacy/backwards-compatible code": auto-migrate on
|
|
|
144
156
|
- Auto-migrate `.local-uv-config` to `.cec/overlays/.local.toml` on first access
|
|
145
157
|
- Files: `packages/core/src/comfygit_core/managers/overlay_manager.py`
|
|
146
158
|
|
|
147
|
-
3. **
|
|
148
|
-
-
|
|
149
|
-
- Add dependency
|
|
150
|
-
- Add `dependency-metadata`
|
|
151
|
-
- Add `no-build-isolation-package`
|
|
152
|
-
- Keep strip-before-
|
|
159
|
+
3. **Materialize overlays into disposable projects**
|
|
160
|
+
- Use `PyprojectManager.apply_uv_overlays(overlays)` on generated project copies
|
|
161
|
+
- Add dependency materialization support for `[project.dependencies]`
|
|
162
|
+
- Add `dependency-metadata` materialization into `[[tool.uv.dependency-metadata]]`
|
|
163
|
+
- Add `no-build-isolation-package` materialization
|
|
164
|
+
- Keep strip-before-apply pattern for PyTorch
|
|
153
165
|
- Files: `packages/core/src/comfygit_core/managers/pyproject_manager.py` (lines 466-539, 766-854)
|
|
154
166
|
|
|
155
167
|
4. **Update `UVProjectManager.sync_project()`** — Use overlay pipeline
|
|
@@ -203,7 +215,7 @@ Per project philosophy of "no legacy/backwards-compatible code": auto-migrate on
|
|
|
203
215
|
|------|---------|
|
|
204
216
|
| `packages/core/src/comfygit_core/managers/overlay_manager.py` | **NEW** — Overlay loading, activation, collection |
|
|
205
217
|
| `packages/core/src/comfygit_core/models/overlay.py` | **NEW** — OverlayConfig dataclass |
|
|
206
|
-
| `packages/core/src/comfygit_core/managers/pyproject_manager.py` |
|
|
218
|
+
| `packages/core/src/comfygit_core/managers/pyproject_manager.py` | Overlay materialization methods |
|
|
207
219
|
| `packages/core/src/comfygit_core/managers/uv_project_manager.py` | Update sync to use overlay pipeline |
|
|
208
220
|
| `packages/core/src/comfygit_core/core/environment.py` | Wire overlay collection into sync/run |
|
|
209
221
|
| `packages/core/src/comfygit_core/managers/pytorch_backend_manager.py` | No changes — generates config consumed as overlay internally |
|
|
@@ -215,9 +227,9 @@ Per project philosophy of "no legacy/backwards-compatible code": auto-migrate on
|
|
|
215
227
|
## Testing Strategy
|
|
216
228
|
|
|
217
229
|
- **Unit tests for OverlayManager:** Load/parse overlay files, collect in correct order, validate format
|
|
218
|
-
- **Unit tests for overlay
|
|
230
|
+
- **Unit tests for overlay materialization:** Verify dependencies, sources, constraints, metadata merge correctly into pyproject config
|
|
219
231
|
- **Unit test for migration:** `.local-uv-config` auto-migrates to `.local.toml`
|
|
220
|
-
- **Integration test:** End-to-end sync with overlay applied, verify pyproject
|
|
232
|
+
- **Integration test:** End-to-end sync with overlay applied, verify tracked pyproject remains clean after sync
|
|
221
233
|
- **2-3 tests per component** per project guidelines
|
|
222
234
|
|
|
223
235
|
## Open Questions
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "comfygit-core"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.6.0"
|
|
4
4
|
description = "ComfyGit Core - Git-based ComfyUI environment manager"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.10"
|
|
@@ -8,7 +8,7 @@ dependencies = [
|
|
|
8
8
|
"blake3>=0.3.3",
|
|
9
9
|
"huggingface_hub>=0.11.0",
|
|
10
10
|
"packaging>=16.2",
|
|
11
|
-
"requests>=2.
|
|
11
|
+
"requests>=2.32.4",
|
|
12
12
|
"requirements-parser>=0.11.0",
|
|
13
13
|
"tomlkit>=0.11.0",
|
|
14
14
|
"uv>=0.11.8",
|
|
@@ -21,6 +21,8 @@ _EXPORTS: dict[str, str] = {
|
|
|
21
21
|
"get_node_git_info": "node_git_analyzer",
|
|
22
22
|
"RefDiffAnalyzer": "ref_diff_analyzer",
|
|
23
23
|
"StatusScanner": "status_scanner",
|
|
24
|
+
"detect_unmanaged_comfyui_path": "unmanaged_comfyui_analyzer",
|
|
25
|
+
"scan_unmanaged_comfyui": "unmanaged_comfyui_analyzer",
|
|
24
26
|
"WorkflowDependencyParser": "workflow_dependency_parser",
|
|
25
27
|
}
|
|
26
28
|
|
|
@@ -39,4 +41,3 @@ def __getattr__(name: str) -> Any:
|
|
|
39
41
|
|
|
40
42
|
def __dir__() -> list[str]:
|
|
41
43
|
return sorted(set(globals()) | set(__all__))
|
|
42
|
-
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"""ModelScanner - Model file discovery, hashing, and indexing operations."""
|
|
2
2
|
from __future__ import annotations
|
|
3
3
|
|
|
4
|
-
from dataclasses import dataclass
|
|
5
4
|
from enum import Enum
|
|
6
5
|
from pathlib import Path
|
|
7
6
|
from typing import TYPE_CHECKING
|
|
@@ -9,6 +8,7 @@ from typing import TYPE_CHECKING
|
|
|
9
8
|
from ..configs.model_config import ModelConfig
|
|
10
9
|
from ..logging.logging_config import get_logger
|
|
11
10
|
from ..models.exceptions import ComfyDockError
|
|
11
|
+
from ..models.model_scan import ModelScanProgress, ScanResult
|
|
12
12
|
|
|
13
13
|
if TYPE_CHECKING:
|
|
14
14
|
from ..repositories.model_repository import ModelRepository
|
|
@@ -44,34 +44,6 @@ MIN_MODEL_SIZE = 8
|
|
|
44
44
|
# Minimum file size for model files (8 bytes)
|
|
45
45
|
|
|
46
46
|
|
|
47
|
-
@dataclass
|
|
48
|
-
class ScanResult:
|
|
49
|
-
"""Result of model scanning operation."""
|
|
50
|
-
scanned_count: int
|
|
51
|
-
added_count: int
|
|
52
|
-
updated_count: int
|
|
53
|
-
skipped_count: int
|
|
54
|
-
error_count: int
|
|
55
|
-
errors: list[str]
|
|
56
|
-
removed_count: int = 0
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
class ModelScanProgress:
|
|
60
|
-
"""Callback protocol for model scan progress updates."""
|
|
61
|
-
|
|
62
|
-
def on_scan_start(self, total_files: int) -> None:
|
|
63
|
-
"""Called when scan starts with total file count."""
|
|
64
|
-
pass
|
|
65
|
-
|
|
66
|
-
def on_file_processed(self, current: int, total: int, filename: str) -> None:
|
|
67
|
-
"""Called after each file is processed."""
|
|
68
|
-
pass
|
|
69
|
-
|
|
70
|
-
def on_scan_complete(self, result: ScanResult) -> None:
|
|
71
|
-
"""Called when scan completes."""
|
|
72
|
-
pass
|
|
73
|
-
|
|
74
|
-
|
|
75
47
|
class ModelScanner:
|
|
76
48
|
"""Model file discovery, hashing, and indexing operations."""
|
|
77
49
|
|
|
@@ -5,11 +5,11 @@ import json
|
|
|
5
5
|
from dataclasses import dataclass, field
|
|
6
6
|
from pathlib import Path
|
|
7
7
|
from typing import TYPE_CHECKING
|
|
8
|
-
import tomllib
|
|
9
8
|
|
|
10
9
|
from ..configs.comfyui_builtin_nodes import COMFYUI_BUILTIN_NODES
|
|
11
10
|
from ..logging.logging_config import get_logger
|
|
12
11
|
from ..models.comfyui_builtin_versions import BuiltinVersionGateInfo
|
|
12
|
+
from ..utils.toml_compat import tomllib
|
|
13
13
|
|
|
14
14
|
if TYPE_CHECKING:
|
|
15
15
|
from ..configs.model_config import ModelConfig
|
{comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/analyzers/node_git_analyzer.py
RENAMED
|
@@ -67,7 +67,7 @@ def get_node_git_info(node_path: Path) -> GitInfo | None:
|
|
|
67
67
|
git_info.github_repo = github_match.group(2).replace(".git", "")
|
|
68
68
|
|
|
69
69
|
# Check if there are uncommitted changes
|
|
70
|
-
status_entries = git_status_porcelain(node_path)
|
|
70
|
+
status_entries = git_status_porcelain(node_path, check=False)
|
|
71
71
|
git_info.is_dirty = bool(status_entries)
|
|
72
72
|
|
|
73
73
|
return git_info
|
|
@@ -41,6 +41,25 @@ def _versions_match(actual: str | None, expected: str | None) -> bool:
|
|
|
41
41
|
return False
|
|
42
42
|
|
|
43
43
|
|
|
44
|
+
_UV_DRY_RUN_CHANGE_PREFIXES = (
|
|
45
|
+
"Would update lockfile",
|
|
46
|
+
"Would download ",
|
|
47
|
+
"Would install ",
|
|
48
|
+
"Would uninstall ",
|
|
49
|
+
"Would upgrade ",
|
|
50
|
+
"Would downgrade ",
|
|
51
|
+
"Would remove ",
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def _uv_dry_run_reports_changes(output: str) -> bool:
|
|
56
|
+
"""Return True when uv dry-run output says sync would mutate the env."""
|
|
57
|
+
return any(
|
|
58
|
+
line.strip().startswith(_UV_DRY_RUN_CHANGE_PREFIXES)
|
|
59
|
+
for line in output.splitlines()
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
|
|
44
63
|
class StatusScanner:
|
|
45
64
|
"""Scans environment to get current state."""
|
|
46
65
|
|
|
@@ -58,7 +77,12 @@ class StatusScanner:
|
|
|
58
77
|
self._comfyui_path = comfyui_path
|
|
59
78
|
self._pytorch_manager = pytorch_manager
|
|
60
79
|
|
|
61
|
-
def get_full_comparison(
|
|
80
|
+
def get_full_comparison(
|
|
81
|
+
self,
|
|
82
|
+
*,
|
|
83
|
+
check_package_sync: bool = False,
|
|
84
|
+
backend_override: str | None = None,
|
|
85
|
+
) -> EnvironmentComparison:
|
|
62
86
|
"""Get complete environment comparison with all details.
|
|
63
87
|
|
|
64
88
|
Args:
|
|
@@ -77,17 +101,19 @@ class StatusScanner:
|
|
|
77
101
|
# Get basic comparison
|
|
78
102
|
comparison = self.compare_states(current, expected)
|
|
79
103
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
104
|
+
if check_package_sync:
|
|
105
|
+
package_status = self.check_packages_sync(
|
|
106
|
+
backend_override=backend_override
|
|
107
|
+
)
|
|
108
|
+
comparison.packages_in_sync = package_status.in_sync
|
|
109
|
+
comparison.package_sync_message = package_status.message
|
|
110
|
+
else:
|
|
111
|
+
# Keep high-frequency status fast unless the manifest diff says uv
|
|
112
|
+
# materialization may be needed. Package drift self-corrects on the
|
|
113
|
+
# next explicit sync/run path, but dependency edits should guide the
|
|
114
|
+
# user to sync before committing.
|
|
115
|
+
comparison.packages_in_sync = True
|
|
116
|
+
comparison.package_sync_message = ""
|
|
91
117
|
|
|
92
118
|
return comparison
|
|
93
119
|
|
|
@@ -273,7 +299,7 @@ class StatusScanner:
|
|
|
273
299
|
Returns:
|
|
274
300
|
Expected environment state from configuration
|
|
275
301
|
"""
|
|
276
|
-
self._pyproject.
|
|
302
|
+
self._pyproject.get_manifest_snapshot()
|
|
277
303
|
|
|
278
304
|
# Get expected custom nodes from pyproject
|
|
279
305
|
node_infos = self._pyproject.nodes.get_existing()
|
|
@@ -400,7 +426,11 @@ class StatusScanner:
|
|
|
400
426
|
|
|
401
427
|
return comparison
|
|
402
428
|
|
|
403
|
-
def check_packages_sync(
|
|
429
|
+
def check_packages_sync(
|
|
430
|
+
self,
|
|
431
|
+
*,
|
|
432
|
+
backend_override: str | None = None,
|
|
433
|
+
) -> PackageSyncStatus:
|
|
404
434
|
"""Check if packages are in sync with pyproject.toml.
|
|
405
435
|
|
|
406
436
|
Returns:
|
|
@@ -408,15 +438,22 @@ class StatusScanner:
|
|
|
408
438
|
"""
|
|
409
439
|
try:
|
|
410
440
|
# Use UV's dry-run to check if sync would change anything
|
|
411
|
-
# PyTorch
|
|
441
|
+
# Disposable PyTorch overlay materialization ensures the check uses the correct backend.
|
|
412
442
|
extras, all_extras = self._pyproject.resolve_sync_extras(None, False)
|
|
413
|
-
self._uv.sync_project(
|
|
443
|
+
dry_run_output = self._uv.sync_project(
|
|
414
444
|
dry_run=True,
|
|
415
445
|
all_groups=True,
|
|
416
446
|
pytorch_manager=self._pytorch_manager,
|
|
447
|
+
backend_override=backend_override,
|
|
417
448
|
extras=extras,
|
|
418
449
|
all_extras=all_extras,
|
|
419
450
|
)
|
|
451
|
+
if _uv_dry_run_reports_changes(dry_run_output):
|
|
452
|
+
return PackageSyncStatus(
|
|
453
|
+
in_sync=False,
|
|
454
|
+
message="Packages out of sync (run 'cg sync' to update)",
|
|
455
|
+
details=dry_run_output,
|
|
456
|
+
)
|
|
420
457
|
return PackageSyncStatus(
|
|
421
458
|
in_sync=True, message="Packages match pyproject.toml"
|
|
422
459
|
)
|