kanon-cli 3.1.0__tar.gz → 3.2.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 (1017) hide show
  1. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/CHANGELOG.md +134 -0
  2. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/PKG-INFO +15 -7
  3. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/README.md +14 -6
  4. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/architecture.md +5 -3
  5. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/catalog-author-guide.md +2 -2
  6. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/cli/catalog-audit.md +4 -4
  7. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/cli/doctor.md +6 -6
  8. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/cli-reference.md +2 -2
  9. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/configuration.md +2 -2
  10. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/doctor.md +1 -1
  11. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/how-it-works.md +1 -1
  12. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/installation.md +5 -1
  13. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/integration-testing.md +18 -18
  14. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/lifecycle.md +32 -3
  15. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/migration-to-add.md +2 -2
  16. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/pipeline-integration.md +4 -4
  17. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/shell-completion.md +3 -3
  18. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/pyproject.toml +5 -1
  19. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/__init__.py +1 -1
  20. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/cli.py +1 -1
  21. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/commands/add.py +2 -0
  22. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/commands/clean.py +54 -4
  23. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/commands/marketplace.py +3 -0
  24. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/commands/outdated.py +18 -12
  25. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/commands/remove.py +5 -1
  26. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/commands/why.py +15 -7
  27. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/completions/cache.py +1 -1
  28. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/constants.py +2 -2
  29. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/clean.py +85 -4
  30. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/cli_args.py +2 -2
  31. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/install.py +13 -14
  32. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/kanonenv_writer.py +34 -0
  33. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/update_check.py +1 -1
  34. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/conftest.py +4 -4
  35. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/completion/expected-bash.sh +3 -1
  36. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/completion/expected-zsh.sh +3 -1
  37. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/help/kanon-clean.txt +15 -1
  38. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/help/kanon-toplevel.txt +1 -1
  39. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_clean_lifecycle.py +41 -0
  40. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_install_lifecycle.py +17 -14
  41. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_clean_lifecycle.py +2 -2
  42. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_clean_paths.py +48 -1
  43. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_concurrency.py +12 -28
  44. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_fs_fault_injection.py +4 -6
  45. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_full_user_journey.py +11 -18
  46. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_gitignore_idempotency.py +17 -14
  47. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_lifecycle.py +57 -50
  48. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_kanon_clean_embedded.py +2 -2
  49. kanon_cli-3.2.0/tests/integration/test_kanon_dir_collision.py +51 -0
  50. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_kanon_full_lifecycle.py +26 -24
  51. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_kanon_install_embedded.py +9 -9
  52. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_lifecycle_recovery.py +15 -12
  53. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_misc_features.py +5 -3
  54. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_outdated_refs_tags_revision_parsing.py +52 -0
  55. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_why_ambiguous.py +34 -0
  56. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_ic.py +6 -7
  57. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_pk.py +9 -10
  58. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_tc_clean.py +9 -14
  59. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_uj.py +3 -3
  60. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_cache_layout.py +4 -4
  61. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_clean.py +93 -5
  62. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_clean_command.py +118 -6
  63. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_constants.py +2 -2
  64. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_constants_outdated_refs_tags.py +8 -0
  65. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_coverage_gaps.py +2 -2
  66. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_home_flag.py +3 -3
  67. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_install.py +4 -2
  68. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_isolation_fixtures.py +3 -3
  69. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_kanonenv_writer.py +36 -0
  70. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_update_check.py +1 -1
  71. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_why_ambiguity.py +33 -0
  72. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.claude/settings.json +0 -0
  73. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.devcontainer/.devcontainer.postcreate.sh +0 -0
  74. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.devcontainer/VERSION +0 -0
  75. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.devcontainer/catalog-entry.json +0 -0
  76. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.devcontainer/devcontainer-functions.sh +0 -0
  77. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.devcontainer/devcontainer.json +0 -0
  78. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.devcontainer/fix-line-endings.py +0 -0
  79. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.devcontainer/nix-family-os/README.md +0 -0
  80. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.devcontainer/nix-family-os/tinyproxy-daemon.sh +0 -0
  81. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.devcontainer/nix-family-os/tinyproxy.conf.template +0 -0
  82. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.devcontainer/postcreate-wrapper.sh +0 -0
  83. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.devcontainer/project-setup.sh +0 -0
  84. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.devcontainer/wsl-family-os/README.md +0 -0
  85. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.devcontainer/wsl-family-os/tinyproxy-daemon.sh +0 -0
  86. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.devcontainer/wsl-family-os/tinyproxy.conf.template +0 -0
  87. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.github/CODEOWNERS +0 -0
  88. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.github/actions/setup-kanon/action.yml +0 -0
  89. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.github/workflows/codeql-analysis.yml +0 -0
  90. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.github/workflows/main-validation.yml +0 -0
  91. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.github/workflows/pr-validation.yml +0 -0
  92. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.github/workflows/publish.yml +0 -0
  93. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.gitignore +0 -0
  94. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.markdownlint.json +0 -0
  95. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.pre-commit-config.yaml +0 -0
  96. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.tool-versions +0 -0
  97. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/.yamllint +0 -0
  98. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/CLAUDE.md +0 -0
  99. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/CONTRIBUTING.md +0 -0
  100. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/LICENSE +0 -0
  101. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/Makefile +0 -0
  102. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/catalog-format-versioning.md +0 -0
  103. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/catalogs-explained.md +0 -0
  104. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/claude-marketplaces-guide.md +0 -0
  105. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/cli/validate.md +0 -0
  106. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/cli.md +0 -0
  107. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/coming-from-pip-npm-cargo.md +0 -0
  108. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/contributing.md +0 -0
  109. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/creating-manifest-repos.md +0 -0
  110. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/creating-packages.md +0 -0
  111. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/exit-codes.md +0 -0
  112. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/git-auth-setup.md +0 -0
  113. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/list-and-add.md +0 -0
  114. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/lockfile.md +0 -0
  115. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/migrating-existing-kanon-files.md +0 -0
  116. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/multi-source-guide.md +0 -0
  117. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/outdated-and-why.md +0 -0
  118. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/repo/README.md +0 -0
  119. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/repo/internal-fs-layout.md +0 -0
  120. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/repo/manifest-format.md +0 -0
  121. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/repo/python-support.md +0 -0
  122. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/repo/repo-hooks.md +0 -0
  123. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/repo/smart-sync.md +0 -0
  124. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/repo/windows.md +0 -0
  125. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/security-model.md +0 -0
  126. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/setup-guide.md +0 -0
  127. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/test-coverage.md +0 -0
  128. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/testing/matrix-traceability.md +0 -0
  129. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/troubleshooting.md +0 -0
  130. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/url-canonicalization.md +0 -0
  131. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/docs/version-resolution.md +0 -0
  132. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/git-hooks/pre-commit +0 -0
  133. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/git-hooks/pre-push +0 -0
  134. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/link +0 -0
  135. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/requirements-dev.txt +0 -0
  136. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/requirements.txt +0 -0
  137. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/scripts/check_archive_no_duplicates.py +0 -0
  138. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/__main__.py +0 -0
  139. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/commands/__init__.py +0 -0
  140. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/commands/catalog.py +0 -0
  141. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/commands/completion.py +0 -0
  142. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/commands/doctor.py +0 -0
  143. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/commands/install.py +0 -0
  144. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/commands/repo.py +0 -0
  145. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/commands/search.py +0 -0
  146. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/commands/validate.py +0 -0
  147. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/completions/__init__.py +0 -0
  148. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/completions/cached_catalogs.py +0 -0
  149. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/completions/catalog_entries.py +0 -0
  150. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/completions/catalog_versions.py +0 -0
  151. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/completions/lockfile_names.py +0 -0
  152. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/completions/midtoken.py +0 -0
  153. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/completions/pep440_filter.py +0 -0
  154. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/completions/powershell.py +0 -0
  155. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/completions/preamble.py +0 -0
  156. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/completions/project_versions.py +0 -0
  157. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/completions/sanitize.py +0 -0
  158. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/completions/source_names.py +0 -0
  159. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/__init__.py +0 -0
  160. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/catalog.py +0 -0
  161. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/discover.py +0 -0
  162. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/git_runner.py +0 -0
  163. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/include_walker.py +0 -0
  164. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/kanon_hash.py +0 -0
  165. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/kanonenv.py +0 -0
  166. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/lockfile.py +0 -0
  167. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/manifest.py +0 -0
  168. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/manifest_vars.py +0 -0
  169. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/marketplace.py +0 -0
  170. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/marketplace_validator.py +0 -0
  171. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/metadata.py +0 -0
  172. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/remote_url.py +0 -0
  173. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/url.py +0 -0
  174. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/core/xml_validator.py +0 -0
  175. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/__init__.py +0 -0
  176. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/color.py +0 -0
  177. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/command.py +0 -0
  178. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/editor.py +0 -0
  179. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/error.py +0 -0
  180. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/event_log.py +0 -0
  181. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/fetch.py +0 -0
  182. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/git_command.py +0 -0
  183. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/git_config.py +0 -0
  184. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/git_refs.py +0 -0
  185. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/git_ssh +0 -0
  186. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/git_superproject.py +0 -0
  187. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/git_trace2_event_log.py +0 -0
  188. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/git_trace2_event_log_base.py +0 -0
  189. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/hooks/commit-msg +0 -0
  190. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/hooks/pre-auto-gc +0 -0
  191. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/hooks.py +0 -0
  192. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/main.py +0 -0
  193. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/manifest_xml.py +0 -0
  194. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/pager.py +0 -0
  195. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/platform_utils.py +0 -0
  196. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/platform_utils_win32.py +0 -0
  197. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/progress.py +0 -0
  198. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/project.py +0 -0
  199. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/repo +0 -0
  200. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/repo_logging.py +0 -0
  201. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/repo_trace.py +0 -0
  202. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/requirements.jsonc +0 -0
  203. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/ssh.py +0 -0
  204. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/__init__.py +0 -0
  205. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/abandon.py +0 -0
  206. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/branches.py +0 -0
  207. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/checkout.py +0 -0
  208. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/cherry_pick.py +0 -0
  209. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/diff.py +0 -0
  210. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/diffmanifests.py +0 -0
  211. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/download.py +0 -0
  212. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/envsubst.py +0 -0
  213. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/forall.py +0 -0
  214. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/gc.py +0 -0
  215. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/grep.py +0 -0
  216. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/help.py +0 -0
  217. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/info.py +0 -0
  218. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/init.py +0 -0
  219. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/list.py +0 -0
  220. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/manifest.py +0 -0
  221. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/overview.py +0 -0
  222. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/prune.py +0 -0
  223. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/rebase.py +0 -0
  224. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/selfupdate.py +0 -0
  225. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/smartsync.py +0 -0
  226. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/stage.py +0 -0
  227. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/start.py +0 -0
  228. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/status.py +0 -0
  229. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/sync.py +0 -0
  230. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/subcmds/upload.py +0 -0
  231. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/version_constraints.py +0 -0
  232. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/repo/wrapper.py +0 -0
  233. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/utils/__init__.py +0 -0
  234. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/utils/concurrency.py +0 -0
  235. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/utils/levenshtein.py +0 -0
  236. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/utils/lock_file_path.py +0 -0
  237. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/utils/spawn.py +0 -0
  238. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/src/kanon_cli/version.py +0 -0
  239. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/__init__.py +0 -0
  240. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/catalog/broken-soft-spot-1/repo-specs/duplicate-child-marketplace.xml +0 -0
  241. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/catalog/broken-soft-spot-1/repo-specs/missing-recommended-marketplace.xml +0 -0
  242. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/catalog/broken-soft-spot-1/repo-specs/missing-required-marketplace.xml +0 -0
  243. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/catalog/broken-soft-spot-1/repo-specs/multiple-blocks-marketplace.xml +0 -0
  244. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/catalog/broken-soft-spot-2/repo-specs/dotted-name-marketplace.xml +0 -0
  245. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/catalog/broken-soft-spot-2/repo-specs/hyphenated-name-marketplace.xml +0 -0
  246. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/catalog/broken-soft-spot-2/repo-specs/uppercase-name-marketplace.xml +0 -0
  247. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/catalog/broken-soft-spot-3/repo-specs/group-a-1-marketplace.xml +0 -0
  248. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/catalog/broken-soft-spot-3/repo-specs/group-a-2-marketplace.xml +0 -0
  249. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/catalog/broken-soft-spot-3/repo-specs/group-b-1-marketplace.xml +0 -0
  250. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/catalog/broken-soft-spot-3/repo-specs/group-b-2-marketplace.xml +0 -0
  251. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/catalog/broken-soft-spot-4/repo-specs/file-url-marketplace.xml +0 -0
  252. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/catalog/broken-soft-spot-4/repo-specs/query-string-marketplace.xml +0 -0
  253. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/catalog/broken-soft-spot-4/repo-specs/unresolvable-marketplace.xml +0 -0
  254. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/catalog/legacy-catalog-dir/catalog/sample-entry/.kanon +0 -0
  255. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/catalog/legacy-catalog-dir/repo-specs/sample.xml +0 -0
  256. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/catalogs/zero-pep440-tags/README.md +0 -0
  257. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/catalogs/zero-pep440-tags/repo-specs/entry-a/entry-a-marketplace.xml +0 -0
  258. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/completion/__init__.py +0 -0
  259. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/completion/expected-powershell.ps1 +0 -0
  260. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/errors/README.md +0 -0
  261. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/errors/conflict-detected.txt +0 -0
  262. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/errors/entry-not-found.txt +0 -0
  263. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/errors/lockfile-hash-mismatch.txt +0 -0
  264. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/errors/lockfile-sha-unreachable.txt +0 -0
  265. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/errors/missing-catalog-source.txt +0 -0
  266. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/errors/missing-required-metadata-field.txt +0 -0
  267. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/errors/source-collision.txt +0 -0
  268. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/errors/zero-pep440-tags-under-prefix.txt +0 -0
  269. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/help/README.md +0 -0
  270. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/help/kanon-add.txt +0 -0
  271. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/help/kanon-catalog-audit.txt +0 -0
  272. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/help/kanon-catalog.txt +0 -0
  273. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/help/kanon-completion.txt +0 -0
  274. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/help/kanon-doctor.txt +0 -0
  275. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/help/kanon-install.txt +0 -0
  276. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/help/kanon-marketplace.txt +0 -0
  277. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/help/kanon-outdated.txt +0 -0
  278. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/help/kanon-remove.txt +0 -0
  279. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/help/kanon-search.txt +0 -0
  280. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/help/kanon-why.txt +0 -0
  281. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/repo/.gitignore +0 -0
  282. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/repo/README.md +0 -0
  283. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/repo/linter-test-bad.invalid-yaml +0 -0
  284. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/repo/linter-test-bad.md +0 -0
  285. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/repo/linter-test-bad.py +0 -0
  286. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/repo/sample-manifest.xml +0 -0
  287. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/repo/sample-project-config.json +0 -0
  288. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/repo/test.gitconfig +0 -0
  289. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/fixtures/repo/version_constraints_data.json +0 -0
  290. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/__init__.py +0 -0
  291. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/conftest.py +0 -0
  292. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_add_alias_journey.py +0 -0
  293. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_alias_consumer_journey.py +0 -0
  294. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_argparse_errors.py +0 -0
  295. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_argparse_help.py +0 -0
  296. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_ci_runs_operator_path_tests.py +0 -0
  297. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_cli_entry_point.py +0 -0
  298. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_completion_snapshots.py +0 -0
  299. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_default_branch_journey.py +0 -0
  300. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_env_int_guard_journey.py +0 -0
  301. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_error_snapshots.py +0 -0
  302. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_exit_code_matrix.py +0 -0
  303. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_groups_filter.py +0 -0
  304. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_help_snapshots.py +0 -0
  305. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_help_text_contract.py +0 -0
  306. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_home_flag_unwritable_journey.py +0 -0
  307. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_init_default_branch_prerequisite_journey.py +0 -0
  308. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_install_hermetic_journey.py +0 -0
  309. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_install_real_kanon.py +0 -0
  310. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_install_v3_lock_fail_fast_journey.py +0 -0
  311. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_kanon_home_store_journey.py +0 -0
  312. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_kanon_repo_cli.py +0 -0
  313. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_kanon_repo_e2e.py +0 -0
  314. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_kanon_repo_lifecycle_journey.py +0 -0
  315. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_lifecycle_journey.py +0 -0
  316. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_make_operator_path_targets.py +0 -0
  317. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_marketplace_journey.py +0 -0
  318. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_matrix_traceability_complete.py +0 -0
  319. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_provider_agnostic.py +0 -0
  320. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_abandon_errors.py +0 -0
  321. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_abandon_flags.py +0 -0
  322. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_abandon_happy.py +0 -0
  323. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_branches_errors.py +0 -0
  324. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_branches_flags.py +0 -0
  325. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_branches_happy.py +0 -0
  326. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_checkout_errors.py +0 -0
  327. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_checkout_flags.py +0 -0
  328. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_checkout_happy.py +0 -0
  329. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_cherry_pick_errors.py +0 -0
  330. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_cherry_pick_flags.py +0 -0
  331. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_cherry_pick_happy.py +0 -0
  332. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_diff_errors.py +0 -0
  333. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_diff_flags.py +0 -0
  334. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_diff_happy.py +0 -0
  335. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_diffmanifests_errors.py +0 -0
  336. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_diffmanifests_flags.py +0 -0
  337. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_diffmanifests_happy.py +0 -0
  338. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_dir_override.py +0 -0
  339. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_download_errors.py +0 -0
  340. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_download_flags.py +0 -0
  341. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_download_happy.py +0 -0
  342. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_envsubst_errors.py +0 -0
  343. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_envsubst_flags.py +0 -0
  344. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_envsubst_happy.py +0 -0
  345. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_exit_codes.py +0 -0
  346. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_forall_errors.py +0 -0
  347. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_forall_flags.py +0 -0
  348. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_forall_happy.py +0 -0
  349. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_gc_errors.py +0 -0
  350. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_gc_flags.py +0 -0
  351. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_gc_happy.py +0 -0
  352. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_grep_errors.py +0 -0
  353. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_grep_flags.py +0 -0
  354. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_grep_happy.py +0 -0
  355. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_help_errors.py +0 -0
  356. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_help_flags.py +0 -0
  357. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_help_happy.py +0 -0
  358. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_info_errors.py +0 -0
  359. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_info_flags.py +0 -0
  360. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_info_happy.py +0 -0
  361. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_init_errors.py +0 -0
  362. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_init_flags.py +0 -0
  363. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_init_happy.py +0 -0
  364. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_init_mirror.py +0 -0
  365. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_list_errors.py +0 -0
  366. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_list_flags.py +0 -0
  367. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_list_happy.py +0 -0
  368. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_manifest_errors.py +0 -0
  369. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_manifest_flags.py +0 -0
  370. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_manifest_happy.py +0 -0
  371. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_manifest_revision_as_tag.py +0 -0
  372. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_overview_errors.py +0 -0
  373. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_overview_flags.py +0 -0
  374. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_overview_happy.py +0 -0
  375. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_passthrough.py +0 -0
  376. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_prune_errors.py +0 -0
  377. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_prune_flags.py +0 -0
  378. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_prune_happy.py +0 -0
  379. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_rebase_errors.py +0 -0
  380. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_rebase_flags.py +0 -0
  381. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_rebase_happy.py +0 -0
  382. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_selfupdate_disabled.py +0 -0
  383. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_selfupdate_errors.py +0 -0
  384. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_selfupdate_flags.py +0 -0
  385. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_selfupdate_happy.py +0 -0
  386. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_smartsync_errors.py +0 -0
  387. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_smartsync_flags.py +0 -0
  388. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_smartsync_happy.py +0 -0
  389. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_stage_errors.py +0 -0
  390. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_stage_flags.py +0 -0
  391. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_stage_happy.py +0 -0
  392. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_start_errors.py +0 -0
  393. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_start_flags.py +0 -0
  394. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_start_happy.py +0 -0
  395. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_status_errors.py +0 -0
  396. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_status_flags.py +0 -0
  397. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_status_happy.py +0 -0
  398. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_sync_errors.py +0 -0
  399. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_sync_flags.py +0 -0
  400. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_sync_happy.py +0 -0
  401. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_upload_errors.py +0 -0
  402. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_upload_flags.py +0 -0
  403. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_repo_upload_happy.py +0 -0
  404. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_singular_catalog_source_inert.py +0 -0
  405. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_stdout_stderr_discipline.py +0 -0
  406. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_update_alert_journey.py +0 -0
  407. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_validate_journey.py +0 -0
  408. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_validate_lifecycle.py +0 -0
  409. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_validate_lockfile.py +0 -0
  410. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_validate_marketplace.py +0 -0
  411. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_validate_xml_errors.py +0 -0
  412. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_validate_xml_repo_root.py +0 -0
  413. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/functional/test_zero_source_clean_error.py +0 -0
  414. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/__init__.py +0 -0
  415. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/conftest.py +0 -0
  416. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/fixtures/__init__.py +0 -0
  417. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/fixtures/synthetic/__init__.py +0 -0
  418. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/fixtures/synthetic/conftest.py +0 -0
  419. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/fixtures/synthetic/drift.py +0 -0
  420. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/fixtures/synthetic/test_synthetic_pytest_fixtures.py +0 -0
  421. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/fixtures/synthetic/upgrade_versioned.py +0 -0
  422. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/provider_allowlist.txt +0 -0
  423. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/__init__.py +0 -0
  424. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/conftest.py +0 -0
  425. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_bug_fixes.py +0 -0
  426. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_consolidated_constraints_e2e.py +0 -0
  427. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_envsubst_integration.py +0 -0
  428. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_import_functional.py +0 -0
  429. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_linkfile_copyfile.py +0 -0
  430. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_linkfile_exclude_journey.py +0 -0
  431. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_manifest_parsing.py +0 -0
  432. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_process_isolation.py +0 -0
  433. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_repo_module_smoke.py +0 -0
  434. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_repo_pipeline.py +0 -0
  435. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_repo_run_lifecycle.py +0 -0
  436. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_repo_sync_lifecycle.py +0 -0
  437. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_version_constraints_integration.py +0 -0
  438. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_xml_annotation_roundtrip.py +0 -0
  439. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_xml_contactinfo_roundtrip.py +0 -0
  440. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_xml_copyfile_roundtrip.py +0 -0
  441. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_xml_default_roundtrip.py +0 -0
  442. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_xml_extend_project_roundtrip.py +0 -0
  443. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_xml_include_roundtrip.py +0 -0
  444. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_xml_linkfile_roundtrip.py +0 -0
  445. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_xml_manifest_roundtrip.py +0 -0
  446. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_xml_manifest_server_roundtrip.py +0 -0
  447. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_xml_notice_roundtrip.py +0 -0
  448. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_xml_project_roundtrip.py +0 -0
  449. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_xml_remote_roundtrip.py +0 -0
  450. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_xml_remove_project_roundtrip.py +0 -0
  451. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_xml_repo_hooks_roundtrip.py +0 -0
  452. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_xml_submanifest_roundtrip.py +0 -0
  453. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/repo/test_xml_superproject_roundtrip.py +0 -0
  454. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_add_core.py +0 -0
  455. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_add_dry_run.py +0 -0
  456. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_add_env_var_detection.py +0 -0
  457. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_add_zero_tags.py +0 -0
  458. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_auto_discovery.py +0 -0
  459. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_background_refresh.py +0 -0
  460. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_cache_clock_skew.py +0 -0
  461. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_cache_layout.py +0 -0
  462. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_catalog_audit_entry_uniqueness.py +0 -0
  463. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_catalog_audit_framework.py +0 -0
  464. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_catalog_audit_legacy_dir.py +0 -0
  465. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_catalog_audit_metadata.py +0 -0
  466. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_catalog_audit_remote_url.py +0 -0
  467. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_catalog_audit_source_name.py +0 -0
  468. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_catalog_audit_strict.py +0 -0
  469. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_catalog_audit_tag_format.py +0 -0
  470. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_catalog_constraints.py +0 -0
  471. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_ci_validation.py +0 -0
  472. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_clean_env_override_cleanup.py +0 -0
  473. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_cli_entry_points.py +0 -0
  474. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_complete_cached_catalogs.py +0 -0
  475. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_complete_catalog_entries.py +0 -0
  476. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_complete_catalog_versions.py +0 -0
  477. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_complete_lockfile_names.py +0 -0
  478. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_complete_project_versions.py +0 -0
  479. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_complete_source_names.py +0 -0
  480. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_completion_bash.py +0 -0
  481. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_completion_powershell_subcommand.py +0 -0
  482. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_completion_subcommand.py +0 -0
  483. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_completion_zsh.py +0 -0
  484. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_concurrency_serialization.py +0 -0
  485. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_copyfile_fs_effects.py +0 -0
  486. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_cross_platform_contract.py +0 -0
  487. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_doc_validation.py +0 -0
  488. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_doctor_cache_flags.py +0 -0
  489. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_doctor_cache_flags_workspace_independent.py +0 -0
  490. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_doctor_consistency.py +0 -0
  491. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_doctor_default_subcheck_output.py +0 -0
  492. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_doctor_effective_source.py +0 -0
  493. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_doctor_prune_cache.py +0 -0
  494. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_doctor_remote_check.py +0 -0
  495. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_envsubst_command.py +0 -0
  496. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_fs_fault_extended.py +0 -0
  497. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_full_lifecycle_synthetic.py +0 -0
  498. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_git_fault_injection.py +0 -0
  499. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_git_retry_env.py +0 -0
  500. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_home_flag_store_relocation.py +0 -0
  501. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_after_add.py +0 -0
  502. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_command.py +0 -0
  503. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_env_var_resolution.py +0 -0
  504. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_errors.py +0 -0
  505. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_include_cycle.py +0 -0
  506. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_include_diamond.py +0 -0
  507. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_lock_file_derivation.py +0 -0
  508. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_lockfile_replay.py +0 -0
  509. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_marketplace_registration.py +0 -0
  510. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_no_kanon_remediation.py +0 -0
  511. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_optional_vars.py +0 -0
  512. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_path_conflict_integration.py +0 -0
  513. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_paths.py +0 -0
  514. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_per_alias_gitbase.py +0 -0
  515. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_reconcile.py +0 -0
  516. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_refresh_lock.py +0 -0
  517. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_refresh_lock_source.py +0 -0
  518. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_remote_url_policy.py +0 -0
  519. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_required_vars.py +0 -0
  520. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_install_strict.py +0 -0
  521. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_json_output_stream_discipline.py +0 -0
  522. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_kanon_add_placeholder_handling.py +0 -0
  523. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_kanonenv_parsing.py +0 -0
  524. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_linkfile_fs_effects.py +0 -0
  525. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_list_all_versions.py +0 -0
  526. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_list_all_versions_canonical.py +0 -0
  527. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_list_all_versions_malformed_revision_resilience.py +0 -0
  528. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_list_default.py +0 -0
  529. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_list_detail.py +0 -0
  530. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_list_filter.py +0 -0
  531. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_list_format_json.py +0 -0
  532. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_list_synthetic_catalog_variants.py +0 -0
  533. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_list_tree.py +0 -0
  534. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_lockfile_roundtrip.py +0 -0
  535. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_marketplace_install.py +0 -0
  536. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_marketplace_lifecycle.py +0 -0
  537. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_marketplace_orphan_prune.py +0 -0
  538. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_midtoken_bash.py +0 -0
  539. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_midtoken_zsh.py +0 -0
  540. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_multi_source_aggregation.py +0 -0
  541. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_no_bundled_catalog.py +0 -0
  542. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_no_default_catalog.py +0 -0
  543. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_no_hardcoded_org_values.py +0 -0
  544. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_observability.py +0 -0
  545. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_outdated.py +0 -0
  546. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_outdated_branch_drift.py +0 -0
  547. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_outdated_fail_on_upgrade.py +0 -0
  548. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_outdated_format_json.py +0 -0
  549. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_platform_parity.py +0 -0
  550. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_preamble_bash.py +0 -0
  551. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_preamble_zsh.py +0 -0
  552. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_remove_core.py +0 -0
  553. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_remove_dry_run.py +0 -0
  554. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_remove_force_integration.py +0 -0
  555. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_signal_handling.py +0 -0
  556. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_synthetic_drift_fixture.py +0 -0
  557. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_synthetic_upgrade_versioned_fixture.py +0 -0
  558. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_unicode_encoding.py +0 -0
  559. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_validate_marketplace.py +0 -0
  560. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_validate_marketplace_revision_existence.py +0 -0
  561. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_validate_metadata.py +0 -0
  562. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_validate_xml.py +0 -0
  563. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_version_resolution.py +0 -0
  564. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_version_widened_bare_pep440.py +0 -0
  565. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_wheel_e2e.py +0 -0
  566. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_why_chain_walker.py +0 -0
  567. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_why_format_json.py +0 -0
  568. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_why_live_resolve.py +0 -0
  569. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_why_not_found_suggestion.py +0 -0
  570. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/integration/test_workspace_dir_env.py +0 -0
  571. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/regression/test_e0_f1_s2_t5_regression.py +0 -0
  572. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/regression/test_e0_f5_s2_t7_regression.py +0 -0
  573. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/regression/test_e0_f6_s1_t1_regression.py +0 -0
  574. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/regression/test_e0_f6_s1_t2_regression.py +0 -0
  575. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/regression/test_e0_f6_s1_t3_regression.py +0 -0
  576. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/regression/test_e0_f6_s1_t4_regression.py +0 -0
  577. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/regression/test_e0_f6_s2_t1_regression.py +0 -0
  578. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/regression/test_e0_f6_s2_t2_regression.py +0 -0
  579. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/regression/test_e0_f6_s2_t3_regression.py +0 -0
  580. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/regression/test_e0_f6_s2_t4_regression.py +0 -0
  581. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/regression/test_e0_f6_s2_t5_regression.py +0 -0
  582. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/regression/test_e0_f6_s2_t6_regression.py +0 -0
  583. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/regression/test_e0_f6_s3_t1_regression.py +0 -0
  584. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/regression/test_e0_f6_s3_t2_regression.py +0 -0
  585. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/regression/test_e0_install_relative_regression.py +0 -0
  586. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/__init__.py +0 -0
  587. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/_rp_helpers.py +0 -0
  588. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/conftest.py +0 -0
  589. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_ad.py +0 -0
  590. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_bs.py +0 -0
  591. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_cd.py +0 -0
  592. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_content_pins.py +0 -0
  593. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_cs.py +0 -0
  594. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_doctor_cache.py +0 -0
  595. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_doctor_journey.py +0 -0
  596. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_ec.py +0 -0
  597. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_ep.py +0 -0
  598. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_ev.py +0 -0
  599. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_hv.py +0 -0
  600. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_id.py +0 -0
  601. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_ks.py +0 -0
  602. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_lf.py +0 -0
  603. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_lockfile_lifecycle.py +0 -0
  604. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_marketplace_direct_checkout.py +0 -0
  605. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_mk.py +0 -0
  606. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_ms.py +0 -0
  607. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_ns_marketplace_and_global_flags.py +0 -0
  608. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_outdated_two_source.py +0 -0
  609. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rc.py +0 -0
  610. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_refresh_lock_existing_checkout.py +0 -0
  611. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rls_exact_vs_range.py +0 -0
  612. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_abandon.py +0 -0
  613. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_branches.py +0 -0
  614. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_checkout.py +0 -0
  615. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_cherry_pick.py +0 -0
  616. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_diff.py +0 -0
  617. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_diffmanifests.py +0 -0
  618. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_download.py +0 -0
  619. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_envsubst.py +0 -0
  620. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_forall.py +0 -0
  621. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_gc.py +0 -0
  622. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_grep.py +0 -0
  623. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_help.py +0 -0
  624. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_info.py +0 -0
  625. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_init.py +0 -0
  626. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_list.py +0 -0
  627. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_manifest.py +0 -0
  628. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_overview.py +0 -0
  629. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_prune.py +0 -0
  630. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_rebase.py +0 -0
  631. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_smartsync.py +0 -0
  632. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_stage.py +0 -0
  633. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_start.py +0 -0
  634. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_status.py +0 -0
  635. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_sync.py +0 -0
  636. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_upload.py +0 -0
  637. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rp_wrap.py +0 -0
  638. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_rx.py +0 -0
  639. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_scenario_coverage_meta.py +0 -0
  640. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_search_multi_source.py +0 -0
  641. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_tc_bootstrap.py +0 -0
  642. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_tc_install.py +0 -0
  643. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_tc_validate.py +0 -0
  644. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_va.py +0 -0
  645. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_va_validate_lockfile.py +0 -0
  646. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_why_surface_query.py +0 -0
  647. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_why_url_path.py +0 -0
  648. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/scenarios/test_why_url_path_placeholder.py +0 -0
  649. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/security/__init__.py +0 -0
  650. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/security/test_security_hardening.py +0 -0
  651. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/test_wheel_layout.py +0 -0
  652. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/__init__.py +0 -0
  653. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/commands/test_repo_dir_resolution.py +0 -0
  654. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/conftest.py +0 -0
  655. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/__init__.py +0 -0
  656. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/conftest.py +0 -0
  657. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/fixtures/.gitignore +0 -0
  658. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/fixtures/README.md +0 -0
  659. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/fixtures/sample-manifest.xml +0 -0
  660. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/fixtures/sample-project-config.json +0 -0
  661. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/fixtures/test.gitconfig +0 -0
  662. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/fixtures/version_constraints_data.json +0 -0
  663. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/functional/__init__.py +0 -0
  664. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/functional/test_features.py +0 -0
  665. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/subcmds/__init__.py +0 -0
  666. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/subcmds/test_init_mirror.py +0 -0
  667. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/subcmds/test_manifest_revision_as_tag.py +0 -0
  668. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/subcmds/test_manifest_revision_as_tag_pep440.py +0 -0
  669. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/subcmds/test_selfupdate_stub.py +0 -0
  670. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_abandon_massive.py +0 -0
  671. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_branches_coverage.py +0 -0
  672. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_bug10_selfupdate_incompatible.py +0 -0
  673. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_bug11_race_condition.py +0 -0
  674. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_bug12_backup_preserved.py +0 -0
  675. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_bug13_init_reinit_warning.py +0 -0
  676. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_bug14_non_tty_log.py +0 -0
  677. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_bug15_prerelease_docs.py +0 -0
  678. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_bug16_nested_var_warning.py +0 -0
  679. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_bug18_envsubst_double_parse.py +0 -0
  680. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_bug19_glob_src_error.py +0 -0
  681. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_bug1_envsubst_malformed_xml.py +0 -0
  682. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_bug20_glob_dest_file.py +0 -0
  683. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_bug2_linkfile_errors.py +0 -0
  684. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_bug3_execv_replaces_process.py +0 -0
  685. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_bug4_symlink_overwrite.py +0 -0
  686. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_bug5_empty_envsubst_list.py +0 -0
  687. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_bug6_undefined_env_vars.py +0 -0
  688. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_bug7_git_ls_remote_retry.py +0 -0
  689. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_bug8_ls_remote_stderr.py +0 -0
  690. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_bug9_constraint_resolution_cache.py +0 -0
  691. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_checklocalpath_rules_1_5.py +0 -0
  692. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_checklocalpath_rules_6_11.py +0 -0
  693. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_checkout_massive.py +0 -0
  694. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_cherrypick_coverage.py +0 -0
  695. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_color.py +0 -0
  696. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_command.py +0 -0
  697. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_conftest_fixtures.py +0 -0
  698. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_diffmanifests_deep.py +0 -0
  699. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_doc_validate_git_preconditions.py +0 -0
  700. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_download_coverage.py +0 -0
  701. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_editor.py +0 -0
  702. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_embedded_mode.py +0 -0
  703. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_envsubst_basic.py +0 -0
  704. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_envsubst_edge.py +0 -0
  705. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_envsubst_massive.py +0 -0
  706. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_error.py +0 -0
  707. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_event_log.py +0 -0
  708. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_event_log_massive.py +0 -0
  709. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_fetch.py +0 -0
  710. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_fixture_files.py +0 -0
  711. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_forall_deep.py +0 -0
  712. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_git_command.py +0 -0
  713. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_git_config.py +0 -0
  714. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_git_refs.py +0 -0
  715. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_git_superproject.py +0 -0
  716. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_git_trace2_event_log.py +0 -0
  717. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_gitconfig_coverage.py +0 -0
  718. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_grep_deep.py +0 -0
  719. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_harness_smoke.py +0 -0
  720. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_hooks.py +0 -0
  721. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_import_verification.py +0 -0
  722. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_imports.py +0 -0
  723. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_include_path_resolution.py +0 -0
  724. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_info_deep.py +0 -0
  725. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_init_deep.py +0 -0
  726. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_list_massive.py +0 -0
  727. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_main.py +0 -0
  728. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_main_coverage.py +0 -0
  729. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_main_init_download_boost.py +0 -0
  730. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_makefile_lint_format.py +0 -0
  731. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_makefile_structure.py +0 -0
  732. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_makefile_test_targets.py +0 -0
  733. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_manifest_coverage_boost.py +0 -0
  734. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_manifest_deep.py +0 -0
  735. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_manifest_doc_rp_flags.py +0 -0
  736. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_manifest_massive.py +0 -0
  737. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_manifest_subcmd_massive.py +0 -0
  738. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_manifest_xml.py +0 -0
  739. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_manifest_xml_pep440.py +0 -0
  740. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_medium_files_boost.py +0 -0
  741. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_mkdtemp_cleanup.py +0 -0
  742. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_overview_massive.py +0 -0
  743. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_package_structure.py +0 -0
  744. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_pager.py +0 -0
  745. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_parselist.py +0 -0
  746. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_pep440_edge_1.py +0 -0
  747. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_pep440_edge_2.py +0 -0
  748. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_pep440_ops_ge.py +0 -0
  749. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_pep440_ops_rest.py +0 -0
  750. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_platform_utils.py +0 -0
  751. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_process_isolation.py +0 -0
  752. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_progress.py +0 -0
  753. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_project.py +0 -0
  754. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_project_coverage_boost.py +0 -0
  755. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_project_coverage_threshold.py +0 -0
  756. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_project_deep.py +0 -0
  757. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_project_deep_boost.py +0 -0
  758. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_project_final_boost.py +0 -0
  759. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_project_integration.py +0 -0
  760. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_project_massive.py +0 -0
  761. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_project_metaproject_boost.py +0 -0
  762. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_project_methods.py +0 -0
  763. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_project_sync.py +0 -0
  764. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_prune_massive.py +0 -0
  765. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_rebase_coverage.py +0 -0
  766. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_remaining_coverage_boost.py +0 -0
  767. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_repo_envsubst_api.py +0 -0
  768. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_repo_logging.py +0 -0
  769. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_repo_run_api.py +0 -0
  770. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_repo_sync_api.py +0 -0
  771. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_repo_trace.py +0 -0
  772. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_revision_inheritance.py +0 -0
  773. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_revision_tag_branch_sha.py +0 -0
  774. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_ruff_config.py +0 -0
  775. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_selfupdate_embedded.py +0 -0
  776. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_selfupdate_massive.py +0 -0
  777. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_small_files_boost.py +0 -0
  778. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_ssh.py +0 -0
  779. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_ssh_deep.py +0 -0
  780. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_stage_coverage.py +0 -0
  781. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_stage_massive.py +0 -0
  782. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_start_coverage.py +0 -0
  783. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_status_coverage.py +0 -0
  784. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_status_gaps.py +0 -0
  785. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_status_massive.py +0 -0
  786. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmd_imports.py +0 -0
  787. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds.py +0 -0
  788. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_abandon.py +0 -0
  789. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_branches.py +0 -0
  790. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_checkout.py +0 -0
  791. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_cherry_pick.py +0 -0
  792. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_diff.py +0 -0
  793. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_diffmanifests.py +0 -0
  794. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_download.py +0 -0
  795. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_envsubst.py +0 -0
  796. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_forall.py +0 -0
  797. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_gc.py +0 -0
  798. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_grep.py +0 -0
  799. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_help.py +0 -0
  800. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_info.py +0 -0
  801. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_init.py +0 -0
  802. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_list.py +0 -0
  803. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_manifest.py +0 -0
  804. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_overview.py +0 -0
  805. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_prune.py +0 -0
  806. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_rebase.py +0 -0
  807. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_selfupdate.py +0 -0
  808. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_smartsync.py +0 -0
  809. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_stage.py +0 -0
  810. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_start.py +0 -0
  811. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_status.py +0 -0
  812. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_sync.py +0 -0
  813. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_subcmds_upload.py +0 -0
  814. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_superproject_deep.py +0 -0
  815. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_sync_coverage_boost.py +0 -0
  816. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_sync_deep.py +0 -0
  817. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_sync_deep_boost.py +0 -0
  818. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_sync_massive.py +0 -0
  819. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_upload_deep.py +0 -0
  820. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_version_consolidation.py +0 -0
  821. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_version_constraints.py +0 -0
  822. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_wheel_contents.py +0 -0
  823. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_wrapper.py +0 -0
  824. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_annotation_attributes.py +0 -0
  825. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_annotation_crossref.py +0 -0
  826. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_annotation_happy.py +0 -0
  827. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_contactinfo_attributes.py +0 -0
  828. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_contactinfo_crossref.py +0 -0
  829. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_contactinfo_happy.py +0 -0
  830. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_copyfile_attributes.py +0 -0
  831. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_copyfile_crossref.py +0 -0
  832. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_copyfile_happy.py +0 -0
  833. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_default_attributes.py +0 -0
  834. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_default_crossref.py +0 -0
  835. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_default_happy.py +0 -0
  836. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_extend_project_attributes.py +0 -0
  837. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_extend_project_crossref.py +0 -0
  838. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_extend_project_happy.py +0 -0
  839. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_fault_malformed.py +0 -0
  840. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_fault_structural.py +0 -0
  841. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_include_attributes.py +0 -0
  842. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_include_crossref.py +0 -0
  843. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_include_cycles.py +0 -0
  844. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_include_happy.py +0 -0
  845. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_linkfile_attributes.py +0 -0
  846. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_linkfile_crossref.py +0 -0
  847. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_linkfile_happy.py +0 -0
  848. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_manifest_attributes.py +0 -0
  849. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_manifest_crossref.py +0 -0
  850. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_manifest_happy.py +0 -0
  851. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_manifest_server_attributes.py +0 -0
  852. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_manifest_server_crossref.py +0 -0
  853. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_manifest_server_flow.py +0 -0
  854. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_manifest_server_happy.py +0 -0
  855. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_notice_attributes.py +0 -0
  856. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_notice_crossref.py +0 -0
  857. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_notice_happy.py +0 -0
  858. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_project_attributes.py +0 -0
  859. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_project_crossref.py +0 -0
  860. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_project_happy.py +0 -0
  861. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_remote_attributes.py +0 -0
  862. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_remote_crossref.py +0 -0
  863. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_remote_happy.py +0 -0
  864. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_remove_project_attributes.py +0 -0
  865. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_remove_project_crossref.py +0 -0
  866. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_remove_project_happy.py +0 -0
  867. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_repo_hooks_attributes.py +0 -0
  868. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_repo_hooks_crossref.py +0 -0
  869. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_repo_hooks_happy.py +0 -0
  870. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_submanifest_attributes.py +0 -0
  871. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_submanifest_crossref.py +0 -0
  872. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_submanifest_happy.py +0 -0
  873. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_superproject_attributes.py +0 -0
  874. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_superproject_crossref.py +0 -0
  875. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_superproject_flow.py +0 -0
  876. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xml_superproject_happy.py +0 -0
  877. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xmlbool.py +0 -0
  878. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_xmlint.py +0 -0
  879. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/repo/test_yamllint_config.py +0 -0
  880. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_accessed_at_coalescing.py +0 -0
  881. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_add.py +0 -0
  882. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_add_collision.py +0 -0
  883. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_add_zero_tags.py +0 -0
  884. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_background_refresh.py +0 -0
  885. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_bare_semver_to_tag.py +0 -0
  886. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_cache.py +0 -0
  887. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_cache_ttl.py +0 -0
  888. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_cached_catalogs.py +0 -0
  889. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_catalog.py +0 -0
  890. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_catalog_audit_check_parser.py +0 -0
  891. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_catalog_audit_entry_uniqueness.py +0 -0
  892. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_catalog_audit_framework.py +0 -0
  893. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_catalog_audit_legacy_dir.py +0 -0
  894. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_catalog_audit_metadata.py +0 -0
  895. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_catalog_audit_project_tag_format.py +0 -0
  896. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_catalog_audit_remote_url.py +0 -0
  897. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_catalog_audit_source_name.py +0 -0
  898. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_catalog_audit_strict.py +0 -0
  899. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_catalog_audit_tag_format.py +0 -0
  900. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_catalog_source_parsing.py +0 -0
  901. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_check_no_comments.py +0 -0
  902. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_ci_workflows.py +0 -0
  903. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_cli.py +0 -0
  904. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_cli_args.py +0 -0
  905. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_cli_help_format.py +0 -0
  906. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_cli_json_stream_discipline.py +0 -0
  907. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_complete_cached_catalogs.py +0 -0
  908. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_complete_catalog_entries.py +0 -0
  909. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_complete_catalog_versions.py +0 -0
  910. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_complete_lockfile_names.py +0 -0
  911. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_complete_project_versions.py +0 -0
  912. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_complete_source_names.py +0 -0
  913. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_completion.py +0 -0
  914. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_completion_sanitization.py +0 -0
  915. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_completion_subcommand.py +0 -0
  916. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_concurrency.py +0 -0
  917. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_conftest_scrubber.py +0 -0
  918. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_constants_doctor_subcheck.py +0 -0
  919. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_constants_env_int.py +0 -0
  920. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_constants_install_after_add.py +0 -0
  921. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_constants_why_lockfile.py +0 -0
  922. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_derive_source_name.py +0 -0
  923. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_discover.py +0 -0
  924. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_discover_source_names_missing_url.py +0 -0
  925. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_docs_embedded_architecture.py +0 -0
  926. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_docs_remaining_and_catalog.py +0 -0
  927. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_doctor.py +0 -0
  928. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_doctor_cache_flags.py +0 -0
  929. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_doctor_completion_errors.py +0 -0
  930. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_doctor_completion_staleness.py +0 -0
  931. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_doctor_consistency.py +0 -0
  932. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_doctor_coverage_gaps.py +0 -0
  933. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_doctor_effective_source.py +0 -0
  934. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_doctor_remote_reachability.py +0 -0
  935. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_env_isolation.py +0 -0
  936. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_envsubst_subcommand.py +0 -0
  937. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_git_runner.py +0 -0
  938. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_include_walker.py +0 -0
  939. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_install_color_default.py +0 -0
  940. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_install_command.py +0 -0
  941. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_install_conflict_detection.py +0 -0
  942. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_install_https_enforcement.py +0 -0
  943. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_install_placeholder_validation.py +0 -0
  944. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_install_reconcile_decision.py +0 -0
  945. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_install_refresh_lock.py +0 -0
  946. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_install_refresh_lock_source.py +0 -0
  947. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_install_state_matrix.py +0 -0
  948. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_install_strict_flags.py +0 -0
  949. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_install_strict_lock_orphan_naming.py +0 -0
  950. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_integration_testing_doc_manifest_paths.py +0 -0
  951. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_integration_testing_doc_s2_t14.py +0 -0
  952. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_integration_testing_doc_s2_t4.py +0 -0
  953. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_integration_testing_doc_s2_t5.py +0 -0
  954. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_integration_testing_doc_s2_t6.py +0 -0
  955. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_integration_testing_doc_s2_t7.py +0 -0
  956. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_integration_testing_doc_s2_tier1.py +0 -0
  957. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_kanon_hash.py +0 -0
  958. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_kanonenv.py +0 -0
  959. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_kanonenv_advanced_edge_cases.py +0 -0
  960. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_kanonenv_edge_cases.py +0 -0
  961. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_levenshtein.py +0 -0
  962. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_lock_file_path.py +0 -0
  963. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_lockfile.py +0 -0
  964. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_lockfile_coverage_gaps.py +0 -0
  965. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_lockfile_schema_migration.py +0 -0
  966. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_manifest.py +0 -0
  967. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_marketplace.py +0 -0
  968. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_marketplace_cmd.py +0 -0
  969. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_marketplace_install.py +0 -0
  970. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_marketplace_non_plugin_skip.py +0 -0
  971. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_marketplace_validator.py +0 -0
  972. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_metadata.py +0 -0
  973. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_midtoken_splitter.py +0 -0
  974. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_outdated.py +0 -0
  975. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_outdated_branch_pinned.py +0 -0
  976. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_outdated_fail_on_upgrade.py +0 -0
  977. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_outdated_format_json.py +0 -0
  978. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_pep440_filter.py +0 -0
  979. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_powershell.py +0 -0
  980. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_pre_push_hook.py +0 -0
  981. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_preamble.py +0 -0
  982. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_preamble_semver_tags.py +0 -0
  983. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_provider_agnosticism.py +0 -0
  984. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_pyproject_build_config.py +0 -0
  985. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_remote_url.py +0 -0
  986. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_remove.py +0 -0
  987. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_remove_dry_run.py +0 -0
  988. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_remove_force.py +0 -0
  989. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_remove_line_endings.py +0 -0
  990. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_repo.py +0 -0
  991. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_repo_abspath.py +0 -0
  992. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_repo_command.py +0 -0
  993. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_resolve_catalog_dir.py +0 -0
  994. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_revision_resolve.py +0 -0
  995. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_rx_catalog_sub_repo.py +0 -0
  996. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_sanitize.py +0 -0
  997. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_search.py +0 -0
  998. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_search_all_versions.py +0 -0
  999. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_search_coverage_gaps.py +0 -0
  1000. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_search_detail.py +0 -0
  1001. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_search_filter.py +0 -0
  1002. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_search_format_json.py +0 -0
  1003. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_search_tree.py +0 -0
  1004. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_spawn.py +0 -0
  1005. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_url.py +0 -0
  1006. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_validate.py +0 -0
  1007. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_validate_command.py +0 -0
  1008. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_validate_metadata.py +0 -0
  1009. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_version.py +0 -0
  1010. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_version_constraint_errors.py +0 -0
  1011. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_why.py +0 -0
  1012. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_why_format_json.py +0 -0
  1013. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_why_suggestions.py +0 -0
  1014. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tests/unit/test_xml_validator.py +0 -0
  1015. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tools/lint/check_no_comments.py +0 -0
  1016. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/tools/test_tmp_monitor.py +0 -0
  1017. {kanon_cli-3.1.0 → kanon_cli-3.2.0}/uv.lock +0 -0
@@ -2,8 +2,136 @@
2
2
 
3
3
 
4
4
 
5
+ ## v3.2.0 (2026-07-13)
6
+
7
+ ### Feature
8
+
9
+ * feat(clean): ~/.kanon-home store rename, .kanon-dir guard, --purge/--purge-all (store-only teardown with no .kanon), no unconditional .gitignore (#89)
10
+
11
+ * feat(clean): add --purge/--purge-all; default home store to ~/.kanon-home; clean error when .kanon is a directory
12
+
13
+ Three related changes so kanon works cleanly from any directory (including
14
+ $HOME) and can be fully torn down with the tool:
15
+
16
+ - Rename the default home store directory from ~/.kanon to ~/.kanon-home so it
17
+ no longer collides with the project .kanon config file. Running kanon from
18
+ $HOME previously crashed with a cryptic "Is a directory". Only the default
19
+ changes; the --home/--store-dir flag and KANON_HOME env are unchanged. No
20
+ auto-migration: a leftover ~/.kanon store is an orphaned cache, safe to delete.
21
+
22
+ - When a writer (add / remove / marketplace enable|disable) must read or write
23
+ the .kanon config FILE but finds a .kanon DIRECTORY there, fail fast with a
24
+ clean, actionable error naming the exact rm -rf <path> command and telling the
25
+ user to re-run, instead of the cryptic IsADirectoryError.
26
+
27
+ - Add kanon clean --purge (also delete this project's .kanon and .kanon.lock)
28
+ and kanon clean --purge-all (also remove the shared KANON_HOME store dir).
29
+ --purge-all validates it removes ONLY kanon-owned content: it refuses unsafe
30
+ KANON_HOME paths (filesystem root, your home, or a parent of home/cwd), removes
31
+ only the store/ and cache/ subdirs, and removes the home root only when empty;
32
+ any non-kanon entries are kept with a warning.
33
+
34
+ Tests: unit + integration + functional for all three changes (the
35
+ directory-collision guard for all writers and the --purge-all safety refusals
36
+ included). Docs and the clean/toplevel --help snapshots updated.
37
+
38
+ * test(clean): sync completion goldens and stub signature for --purge flags
39
+
40
+ The new kanon clean --purge / --purge-all flags changed the bash and zsh
41
+ shell-completion output, so regenerate the committed golden fixtures. Also
42
+ extend the clean() side-effect stub in the path-resolution integration test
43
+ to accept the new purge / purge_home keyword arguments, matching the updated
44
+ core clean() signature.
45
+
46
+ * fix(clean): remove the shared home store on --purge-all even when no .kanon is present
47
+
48
+ kanon clean --purge-all is machine-global: it must tear down the shared
49
+ KANON_HOME store even when there is no discoverable project .kanon (for example
50
+ right after kanon clean --purge deleted it). Previously it failed with
51
+ "No .kanon file found ..." and left ~/.kanon-home in place.
52
+
53
+ _run now detects the no-usable-.kanon case (auto-discovery FileNotFoundError, or
54
+ an explicit path that is not a file) and, when --purge-all is set, removes only
55
+ the shared home store via remove_kanon_home_store(), preserving every safety
56
+ refusal (filesystem root, the user home directory, an ancestor of the home or
57
+ current directory). Plain clean and --purge without --purge-all still require a
58
+ discoverable .kanon.
59
+
60
+ Regenerates the clean help snapshot and the zsh completion golden for the
61
+ updated --purge-all help text.
62
+
63
+ * fix(install): stop writing an unconditional .gitignore; keep only the in-git-repo store safety net
64
+
65
+ In the 3.x store model both gitignore writes targeted <KANON_HOME>/store/.gitignore.
66
+ kanon install wrote .packages/ and .kanon-data/ into that file unconditionally,
67
+ littering a .gitignore even for the default ~/.kanon-home (which is not a git
68
+ repo). Remove the unconditional write.
69
+
70
+ The store safety net (write_store_gitignore_if_in_git_repo) is retained: kanon
71
+ still writes <KANON_HOME>/store/.gitignore containing "*" ONLY when the store
72
+ sits inside a git working tree, so a KANON_HOME inside a repo never commits the
73
+ fetched-artifact cache (spec Section 3.5). With the default ~/.kanon-home, kanon
74
+ writes no .gitignore at all.
75
+
76
+ update_gitignore now requires its entries argument (the removed default was the
77
+ only unconditional caller). Tests that asserted the removed unconditional write
78
+ now assert the new behavior (no .gitignore for a non-git store); the append-helper
79
+ mechanics tests pass explicit entries; the safety-net tests are unchanged.
80
+
81
+ Docs (how-it-works, architecture, lifecycle, integration-testing) updated;
82
+ lifecycle also documents clean --purge-all running without a .kanon.
83
+
84
+ ---------
85
+
86
+ Co-authored-by: t <t@e.x> ([`d9b0ad1`](https://github.com/caylent-solutions/kanon/commit/d9b0ad1856ab58487b7ed3efdc3ff9d87b60b193))
87
+
88
+
89
+ ## v3.1.1 (2026-06-27)
90
+
91
+ ### Chore
92
+
93
+ * chore(release): 3.1.1 ([`890b026`](https://github.com/caylent-solutions/kanon/commit/890b026b47ca8820b41ca8d218658e50691254a2))
94
+
95
+ ### Fix
96
+
97
+ * fix: outdated handles namespaced/bare exact tags; why disambiguates same-URL sources (#87)
98
+
99
+ Two defects found during QA of 3.1.0 against the namespaced/bare catalog.
100
+
101
+ outdated (closes #85): _normalize_tag_revision_to_constraint only normalised a
102
+ bare refs/tags/<pep440> to ==<pep440>; for a namespaced refs/tags/<path>/<pep440>
103
+ it tried to parse the whole remainder as a Version, failed, and left the ref
104
+ unchanged, so _resolve_constraint_from_tags raised "invalid version constraint".
105
+ It now rewrites only the terminal version component while preserving the
106
+ namespace path, so kanon outdated works for the default exact-tag add of both
107
+ namespaced and bare entries.
108
+
109
+ why (closes #86): when several sources resolve from the same repo URL at
110
+ different commits (now a supported config), the ambiguity message printed N
111
+ identical "source URL: <url>" tokens, so the operator could not disambiguate.
112
+ _identity_token now returns the source alias (its derive_source_name identity)
113
+ for a URL match on a source node, labelled "source name" -- the tokens are
114
+ distinct and round-trip through the existing source-name grammar
115
+ (kanon why <alias>). Project URL matches are unchanged.
116
+
117
+ Adds unit + integration coverage for both (namespaced/bare exact-tag outdated;
118
+ distinct alias tokens + alias round-trip for why).
119
+
120
+ Co-authored-by: t <t@e.x> ([`0d45f67`](https://github.com/caylent-solutions/kanon/commit/0d45f673243861b0aaef823f6d95e0a548c447d4))
121
+
122
+ ### Unknown
123
+
124
+ * Merge pull request #88 from caylent-solutions/release-3.1.1
125
+
126
+ Release 3.1.1 ([`cec7213`](https://github.com/caylent-solutions/kanon/commit/cec7213109c0e307e80751e728c6a59751e20794))
127
+
128
+
5
129
  ## v3.1.0 (2026-06-27)
6
130
 
131
+ ### Chore
132
+
133
+ * chore(release): 3.1.0 ([`e62453e`](https://github.com/caylent-solutions/kanon/commit/e62453e4afa86dca403eef43f71b5ceb5e0a115b))
134
+
7
135
  ### Feature
8
136
 
9
137
  * feat: resolve catalog entries by tag namespace and accept bare project revisions #83
@@ -58,6 +186,12 @@ PEP 440 tag (refs/tags/<pep440>) for single-purpose repos, for both
58
186
  CLAUDE_MARKETPLACES_DIR header.
59
187
  - Tests, docs, and the kanon-add help snapshot updated. ([`7ed332c`](https://github.com/caylent-solutions/kanon/commit/7ed332c859e69cfd6635035a05c15c03339fdcd1))
60
188
 
189
+ ### Unknown
190
+
191
+ * Merge pull request #84 from caylent-solutions/release-3.1.0
192
+
193
+ Release 3.1.0 ([`fddb0aa`](https://github.com/caylent-solutions/kanon/commit/fddb0aa2ab847ffcf4857384d7e8b40504d1bf91))
194
+
61
195
 
62
196
  ## v3.0.0 (2026-06-26)
63
197
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kanon-cli
3
- Version: 3.1.0
3
+ Version: 3.2.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
@@ -183,7 +183,7 @@ git commit -m "feat: add my-package 1.2.3"
183
183
 
184
184
  Committing both files ensures the entire team installs the same resolved
185
185
  package versions. The synced artifacts live in the shared `KANON_HOME`
186
- store (`~/.kanon` by default), never in your project, so there is nothing
186
+ store (`~/.kanon-home` by default), never in your project, so there is nothing
187
187
  package-related to commit beyond `.kanon` and `.kanon.lock`.
188
188
 
189
189
  ---
@@ -216,7 +216,7 @@ persistent installation and advanced options, see
216
216
  | `kanon validate xml` | Validate XML manifests under `repo-specs/` | [docs/repo/manifest-format.md](docs/repo/manifest-format.md) |
217
217
  | `kanon validate marketplace` | Validate marketplace XML manifests under `repo-specs/` | [docs/repo/manifest-format.md](docs/repo/manifest-format.md) |
218
218
  | `kanon validate metadata` | Validate catalog entry metadata | [docs/catalog-author-guide.md](docs/catalog-author-guide.md) |
219
- | `kanon clean` | Remove synced packages and Kanon state (`--orphans` also prunes unreferenced marketplaces) | [docs/lifecycle.md](docs/lifecycle.md) |
219
+ | `kanon clean` | Remove synced packages and Kanon state (`--orphans` prunes unreferenced marketplaces; `--purge` also deletes `.kanon`/`.kanon.lock`; `--purge-all` also removes the `KANON_HOME` store) | [docs/lifecycle.md](docs/lifecycle.md) |
220
220
  | `kanon repo` | Low-level manifest-driven repo sync subsystem | [docs/repo/README.md](docs/repo/README.md) |
221
221
  | `kanon marketplace` | Manage the per-dependency Claude marketplace install flag in `.kanon` (`enable` / `disable` / `status`) | [docs/configuration.md](docs/configuration.md) |
222
222
  | `kanon completion` | Emit a shell completion script for bash, zsh, or powershell | [docs/shell-completion.md](docs/shell-completion.md) |
@@ -572,6 +572,8 @@ Executes the full teardown lifecycle.
572
572
  kanon clean # auto-discover .kanon by walking up from cwd
573
573
  kanon clean .kanon # explicit path to .kanon file
574
574
  kanon clean --orphans # also unregister orphaned marketplaces
575
+ kanon clean --purge # also delete .kanon and .kanon.lock
576
+ kanon clean --purge-all # also remove the KANON_HOME store directory
575
577
  ```
576
578
 
577
579
  **Behavior:**
@@ -585,6 +587,12 @@ With `--orphans`, before the normal teardown kanon also unregisters any
585
587
  kanon-owned marketplaces recorded in `.kanon.lock` that are no longer
586
588
  referenced by `.kanon`, pruning them from `~/.claude`.
587
589
 
590
+ With `--purge`, kanon also deletes this project's `.kanon` and `.kanon.lock`
591
+ files. With `--purge-all`, it additionally removes the shared `KANON_HOME`
592
+ store directory (default `~/.kanon-home`), removing only kanon-owned content
593
+ (`store/`, `cache/`, and the emptied root) and refusing unsafe `KANON_HOME`
594
+ paths such as your home directory or the filesystem root.
595
+
588
596
  ### kanon outdated
589
597
 
590
598
  Compares each source in `.kanon` against the catalog and emits a table of
@@ -795,9 +803,9 @@ and `kanon catalog audit`. `kanon install` is hermetic: it reads only
795
803
  `.kanon` and `.kanon.lock` and does not consult a catalog source.
796
804
 
797
805
  **`KANON_HOME`**
798
- Root of the shared kanon store and caches (default `~/.kanon`). The
806
+ Root of the shared kanon store and caches (default `~/.kanon-home`). The
799
807
  `--home` / `--store-dir <path>` global flag overrides it for a single
800
- invocation; precedence is flag > `KANON_HOME` > `~/.kanon`. Replaces the
808
+ invocation; precedence is flag > `KANON_HOME` > `~/.kanon-home`. Replaces the
801
809
  removed `KANON_WORKSPACE_DIR` / `KANON_CACHE_DIR` variables. Synced artifacts
802
810
  and the per-`.kanon` workspace lock both live under `${KANON_HOME}/store/`,
803
811
  so the project directory holds only `.kanon` (plus `.kanon.lock` after the
@@ -900,7 +908,7 @@ regardless of which source provided each package.
900
908
  ### Directory Structure After Install
901
909
 
902
910
  Fetched artifacts live in the shared `KANON_HOME` store
903
- (`$KANON_HOME`, default `~/.kanon`), content-addressed and deduped across
911
+ (`$KANON_HOME`, default `~/.kanon-home`), content-addressed and deduped across
904
912
  projects. Only `.kanon` and `.kanon.lock` live in (and are committed to)
905
913
  the project itself:
906
914
 
@@ -909,7 +917,7 @@ project/
909
917
  .kanon # Configuration (committed)
910
918
  .kanon.lock # Resolved SHAs (committed)
911
919
 
912
- $KANON_HOME/ # Shared store (default ~/.kanon; not in the repo)
920
+ $KANON_HOME/ # Shared store (default ~/.kanon-home; not in the repo)
913
921
  store/
914
922
  .kanon-data/
915
923
  sources/
@@ -161,7 +161,7 @@ git commit -m "feat: add my-package 1.2.3"
161
161
 
162
162
  Committing both files ensures the entire team installs the same resolved
163
163
  package versions. The synced artifacts live in the shared `KANON_HOME`
164
- store (`~/.kanon` by default), never in your project, so there is nothing
164
+ store (`~/.kanon-home` by default), never in your project, so there is nothing
165
165
  package-related to commit beyond `.kanon` and `.kanon.lock`.
166
166
 
167
167
  ---
@@ -194,7 +194,7 @@ persistent installation and advanced options, see
194
194
  | `kanon validate xml` | Validate XML manifests under `repo-specs/` | [docs/repo/manifest-format.md](docs/repo/manifest-format.md) |
195
195
  | `kanon validate marketplace` | Validate marketplace XML manifests under `repo-specs/` | [docs/repo/manifest-format.md](docs/repo/manifest-format.md) |
196
196
  | `kanon validate metadata` | Validate catalog entry metadata | [docs/catalog-author-guide.md](docs/catalog-author-guide.md) |
197
- | `kanon clean` | Remove synced packages and Kanon state (`--orphans` also prunes unreferenced marketplaces) | [docs/lifecycle.md](docs/lifecycle.md) |
197
+ | `kanon clean` | Remove synced packages and Kanon state (`--orphans` prunes unreferenced marketplaces; `--purge` also deletes `.kanon`/`.kanon.lock`; `--purge-all` also removes the `KANON_HOME` store) | [docs/lifecycle.md](docs/lifecycle.md) |
198
198
  | `kanon repo` | Low-level manifest-driven repo sync subsystem | [docs/repo/README.md](docs/repo/README.md) |
199
199
  | `kanon marketplace` | Manage the per-dependency Claude marketplace install flag in `.kanon` (`enable` / `disable` / `status`) | [docs/configuration.md](docs/configuration.md) |
200
200
  | `kanon completion` | Emit a shell completion script for bash, zsh, or powershell | [docs/shell-completion.md](docs/shell-completion.md) |
@@ -550,6 +550,8 @@ Executes the full teardown lifecycle.
550
550
  kanon clean # auto-discover .kanon by walking up from cwd
551
551
  kanon clean .kanon # explicit path to .kanon file
552
552
  kanon clean --orphans # also unregister orphaned marketplaces
553
+ kanon clean --purge # also delete .kanon and .kanon.lock
554
+ kanon clean --purge-all # also remove the KANON_HOME store directory
553
555
  ```
554
556
 
555
557
  **Behavior:**
@@ -563,6 +565,12 @@ With `--orphans`, before the normal teardown kanon also unregisters any
563
565
  kanon-owned marketplaces recorded in `.kanon.lock` that are no longer
564
566
  referenced by `.kanon`, pruning them from `~/.claude`.
565
567
 
568
+ With `--purge`, kanon also deletes this project's `.kanon` and `.kanon.lock`
569
+ files. With `--purge-all`, it additionally removes the shared `KANON_HOME`
570
+ store directory (default `~/.kanon-home`), removing only kanon-owned content
571
+ (`store/`, `cache/`, and the emptied root) and refusing unsafe `KANON_HOME`
572
+ paths such as your home directory or the filesystem root.
573
+
566
574
  ### kanon outdated
567
575
 
568
576
  Compares each source in `.kanon` against the catalog and emits a table of
@@ -773,9 +781,9 @@ and `kanon catalog audit`. `kanon install` is hermetic: it reads only
773
781
  `.kanon` and `.kanon.lock` and does not consult a catalog source.
774
782
 
775
783
  **`KANON_HOME`**
776
- Root of the shared kanon store and caches (default `~/.kanon`). The
784
+ Root of the shared kanon store and caches (default `~/.kanon-home`). The
777
785
  `--home` / `--store-dir <path>` global flag overrides it for a single
778
- invocation; precedence is flag > `KANON_HOME` > `~/.kanon`. Replaces the
786
+ invocation; precedence is flag > `KANON_HOME` > `~/.kanon-home`. Replaces the
779
787
  removed `KANON_WORKSPACE_DIR` / `KANON_CACHE_DIR` variables. Synced artifacts
780
788
  and the per-`.kanon` workspace lock both live under `${KANON_HOME}/store/`,
781
789
  so the project directory holds only `.kanon` (plus `.kanon.lock` after the
@@ -878,7 +886,7 @@ regardless of which source provided each package.
878
886
  ### Directory Structure After Install
879
887
 
880
888
  Fetched artifacts live in the shared `KANON_HOME` store
881
- (`$KANON_HOME`, default `~/.kanon`), content-addressed and deduped across
889
+ (`$KANON_HOME`, default `~/.kanon-home`), content-addressed and deduped across
882
890
  projects. Only `.kanon` and `.kanon.lock` live in (and are committed to)
883
891
  the project itself:
884
892
 
@@ -887,7 +895,7 @@ project/
887
895
  .kanon # Configuration (committed)
888
896
  .kanon.lock # Resolved SHAs (committed)
889
897
 
890
- $KANON_HOME/ # Shared store (default ~/.kanon; not in the repo)
898
+ $KANON_HOME/ # Shared store (default ~/.kanon-home; not in the repo)
891
899
  store/
892
900
  .kanon-data/
893
901
  sources/
@@ -74,7 +74,6 @@ the source of truth for which clones exist.
74
74
  <project-root>/
75
75
  .kanon # operator-authored config file
76
76
  .kanon.lock # generated lockfile (commit this)
77
- .gitignore # auto-updated by kanon install (idempotent)
78
77
  .kanon-data/
79
78
  .kanon-install.lock # flock-managed concurrency lock
80
79
  sources/
@@ -97,8 +96,11 @@ Key paths:
97
96
  - **`.packages/`** -- aggregated symlinks pointing into the per-source
98
97
  `.packages/*` entries. This is the only directory operators need to
99
98
  reference in downstream tooling.
100
- - **`.gitignore`** -- `kanon install` appends `.packages/` and
101
- `.kanon-data/` (idempotent; no duplicate entries are written).
99
+ - **`<KANON_HOME>/store/.gitignore`** -- `kanon install` writes this
100
+ safety net (containing `*`) ONLY when the shared `KANON_HOME` store sits
101
+ inside a git working tree, so the fetched-artifact cache is never committed.
102
+ With the default `~/.kanon-home` (not a git repo), `kanon install` writes no
103
+ `.gitignore` at all.
102
104
 
103
105
  If the `.kanon-data/` directory layout becomes inconsistent (for example after
104
106
  a SIGTERM mid-clone), run `kanon clean` to prune and recover.
@@ -100,7 +100,7 @@ To audit a remote manifest repo, set `KANON_HOME` and supply the
100
100
  source in `<git_url>@<ref>` form:
101
101
 
102
102
  ```bash
103
- export KANON_HOME=~/.kanon
103
+ export KANON_HOME=~/.kanon-home
104
104
  kanon catalog audit https://example.com/org/manifest-repo.git@main
105
105
  ```
106
106
 
@@ -409,7 +409,7 @@ before publishing a release. The steps assume a scratch clone at
409
409
  6. **List catalog entries via scratch source:**
410
410
 
411
411
  ```bash
412
- export KANON_HOME=~/.kanon
412
+ export KANON_HOME=~/.kanon-home
413
413
  kanon search --catalog-source ./scratch@main
414
414
  ```
415
415
 
@@ -171,7 +171,7 @@ spec Section 3.6 (trust model / credential isolation).
171
171
 
172
172
  The cache lives under the shared `KANON_HOME` store root. `KANON_HOME`
173
173
  resolves from the `--home` / `--store-dir` flag, then the `KANON_HOME`
174
- environment variable, then the `~/.kanon` default, so a remote audit target
174
+ environment variable, then the `~/.kanon-home` default, so a remote audit target
175
175
  works without setting `KANON_HOME` explicitly.
176
176
 
177
177
  ## Source-name-derivation check (`--check source-name-derivation`)
@@ -436,7 +436,7 @@ operators encounter resolver failures:
436
436
  # Inventory non-PEP-440 tags in a local manifest repo
437
437
  kanon catalog audit --check tag-format /path/to/manifest-repo
438
438
 
439
- # Inventory a remote manifest repo (uses the shared KANON_HOME store; ~/.kanon by default)
439
+ # Inventory a remote manifest repo (uses the shared KANON_HOME store; ~/.kanon-home by default)
440
440
  kanon catalog audit --check tag-format https://github.com/org/manifest-repo.git@main
441
441
  ```
442
442
 
@@ -601,7 +601,7 @@ kanon catalog audit
601
601
  # Audit an explicit local path
602
602
  kanon catalog audit /path/to/manifest-repo
603
603
 
604
- # Audit a remote repo (cached under the shared KANON_HOME store; ~/.kanon by default)
604
+ # Audit a remote repo (cached under the shared KANON_HOME store; ~/.kanon-home by default)
605
605
  kanon catalog audit https://github.com/org/manifest-repo.git@main
606
606
 
607
607
  # Run only metadata and tag-format checks
@@ -624,7 +624,7 @@ kanon catalog audit https://github.com/org/repo.git@v1.0.0 \
624
624
  |----------|---------|-------------|
625
625
  | `KANON_CATALOG_AUDIT_FORMAT` | `text` | Default output format. CLI `--format` takes precedence. |
626
626
  | `KANON_CATALOG_AUDIT_CACHE_TTL_SECONDS` | `3600` | Cache TTL in seconds for remote clones. Must be a positive integer. |
627
- | `KANON_HOME` | `~/.kanon` | Shared kanon home (store + caches); the audit cache lives under `${KANON_HOME}/cache`. Overridden by the `--home` / `--store-dir` flag. |
627
+ | `KANON_HOME` | `~/.kanon-home` | Shared kanon home (store + caches); the audit cache lives under `${KANON_HOME}/cache`. Overridden by the `--home` / `--store-dir` flag. |
628
628
  | `KANON_ALLOW_INSECURE_REMOTES` | (unset) | When set to `1`, suppresses R002 findings for non-HTTPS/SSH remote URLs. Any value other than `1` is treated as unset. Intended for local test fixtures only; do not set in production CI pipelines. R001 and R003 findings are never suppressed by this variable. |
629
629
 
630
630
  ## Related commands
@@ -57,7 +57,7 @@ emitted). Exit code is 1 when any error-level finding is detected.
57
57
  recreating the directory empty with mode `0700`. Reports an info finding
58
58
  with the count of files removed. This flag is independent of the health
59
59
  checks. `KANON_HOME` resolves from the `--home` / `--store-dir` flag, the
60
- `KANON_HOME` env var, then the `~/.kanon` default, so the cache directory is
60
+ `KANON_HOME` env var, then the `~/.kanon-home` default, so the cache directory is
61
61
  always resolved.
62
62
 
63
63
  `--prune-cache`
@@ -67,7 +67,7 @@ emitted). Exit code is 1 when any error-level finding is detected.
67
67
  stale `.kanon-data/.kanon-install.lock` files (mtime older than
68
68
  `KANON_DOCTOR_STALE_LOCK_AGE_HOURS` hours) as advisory findings -- doctor
69
69
  does NOT delete them. The cache directory is resolved from `KANON_HOME`
70
- (flag, env var, or `~/.kanon` default); the stale-lock scan always runs from
70
+ (flag, env var, or `~/.kanon-home` default); the stale-lock scan always runs from
71
71
  the current working directory.
72
72
 
73
73
  ## Subchecks
@@ -258,7 +258,7 @@ INFO: Completion cache refreshed: 3 file(s) removed from /home/user/.kanon/cache
258
258
  ```
259
259
 
260
260
  `KANON_HOME` resolves from the `--home` / `--store-dir` flag, the `KANON_HOME`
261
- env var, then the `~/.kanon` default, so the completion-cache directory is
261
+ env var, then the `~/.kanon-home` default, so the completion-cache directory is
262
262
  always resolved.
263
263
 
264
264
  ### Subcheck 7: Completion errors report
@@ -268,7 +268,7 @@ from `${KANON_HOME}/cache/completion-errors.log`. This log is written by shell
268
268
  completion callback failures (see E7 / `docs/shell-completion.md`).
269
269
 
270
270
  `kanon doctor` only reads this log -- it does NOT modify, truncate, or rotate it.
271
- The cache directory is resolved from `KANON_HOME` (flag, env var, or `~/.kanon`
271
+ The cache directory is resolved from `KANON_HOME` (flag, env var, or `~/.kanon-home`
272
272
  default); when the log file does not exist this subcheck reports the info notice
273
273
  below.
274
274
 
@@ -417,7 +417,7 @@ INFO: Advisory: stale install lock found at /path/to/.kanon-data/.kanon-install.
417
417
  ```
418
418
 
419
419
  `KANON_HOME` resolves from the `--home` / `--store-dir` flag, the `KANON_HOME`
420
- env var, then the `~/.kanon` default, so the cache prune always runs against
420
+ env var, then the `~/.kanon-home` default, so the cache prune always runs against
421
421
  the resolved cache directory; the stale-lock scan runs independently from the
422
422
  current working directory.
423
423
 
@@ -440,7 +440,7 @@ are emitted. Health checks (subchecks 1-5, 6, 7, 9, 11) always run after.
440
440
  | `KANON_RESOLVE_TIMEOUT` | `30` | Timeout in seconds for each `git ls-remote` call |
441
441
  | `KANON_GIT_RETRY_COUNT` | `3` | Maximum number of `git ls-remote` attempts |
442
442
  | `KANON_GIT_RETRY_DELAY` | `1` | Inter-attempt delay in seconds (read by doctor; not applied to the `git ls-remote` retry path, which delegates to `git_runner.run_git_ls_remote` and uses immediate retries with no time-based delay) |
443
- | `KANON_HOME` | `~/.kanon` | Shared kanon home (store + caches); cache lives under `${KANON_HOME}/cache`. Resolves from the `--home` / `--store-dir` flag, then this env var, then the `~/.kanon` default |
443
+ | `KANON_HOME` | `~/.kanon-home` | Shared kanon home (store + caches); cache lives under `${KANON_HOME}/cache`. Resolves from the `--home` / `--store-dir` flag, then this env var, then the `~/.kanon-home` default |
444
444
  | `KANON_COMPLETION_ERRORS_REPORT_LIMIT` | `5` | Maximum number of recent completion-error log lines to display in subcheck 7 |
445
445
  | `KANON_CACHE_PRUNE_AGE_DAYS` | `30` | Files older than this many days (by atime) are removed by `--prune-cache` (subcheck 10) |
446
446
  | `KANON_DOCTOR_STALE_LOCK_SCAN_MAX_DEPTH` | `4` | Maximum directory depth for the stale install-lock scan in `--prune-cache` (subcheck 10) |
@@ -14,7 +14,7 @@ are registered once via `kanon_cli.core.cli_args` so every parser exposes them.
14
14
  | `--quiet` / `--verbose` | -- | normal | Logging verbosity. Mutually exclusive. |
15
15
  | `--no-color` | `NO_COLOR` | auto | Disable ANSI color. Any non-empty `NO_COLOR` also disables color. |
16
16
  | `--no-update-check` | `KANON_SKIP_UPDATE_CHECK` | off | Skip the best-effort PyPI "update available" check. The flag is equivalent to setting `KANON_SKIP_UPDATE_CHECK=1`. |
17
- | `--home` / `--store-dir <path>` | `KANON_HOME` | `~/.kanon` | Shared kanon home root (content-addressed store plus caches). `--store-dir` is an accepted alias of `--home`. Precedence: flag > `KANON_HOME` env > `~/.kanon`. |
17
+ | `--home` / `--store-dir <path>` | `KANON_HOME` | `~/.kanon-home` | Shared kanon home root (content-addressed store plus caches). `--store-dir` is an accepted alias of `--home`. Precedence: flag > `KANON_HOME` env > `~/.kanon-home`. |
18
18
 
19
19
  ## Shared Argument Factories
20
20
 
@@ -66,7 +66,7 @@ completion variables), see [docs/configuration.md](configuration.md).
66
66
  | Variable | Description | Default |
67
67
  |----------|-------------|---------|
68
68
  | `KANON_CATALOG_SOURCES` | Remote catalog source(s) as `<git_url>@<ref>`, one entry per line. Sets the default for every command that accepts `--catalog-source`; the resolving commands require exactly one entry unless `--catalog-source` is passed. | (none) |
69
- | `KANON_HOME` | Shared kanon home root (store plus caches). Overridden by the `--home` / `--store-dir` flag. | `~/.kanon` |
69
+ | `KANON_HOME` | Shared kanon home root (store plus caches). Overridden by the `--home` / `--store-dir` flag. | `~/.kanon-home` |
70
70
  | `KANON_SKIP_UPDATE_CHECK` | Set to `1` to skip the PyPI update-available check (same effect as `--no-update-check`). | (unset) |
71
71
  | `KANON_OUTDATED_FORMAT` | Default output format for `kanon outdated` (`table` or `json`). Overridden by `--format`. | `table` |
72
72
  | `KANON_OUTDATED_JSON_INDENT` | JSON indentation (number of spaces) used by `kanon outdated --format json`. | `2` |
@@ -380,7 +380,7 @@ chain.
380
380
  3. Default derived from `--kanon-file`: `./.kanon` becomes
381
381
  `./.kanon.lock`; `./alt.kanon` becomes `./alt.kanon.lock`.
382
382
 
383
- **`KANON_HOME`** (default: `~/.kanon`) -- Single root directory that
383
+ **`KANON_HOME`** (default: `~/.kanon-home`) -- Single root directory that
384
384
  subsumes the former per-user cache-dir override and the former
385
385
  per-workspace artifact-dir override. The cache subtree lives at
386
386
  `${KANON_HOME}/cache/` and the store subtree at `${KANON_HOME}/store/`.
@@ -393,7 +393,7 @@ to cache files. See
393
393
 
394
394
  1. `--home` / `--store-dir <path>` global CLI flag (when supplied).
395
395
  2. `KANON_HOME` environment variable (when non-empty).
396
- 3. `~/.kanon` -- default when the env var is unset and no flag is given.
396
+ 3. `~/.kanon-home` -- default when the env var is unset and no flag is given.
397
397
 
398
398
  The `--home` (alias `--store-dir`) flag is a global option accepted on
399
399
  every command; when supplied it overrides `KANON_HOME` for that
@@ -340,7 +340,7 @@ callback failures. These errors are non-blocking at the shell but are surfaced
340
340
  here so operators can diagnose completion failures.
341
341
 
342
342
  This check always runs. The cache directory resolves from `KANON_HOME` (the
343
- `--home` / `--store-dir` flag, then the env var, then the `~/.kanon` default).
343
+ `--home` / `--store-dir` flag, then the env var, then the `~/.kanon-home` default).
344
344
  This subcheck emits only the stderr finding below; it does not print an `[ok]`
345
345
  summary line.
346
346
 
@@ -64,7 +64,7 @@ The command performs these steps:
64
64
  - Calls `kanon_cli.repo.repo_sync(source_dir)` -- aborts immediately on `RepoCommandError`
65
65
  5. **Aggregate symlinks** -- For each `.kanon-data/sources/<name>/.packages/*`, creates a symlink in `.packages/`
66
66
  6. **Collision detection** -- If two sources produce the same package name, fails fast with error identifying both sources
67
- 7. **Update `.gitignore`** -- Ensures `.packages/` and `.kanon-data/` entries are present
67
+ 7. **Conditional store `.gitignore` safety net** -- Only when the shared `KANON_HOME` store sits inside a git working tree, writes `<KANON_HOME>/store/.gitignore` containing `*` so the fetched-artifact cache is never committed. When the store is not inside a git repo (the default `~/.kanon-home`), no `.gitignore` is written
68
68
  8. **Post-sync marketplace install** -- If any source sets `KANON_SOURCE_<alias>_MARKETPLACE=true`: locates the `claude` binary, discovers marketplace entries and plugins, registers marketplaces, and installs plugins via the Claude Code CLI
69
69
 
70
70
  ## Clean Lifecycle
@@ -66,13 +66,17 @@ one top-level source while preserving every other lockfile entry, pass
66
66
  store, content-addressed and deduped across projects:
67
67
 
68
68
  - The store root resolves with precedence `--home` / `--store-dir`
69
- flag > `KANON_HOME` environment variable > the default `~/.kanon`.
69
+ flag > `KANON_HOME` environment variable > the default `~/.kanon-home`.
70
70
  - The store directory is created if absent. If it cannot be created or is
71
71
  not writable, `kanon install` exits non-zero with an actionable
72
72
  message naming the path and the `KANON_HOME` variable -- there is no
73
73
  silent fallback.
74
74
  - `kanon clean` resolves the same store root, so it removes exactly what
75
75
  `kanon install` wrote.
76
+ - The default store root is `~/.kanon-home`. Earlier versions defaulted to
77
+ `~/.kanon`, which collided with a project `.kanon` file when running kanon
78
+ from your home directory. A leftover `~/.kanon` directory from an older
79
+ install is unused and safe to delete (`rm -rf ~/.kanon`).
76
80
 
77
81
  The legacy per-project `.packages/` / `.kanon-data/` locations and their
78
82
  `KANON_WORKSPACE_DIR` / `KANON_CACHE_DIR` environment variables were
@@ -129,9 +129,10 @@ mkdir -p "${KANON_TEST_ROOT}"
129
129
  In kanon 3.0.0 the install artifacts no longer live next to `.kanon`. All
130
130
  fetched data is content-addressed under a **shared store** rooted at
131
131
  `KANON_HOME` (precedence: `--home`/`--store-dir` flag > `KANON_HOME` env >
132
- `~/.kanon` default). A successful `kanon install` writes only `.kanon.lock`
133
- into the project directory; the `.packages/`, `.kanon-data/sources/<name>/`,
134
- and store-level `.gitignore` artifacts are created under `<KANON_HOME>/store/`.
132
+ `~/.kanon-home` default). A successful `kanon install` writes only `.kanon.lock`
133
+ into the project directory; the `.packages/` and `.kanon-data/sources/<name>/`
134
+ artifacts are created under `<KANON_HOME>/store/` (a store-level `.gitignore`
135
+ containing `*` is written there only when the store sits inside a git repo).
135
136
  The removed per-project location variables (`KANON_WORKSPACE_DIR`,
136
137
  `KANON_CACHE_DIR`) are subsumed by this single store.
137
138
 
@@ -633,7 +634,7 @@ kanon install .kanon
633
634
  - Directory `${KANON_HOME}/store/.packages/` exists
634
635
  - `${KANON_HOME}/store/.packages/pkg-alpha` is a symlink
635
636
  - Symlink target path contains `${KANON_HOME}/store/.kanon-data/sources/primary/.packages/pkg-alpha`
636
- - `${KANON_HOME}/store/.gitignore` exists and contains both the `.packages/` and `.kanon-data/` lines
637
+ - `${KANON_HOME}/store/.gitignore` is NOT created (the throwaway store is not inside a git repo; the safety-net `.gitignore` containing `*` is written only when the store sits inside a git working tree)
637
638
 
638
639
  **Clean:**
639
640
 
@@ -3519,16 +3520,16 @@ set -e
3519
3520
 
3520
3521
  **Pass criteria:** Exit code non-zero; stderr names the colliding package and both source names.
3521
3522
 
3522
- ### PK-13: store `.gitignore` promise -- `.packages/` and `.kanon-data/` lines added
3523
+ ### PK-13: no store `.gitignore` for a non-git store
3523
3524
 
3524
3525
  ```bash
3525
3526
  pk_run pk13 "main"
3526
- grep -q "^.packages/$" ${KANON_HOME}/store/.gitignore && grep -q "^.kanon-data/$" ${KANON_HOME}/store/.gitignore && echo "PASS: both lines present"
3527
+ test ! -e ${KANON_HOME}/store/.gitignore && echo "PASS: no .gitignore for non-git store"
3527
3528
  kanon clean .kanon
3528
- grep -q "^.packages/$" ${KANON_HOME}/store/.gitignore && echo "PASS: clean preserved .gitignore lines"
3529
+ test ! -e ${KANON_HOME}/store/.gitignore && echo "PASS: still no .gitignore after clean"
3529
3530
  ```
3530
3531
 
3531
- **Pass criteria:** Both `.packages/` and `.kanon-data/` lines added to `${KANON_HOME}/store/.gitignore` by install; lines remain after clean.
3532
+ **Pass criteria:** No `.gitignore` is written under `${KANON_HOME}/store/` (the throwaway store is not inside a git repo); none appears after clean. The safety-net `.gitignore` containing `*` is written only when the store sits inside a git working tree.
3532
3533
 
3533
3534
  ### Cleanup
3534
3535
 
@@ -5474,12 +5475,12 @@ KANON_SOURCE_a_NAME=a
5474
5475
  KANON_SOURCE_a_GITBASE=https://example.com
5475
5476
  KANONEOF
5476
5477
  kanon install
5477
- grep -q "^.packages/$" ${KANON_HOME}/store/.gitignore || (echo "FAIL: install did not add"; exit 1)
5478
+ test ! -e ${KANON_HOME}/store/.gitignore && echo "PASS: no .gitignore for non-git store"
5478
5479
  kanon clean
5479
- grep -q "^.packages/$" ${KANON_HOME}/store/.gitignore && grep -q "^.kanon-data/$" ${KANON_HOME}/store/.gitignore && echo "PASS: clean preserved both lines"
5480
+ test ! -e ${KANON_HOME}/store/.gitignore && echo "PASS: still no .gitignore after clean"
5480
5481
  ```
5481
5482
 
5482
- **Pass criteria:** Both `.gitignore` lines added by install remain after clean.
5483
+ **Pass criteria:** No `.gitignore` is written under `${KANON_HOME}/store/` (non-git store); none appears after clean.
5483
5484
 
5484
5485
  ### TC-clean-03: `clean --orphans` prunes a removed source's marketplace
5485
5486
 
@@ -5649,11 +5650,11 @@ KANON_SOURCE_bravo_GITBASE=https://example.com
5649
5650
  KANONEOF
5650
5651
  kanon install .kanon
5651
5652
  test -L ${KANON_HOME}/store/.packages/pkg-alpha && test -L ${KANON_HOME}/store/.packages/pkg-bravo && echo "PASS: both"
5652
- grep -q "^.packages/$" ${KANON_HOME}/store/.gitignore && grep -q "^.kanon-data/$" ${KANON_HOME}/store/.gitignore && echo "PASS: gitignore"
5653
+ test ! -e ${KANON_HOME}/store/.gitignore && echo "PASS: no .gitignore for non-git store"
5653
5654
  kanon clean .kanon
5654
5655
  ```
5655
5656
 
5656
- **Pass criteria:** Both packages aggregated; `.gitignore` updated.
5657
+ **Pass criteria:** Both packages aggregated; no `.gitignore` is written (non-git store).
5657
5658
 
5658
5659
  ### UJ-04: `GITBASE` env override (`docs/pipeline-integration.md`)
5659
5660
 
@@ -6011,7 +6012,7 @@ kanon --home "${NS05_HOME}" clean .kanon
6011
6012
  ```
6012
6013
 
6013
6014
  **Pass criteria:** Exit code 0. The store is created under the explicit `--home`
6014
- path (flag precedence: `--home`/`--store-dir` > `KANON_HOME` > `~/.kanon`), not
6015
+ path (flag precedence: `--home`/`--store-dir` > `KANON_HOME` > `~/.kanon-home`), not
6015
6016
  under the exported `KANON_HOME`. `--store-dir` is an accepted alias for `--home`.
6016
6017
 
6017
6018
  ### NS-06: `--no-update-check` suppresses the PyPI update check
@@ -6050,11 +6051,10 @@ directory, so the checks below operate from the store base:
6050
6051
  cd "${KANON_HOME}/store"
6051
6052
  ```
6052
6053
 
6053
- ### 16.1 .gitignore contents
6054
+ ### 16.1 no store .gitignore for a non-git store
6054
6055
 
6055
6056
  ```bash
6056
- grep -q "^\.packages/$" ${KANON_HOME}/store/.gitignore && echo "PASS: .packages/ in .gitignore" || echo "FAIL"
6057
- grep -q "^\.kanon-data/$" ${KANON_HOME}/store/.gitignore && echo "PASS: .kanon-data/ in .gitignore" || echo "FAIL"
6057
+ test ! -e ${KANON_HOME}/store/.gitignore && echo "PASS: no .gitignore for non-git store" || echo "FAIL: unexpected .gitignore"
6058
6058
  ```
6059
6059
 
6060
6060
  ### 16.2 .packages/ contains symlinks
@@ -6338,7 +6338,7 @@ After running every scenario from §2 through §28, populate this spreadsheet-st
6338
6338
  | 162 | PK-10 | non-marketplace | linkfile + PEP 440 | | | | |
6339
6339
  | 163 | PK-11 | non-marketplace | multi-source PEP 440 mix | | | | |
6340
6340
  | 164 | PK-12 | non-marketplace | collision PEP 440 | | | | |
6341
- | 165 | PK-13 | non-marketplace | .gitignore promise | | | | |
6341
+ | 165 | PK-13 | non-marketplace | no store .gitignore (non-git store) | | | | |
6342
6342
  | 166 | RP-init-01 | repo-init | bare init | | | | |
6343
6343
  | 167 | RP-init-02 | repo-init | --manifest-url long form | | | | |
6344
6344
  | 168 | RP-init-03 | repo-init | --manifest-name=alt.xml | | | | |