kanon-cli 3.0.0__tar.gz → 3.1.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 (1019) hide show
  1. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/CHANGELOG.md +65 -0
  2. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/PKG-INFO +5 -2
  3. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/README.md +4 -1
  4. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/cli/validate.md +3 -2
  5. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/integration-testing.md +7 -7
  6. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/list-and-add.md +5 -3
  7. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/lockfile.md +19 -14
  8. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/multi-source-guide.md +18 -6
  9. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/troubleshooting.md +23 -22
  10. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/url-canonicalization.md +0 -2
  11. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/pyproject.toml +3 -1
  12. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/__init__.py +1 -1
  13. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/commands/add.py +43 -19
  14. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/commands/catalog.py +2 -1
  15. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/commands/search.py +25 -13
  16. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/constants.py +1 -1
  17. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/install.py +106 -108
  18. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/kanonenv_writer.py +9 -3
  19. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/marketplace_validator.py +18 -13
  20. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/version.py +26 -0
  21. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/errors/README.md +1 -1
  22. kanon_cli-3.1.0/tests/fixtures/errors/conflict-detected.txt +5 -0
  23. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/help/kanon-add.txt +2 -1
  24. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_error_snapshots.py +18 -6
  25. kanon_cli-3.1.0/tests/integration/test_install_path_conflict_integration.py +349 -0
  26. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_cd.py +14 -8
  27. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_add.py +65 -15
  28. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_add_zero_tags.py +13 -8
  29. kanon_cli-3.1.0/tests/unit/test_install_conflict_detection.py +318 -0
  30. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_kanonenv_writer.py +4 -2
  31. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_marketplace_validator.py +4 -1
  32. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_search.py +29 -0
  33. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_version.py +30 -0
  34. kanon_cli-3.0.0/tests/fixtures/errors/conflict-detected.txt +0 -6
  35. kanon_cli-3.0.0/tests/integration/test_install_conflict_url_normalization.py +0 -426
  36. kanon_cli-3.0.0/tests/unit/test_install_conflict_detection.py +0 -356
  37. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.claude/settings.json +0 -0
  38. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.devcontainer/.devcontainer.postcreate.sh +0 -0
  39. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.devcontainer/VERSION +0 -0
  40. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.devcontainer/catalog-entry.json +0 -0
  41. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.devcontainer/devcontainer-functions.sh +0 -0
  42. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.devcontainer/devcontainer.json +0 -0
  43. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.devcontainer/fix-line-endings.py +0 -0
  44. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.devcontainer/nix-family-os/README.md +0 -0
  45. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.devcontainer/nix-family-os/tinyproxy-daemon.sh +0 -0
  46. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.devcontainer/nix-family-os/tinyproxy.conf.template +0 -0
  47. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.devcontainer/postcreate-wrapper.sh +0 -0
  48. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.devcontainer/project-setup.sh +0 -0
  49. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.devcontainer/wsl-family-os/README.md +0 -0
  50. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.devcontainer/wsl-family-os/tinyproxy-daemon.sh +0 -0
  51. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.devcontainer/wsl-family-os/tinyproxy.conf.template +0 -0
  52. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.github/CODEOWNERS +0 -0
  53. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.github/actions/setup-kanon/action.yml +0 -0
  54. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.github/workflows/codeql-analysis.yml +0 -0
  55. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.github/workflows/main-validation.yml +0 -0
  56. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.github/workflows/pr-validation.yml +0 -0
  57. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.github/workflows/publish.yml +0 -0
  58. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.gitignore +0 -0
  59. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.markdownlint.json +0 -0
  60. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.pre-commit-config.yaml +0 -0
  61. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.tool-versions +0 -0
  62. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.yamllint +0 -0
  63. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/CLAUDE.md +0 -0
  64. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/CONTRIBUTING.md +0 -0
  65. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/LICENSE +0 -0
  66. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/Makefile +0 -0
  67. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/architecture.md +0 -0
  68. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/catalog-author-guide.md +0 -0
  69. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/catalog-format-versioning.md +0 -0
  70. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/catalogs-explained.md +0 -0
  71. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/claude-marketplaces-guide.md +0 -0
  72. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/cli/catalog-audit.md +0 -0
  73. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/cli/doctor.md +0 -0
  74. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/cli-reference.md +0 -0
  75. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/cli.md +0 -0
  76. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/coming-from-pip-npm-cargo.md +0 -0
  77. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/configuration.md +0 -0
  78. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/contributing.md +0 -0
  79. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/creating-manifest-repos.md +0 -0
  80. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/creating-packages.md +0 -0
  81. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/doctor.md +0 -0
  82. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/exit-codes.md +0 -0
  83. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/git-auth-setup.md +0 -0
  84. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/how-it-works.md +0 -0
  85. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/installation.md +0 -0
  86. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/lifecycle.md +0 -0
  87. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/migrating-existing-kanon-files.md +0 -0
  88. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/migration-to-add.md +0 -0
  89. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/outdated-and-why.md +0 -0
  90. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/pipeline-integration.md +0 -0
  91. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/repo/README.md +0 -0
  92. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/repo/internal-fs-layout.md +0 -0
  93. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/repo/manifest-format.md +0 -0
  94. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/repo/python-support.md +0 -0
  95. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/repo/repo-hooks.md +0 -0
  96. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/repo/smart-sync.md +0 -0
  97. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/repo/windows.md +0 -0
  98. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/security-model.md +0 -0
  99. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/setup-guide.md +0 -0
  100. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/shell-completion.md +0 -0
  101. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/test-coverage.md +0 -0
  102. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/testing/matrix-traceability.md +0 -0
  103. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/version-resolution.md +0 -0
  104. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/git-hooks/pre-commit +0 -0
  105. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/git-hooks/pre-push +0 -0
  106. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/link +0 -0
  107. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/requirements-dev.txt +0 -0
  108. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/requirements.txt +0 -0
  109. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/scripts/check_archive_no_duplicates.py +0 -0
  110. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/__main__.py +0 -0
  111. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/cli.py +0 -0
  112. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/commands/__init__.py +0 -0
  113. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/commands/clean.py +0 -0
  114. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/commands/completion.py +0 -0
  115. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/commands/doctor.py +0 -0
  116. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/commands/install.py +0 -0
  117. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/commands/marketplace.py +0 -0
  118. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/commands/outdated.py +0 -0
  119. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/commands/remove.py +0 -0
  120. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/commands/repo.py +0 -0
  121. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/commands/validate.py +0 -0
  122. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/commands/why.py +0 -0
  123. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/completions/__init__.py +0 -0
  124. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/completions/cache.py +0 -0
  125. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/completions/cached_catalogs.py +0 -0
  126. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/completions/catalog_entries.py +0 -0
  127. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/completions/catalog_versions.py +0 -0
  128. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/completions/lockfile_names.py +0 -0
  129. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/completions/midtoken.py +0 -0
  130. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/completions/pep440_filter.py +0 -0
  131. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/completions/powershell.py +0 -0
  132. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/completions/preamble.py +0 -0
  133. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/completions/project_versions.py +0 -0
  134. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/completions/sanitize.py +0 -0
  135. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/completions/source_names.py +0 -0
  136. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/__init__.py +0 -0
  137. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/catalog.py +0 -0
  138. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/clean.py +0 -0
  139. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/cli_args.py +0 -0
  140. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/discover.py +0 -0
  141. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/git_runner.py +0 -0
  142. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/include_walker.py +0 -0
  143. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/kanon_hash.py +0 -0
  144. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/kanonenv.py +0 -0
  145. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/lockfile.py +0 -0
  146. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/manifest.py +0 -0
  147. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/manifest_vars.py +0 -0
  148. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/marketplace.py +0 -0
  149. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/metadata.py +0 -0
  150. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/remote_url.py +0 -0
  151. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/update_check.py +0 -0
  152. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/url.py +0 -0
  153. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/xml_validator.py +0 -0
  154. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/__init__.py +0 -0
  155. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/color.py +0 -0
  156. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/command.py +0 -0
  157. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/editor.py +0 -0
  158. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/error.py +0 -0
  159. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/event_log.py +0 -0
  160. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/fetch.py +0 -0
  161. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/git_command.py +0 -0
  162. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/git_config.py +0 -0
  163. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/git_refs.py +0 -0
  164. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/git_ssh +0 -0
  165. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/git_superproject.py +0 -0
  166. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/git_trace2_event_log.py +0 -0
  167. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/git_trace2_event_log_base.py +0 -0
  168. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/hooks/commit-msg +0 -0
  169. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/hooks/pre-auto-gc +0 -0
  170. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/hooks.py +0 -0
  171. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/main.py +0 -0
  172. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/manifest_xml.py +0 -0
  173. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/pager.py +0 -0
  174. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/platform_utils.py +0 -0
  175. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/platform_utils_win32.py +0 -0
  176. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/progress.py +0 -0
  177. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/project.py +0 -0
  178. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/repo +0 -0
  179. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/repo_logging.py +0 -0
  180. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/repo_trace.py +0 -0
  181. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/requirements.jsonc +0 -0
  182. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/ssh.py +0 -0
  183. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/__init__.py +0 -0
  184. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/abandon.py +0 -0
  185. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/branches.py +0 -0
  186. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/checkout.py +0 -0
  187. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/cherry_pick.py +0 -0
  188. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/diff.py +0 -0
  189. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/diffmanifests.py +0 -0
  190. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/download.py +0 -0
  191. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/envsubst.py +0 -0
  192. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/forall.py +0 -0
  193. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/gc.py +0 -0
  194. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/grep.py +0 -0
  195. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/help.py +0 -0
  196. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/info.py +0 -0
  197. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/init.py +0 -0
  198. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/list.py +0 -0
  199. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/manifest.py +0 -0
  200. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/overview.py +0 -0
  201. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/prune.py +0 -0
  202. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/rebase.py +0 -0
  203. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/selfupdate.py +0 -0
  204. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/smartsync.py +0 -0
  205. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/stage.py +0 -0
  206. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/start.py +0 -0
  207. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/status.py +0 -0
  208. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/sync.py +0 -0
  209. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/upload.py +0 -0
  210. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/version_constraints.py +0 -0
  211. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/wrapper.py +0 -0
  212. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/utils/__init__.py +0 -0
  213. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/utils/concurrency.py +0 -0
  214. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/utils/levenshtein.py +0 -0
  215. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/utils/lock_file_path.py +0 -0
  216. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/utils/spawn.py +0 -0
  217. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/__init__.py +0 -0
  218. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/conftest.py +0 -0
  219. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/catalog/broken-soft-spot-1/repo-specs/duplicate-child-marketplace.xml +0 -0
  220. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/catalog/broken-soft-spot-1/repo-specs/missing-recommended-marketplace.xml +0 -0
  221. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/catalog/broken-soft-spot-1/repo-specs/missing-required-marketplace.xml +0 -0
  222. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/catalog/broken-soft-spot-1/repo-specs/multiple-blocks-marketplace.xml +0 -0
  223. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/catalog/broken-soft-spot-2/repo-specs/dotted-name-marketplace.xml +0 -0
  224. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/catalog/broken-soft-spot-2/repo-specs/hyphenated-name-marketplace.xml +0 -0
  225. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/catalog/broken-soft-spot-2/repo-specs/uppercase-name-marketplace.xml +0 -0
  226. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/catalog/broken-soft-spot-3/repo-specs/group-a-1-marketplace.xml +0 -0
  227. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/catalog/broken-soft-spot-3/repo-specs/group-a-2-marketplace.xml +0 -0
  228. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/catalog/broken-soft-spot-3/repo-specs/group-b-1-marketplace.xml +0 -0
  229. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/catalog/broken-soft-spot-3/repo-specs/group-b-2-marketplace.xml +0 -0
  230. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/catalog/broken-soft-spot-4/repo-specs/file-url-marketplace.xml +0 -0
  231. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/catalog/broken-soft-spot-4/repo-specs/query-string-marketplace.xml +0 -0
  232. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/catalog/broken-soft-spot-4/repo-specs/unresolvable-marketplace.xml +0 -0
  233. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/catalog/legacy-catalog-dir/catalog/sample-entry/.kanon +0 -0
  234. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/catalog/legacy-catalog-dir/repo-specs/sample.xml +0 -0
  235. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/catalogs/zero-pep440-tags/README.md +0 -0
  236. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/catalogs/zero-pep440-tags/repo-specs/entry-a/entry-a-marketplace.xml +0 -0
  237. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/completion/__init__.py +0 -0
  238. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/completion/expected-bash.sh +0 -0
  239. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/completion/expected-powershell.ps1 +0 -0
  240. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/completion/expected-zsh.sh +0 -0
  241. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/errors/entry-not-found.txt +0 -0
  242. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/errors/lockfile-hash-mismatch.txt +0 -0
  243. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/errors/lockfile-sha-unreachable.txt +0 -0
  244. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/errors/missing-catalog-source.txt +0 -0
  245. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/errors/missing-required-metadata-field.txt +0 -0
  246. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/errors/source-collision.txt +0 -0
  247. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/errors/zero-pep440-tags-under-prefix.txt +0 -0
  248. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/help/README.md +0 -0
  249. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/help/kanon-catalog-audit.txt +0 -0
  250. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/help/kanon-catalog.txt +0 -0
  251. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/help/kanon-clean.txt +0 -0
  252. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/help/kanon-completion.txt +0 -0
  253. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/help/kanon-doctor.txt +0 -0
  254. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/help/kanon-install.txt +0 -0
  255. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/help/kanon-marketplace.txt +0 -0
  256. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/help/kanon-outdated.txt +0 -0
  257. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/help/kanon-remove.txt +0 -0
  258. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/help/kanon-search.txt +0 -0
  259. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/help/kanon-toplevel.txt +0 -0
  260. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/help/kanon-why.txt +0 -0
  261. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/repo/.gitignore +0 -0
  262. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/repo/README.md +0 -0
  263. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/repo/linter-test-bad.invalid-yaml +0 -0
  264. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/repo/linter-test-bad.md +0 -0
  265. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/repo/linter-test-bad.py +0 -0
  266. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/repo/sample-manifest.xml +0 -0
  267. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/repo/sample-project-config.json +0 -0
  268. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/repo/test.gitconfig +0 -0
  269. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/repo/version_constraints_data.json +0 -0
  270. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/__init__.py +0 -0
  271. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/conftest.py +0 -0
  272. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_add_alias_journey.py +0 -0
  273. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_alias_consumer_journey.py +0 -0
  274. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_argparse_errors.py +0 -0
  275. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_argparse_help.py +0 -0
  276. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_ci_runs_operator_path_tests.py +0 -0
  277. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_clean_lifecycle.py +0 -0
  278. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_cli_entry_point.py +0 -0
  279. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_completion_snapshots.py +0 -0
  280. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_default_branch_journey.py +0 -0
  281. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_env_int_guard_journey.py +0 -0
  282. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_exit_code_matrix.py +0 -0
  283. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_groups_filter.py +0 -0
  284. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_help_snapshots.py +0 -0
  285. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_help_text_contract.py +0 -0
  286. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_home_flag_unwritable_journey.py +0 -0
  287. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_init_default_branch_prerequisite_journey.py +0 -0
  288. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_install_hermetic_journey.py +0 -0
  289. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_install_lifecycle.py +0 -0
  290. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_install_real_kanon.py +0 -0
  291. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_install_v3_lock_fail_fast_journey.py +0 -0
  292. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_kanon_home_store_journey.py +0 -0
  293. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_kanon_repo_cli.py +0 -0
  294. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_kanon_repo_e2e.py +0 -0
  295. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_kanon_repo_lifecycle_journey.py +0 -0
  296. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_lifecycle_journey.py +0 -0
  297. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_make_operator_path_targets.py +0 -0
  298. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_marketplace_journey.py +0 -0
  299. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_matrix_traceability_complete.py +0 -0
  300. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_provider_agnostic.py +0 -0
  301. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_abandon_errors.py +0 -0
  302. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_abandon_flags.py +0 -0
  303. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_abandon_happy.py +0 -0
  304. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_branches_errors.py +0 -0
  305. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_branches_flags.py +0 -0
  306. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_branches_happy.py +0 -0
  307. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_checkout_errors.py +0 -0
  308. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_checkout_flags.py +0 -0
  309. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_checkout_happy.py +0 -0
  310. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_cherry_pick_errors.py +0 -0
  311. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_cherry_pick_flags.py +0 -0
  312. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_cherry_pick_happy.py +0 -0
  313. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_diff_errors.py +0 -0
  314. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_diff_flags.py +0 -0
  315. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_diff_happy.py +0 -0
  316. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_diffmanifests_errors.py +0 -0
  317. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_diffmanifests_flags.py +0 -0
  318. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_diffmanifests_happy.py +0 -0
  319. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_dir_override.py +0 -0
  320. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_download_errors.py +0 -0
  321. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_download_flags.py +0 -0
  322. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_download_happy.py +0 -0
  323. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_envsubst_errors.py +0 -0
  324. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_envsubst_flags.py +0 -0
  325. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_envsubst_happy.py +0 -0
  326. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_exit_codes.py +0 -0
  327. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_forall_errors.py +0 -0
  328. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_forall_flags.py +0 -0
  329. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_forall_happy.py +0 -0
  330. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_gc_errors.py +0 -0
  331. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_gc_flags.py +0 -0
  332. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_gc_happy.py +0 -0
  333. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_grep_errors.py +0 -0
  334. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_grep_flags.py +0 -0
  335. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_grep_happy.py +0 -0
  336. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_help_errors.py +0 -0
  337. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_help_flags.py +0 -0
  338. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_help_happy.py +0 -0
  339. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_info_errors.py +0 -0
  340. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_info_flags.py +0 -0
  341. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_info_happy.py +0 -0
  342. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_init_errors.py +0 -0
  343. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_init_flags.py +0 -0
  344. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_init_happy.py +0 -0
  345. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_init_mirror.py +0 -0
  346. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_list_errors.py +0 -0
  347. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_list_flags.py +0 -0
  348. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_list_happy.py +0 -0
  349. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_manifest_errors.py +0 -0
  350. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_manifest_flags.py +0 -0
  351. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_manifest_happy.py +0 -0
  352. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_manifest_revision_as_tag.py +0 -0
  353. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_overview_errors.py +0 -0
  354. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_overview_flags.py +0 -0
  355. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_overview_happy.py +0 -0
  356. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_passthrough.py +0 -0
  357. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_prune_errors.py +0 -0
  358. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_prune_flags.py +0 -0
  359. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_prune_happy.py +0 -0
  360. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_rebase_errors.py +0 -0
  361. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_rebase_flags.py +0 -0
  362. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_rebase_happy.py +0 -0
  363. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_selfupdate_disabled.py +0 -0
  364. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_selfupdate_errors.py +0 -0
  365. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_selfupdate_flags.py +0 -0
  366. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_selfupdate_happy.py +0 -0
  367. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_smartsync_errors.py +0 -0
  368. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_smartsync_flags.py +0 -0
  369. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_smartsync_happy.py +0 -0
  370. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_stage_errors.py +0 -0
  371. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_stage_flags.py +0 -0
  372. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_stage_happy.py +0 -0
  373. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_start_errors.py +0 -0
  374. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_start_flags.py +0 -0
  375. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_start_happy.py +0 -0
  376. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_status_errors.py +0 -0
  377. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_status_flags.py +0 -0
  378. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_status_happy.py +0 -0
  379. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_sync_errors.py +0 -0
  380. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_sync_flags.py +0 -0
  381. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_sync_happy.py +0 -0
  382. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_upload_errors.py +0 -0
  383. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_upload_flags.py +0 -0
  384. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_upload_happy.py +0 -0
  385. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_singular_catalog_source_inert.py +0 -0
  386. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_stdout_stderr_discipline.py +0 -0
  387. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_update_alert_journey.py +0 -0
  388. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_validate_journey.py +0 -0
  389. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_validate_lifecycle.py +0 -0
  390. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_validate_lockfile.py +0 -0
  391. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_validate_marketplace.py +0 -0
  392. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_validate_xml_errors.py +0 -0
  393. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_validate_xml_repo_root.py +0 -0
  394. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_zero_source_clean_error.py +0 -0
  395. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/__init__.py +0 -0
  396. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/conftest.py +0 -0
  397. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/fixtures/__init__.py +0 -0
  398. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/fixtures/synthetic/__init__.py +0 -0
  399. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/fixtures/synthetic/conftest.py +0 -0
  400. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/fixtures/synthetic/drift.py +0 -0
  401. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/fixtures/synthetic/test_synthetic_pytest_fixtures.py +0 -0
  402. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/fixtures/synthetic/upgrade_versioned.py +0 -0
  403. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/provider_allowlist.txt +0 -0
  404. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/__init__.py +0 -0
  405. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/conftest.py +0 -0
  406. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_bug_fixes.py +0 -0
  407. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_consolidated_constraints_e2e.py +0 -0
  408. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_envsubst_integration.py +0 -0
  409. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_import_functional.py +0 -0
  410. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_linkfile_copyfile.py +0 -0
  411. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_linkfile_exclude_journey.py +0 -0
  412. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_manifest_parsing.py +0 -0
  413. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_process_isolation.py +0 -0
  414. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_repo_module_smoke.py +0 -0
  415. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_repo_pipeline.py +0 -0
  416. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_repo_run_lifecycle.py +0 -0
  417. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_repo_sync_lifecycle.py +0 -0
  418. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_version_constraints_integration.py +0 -0
  419. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_xml_annotation_roundtrip.py +0 -0
  420. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_xml_contactinfo_roundtrip.py +0 -0
  421. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_xml_copyfile_roundtrip.py +0 -0
  422. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_xml_default_roundtrip.py +0 -0
  423. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_xml_extend_project_roundtrip.py +0 -0
  424. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_xml_include_roundtrip.py +0 -0
  425. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_xml_linkfile_roundtrip.py +0 -0
  426. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_xml_manifest_roundtrip.py +0 -0
  427. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_xml_manifest_server_roundtrip.py +0 -0
  428. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_xml_notice_roundtrip.py +0 -0
  429. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_xml_project_roundtrip.py +0 -0
  430. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_xml_remote_roundtrip.py +0 -0
  431. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_xml_remove_project_roundtrip.py +0 -0
  432. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_xml_repo_hooks_roundtrip.py +0 -0
  433. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_xml_submanifest_roundtrip.py +0 -0
  434. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_xml_superproject_roundtrip.py +0 -0
  435. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_add_core.py +0 -0
  436. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_add_dry_run.py +0 -0
  437. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_add_env_var_detection.py +0 -0
  438. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_add_zero_tags.py +0 -0
  439. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_auto_discovery.py +0 -0
  440. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_background_refresh.py +0 -0
  441. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_cache_clock_skew.py +0 -0
  442. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_cache_layout.py +0 -0
  443. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_catalog_audit_entry_uniqueness.py +0 -0
  444. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_catalog_audit_framework.py +0 -0
  445. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_catalog_audit_legacy_dir.py +0 -0
  446. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_catalog_audit_metadata.py +0 -0
  447. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_catalog_audit_remote_url.py +0 -0
  448. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_catalog_audit_source_name.py +0 -0
  449. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_catalog_audit_strict.py +0 -0
  450. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_catalog_audit_tag_format.py +0 -0
  451. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_catalog_constraints.py +0 -0
  452. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_ci_validation.py +0 -0
  453. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_clean_env_override_cleanup.py +0 -0
  454. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_clean_lifecycle.py +0 -0
  455. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_clean_paths.py +0 -0
  456. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_cli_entry_points.py +0 -0
  457. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_complete_cached_catalogs.py +0 -0
  458. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_complete_catalog_entries.py +0 -0
  459. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_complete_catalog_versions.py +0 -0
  460. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_complete_lockfile_names.py +0 -0
  461. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_complete_project_versions.py +0 -0
  462. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_complete_source_names.py +0 -0
  463. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_completion_bash.py +0 -0
  464. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_completion_powershell_subcommand.py +0 -0
  465. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_completion_subcommand.py +0 -0
  466. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_completion_zsh.py +0 -0
  467. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_concurrency.py +0 -0
  468. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_concurrency_serialization.py +0 -0
  469. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_copyfile_fs_effects.py +0 -0
  470. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_cross_platform_contract.py +0 -0
  471. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_doc_validation.py +0 -0
  472. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_doctor_cache_flags.py +0 -0
  473. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_doctor_cache_flags_workspace_independent.py +0 -0
  474. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_doctor_consistency.py +0 -0
  475. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_doctor_default_subcheck_output.py +0 -0
  476. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_doctor_effective_source.py +0 -0
  477. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_doctor_prune_cache.py +0 -0
  478. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_doctor_remote_check.py +0 -0
  479. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_envsubst_command.py +0 -0
  480. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_fs_fault_extended.py +0 -0
  481. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_fs_fault_injection.py +0 -0
  482. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_full_lifecycle_synthetic.py +0 -0
  483. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_full_user_journey.py +0 -0
  484. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_git_fault_injection.py +0 -0
  485. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_git_retry_env.py +0 -0
  486. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_gitignore_idempotency.py +0 -0
  487. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_home_flag_store_relocation.py +0 -0
  488. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_install_after_add.py +0 -0
  489. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_install_command.py +0 -0
  490. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_install_env_var_resolution.py +0 -0
  491. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_install_errors.py +0 -0
  492. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_install_include_cycle.py +0 -0
  493. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_install_include_diamond.py +0 -0
  494. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_install_lifecycle.py +0 -0
  495. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_install_lock_file_derivation.py +0 -0
  496. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_install_lockfile_replay.py +0 -0
  497. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_install_marketplace_registration.py +0 -0
  498. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_install_no_kanon_remediation.py +0 -0
  499. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_install_optional_vars.py +0 -0
  500. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_install_paths.py +0 -0
  501. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_install_per_alias_gitbase.py +0 -0
  502. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_install_reconcile.py +0 -0
  503. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_install_refresh_lock.py +0 -0
  504. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_install_refresh_lock_source.py +0 -0
  505. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_install_remote_url_policy.py +0 -0
  506. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_install_required_vars.py +0 -0
  507. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_install_strict.py +0 -0
  508. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_json_output_stream_discipline.py +0 -0
  509. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_kanon_add_placeholder_handling.py +0 -0
  510. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_kanon_clean_embedded.py +0 -0
  511. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_kanon_full_lifecycle.py +0 -0
  512. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_kanon_install_embedded.py +0 -0
  513. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_kanonenv_parsing.py +0 -0
  514. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_lifecycle_recovery.py +0 -0
  515. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_linkfile_fs_effects.py +0 -0
  516. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_list_all_versions.py +0 -0
  517. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_list_all_versions_canonical.py +0 -0
  518. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_list_all_versions_malformed_revision_resilience.py +0 -0
  519. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_list_default.py +0 -0
  520. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_list_detail.py +0 -0
  521. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_list_filter.py +0 -0
  522. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_list_format_json.py +0 -0
  523. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_list_synthetic_catalog_variants.py +0 -0
  524. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_list_tree.py +0 -0
  525. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_lockfile_roundtrip.py +0 -0
  526. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_marketplace_install.py +0 -0
  527. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_marketplace_lifecycle.py +0 -0
  528. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_marketplace_orphan_prune.py +0 -0
  529. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_midtoken_bash.py +0 -0
  530. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_midtoken_zsh.py +0 -0
  531. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_misc_features.py +0 -0
  532. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_multi_source_aggregation.py +0 -0
  533. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_no_bundled_catalog.py +0 -0
  534. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_no_default_catalog.py +0 -0
  535. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_no_hardcoded_org_values.py +0 -0
  536. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_observability.py +0 -0
  537. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_outdated.py +0 -0
  538. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_outdated_branch_drift.py +0 -0
  539. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_outdated_fail_on_upgrade.py +0 -0
  540. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_outdated_format_json.py +0 -0
  541. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_outdated_refs_tags_revision_parsing.py +0 -0
  542. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_platform_parity.py +0 -0
  543. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_preamble_bash.py +0 -0
  544. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_preamble_zsh.py +0 -0
  545. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_remove_core.py +0 -0
  546. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_remove_dry_run.py +0 -0
  547. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_remove_force_integration.py +0 -0
  548. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_signal_handling.py +0 -0
  549. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_synthetic_drift_fixture.py +0 -0
  550. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_synthetic_upgrade_versioned_fixture.py +0 -0
  551. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_unicode_encoding.py +0 -0
  552. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_validate_marketplace.py +0 -0
  553. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_validate_marketplace_revision_existence.py +0 -0
  554. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_validate_metadata.py +0 -0
  555. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_validate_xml.py +0 -0
  556. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_version_resolution.py +0 -0
  557. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_version_widened_bare_pep440.py +0 -0
  558. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_wheel_e2e.py +0 -0
  559. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_why_ambiguous.py +0 -0
  560. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_why_chain_walker.py +0 -0
  561. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_why_format_json.py +0 -0
  562. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_why_live_resolve.py +0 -0
  563. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_why_not_found_suggestion.py +0 -0
  564. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_workspace_dir_env.py +0 -0
  565. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/regression/test_e0_f1_s2_t5_regression.py +0 -0
  566. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/regression/test_e0_f5_s2_t7_regression.py +0 -0
  567. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/regression/test_e0_f6_s1_t1_regression.py +0 -0
  568. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/regression/test_e0_f6_s1_t2_regression.py +0 -0
  569. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/regression/test_e0_f6_s1_t3_regression.py +0 -0
  570. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/regression/test_e0_f6_s1_t4_regression.py +0 -0
  571. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/regression/test_e0_f6_s2_t1_regression.py +0 -0
  572. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/regression/test_e0_f6_s2_t2_regression.py +0 -0
  573. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/regression/test_e0_f6_s2_t3_regression.py +0 -0
  574. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/regression/test_e0_f6_s2_t4_regression.py +0 -0
  575. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/regression/test_e0_f6_s2_t5_regression.py +0 -0
  576. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/regression/test_e0_f6_s2_t6_regression.py +0 -0
  577. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/regression/test_e0_f6_s3_t1_regression.py +0 -0
  578. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/regression/test_e0_f6_s3_t2_regression.py +0 -0
  579. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/regression/test_e0_install_relative_regression.py +0 -0
  580. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/__init__.py +0 -0
  581. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/_rp_helpers.py +0 -0
  582. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/conftest.py +0 -0
  583. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_ad.py +0 -0
  584. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_bs.py +0 -0
  585. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_content_pins.py +0 -0
  586. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_cs.py +0 -0
  587. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_doctor_cache.py +0 -0
  588. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_doctor_journey.py +0 -0
  589. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_ec.py +0 -0
  590. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_ep.py +0 -0
  591. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_ev.py +0 -0
  592. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_hv.py +0 -0
  593. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_ic.py +0 -0
  594. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_id.py +0 -0
  595. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_ks.py +0 -0
  596. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_lf.py +0 -0
  597. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_lockfile_lifecycle.py +0 -0
  598. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_marketplace_direct_checkout.py +0 -0
  599. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_mk.py +0 -0
  600. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_ms.py +0 -0
  601. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_ns_marketplace_and_global_flags.py +0 -0
  602. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_outdated_two_source.py +0 -0
  603. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_pk.py +0 -0
  604. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rc.py +0 -0
  605. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_refresh_lock_existing_checkout.py +0 -0
  606. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rls_exact_vs_range.py +0 -0
  607. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_abandon.py +0 -0
  608. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_branches.py +0 -0
  609. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_checkout.py +0 -0
  610. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_cherry_pick.py +0 -0
  611. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_diff.py +0 -0
  612. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_diffmanifests.py +0 -0
  613. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_download.py +0 -0
  614. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_envsubst.py +0 -0
  615. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_forall.py +0 -0
  616. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_gc.py +0 -0
  617. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_grep.py +0 -0
  618. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_help.py +0 -0
  619. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_info.py +0 -0
  620. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_init.py +0 -0
  621. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_list.py +0 -0
  622. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_manifest.py +0 -0
  623. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_overview.py +0 -0
  624. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_prune.py +0 -0
  625. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_rebase.py +0 -0
  626. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_smartsync.py +0 -0
  627. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_stage.py +0 -0
  628. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_start.py +0 -0
  629. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_status.py +0 -0
  630. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_sync.py +0 -0
  631. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_upload.py +0 -0
  632. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_wrap.py +0 -0
  633. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rx.py +0 -0
  634. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_scenario_coverage_meta.py +0 -0
  635. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_search_multi_source.py +0 -0
  636. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_tc_bootstrap.py +0 -0
  637. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_tc_clean.py +0 -0
  638. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_tc_install.py +0 -0
  639. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_tc_validate.py +0 -0
  640. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_uj.py +0 -0
  641. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_va.py +0 -0
  642. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_va_validate_lockfile.py +0 -0
  643. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_why_surface_query.py +0 -0
  644. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_why_url_path.py +0 -0
  645. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_why_url_path_placeholder.py +0 -0
  646. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/security/__init__.py +0 -0
  647. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/security/test_security_hardening.py +0 -0
  648. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/test_wheel_layout.py +0 -0
  649. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/__init__.py +0 -0
  650. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/commands/test_repo_dir_resolution.py +0 -0
  651. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/conftest.py +0 -0
  652. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/__init__.py +0 -0
  653. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/conftest.py +0 -0
  654. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/fixtures/.gitignore +0 -0
  655. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/fixtures/README.md +0 -0
  656. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/fixtures/sample-manifest.xml +0 -0
  657. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/fixtures/sample-project-config.json +0 -0
  658. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/fixtures/test.gitconfig +0 -0
  659. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/fixtures/version_constraints_data.json +0 -0
  660. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/functional/__init__.py +0 -0
  661. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/functional/test_features.py +0 -0
  662. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/subcmds/__init__.py +0 -0
  663. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/subcmds/test_init_mirror.py +0 -0
  664. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/subcmds/test_manifest_revision_as_tag.py +0 -0
  665. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/subcmds/test_manifest_revision_as_tag_pep440.py +0 -0
  666. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/subcmds/test_selfupdate_stub.py +0 -0
  667. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_abandon_massive.py +0 -0
  668. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_branches_coverage.py +0 -0
  669. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_bug10_selfupdate_incompatible.py +0 -0
  670. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_bug11_race_condition.py +0 -0
  671. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_bug12_backup_preserved.py +0 -0
  672. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_bug13_init_reinit_warning.py +0 -0
  673. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_bug14_non_tty_log.py +0 -0
  674. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_bug15_prerelease_docs.py +0 -0
  675. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_bug16_nested_var_warning.py +0 -0
  676. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_bug18_envsubst_double_parse.py +0 -0
  677. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_bug19_glob_src_error.py +0 -0
  678. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_bug1_envsubst_malformed_xml.py +0 -0
  679. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_bug20_glob_dest_file.py +0 -0
  680. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_bug2_linkfile_errors.py +0 -0
  681. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_bug3_execv_replaces_process.py +0 -0
  682. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_bug4_symlink_overwrite.py +0 -0
  683. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_bug5_empty_envsubst_list.py +0 -0
  684. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_bug6_undefined_env_vars.py +0 -0
  685. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_bug7_git_ls_remote_retry.py +0 -0
  686. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_bug8_ls_remote_stderr.py +0 -0
  687. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_bug9_constraint_resolution_cache.py +0 -0
  688. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_checklocalpath_rules_1_5.py +0 -0
  689. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_checklocalpath_rules_6_11.py +0 -0
  690. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_checkout_massive.py +0 -0
  691. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_cherrypick_coverage.py +0 -0
  692. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_color.py +0 -0
  693. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_command.py +0 -0
  694. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_conftest_fixtures.py +0 -0
  695. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_diffmanifests_deep.py +0 -0
  696. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_doc_validate_git_preconditions.py +0 -0
  697. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_download_coverage.py +0 -0
  698. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_editor.py +0 -0
  699. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_embedded_mode.py +0 -0
  700. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_envsubst_basic.py +0 -0
  701. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_envsubst_edge.py +0 -0
  702. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_envsubst_massive.py +0 -0
  703. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_error.py +0 -0
  704. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_event_log.py +0 -0
  705. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_event_log_massive.py +0 -0
  706. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_fetch.py +0 -0
  707. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_fixture_files.py +0 -0
  708. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_forall_deep.py +0 -0
  709. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_git_command.py +0 -0
  710. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_git_config.py +0 -0
  711. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_git_refs.py +0 -0
  712. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_git_superproject.py +0 -0
  713. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_git_trace2_event_log.py +0 -0
  714. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_gitconfig_coverage.py +0 -0
  715. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_grep_deep.py +0 -0
  716. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_harness_smoke.py +0 -0
  717. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_hooks.py +0 -0
  718. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_import_verification.py +0 -0
  719. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_imports.py +0 -0
  720. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_include_path_resolution.py +0 -0
  721. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_info_deep.py +0 -0
  722. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_init_deep.py +0 -0
  723. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_list_massive.py +0 -0
  724. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_main.py +0 -0
  725. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_main_coverage.py +0 -0
  726. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_main_init_download_boost.py +0 -0
  727. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_makefile_lint_format.py +0 -0
  728. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_makefile_structure.py +0 -0
  729. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_makefile_test_targets.py +0 -0
  730. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_manifest_coverage_boost.py +0 -0
  731. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_manifest_deep.py +0 -0
  732. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_manifest_doc_rp_flags.py +0 -0
  733. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_manifest_massive.py +0 -0
  734. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_manifest_subcmd_massive.py +0 -0
  735. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_manifest_xml.py +0 -0
  736. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_manifest_xml_pep440.py +0 -0
  737. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_medium_files_boost.py +0 -0
  738. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_mkdtemp_cleanup.py +0 -0
  739. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_overview_massive.py +0 -0
  740. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_package_structure.py +0 -0
  741. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_pager.py +0 -0
  742. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_parselist.py +0 -0
  743. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_pep440_edge_1.py +0 -0
  744. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_pep440_edge_2.py +0 -0
  745. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_pep440_ops_ge.py +0 -0
  746. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_pep440_ops_rest.py +0 -0
  747. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_platform_utils.py +0 -0
  748. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_process_isolation.py +0 -0
  749. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_progress.py +0 -0
  750. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_project.py +0 -0
  751. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_project_coverage_boost.py +0 -0
  752. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_project_coverage_threshold.py +0 -0
  753. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_project_deep.py +0 -0
  754. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_project_deep_boost.py +0 -0
  755. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_project_final_boost.py +0 -0
  756. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_project_integration.py +0 -0
  757. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_project_massive.py +0 -0
  758. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_project_metaproject_boost.py +0 -0
  759. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_project_methods.py +0 -0
  760. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_project_sync.py +0 -0
  761. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_prune_massive.py +0 -0
  762. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_rebase_coverage.py +0 -0
  763. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_remaining_coverage_boost.py +0 -0
  764. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_repo_envsubst_api.py +0 -0
  765. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_repo_logging.py +0 -0
  766. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_repo_run_api.py +0 -0
  767. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_repo_sync_api.py +0 -0
  768. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_repo_trace.py +0 -0
  769. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_revision_inheritance.py +0 -0
  770. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_revision_tag_branch_sha.py +0 -0
  771. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_ruff_config.py +0 -0
  772. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_selfupdate_embedded.py +0 -0
  773. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_selfupdate_massive.py +0 -0
  774. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_small_files_boost.py +0 -0
  775. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_ssh.py +0 -0
  776. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_ssh_deep.py +0 -0
  777. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_stage_coverage.py +0 -0
  778. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_stage_massive.py +0 -0
  779. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_start_coverage.py +0 -0
  780. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_status_coverage.py +0 -0
  781. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_status_gaps.py +0 -0
  782. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_status_massive.py +0 -0
  783. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmd_imports.py +0 -0
  784. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds.py +0 -0
  785. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_abandon.py +0 -0
  786. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_branches.py +0 -0
  787. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_checkout.py +0 -0
  788. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_cherry_pick.py +0 -0
  789. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_diff.py +0 -0
  790. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_diffmanifests.py +0 -0
  791. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_download.py +0 -0
  792. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_envsubst.py +0 -0
  793. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_forall.py +0 -0
  794. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_gc.py +0 -0
  795. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_grep.py +0 -0
  796. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_help.py +0 -0
  797. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_info.py +0 -0
  798. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_init.py +0 -0
  799. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_list.py +0 -0
  800. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_manifest.py +0 -0
  801. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_overview.py +0 -0
  802. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_prune.py +0 -0
  803. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_rebase.py +0 -0
  804. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_selfupdate.py +0 -0
  805. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_smartsync.py +0 -0
  806. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_stage.py +0 -0
  807. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_start.py +0 -0
  808. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_status.py +0 -0
  809. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_sync.py +0 -0
  810. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_upload.py +0 -0
  811. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_superproject_deep.py +0 -0
  812. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_sync_coverage_boost.py +0 -0
  813. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_sync_deep.py +0 -0
  814. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_sync_deep_boost.py +0 -0
  815. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_sync_massive.py +0 -0
  816. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_upload_deep.py +0 -0
  817. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_version_consolidation.py +0 -0
  818. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_version_constraints.py +0 -0
  819. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_wheel_contents.py +0 -0
  820. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_wrapper.py +0 -0
  821. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_annotation_attributes.py +0 -0
  822. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_annotation_crossref.py +0 -0
  823. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_annotation_happy.py +0 -0
  824. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_contactinfo_attributes.py +0 -0
  825. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_contactinfo_crossref.py +0 -0
  826. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_contactinfo_happy.py +0 -0
  827. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_copyfile_attributes.py +0 -0
  828. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_copyfile_crossref.py +0 -0
  829. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_copyfile_happy.py +0 -0
  830. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_default_attributes.py +0 -0
  831. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_default_crossref.py +0 -0
  832. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_default_happy.py +0 -0
  833. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_extend_project_attributes.py +0 -0
  834. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_extend_project_crossref.py +0 -0
  835. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_extend_project_happy.py +0 -0
  836. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_fault_malformed.py +0 -0
  837. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_fault_structural.py +0 -0
  838. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_include_attributes.py +0 -0
  839. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_include_crossref.py +0 -0
  840. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_include_cycles.py +0 -0
  841. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_include_happy.py +0 -0
  842. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_linkfile_attributes.py +0 -0
  843. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_linkfile_crossref.py +0 -0
  844. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_linkfile_happy.py +0 -0
  845. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_manifest_attributes.py +0 -0
  846. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_manifest_crossref.py +0 -0
  847. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_manifest_happy.py +0 -0
  848. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_manifest_server_attributes.py +0 -0
  849. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_manifest_server_crossref.py +0 -0
  850. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_manifest_server_flow.py +0 -0
  851. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_manifest_server_happy.py +0 -0
  852. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_notice_attributes.py +0 -0
  853. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_notice_crossref.py +0 -0
  854. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_notice_happy.py +0 -0
  855. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_project_attributes.py +0 -0
  856. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_project_crossref.py +0 -0
  857. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_project_happy.py +0 -0
  858. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_remote_attributes.py +0 -0
  859. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_remote_crossref.py +0 -0
  860. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_remote_happy.py +0 -0
  861. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_remove_project_attributes.py +0 -0
  862. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_remove_project_crossref.py +0 -0
  863. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_remove_project_happy.py +0 -0
  864. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_repo_hooks_attributes.py +0 -0
  865. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_repo_hooks_crossref.py +0 -0
  866. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_repo_hooks_happy.py +0 -0
  867. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_submanifest_attributes.py +0 -0
  868. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_submanifest_crossref.py +0 -0
  869. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_submanifest_happy.py +0 -0
  870. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_superproject_attributes.py +0 -0
  871. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_superproject_crossref.py +0 -0
  872. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_superproject_flow.py +0 -0
  873. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_superproject_happy.py +0 -0
  874. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xmlbool.py +0 -0
  875. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xmlint.py +0 -0
  876. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_yamllint_config.py +0 -0
  877. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_accessed_at_coalescing.py +0 -0
  878. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_add_collision.py +0 -0
  879. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_background_refresh.py +0 -0
  880. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_bare_semver_to_tag.py +0 -0
  881. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_cache.py +0 -0
  882. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_cache_layout.py +0 -0
  883. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_cache_ttl.py +0 -0
  884. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_cached_catalogs.py +0 -0
  885. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_catalog.py +0 -0
  886. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_catalog_audit_check_parser.py +0 -0
  887. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_catalog_audit_entry_uniqueness.py +0 -0
  888. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_catalog_audit_framework.py +0 -0
  889. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_catalog_audit_legacy_dir.py +0 -0
  890. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_catalog_audit_metadata.py +0 -0
  891. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_catalog_audit_project_tag_format.py +0 -0
  892. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_catalog_audit_remote_url.py +0 -0
  893. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_catalog_audit_source_name.py +0 -0
  894. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_catalog_audit_strict.py +0 -0
  895. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_catalog_audit_tag_format.py +0 -0
  896. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_catalog_source_parsing.py +0 -0
  897. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_check_no_comments.py +0 -0
  898. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_ci_workflows.py +0 -0
  899. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_clean.py +0 -0
  900. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_clean_command.py +0 -0
  901. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_cli.py +0 -0
  902. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_cli_args.py +0 -0
  903. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_cli_help_format.py +0 -0
  904. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_cli_json_stream_discipline.py +0 -0
  905. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_complete_cached_catalogs.py +0 -0
  906. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_complete_catalog_entries.py +0 -0
  907. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_complete_catalog_versions.py +0 -0
  908. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_complete_lockfile_names.py +0 -0
  909. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_complete_project_versions.py +0 -0
  910. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_complete_source_names.py +0 -0
  911. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_completion.py +0 -0
  912. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_completion_sanitization.py +0 -0
  913. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_completion_subcommand.py +0 -0
  914. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_concurrency.py +0 -0
  915. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_conftest_scrubber.py +0 -0
  916. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_constants.py +0 -0
  917. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_constants_doctor_subcheck.py +0 -0
  918. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_constants_env_int.py +0 -0
  919. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_constants_install_after_add.py +0 -0
  920. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_constants_outdated_refs_tags.py +0 -0
  921. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_constants_why_lockfile.py +0 -0
  922. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_coverage_gaps.py +0 -0
  923. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_derive_source_name.py +0 -0
  924. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_discover.py +0 -0
  925. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_discover_source_names_missing_url.py +0 -0
  926. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_docs_embedded_architecture.py +0 -0
  927. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_docs_remaining_and_catalog.py +0 -0
  928. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_doctor.py +0 -0
  929. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_doctor_cache_flags.py +0 -0
  930. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_doctor_completion_errors.py +0 -0
  931. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_doctor_completion_staleness.py +0 -0
  932. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_doctor_consistency.py +0 -0
  933. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_doctor_coverage_gaps.py +0 -0
  934. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_doctor_effective_source.py +0 -0
  935. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_doctor_remote_reachability.py +0 -0
  936. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_env_isolation.py +0 -0
  937. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_envsubst_subcommand.py +0 -0
  938. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_git_runner.py +0 -0
  939. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_home_flag.py +0 -0
  940. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_include_walker.py +0 -0
  941. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_install.py +0 -0
  942. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_install_color_default.py +0 -0
  943. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_install_command.py +0 -0
  944. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_install_https_enforcement.py +0 -0
  945. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_install_placeholder_validation.py +0 -0
  946. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_install_reconcile_decision.py +0 -0
  947. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_install_refresh_lock.py +0 -0
  948. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_install_refresh_lock_source.py +0 -0
  949. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_install_state_matrix.py +0 -0
  950. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_install_strict_flags.py +0 -0
  951. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_install_strict_lock_orphan_naming.py +0 -0
  952. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_integration_testing_doc_manifest_paths.py +0 -0
  953. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_integration_testing_doc_s2_t14.py +0 -0
  954. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_integration_testing_doc_s2_t4.py +0 -0
  955. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_integration_testing_doc_s2_t5.py +0 -0
  956. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_integration_testing_doc_s2_t6.py +0 -0
  957. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_integration_testing_doc_s2_t7.py +0 -0
  958. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_integration_testing_doc_s2_tier1.py +0 -0
  959. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_isolation_fixtures.py +0 -0
  960. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_kanon_hash.py +0 -0
  961. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_kanonenv.py +0 -0
  962. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_kanonenv_advanced_edge_cases.py +0 -0
  963. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_kanonenv_edge_cases.py +0 -0
  964. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_levenshtein.py +0 -0
  965. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_lock_file_path.py +0 -0
  966. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_lockfile.py +0 -0
  967. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_lockfile_coverage_gaps.py +0 -0
  968. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_lockfile_schema_migration.py +0 -0
  969. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_manifest.py +0 -0
  970. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_marketplace.py +0 -0
  971. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_marketplace_cmd.py +0 -0
  972. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_marketplace_install.py +0 -0
  973. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_marketplace_non_plugin_skip.py +0 -0
  974. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_metadata.py +0 -0
  975. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_midtoken_splitter.py +0 -0
  976. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_outdated.py +0 -0
  977. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_outdated_branch_pinned.py +0 -0
  978. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_outdated_fail_on_upgrade.py +0 -0
  979. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_outdated_format_json.py +0 -0
  980. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_pep440_filter.py +0 -0
  981. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_powershell.py +0 -0
  982. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_pre_push_hook.py +0 -0
  983. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_preamble.py +0 -0
  984. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_preamble_semver_tags.py +0 -0
  985. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_provider_agnosticism.py +0 -0
  986. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_pyproject_build_config.py +0 -0
  987. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_remote_url.py +0 -0
  988. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_remove.py +0 -0
  989. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_remove_dry_run.py +0 -0
  990. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_remove_force.py +0 -0
  991. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_remove_line_endings.py +0 -0
  992. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_repo.py +0 -0
  993. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_repo_abspath.py +0 -0
  994. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_repo_command.py +0 -0
  995. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_resolve_catalog_dir.py +0 -0
  996. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_revision_resolve.py +0 -0
  997. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_rx_catalog_sub_repo.py +0 -0
  998. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_sanitize.py +0 -0
  999. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_search_all_versions.py +0 -0
  1000. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_search_coverage_gaps.py +0 -0
  1001. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_search_detail.py +0 -0
  1002. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_search_filter.py +0 -0
  1003. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_search_format_json.py +0 -0
  1004. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_search_tree.py +0 -0
  1005. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_spawn.py +0 -0
  1006. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_update_check.py +0 -0
  1007. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_url.py +0 -0
  1008. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_validate.py +0 -0
  1009. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_validate_command.py +0 -0
  1010. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_validate_metadata.py +0 -0
  1011. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_version_constraint_errors.py +0 -0
  1012. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_why.py +0 -0
  1013. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_why_ambiguity.py +0 -0
  1014. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_why_format_json.py +0 -0
  1015. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_why_suggestions.py +0 -0
  1016. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_xml_validator.py +0 -0
  1017. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tools/lint/check_no_comments.py +0 -0
  1018. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tools/test_tmp_monitor.py +0 -0
  1019. {kanon_cli-3.0.0 → kanon_cli-3.1.0}/uv.lock +0 -0
@@ -2,6 +2,63 @@
2
2
 
3
3
 
4
4
 
5
+ ## v3.1.0 (2026-06-27)
6
+
7
+ ### Feature
8
+
9
+ * feat: resolve catalog entries by tag namespace and accept bare project revisions #83
10
+
11
+ feat: resolve catalog entries by tag namespace and accept bare project revisions ([`6099846`](https://github.com/caylent-solutions/kanon/commit/6099846bbc1b3f5f0988564d00b05df055bb52a8))
12
+
13
+ * feat: key install conflict detection on package destination path, not repo URL
14
+
15
+ Allow the same repository to be installed at different commits for different
16
+ destination paths -- the mono-repo catalog case: install any version of package
17
+ A and any version of package B even when both live in the same repo under
18
+ different per-package tags. Previously `kanon install` rejected this with a
19
+ canonical-URL conflict whenever two sources (or two <project> entries) shared a
20
+ repository URL at different SHAs, which blocked multi-entry installs from a
21
+ per-entry-tagged mono-repo catalog.
22
+
23
+ - Replace the URL-keyed pre-flight (_detect_canonical_url_conflicts,
24
+ ResolvedProject, CanonicalUrlConflictError, _gather_resolved_projects) with a
25
+ destination-path-keyed check (_detect_package_path_conflicts, PackagePin,
26
+ PackagePathConflictError, _gather_package_pins) sourced from the per-source
27
+ content pins. The genuine invariant: no two <project> entries may occupy the
28
+ same .packages/<path> slot with different content. Same path + same SHA is a
29
+ benign duplicate; different paths are always allowed. Source/catalog manifest
30
+ entries are excluded (they never occupy a .packages/ slot). No lockfile schema
31
+ bump -- content_pins already carry path + resolved_sha.
32
+ - aggregate_symlinks remains the on-disk backstop for duplicate package names.
33
+ - Rewrite the unit + integration conflict tests for the path-keyed semantics
34
+ (including the same-repo/different-path/different-SHA success case), rename the
35
+ integration file, update the CD scenarios and the conflict error snapshot, and
36
+ update the multi-source / lockfile / url-canonicalization / troubleshooting /
37
+ integration-testing docs. ([`6f4f9a8`](https://github.com/caylent-solutions/kanon/commit/6f4f9a891504e890076776f0be6785573e0f1f59))
38
+
39
+ * feat: resolve catalog entries by tag namespace and accept bare project revisions
40
+
41
+ Exercising the catalog surfaced resolution bugs and the need to support
42
+ both a per-entry namespaced tag (refs/tags/<name>/<pep440>) and a bare
43
+ PEP 440 tag (refs/tags/<pep440>) for single-purpose repos, for both
44
+ `kanon add` resolution and a manifest `<project revision>` (kanon#82).
45
+
46
+ - Add version.select_entry_namespace, the shared namespaced-if-present-
47
+ else-bare rule. Scope `kanon add` default/explicit resolution
48
+ (commands/add._resolve_spec) and `kanon search`
49
+ (commands/search._list_namespaced_version_tags) to the entry tag
50
+ namespace, so `kanon add history` resolves refs/tags/history/<pep440>
51
+ rather than an unrelated legacy tag and cross-entry versions never collide.
52
+ - Accept a bare refs/tags/<pep440> `<project revision>`
53
+ (core/marketplace_validator._is_pinnable_revision, constants.REFS_TAGS_RE)
54
+ and update the invalid-revision hints. Resolves kanon#82.
55
+ - Replace Path.read_text/write_text(newline=...) (3.13+) with
56
+ Path.open(newline=...) in core/kanonenv_writer so requires-python >=3.11 holds.
57
+ - Write the .kanon dependency block NAME-first with a blank line after the
58
+ CLAUDE_MARKETPLACES_DIR header.
59
+ - Tests, docs, and the kanon-add help snapshot updated. ([`7ed332c`](https://github.com/caylent-solutions/kanon/commit/7ed332c859e69cfd6635035a05c15c03339fdcd1))
60
+
61
+
5
62
  ## v3.0.0 (2026-06-26)
6
63
 
7
64
  ### Breaking
@@ -40,6 +97,10 @@ runs unit + integration + functional + scenario + `make test` as independent ste
40
97
  per-unit validation time substantially. pytest-xdist parallelism was evaluated and reverted:
41
98
  the suite's test collection is non-deterministic across xdist workers (gw collection mismatch). ([`a8b3441`](https://github.com/caylent-solutions/kanon/commit/a8b344134cb2eba39ed3f48aee812e27ce7167e1))
42
99
 
100
+ ### Chore
101
+
102
+ * chore(release): 3.0.0 ([`a76fa87`](https://github.com/caylent-solutions/kanon/commit/a76fa8742ff8634d3e3ddbcdb797d230139ec5d2))
103
+
43
104
  ### Ci
44
105
 
45
106
  * ci: split CI into Linux + Windows sets with platform markers; fix cross-platform bugs
@@ -417,6 +478,10 @@ fixtures, so the functional `test_help_snapshot[kanon-add]` / `[kanon-remove]` b
417
478
 
418
479
  ### Unknown
419
480
 
481
+ * Merge pull request #81 from caylent-solutions/release-3.0.0
482
+
483
+ Release 3.0.0 ([`145232a`](https://github.com/caylent-solutions/kanon/commit/145232aae70aab56a8715fa195f09633798ff2fa))
484
+
420
485
  * P3: triple test coverage + --home/--store-dir flag + LockfileSchemaError fail-fast; ruff 0.11.13 format parity
421
486
 
422
487
  Coverage (P3 audit found 10 gaps of 35 change-inventory items; 25 already fully covered): add real
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kanon-cli
3
- Version: 3.0.0
3
+ Version: 3.1.0
4
4
  Summary: Kanon (Kanon Package Manager) CLI tool
5
5
  Project-URL: Homepage, https://github.com/caylent-solutions/kanon
6
6
  Project-URL: Issues, https://github.com/caylent-solutions/kanon/issues
@@ -1245,7 +1245,10 @@ Constraints resolve to the best matching tag at sync time.
1245
1245
 
1246
1246
  The resolver splits the `revision` attribute at the last `/` into a tag-path
1247
1247
  prefix and a constraint. It filters available tags by that prefix, evaluates
1248
- the constraint, and returns the highest matching version.
1248
+ the constraint, and returns the highest matching version. The prefix is
1249
+ optional: `refs/tags/<pep440>` (and a bare constraint such as `~=1.0.0`)
1250
+ resolves against the bare `refs/tags/` namespace for single-purpose repos,
1251
+ while `refs/tags/<name>/<pep440>` scopes to that namespace.
1249
1252
 
1250
1253
  ```text
1251
1254
  revision="refs/tags/example/development/dev-lint/~=1.2.0"
@@ -1223,7 +1223,10 @@ Constraints resolve to the best matching tag at sync time.
1223
1223
 
1224
1224
  The resolver splits the `revision` attribute at the last `/` into a tag-path
1225
1225
  prefix and a constraint. It filters available tags by that prefix, evaluates
1226
- the constraint, and returns the highest matching version.
1226
+ the constraint, and returns the highest matching version. The prefix is
1227
+ optional: `refs/tags/<pep440>` (and a bare constraint such as `~=1.0.0`)
1228
+ resolves against the bare `refs/tags/` namespace for single-purpose repos,
1229
+ while `refs/tags/<name>/<pep440>` scopes to that namespace.
1227
1230
 
1228
1231
  ```text
1229
1232
  revision="refs/tags/example/development/dev-lint/~=1.2.0"
@@ -76,8 +76,9 @@ manifest correctness.
76
76
  - Project path values (`<project path="...">`) are unique across all marketplace
77
77
  files.
78
78
  - Revision attributes (`<project revision="...">`) use one of the allowed
79
- pinnable formats: an exact deep-path tag `refs/tags/<path>/<pep440>`, a
80
- branch ref `refs/heads/<name>`, or a 40-hex commit SHA. The wildcard `*`,
79
+ pinnable formats: an exact tag `refs/tags/<path>/<pep440>` (namespaced) or
80
+ `refs/tags/<pep440>` (bare, for single-purpose repos), a branch ref
81
+ `refs/heads/<name>`, or a 40-hex commit SHA. The wildcard `*`,
81
82
  a bare branch name (e.g. `main` without the `refs/heads/` prefix), and
82
83
  version-range constraints (`>=X,<Y`, `~=`) are rejected. On install a tag
83
84
  or branch revision resolves to a content SHA pinned in `.kanon.lock`
@@ -819,7 +819,7 @@ rm -rf "${MS01_DIR}"
819
819
 
820
820
  ## 7. Category 6: Collision Detection (2 tests)
821
821
 
822
- ### CD-01: Two sources producing the same package name
822
+ ### CD-01: Two sources resolving the same destination path to different content
823
823
 
824
824
  ```bash
825
825
  export CD01_DIR="${KANON_TEST_ROOT}/test-cd01"
@@ -845,7 +845,7 @@ kanon install .kanon
845
845
  **Pass criteria:**
846
846
 
847
847
  - Exit code 1
848
- - stderr contains `Package collision` and `pkg-alpha`
848
+ - stderr contains `Package destination conflict` and `.packages/pkg-alpha`
849
849
 
850
850
  **Cleanup:**
851
851
 
@@ -853,7 +853,7 @@ kanon install .kanon
853
853
  rm -rf "${CD01_DIR}"
854
854
  ```
855
855
 
856
- ### CD-02: Three sources, collision between two
856
+ ### CD-02: Three sources, two resolving the same destination path to different content
857
857
 
858
858
  ```bash
859
859
  export CD02_DIR="${KANON_TEST_ROOT}/test-cd02"
@@ -884,8 +884,8 @@ kanon install .kanon
884
884
  **Pass criteria:**
885
885
 
886
886
  - Exit code 1
887
- - stderr contains `Package collision` and `pkg-alpha`
888
- - Sources are processed alphabetically: `aaa` processes first, then `bbb` collides on `pkg-alpha`
887
+ - stderr contains `Package destination conflict` and `.packages/pkg-alpha`
888
+ - The conflict names the sources resolving `.packages/pkg-alpha` to different content (`aaa`/`ccc` pin one commit, `bbb` pins another)
889
889
 
890
890
  **Cleanup:**
891
891
 
@@ -6194,8 +6194,8 @@ After running every scenario from §2 through §28, populate this spreadsheet-st
6194
6194
  | 018 | IC-03 | install-clean | Comments and blank lines | | | | |
6195
6195
  | 019 | IC-04 | install-clean | Marketplace install false | | | | |
6196
6196
  | 020 | MS-01 | multi-source | Two sources aggregate | | | | |
6197
- | 021 | CD-01 | collision | Same-name collision two sources | | | | |
6198
- | 022 | CD-02 | collision | Three-source alphabetical collision | | | | |
6197
+ | 021 | CD-01 | collision | Two sources, same destination path, different content | | | | |
6198
+ | 022 | CD-02 | collision | Three sources, two share a destination path | | | | |
6199
6199
  | 023 | LF-01 | linkfile | linkfile creates symlinks | | | | |
6200
6200
  | 024 | EC-01 | error-cases | Missing .kanon | | | | |
6201
6201
  | 025 | EC-02 | error-cases | Empty .kanon | | | | |
@@ -301,15 +301,17 @@ Those checks belong to `kanon catalog audit`. A successful
301
301
  - `<name>` must match a `<catalog-metadata><name>` value in
302
302
  the resolved manifest repo.
303
303
  - `@<spec>` is optional. Default: the highest PEP 440-valid git
304
- tag on the manifest repo (see "Default spec resolution").
304
+ tag in the entry's tag namespace (see "Default spec resolution").
305
305
  - Multiple `<name>[@<spec>]` arguments may be supplied in one
306
306
  invocation.
307
307
 
308
308
  ### add -- Default spec resolution
309
309
 
310
310
  When `@<spec>` is omitted, `kanon add` queries the manifest
311
- repo for its highest PEP 440-valid git tag via
312
- `git ls-remote --tags`. If zero PEP 440-valid tags exist:
311
+ repo via `git ls-remote --tags` for the highest PEP 440-valid
312
+ git tag in the entry's `refs/tags/<name>/` namespace, falling
313
+ back to the bare `refs/tags/<pep440>` namespace when the entry
314
+ has no namespaced tags. If zero PEP 440-valid tags exist:
313
315
 
314
316
  ```text
315
317
  ERROR: manifest repo has no PEP 440-valid tags; pin to a
@@ -213,9 +213,9 @@ include.
213
213
  **`url`** (string) -- Raw project URL as declared in the catalog XML.
214
214
 
215
215
  **`canonical_url`** (string) -- Canonical form of `url` (output of
216
- `canonicalize_repo_url`). Used for conflict detection: two entries
217
- sharing a canonical URL but pinning different SHAs trigger a
218
- `CanonicalUrlConflictError`.
216
+ `canonicalize_repo_url`). Used by `kanon why` for URL matching. (Install
217
+ conflict detection is keyed on the package destination path, not the URL --
218
+ see "Package destination conflict" below.)
219
219
 
220
220
  **`ref_spec`** (string) -- Version / ref constraint for this project (the
221
221
  v4 rename of the former `revision_spec`). Written at lock time.
@@ -276,9 +276,10 @@ Exception: `LockfileValidationError`.
276
276
 
277
277
  This `ref_spec` is the source / catalog ref-spec. It is distinct from a
278
278
  manifest `<project revision>` (the content revision validated by
279
- `kanon validate marketplace`), which accepts an exact deep-path tag
280
- (`refs/tags/<path>/<pep440>`), a branch ref (`refs/heads/<name>`), or a
281
- 40-hex commit SHA, and rejects the `*` wildcard, a bare branch name, and
279
+ `kanon validate marketplace`), which accepts an exact tag
280
+ (`refs/tags/<path>/<pep440>` namespaced or `refs/tags/<pep440>` bare), a
281
+ branch ref (`refs/heads/<name>`), or a 40-hex commit SHA, and rejects the
282
+ `*` wildcard, a bare branch name, and
282
283
  version-range constraints. On install a tag or branch `<project revision>`
283
284
  resolves to a content SHA pinned in `[[sources.content_pins]]`, so a
284
285
  branch revision does not pin a moving target.
@@ -391,9 +392,10 @@ source's resolved manifest tree, captured after `repo sync`:
391
392
  lock time.
392
393
 
393
394
  A reinstall replays each locked content SHA byte-for-byte (npm-style
394
- content-SHA locking). A manifest `<project revision>` may be an exact
395
- deep-path tag (`refs/tags/<path>/<pep440>`), a branch ref
396
- (`refs/heads/<name>`), or a 40-hex commit SHA. On install a tag or branch
395
+ content-SHA locking). A manifest `<project revision>` may be an exact tag
396
+ (`refs/tags/<path>/<pep440>` namespaced or `refs/tags/<pep440>` bare), a
397
+ branch ref (`refs/heads/<name>`), or a 40-hex commit SHA. On install a tag
398
+ or branch
397
399
  revision resolves to a content SHA that is pinned here, so a branch
398
400
  revision does NOT pin a moving target: the locked SHA is replayed until an
399
401
  explicit `kanon install --refresh-lock` re-resolves it.
@@ -690,12 +692,15 @@ If a `resolved_sha` recorded in the lockfile is no longer reachable on
690
692
  the remote, `kanon install` exits with `LockfileUnreachableShaError`.
691
693
  This is a hard error.
692
694
 
693
- ### Transitive canonical-URL conflict
695
+ ### Package destination conflict
694
696
 
695
- When two or more `[[sources.projects]]` entries resolve to the same
696
- canonical URL but pin different commit SHAs, `kanon install` exits with
697
- `CanonicalUrlConflictError`. This check runs both during fresh resolution
698
- and during `LOCKFILE_CONSISTENT` replay.
697
+ When two or more sources resolve the same package destination path
698
+ (`.packages/<name>`, recorded in `[[sources.content_pins]]`) to different
699
+ content SHAs, `kanon install` exits with `PackagePathConflictError`. The same
700
+ repository fetched at different commits for **different** destination paths is
701
+ allowed (independent packages from a mono-repo); only a same-path /
702
+ different-content clash is an error. This check runs both during fresh
703
+ resolution and during `LOCKFILE_CONSISTENT` replay.
699
704
 
700
705
  ---
701
706
 
@@ -308,15 +308,27 @@ which source provided them.
308
308
 
309
309
  ## Collision Detection
310
310
 
311
- When two sources produce a package with the same name, Kanon detects the
312
- collision and fails immediately with an actionable error message.
311
+ Kanon's install conflict check is keyed on the package **destination path**
312
+ (`.packages/<name>`), not on the repository URL. Two sources may fetch the
313
+ **same repository at different commits** as long as their `<project>` entries
314
+ land at **different** destination paths -- this is the mono-repo case: install
315
+ any version of package A and any version of package B even when both live in the
316
+ same repo under different per-package tags. The only hard error is two sources
317
+ resolving the **same** `.packages/<name>` slot to **different content**.
318
+
319
+ When two sources produce a package at the same destination with different
320
+ content, Kanon detects the collision and fails immediately with an actionable
321
+ error message.
313
322
 
314
323
  ### How It Works
315
324
 
316
- During symlink aggregation, Kanon tracks which source provided each
317
- package name. If a package name already exists from a previous source,
318
- aggregation aborts with an error identifying both the conflicting
319
- sources and the duplicate package name.
325
+ A pre-flight check (`kanon install`) groups every source's resolved content pins
326
+ by destination path; a path claimed with more than one content SHA is a
327
+ `PackagePathConflictError` (the same path at the same SHA is a benign duplicate).
328
+ During symlink aggregation, Kanon additionally tracks which source provided each
329
+ package name as an on-disk backstop: if a package name already exists from a
330
+ previous source, aggregation aborts with an error identifying both the
331
+ conflicting sources and the duplicate package name.
320
332
 
321
333
  ### Example Error
322
334
 
@@ -568,41 +568,42 @@ The following documents provide broader context:
568
568
 
569
569
  ---
570
570
 
571
- ## 12. Canonical-URL Conflict
571
+ ## 12. Package Destination Conflict
572
572
 
573
573
  ### Symptom
574
574
 
575
575
  `kanon install` exits non-zero with:
576
576
 
577
577
  ```text
578
- ERROR: Canonical-URL conflict -- two or more sources declare the same
579
- repository URL with different SHAs.
580
- Conflict for canonical URL:
581
- https://gitserver/org/example-package
582
- source-a/manifest.xml:
583
- git@gitserver:org/example-package.git @ aaaa...aaaa
584
- source-b/manifest.xml:
585
- https://gitserver/org/example-package.git @ bbbb...bbbb
586
- both URLs canonicalize to:
587
- https://gitserver/org/example-package
588
- Remediation: Use 'kanon why https://gitserver/org/example-package'
589
- to investigate; resolve by removing one source or aligning REVISION
590
- values across sources.
578
+ ERROR: Package destination conflict -- two or more sources resolve the
579
+ same package path to different content.
580
+ Conflict for package path: .packages/shared-lib
581
+ source_a (shared-lib): .packages/shared-lib @ aaaa...aaaa
582
+ source_b (shared-lib): .packages/shared-lib @ bbbb...bbbb
583
+ Remediation: remove one source or align the project revisions so
584
+ '.packages/shared-lib' resolves to a single content SHA.
591
585
  ```
592
586
 
587
+ This fires only when two sources resolve the **same** `.packages/<name>`
588
+ slot to **different** content. Fetching the **same repository at different
589
+ commits** is fine when the `<project>` entries land at **different**
590
+ destination paths (the mono-repo case -- install any version of package A and
591
+ any version of package B from one repo).
592
+
593
593
  ### Reproducer
594
594
 
595
595
  ```bash
596
- # Two sources pointing to the same repo with different SHAs:
596
+ # Two sources whose <project path> both resolve to .packages/shared-lib
597
+ # at different commits:
597
598
  kanon install
598
599
  ```
599
600
 
600
601
  ### Fix
601
602
 
602
- **Option 1: Align the revision specs.**
603
+ **Option 1: Align the revisions.**
603
604
 
604
- Edit `.kanon` so that all declarations use the same `REVISION`
605
- value (e.g., `==1.2.0`) for the conflicting repository.
605
+ Edit `.kanon` (or the catalog manifests) so both declarations resolve the
606
+ shared `.packages/<name>` path to the same commit.
606
607
 
607
608
  **Option 2: Remove one conflicting source.**
608
609
 
@@ -611,11 +612,11 @@ kanon remove <source-name>
611
612
  kanon install
612
613
  ```
613
614
 
614
- **Option 3: Investigate with `kanon why`.**
615
+ **Option 3: Give the packages distinct destination paths.**
615
616
 
616
- ```bash
617
- kanon why https://gitserver/org/example-package
618
- ```
617
+ If the two `<project>` entries are genuinely different packages, set a
618
+ distinct `<project path>` for each so they no longer share a `.packages/`
619
+ slot.
619
620
 
620
621
  ### See also
621
622
 
@@ -90,8 +90,6 @@ The following kanon features use `canonicalize_repo_url` for URL matching:
90
90
 
91
91
  - **Lockfile `canonical_url` field** (spec Section 5) -- every entry in the
92
92
  lockfile stores the canonical form of the dependency URL.
93
- - **Conflict detection** (spec Section 4.7) -- two sources conflict when their
94
- canonical URLs are equal.
95
93
  - **`kanon why` URL matching** (spec Section 4.5) -- the query URL is
96
94
  canonicalized before comparison against lockfile entries.
97
95
  - **`kanon outdated` URL matching** -- canonical URLs are used to correlate
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "kanon-cli"
7
- version = "3.0.0"
7
+ version = "3.1.0"
8
8
  description = "Kanon (Kanon Package Manager) CLI tool"
9
9
  readme = { file = "README.md", content-type = "text/markdown" }
10
10
  requires-python = ">=3.11"
@@ -40,6 +40,7 @@ Issues = "https://github.com/caylent-solutions/kanon/issues"
40
40
 
41
41
 
42
42
 
43
+
43
44
  [tool.hatch.build.targets.wheel]
44
45
  packages = [
45
46
  "src/kanon_cli",
@@ -134,6 +135,7 @@ enabled = false
134
135
  [tool.pymarkdown.plugins.md024]
135
136
  siblings_only = true
136
137
 
138
+
137
139
  [dependency-groups]
138
140
  dev = [
139
141
  "build>=1.4.3",
@@ -1,3 +1,3 @@
1
1
  """Kanon CLI -- Kanon Package Manager."""
2
2
 
3
- __version__ = "3.0.0"
3
+ __version__ = "3.1.0"
@@ -77,7 +77,13 @@ from kanon_cli.core.metadata import (
77
77
  derive_source_name,
78
78
  find_catalog_entry_files,
79
79
  )
80
- from kanon_cli.version import _list_tags, _resolve_constraint_from_tags, is_version_constraint, resolve_version
80
+ from kanon_cli.version import (
81
+ _list_tags,
82
+ _resolve_constraint_from_tags,
83
+ is_version_constraint,
84
+ resolve_version,
85
+ select_entry_namespace,
86
+ )
81
87
 
82
88
 
83
89
  _ZERO_PEP440_TAGS_ERROR = (
@@ -119,7 +125,8 @@ def register(subparsers: "argparse._SubParsersAction[argparse.ArgumentParser]")
119
125
  "constraint (e.g. ==1.0.0, ~=1.2, >=1.0.0,<2.0.0). The last '@' in\n"
120
126
  "each argument is the delimiter -- see spec Section 4.0 resolver rules.\n"
121
127
  "When <spec> is omitted the highest PEP 440-valid git tag in the\n"
122
- "manifest repo is selected automatically."
128
+ "entry's refs/tags/<name>/ namespace is selected, or the highest\n"
129
+ "bare refs/tags/<pep440> tag when the entry has no namespaced tags."
123
130
  ),
124
131
  formatter_class=argparse.RawDescriptionHelpFormatter,
125
132
  epilog=(
@@ -790,10 +797,10 @@ def _build_source_block_lines(
790
797
  prefix = f"{SOURCE_PREFIX}{source_name}"
791
798
 
792
799
  lines = [
793
- f"{prefix}_URL={url}",
800
+ f"{prefix}_NAME={name}",
794
801
  f"{prefix}_REF={ref}",
802
+ f"{prefix}_URL={url}",
795
803
  f"{prefix}_PATH={path}",
796
- f"{prefix}_NAME={name}",
797
804
  ]
798
805
  lines.extend(env_var_lines)
799
806
  if marketplace:
@@ -941,37 +948,52 @@ def _find_entry_by_name(
941
948
  sys.exit(1)
942
949
 
943
950
 
944
- def _resolve_spec(url: str, spec: str | None) -> str:
945
- """Resolve the version spec for a catalog entry.
951
+ def _resolve_spec(entry_name: str, url: str, spec: str | None) -> str:
952
+ """Resolve the version spec for a catalog entry, scoped to its tag namespace.
953
+
954
+ A catalog may tag an entry under a per-entry namespace
955
+ (``refs/tags/<entry_name>/<pep440>``) or with bare ``refs/tags/<pep440>``
956
+ tags. Resolution scopes to the entry's namespace when such tags exist (so
957
+ ``kanon add history`` resolves the highest ``refs/tags/history/<pep440>`` and
958
+ never another entry's tag), and falls back to the bare namespace otherwise
959
+ (a single-purpose, poly repo). The chosen namespace comes from
960
+ :func:`kanon_cli.version.select_entry_namespace`, the rule shared with
961
+ ``kanon search``.
946
962
 
947
- When spec is None (default-spec path), selects the highest PEP 440-valid
948
- git tag on the manifest repo via git ls-remote --tags. Raises SystemExit
963
+ When spec is None (default-spec path), selects the highest PEP 440-valid git
964
+ tag in the resolved namespace via git ls-remote --tags. Raises SystemExit
949
965
  with the spec-verbatim error if:
950
966
 
951
967
  - The repo has zero tags total (AC-FUNC-002), or
952
- - The repo has tags but none parse as ``packaging.version.Version``
953
- (AC-FUNC-003). In this subcase the first up-to-10 skipped tag names
954
- are printed so the operator can identify the offending tags.
968
+ - The resolved namespace has tags but none parse as
969
+ ``packaging.version.Version`` (AC-FUNC-003). In this subcase the first
970
+ up-to-10 skipped tag names are printed so the operator can identify the
971
+ offending tags.
955
972
 
956
- When spec is a non-empty string, delegates to resolve_version() to
957
- resolve the PEP 440 constraint against the available tags (AC-FUNC-005).
973
+ When spec is a non-empty string, delegates to resolve_version() to resolve
974
+ the PEP 440 constraint within the resolved namespace (AC-FUNC-005).
958
975
 
959
976
  Args:
977
+ entry_name: The catalog entry name (its per-entry tag namespace).
960
978
  url: The manifest repo git URL.
961
979
  spec: The version spec string (e.g. '==1.0.0', '~=1.2') or None.
962
980
 
963
981
  Returns:
964
- A full tag ref string (e.g. 'refs/tags/1.2.0').
982
+ A full tag ref string (e.g. 'refs/tags/history/0.1.1').
965
983
  """
984
+ tags = _list_tags(url)
985
+ namespace = select_entry_namespace(tags, entry_name)
986
+ scope_prefix = f"refs/tags/{namespace}/" if namespace is not None else "refs/tags/"
987
+
966
988
  if spec is None:
967
- tags = _list_tags(url)
968
989
  if not tags:
969
990
  print(f"ERROR: {_ZERO_PEP440_TAGS_ERROR}", file=sys.stderr)
970
991
  sys.exit(1)
971
992
 
993
+ scoped_tags = [tag for tag in tags if tag.startswith(scope_prefix)]
972
994
  skipped: list[str] = []
973
995
  has_pep440 = False
974
- for tag in tags:
996
+ for tag in scoped_tags:
975
997
  last = tag.rsplit("/", 1)[-1]
976
998
  try:
977
999
  Version(last)
@@ -991,9 +1013,11 @@ def _resolve_spec(url: str, spec: str | None) -> str:
991
1013
  print("\n".join(lines), file=sys.stderr)
992
1014
  sys.exit(1)
993
1015
 
994
- return _resolve_constraint_from_tags("*", tags)
1016
+ constraint = f"refs/tags/{namespace}/*" if namespace is not None else "*"
1017
+ return _resolve_constraint_from_tags(constraint, tags)
995
1018
 
996
- return resolve_version(url, spec)
1019
+ namespaced_spec = f"refs/tags/{namespace}/{spec}" if namespace is not None else spec
1020
+ return resolve_version(url, namespaced_spec)
997
1021
 
998
1022
 
999
1023
  def _resolve_manifest_repo_for_add(
@@ -1457,7 +1481,7 @@ def run_add(args: argparse.Namespace) -> int:
1457
1481
 
1458
1482
  metadata, xml_path, entry_url = _find_entry_by_name(name, catalog)
1459
1483
 
1460
- resolved_revision = _resolve_spec(entry_url, spec)
1484
+ resolved_revision = _resolve_spec(name, entry_url, spec)
1461
1485
 
1462
1486
  base_alias = derive_source_name(metadata.name)
1463
1487
 
@@ -655,7 +655,8 @@ def _check_project_revision_exact_tags(target_path: pathlib.Path) -> list[AuditF
655
655
  ),
656
656
  remediation=(
657
657
  f"Pin {project_name!r} to an exact tag refs/tags/<path>/<pep440> "
658
- "(e.g. refs/tags/my-plugin/1.0.0), a branch ref refs/heads/<name>, "
658
+ "or refs/tags/<pep440> (e.g. refs/tags/my-plugin/1.0.0 or "
659
+ "refs/tags/1.0.0), a branch ref refs/heads/<name>, "
659
660
  "or a 40-hex commit SHA. "
660
661
  "Run 'kanon validate marketplace' to confirm the manifest is clean."
661
662
  ),
@@ -82,7 +82,7 @@ from kanon_cli.core.metadata import (
82
82
  _parse_catalog_metadata,
83
83
  find_catalog_entry_files,
84
84
  )
85
- from kanon_cli.version import _list_branch_head, is_version_constraint, resolve_version
85
+ from kanon_cli.version import _list_branch_head, is_version_constraint, resolve_version, select_entry_namespace
86
86
 
87
87
 
88
88
  _LATEST_TIP_MARKER = "latest"
@@ -268,30 +268,33 @@ def _resolve_search_ttl() -> int:
268
268
 
269
269
 
270
270
  def _list_namespaced_version_tags(url: str, entry_name: str) -> list[str]:
271
- """Return PEP 440 version strings under ``refs/tags/<entry_name>/`` for a repo.
271
+ """Return a catalog entry's PEP 440 version strings, newest-first.
272
272
 
273
- Runs ``git ls-remote --tags <url> refs/tags/<entry_name>/*`` (a prefix filter,
274
- no ancestry walk and no tree reads -- spec Section 4.1 / Section 6), strips the
275
- ``refs/tags/<entry_name>/`` prefix, drops peeled ``^{}`` deref lines, keeps only
276
- last components that parse as PEP 440, and returns them sorted newest-first.
273
+ Lists the manifest repo's tags once via ``git ls-remote --tags`` and scopes
274
+ them with :func:`kanon_cli.version.select_entry_namespace`, the rule shared
275
+ with ``kanon add`` (spec Section 4.1 / Section 6): when the entry has
276
+ ``refs/tags/<entry_name>/<pep440>`` tags those are used; otherwise the bare
277
+ ``refs/tags/<pep440>`` tags are used (a single-purpose, poly repo). Peeled
278
+ ``^{}`` deref lines, other entries' namespaced tags, and non-PEP-440 last
279
+ components are dropped. Listing once and selecting the namespace keeps
280
+ ``kanon search`` consistent with what ``kanon add`` would resolve.
277
281
 
278
282
  Args:
279
283
  url: Git repository URL of the catalog manifest repo.
280
- entry_name: The catalog entry name whose tag namespace is enumerated.
284
+ entry_name: The catalog entry name whose versions are enumerated.
281
285
 
282
286
  Returns:
283
287
  Newest-first list of PEP 440 version strings. Empty when the entry has no
284
- ``refs/tags/<entry_name>/*`` tags.
288
+ namespaced and no bare version tags.
285
289
 
286
290
  Raises:
287
291
  SourceUnreachableError: When the underlying ``git ls-remote`` exits
288
292
  non-zero or the git binary is missing (the caller decides whether to
289
293
  skip+warn or propagate).
290
294
  """
291
- pattern = f"refs/tags/{entry_name}/*"
292
295
  try:
293
296
  result = subprocess.run(
294
- ["git", "ls-remote", "--tags", url, pattern],
297
+ ["git", "ls-remote", "--tags", url],
295
298
  capture_output=True,
296
299
  text=True,
297
300
  check=False,
@@ -302,17 +305,26 @@ def _list_namespaced_version_tags(url: str, entry_name: str) -> list[str]:
302
305
  if result.returncode != 0:
303
306
  raise SourceUnreachableError(url, result.stderr.strip() or f"git ls-remote exited {result.returncode}")
304
307
 
305
- prefix = f"refs/tags/{entry_name}/"
306
- versions: list[Version] = []
308
+ refs: list[str] = []
307
309
  for line in result.stdout.splitlines():
308
310
  line = line.strip()
309
311
  if not line or "\t" not in line:
310
312
  continue
311
313
  _sha, ref = line.split("\t", 1)
312
314
  ref = ref.strip()
313
- if ref.endswith("^{}") or not ref.startswith(prefix):
315
+ if ref.endswith("^{}") or not ref.startswith("refs/tags/"):
316
+ continue
317
+ refs.append(ref)
318
+
319
+ namespace = select_entry_namespace(refs, entry_name)
320
+ prefix = f"refs/tags/{namespace}/" if namespace is not None else "refs/tags/"
321
+ versions: list[Version] = []
322
+ for ref in refs:
323
+ if not ref.startswith(prefix):
314
324
  continue
315
325
  suffix = ref[len(prefix) :]
326
+ if namespace is None and "/" in suffix:
327
+ continue
316
328
  try:
317
329
  versions.append(Version(suffix))
318
330
  except InvalidVersion: