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.
Files changed (448) hide show
  1. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/AGENTS.md +5 -5
  2. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/CLAUDE.md +5 -5
  3. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/PKG-INFO +2 -2
  4. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/docs/architecture-deep-dive.md +3 -4
  5. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/docs/architecture.md +20 -5
  6. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/docs/layer-hierarchy.md +1 -2
  7. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/docs/plans/uv-overlay-system.md +33 -21
  8. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/pyproject.toml +2 -2
  9. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/analyzers/__init__.py +2 -1
  10. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/analyzers/model_scanner.py +1 -29
  11. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/analyzers/node_classifier.py +1 -1
  12. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/analyzers/node_git_analyzer.py +1 -1
  13. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/analyzers/status_scanner.py +53 -16
  14. comfygit_core-0.6.0/src/comfygit_core/analyzers/unmanaged_comfyui_analyzer.py +733 -0
  15. comfygit_core-0.6.0/src/comfygit_core/assets.py +24 -0
  16. comfygit_core-0.6.0/src/comfygit_core/build_readiness.py +41 -0
  17. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/caching/api_cache.py +1 -2
  18. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/caching/base.py +1 -1
  19. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/caching/workflow_cache.py +351 -230
  20. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/clients/civitai_client.py +10 -11
  21. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/clients/registry_client.py +1 -1
  22. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/configs/comfyui_models.py +2 -0
  23. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/configs/package_config.py +2 -2
  24. comfygit_core-0.6.0/src/comfygit_core/confirmation.py +8 -0
  25. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/constants.py +11 -2
  26. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/core/environment.py +1001 -400
  27. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/core/workspace.py +415 -54
  28. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/factories/environment_factory.py +12 -4
  29. comfygit_core-0.6.0/src/comfygit_core/git.py +34 -0
  30. comfygit_core-0.6.0/src/comfygit_core/imports.py +31 -0
  31. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/infrastructure/sqlite_manager.py +18 -7
  32. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/integrations/uv_command.py +75 -7
  33. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/lifecycle/switch_observer.py +16 -3
  34. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/managers/__init__.py +0 -1
  35. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/managers/environment_git_orchestrator.py +35 -62
  36. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/managers/environment_model_manager.py +4 -13
  37. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/managers/export_import_manager.py +53 -3
  38. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/managers/git_manager.py +4 -0
  39. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/managers/model_symlink_manager.py +2 -2
  40. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/managers/node_manager.py +71 -15
  41. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/managers/overlay_manager.py +2 -2
  42. comfygit_core-0.6.0/src/comfygit_core/managers/pyproject_manager.py +442 -0
  43. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/managers/pytorch_backend_manager.py +3 -3
  44. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/managers/user_content_symlink_manager.py +2 -2
  45. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/managers/uv_project_manager.py +130 -57
  46. comfygit_core-0.6.0/src/comfygit_core/managers/workflow_manager.py +1066 -0
  47. comfygit_core-0.6.0/src/comfygit_core/manifest/__init__.py +24 -0
  48. comfygit_core-0.6.0/src/comfygit_core/manifest/base.py +66 -0
  49. comfygit_core-0.6.0/src/comfygit_core/manifest/dependencies.py +117 -0
  50. comfygit_core-0.6.0/src/comfygit_core/manifest/disposable_project.py +154 -0
  51. comfygit_core-0.6.0/src/comfygit_core/manifest/migrations.py +111 -0
  52. comfygit_core-0.6.0/src/comfygit_core/manifest/models.py +139 -0
  53. comfygit_core-0.6.0/src/comfygit_core/manifest/nodes.py +135 -0
  54. comfygit_core-0.6.0/src/comfygit_core/manifest/overlays.py +260 -0
  55. comfygit_core-0.6.0/src/comfygit_core/manifest/pyproject_manifest.py +339 -0
  56. comfygit_core-0.6.0/src/comfygit_core/manifest/store.py +257 -0
  57. comfygit_core-0.6.0/src/comfygit_core/manifest/sync_config.py +87 -0
  58. comfygit_core-0.6.0/src/comfygit_core/manifest/uv_config.py +294 -0
  59. comfygit_core-0.6.0/src/comfygit_core/manifest/workflows.py +411 -0
  60. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/merging/atomic_executor.py +1 -1
  61. comfygit_core-0.6.0/src/comfygit_core/models/__init__.py +209 -0
  62. comfygit_core-0.6.0/src/comfygit_core/models/build_readiness.py +240 -0
  63. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/comfyui_builtin_versions.py +1 -1
  64. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/environment.py +28 -7
  65. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/exceptions.py +2 -2
  66. comfygit_core-0.6.0/src/comfygit_core/models/git.py +174 -0
  67. comfygit_core-0.6.0/src/comfygit_core/models/lifecycle.py +346 -0
  68. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/manifest.py +26 -2
  69. comfygit_core-0.6.0/src/comfygit_core/models/model_scan.py +32 -0
  70. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/overlay.py +47 -9
  71. comfygit_core-0.6.0/src/comfygit_core/models/readiness.py +195 -0
  72. comfygit_core-0.6.0/src/comfygit_core/models/runtime_config.py +80 -0
  73. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/shared.py +70 -3
  74. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/sync.py +22 -0
  75. comfygit_core-0.6.0/src/comfygit_core/models/unmanaged_import.py +120 -0
  76. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/workflow.py +22 -15
  77. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/workflow_contract.py +29 -4
  78. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/workflow_execution.py +2 -1
  79. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/workspace_config.py +0 -6
  80. comfygit_core-0.6.0/src/comfygit_core/readiness.py +47 -0
  81. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/repositories/comfyui_builtin_versions_repository.py +5 -1
  82. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/repositories/model_repository.py +42 -12
  83. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/repositories/node_mappings_repository.py +5 -0
  84. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/repositories/workspace_config_repository.py +13 -30
  85. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/resolvers/model_resolver.py +1 -1
  86. comfygit_core-0.6.0/src/comfygit_core/runtime.py +84 -0
  87. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/services/__init__.py +3 -0
  88. comfygit_core-0.6.0/src/comfygit_core/services/build_readiness.py +742 -0
  89. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/services/dependency_resolution_preview.py +4 -4
  90. comfygit_core-0.6.0/src/comfygit_core/services/environment_lifecycle.py +1037 -0
  91. comfygit_core-0.6.0/src/comfygit_core/services/environment_readiness.py +372 -0
  92. comfygit_core-0.6.0/src/comfygit_core/services/environment_sync_coordinator.py +323 -0
  93. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/services/model_downloader.py +10 -8
  94. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/services/node_lookup_service.py +90 -5
  95. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/services/registry_data_manager.py +1 -1
  96. comfygit_core-0.6.0/src/comfygit_core/services/unmanaged_environment_import.py +252 -0
  97. comfygit_core-0.6.0/src/comfygit_core/services/workflow_analysis_cache.py +109 -0
  98. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/services/workflow_analysis_service.py +2 -2
  99. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/services/workflow_execution.py +29 -5
  100. comfygit_core-0.6.0/src/comfygit_core/services/workflow_file_store.py +261 -0
  101. comfygit_core-0.6.0/src/comfygit_core/services/workflow_manifest_reconciler.py +432 -0
  102. comfygit_core-0.6.0/src/comfygit_core/services/workflow_manual_model_policy.py +46 -0
  103. comfygit_core-0.6.0/src/comfygit_core/services/workflow_model_dependency_service.py +218 -0
  104. comfygit_core-0.6.0/src/comfygit_core/services/workflow_model_download_coordinator.py +229 -0
  105. comfygit_core-0.6.0/src/comfygit_core/services/workflow_model_path_policy.py +308 -0
  106. comfygit_core-0.6.0/src/comfygit_core/services/workflow_node_package_policy.py +47 -0
  107. comfygit_core-0.6.0/src/comfygit_core/services/workflow_resolution_context_builder.py +325 -0
  108. comfygit_core-0.6.0/src/comfygit_core/services/workflow_resolution_fixer.py +397 -0
  109. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/services/workflow_resolution_service.py +1 -1
  110. comfygit_core-0.6.0/src/comfygit_core/services/workflow_state_cleanup.py +238 -0
  111. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/strategies/confirmation.py +1 -28
  112. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/common.py +81 -17
  113. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/conflict_analyzer.py +2 -2
  114. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/dependency_probe.py +82 -3
  115. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/download.py +63 -29
  116. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/environment_cleanup.py +50 -0
  117. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/environment_lock.py +6 -0
  118. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/filesystem.py +19 -3
  119. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/git.py +12 -2
  120. comfygit_core-0.6.0/src/comfygit_core/utils/provider_urls.py +32 -0
  121. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/pytorch_prober.py +100 -20
  122. comfygit_core-0.6.0/src/comfygit_core/utils/redaction.py +98 -0
  123. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/requirements.py +48 -0
  124. comfygit_core-0.6.0/src/comfygit_core/utils/toml_compat.py +10 -0
  125. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/validation/resolution_tester.py +5 -5
  126. comfygit_core-0.6.0/src/comfygit_core/workflow.py +32 -0
  127. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/caching/test_workflow_cache.py +10 -6
  128. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/caching/test_workflow_cache_context_hash.py +128 -0
  129. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_branch_workflow_preservation.py +65 -34
  130. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_context_aware_node_resolution.py +4 -7
  131. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_dev_node_git_references.py +16 -4
  132. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_download_cleanup.py +16 -9
  133. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_download_intent_cache_invalidation.py +1 -1
  134. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_environment_branching.py +14 -15
  135. comfygit_core-0.6.0/tests/integration/test_lifecycle_status.py +158 -0
  136. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_model_directory_switch.py +24 -17
  137. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_model_resolution_stale_directory.py +2 -2
  138. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_model_show_command.py +22 -9
  139. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_model_source_management.py +2 -4
  140. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_model_source_preservation.py +3 -6
  141. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_multiple_optional_group_failures.py +39 -67
  142. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_node_version_replacement.py +3 -1
  143. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_optional_dependency_groups.py +36 -13
  144. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_overlay_e2e.py +40 -29
  145. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_overlay_git_integration.py +29 -1
  146. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_overlay_system_integration.py +18 -43
  147. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_pyproject_batch_writes.py +2 -2
  148. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_pytorch_reconfiguration.py +4 -4
  149. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_registry_node_update_empty_download_url.py +1 -1
  150. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_runtime_restart_workflow_preservation.py +37 -0
  151. comfygit_core-0.6.0/tests/integration/test_workflow_cache_metadata_invalidation.py +172 -0
  152. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_workflow_caching_integration.py +15 -15
  153. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_workflow_commit_flow.py +8 -9
  154. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_workflow_deletion_cleanup.py +1 -1
  155. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_workflow_resolution_pipeline.py +1 -1
  156. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_workflow_subgraph_resolution.py +187 -0
  157. comfygit_core-0.6.0/tests/test_architecture_boundaries.py +30 -0
  158. comfygit_core-0.6.0/tests/test_public_api.py +340 -0
  159. comfygit_core-0.6.0/tests/unit/analyzers/test_node_git_analyzer.py +37 -0
  160. comfygit_core-0.6.0/tests/unit/analyzers/test_status_scanner.py +21 -0
  161. comfygit_core-0.6.0/tests/unit/analyzers/test_status_scanner_package_sync.py +25 -0
  162. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/caching/test_workspace_relative_caching.py +2 -1
  163. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/clients/test_civitai_client.py +15 -5
  164. comfygit_core-0.6.0/tests/unit/core/test_environment_facades.py +338 -0
  165. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/core/test_environment_operation_locking.py +11 -0
  166. comfygit_core-0.6.0/tests/unit/core/test_environment_run.py +50 -0
  167. comfygit_core-0.6.0/tests/unit/core/test_environment_sync.py +27 -0
  168. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/core/test_sync_node_dependency_provisioning.py +4 -6
  169. comfygit_core-0.6.0/tests/unit/core/test_workflow_contract_access.py +12 -0
  170. comfygit_core-0.6.0/tests/unit/core/test_workspace_environment_creation.py +62 -0
  171. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/core/test_workspace_model_delete.py +41 -0
  172. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/managers/test_export_import_overlays.py +39 -1
  173. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/managers/test_git_manager_gitignore.py +2 -0
  174. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/managers/test_node_manager.py +56 -1
  175. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/managers/test_overlay_fuzz.py +68 -103
  176. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/managers/test_overlay_manager.py +1 -2
  177. 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
  178. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/managers/test_pyproject_manager.py +249 -81
  179. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/managers/test_pyproject_schema_version.py +53 -0
  180. comfygit_core-0.6.0/tests/unit/managers/test_pytorch_overlay_materialization.py +740 -0
  181. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/managers/test_uv_no_build_isolation.py +41 -3
  182. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/managers/test_workflow_manager.py +72 -0
  183. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/managers/test_workflow_node_cleanup.py +27 -0
  184. comfygit_core-0.6.0/tests/unit/models/test_lifecycle.py +161 -0
  185. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/models/test_overlay.py +20 -3
  186. comfygit_core-0.6.0/tests/unit/models/test_workflow_contract.py +59 -0
  187. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/resolvers/test_global_node_resolver_v2.py +7 -5
  188. comfygit_core-0.6.0/tests/unit/services/test_build_readiness.py +573 -0
  189. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/services/test_dependency_resolution_preview.py +2 -2
  190. comfygit_core-0.6.0/tests/unit/services/test_environment_lifecycle.py +644 -0
  191. comfygit_core-0.6.0/tests/unit/services/test_environment_readiness.py +458 -0
  192. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/services/test_model_downloader.py +33 -0
  193. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/services/test_node_lookup_api_first.py +20 -0
  194. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/services/test_node_lookup_version_fallback.py +57 -1
  195. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/services/test_scan_requirements_substitution.py +42 -0
  196. comfygit_core-0.6.0/tests/unit/services/test_unmanaged_environment_import.py +597 -0
  197. comfygit_core-0.6.0/tests/unit/services/test_workflow_analysis_cache.py +123 -0
  198. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/services/test_workflow_execution.py +35 -3
  199. comfygit_core-0.6.0/tests/unit/services/test_workflow_file_store.py +145 -0
  200. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/services/test_workflow_input.py +0 -1
  201. comfygit_core-0.6.0/tests/unit/services/test_workflow_model_dependency_service.py +176 -0
  202. comfygit_core-0.6.0/tests/unit/services/test_workflow_model_download_coordinator.py +238 -0
  203. comfygit_core-0.6.0/tests/unit/services/test_workflow_model_path_policy.py +149 -0
  204. comfygit_core-0.6.0/tests/unit/services/test_workflow_resolution_context_builder.py +264 -0
  205. comfygit_core-0.6.0/tests/unit/services/test_workflow_resolution_fixer.py +290 -0
  206. comfygit_core-0.6.0/tests/unit/services/test_workflow_state_cleanup.py +124 -0
  207. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_add_dependencies_substitution.py +1 -0
  208. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_environment_py_dependencies.py +25 -19
  209. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_user_content_symlink_manager.py +22 -0
  210. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_workflow_manager_deduplication.py +46 -22
  211. comfygit_core-0.6.0/tests/unit/test_workspace_config_facade.py +58 -0
  212. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/utils/test_dependency_probe.py +167 -6
  213. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/utils/test_environment_cleanup.py +43 -0
  214. comfygit_core-0.6.0/tests/unit/utils/test_filesystem.py +74 -0
  215. comfygit_core-0.6.0/tests/unit/utils/test_provider_auth_hardening.py +33 -0
  216. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/utils/test_pytorch_prober.py +192 -23
  217. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/utils/test_requirements.py +21 -0
  218. comfygit_core-0.4.2/src/comfygit_core/managers/model_download_manager.py +0 -253
  219. comfygit_core-0.4.2/src/comfygit_core/managers/pyproject_manager.py +0 -2322
  220. comfygit_core-0.4.2/src/comfygit_core/managers/workflow_manager.py +0 -2298
  221. comfygit_core-0.4.2/src/comfygit_core/models/__init__.py +0 -71
  222. comfygit_core-0.4.2/src/comfygit_core/models/readiness.py +0 -90
  223. comfygit_core-0.4.2/src/comfygit_core/services/environment_readiness.py +0 -361
  224. comfygit_core-0.4.2/tests/test_public_api.py +0 -62
  225. comfygit_core-0.4.2/tests/unit/managers/test_pytorch_injection.py +0 -562
  226. comfygit_core-0.4.2/tests/unit/services/test_environment_readiness.py +0 -322
  227. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/.gitignore +0 -0
  228. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/.python-version +0 -0
  229. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/LICENSE.txt +0 -0
  230. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/README.md +0 -0
  231. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/docs/knowledge/comfyui-node-loader-base-directories.md +0 -0
  232. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/docs/knowledge/model-tracking-system.md +0 -0
  233. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/docs/knowledge/node-resolution-behavior.md +0 -0
  234. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/__init__.py +0 -0
  235. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/analyzers/config_comparison.py +0 -0
  236. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/analyzers/custom_node_scanner.py +0 -0
  237. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/analyzers/git_change_parser.py +0 -0
  238. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/analyzers/ref_diff_analyzer.py +0 -0
  239. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/analyzers/workflow_dependency_parser.py +0 -0
  240. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/caching/__init__.py +0 -0
  241. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/caching/comfyui_cache.py +0 -0
  242. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/caching/custom_node_cache.py +0 -0
  243. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/clients/__init__.py +0 -0
  244. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/clients/github_client.py +0 -0
  245. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/configs/__init__.py +0 -0
  246. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/configs/comfyui_builtin_nodes.py +0 -0
  247. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/configs/model_config.py +0 -0
  248. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/core/__init__.py +0 -0
  249. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/data/overlays/stock/sageattention.toml +0 -0
  250. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/data/overlays/stock/triton.toml +0 -0
  251. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/data/overlays/stock/xformers.toml +0 -0
  252. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/factories/__init__.py +0 -0
  253. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/factories/uv_factory.py +0 -0
  254. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/factories/workspace_factory.py +0 -0
  255. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/infrastructure/__init__.py +0 -0
  256. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/integrations/__init__.py +0 -0
  257. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/lifecycle/__init__.py +2 -2
  258. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/lifecycle/comfyui_readiness.py +0 -0
  259. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/logging/__init__.py +0 -0
  260. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/logging/logging_config.py +0 -0
  261. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/managers/system_node_symlink_manager.py +0 -0
  262. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/merging/__init__.py +0 -0
  263. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/merging/merge_validator.py +0 -0
  264. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/merging/semantic_merger.py +0 -0
  265. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/civitai.py +0 -0
  266. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/commit.py +0 -0
  267. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/dependency_resolution.py +0 -0
  268. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/materialization.py +0 -0
  269. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/merge_plan.py +0 -0
  270. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/node_mapping.py +0 -0
  271. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/protocols.py +0 -0
  272. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/ref_diff.py +0 -0
  273. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/registry.py +0 -0
  274. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/models/system.py +0 -0
  275. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/py.typed +0 -0
  276. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/repositories/__init__.py +0 -0
  277. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/repositories/migrate_paths.py +0 -0
  278. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/repositories/workflow_repository.py +0 -0
  279. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/resolvers/__init__.py +0 -0
  280. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/resolvers/global_node_resolver.py +0 -0
  281. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/services/huggingface_url.py +0 -0
  282. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/services/import_analyzer.py +0 -0
  283. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/services/model_source_lookup.py +0 -0
  284. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/services/workflow_input.py +0 -0
  285. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/strategies/__init__.py +0 -0
  286. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/strategies/auto.py +0 -0
  287. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/__init__.py +0 -0
  288. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/builtin_extractor.py +0 -0
  289. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/comfyui_ops.py +0 -0
  290. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/conflict_parser.py +0 -0
  291. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/dependency_parser.py +0 -0
  292. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/folder_paths_extractor.py +0 -0
  293. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/input_signature.py +0 -0
  294. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/model_categories.py +0 -0
  295. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/model_loader_extractor.py +0 -0
  296. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/node_identity.py +0 -0
  297. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/pytorch.py +0 -0
  298. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/retry.py +0 -0
  299. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/symlink_utils.py +0 -0
  300. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/system_detector.py +0 -0
  301. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/uuid.py +0 -0
  302. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/uv_error_handler.py +0 -0
  303. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/version.py +0 -0
  304. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/utils/workflow_hash.py +0 -0
  305. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/src/comfygit_core/validation/__init__.py +0 -0
  306. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/README.md +0 -0
  307. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/caching/TEST_REDUCTION_SUMMARY.md +0 -0
  308. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/caching/__init__.py +0 -0
  309. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/conftest.py +0 -0
  310. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/fixtures/models/test_models.json +0 -0
  311. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/fixtures/workflows/checkpoint_loader_with_missing_model.json +0 -0
  312. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/fixtures/workflows/kjnodes_workflow.json +0 -0
  313. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/fixtures/workflows/simple_txt2img.json +0 -0
  314. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/fixtures/workflows/with_custom_node.json +0 -0
  315. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/fixtures/workflows/with_missing_model.json +0 -0
  316. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/fixtures/workflows/workflow_with_duplicates.json +0 -0
  317. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/fixtures/workflows/workflow_with_properties.json +0 -0
  318. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/fixtures/workflows/workflow_without_properties.json +0 -0
  319. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/helpers/__init__.py +0 -0
  320. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/helpers/model_index_builder.py +0 -0
  321. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/helpers/pyproject_assertions.py +0 -0
  322. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/helpers/workflow_builder.py +0 -0
  323. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_atomic_semantic_merge.py +0 -0
  324. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_auto_model_index_sync.py +0 -0
  325. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_cache_invalidation_on_model_deletion.py +0 -0
  326. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_cache_node_version_invalidation.py +0 -0
  327. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_checkout_b_with_modified_workflow.py +0 -0
  328. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_commit_git_changes.py +0 -0
  329. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_commit_git_changes_SUMMARY.md +0 -0
  330. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_commit_history.py +0 -0
  331. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_create_with_version_spec.py +0 -0
  332. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_custom_node_path_preservation.py +0 -0
  333. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_deferred_model_downloads.py +0 -0
  334. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_deleted_model_download_intent.py +0 -0
  335. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_dependency_group_removal.py +0 -0
  336. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_dev_node_improvements.py +0 -0
  337. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_environment_basic.py +0 -0
  338. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_environment_create_progress.py +0 -0
  339. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_export_import.py +0 -0
  340. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_git_branching.py +0 -0
  341. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_git_import.py +0 -0
  342. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_git_pull_push.py +0 -0
  343. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_git_remote.py +0 -0
  344. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_git_subdirectory_import.py +0 -0
  345. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_import_auto_remote.py +0 -0
  346. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_import_comfyui_version_bug.py +0 -0
  347. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_import_preview.py +0 -0
  348. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_model_category_mismatch_detection.py +0 -0
  349. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_model_download_integration.py +0 -0
  350. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_model_index_mismatch_bug_SUMMARY.md +0 -0
  351. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_model_path_sync_detection.py +0 -0
  352. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_model_source_preservation_SUMMARY.md +0 -0
  353. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_model_source_removal.py +0 -0
  354. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_node_prune.py +0 -0
  355. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_opencv_conflict_resolution.py +0 -0
  356. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_package_config.py +0 -0
  357. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_per_environment_manager.py +0 -0
  358. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_registry_git_fallback.py +0 -0
  359. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_repair_completion_marker.py +0 -0
  360. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_repair_model_download.py +0 -0
  361. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_repair_node_removal.py +0 -0
  362. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_repair_workflow.py +0 -0
  363. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_requirements_inline_comments_bug.py +0 -0
  364. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_status_abstraction.py +0 -0
  365. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_status_uninstalled_nodes.py +0 -0
  366. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_workflow_model_criticality_update.py +0 -0
  367. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_workflow_path_update_after_interactive_resolution.py +0 -0
  368. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_workflow_resolution_cleanup.py +0 -0
  369. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/integration/test_workflow_resolve_install.py +0 -0
  370. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/analyzers/test_config_comparison.py +0 -0
  371. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/analyzers/test_custom_node_scanner.py +0 -0
  372. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/analyzers/test_ref_diff_analyzer.py +0 -0
  373. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/analyzers/test_status_scanner_disabled_nodes.py +0 -0
  374. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/analyzers/test_workflow_dependency_parser.py +0 -0
  375. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/caching/test_cache_base.py +0 -0
  376. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/caching/test_comfyui_cache.py +0 -0
  377. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/caching/test_custom_node_cache_refactor.py +0 -0
  378. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/clients/test_civitai_parsing.py +0 -0
  379. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/clients/test_github_releases.py +0 -0
  380. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/configs/__init__.py +0 -0
  381. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/configs/test_package_config.py +0 -0
  382. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/core/test_environment_uninstalled_nodes.py +0 -0
  383. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/core/test_import_download_failures.py +0 -0
  384. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/core/test_import_no_manager.py +0 -0
  385. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/core/test_reserved_environment_names.py +0 -0
  386. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/factories/test_environment_factory_manager_install.py +0 -0
  387. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/lifecycle/test_comfyui_readiness.py +0 -0
  388. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/managers/test_environment_model_manager.py +0 -0
  389. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/managers/test_git_manager_log_refs.py +0 -0
  390. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/managers/test_model_index_manager.py +0 -0
  391. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/managers/test_model_short_hash.py +1 -1
  392. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/managers/test_node_conflict_detection.py +0 -0
  393. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/managers/test_pytorch_backend_manager.py +0 -0
  394. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/managers/test_pytorch_stripping.py +0 -0
  395. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/managers/test_sqlite_manager.py +0 -0
  396. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/managers/test_workflow_status.py +0 -0
  397. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/merging/__init__.py +0 -0
  398. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/merging/test_atomic_executor.py +0 -0
  399. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/merging/test_merge_validator.py +0 -0
  400. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/merging/test_semantic_merger.py +0 -0
  401. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/models/test_comfyui_builtin_versions.py +0 -0
  402. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/models/test_ref_diff.py +0 -0
  403. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/models/test_workflow_dependencies.py +0 -0
  404. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/models/test_workflow_roundtrip.py +0 -0
  405. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/models/test_workflow_subgraph.py +0 -0
  406. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/resolvers/test_model_resolver.py +0 -0
  407. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/services/test_global_node_resolver.py +0 -0
  408. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/services/test_huggingface_url.py +0 -0
  409. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/services/test_import_analyzer.py +0 -0
  410. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/services/test_model_source_lookup.py +0 -0
  411. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/services/test_registry_data_manager.py +0 -0
  412. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/services/test_workflow_analysis_service.py +0 -0
  413. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/services/test_workflow_resolution_service.py +0 -0
  414. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_auto_strategies.py +0 -0
  415. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_builtin_extractor.py +0 -0
  416. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_dev_node_rename_detection.py +0 -0
  417. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_external_uv_cache.py +0 -0
  418. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_folder_paths_extractor.py +0 -0
  419. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_github_auth_config.py +0 -0
  420. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_github_url_installation.py +0 -0
  421. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_headless_import.py +0 -0
  422. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_materialization.py +0 -0
  423. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_minimal_schema_compatibility.py +0 -0
  424. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_model_config_dynamic_loading.py +0 -0
  425. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_model_downloader_errors.py +0 -0
  426. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_model_loader_extractor.py +0 -0
  427. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_model_repository_cleanup.py +0 -0
  428. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_model_symlink_manager.py +0 -0
  429. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_node_callbacks.py +0 -0
  430. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_node_conflict_context.py +0 -0
  431. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_node_mappings_repository.py +0 -0
  432. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_node_resolution_context.py +0 -0
  433. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_unified_node_search.py +0 -0
  434. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_uv_error_handling.py +0 -0
  435. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_uv_error_parser.py +0 -0
  436. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/test_workspace_config_resilience.py +0 -0
  437. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/utils/test_conflict_analyzer.py +0 -0
  438. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/utils/test_conflict_parser.py +0 -0
  439. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/utils/test_dependency_parser.py +0 -0
  440. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/utils/test_git.py +0 -0
  441. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/utils/test_input_signature.py +0 -0
  442. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/utils/test_node_identity.py +0 -0
  443. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/utils/test_pytorch.py +0 -0
  444. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/utils/test_symlink_utils.py +0 -0
  445. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/utils/test_uuid.py +0 -0
  446. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/unit/utils/test_version.py +0 -0
  447. {comfygit_core-0.4.2 → comfygit_core-0.6.0}/tests/utils/__init__.py +0 -0
  448. {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 temporary uv/PyTorch injection. |
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
- `PyprojectManager.uv_injection_context()` temporarily merges local overlays and
80
- PyTorch backend config into `pyproject.toml` for uv operations, then restores the
81
- tracked manifest in a `finally` path. Preserve that invariant.
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 "injection" -v
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 temporary uv/PyTorch injection. |
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
- `PyprojectManager.uv_injection_context()` temporarily merges local overlays and
80
- PyTorch backend config into `pyproject.toml` for uv operations, then restores the
81
- tracked manifest in a `finally` path. Preserve that invariant.
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 "injection" -v
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.4.2
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.33.0
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 (13 files)"]
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<br/>model_download_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 injection |
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 (core/)
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/** | Type safety | Data classes, protocols, exceptions with context |
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.environments()` / `get_environment()` - List/get environments
78
- - `WorkspaceFactory.find()` - Discover existing workspace from environment variables
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 existing injection system has two separate mechanisms for machine-local config:
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
- These are hard-coded into `uv_injection_context()` with separate code paths. There's no way for users to create their own injectable dependency sets (e.g., "GPU acceleration packages" or "development tools") that layer on top of the base environment.
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 inject additional dependencies, UV sources, constraints, and settings into the resolution — layered on top of the base pyproject.toml. Some overlays are shareable (checked into git), others are machine-local (gitignored). This enables environments to ship minimal portable dependencies while letting users opt into platform-specific acceleration packages.
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 UV configuration to merge into pyproject.toml during sync/run. Overlays compose additively — multiple overlays can be stacked.
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 stays, but it produces config in the same format as any other overlay, and the injection pipeline treats it uniformly.
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 inject into [project.dependencies]
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 inject (maps to [tool.uv.constraint-dependencies])
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 injected when present (replaces `.local-uv-config`)
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 the injection now goes through the same overlay pipeline:
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 injection pipeline converts it to overlay format internally
121
- 3. PyTorch is always injected **last** so it wins on torch/torchvision/torchaudio conflicts
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
- - `to_injection_payload() -> dict` — Convert to the existing `_inject_uv_config()` payload format
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. **Refactor `uv_injection_context()`** Generalize to accept overlays
148
- - New signature: `uv_injection_context(overlays: list[OverlayConfig])`
149
- - Add dependency injection support (inject into `[project.dependencies]`)
150
- - Add `dependency-metadata` injection into `[[tool.uv.dependency-metadata]]`
151
- - Add `no-build-isolation-package` injection
152
- - Keep strip-before-inject pattern for PyTorch
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` | Refactor `uv_injection_context()` and injection methods |
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 injection:** Verify dependencies, sources, constraints, metadata merge correctly into pyproject config
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 restored after sync
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.4.2"
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.33.0",
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
@@ -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(self) -> EnvironmentComparison:
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
- # Skip package sync check for performance (100-500ms saved)
81
- # Rationale:
82
- # - Users rarely manually modify .venv/
83
- # - Operations like 'run', 'repair', 'node add' auto-sync before executing
84
- # - Status is high-frequency with workflow caching - needs to be fast
85
- # - Package drift self-corrects on next sync operation
86
- # If thorough check needed, use 'cg repair --dry-run' (future)
87
- # TODO: Add package sync status
88
- # package_status = self.check_packages_sync()
89
- comparison.packages_in_sync = True #package_status.in_sync
90
- comparison.package_sync_message = "" #package_status.message
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.load()
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(self) -> PackageSyncStatus:
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 injection ensures the check uses the correct backend
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
  )