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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (454) hide show
  1. comfygit_core-0.6.0/README.md → comfygit_core-0.7.0/PKG-INFO +53 -0
  2. comfygit_core-0.6.0/PKG-INFO → comfygit_core-0.7.0/README.md +31 -19
  3. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/docs/architecture.md +5 -1
  4. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/pyproject.toml +7 -3
  5. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/analyzers/model_scanner.py +7 -1
  6. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/analyzers/unmanaged_comfyui_analyzer.py +6 -0
  7. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/caching/comfyui_cache.py +28 -6
  8. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/caching/custom_node_cache.py +13 -2
  9. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/clients/civitai_client.py +6 -5
  10. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/constants.py +1 -0
  11. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/core/environment.py +115 -34
  12. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/core/workspace.py +205 -30
  13. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/factories/environment_factory.py +39 -9
  14. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/factories/workspace_factory.py +46 -21
  15. comfygit_core-0.7.0/src/comfygit_core/lifecycle/runtime_control.py +186 -0
  16. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/lifecycle/switch_observer.py +60 -1
  17. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/environment_model_manager.py +80 -3
  18. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/node_manager.py +6 -0
  19. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/workflow_manager.py +13 -0
  20. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/manifest/models.py +9 -3
  21. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/manifest/pyproject_manifest.py +13 -1
  22. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/manifest/workflows.py +1 -1
  23. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/merging/semantic_merger.py +8 -1
  24. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/__init__.py +15 -0
  25. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/build_readiness.py +6 -0
  26. comfygit_core-0.7.0/src/comfygit_core/models/credentials.py +71 -0
  27. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/exceptions.py +12 -5
  28. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/manifest.py +23 -2
  29. comfygit_core-0.7.0/src/comfygit_core/models/resource_inventory.py +236 -0
  30. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/shared.py +33 -1
  31. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/unmanaged_import.py +1 -0
  32. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/workflow.py +17 -4
  33. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/workspace_config.py +4 -1
  34. comfygit_core-0.7.0/src/comfygit_core/repositories/credential_store.py +62 -0
  35. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/repositories/workspace_config_repository.py +100 -80
  36. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/runtime.py +16 -0
  37. comfygit_core-0.7.0/src/comfygit_core/security.py +21 -0
  38. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/build_readiness.py +25 -3
  39. comfygit_core-0.7.0/src/comfygit_core/services/credential_service.py +201 -0
  40. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/environment_readiness.py +4 -2
  41. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/environment_sync_coordinator.py +12 -2
  42. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/import_analyzer.py +4 -0
  43. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/model_downloader.py +35 -7
  44. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/model_source_lookup.py +1 -1
  45. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/node_lookup_service.py +1 -1
  46. comfygit_core-0.7.0/src/comfygit_core/services/resource_inventory.py +514 -0
  47. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/unmanaged_environment_import.py +5 -1
  48. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_execution.py +9 -2
  49. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_manifest_reconciler.py +10 -1
  50. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_model_download_coordinator.py +136 -0
  51. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/comfyui_ops.py +99 -7
  52. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/filesystem.py +18 -0
  53. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/git.py +3 -0
  54. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/pytorch_prober.py +22 -3
  55. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/redaction.py +55 -2
  56. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/requirements.py +2 -2
  57. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/conftest.py +38 -1
  58. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_create_with_version_spec.py +16 -0
  59. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_import_comfyui_version_bug.py +17 -11
  60. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_per_environment_manager.py +2 -2
  61. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_repair_node_removal.py +1 -1
  62. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/test_public_api.py +32 -2
  63. comfygit_core-0.7.0/tests/unit/analyzers/test_model_scanner_symlinks.py +44 -0
  64. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/caching/test_comfyui_cache.py +32 -4
  65. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/caching/test_custom_node_cache_refactor.py +13 -0
  66. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/core/test_import_download_failures.py +4 -3
  67. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/core/test_import_no_manager.py +32 -0
  68. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/core/test_workspace_environment_creation.py +0 -1
  69. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_environment_model_manager.py +40 -0
  70. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_node_manager.py +34 -1
  71. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_pyproject_manager.py +8 -1
  72. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_workflow_manager.py +34 -0
  73. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/models/test_workflow_subgraph.py +24 -0
  74. comfygit_core-0.7.0/tests/unit/repositories/test_credential_store.py +57 -0
  75. comfygit_core-0.7.0/tests/unit/services/test_credential_service.py +275 -0
  76. comfygit_core-0.7.0/tests/unit/services/test_environment_model_requirements.py +142 -0
  77. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_environment_readiness.py +2 -0
  78. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_model_downloader.py +36 -4
  79. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_node_lookup_version_fallback.py +7 -7
  80. comfygit_core-0.7.0/tests/unit/services/test_resource_inventory.py +437 -0
  81. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_unmanaged_environment_import.py +1 -0
  82. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_workflow_execution.py +11 -0
  83. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_workflow_model_download_coordinator.py +110 -0
  84. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_github_auth_config.py +10 -5
  85. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_materialization.py +34 -0
  86. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_model_downloader_errors.py +3 -3
  87. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_workspace_config_facade.py +22 -3
  88. comfygit_core-0.7.0/tests/unit/test_workspace_credential_overrides.py +81 -0
  89. comfygit_core-0.7.0/tests/unit/utils/test_comfyui_ops_source.py +99 -0
  90. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/utils/test_environment_cleanup.py +0 -1
  91. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/utils/test_filesystem.py +0 -1
  92. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/utils/test_git.py +10 -0
  93. comfygit_core-0.7.0/tests/unit/utils/test_provider_auth_hardening.py +80 -0
  94. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/utils/test_pytorch_prober.py +60 -1
  95. comfygit_core-0.6.0/tests/unit/utils/test_provider_auth_hardening.py +0 -33
  96. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/.gitignore +0 -0
  97. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/.python-version +0 -0
  98. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/AGENTS.md +0 -0
  99. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/CLAUDE.md +0 -0
  100. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/LICENSE.txt +0 -0
  101. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/docs/architecture-deep-dive.md +0 -0
  102. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/docs/knowledge/comfyui-node-loader-base-directories.md +0 -0
  103. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/docs/knowledge/model-tracking-system.md +0 -0
  104. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/docs/knowledge/node-resolution-behavior.md +0 -0
  105. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/docs/layer-hierarchy.md +0 -0
  106. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/docs/plans/uv-overlay-system.md +0 -0
  107. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/__init__.py +0 -0
  108. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/analyzers/__init__.py +0 -0
  109. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/analyzers/config_comparison.py +0 -0
  110. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/analyzers/custom_node_scanner.py +0 -0
  111. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/analyzers/git_change_parser.py +0 -0
  112. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/analyzers/node_classifier.py +0 -0
  113. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/analyzers/node_git_analyzer.py +0 -0
  114. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/analyzers/ref_diff_analyzer.py +0 -0
  115. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/analyzers/status_scanner.py +0 -0
  116. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/analyzers/workflow_dependency_parser.py +0 -0
  117. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/assets.py +0 -0
  118. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/build_readiness.py +0 -0
  119. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/caching/__init__.py +0 -0
  120. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/caching/api_cache.py +0 -0
  121. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/caching/base.py +0 -0
  122. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/caching/workflow_cache.py +0 -0
  123. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/clients/__init__.py +0 -0
  124. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/clients/github_client.py +0 -0
  125. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/clients/registry_client.py +0 -0
  126. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/configs/__init__.py +0 -0
  127. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/configs/comfyui_builtin_nodes.py +0 -0
  128. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/configs/comfyui_models.py +0 -0
  129. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/configs/model_config.py +0 -0
  130. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/configs/package_config.py +0 -0
  131. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/confirmation.py +0 -0
  132. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/core/__init__.py +0 -0
  133. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/data/overlays/stock/sageattention.toml +0 -0
  134. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/data/overlays/stock/triton.toml +0 -0
  135. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/data/overlays/stock/xformers.toml +0 -0
  136. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/factories/__init__.py +0 -0
  137. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/factories/uv_factory.py +0 -0
  138. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/git.py +0 -0
  139. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/imports.py +0 -0
  140. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/infrastructure/__init__.py +0 -0
  141. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/infrastructure/sqlite_manager.py +0 -0
  142. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/integrations/__init__.py +0 -0
  143. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/integrations/uv_command.py +0 -0
  144. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/lifecycle/__init__.py +0 -0
  145. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/lifecycle/comfyui_readiness.py +0 -0
  146. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/logging/__init__.py +0 -0
  147. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/logging/logging_config.py +0 -0
  148. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/__init__.py +0 -0
  149. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/environment_git_orchestrator.py +0 -0
  150. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/export_import_manager.py +0 -0
  151. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/git_manager.py +0 -0
  152. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/model_symlink_manager.py +0 -0
  153. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/overlay_manager.py +0 -0
  154. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/pyproject_manager.py +0 -0
  155. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/pytorch_backend_manager.py +0 -0
  156. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/system_node_symlink_manager.py +0 -0
  157. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/user_content_symlink_manager.py +0 -0
  158. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/managers/uv_project_manager.py +0 -0
  159. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/manifest/__init__.py +0 -0
  160. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/manifest/base.py +0 -0
  161. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/manifest/dependencies.py +0 -0
  162. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/manifest/disposable_project.py +0 -0
  163. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/manifest/migrations.py +0 -0
  164. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/manifest/nodes.py +0 -0
  165. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/manifest/overlays.py +0 -0
  166. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/manifest/store.py +0 -0
  167. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/manifest/sync_config.py +0 -0
  168. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/manifest/uv_config.py +0 -0
  169. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/merging/__init__.py +0 -0
  170. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/merging/atomic_executor.py +0 -0
  171. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/merging/merge_validator.py +0 -0
  172. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/civitai.py +0 -0
  173. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/comfyui_builtin_versions.py +0 -0
  174. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/commit.py +0 -0
  175. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/dependency_resolution.py +0 -0
  176. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/environment.py +0 -0
  177. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/git.py +0 -0
  178. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/lifecycle.py +0 -0
  179. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/materialization.py +0 -0
  180. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/merge_plan.py +0 -0
  181. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/model_scan.py +0 -0
  182. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/node_mapping.py +0 -0
  183. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/overlay.py +0 -0
  184. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/protocols.py +0 -0
  185. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/readiness.py +0 -0
  186. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/ref_diff.py +0 -0
  187. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/registry.py +0 -0
  188. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/runtime_config.py +0 -0
  189. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/sync.py +0 -0
  190. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/system.py +0 -0
  191. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/workflow_contract.py +0 -0
  192. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/models/workflow_execution.py +0 -0
  193. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/py.typed +0 -0
  194. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/readiness.py +0 -0
  195. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/repositories/__init__.py +0 -0
  196. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/repositories/comfyui_builtin_versions_repository.py +0 -0
  197. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/repositories/migrate_paths.py +0 -0
  198. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/repositories/model_repository.py +0 -0
  199. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/repositories/node_mappings_repository.py +0 -0
  200. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/repositories/workflow_repository.py +0 -0
  201. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/resolvers/__init__.py +0 -0
  202. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/resolvers/global_node_resolver.py +0 -0
  203. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/resolvers/model_resolver.py +0 -0
  204. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/__init__.py +0 -0
  205. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/dependency_resolution_preview.py +0 -0
  206. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/environment_lifecycle.py +0 -0
  207. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/huggingface_url.py +0 -0
  208. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/registry_data_manager.py +0 -0
  209. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_analysis_cache.py +0 -0
  210. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_analysis_service.py +0 -0
  211. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_file_store.py +0 -0
  212. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_input.py +0 -0
  213. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_manual_model_policy.py +0 -0
  214. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_model_dependency_service.py +0 -0
  215. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_model_path_policy.py +0 -0
  216. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_node_package_policy.py +0 -0
  217. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_resolution_context_builder.py +0 -0
  218. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_resolution_fixer.py +0 -0
  219. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_resolution_service.py +0 -0
  220. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/services/workflow_state_cleanup.py +0 -0
  221. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/strategies/__init__.py +0 -0
  222. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/strategies/auto.py +0 -0
  223. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/strategies/confirmation.py +0 -0
  224. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/__init__.py +0 -0
  225. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/builtin_extractor.py +0 -0
  226. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/common.py +0 -0
  227. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/conflict_analyzer.py +0 -0
  228. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/conflict_parser.py +0 -0
  229. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/dependency_parser.py +0 -0
  230. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/dependency_probe.py +0 -0
  231. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/download.py +0 -0
  232. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/environment_cleanup.py +0 -0
  233. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/environment_lock.py +0 -0
  234. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/folder_paths_extractor.py +0 -0
  235. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/input_signature.py +0 -0
  236. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/model_categories.py +0 -0
  237. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/model_loader_extractor.py +0 -0
  238. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/node_identity.py +0 -0
  239. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/provider_urls.py +0 -0
  240. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/pytorch.py +0 -0
  241. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/retry.py +0 -0
  242. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/symlink_utils.py +0 -0
  243. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/system_detector.py +0 -0
  244. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/toml_compat.py +0 -0
  245. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/uuid.py +0 -0
  246. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/uv_error_handler.py +0 -0
  247. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/version.py +0 -0
  248. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/utils/workflow_hash.py +0 -0
  249. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/validation/__init__.py +0 -0
  250. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/validation/resolution_tester.py +0 -0
  251. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/src/comfygit_core/workflow.py +0 -0
  252. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/README.md +0 -0
  253. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/caching/TEST_REDUCTION_SUMMARY.md +0 -0
  254. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/caching/__init__.py +0 -0
  255. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/caching/test_workflow_cache.py +0 -0
  256. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/caching/test_workflow_cache_context_hash.py +0 -0
  257. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/fixtures/models/test_models.json +0 -0
  258. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/fixtures/workflows/checkpoint_loader_with_missing_model.json +0 -0
  259. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/fixtures/workflows/kjnodes_workflow.json +0 -0
  260. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/fixtures/workflows/simple_txt2img.json +0 -0
  261. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/fixtures/workflows/with_custom_node.json +0 -0
  262. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/fixtures/workflows/with_missing_model.json +0 -0
  263. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/fixtures/workflows/workflow_with_duplicates.json +0 -0
  264. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/fixtures/workflows/workflow_with_properties.json +0 -0
  265. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/fixtures/workflows/workflow_without_properties.json +0 -0
  266. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/helpers/__init__.py +0 -0
  267. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/helpers/model_index_builder.py +0 -0
  268. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/helpers/pyproject_assertions.py +0 -0
  269. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/helpers/workflow_builder.py +0 -0
  270. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_atomic_semantic_merge.py +0 -0
  271. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_auto_model_index_sync.py +0 -0
  272. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_branch_workflow_preservation.py +0 -0
  273. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_cache_invalidation_on_model_deletion.py +0 -0
  274. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_cache_node_version_invalidation.py +0 -0
  275. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_checkout_b_with_modified_workflow.py +0 -0
  276. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_commit_git_changes.py +0 -0
  277. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_commit_git_changes_SUMMARY.md +0 -0
  278. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_commit_history.py +0 -0
  279. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_context_aware_node_resolution.py +0 -0
  280. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_custom_node_path_preservation.py +0 -0
  281. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_deferred_model_downloads.py +0 -0
  282. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_deleted_model_download_intent.py +0 -0
  283. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_dependency_group_removal.py +0 -0
  284. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_dev_node_git_references.py +0 -0
  285. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_dev_node_improvements.py +0 -0
  286. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_download_cleanup.py +0 -0
  287. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_download_intent_cache_invalidation.py +0 -0
  288. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_environment_basic.py +0 -0
  289. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_environment_branching.py +0 -0
  290. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_environment_create_progress.py +0 -0
  291. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_export_import.py +0 -0
  292. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_git_branching.py +0 -0
  293. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_git_import.py +0 -0
  294. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_git_pull_push.py +0 -0
  295. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_git_remote.py +0 -0
  296. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_git_subdirectory_import.py +0 -0
  297. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_import_auto_remote.py +0 -0
  298. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_import_preview.py +0 -0
  299. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_lifecycle_status.py +0 -0
  300. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_model_category_mismatch_detection.py +0 -0
  301. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_model_directory_switch.py +0 -0
  302. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_model_download_integration.py +0 -0
  303. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_model_index_mismatch_bug_SUMMARY.md +0 -0
  304. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_model_path_sync_detection.py +0 -0
  305. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_model_resolution_stale_directory.py +0 -0
  306. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_model_show_command.py +0 -0
  307. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_model_source_management.py +0 -0
  308. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_model_source_preservation.py +0 -0
  309. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_model_source_preservation_SUMMARY.md +0 -0
  310. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_model_source_removal.py +0 -0
  311. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_multiple_optional_group_failures.py +0 -0
  312. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_node_prune.py +0 -0
  313. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_node_version_replacement.py +0 -0
  314. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_opencv_conflict_resolution.py +0 -0
  315. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_optional_dependency_groups.py +0 -0
  316. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_overlay_e2e.py +0 -0
  317. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_overlay_git_integration.py +0 -0
  318. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_overlay_system_integration.py +0 -0
  319. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_package_config.py +0 -0
  320. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_pyproject_batch_writes.py +0 -0
  321. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_pytorch_reconfiguration.py +0 -0
  322. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_registry_git_fallback.py +0 -0
  323. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_registry_node_update_empty_download_url.py +0 -0
  324. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_repair_completion_marker.py +0 -0
  325. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_repair_model_download.py +0 -0
  326. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_repair_workflow.py +0 -0
  327. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_requirements_inline_comments_bug.py +0 -0
  328. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_runtime_restart_workflow_preservation.py +0 -0
  329. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_status_abstraction.py +0 -0
  330. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_status_uninstalled_nodes.py +0 -0
  331. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_workflow_cache_metadata_invalidation.py +0 -0
  332. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_workflow_caching_integration.py +0 -0
  333. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_workflow_commit_flow.py +0 -0
  334. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_workflow_deletion_cleanup.py +0 -0
  335. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_workflow_model_criticality_update.py +0 -0
  336. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_workflow_path_update_after_interactive_resolution.py +0 -0
  337. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_workflow_resolution_cleanup.py +0 -0
  338. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_workflow_resolution_pipeline.py +0 -0
  339. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_workflow_resolve_install.py +0 -0
  340. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/integration/test_workflow_subgraph_resolution.py +0 -0
  341. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/test_architecture_boundaries.py +0 -0
  342. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/analyzers/test_config_comparison.py +0 -0
  343. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/analyzers/test_custom_node_scanner.py +0 -0
  344. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/analyzers/test_node_git_analyzer.py +0 -0
  345. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/analyzers/test_ref_diff_analyzer.py +0 -0
  346. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/analyzers/test_status_scanner.py +0 -0
  347. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/analyzers/test_status_scanner_disabled_nodes.py +0 -0
  348. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/analyzers/test_status_scanner_package_sync.py +0 -0
  349. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/analyzers/test_workflow_dependency_parser.py +0 -0
  350. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/caching/test_cache_base.py +0 -0
  351. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/caching/test_workspace_relative_caching.py +0 -0
  352. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/clients/test_civitai_client.py +0 -0
  353. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/clients/test_civitai_parsing.py +0 -0
  354. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/clients/test_github_releases.py +0 -0
  355. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/configs/__init__.py +0 -0
  356. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/configs/test_package_config.py +0 -0
  357. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/core/test_environment_facades.py +0 -0
  358. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/core/test_environment_operation_locking.py +0 -0
  359. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/core/test_environment_run.py +0 -0
  360. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/core/test_environment_sync.py +0 -0
  361. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/core/test_environment_uninstalled_nodes.py +0 -0
  362. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/core/test_reserved_environment_names.py +0 -0
  363. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/core/test_sync_node_dependency_provisioning.py +0 -0
  364. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/core/test_workflow_contract_access.py +0 -0
  365. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/core/test_workspace_model_delete.py +0 -0
  366. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/factories/test_environment_factory_manager_install.py +0 -0
  367. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/lifecycle/test_comfyui_readiness.py +0 -0
  368. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_export_import_overlays.py +0 -0
  369. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_git_manager_gitignore.py +0 -0
  370. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_git_manager_log_refs.py +0 -0
  371. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_model_index_manager.py +0 -0
  372. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_model_short_hash.py +0 -0
  373. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_node_conflict_detection.py +0 -0
  374. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_overlay_fuzz.py +0 -0
  375. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_overlay_manager.py +0 -0
  376. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_overlay_materialization.py +0 -0
  377. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_pyproject_schema_version.py +0 -0
  378. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_pytorch_backend_manager.py +0 -0
  379. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_pytorch_overlay_materialization.py +0 -0
  380. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_pytorch_stripping.py +0 -0
  381. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_sqlite_manager.py +0 -0
  382. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_uv_no_build_isolation.py +0 -0
  383. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_workflow_node_cleanup.py +0 -0
  384. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/managers/test_workflow_status.py +0 -0
  385. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/merging/__init__.py +0 -0
  386. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/merging/test_atomic_executor.py +0 -0
  387. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/merging/test_merge_validator.py +0 -0
  388. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/merging/test_semantic_merger.py +0 -0
  389. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/models/test_comfyui_builtin_versions.py +0 -0
  390. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/models/test_lifecycle.py +0 -0
  391. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/models/test_overlay.py +0 -0
  392. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/models/test_ref_diff.py +0 -0
  393. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/models/test_workflow_contract.py +0 -0
  394. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/models/test_workflow_dependencies.py +0 -0
  395. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/models/test_workflow_roundtrip.py +0 -0
  396. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/resolvers/test_global_node_resolver_v2.py +0 -0
  397. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/resolvers/test_model_resolver.py +0 -0
  398. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_build_readiness.py +0 -0
  399. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_dependency_resolution_preview.py +0 -0
  400. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_environment_lifecycle.py +0 -0
  401. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_global_node_resolver.py +0 -0
  402. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_huggingface_url.py +0 -0
  403. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_import_analyzer.py +0 -0
  404. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_model_source_lookup.py +0 -0
  405. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_node_lookup_api_first.py +0 -0
  406. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_registry_data_manager.py +0 -0
  407. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_scan_requirements_substitution.py +0 -0
  408. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_workflow_analysis_cache.py +0 -0
  409. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_workflow_analysis_service.py +0 -0
  410. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_workflow_file_store.py +0 -0
  411. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_workflow_input.py +0 -0
  412. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_workflow_model_dependency_service.py +0 -0
  413. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_workflow_model_path_policy.py +0 -0
  414. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_workflow_resolution_context_builder.py +0 -0
  415. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_workflow_resolution_fixer.py +0 -0
  416. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_workflow_resolution_service.py +0 -0
  417. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/services/test_workflow_state_cleanup.py +0 -0
  418. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_add_dependencies_substitution.py +0 -0
  419. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_auto_strategies.py +0 -0
  420. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_builtin_extractor.py +0 -0
  421. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_dev_node_rename_detection.py +0 -0
  422. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_environment_py_dependencies.py +0 -0
  423. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_external_uv_cache.py +0 -0
  424. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_folder_paths_extractor.py +0 -0
  425. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_github_url_installation.py +0 -0
  426. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_headless_import.py +0 -0
  427. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_minimal_schema_compatibility.py +0 -0
  428. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_model_config_dynamic_loading.py +0 -0
  429. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_model_loader_extractor.py +0 -0
  430. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_model_repository_cleanup.py +0 -0
  431. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_model_symlink_manager.py +0 -0
  432. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_node_callbacks.py +0 -0
  433. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_node_conflict_context.py +0 -0
  434. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_node_mappings_repository.py +0 -0
  435. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_node_resolution_context.py +0 -0
  436. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_unified_node_search.py +0 -0
  437. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_user_content_symlink_manager.py +0 -0
  438. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_uv_error_handling.py +0 -0
  439. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_uv_error_parser.py +0 -0
  440. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_workflow_manager_deduplication.py +0 -0
  441. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/test_workspace_config_resilience.py +0 -0
  442. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/utils/test_conflict_analyzer.py +0 -0
  443. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/utils/test_conflict_parser.py +0 -0
  444. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/utils/test_dependency_parser.py +0 -0
  445. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/utils/test_dependency_probe.py +0 -0
  446. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/utils/test_input_signature.py +0 -0
  447. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/utils/test_node_identity.py +0 -0
  448. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/utils/test_pytorch.py +0 -0
  449. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/utils/test_requirements.py +0 -0
  450. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/utils/test_symlink_utils.py +0 -0
  451. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/utils/test_uuid.py +0 -0
  452. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/unit/utils/test_version.py +0 -0
  453. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/utils/__init__.py +0 -0
  454. {comfygit_core-0.6.0 → comfygit_core-0.7.0}/tests/utils/test_workflow_hash.py +0 -0
@@ -1,3 +1,25 @@
1
+ Metadata-Version: 2.5
2
+ Name: comfygit-core
3
+ Version: 0.7.0
4
+ Summary: ComfyGit Core - Git-based ComfyUI environment manager
5
+ Project-URL: Documentation, https://docs.comfygit.org/
6
+ Project-URL: Repository, https://github.com/comfygit-ai/comfygit
7
+ Project-URL: Issues, https://github.com/comfygit-ai/comfygit/issues
8
+ License-File: LICENSE.txt
9
+ Requires-Python: >=3.10
10
+ Requires-Dist: blake3>=0.3.3
11
+ Requires-Dist: huggingface-hub>=0.15.1
12
+ Requires-Dist: packaging>=16.2
13
+ Requires-Dist: requests>=2.32.4
14
+ Requires-Dist: requirements-parser>=0.11.0
15
+ Requires-Dist: tomli>=2.0.1; python_version < '3.11'
16
+ Requires-Dist: tomlkit>=0.11.0
17
+ Requires-Dist: uv>=0.11.15
18
+ Requires-Dist: xxhash>=2.0.0
19
+ Provides-Extra: keyring
20
+ Requires-Dist: keyring>=25.7.0; extra == 'keyring'
21
+ Description-Content-Type: text/markdown
22
+
1
23
  # ComfyGit Core
2
24
 
3
25
  Core library for programmatic ComfyUI environment and package management. Build custom tools, GUIs, web interfaces, or CI/CD integrations on top of ComfyGit's architecture.
@@ -466,3 +488,34 @@ dependencies = [
466
488
  "comfygit-core>=0.3.14,<0.4.0" # Pin to minor version
467
489
  ]
468
490
  ```
491
+
492
+ ## Credentials in headless applications
493
+
494
+ The base `comfygit-core` installation does not require `keyring`. Install
495
+ `comfygit-core[keyring]` when OS-backed credential persistence is wanted; the
496
+ normal `comfygit` CLI includes this extra. An unavailable package or OS backend
497
+ produces a structured error when saving credentials, never plaintext fallback.
498
+
499
+ `Workspace.open`, `create`, `from_path`, and `open_or_create` accept an optional
500
+ `credential_overrides` mapping keyed by `CredentialProvider`. A nonempty token
501
+ is process-local and takes priority over environment variables, workspace secure
502
+ storage and provider-native login. An explicit `None` requests anonymous
503
+ provider access; omitted providers follow the normal resolution chain. For
504
+ Hugging Face downloads and lookup, anonymous access disables the SDK's saved
505
+ login discovery too. External git helpers/SSH and URL-embedded authentication
506
+ remain the embedding application's responsibility.
507
+
508
+ ```python
509
+ from comfygit_core import Workspace
510
+ from comfygit_core.models import CredentialProvider
511
+
512
+ workspace = Workspace.open(
513
+ workspace_path,
514
+ credential_overrides={CredentialProvider.HUGGINGFACE: None},
515
+ )
516
+ ```
517
+
518
+ No login is required for local operations or public resources that allow
519
+ anonymous access. For authenticated access without keyring, set the appropriate
520
+ provider environment variable or use an existing Hugging Face login. Tokens
521
+ are never exported in environment manifests.
@@ -1,22 +1,3 @@
1
- Metadata-Version: 2.4
2
- Name: comfygit-core
3
- Version: 0.6.0
4
- Summary: ComfyGit Core - Git-based ComfyUI environment manager
5
- Project-URL: Documentation, https://docs.comfygit.org/
6
- Project-URL: Repository, https://github.com/comfygit-ai/comfygit
7
- Project-URL: Issues, https://github.com/comfygit-ai/comfygit/issues
8
- License-File: LICENSE.txt
9
- Requires-Python: >=3.10
10
- Requires-Dist: blake3>=0.3.3
11
- Requires-Dist: huggingface-hub>=0.11.0
12
- Requires-Dist: packaging>=16.2
13
- Requires-Dist: requests>=2.32.4
14
- Requires-Dist: requirements-parser>=0.11.0
15
- Requires-Dist: tomlkit>=0.11.0
16
- Requires-Dist: uv>=0.11.8
17
- Requires-Dist: xxhash>=2.0.0
18
- Description-Content-Type: text/markdown
19
-
20
1
  # ComfyGit Core
21
2
 
22
3
  Core library for programmatic ComfyUI environment and package management. Build custom tools, GUIs, web interfaces, or CI/CD integrations on top of ComfyGit's architecture.
@@ -485,3 +466,34 @@ dependencies = [
485
466
  "comfygit-core>=0.3.14,<0.4.0" # Pin to minor version
486
467
  ]
487
468
  ```
469
+
470
+ ## Credentials in headless applications
471
+
472
+ The base `comfygit-core` installation does not require `keyring`. Install
473
+ `comfygit-core[keyring]` when OS-backed credential persistence is wanted; the
474
+ normal `comfygit` CLI includes this extra. An unavailable package or OS backend
475
+ produces a structured error when saving credentials, never plaintext fallback.
476
+
477
+ `Workspace.open`, `create`, `from_path`, and `open_or_create` accept an optional
478
+ `credential_overrides` mapping keyed by `CredentialProvider`. A nonempty token
479
+ is process-local and takes priority over environment variables, workspace secure
480
+ storage and provider-native login. An explicit `None` requests anonymous
481
+ provider access; omitted providers follow the normal resolution chain. For
482
+ Hugging Face downloads and lookup, anonymous access disables the SDK's saved
483
+ login discovery too. External git helpers/SSH and URL-embedded authentication
484
+ remain the embedding application's responsibility.
485
+
486
+ ```python
487
+ from comfygit_core import Workspace
488
+ from comfygit_core.models import CredentialProvider
489
+
490
+ workspace = Workspace.open(
491
+ workspace_path,
492
+ credential_overrides={CredentialProvider.HUGGINGFACE: None},
493
+ )
494
+ ```
495
+
496
+ No login is required for local operations or public resources that allow
497
+ anonymous access. For authenticated access without keyring, set the appropriate
498
+ provider environment variable or use an existing Hugging Face login. Tokens
499
+ are never exported in environment manifests.
@@ -41,7 +41,7 @@ ComfyGit Core is a **library-first Python package** providing environment manage
41
41
  |--------|---------|--------------|
42
42
  | **core/** | Public API | Workspace (multi-env), Environment (single env) |
43
43
  | **models/** | Public typed contracts | Exported data classes, protocols, exceptions with context |
44
- | **readiness.py**, **workflow.py**, **runtime.py**, **assets.py**, **git.py** | Public facades | Reusable domain helpers promoted for adapters |
44
+ | **readiness.py**, **workflow.py**, **runtime.py**, **assets.py**, **git.py**, **security.py** | Public facades | Reusable domain helpers promoted for adapters |
45
45
  | **managers/** | Orchestration | Environment orchestrators (Git, Model), Resource managers (Node, Workflow, Model symlinks), Config managers (PyProject, UV, PyTorch backend) |
46
46
  | **manifest/** | Internal manifest abstraction | Pyproject-backed store, section handlers, edit helpers, overlay materialization, migration cleanup |
47
47
  | **analyzers/** | Analysis | Parse workflows/git/status; classify nodes |
@@ -79,6 +79,10 @@ ComfyGit Core is a **library-first Python package** providing environment manage
79
79
  - `Workspace.create()` - Create new workspace with validation
80
80
  - `Workspace.open_or_create()` - Setup-friendly load-or-create entry point
81
81
  - `Workspace.list_environments()` / `get_environment()` - List/get environments
82
+ - `Workspace.get_resource_inventory()` / `get_model_inventory()` - Typed model,
83
+ environment, source, and storage inventory for adapters
84
+ - `Workspace.plan_model_deletion()` / `apply_model_deletion_plan()` - Dry-run-first,
85
+ location-specific model reclaim with conservative blockers
82
86
  - `Workspace.get_schema_version()` / `is_legacy_schema()` - Check workspace version
83
87
  - `Workspace.upgrade_schema_if_needed()` - Migrate to current schema
84
88
 
@@ -1,20 +1,24 @@
1
1
  [project]
2
2
  name = "comfygit-core"
3
- version = "0.6.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
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
 
@@ -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
 
@@ -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(
@@ -93,6 +93,7 @@ PYPROJECT_SCHEMA_VERSION = 2
93
93
  DEFAULT_REGISTRY_URL = "https://api.comfy.org"
94
94
  DEFAULT_GITHUB_URL = "https://github.com"
95
95
  GITHUB_API_BASE = "https://api.github.com"
96
+ DEFAULT_COMFYUI_REPOSITORY = "https://github.com/Comfy-Org/ComfyUI.git"
96
97
 
97
98
  GITHUB_NODE_MAPPINGS_URL = "https://raw.githubusercontent.com/comfygit-ai/comfygit-registry-data/main/data/node_mappings.json"
98
99
  GITHUB_COMFYUI_BUILTINS_BY_VERSION_URL = "https://raw.githubusercontent.com/comfygit-ai/comfygit-registry-data/main/data/comfyui_builtins_by_version.json"
@@ -636,6 +636,31 @@ class Environment:
636
636
  missing_models=missing_models
637
637
  )
638
638
 
639
+ def _missing_required_materialized_nodes(self) -> list[str]:
640
+ """Return required manifest nodes absent from the ComfyUI checkout."""
641
+ scanner = StatusScanner(
642
+ comfyui_path=self.comfyui_path,
643
+ venv_path=self.venv_path,
644
+ uv=self.uv_manager,
645
+ pyproject=self.pyproject,
646
+ pytorch_manager=self.pytorch_manager,
647
+ )
648
+ comparison = scanner.get_full_comparison(check_package_sync=False)
649
+ missing = {
650
+ str(name).casefold()
651
+ for name in (
652
+ *comparison.missing_nodes,
653
+ *comparison.dev_nodes_missing,
654
+ )
655
+ }
656
+ required = []
657
+ for node in self.pyproject.nodes.get_existing().values():
658
+ if node.criticality == "optional":
659
+ continue
660
+ if node.name.casefold() in missing:
661
+ required.append(node.name)
662
+ return sorted(required, key=str.casefold)
663
+
639
664
  def get_lifecycle_status(
640
665
  self,
641
666
  *,
@@ -992,6 +1017,7 @@ class Environment:
992
1017
  overlay_names: list[str] | None = None,
993
1018
  extras: list[str] | None = None,
994
1019
  all_extras: bool = False,
1020
+ mark_complete: bool = True,
995
1021
  ) -> SyncResult:
996
1022
  """Apply changes: sync packages, nodes, workflows, and models with environment.
997
1023
 
@@ -1009,6 +1035,7 @@ class Environment:
1009
1035
  overlay_names: One-time overlay names for this sync call.
1010
1036
  extras: Optional list of extras to install
1011
1037
  all_extras: Install all optional extras
1038
+ mark_complete: False when import still has acquisition steps to finish.
1012
1039
 
1013
1040
  Returns:
1014
1041
  SyncResult with details of what was synced
@@ -1035,6 +1062,7 @@ class Environment:
1035
1062
  overlay_names=overlay_names,
1036
1063
  extras=extras,
1037
1064
  all_extras=all_extras,
1065
+ mark_complete=mark_complete,
1038
1066
  )
1039
1067
 
1040
1068
  # =====================================================
@@ -2992,8 +3020,12 @@ class Environment:
2992
3020
  ValueError: If ComfyUI already exists or .cec not properly initialized
2993
3021
  """
2994
3022
  from ..caching.comfyui_cache import ComfyUICacheManager, ComfyUISpec
2995
- from ..utils.comfyui_ops import clone_comfyui
2996
- from ..utils.git import git_rev_parse
3023
+ from ..utils.comfyui_ops import (
3024
+ clone_comfyui,
3025
+ normalize_comfyui_commit_sha,
3026
+ normalize_comfyui_repository,
3027
+ verify_comfyui_checkout,
3028
+ )
2997
3029
 
2998
3030
  logger.info(f"Finalizing import for environment: {self.name}")
2999
3031
 
@@ -3016,10 +3048,18 @@ class Environment:
3016
3048
  comfyui_manifest_version = self.pyproject.manifest.get_comfyui_version()
3017
3049
  comfyui_version = comfyui_manifest_version.version
3018
3050
  comfyui_version_type = comfyui_manifest_version.version_type
3051
+ comfyui_repository = normalize_comfyui_repository(
3052
+ comfyui_manifest_version.repository
3053
+ )
3054
+ comfyui_commit_sha = normalize_comfyui_commit_sha(
3055
+ comfyui_manifest_version.commit_sha
3056
+ )
3019
3057
  except Exception as e:
3020
3058
  logger.warning(f"Could not read comfyui_version from pyproject.toml: {e}")
3021
3059
  comfyui_version = None
3022
3060
  comfyui_version_type = None
3061
+ comfyui_repository = normalize_comfyui_repository(None)
3062
+ comfyui_commit_sha = None
3023
3063
 
3024
3064
  if comfyui_version:
3025
3065
  version_desc = f"{comfyui_version_type} {comfyui_version}" if comfyui_version_type else comfyui_version
@@ -3039,8 +3079,10 @@ class Environment:
3039
3079
  spec = ComfyUISpec(
3040
3080
  version=comfyui_version or "main",
3041
3081
  version_type=comfyui_version_type or "branch",
3042
- commit_sha=None
3082
+ commit_sha=comfyui_commit_sha,
3083
+ repository=comfyui_repository,
3043
3084
  )
3085
+ clone_ref = comfyui_commit_sha or comfyui_version
3044
3086
 
3045
3087
  # Check cache first
3046
3088
  cached_path = comfyui_cache.get_cached_comfyui(spec)
@@ -3050,14 +3092,35 @@ class Environment:
3050
3092
  callbacks.on_phase("restore_comfyui", f"Restoring ComfyUI {spec.version} from cache...")
3051
3093
  logger.info(f"Restoring ComfyUI {spec.version} from cache")
3052
3094
  shutil.copytree(cached_path, self.comfyui_path)
3095
+ actual_commit = verify_comfyui_checkout(
3096
+ self.comfyui_path,
3097
+ repository=comfyui_repository,
3098
+ commit_sha=comfyui_commit_sha,
3099
+ )
3100
+ logger.info(
3101
+ "Verified cached ComfyUI origin and commit %s",
3102
+ actual_commit[:12],
3103
+ )
3053
3104
  else:
3054
3105
  if callbacks:
3055
3106
  callbacks.on_phase("clone_comfyui", f"Cloning ComfyUI {spec.version}...")
3056
- logger.info(f"Cloning ComfyUI {spec.version}")
3057
- clone_comfyui(self.comfyui_path, comfyui_version)
3107
+ logger.info(
3108
+ "Cloning ComfyUI %s from %s",
3109
+ clone_ref or "default branch",
3110
+ comfyui_repository,
3111
+ )
3112
+ clone_comfyui(
3113
+ self.comfyui_path,
3114
+ clone_ref,
3115
+ repository=comfyui_repository,
3116
+ )
3058
3117
 
3059
3118
  # Cache the fresh clone
3060
- commit_sha = git_rev_parse(self.comfyui_path, "HEAD")
3119
+ commit_sha = verify_comfyui_checkout(
3120
+ self.comfyui_path,
3121
+ repository=comfyui_repository,
3122
+ commit_sha=comfyui_commit_sha,
3123
+ )
3061
3124
  if commit_sha:
3062
3125
  spec.commit_sha = commit_sha
3063
3126
  comfyui_cache.cache_comfyui(spec, self.comfyui_path)
@@ -3238,7 +3301,7 @@ class Environment:
3238
3301
  try:
3239
3302
  # During import, don't remove ComfyUI builtins (fresh clone has example files)
3240
3303
  # Enable verbose to show real-time uv output during dependency installation
3241
- sync_result = self.sync(remove_extra_nodes=False, sync_callbacks=callbacks, verbose=True)
3304
+ sync_result = self.sync(remove_extra_nodes=False, sync_callbacks=callbacks, verbose=True, mark_complete=False)
3242
3305
  if sync_result.success and sync_result.nodes_installed and callbacks:
3243
3306
  for node_name in sync_result.nodes_installed:
3244
3307
  callbacks.on_node_installed(node_name)
@@ -3248,6 +3311,13 @@ class Environment:
3248
3311
  if fail_on_sync_errors and not sync_result.success:
3249
3312
  error_text = "; ".join(sync_result.errors) if sync_result.errors else "unknown sync error"
3250
3313
  raise RuntimeError(f"Environment sync failed during materialization: {error_text}")
3314
+ if fail_on_sync_errors:
3315
+ missing_required_nodes = self._missing_required_materialized_nodes()
3316
+ if missing_required_nodes:
3317
+ raise RuntimeError(
3318
+ "Environment materialization is missing required custom nodes: "
3319
+ + ", ".join(missing_required_nodes)
3320
+ )
3251
3321
  except Exception as e:
3252
3322
  if callbacks:
3253
3323
  callbacks.on_error(f"Node sync failed: {e}")
@@ -3258,19 +3328,6 @@ class Environment:
3258
3328
  if callbacks:
3259
3329
  callbacks.on_phase("resolve_models", f"Resolving workflows ({model_strategy} strategy)...")
3260
3330
 
3261
- # Always prepare models to copy sources from global table, even for "skip"
3262
- # This ensures download intents are preserved for later resolution
3263
- workflows_with_intents = self.model_manager.prepare_import_with_model_strategy(model_strategy)
3264
-
3265
- # Only auto-resolve if not "skip" strategy
3266
- workflows_to_resolve = [] if model_strategy == "skip" else workflows_with_intents
3267
-
3268
- # prepare_import_with_model_strategy() may update pyproject model entries.
3269
- # Invalidate per-workflow cache entries so resolve_workflow() sees fresh
3270
- # download intents instead of stale session-cached resolutions.
3271
- for workflow_name in workflows_to_resolve:
3272
- self.workflow_cache.invalidate(self.name, workflow_name)
3273
-
3274
3331
  # Resolve workflows with download intents
3275
3332
  from ..models.workflow import BatchDownloadCallbacks
3276
3333
  from ..strategies.auto import AutoModelStrategy, AutoNodeStrategy
@@ -3288,8 +3345,30 @@ class Environment:
3288
3345
  on_batch_complete=callbacks.on_download_batch_complete
3289
3346
  )
3290
3347
 
3348
+ for download in self.model_manager.download_environment_models(model_strategy, download_callbacks):
3349
+ if not download.success:
3350
+ download_failures.append(("environment", download.filename))
3351
+
3352
+ # Always prepare models to copy sources from global table, even for "skip"
3353
+ # This ensures download intents are preserved for later resolution
3354
+ workflows_with_intents = self.model_manager.prepare_import_with_model_strategy(model_strategy)
3355
+
3356
+ # Only auto-resolve if not "skip" strategy
3357
+ workflows_to_resolve = [] if model_strategy == "skip" else workflows_with_intents
3358
+
3359
+ # prepare_import_with_model_strategy() may update pyproject model entries.
3360
+ # Invalidate per-workflow cache entries so resolve_workflow() sees fresh
3361
+ # download intents instead of stale session-cached resolutions.
3362
+ for workflow_name in workflows_to_resolve:
3363
+ self.workflow_cache.invalidate(self.name, workflow_name)
3364
+
3291
3365
  for workflow_name in workflows_to_resolve:
3292
3366
  try:
3367
+ manifest_downloads = self.workflow_manager.execute_manifest_downloads(
3368
+ workflow_name,
3369
+ self.pyproject.workflows.get_workflow_models(workflow_name),
3370
+ download_callbacks,
3371
+ )
3293
3372
  result = self.resolve_workflow(
3294
3373
  name=workflow_name,
3295
3374
  model_strategy=AutoModelStrategy(),
@@ -3298,10 +3377,11 @@ class Environment:
3298
3377
  )
3299
3378
 
3300
3379
  # Track successful vs failed downloads from actual download results
3301
- successful_downloads = sum(1 for dr in result.download_results if dr.success)
3380
+ all_downloads = [*manifest_downloads, *result.download_results]
3381
+ successful_downloads = sum(1 for dr in all_downloads if dr.success)
3302
3382
  failed_downloads = [
3303
3383
  (workflow_name, dr.filename)
3304
- for dr in result.download_results
3384
+ for dr in all_downloads
3305
3385
  if not dr.success
3306
3386
  ]
3307
3387
 
@@ -3311,6 +3391,7 @@ class Environment:
3311
3391
  callbacks.on_workflow_resolved(workflow_name, successful_downloads)
3312
3392
 
3313
3393
  except Exception as e:
3394
+ download_failures.append((workflow_name, str(e)))
3314
3395
  if callbacks:
3315
3396
  callbacks.on_error(f"Failed to resolve {workflow_name}: {e}")
3316
3397
 
@@ -3318,6 +3399,18 @@ class Environment:
3318
3399
  if download_failures and callbacks:
3319
3400
  callbacks.on_download_failures(download_failures)
3320
3401
 
3402
+ if download_failures and model_strategy != "skip":
3403
+ from ..models.exceptions import CDModelDownloadError
3404
+
3405
+ formatted_failures = ", ".join(
3406
+ f"{model_name} (from {workflow_name})"
3407
+ for workflow_name, model_name in download_failures
3408
+ )
3409
+ raise CDModelDownloadError(
3410
+ f"{len(download_failures)} model(s) failed to download: {formatted_failures}",
3411
+ failures=download_failures
3412
+ )
3413
+
3321
3414
  if no_manager:
3322
3415
  self._set_headless_marker()
3323
3416
 
@@ -3331,18 +3424,6 @@ class Environment:
3331
3424
  self.git_manager.commit_with_identity("Imported environment", add_all=True)
3332
3425
  logger.info("Committed import changes")
3333
3426
 
3334
- if download_failures and model_strategy != "skip":
3335
- from ..models.exceptions import CDModelDownloadError
3336
-
3337
- formatted_failures = ", ".join(
3338
- f"{model_name} (from {workflow_name})"
3339
- for workflow_name, model_name in download_failures
3340
- )
3341
- raise CDModelDownloadError(
3342
- f"{len(download_failures)} model(s) failed to download: {formatted_failures}",
3343
- failures=download_failures
3344
- )
3345
-
3346
3427
  logger.info("Import finalization completed successfully")
3347
3428
 
3348
3429
  def _strip_local_path_sources(self) -> None: