comfygit-core 0.5.0__tar.gz → 0.7.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (454) hide show
  1. comfygit_core-0.5.0/README.md → comfygit_core-0.7.0/PKG-INFO +53 -0
  2. comfygit_core-0.5.0/PKG-INFO → comfygit_core-0.7.0/README.md +31 -19
  3. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/docs/architecture.md +5 -1
  4. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/pyproject.toml +8 -4
  5. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/analyzers/model_scanner.py +7 -1
  6. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/analyzers/node_classifier.py +1 -2
  7. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/analyzers/node_git_analyzer.py +1 -1
  8. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/analyzers/status_scanner.py +51 -14
  9. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/analyzers/unmanaged_comfyui_analyzer.py +6 -0
  10. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/caching/comfyui_cache.py +28 -6
  11. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/caching/custom_node_cache.py +13 -2
  12. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/caching/workflow_cache.py +1 -1
  13. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/clients/civitai_client.py +6 -5
  14. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/configs/package_config.py +1 -0
  15. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/constants.py +7 -0
  16. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/core/environment.py +231 -54
  17. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/core/workspace.py +222 -31
  18. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/factories/environment_factory.py +39 -9
  19. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/factories/workspace_factory.py +46 -21
  20. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/integrations/uv_command.py +1 -1
  21. comfygit_core-0.7.0/src/comfygit_core/lifecycle/runtime_control.py +186 -0
  22. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/lifecycle/switch_observer.py +76 -4
  23. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/environment_git_orchestrator.py +32 -59
  24. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/environment_model_manager.py +80 -3
  25. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/export_import_manager.py +53 -3
  26. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/git_manager.py +3 -0
  27. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/model_symlink_manager.py +2 -2
  28. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/node_manager.py +67 -9
  29. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/overlay_manager.py +1 -1
  30. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/pytorch_backend_manager.py +1 -1
  31. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/user_content_symlink_manager.py +2 -2
  32. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/uv_project_manager.py +71 -7
  33. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/workflow_manager.py +64 -2
  34. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/manifest/disposable_project.py +15 -2
  35. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/manifest/models.py +9 -3
  36. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/manifest/pyproject_manifest.py +39 -1
  37. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/manifest/store.py +0 -1
  38. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/manifest/uv_config.py +3 -1
  39. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/manifest/workflows.py +1 -1
  40. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/merging/atomic_executor.py +1 -1
  41. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/merging/semantic_merger.py +8 -1
  42. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/models/__init__.py +26 -0
  43. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/models/build_readiness.py +6 -0
  44. comfygit_core-0.7.0/src/comfygit_core/models/credentials.py +71 -0
  45. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/models/environment.py +28 -7
  46. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/models/exceptions.py +12 -5
  47. comfygit_core-0.7.0/src/comfygit_core/models/lifecycle.py +346 -0
  48. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/models/manifest.py +23 -2
  49. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/models/overlay.py +14 -6
  50. comfygit_core-0.7.0/src/comfygit_core/models/resource_inventory.py +236 -0
  51. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/models/shared.py +36 -1
  52. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/models/unmanaged_import.py +1 -0
  53. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/models/workflow.py +38 -18
  54. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/models/workspace_config.py +4 -1
  55. comfygit_core-0.7.0/src/comfygit_core/repositories/credential_store.py +62 -0
  56. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/repositories/workspace_config_repository.py +100 -80
  57. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/runtime.py +20 -0
  58. comfygit_core-0.7.0/src/comfygit_core/security.py +21 -0
  59. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/services/build_readiness.py +26 -4
  60. comfygit_core-0.7.0/src/comfygit_core/services/credential_service.py +201 -0
  61. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/services/dependency_resolution_preview.py +1 -0
  62. comfygit_core-0.7.0/src/comfygit_core/services/environment_lifecycle.py +1037 -0
  63. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/services/environment_readiness.py +4 -2
  64. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/services/environment_sync_coordinator.py +12 -2
  65. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/services/import_analyzer.py +4 -0
  66. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/services/model_downloader.py +35 -7
  67. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/services/model_source_lookup.py +1 -1
  68. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/services/node_lookup_service.py +91 -6
  69. comfygit_core-0.7.0/src/comfygit_core/services/resource_inventory.py +514 -0
  70. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/services/unmanaged_environment_import.py +5 -1
  71. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_execution.py +35 -5
  72. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_file_store.py +35 -0
  73. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_manifest_reconciler.py +180 -31
  74. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_model_download_coordinator.py +136 -0
  75. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_resolution_fixer.py +1 -1
  76. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/comfyui_ops.py +99 -7
  77. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/common.py +15 -1
  78. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/conflict_analyzer.py +2 -2
  79. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/dependency_probe.py +82 -3
  80. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/download.py +57 -25
  81. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/environment_cleanup.py +50 -0
  82. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/environment_lock.py +6 -0
  83. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/filesystem.py +37 -3
  84. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/git.py +15 -2
  85. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/pytorch_prober.py +76 -8
  86. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/redaction.py +55 -2
  87. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/requirements.py +2 -2
  88. comfygit_core-0.7.0/src/comfygit_core/utils/toml_compat.py +10 -0
  89. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/validation/resolution_tester.py +3 -3
  90. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/conftest.py +38 -1
  91. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_branch_workflow_preservation.py +63 -32
  92. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_create_with_version_spec.py +16 -0
  93. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_import_comfyui_version_bug.py +17 -11
  94. comfygit_core-0.7.0/tests/integration/test_lifecycle_status.py +158 -0
  95. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_optional_dependency_groups.py +7 -3
  96. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_overlay_git_integration.py +29 -0
  97. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_per_environment_manager.py +2 -2
  98. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_repair_node_removal.py +1 -1
  99. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_runtime_restart_workflow_preservation.py +37 -0
  100. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_workflow_caching_integration.py +13 -13
  101. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_workflow_subgraph_resolution.py +187 -0
  102. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/test_public_api.py +43 -0
  103. comfygit_core-0.7.0/tests/unit/analyzers/test_model_scanner_symlinks.py +44 -0
  104. comfygit_core-0.7.0/tests/unit/analyzers/test_node_git_analyzer.py +37 -0
  105. comfygit_core-0.7.0/tests/unit/analyzers/test_status_scanner.py +21 -0
  106. comfygit_core-0.7.0/tests/unit/analyzers/test_status_scanner_package_sync.py +25 -0
  107. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/caching/test_comfyui_cache.py +32 -4
  108. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/caching/test_custom_node_cache_refactor.py +13 -0
  109. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/core/test_environment_facades.py +81 -2
  110. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/core/test_environment_operation_locking.py +11 -0
  111. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/core/test_environment_run.py +16 -0
  112. comfygit_core-0.7.0/tests/unit/core/test_environment_sync.py +27 -0
  113. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/core/test_import_download_failures.py +4 -3
  114. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/core/test_import_no_manager.py +32 -0
  115. comfygit_core-0.7.0/tests/unit/core/test_workflow_contract_access.py +12 -0
  116. comfygit_core-0.7.0/tests/unit/core/test_workspace_environment_creation.py +61 -0
  117. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/managers/test_environment_model_manager.py +40 -0
  118. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/managers/test_export_import_overlays.py +39 -0
  119. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/managers/test_git_manager_gitignore.py +2 -0
  120. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/managers/test_node_manager.py +67 -2
  121. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/managers/test_pyproject_manager.py +37 -3
  122. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/managers/test_pytorch_overlay_materialization.py +136 -0
  123. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/managers/test_uv_no_build_isolation.py +39 -0
  124. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/managers/test_workflow_manager.py +93 -0
  125. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/managers/test_workflow_node_cleanup.py +27 -0
  126. comfygit_core-0.7.0/tests/unit/models/test_lifecycle.py +161 -0
  127. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/models/test_overlay.py +18 -0
  128. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/models/test_workflow_subgraph.py +24 -0
  129. comfygit_core-0.7.0/tests/unit/repositories/test_credential_store.py +57 -0
  130. comfygit_core-0.7.0/tests/unit/services/test_credential_service.py +275 -0
  131. comfygit_core-0.7.0/tests/unit/services/test_environment_lifecycle.py +644 -0
  132. comfygit_core-0.7.0/tests/unit/services/test_environment_model_requirements.py +142 -0
  133. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/services/test_environment_readiness.py +2 -0
  134. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/services/test_model_downloader.py +36 -4
  135. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/services/test_node_lookup_api_first.py +20 -0
  136. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/services/test_node_lookup_version_fallback.py +60 -4
  137. comfygit_core-0.7.0/tests/unit/services/test_resource_inventory.py +437 -0
  138. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/services/test_scan_requirements_substitution.py +42 -0
  139. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/services/test_unmanaged_environment_import.py +1 -0
  140. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/services/test_workflow_execution.py +46 -0
  141. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/services/test_workflow_file_store.py +46 -0
  142. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/services/test_workflow_model_download_coordinator.py +110 -0
  143. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/test_github_auth_config.py +10 -5
  144. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/test_materialization.py +34 -0
  145. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/test_model_downloader_errors.py +3 -3
  146. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/test_user_content_symlink_manager.py +22 -0
  147. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/test_workspace_config_facade.py +22 -3
  148. comfygit_core-0.7.0/tests/unit/test_workspace_credential_overrides.py +81 -0
  149. comfygit_core-0.7.0/tests/unit/utils/test_comfyui_ops_source.py +99 -0
  150. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/utils/test_dependency_probe.py +167 -4
  151. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/utils/test_environment_cleanup.py +42 -0
  152. comfygit_core-0.7.0/tests/unit/utils/test_filesystem.py +73 -0
  153. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/utils/test_git.py +10 -0
  154. comfygit_core-0.7.0/tests/unit/utils/test_provider_auth_hardening.py +80 -0
  155. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/utils/test_pytorch_prober.py +181 -20
  156. comfygit_core-0.5.0/tests/unit/utils/test_provider_auth_hardening.py +0 -33
  157. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/.gitignore +0 -0
  158. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/.python-version +0 -0
  159. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/AGENTS.md +0 -0
  160. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/CLAUDE.md +0 -0
  161. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/LICENSE.txt +0 -0
  162. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/docs/architecture-deep-dive.md +0 -0
  163. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/docs/knowledge/comfyui-node-loader-base-directories.md +0 -0
  164. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/docs/knowledge/model-tracking-system.md +0 -0
  165. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/docs/knowledge/node-resolution-behavior.md +0 -0
  166. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/docs/layer-hierarchy.md +0 -0
  167. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/docs/plans/uv-overlay-system.md +0 -0
  168. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/__init__.py +0 -0
  169. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/analyzers/__init__.py +0 -0
  170. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/analyzers/config_comparison.py +0 -0
  171. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/analyzers/custom_node_scanner.py +0 -0
  172. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/analyzers/git_change_parser.py +0 -0
  173. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/analyzers/ref_diff_analyzer.py +0 -0
  174. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/analyzers/workflow_dependency_parser.py +0 -0
  175. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/assets.py +0 -0
  176. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/build_readiness.py +0 -0
  177. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/caching/__init__.py +0 -0
  178. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/caching/api_cache.py +0 -0
  179. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/caching/base.py +0 -0
  180. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/clients/__init__.py +0 -0
  181. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/clients/github_client.py +0 -0
  182. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/clients/registry_client.py +0 -0
  183. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/configs/__init__.py +0 -0
  184. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/configs/comfyui_builtin_nodes.py +0 -0
  185. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/configs/comfyui_models.py +0 -0
  186. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/configs/model_config.py +0 -0
  187. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/confirmation.py +0 -0
  188. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/core/__init__.py +0 -0
  189. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/data/overlays/stock/sageattention.toml +0 -0
  190. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/data/overlays/stock/triton.toml +0 -0
  191. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/data/overlays/stock/xformers.toml +0 -0
  192. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/factories/__init__.py +0 -0
  193. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/factories/uv_factory.py +0 -0
  194. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/git.py +0 -0
  195. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/imports.py +0 -0
  196. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/infrastructure/__init__.py +0 -0
  197. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/infrastructure/sqlite_manager.py +0 -0
  198. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/integrations/__init__.py +0 -0
  199. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/lifecycle/__init__.py +0 -0
  200. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/lifecycle/comfyui_readiness.py +0 -0
  201. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/logging/__init__.py +0 -0
  202. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/logging/logging_config.py +0 -0
  203. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/__init__.py +0 -0
  204. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/pyproject_manager.py +0 -0
  205. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/system_node_symlink_manager.py +0 -0
  206. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/manifest/__init__.py +0 -0
  207. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/manifest/base.py +0 -0
  208. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/manifest/dependencies.py +0 -0
  209. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/manifest/migrations.py +0 -0
  210. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/manifest/nodes.py +0 -0
  211. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/manifest/overlays.py +0 -0
  212. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/manifest/sync_config.py +0 -0
  213. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/merging/__init__.py +0 -0
  214. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/merging/merge_validator.py +0 -0
  215. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/models/civitai.py +0 -0
  216. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/models/comfyui_builtin_versions.py +0 -0
  217. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/models/commit.py +0 -0
  218. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/models/dependency_resolution.py +0 -0
  219. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/models/git.py +0 -0
  220. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/models/materialization.py +0 -0
  221. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/models/merge_plan.py +0 -0
  222. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/models/model_scan.py +0 -0
  223. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/models/node_mapping.py +0 -0
  224. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/models/protocols.py +0 -0
  225. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/models/readiness.py +0 -0
  226. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/models/ref_diff.py +0 -0
  227. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/models/registry.py +0 -0
  228. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/models/runtime_config.py +0 -0
  229. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/models/sync.py +0 -0
  230. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/models/system.py +0 -0
  231. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/models/workflow_contract.py +0 -0
  232. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/models/workflow_execution.py +0 -0
  233. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/py.typed +0 -0
  234. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/readiness.py +0 -0
  235. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/repositories/__init__.py +0 -0
  236. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/repositories/comfyui_builtin_versions_repository.py +0 -0
  237. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/repositories/migrate_paths.py +0 -0
  238. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/repositories/model_repository.py +0 -0
  239. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/repositories/node_mappings_repository.py +0 -0
  240. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/repositories/workflow_repository.py +0 -0
  241. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/resolvers/__init__.py +0 -0
  242. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/resolvers/global_node_resolver.py +0 -0
  243. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/resolvers/model_resolver.py +0 -0
  244. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/services/__init__.py +0 -0
  245. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/services/huggingface_url.py +0 -0
  246. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/services/registry_data_manager.py +0 -0
  247. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_analysis_cache.py +0 -0
  248. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_analysis_service.py +0 -0
  249. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_input.py +0 -0
  250. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_manual_model_policy.py +0 -0
  251. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_model_dependency_service.py +0 -0
  252. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_model_path_policy.py +0 -0
  253. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_node_package_policy.py +0 -0
  254. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_resolution_context_builder.py +0 -0
  255. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_resolution_service.py +0 -0
  256. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_state_cleanup.py +0 -0
  257. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/strategies/__init__.py +0 -0
  258. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/strategies/auto.py +0 -0
  259. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/strategies/confirmation.py +0 -0
  260. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/__init__.py +0 -0
  261. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/builtin_extractor.py +0 -0
  262. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/conflict_parser.py +0 -0
  263. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/dependency_parser.py +0 -0
  264. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/folder_paths_extractor.py +0 -0
  265. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/input_signature.py +0 -0
  266. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/model_categories.py +0 -0
  267. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/model_loader_extractor.py +0 -0
  268. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/node_identity.py +0 -0
  269. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/provider_urls.py +0 -0
  270. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/pytorch.py +0 -0
  271. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/retry.py +0 -0
  272. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/symlink_utils.py +0 -0
  273. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/system_detector.py +0 -0
  274. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/uuid.py +0 -0
  275. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/uv_error_handler.py +0 -0
  276. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/version.py +0 -0
  277. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/workflow_hash.py +0 -0
  278. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/validation/__init__.py +0 -0
  279. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/src/comfygit_core/workflow.py +0 -0
  280. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/README.md +0 -0
  281. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/caching/TEST_REDUCTION_SUMMARY.md +0 -0
  282. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/caching/__init__.py +0 -0
  283. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/caching/test_workflow_cache.py +0 -0
  284. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/caching/test_workflow_cache_context_hash.py +0 -0
  285. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/fixtures/models/test_models.json +0 -0
  286. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/fixtures/workflows/checkpoint_loader_with_missing_model.json +0 -0
  287. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/fixtures/workflows/kjnodes_workflow.json +0 -0
  288. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/fixtures/workflows/simple_txt2img.json +0 -0
  289. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/fixtures/workflows/with_custom_node.json +0 -0
  290. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/fixtures/workflows/with_missing_model.json +0 -0
  291. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/fixtures/workflows/workflow_with_duplicates.json +0 -0
  292. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/fixtures/workflows/workflow_with_properties.json +0 -0
  293. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/fixtures/workflows/workflow_without_properties.json +0 -0
  294. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/helpers/__init__.py +0 -0
  295. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/helpers/model_index_builder.py +0 -0
  296. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/helpers/pyproject_assertions.py +0 -0
  297. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/helpers/workflow_builder.py +0 -0
  298. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_atomic_semantic_merge.py +0 -0
  299. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_auto_model_index_sync.py +0 -0
  300. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_cache_invalidation_on_model_deletion.py +0 -0
  301. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_cache_node_version_invalidation.py +0 -0
  302. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_checkout_b_with_modified_workflow.py +0 -0
  303. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_commit_git_changes.py +0 -0
  304. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_commit_git_changes_SUMMARY.md +0 -0
  305. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_commit_history.py +0 -0
  306. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_context_aware_node_resolution.py +0 -0
  307. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_custom_node_path_preservation.py +0 -0
  308. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_deferred_model_downloads.py +0 -0
  309. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_deleted_model_download_intent.py +0 -0
  310. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_dependency_group_removal.py +0 -0
  311. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_dev_node_git_references.py +0 -0
  312. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_dev_node_improvements.py +0 -0
  313. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_download_cleanup.py +0 -0
  314. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_download_intent_cache_invalidation.py +0 -0
  315. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_environment_basic.py +0 -0
  316. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_environment_branching.py +0 -0
  317. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_environment_create_progress.py +0 -0
  318. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_export_import.py +0 -0
  319. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_git_branching.py +0 -0
  320. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_git_import.py +0 -0
  321. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_git_pull_push.py +0 -0
  322. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_git_remote.py +0 -0
  323. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_git_subdirectory_import.py +0 -0
  324. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_import_auto_remote.py +0 -0
  325. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_import_preview.py +0 -0
  326. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_model_category_mismatch_detection.py +0 -0
  327. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_model_directory_switch.py +0 -0
  328. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_model_download_integration.py +0 -0
  329. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_model_index_mismatch_bug_SUMMARY.md +0 -0
  330. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_model_path_sync_detection.py +0 -0
  331. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_model_resolution_stale_directory.py +0 -0
  332. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_model_show_command.py +0 -0
  333. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_model_source_management.py +0 -0
  334. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_model_source_preservation.py +0 -0
  335. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_model_source_preservation_SUMMARY.md +0 -0
  336. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_model_source_removal.py +0 -0
  337. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_multiple_optional_group_failures.py +0 -0
  338. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_node_prune.py +0 -0
  339. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_node_version_replacement.py +0 -0
  340. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_opencv_conflict_resolution.py +0 -0
  341. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_overlay_e2e.py +0 -0
  342. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_overlay_system_integration.py +0 -0
  343. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_package_config.py +0 -0
  344. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_pyproject_batch_writes.py +0 -0
  345. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_pytorch_reconfiguration.py +0 -0
  346. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_registry_git_fallback.py +0 -0
  347. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_registry_node_update_empty_download_url.py +0 -0
  348. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_repair_completion_marker.py +0 -0
  349. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_repair_model_download.py +0 -0
  350. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_repair_workflow.py +0 -0
  351. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_requirements_inline_comments_bug.py +0 -0
  352. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_status_abstraction.py +0 -0
  353. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_status_uninstalled_nodes.py +0 -0
  354. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_workflow_cache_metadata_invalidation.py +0 -0
  355. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_workflow_commit_flow.py +0 -0
  356. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_workflow_deletion_cleanup.py +0 -0
  357. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_workflow_model_criticality_update.py +0 -0
  358. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_workflow_path_update_after_interactive_resolution.py +0 -0
  359. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_workflow_resolution_cleanup.py +0 -0
  360. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_workflow_resolution_pipeline.py +0 -0
  361. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/integration/test_workflow_resolve_install.py +0 -0
  362. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/test_architecture_boundaries.py +0 -0
  363. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/analyzers/test_config_comparison.py +0 -0
  364. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/analyzers/test_custom_node_scanner.py +0 -0
  365. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/analyzers/test_ref_diff_analyzer.py +0 -0
  366. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/analyzers/test_status_scanner_disabled_nodes.py +0 -0
  367. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/analyzers/test_workflow_dependency_parser.py +0 -0
  368. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/caching/test_cache_base.py +0 -0
  369. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/caching/test_workspace_relative_caching.py +0 -0
  370. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/clients/test_civitai_client.py +0 -0
  371. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/clients/test_civitai_parsing.py +0 -0
  372. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/clients/test_github_releases.py +0 -0
  373. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/configs/__init__.py +0 -0
  374. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/configs/test_package_config.py +0 -0
  375. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/core/test_environment_uninstalled_nodes.py +0 -0
  376. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/core/test_reserved_environment_names.py +0 -0
  377. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/core/test_sync_node_dependency_provisioning.py +0 -0
  378. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/core/test_workspace_model_delete.py +0 -0
  379. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/factories/test_environment_factory_manager_install.py +0 -0
  380. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/lifecycle/test_comfyui_readiness.py +0 -0
  381. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/managers/test_git_manager_log_refs.py +0 -0
  382. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/managers/test_model_index_manager.py +0 -0
  383. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/managers/test_model_short_hash.py +0 -0
  384. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/managers/test_node_conflict_detection.py +0 -0
  385. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/managers/test_overlay_fuzz.py +0 -0
  386. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/managers/test_overlay_manager.py +0 -0
  387. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/managers/test_overlay_materialization.py +0 -0
  388. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/managers/test_pyproject_schema_version.py +0 -0
  389. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/managers/test_pytorch_backend_manager.py +0 -0
  390. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/managers/test_pytorch_stripping.py +0 -0
  391. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/managers/test_sqlite_manager.py +0 -0
  392. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/managers/test_workflow_status.py +0 -0
  393. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/merging/__init__.py +0 -0
  394. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/merging/test_atomic_executor.py +0 -0
  395. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/merging/test_merge_validator.py +0 -0
  396. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/merging/test_semantic_merger.py +0 -0
  397. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/models/test_comfyui_builtin_versions.py +0 -0
  398. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/models/test_ref_diff.py +0 -0
  399. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/models/test_workflow_contract.py +0 -0
  400. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/models/test_workflow_dependencies.py +0 -0
  401. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/models/test_workflow_roundtrip.py +0 -0
  402. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/resolvers/test_global_node_resolver_v2.py +0 -0
  403. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/resolvers/test_model_resolver.py +0 -0
  404. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/services/test_build_readiness.py +0 -0
  405. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/services/test_dependency_resolution_preview.py +0 -0
  406. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/services/test_global_node_resolver.py +0 -0
  407. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/services/test_huggingface_url.py +0 -0
  408. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/services/test_import_analyzer.py +0 -0
  409. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/services/test_model_source_lookup.py +0 -0
  410. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/services/test_registry_data_manager.py +0 -0
  411. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/services/test_workflow_analysis_cache.py +0 -0
  412. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/services/test_workflow_analysis_service.py +0 -0
  413. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/services/test_workflow_input.py +0 -0
  414. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/services/test_workflow_model_dependency_service.py +0 -0
  415. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/services/test_workflow_model_path_policy.py +0 -0
  416. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/services/test_workflow_resolution_context_builder.py +0 -0
  417. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/services/test_workflow_resolution_fixer.py +0 -0
  418. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/services/test_workflow_resolution_service.py +0 -0
  419. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/services/test_workflow_state_cleanup.py +0 -0
  420. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/test_add_dependencies_substitution.py +0 -0
  421. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/test_auto_strategies.py +0 -0
  422. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/test_builtin_extractor.py +0 -0
  423. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/test_dev_node_rename_detection.py +0 -0
  424. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/test_environment_py_dependencies.py +0 -0
  425. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/test_external_uv_cache.py +0 -0
  426. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/test_folder_paths_extractor.py +0 -0
  427. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/test_github_url_installation.py +0 -0
  428. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/test_headless_import.py +0 -0
  429. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/test_minimal_schema_compatibility.py +0 -0
  430. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/test_model_config_dynamic_loading.py +0 -0
  431. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/test_model_loader_extractor.py +0 -0
  432. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/test_model_repository_cleanup.py +0 -0
  433. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/test_model_symlink_manager.py +0 -0
  434. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/test_node_callbacks.py +0 -0
  435. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/test_node_conflict_context.py +0 -0
  436. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/test_node_mappings_repository.py +0 -0
  437. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/test_node_resolution_context.py +0 -0
  438. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/test_unified_node_search.py +0 -0
  439. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/test_uv_error_handling.py +0 -0
  440. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/test_uv_error_parser.py +0 -0
  441. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/test_workflow_manager_deduplication.py +0 -0
  442. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/test_workspace_config_resilience.py +0 -0
  443. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/utils/test_conflict_analyzer.py +0 -0
  444. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/utils/test_conflict_parser.py +0 -0
  445. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/utils/test_dependency_parser.py +0 -0
  446. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/utils/test_input_signature.py +0 -0
  447. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/utils/test_node_identity.py +0 -0
  448. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/utils/test_pytorch.py +0 -0
  449. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/utils/test_requirements.py +0 -0
  450. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/utils/test_symlink_utils.py +0 -0
  451. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/utils/test_uuid.py +0 -0
  452. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/unit/utils/test_version.py +0 -0
  453. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/utils/__init__.py +0 -0
  454. {comfygit_core-0.5.0 → comfygit_core-0.7.0}/tests/utils/test_workflow_hash.py +0 -0
@@ -1,3 +1,25 @@
1
+ Metadata-Version: 2.5
2
+ Name: comfygit-core
3
+ Version: 0.7.0
4
+ Summary: ComfyGit Core - Git-based ComfyUI environment manager
5
+ Project-URL: Documentation, https://docs.comfygit.org/
6
+ Project-URL: Repository, https://github.com/comfygit-ai/comfygit
7
+ Project-URL: Issues, https://github.com/comfygit-ai/comfygit/issues
8
+ License-File: LICENSE.txt
9
+ Requires-Python: >=3.10
10
+ Requires-Dist: blake3>=0.3.3
11
+ Requires-Dist: huggingface-hub>=0.15.1
12
+ Requires-Dist: packaging>=16.2
13
+ Requires-Dist: requests>=2.32.4
14
+ Requires-Dist: requirements-parser>=0.11.0
15
+ Requires-Dist: tomli>=2.0.1; python_version < '3.11'
16
+ Requires-Dist: tomlkit>=0.11.0
17
+ Requires-Dist: uv>=0.11.15
18
+ Requires-Dist: xxhash>=2.0.0
19
+ Provides-Extra: keyring
20
+ Requires-Dist: keyring>=25.7.0; extra == 'keyring'
21
+ Description-Content-Type: text/markdown
22
+
1
23
  # ComfyGit Core
2
24
 
3
25
  Core library for programmatic ComfyUI environment and package management. Build custom tools, GUIs, web interfaces, or CI/CD integrations on top of ComfyGit's architecture.
@@ -466,3 +488,34 @@ dependencies = [
466
488
  "comfygit-core>=0.3.14,<0.4.0" # Pin to minor version
467
489
  ]
468
490
  ```
491
+
492
+ ## Credentials in headless applications
493
+
494
+ The base `comfygit-core` installation does not require `keyring`. Install
495
+ `comfygit-core[keyring]` when OS-backed credential persistence is wanted; the
496
+ normal `comfygit` CLI includes this extra. An unavailable package or OS backend
497
+ produces a structured error when saving credentials, never plaintext fallback.
498
+
499
+ `Workspace.open`, `create`, `from_path`, and `open_or_create` accept an optional
500
+ `credential_overrides` mapping keyed by `CredentialProvider`. A nonempty token
501
+ is process-local and takes priority over environment variables, workspace secure
502
+ storage and provider-native login. An explicit `None` requests anonymous
503
+ provider access; omitted providers follow the normal resolution chain. For
504
+ Hugging Face downloads and lookup, anonymous access disables the SDK's saved
505
+ login discovery too. External git helpers/SSH and URL-embedded authentication
506
+ remain the embedding application's responsibility.
507
+
508
+ ```python
509
+ from comfygit_core import Workspace
510
+ from comfygit_core.models import CredentialProvider
511
+
512
+ workspace = Workspace.open(
513
+ workspace_path,
514
+ credential_overrides={CredentialProvider.HUGGINGFACE: None},
515
+ )
516
+ ```
517
+
518
+ No login is required for local operations or public resources that allow
519
+ anonymous access. For authenticated access without keyring, set the appropriate
520
+ provider environment variable or use an existing Hugging Face login. Tokens
521
+ are never exported in environment manifests.
@@ -1,22 +1,3 @@
1
- Metadata-Version: 2.4
2
- Name: comfygit-core
3
- Version: 0.5.0
4
- Summary: ComfyGit Core - Git-based ComfyUI environment manager
5
- Project-URL: Documentation, https://docs.comfygit.org/
6
- Project-URL: Repository, https://github.com/comfygit-ai/comfygit
7
- Project-URL: Issues, https://github.com/comfygit-ai/comfygit/issues
8
- License-File: LICENSE.txt
9
- Requires-Python: >=3.10
10
- Requires-Dist: blake3>=0.3.3
11
- Requires-Dist: huggingface-hub>=0.11.0
12
- Requires-Dist: packaging>=16.2
13
- Requires-Dist: requests>=2.33.0
14
- Requires-Dist: requirements-parser>=0.11.0
15
- Requires-Dist: tomlkit>=0.11.0
16
- Requires-Dist: uv>=0.11.8
17
- Requires-Dist: xxhash>=2.0.0
18
- Description-Content-Type: text/markdown
19
-
20
1
  # ComfyGit Core
21
2
 
22
3
  Core library for programmatic ComfyUI environment and package management. Build custom tools, GUIs, web interfaces, or CI/CD integrations on top of ComfyGit's architecture.
@@ -485,3 +466,34 @@ dependencies = [
485
466
  "comfygit-core>=0.3.14,<0.4.0" # Pin to minor version
486
467
  ]
487
468
  ```
469
+
470
+ ## Credentials in headless applications
471
+
472
+ The base `comfygit-core` installation does not require `keyring`. Install
473
+ `comfygit-core[keyring]` when OS-backed credential persistence is wanted; the
474
+ normal `comfygit` CLI includes this extra. An unavailable package or OS backend
475
+ produces a structured error when saving credentials, never plaintext fallback.
476
+
477
+ `Workspace.open`, `create`, `from_path`, and `open_or_create` accept an optional
478
+ `credential_overrides` mapping keyed by `CredentialProvider`. A nonempty token
479
+ is process-local and takes priority over environment variables, workspace secure
480
+ storage and provider-native login. An explicit `None` requests anonymous
481
+ provider access; omitted providers follow the normal resolution chain. For
482
+ Hugging Face downloads and lookup, anonymous access disables the SDK's saved
483
+ login discovery too. External git helpers/SSH and URL-embedded authentication
484
+ remain the embedding application's responsibility.
485
+
486
+ ```python
487
+ from comfygit_core import Workspace
488
+ from comfygit_core.models import CredentialProvider
489
+
490
+ workspace = Workspace.open(
491
+ workspace_path,
492
+ credential_overrides={CredentialProvider.HUGGINGFACE: None},
493
+ )
494
+ ```
495
+
496
+ No login is required for local operations or public resources that allow
497
+ anonymous access. For authenticated access without keyring, set the appropriate
498
+ provider environment variable or use an existing Hugging Face login. Tokens
499
+ are never exported in environment manifests.
@@ -41,7 +41,7 @@ ComfyGit Core is a **library-first Python package** providing environment manage
41
41
  |--------|---------|--------------|
42
42
  | **core/** | Public API | Workspace (multi-env), Environment (single env) |
43
43
  | **models/** | Public typed contracts | Exported data classes, protocols, exceptions with context |
44
- | **readiness.py**, **workflow.py**, **runtime.py**, **assets.py**, **git.py** | Public facades | Reusable domain helpers promoted for adapters |
44
+ | **readiness.py**, **workflow.py**, **runtime.py**, **assets.py**, **git.py**, **security.py** | Public facades | Reusable domain helpers promoted for adapters |
45
45
  | **managers/** | Orchestration | Environment orchestrators (Git, Model), Resource managers (Node, Workflow, Model symlinks), Config managers (PyProject, UV, PyTorch backend) |
46
46
  | **manifest/** | Internal manifest abstraction | Pyproject-backed store, section handlers, edit helpers, overlay materialization, migration cleanup |
47
47
  | **analyzers/** | Analysis | Parse workflows/git/status; classify nodes |
@@ -79,6 +79,10 @@ ComfyGit Core is a **library-first Python package** providing environment manage
79
79
  - `Workspace.create()` - Create new workspace with validation
80
80
  - `Workspace.open_or_create()` - Setup-friendly load-or-create entry point
81
81
  - `Workspace.list_environments()` / `get_environment()` - List/get environments
82
+ - `Workspace.get_resource_inventory()` / `get_model_inventory()` - Typed model,
83
+ environment, source, and storage inventory for adapters
84
+ - `Workspace.plan_model_deletion()` / `apply_model_deletion_plan()` - Dry-run-first,
85
+ location-specific model reclaim with conservative blockers
82
86
  - `Workspace.get_schema_version()` / `is_legacy_schema()` - Check workspace version
83
87
  - `Workspace.upgrade_schema_if_needed()` - Migrate to current schema
84
88
 
@@ -1,20 +1,24 @@
1
1
  [project]
2
2
  name = "comfygit-core"
3
- version = "0.5.0"
3
+ version = "0.7.0"
4
4
  description = "ComfyGit Core - Git-based ComfyUI environment manager"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
7
7
  dependencies = [
8
8
  "blake3>=0.3.3",
9
- "huggingface_hub>=0.11.0",
9
+ "huggingface-hub>=0.15.1",
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
- "uv>=0.11.8",
14
+ "tomli>=2.0.1; python_version < '3.11'",
15
+ "uv>=0.11.15",
15
16
  "xxhash>=2.0.0",
16
17
  ]
17
18
 
19
+ [project.optional-dependencies]
20
+ keyring = ["keyring>=25.7.0"]
21
+
18
22
  [project.urls]
19
23
  Documentation = "https://docs.comfygit.org/"
20
24
  Repository = "https://github.com/comfygit-ai/comfygit"
@@ -208,7 +208,13 @@ class ModelScanner:
208
208
  continue
209
209
 
210
210
  try:
211
- if not file_path.is_file() or file_path.is_symlink():
211
+ # Model libraries commonly use file symlinks to share large
212
+ # weights between ComfyUI installations or expose a loader's
213
+ # expected filename as an alias. ``Path.stat()`` and the hash
214
+ # reader intentionally follow a valid file symlink, while the
215
+ # indexed location remains the alias path under ``models/``.
216
+ # Broken links and links to directories still fail is_file().
217
+ if not file_path.is_file():
212
218
  skipped_not_file += 1
213
219
  continue
214
220
 
@@ -6,11 +6,10 @@ from dataclasses import dataclass, field
6
6
  from pathlib import Path
7
7
  from typing import TYPE_CHECKING
8
8
 
9
- import tomllib
10
-
11
9
  from ..configs.comfyui_builtin_nodes import COMFYUI_BUILTIN_NODES
12
10
  from ..logging.logging_config import get_logger
13
11
  from ..models.comfyui_builtin_versions import BuiltinVersionGateInfo
12
+ from ..utils.toml_compat import tomllib
14
13
 
15
14
  if TYPE_CHECKING:
16
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
 
@@ -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:
@@ -410,13 +440,20 @@ class StatusScanner:
410
440
  # Use UV's dry-run to check if sync would change anything
411
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
  )
@@ -77,6 +77,11 @@ def scan_unmanaged_comfyui(
77
77
  ignored_custom_node_names=ignored_custom_node_names,
78
78
  )
79
79
  version, commit = _detect_comfyui_version(comfyui_path)
80
+ repository = (
81
+ _git_output(comfyui_path, "remote", "get-url", "origin")
82
+ if _is_git_checkout(comfyui_path)
83
+ else None
84
+ )
80
85
 
81
86
  if not workflows:
82
87
  warnings.append("No saved workflow JSON files were found.")
@@ -88,6 +93,7 @@ def scan_unmanaged_comfyui(
88
93
  python_version=f"{sys.version_info.major}.{sys.version_info.minor}",
89
94
  comfyui_version=version,
90
95
  comfyui_commit=commit,
96
+ comfyui_repository=repository,
91
97
  workflows=workflows,
92
98
  model_references=model_references,
93
99
  models_scanned=models_scanned,
@@ -4,9 +4,15 @@ Caches ComfyUI installations by version to avoid re-downloading and re-cloning.
4
4
  Supports releases, commits, and branches.
5
5
  """
6
6
 
7
+ import hashlib
7
8
  from dataclasses import dataclass
8
9
  from pathlib import Path
9
10
 
11
+ from ..constants import DEFAULT_COMFYUI_REPOSITORY
12
+ from ..utils.comfyui_ops import (
13
+ comfyui_repository_identity,
14
+ normalize_comfyui_repository,
15
+ )
10
16
  from .base import ContentCacheBase
11
17
 
12
18
 
@@ -16,6 +22,7 @@ class ComfyUISpec:
16
22
  version: str # "v0.3.20", "abc123", "main"
17
23
  version_type: str # "release", "commit", "branch"
18
24
  commit_sha: str | None = None # Actual commit SHA (for branches)
25
+ repository: str = DEFAULT_COMFYUI_REPOSITORY
19
26
 
20
27
 
21
28
  class ComfyUICacheManager(ContentCacheBase):
@@ -60,12 +67,20 @@ class ComfyUICacheManager(ContentCacheBase):
60
67
  # Simple string version
61
68
  return f"version_{spec}"
62
69
 
63
- # Use commit SHA for branches (they can change)
64
- if spec.version_type == "branch" and spec.commit_sha:
65
- return f"commit_{spec.commit_sha}"
70
+ repository = normalize_comfyui_repository(spec.repository)
71
+ repository_identity = comfyui_repository_identity(repository)
72
+ repository_key = hashlib.sha256(
73
+ repository_identity.encode("utf-8")
74
+ ).hexdigest()[:12]
66
75
 
67
- # For releases and commits, use the version
68
- return f"{spec.version_type}_{spec.version}"
76
+ # Any captured commit is the immutable cache authority, including
77
+ # snapshots originally described by a branch or release.
78
+ if spec.commit_sha:
79
+ revision_key = f"commit_{spec.commit_sha}"
80
+ else:
81
+ revision_key = f"{spec.version_type}_{spec.version}"
82
+
83
+ return f"source_{repository_key}_{revision_key}"
69
84
 
70
85
  def cache_comfyui(self, spec: ComfyUISpec, source_path: Path) -> Path:
71
86
  """Cache a ComfyUI installation.
@@ -82,7 +97,8 @@ class ComfyUICacheManager(ContentCacheBase):
82
97
  metadata = {
83
98
  "version": spec.version,
84
99
  "version_type": spec.version_type,
85
- "commit_sha": spec.commit_sha
100
+ "commit_sha": spec.commit_sha,
101
+ "repository": normalize_comfyui_repository(spec.repository),
86
102
  }
87
103
 
88
104
  return self.cache_content(cache_key, source_path, metadata)
@@ -96,5 +112,11 @@ class ComfyUICacheManager(ContentCacheBase):
96
112
  Returns:
97
113
  Path to cached ComfyUI content, or None if not cached
98
114
  """
115
+ if (
116
+ isinstance(spec, ComfyUISpec)
117
+ and spec.version_type == "branch"
118
+ and not spec.commit_sha
119
+ ):
120
+ return None
99
121
  cache_key = self.generate_cache_key(spec)
100
122
  return self.get_cached_path(cache_key)
@@ -127,9 +127,20 @@ class CustomNodeCacheManager(ContentCacheBase):
127
127
  cache_dir = self.store_dir / cache_key
128
128
  content_dir = cache_dir / "content"
129
129
 
130
+ if node_info.source == "git" and (content_dir / ".gitmodules").is_file():
131
+ from ..utils.git import _git
132
+
133
+ if not (content_dir / ".git").exists():
134
+ return False
135
+ try:
136
+ status = _git(["submodule", "status", "--recursive"], content_dir)
137
+ if any(line.startswith(("-", "+", "U")) for line in status.stdout.splitlines()):
138
+ return False
139
+ except (OSError, ValueError):
140
+ return False
130
141
  return content_dir.exists() and any(content_dir.iterdir())
131
142
 
132
- def get_cached_path(self, node_info: NodeInfo) -> Path | None:
143
+ def get_cached_node_path(self, node_info: NodeInfo) -> Path | None:
133
144
  """Get the path to cached node content if it exists.
134
145
 
135
146
  Returns:
@@ -225,7 +236,7 @@ class CustomNodeCacheManager(ContentCacheBase):
225
236
  Returns:
226
237
  True if successfully copied, False otherwise
227
238
  """
228
- cached_path = self.get_cached_path(node_info)
239
+ cached_path = self.get_cached_node_path(node_info)
229
240
  if not cached_path:
230
241
  return False
231
242
 
@@ -246,7 +246,7 @@ class WorkflowCacheRepository:
246
246
  if from_version == to_version:
247
247
  return
248
248
 
249
- logger.info(f"Migrating workflow cache schema v{from_version} → v{to_version}")
249
+ logger.info(f"Migrating workflow cache schema v{from_version} -> v{to_version}")
250
250
 
251
251
  # Drop and recreate (cache is ephemeral)
252
252
  self.sqlite.execute_write("DROP TABLE IF EXISTS workflow_cache")
@@ -82,12 +82,13 @@ class CivitAIClient:
82
82
  self.cache_manager = cache_manager
83
83
  self.workspace_config = workspace_config
84
84
 
85
- # Resolve API key: direct > environment > config
86
- self._api_key = api_key
87
- if not self._api_key:
88
- self._api_key = os.environ.get("CIVITAI_API_TOKEN")
89
- if not self._api_key and workspace_config:
85
+ # Workspace resolution owns overrides, environment and secure-store order.
86
+ if api_key is not None:
87
+ self._api_key = api_key
88
+ elif workspace_config is not None:
90
89
  self._api_key = workspace_config.get_civitai_token()
90
+ else:
91
+ self._api_key = os.environ.get("CIVITAI_API_TOKEN") or os.environ.get("CIVITAI_API_KEY")
91
92
 
92
93
  self.rate_limiter = RateLimitManager(min_interval=0.1)
93
94
  self.retry_config = RetryConfig(
@@ -31,6 +31,7 @@ DEFAULT_PROBE_PROTECTED = [
31
31
  "torchvision",
32
32
  "torchaudio",
33
33
  "torchsde",
34
+ "uv",
34
35
  ]
35
36
 
36
37
  class PackageConfigManager:
@@ -77,6 +77,12 @@ LEGACY_SYSTEM_NODES = {
77
77
  MANAGER_NODE_ID = 'comfygit-manager'
78
78
  MANAGER_GITHUB_URL = 'https://github.com/comfygit-ai/comfygit-manager'
79
79
 
80
+ # Runtime-only PyTorch backend override used by `cg run --torch-backend`.
81
+ # This is intentionally non-persistent: it tells child Manager/UI processes
82
+ # which backend policy launched the current ComfyUI process without writing to
83
+ # `.pytorch-backend`.
84
+ ACTIVE_TORCH_BACKEND_OVERRIDE_ENV = "COMFYGIT_TORCH_BACKEND_OVERRIDE"
85
+
80
86
  # Schema version for environment pyproject.toml format.
81
87
  # Increment when making breaking changes to the pyproject.toml structure.
82
88
  # v1: Original format with inline PyTorch config (indexes, sources, constraints)
@@ -87,6 +93,7 @@ PYPROJECT_SCHEMA_VERSION = 2
87
93
  DEFAULT_REGISTRY_URL = "https://api.comfy.org"
88
94
  DEFAULT_GITHUB_URL = "https://github.com"
89
95
  GITHUB_API_BASE = "https://api.github.com"
96
+ DEFAULT_COMFYUI_REPOSITORY = "https://github.com/Comfy-Org/ComfyUI.git"
90
97
 
91
98
  GITHUB_NODE_MAPPINGS_URL = "https://raw.githubusercontent.com/comfygit-ai/comfygit-registry-data/main/data/node_mappings.json"
92
99
  GITHUB_COMFYUI_BUILTINS_BY_VERSION_URL = "https://raw.githubusercontent.com/comfygit-ai/comfygit-registry-data/main/data/comfyui_builtins_by_version.json"