comfygit-core 0.4.1__tar.gz → 0.4.2__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.
Files changed (367) hide show
  1. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/PKG-INFO +1 -1
  2. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/pyproject.toml +1 -1
  3. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/core/environment.py +2 -1
  4. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/managers/node_manager.py +69 -40
  5. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_per_environment_manager.py +97 -0
  6. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_registry_node_update_empty_download_url.py +5 -12
  7. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/.gitignore +0 -0
  8. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/.python-version +0 -0
  9. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/AGENTS.md +0 -0
  10. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/CLAUDE.md +0 -0
  11. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/LICENSE.txt +0 -0
  12. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/README.md +0 -0
  13. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/docs/architecture-deep-dive.md +0 -0
  14. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/docs/architecture.md +0 -0
  15. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/docs/knowledge/comfyui-node-loader-base-directories.md +0 -0
  16. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/docs/knowledge/model-tracking-system.md +0 -0
  17. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/docs/knowledge/node-resolution-behavior.md +0 -0
  18. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/docs/layer-hierarchy.md +0 -0
  19. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/docs/plans/uv-overlay-system.md +0 -0
  20. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/__init__.py +0 -0
  21. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/analyzers/__init__.py +0 -0
  22. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/analyzers/config_comparison.py +0 -0
  23. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/analyzers/custom_node_scanner.py +0 -0
  24. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/analyzers/git_change_parser.py +0 -0
  25. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/analyzers/model_scanner.py +0 -0
  26. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/analyzers/node_classifier.py +0 -0
  27. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/analyzers/node_git_analyzer.py +0 -0
  28. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/analyzers/ref_diff_analyzer.py +0 -0
  29. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/analyzers/status_scanner.py +0 -0
  30. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/analyzers/workflow_dependency_parser.py +0 -0
  31. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/caching/__init__.py +0 -0
  32. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/caching/api_cache.py +0 -0
  33. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/caching/base.py +0 -0
  34. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/caching/comfyui_cache.py +0 -0
  35. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/caching/custom_node_cache.py +0 -0
  36. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/caching/workflow_cache.py +0 -0
  37. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/clients/__init__.py +0 -0
  38. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/clients/civitai_client.py +0 -0
  39. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/clients/github_client.py +0 -0
  40. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/clients/registry_client.py +0 -0
  41. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/configs/__init__.py +0 -0
  42. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/configs/comfyui_builtin_nodes.py +0 -0
  43. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/configs/comfyui_models.py +0 -0
  44. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/configs/model_config.py +0 -0
  45. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/configs/package_config.py +0 -0
  46. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/constants.py +0 -0
  47. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/core/__init__.py +0 -0
  48. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/core/workspace.py +0 -0
  49. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/data/overlays/stock/sageattention.toml +0 -0
  50. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/data/overlays/stock/triton.toml +0 -0
  51. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/data/overlays/stock/xformers.toml +0 -0
  52. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/factories/__init__.py +0 -0
  53. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/factories/environment_factory.py +0 -0
  54. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/factories/uv_factory.py +0 -0
  55. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/factories/workspace_factory.py +0 -0
  56. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/infrastructure/__init__.py +0 -0
  57. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/infrastructure/sqlite_manager.py +0 -0
  58. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/integrations/__init__.py +0 -0
  59. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/integrations/uv_command.py +0 -0
  60. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/lifecycle/__init__.py +0 -0
  61. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/lifecycle/comfyui_readiness.py +0 -0
  62. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/lifecycle/switch_observer.py +0 -0
  63. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/logging/__init__.py +0 -0
  64. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/logging/logging_config.py +0 -0
  65. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/managers/__init__.py +0 -0
  66. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/managers/environment_git_orchestrator.py +0 -0
  67. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/managers/environment_model_manager.py +0 -0
  68. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/managers/export_import_manager.py +0 -0
  69. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/managers/git_manager.py +0 -0
  70. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/managers/model_download_manager.py +0 -0
  71. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/managers/model_symlink_manager.py +0 -0
  72. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/managers/overlay_manager.py +0 -0
  73. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/managers/pyproject_manager.py +0 -0
  74. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/managers/pytorch_backend_manager.py +0 -0
  75. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/managers/system_node_symlink_manager.py +0 -0
  76. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/managers/user_content_symlink_manager.py +0 -0
  77. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/managers/uv_project_manager.py +0 -0
  78. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/managers/workflow_manager.py +0 -0
  79. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/merging/__init__.py +0 -0
  80. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/merging/atomic_executor.py +0 -0
  81. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/merging/merge_validator.py +0 -0
  82. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/merging/semantic_merger.py +0 -0
  83. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/models/__init__.py +0 -0
  84. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/models/civitai.py +0 -0
  85. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/models/comfyui_builtin_versions.py +0 -0
  86. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/models/commit.py +0 -0
  87. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/models/dependency_resolution.py +0 -0
  88. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/models/environment.py +0 -0
  89. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/models/exceptions.py +0 -0
  90. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/models/manifest.py +0 -0
  91. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/models/materialization.py +0 -0
  92. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/models/merge_plan.py +0 -0
  93. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/models/node_mapping.py +0 -0
  94. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/models/overlay.py +0 -0
  95. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/models/protocols.py +0 -0
  96. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/models/readiness.py +0 -0
  97. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/models/ref_diff.py +0 -0
  98. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/models/registry.py +0 -0
  99. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/models/shared.py +0 -0
  100. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/models/sync.py +0 -0
  101. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/models/system.py +0 -0
  102. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/models/workflow.py +0 -0
  103. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/models/workflow_contract.py +0 -0
  104. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/models/workflow_execution.py +0 -0
  105. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/models/workspace_config.py +0 -0
  106. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/py.typed +0 -0
  107. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/repositories/__init__.py +0 -0
  108. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/repositories/comfyui_builtin_versions_repository.py +0 -0
  109. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/repositories/migrate_paths.py +0 -0
  110. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/repositories/model_repository.py +0 -0
  111. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/repositories/node_mappings_repository.py +0 -0
  112. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/repositories/workflow_repository.py +0 -0
  113. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/repositories/workspace_config_repository.py +0 -0
  114. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/resolvers/__init__.py +0 -0
  115. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/resolvers/global_node_resolver.py +0 -0
  116. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/resolvers/model_resolver.py +0 -0
  117. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/services/__init__.py +0 -0
  118. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/services/dependency_resolution_preview.py +0 -0
  119. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/services/environment_readiness.py +0 -0
  120. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/services/huggingface_url.py +0 -0
  121. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/services/import_analyzer.py +0 -0
  122. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/services/model_downloader.py +0 -0
  123. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/services/model_source_lookup.py +0 -0
  124. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/services/node_lookup_service.py +0 -0
  125. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/services/registry_data_manager.py +0 -0
  126. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/services/workflow_analysis_service.py +0 -0
  127. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/services/workflow_execution.py +0 -0
  128. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/services/workflow_input.py +0 -0
  129. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/services/workflow_resolution_service.py +0 -0
  130. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/strategies/__init__.py +0 -0
  131. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/strategies/auto.py +0 -0
  132. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/strategies/confirmation.py +0 -0
  133. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/utils/__init__.py +0 -0
  134. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/utils/builtin_extractor.py +0 -0
  135. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/utils/comfyui_ops.py +0 -0
  136. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/utils/common.py +0 -0
  137. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/utils/conflict_analyzer.py +0 -0
  138. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/utils/conflict_parser.py +0 -0
  139. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/utils/dependency_parser.py +0 -0
  140. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/utils/dependency_probe.py +0 -0
  141. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/utils/download.py +0 -0
  142. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/utils/environment_cleanup.py +0 -0
  143. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/utils/environment_lock.py +0 -0
  144. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/utils/filesystem.py +0 -0
  145. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/utils/folder_paths_extractor.py +0 -0
  146. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/utils/git.py +0 -0
  147. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/utils/input_signature.py +0 -0
  148. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/utils/model_categories.py +0 -0
  149. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/utils/model_loader_extractor.py +0 -0
  150. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/utils/node_identity.py +0 -0
  151. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/utils/pytorch.py +0 -0
  152. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/utils/pytorch_prober.py +0 -0
  153. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/utils/requirements.py +0 -0
  154. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/utils/retry.py +0 -0
  155. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/utils/symlink_utils.py +0 -0
  156. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/utils/system_detector.py +0 -0
  157. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/utils/uuid.py +0 -0
  158. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/utils/uv_error_handler.py +0 -0
  159. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/utils/version.py +0 -0
  160. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/utils/workflow_hash.py +0 -0
  161. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/validation/__init__.py +0 -0
  162. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/src/comfygit_core/validation/resolution_tester.py +0 -0
  163. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/README.md +0 -0
  164. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/caching/TEST_REDUCTION_SUMMARY.md +0 -0
  165. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/caching/__init__.py +0 -0
  166. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/caching/test_workflow_cache.py +0 -0
  167. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/caching/test_workflow_cache_context_hash.py +0 -0
  168. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/conftest.py +0 -0
  169. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/fixtures/models/test_models.json +0 -0
  170. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/fixtures/workflows/checkpoint_loader_with_missing_model.json +0 -0
  171. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/fixtures/workflows/kjnodes_workflow.json +0 -0
  172. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/fixtures/workflows/simple_txt2img.json +0 -0
  173. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/fixtures/workflows/with_custom_node.json +0 -0
  174. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/fixtures/workflows/with_missing_model.json +0 -0
  175. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/fixtures/workflows/workflow_with_duplicates.json +0 -0
  176. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/fixtures/workflows/workflow_with_properties.json +0 -0
  177. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/fixtures/workflows/workflow_without_properties.json +0 -0
  178. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/helpers/__init__.py +0 -0
  179. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/helpers/model_index_builder.py +0 -0
  180. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/helpers/pyproject_assertions.py +0 -0
  181. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/helpers/workflow_builder.py +0 -0
  182. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_atomic_semantic_merge.py +0 -0
  183. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_auto_model_index_sync.py +0 -0
  184. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_branch_workflow_preservation.py +0 -0
  185. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_cache_invalidation_on_model_deletion.py +0 -0
  186. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_cache_node_version_invalidation.py +0 -0
  187. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_checkout_b_with_modified_workflow.py +0 -0
  188. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_commit_git_changes.py +0 -0
  189. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_commit_git_changes_SUMMARY.md +0 -0
  190. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_commit_history.py +0 -0
  191. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_context_aware_node_resolution.py +0 -0
  192. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_create_with_version_spec.py +0 -0
  193. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_custom_node_path_preservation.py +0 -0
  194. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_deferred_model_downloads.py +0 -0
  195. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_deleted_model_download_intent.py +0 -0
  196. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_dependency_group_removal.py +0 -0
  197. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_dev_node_git_references.py +0 -0
  198. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_dev_node_improvements.py +0 -0
  199. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_download_cleanup.py +0 -0
  200. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_download_intent_cache_invalidation.py +0 -0
  201. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_environment_basic.py +0 -0
  202. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_environment_branching.py +0 -0
  203. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_environment_create_progress.py +0 -0
  204. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_export_import.py +0 -0
  205. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_git_branching.py +0 -0
  206. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_git_import.py +0 -0
  207. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_git_pull_push.py +0 -0
  208. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_git_remote.py +0 -0
  209. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_git_subdirectory_import.py +0 -0
  210. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_import_auto_remote.py +0 -0
  211. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_import_comfyui_version_bug.py +0 -0
  212. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_import_preview.py +0 -0
  213. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_model_category_mismatch_detection.py +0 -0
  214. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_model_directory_switch.py +0 -0
  215. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_model_download_integration.py +0 -0
  216. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_model_index_mismatch_bug_SUMMARY.md +0 -0
  217. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_model_path_sync_detection.py +0 -0
  218. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_model_resolution_stale_directory.py +0 -0
  219. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_model_show_command.py +0 -0
  220. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_model_source_management.py +0 -0
  221. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_model_source_preservation.py +0 -0
  222. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_model_source_preservation_SUMMARY.md +0 -0
  223. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_model_source_removal.py +0 -0
  224. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_multiple_optional_group_failures.py +0 -0
  225. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_node_prune.py +0 -0
  226. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_node_version_replacement.py +0 -0
  227. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_opencv_conflict_resolution.py +0 -0
  228. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_optional_dependency_groups.py +0 -0
  229. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_overlay_e2e.py +0 -0
  230. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_overlay_git_integration.py +0 -0
  231. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_overlay_system_integration.py +0 -0
  232. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_package_config.py +0 -0
  233. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_pyproject_batch_writes.py +0 -0
  234. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_pytorch_reconfiguration.py +0 -0
  235. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_registry_git_fallback.py +0 -0
  236. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_repair_completion_marker.py +0 -0
  237. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_repair_model_download.py +0 -0
  238. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_repair_node_removal.py +0 -0
  239. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_repair_workflow.py +0 -0
  240. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_requirements_inline_comments_bug.py +0 -0
  241. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_runtime_restart_workflow_preservation.py +0 -0
  242. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_status_abstraction.py +0 -0
  243. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_status_uninstalled_nodes.py +0 -0
  244. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_workflow_caching_integration.py +0 -0
  245. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_workflow_commit_flow.py +0 -0
  246. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_workflow_deletion_cleanup.py +0 -0
  247. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_workflow_model_criticality_update.py +0 -0
  248. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_workflow_path_update_after_interactive_resolution.py +0 -0
  249. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_workflow_resolution_cleanup.py +0 -0
  250. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_workflow_resolution_pipeline.py +0 -0
  251. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_workflow_resolve_install.py +0 -0
  252. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/integration/test_workflow_subgraph_resolution.py +0 -0
  253. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/test_public_api.py +0 -0
  254. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/analyzers/test_config_comparison.py +0 -0
  255. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/analyzers/test_custom_node_scanner.py +0 -0
  256. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/analyzers/test_ref_diff_analyzer.py +0 -0
  257. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/analyzers/test_status_scanner_disabled_nodes.py +0 -0
  258. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/analyzers/test_workflow_dependency_parser.py +0 -0
  259. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/caching/test_cache_base.py +0 -0
  260. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/caching/test_comfyui_cache.py +0 -0
  261. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/caching/test_custom_node_cache_refactor.py +0 -0
  262. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/caching/test_workspace_relative_caching.py +0 -0
  263. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/clients/test_civitai_client.py +0 -0
  264. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/clients/test_civitai_parsing.py +0 -0
  265. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/clients/test_github_releases.py +0 -0
  266. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/configs/__init__.py +0 -0
  267. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/configs/test_package_config.py +0 -0
  268. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/core/test_environment_operation_locking.py +0 -0
  269. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/core/test_environment_uninstalled_nodes.py +0 -0
  270. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/core/test_import_download_failures.py +0 -0
  271. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/core/test_import_no_manager.py +0 -0
  272. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/core/test_reserved_environment_names.py +0 -0
  273. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/core/test_sync_node_dependency_provisioning.py +0 -0
  274. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/core/test_workspace_model_delete.py +0 -0
  275. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/factories/test_environment_factory_manager_install.py +0 -0
  276. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/lifecycle/test_comfyui_readiness.py +0 -0
  277. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/managers/test_environment_model_manager.py +0 -0
  278. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/managers/test_export_import_overlays.py +0 -0
  279. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/managers/test_git_manager_gitignore.py +0 -0
  280. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/managers/test_git_manager_log_refs.py +0 -0
  281. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/managers/test_model_index_manager.py +0 -0
  282. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/managers/test_model_short_hash.py +0 -0
  283. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/managers/test_node_conflict_detection.py +0 -0
  284. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/managers/test_node_manager.py +0 -0
  285. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/managers/test_overlay_fuzz.py +0 -0
  286. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/managers/test_overlay_injection.py +0 -0
  287. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/managers/test_overlay_manager.py +0 -0
  288. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/managers/test_pyproject_manager.py +0 -0
  289. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/managers/test_pyproject_schema_version.py +0 -0
  290. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/managers/test_pytorch_backend_manager.py +0 -0
  291. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/managers/test_pytorch_injection.py +0 -0
  292. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/managers/test_pytorch_stripping.py +0 -0
  293. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/managers/test_sqlite_manager.py +0 -0
  294. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/managers/test_uv_no_build_isolation.py +0 -0
  295. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/managers/test_workflow_manager.py +0 -0
  296. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/managers/test_workflow_node_cleanup.py +0 -0
  297. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/managers/test_workflow_status.py +0 -0
  298. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/merging/__init__.py +0 -0
  299. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/merging/test_atomic_executor.py +0 -0
  300. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/merging/test_merge_validator.py +0 -0
  301. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/merging/test_semantic_merger.py +0 -0
  302. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/models/test_comfyui_builtin_versions.py +0 -0
  303. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/models/test_overlay.py +0 -0
  304. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/models/test_ref_diff.py +0 -0
  305. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/models/test_workflow_dependencies.py +0 -0
  306. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/models/test_workflow_roundtrip.py +0 -0
  307. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/models/test_workflow_subgraph.py +0 -0
  308. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/resolvers/test_global_node_resolver_v2.py +0 -0
  309. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/resolvers/test_model_resolver.py +0 -0
  310. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/services/test_dependency_resolution_preview.py +0 -0
  311. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/services/test_environment_readiness.py +0 -0
  312. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/services/test_global_node_resolver.py +0 -0
  313. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/services/test_huggingface_url.py +0 -0
  314. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/services/test_import_analyzer.py +0 -0
  315. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/services/test_model_downloader.py +0 -0
  316. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/services/test_model_source_lookup.py +0 -0
  317. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/services/test_node_lookup_api_first.py +0 -0
  318. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/services/test_node_lookup_version_fallback.py +0 -0
  319. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/services/test_registry_data_manager.py +0 -0
  320. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/services/test_scan_requirements_substitution.py +0 -0
  321. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/services/test_workflow_analysis_service.py +0 -0
  322. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/services/test_workflow_execution.py +0 -0
  323. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/services/test_workflow_input.py +0 -0
  324. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/services/test_workflow_resolution_service.py +0 -0
  325. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/test_add_dependencies_substitution.py +0 -0
  326. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/test_auto_strategies.py +0 -0
  327. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/test_builtin_extractor.py +0 -0
  328. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/test_dev_node_rename_detection.py +0 -0
  329. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/test_environment_py_dependencies.py +0 -0
  330. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/test_external_uv_cache.py +0 -0
  331. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/test_folder_paths_extractor.py +0 -0
  332. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/test_github_auth_config.py +0 -0
  333. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/test_github_url_installation.py +0 -0
  334. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/test_headless_import.py +0 -0
  335. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/test_materialization.py +0 -0
  336. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/test_minimal_schema_compatibility.py +0 -0
  337. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/test_model_config_dynamic_loading.py +0 -0
  338. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/test_model_downloader_errors.py +0 -0
  339. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/test_model_loader_extractor.py +0 -0
  340. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/test_model_repository_cleanup.py +0 -0
  341. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/test_model_symlink_manager.py +0 -0
  342. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/test_node_callbacks.py +0 -0
  343. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/test_node_conflict_context.py +0 -0
  344. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/test_node_mappings_repository.py +0 -0
  345. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/test_node_resolution_context.py +0 -0
  346. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/test_unified_node_search.py +0 -0
  347. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/test_user_content_symlink_manager.py +0 -0
  348. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/test_uv_error_handling.py +0 -0
  349. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/test_uv_error_parser.py +0 -0
  350. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/test_workflow_manager_deduplication.py +0 -0
  351. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/test_workspace_config_resilience.py +0 -0
  352. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/utils/test_conflict_analyzer.py +0 -0
  353. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/utils/test_conflict_parser.py +0 -0
  354. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/utils/test_dependency_parser.py +0 -0
  355. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/utils/test_dependency_probe.py +0 -0
  356. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/utils/test_environment_cleanup.py +0 -0
  357. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/utils/test_git.py +0 -0
  358. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/utils/test_input_signature.py +0 -0
  359. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/utils/test_node_identity.py +0 -0
  360. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/utils/test_pytorch.py +0 -0
  361. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/utils/test_pytorch_prober.py +0 -0
  362. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/utils/test_requirements.py +0 -0
  363. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/utils/test_symlink_utils.py +0 -0
  364. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/utils/test_uuid.py +0 -0
  365. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/unit/utils/test_version.py +0 -0
  366. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/utils/__init__.py +0 -0
  367. {comfygit_core-0.4.1 → comfygit_core-0.4.2}/tests/utils/test_workflow_hash.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: comfygit-core
3
- Version: 0.4.1
3
+ Version: 0.4.2
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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "comfygit-core"
3
- version = "0.4.1"
3
+ version = "0.4.2"
4
4
  description = "ComfyGit Core - Git-based ComfyUI environment manager"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -456,10 +456,11 @@ class Environment:
456
456
  # Check if already tracked
457
457
  nodes = self.pyproject.nodes.get_existing()
458
458
  if MANAGER_NODE_ID in nodes and not was_migration:
459
- # Standard update flow - update_node always updates to latest
459
+ # Standard update flow, optionally pinned to a caller-selected version.
460
460
  result = self.node_manager.update_node(
461
461
  MANAGER_NODE_ID,
462
462
  confirmation_strategy=confirmation_strategy,
463
+ target_version=None if version == "latest" else version,
463
464
  )
464
465
 
465
466
  # Cleanup legacy dependency group if present
@@ -149,24 +149,12 @@ class NodeManager:
149
149
 
150
150
  return candidate
151
151
 
152
- def _install_node_from_info(self, node_info: NodeInfo, no_test: bool = False) -> NodeInfo:
153
- """Install a node given a pre-fetched NodeInfo object.
154
-
155
- This bypasses the lookup/cache layer and directly installs the node
156
- using the provided node info. Useful for update operations where we've
157
- already fetched fresh data from the API.
158
-
159
- Args:
160
- node_info: Pre-fetched node information from API
161
- no_test: Skip dependency resolution testing
162
-
163
- Returns:
164
- NodeInfo of the installed node
165
-
166
- Raises:
167
- CDEnvironmentError: If installation fails
168
- CDNodeConflictError: If dependency conflicts detected
169
- """
152
+ def _prepare_node_installation(
153
+ self,
154
+ node_info: NodeInfo,
155
+ no_test: bool = False,
156
+ ) -> tuple[Path, NodePackage]:
157
+ """Download, scan, and validate a node before mutating the environment."""
170
158
  # Download to cache
171
159
  cache_path = self.node_lookup.download_to_cache(node_info)
172
160
  if not cache_path:
@@ -187,6 +175,28 @@ class NodeManager:
187
175
  pkg_spec = node_package.requirements[0] if node_package.requirements else None
188
176
  self._raise_dependency_conflict(node_package.name, test_result, package_spec=pkg_spec)
189
177
 
178
+ return cache_path, node_package
179
+
180
+ def _install_node_from_info(self, node_info: NodeInfo, no_test: bool = False) -> NodeInfo:
181
+ """Install a node given a pre-fetched NodeInfo object.
182
+
183
+ This bypasses the lookup/cache layer and directly installs the node
184
+ using the provided node info. Useful for update operations where we've
185
+ already fetched fresh data from the API.
186
+
187
+ Args:
188
+ node_info: Pre-fetched node information from API
189
+ no_test: Skip dependency resolution testing
190
+
191
+ Returns:
192
+ NodeInfo of the installed node
193
+
194
+ Raises:
195
+ CDEnvironmentError: If installation fails
196
+ CDNodeConflictError: If dependency conflicts detected
197
+ """
198
+ cache_path, node_package = self._prepare_node_installation(node_info, no_test=no_test)
199
+
190
200
  # === BEGIN TRANSACTIONAL SECTION ===
191
201
  # Snapshot state before any modifications for rollback
192
202
  pyproject_snapshot = self.pyproject.snapshot()
@@ -1619,7 +1629,8 @@ class NodeManager:
1619
1629
  self,
1620
1630
  identifier: str,
1621
1631
  confirmation_strategy: ConfirmationStrategy | None = None,
1622
- no_test: bool = False
1632
+ no_test: bool = False,
1633
+ target_version: str | None = None,
1623
1634
  ) -> UpdateResult:
1624
1635
  """Update a node based on its source type.
1625
1636
 
@@ -1627,6 +1638,8 @@ class NodeManager:
1627
1638
  identifier: Node identifier or name
1628
1639
  confirmation_strategy: Strategy for confirming updates (None = auto-confirm)
1629
1640
  no_test: Skip resolution testing (dev nodes only)
1641
+ target_version: Optional exact registry version to install. Registry
1642
+ nodes default to the registry's latest version when omitted.
1630
1643
 
1631
1644
  Returns:
1632
1645
  UpdateResult with details of what changed
@@ -1661,7 +1674,13 @@ class NodeManager:
1661
1674
  if node_info.source == 'development':
1662
1675
  return self._update_development_node(actual_identifier, node_info, no_test)
1663
1676
  elif node_info.source == 'registry':
1664
- return self._update_registry_node(actual_identifier, node_info, confirmation_strategy, no_test)
1677
+ return self._update_registry_node(
1678
+ actual_identifier,
1679
+ node_info,
1680
+ confirmation_strategy,
1681
+ no_test,
1682
+ target_version=target_version,
1683
+ )
1665
1684
  elif node_info.source == 'git':
1666
1685
  return self._update_git_node(actual_identifier, node_info, confirmation_strategy, no_test)
1667
1686
  else:
@@ -1785,7 +1804,8 @@ class NodeManager:
1785
1804
  identifier: str,
1786
1805
  node_info: NodeInfo,
1787
1806
  confirmation_strategy: ConfirmationStrategy,
1788
- no_test: bool
1807
+ no_test: bool,
1808
+ target_version: str | None = None,
1789
1809
  ) -> UpdateResult:
1790
1810
  """Update registry node to latest version with atomic rollback on failure."""
1791
1811
  result = UpdateResult(node_name=node_info.name, source='registry')
@@ -1804,7 +1824,7 @@ class NodeManager:
1804
1824
  result.message = "No updates available (registry unavailable)"
1805
1825
  return result
1806
1826
 
1807
- latest_version = registry_node.latest_version.version
1827
+ latest_version = target_version or registry_node.latest_version.version
1808
1828
  current_version = node_info.version or "unknown"
1809
1829
 
1810
1830
  if latest_version == current_version:
@@ -1816,6 +1836,24 @@ class NodeManager:
1816
1836
  result.message = "Update cancelled by user"
1817
1837
  return result
1818
1838
 
1839
+ # Fetch complete install metadata and prepare the replacement before
1840
+ # removing the old manifest entry. This is especially important for
1841
+ # comfygit-manager because removing its dependency group can uninstall
1842
+ # the running comfygit-core package from disk mid-update.
1843
+ complete_version = self.node_lookup.registry_client.install_node(
1844
+ node_info.registry_id,
1845
+ latest_version
1846
+ )
1847
+
1848
+ if not complete_version:
1849
+ raise CDEnvironmentError(
1850
+ f"Failed to get install metadata for '{node_info.name}' version {latest_version}"
1851
+ )
1852
+
1853
+ registry_node.latest_version = complete_version
1854
+ fresh_node_info = NodeInfo.from_registry_node(registry_node)
1855
+ cache_path, node_package = self._prepare_node_installation(fresh_node_info, no_test=no_test)
1856
+
1819
1857
  # === ATOMIC UPDATE WITH ROLLBACK ===
1820
1858
  # Preserve old node by disabling it instead of removing
1821
1859
  node_path = self.custom_nodes_path / node_info.name
@@ -1831,27 +1869,18 @@ class NodeManager:
1831
1869
  shutil.move(node_path, disabled_path)
1832
1870
  logger.debug(f"Disabled old version of '{node_info.name}'")
1833
1871
 
1834
- # STEP 2: Remove old node from tracking
1872
+ # STEP 2: Remove old node from tracking. Do not sync here; the
1873
+ # replacement package has already been prepared and will be synced
1874
+ # in the same transaction after the new manifest entry is written.
1835
1875
  self.pyproject.nodes.remove(identifier)
1836
- self._sync_uv(quiet=True, all_groups=True, pytorch_manager=self.pytorch_manager)
1837
-
1838
- # STEP 3: Get complete version data with downloadUrl from install endpoint
1839
- complete_version = self.node_lookup.registry_client.install_node(
1840
- node_info.registry_id,
1841
- latest_version
1842
- )
1843
-
1844
- if complete_version:
1845
- # Replace incomplete version data with complete version
1846
- registry_node.latest_version = complete_version
1847
1876
 
1848
- # Create fresh node info from API response with complete data
1849
- fresh_node_info = NodeInfo.from_registry_node(registry_node)
1850
-
1851
- # STEP 4: Install the new version
1852
- self._install_node_from_info(fresh_node_info, no_test=no_test)
1877
+ # STEP 3: Install the prepared replacement and sync once.
1878
+ shutil.copytree(cache_path, node_path, dirs_exist_ok=True)
1879
+ logger.info(f"Installed node '{fresh_node_info.name}' to {node_path}")
1880
+ self.add_node_package(node_package)
1881
+ self._sync_uv(quiet=True, all_groups=True, pytorch_manager=self.pytorch_manager)
1853
1882
 
1854
- # STEP 5: Success - delete old disabled version
1883
+ # STEP 4: Success - delete old disabled version
1855
1884
  if disabled_path.exists():
1856
1885
  rmtree(disabled_path)
1857
1886
  logger.debug(f"Deleted old version of '{node_info.name}'")
@@ -230,6 +230,103 @@ class TestUpdateManager:
230
230
  updated = test_env.pyproject.load()
231
231
  assert "headless" not in updated.get("tool", {}).get("comfygit", {})
232
232
 
233
+ def test_update_manager_prepares_replacement_before_removing_manifest(
234
+ self, test_env, tmp_path, monkeypatch
235
+ ):
236
+ """Manager updates must not uninstall core before staging the replacement."""
237
+ from comfygit_core.models.registry import RegistryNodeInfo, RegistryNodeVersion
238
+ from comfygit_core.models.shared import NodeInfo
239
+
240
+ current = NodeInfo(
241
+ name="comfygit-manager",
242
+ version="0.1.1",
243
+ source="registry",
244
+ registry_id="comfygit-manager",
245
+ repository="https://github.com/comfygit-ai/comfygit-manager",
246
+ download_url="https://cdn.comfy.org/akatz/comfygit-manager/0.1.1/node.zip",
247
+ )
248
+ group_name = test_env.pyproject.nodes.generate_group_name(current, "comfygit-manager")
249
+
250
+ config = test_env.pyproject.load()
251
+ config.setdefault("tool", {}).setdefault("comfygit", {}).setdefault("nodes", {})
252
+ config["tool"]["comfygit"]["nodes"]["comfygit-manager"] = {
253
+ "name": current.name,
254
+ "version": current.version,
255
+ "source": current.source,
256
+ "registry_id": current.registry_id,
257
+ "repository": current.repository,
258
+ "download_url": current.download_url,
259
+ }
260
+ config.setdefault("dependency-groups", {})[group_name] = ["comfygit-core==0.4.0"]
261
+ test_env.pyproject.save(config)
262
+
263
+ manager_path = test_env.comfyui_path / "custom_nodes" / "comfygit-manager"
264
+ manager_path.mkdir(parents=True)
265
+ (manager_path / "__init__.py").write_text("# manager 0.1.1")
266
+
267
+ cache_path = tmp_path / "cache" / "comfygit-manager-0.1.2"
268
+ cache_path.mkdir(parents=True)
269
+ (cache_path / "__init__.py").write_text("# manager 0.1.2")
270
+
271
+ registry_node = RegistryNodeInfo(
272
+ id="comfygit-manager",
273
+ name="comfygit-manager",
274
+ description="ComfyGit Manager",
275
+ repository="https://github.com/comfygit-ai/comfygit-manager",
276
+ latest_version=RegistryNodeVersion(
277
+ changelog="",
278
+ dependencies=[],
279
+ deprecated=False,
280
+ id="manager-v0.1.2",
281
+ version="0.1.2",
282
+ download_url="",
283
+ ),
284
+ )
285
+ install_version = RegistryNodeVersion(
286
+ changelog="",
287
+ dependencies=[],
288
+ deprecated=False,
289
+ id="manager-v0.1.2",
290
+ version="0.1.2",
291
+ download_url="https://cdn.comfy.org/akatz/comfygit-manager/0.1.2/node.zip",
292
+ )
293
+
294
+ def assert_manifest_still_present(_node_info):
295
+ nodes = test_env.pyproject.nodes.get_existing()
296
+ groups = test_env.pyproject.load().get("dependency-groups", {})
297
+ assert "comfygit-manager" in nodes
298
+ assert group_name in groups
299
+ return cache_path
300
+
301
+ monkeypatch.setattr(test_env.pytorch_manager, "ensure_backend", lambda *_args, **_kwargs: "cu121")
302
+ monkeypatch.setattr(
303
+ test_env.node_lookup,
304
+ "get_node",
305
+ lambda _identifier: NodeInfo(
306
+ name="comfygit-manager",
307
+ version="0.1.2",
308
+ source="registry",
309
+ registry_id="comfygit-manager",
310
+ ),
311
+ )
312
+ monkeypatch.setattr(test_env.node_lookup.registry_client, "get_node", lambda _node_id: registry_node)
313
+ monkeypatch.setattr(
314
+ test_env.node_lookup.registry_client,
315
+ "install_node",
316
+ lambda _node_id, _version: install_version,
317
+ )
318
+ monkeypatch.setattr(test_env.node_lookup, "download_to_cache", assert_manifest_still_present)
319
+ monkeypatch.setattr(test_env.node_lookup, "scan_requirements", lambda _path, **_kwargs: [])
320
+ monkeypatch.setattr(test_env.node_manager, "_sync_uv", lambda **_kwargs: None)
321
+
322
+ result = test_env.update_manager(version="0.1.2")
323
+
324
+ assert result.changed is True
325
+ assert result.old_version == "0.1.1"
326
+ assert result.new_version == "0.1.2"
327
+ assert test_env.pyproject.nodes.get_existing()["comfygit-manager"].version == "0.1.2"
328
+ assert (manager_path / "__init__.py").read_text() == "# manager 0.1.2"
329
+
233
330
 
234
331
  class TestEnvironmentCreation:
235
332
  """Tests for new environment creation with per-environment manager."""
@@ -21,15 +21,12 @@ from comfygit_core.strategies.confirmation import AutoConfirmStrategy
21
21
  class TestRegistryNodeUpdateEmptyDownloadUrl:
22
22
  """Test registry node updates when API returns empty downloadUrl."""
23
23
 
24
- def test_update_fails_when_registry_api_returns_empty_download_url(self, test_env):
25
- """Test update fails when registry API returns empty downloadUrl.
24
+ def test_update_fails_clearly_when_install_metadata_is_unavailable(self, test_env):
25
+ """Test update fails clearly when complete install metadata is unavailable.
26
26
 
27
27
  Given: Node v1.8.0 is installed with valid downloadUrl
28
- When: User updates and registry API returns v2.1.0 with empty downloadUrl
29
- Then: Update should fail with clear error (current behavior - will be fixed)
30
-
31
- This test documents the BUG - it expects failure.
32
- After fix, this test will need to be updated to expect success.
28
+ When: User updates and the registry install endpoint has no v2.1.0 payload
29
+ Then: Update should fail before mutating the installed node.
33
30
  """
34
31
  # ARRANGE: Install initial version 1.8.0 with valid downloadUrl
35
32
  node_info_v1_8_0 = NodeInfo(
@@ -81,14 +78,10 @@ class TestRegistryNodeUpdateEmptyDownloadUrl:
81
78
 
82
79
  strategy = AutoConfirmStrategy()
83
80
 
84
- # ACT & ASSERT: Update should fail because downloadUrl is empty
85
- # The current implementation will try to fall back to git clone with version "2.1.0" as tag
86
- # which will fail if the repo has no tags
87
81
  with pytest.raises(CDEnvironmentError) as exc_info:
88
82
  test_env.node_manager.update_node("test-node", confirmation_strategy=strategy, no_test=True)
89
83
 
90
- # Verify error message mentions the failure
91
- assert "Failed to update node" in str(exc_info.value)
84
+ assert "Failed to get install metadata" in str(exc_info.value)
92
85
 
93
86
  # Verify old node is preserved after failed update (atomic rollback)
94
87
  nodes = test_env.pyproject.nodes.get_existing()
File without changes
File without changes
File without changes
File without changes
File without changes