kanon-cli 2.0.0__tar.gz → 2.0.1__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 (972) hide show
  1. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/CHANGELOG.md +9 -0
  2. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/PKG-INFO +331 -128
  3. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/README.md +330 -127
  4. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/catalog-author-guide.md +2 -1
  5. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/configuration.md +4 -1
  6. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/creating-manifest-repos.md +2 -2
  7. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/doctor.md +12 -0
  8. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/how-it-works.md +1 -1
  9. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/installation.md +7 -2
  10. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/multi-source-guide.md +4 -4
  11. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/setup-guide.md +7 -16
  12. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/pyproject.toml +1 -1
  13. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/__init__.py +1 -1
  14. kanon_cli-2.0.1/tests/unit/repo/fixtures/.repo_not.present.gitconfig.json +1 -0
  15. kanon_cli-2.0.1/tests/unit/repo/fixtures/.repo_test.gitconfig.json +56 -0
  16. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.claude/settings.json +0 -0
  17. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.devcontainer/.devcontainer.postcreate.sh +0 -0
  18. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.devcontainer/VERSION +0 -0
  19. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.devcontainer/catalog-entry.json +0 -0
  20. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.devcontainer/devcontainer-functions.sh +0 -0
  21. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.devcontainer/devcontainer.json +0 -0
  22. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.devcontainer/fix-line-endings.py +0 -0
  23. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.devcontainer/nix-family-os/README.md +0 -0
  24. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.devcontainer/nix-family-os/tinyproxy-daemon.sh +0 -0
  25. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.devcontainer/nix-family-os/tinyproxy.conf.template +0 -0
  26. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.devcontainer/postcreate-wrapper.sh +0 -0
  27. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.devcontainer/project-setup.sh +0 -0
  28. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.devcontainer/wsl-family-os/README.md +0 -0
  29. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.devcontainer/wsl-family-os/tinyproxy-daemon.sh +0 -0
  30. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.devcontainer/wsl-family-os/tinyproxy.conf.template +0 -0
  31. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.github/CODEOWNERS +0 -0
  32. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.github/actions/setup-kanon/action.yml +0 -0
  33. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.github/workflows/codeql-analysis.yml +0 -0
  34. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.github/workflows/main-validation.yml +0 -0
  35. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.github/workflows/pr-validation.yml +0 -0
  36. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.github/workflows/publish.yml +0 -0
  37. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.gitignore +0 -0
  38. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.markdownlint.json +0 -0
  39. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.pre-commit-config.yaml +0 -0
  40. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.tool-versions +0 -0
  41. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/.yamllint +0 -0
  42. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/CLAUDE.md +0 -0
  43. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/CONTRIBUTING.md +0 -0
  44. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/LICENSE +0 -0
  45. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/Makefile +0 -0
  46. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/architecture.md +0 -0
  47. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/catalog-format-versioning.md +0 -0
  48. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/catalogs-explained.md +0 -0
  49. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/claude-marketplaces-guide.md +0 -0
  50. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/cli/catalog-audit.md +0 -0
  51. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/cli/doctor.md +0 -0
  52. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/cli/validate.md +0 -0
  53. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/cli-reference.md +0 -0
  54. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/cli.md +0 -0
  55. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/coming-from-pip-npm-cargo.md +0 -0
  56. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/contributing.md +0 -0
  57. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/creating-packages.md +0 -0
  58. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/exit-codes.md +0 -0
  59. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/git-auth-setup.md +0 -0
  60. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/integration-testing.md +0 -0
  61. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/lifecycle.md +0 -0
  62. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/list-and-add.md +0 -0
  63. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/lockfile.md +0 -0
  64. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/migrating-existing-kanon-files.md +0 -0
  65. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/migration-bootstrap-to-add.md +0 -0
  66. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/outdated-and-why.md +0 -0
  67. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/pipeline-integration.md +0 -0
  68. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/repo/README.md +0 -0
  69. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/repo/internal-fs-layout.md +0 -0
  70. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/repo/manifest-format.md +0 -0
  71. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/repo/python-support.md +0 -0
  72. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/repo/repo-hooks.md +0 -0
  73. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/repo/smart-sync.md +0 -0
  74. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/repo/windows.md +0 -0
  75. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/security-model.md +0 -0
  76. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/shell-completion.md +0 -0
  77. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/test-coverage.md +0 -0
  78. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/testing/matrix-traceability.md +0 -0
  79. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/troubleshooting.md +0 -0
  80. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/url-canonicalization.md +0 -0
  81. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/docs/version-resolution.md +0 -0
  82. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/git-hooks/pre-commit +0 -0
  83. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/git-hooks/pre-push +0 -0
  84. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/link +0 -0
  85. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/requirements-dev.txt +0 -0
  86. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/requirements.txt +0 -0
  87. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/scripts/check_archive_no_duplicates.py +0 -0
  88. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/__main__.py +0 -0
  89. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/cli.py +0 -0
  90. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/commands/__init__.py +0 -0
  91. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/commands/add.py +0 -0
  92. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/commands/bootstrap.py +0 -0
  93. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/commands/catalog.py +0 -0
  94. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/commands/clean.py +0 -0
  95. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/commands/completion.py +0 -0
  96. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/commands/doctor.py +0 -0
  97. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/commands/install.py +0 -0
  98. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/commands/list.py +0 -0
  99. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/commands/outdated.py +0 -0
  100. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/commands/remove.py +0 -0
  101. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/commands/repo.py +0 -0
  102. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/commands/validate.py +0 -0
  103. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/commands/why.py +0 -0
  104. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/completions/__init__.py +0 -0
  105. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/completions/cache.py +0 -0
  106. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/completions/cached_catalogs.py +0 -0
  107. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/completions/catalog_entries.py +0 -0
  108. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/completions/catalog_versions.py +0 -0
  109. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/completions/lockfile_names.py +0 -0
  110. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/completions/midtoken.py +0 -0
  111. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/completions/pep440_filter.py +0 -0
  112. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/completions/preamble.py +0 -0
  113. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/completions/project_versions.py +0 -0
  114. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/completions/sanitize.py +0 -0
  115. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/completions/source_names.py +0 -0
  116. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/constants.py +0 -0
  117. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/core/__init__.py +0 -0
  118. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/core/catalog.py +0 -0
  119. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/core/clean.py +0 -0
  120. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/core/cli_args.py +0 -0
  121. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/core/discover.py +0 -0
  122. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/core/include_walker.py +0 -0
  123. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/core/install.py +0 -0
  124. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/core/kanon_hash.py +0 -0
  125. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/core/kanonenv.py +0 -0
  126. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/core/lockfile.py +0 -0
  127. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/core/manifest.py +0 -0
  128. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/core/marketplace.py +0 -0
  129. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/core/marketplace_validator.py +0 -0
  130. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/core/metadata.py +0 -0
  131. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/core/remote_url.py +0 -0
  132. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/core/url.py +0 -0
  133. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/core/xml_validator.py +0 -0
  134. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/__init__.py +0 -0
  135. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/color.py +0 -0
  136. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/command.py +0 -0
  137. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/editor.py +0 -0
  138. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/error.py +0 -0
  139. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/event_log.py +0 -0
  140. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/fetch.py +0 -0
  141. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/git_command.py +0 -0
  142. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/git_config.py +0 -0
  143. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/git_refs.py +0 -0
  144. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/git_ssh +0 -0
  145. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/git_superproject.py +0 -0
  146. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/git_trace2_event_log.py +0 -0
  147. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/git_trace2_event_log_base.py +0 -0
  148. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/hooks/commit-msg +0 -0
  149. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/hooks/pre-auto-gc +0 -0
  150. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/hooks.py +0 -0
  151. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/main.py +0 -0
  152. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/manifest_xml.py +0 -0
  153. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/pager.py +0 -0
  154. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/platform_utils.py +0 -0
  155. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/platform_utils_win32.py +0 -0
  156. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/progress.py +0 -0
  157. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/project.py +0 -0
  158. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/repo +0 -0
  159. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/repo_logging.py +0 -0
  160. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/repo_trace.py +0 -0
  161. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/requirements.jsonc +0 -0
  162. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/ssh.py +0 -0
  163. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/__init__.py +0 -0
  164. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/abandon.py +0 -0
  165. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/branches.py +0 -0
  166. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/checkout.py +0 -0
  167. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/cherry_pick.py +0 -0
  168. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/diff.py +0 -0
  169. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/diffmanifests.py +0 -0
  170. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/download.py +0 -0
  171. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/envsubst.py +0 -0
  172. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/forall.py +0 -0
  173. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/gc.py +0 -0
  174. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/grep.py +0 -0
  175. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/help.py +0 -0
  176. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/info.py +0 -0
  177. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/init.py +0 -0
  178. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/list.py +0 -0
  179. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/manifest.py +0 -0
  180. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/overview.py +0 -0
  181. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/prune.py +0 -0
  182. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/rebase.py +0 -0
  183. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/selfupdate.py +0 -0
  184. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/smartsync.py +0 -0
  185. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/stage.py +0 -0
  186. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/start.py +0 -0
  187. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/status.py +0 -0
  188. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/sync.py +0 -0
  189. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/subcmds/upload.py +0 -0
  190. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/version_constraints.py +0 -0
  191. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/repo/wrapper.py +0 -0
  192. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/utils/__init__.py +0 -0
  193. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/utils/concurrency.py +0 -0
  194. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/utils/levenshtein.py +0 -0
  195. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/utils/lock_file_path.py +0 -0
  196. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/src/kanon_cli/version.py +0 -0
  197. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/__init__.py +0 -0
  198. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/conftest.py +0 -0
  199. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/catalog/broken-soft-spot-1/repo-specs/duplicate-child-marketplace.xml +0 -0
  200. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/catalog/broken-soft-spot-1/repo-specs/missing-recommended-marketplace.xml +0 -0
  201. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/catalog/broken-soft-spot-1/repo-specs/missing-required-marketplace.xml +0 -0
  202. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/catalog/broken-soft-spot-1/repo-specs/multiple-blocks-marketplace.xml +0 -0
  203. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/catalog/broken-soft-spot-2/repo-specs/dotted-name-marketplace.xml +0 -0
  204. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/catalog/broken-soft-spot-2/repo-specs/hyphenated-name-marketplace.xml +0 -0
  205. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/catalog/broken-soft-spot-2/repo-specs/uppercase-name-marketplace.xml +0 -0
  206. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/catalog/broken-soft-spot-3/repo-specs/group-a-1-marketplace.xml +0 -0
  207. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/catalog/broken-soft-spot-3/repo-specs/group-a-2-marketplace.xml +0 -0
  208. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/catalog/broken-soft-spot-3/repo-specs/group-b-1-marketplace.xml +0 -0
  209. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/catalog/broken-soft-spot-3/repo-specs/group-b-2-marketplace.xml +0 -0
  210. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/catalog/broken-soft-spot-4/repo-specs/file-url-marketplace.xml +0 -0
  211. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/catalog/broken-soft-spot-4/repo-specs/query-string-marketplace.xml +0 -0
  212. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/catalog/broken-soft-spot-4/repo-specs/unresolvable-marketplace.xml +0 -0
  213. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/catalog/legacy-catalog-dir/catalog/sample-entry/.kanon +0 -0
  214. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/catalog/legacy-catalog-dir/repo-specs/sample.xml +0 -0
  215. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/catalogs/zero-pep440-tags/README.md +0 -0
  216. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/catalogs/zero-pep440-tags/repo-specs/entry-a/entry-a-marketplace.xml +0 -0
  217. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/completion/__init__.py +0 -0
  218. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/completion/expected-bash.sh +0 -0
  219. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/completion/expected-zsh.sh +0 -0
  220. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/errors/README.md +0 -0
  221. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/errors/conflict-detected.txt +0 -0
  222. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/errors/entry-not-found.txt +0 -0
  223. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/errors/lockfile-hash-mismatch.txt +0 -0
  224. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/errors/lockfile-sha-unreachable.txt +0 -0
  225. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/errors/missing-catalog-source.txt +0 -0
  226. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/errors/missing-required-metadata-field.txt +0 -0
  227. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/errors/source-collision.txt +0 -0
  228. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/errors/zero-pep440-tags-under-prefix.txt +0 -0
  229. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/help/README.md +0 -0
  230. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/help/kanon-add.txt +0 -0
  231. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/help/kanon-catalog-audit.txt +0 -0
  232. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/help/kanon-catalog.txt +0 -0
  233. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/help/kanon-clean.txt +0 -0
  234. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/help/kanon-completion.txt +0 -0
  235. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/help/kanon-doctor.txt +0 -0
  236. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/help/kanon-install.txt +0 -0
  237. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/help/kanon-list.txt +0 -0
  238. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/help/kanon-outdated.txt +0 -0
  239. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/help/kanon-remove.txt +0 -0
  240. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/help/kanon-toplevel.txt +0 -0
  241. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/help/kanon-why.txt +0 -0
  242. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/repo/.gitignore +0 -0
  243. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/repo/README.md +0 -0
  244. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/repo/linter-test-bad.invalid-yaml +0 -0
  245. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/repo/linter-test-bad.md +0 -0
  246. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/repo/linter-test-bad.py +0 -0
  247. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/repo/sample-manifest.xml +0 -0
  248. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/repo/sample-project-config.json +0 -0
  249. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/repo/test.gitconfig +0 -0
  250. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/fixtures/repo/version_constraints_data.json +0 -0
  251. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/__init__.py +0 -0
  252. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/conftest.py +0 -0
  253. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_argparse_errors.py +0 -0
  254. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_argparse_help.py +0 -0
  255. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_bootstrap_errors.py +0 -0
  256. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_bootstrap_list_and_default_target.py +0 -0
  257. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_ci_runs_operator_path_tests.py +0 -0
  258. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_clean_lifecycle.py +0 -0
  259. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_cli_entry_point.py +0 -0
  260. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_completion_snapshots.py +0 -0
  261. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_error_snapshots.py +0 -0
  262. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_exit_code_matrix.py +0 -0
  263. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_groups_filter.py +0 -0
  264. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_help_snapshots.py +0 -0
  265. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_help_text_contract.py +0 -0
  266. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_install_lifecycle.py +0 -0
  267. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_install_real_kanon.py +0 -0
  268. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_kanon_repo_cli.py +0 -0
  269. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_kanon_repo_e2e.py +0 -0
  270. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_kanon_repo_lifecycle_journey.py +0 -0
  271. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_make_operator_path_targets.py +0 -0
  272. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_matrix_traceability_complete.py +0 -0
  273. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_provider_agnostic.py +0 -0
  274. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_abandon_errors.py +0 -0
  275. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_abandon_flags.py +0 -0
  276. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_abandon_happy.py +0 -0
  277. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_branches_errors.py +0 -0
  278. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_branches_flags.py +0 -0
  279. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_branches_happy.py +0 -0
  280. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_checkout_errors.py +0 -0
  281. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_checkout_flags.py +0 -0
  282. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_checkout_happy.py +0 -0
  283. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_cherry_pick_errors.py +0 -0
  284. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_cherry_pick_flags.py +0 -0
  285. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_cherry_pick_happy.py +0 -0
  286. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_diff_errors.py +0 -0
  287. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_diff_flags.py +0 -0
  288. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_diff_happy.py +0 -0
  289. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_diffmanifests_errors.py +0 -0
  290. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_diffmanifests_flags.py +0 -0
  291. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_diffmanifests_happy.py +0 -0
  292. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_dir_override.py +0 -0
  293. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_download_errors.py +0 -0
  294. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_download_flags.py +0 -0
  295. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_download_happy.py +0 -0
  296. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_envsubst_errors.py +0 -0
  297. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_envsubst_flags.py +0 -0
  298. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_envsubst_happy.py +0 -0
  299. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_exit_codes.py +0 -0
  300. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_forall_errors.py +0 -0
  301. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_forall_flags.py +0 -0
  302. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_forall_happy.py +0 -0
  303. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_gc_errors.py +0 -0
  304. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_gc_flags.py +0 -0
  305. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_gc_happy.py +0 -0
  306. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_grep_errors.py +0 -0
  307. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_grep_flags.py +0 -0
  308. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_grep_happy.py +0 -0
  309. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_help_errors.py +0 -0
  310. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_help_flags.py +0 -0
  311. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_help_happy.py +0 -0
  312. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_info_errors.py +0 -0
  313. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_info_flags.py +0 -0
  314. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_info_happy.py +0 -0
  315. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_init_errors.py +0 -0
  316. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_init_flags.py +0 -0
  317. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_init_happy.py +0 -0
  318. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_init_mirror.py +0 -0
  319. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_list_errors.py +0 -0
  320. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_list_flags.py +0 -0
  321. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_list_happy.py +0 -0
  322. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_manifest_errors.py +0 -0
  323. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_manifest_flags.py +0 -0
  324. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_manifest_happy.py +0 -0
  325. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_manifest_revision_as_tag.py +0 -0
  326. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_overview_errors.py +0 -0
  327. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_overview_flags.py +0 -0
  328. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_overview_happy.py +0 -0
  329. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_passthrough.py +0 -0
  330. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_prune_errors.py +0 -0
  331. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_prune_flags.py +0 -0
  332. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_prune_happy.py +0 -0
  333. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_rebase_errors.py +0 -0
  334. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_rebase_flags.py +0 -0
  335. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_rebase_happy.py +0 -0
  336. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_selfupdate_disabled.py +0 -0
  337. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_selfupdate_errors.py +0 -0
  338. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_selfupdate_flags.py +0 -0
  339. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_selfupdate_happy.py +0 -0
  340. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_smartsync_errors.py +0 -0
  341. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_smartsync_flags.py +0 -0
  342. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_smartsync_happy.py +0 -0
  343. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_stage_errors.py +0 -0
  344. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_stage_flags.py +0 -0
  345. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_stage_happy.py +0 -0
  346. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_start_errors.py +0 -0
  347. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_start_flags.py +0 -0
  348. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_start_happy.py +0 -0
  349. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_status_errors.py +0 -0
  350. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_status_flags.py +0 -0
  351. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_status_happy.py +0 -0
  352. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_sync_errors.py +0 -0
  353. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_sync_flags.py +0 -0
  354. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_sync_happy.py +0 -0
  355. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_upload_errors.py +0 -0
  356. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_upload_flags.py +0 -0
  357. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_repo_upload_happy.py +0 -0
  358. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_stdout_stderr_discipline.py +0 -0
  359. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_validate_lifecycle.py +0 -0
  360. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_validate_marketplace.py +0 -0
  361. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_validate_xml_errors.py +0 -0
  362. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_validate_xml_repo_root.py +0 -0
  363. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/functional/test_zero_source_clean_error.py +0 -0
  364. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/__init__.py +0 -0
  365. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/conftest.py +0 -0
  366. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/fixtures/__init__.py +0 -0
  367. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/fixtures/synthetic/__init__.py +0 -0
  368. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/fixtures/synthetic/conftest.py +0 -0
  369. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/fixtures/synthetic/drift.py +0 -0
  370. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/fixtures/synthetic/test_synthetic_pytest_fixtures.py +0 -0
  371. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/fixtures/synthetic/upgrade_versioned.py +0 -0
  372. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/provider_allowlist.txt +0 -0
  373. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/__init__.py +0 -0
  374. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_bug_fixes.py +0 -0
  375. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_consolidated_constraints_e2e.py +0 -0
  376. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_envsubst_integration.py +0 -0
  377. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_import_functional.py +0 -0
  378. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_linkfile_copyfile.py +0 -0
  379. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_linkfile_exclude_journey.py +0 -0
  380. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_manifest_parsing.py +0 -0
  381. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_process_isolation.py +0 -0
  382. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_repo_module_smoke.py +0 -0
  383. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_repo_pipeline.py +0 -0
  384. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_repo_run_lifecycle.py +0 -0
  385. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_repo_sync_lifecycle.py +0 -0
  386. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_version_constraints_integration.py +0 -0
  387. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_xml_annotation_roundtrip.py +0 -0
  388. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_xml_contactinfo_roundtrip.py +0 -0
  389. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_xml_copyfile_roundtrip.py +0 -0
  390. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_xml_default_roundtrip.py +0 -0
  391. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_xml_extend_project_roundtrip.py +0 -0
  392. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_xml_include_roundtrip.py +0 -0
  393. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_xml_linkfile_roundtrip.py +0 -0
  394. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_xml_manifest_roundtrip.py +0 -0
  395. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_xml_manifest_server_roundtrip.py +0 -0
  396. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_xml_notice_roundtrip.py +0 -0
  397. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_xml_project_roundtrip.py +0 -0
  398. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_xml_remote_roundtrip.py +0 -0
  399. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_xml_remove_project_roundtrip.py +0 -0
  400. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_xml_repo_hooks_roundtrip.py +0 -0
  401. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_xml_submanifest_roundtrip.py +0 -0
  402. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/repo/test_xml_superproject_roundtrip.py +0 -0
  403. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_add_core.py +0 -0
  404. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_add_dry_run.py +0 -0
  405. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_add_marketplace_flag.py +0 -0
  406. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_add_zero_tags.py +0 -0
  407. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_auto_discovery.py +0 -0
  408. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_background_refresh.py +0 -0
  409. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_bootstrap_shim.py +0 -0
  410. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_cache_clock_skew.py +0 -0
  411. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_cache_layout.py +0 -0
  412. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_catalog_audit_entry_uniqueness.py +0 -0
  413. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_catalog_audit_framework.py +0 -0
  414. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_catalog_audit_legacy_dir.py +0 -0
  415. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_catalog_audit_metadata.py +0 -0
  416. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_catalog_audit_remote_url.py +0 -0
  417. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_catalog_audit_source_name.py +0 -0
  418. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_catalog_audit_strict.py +0 -0
  419. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_catalog_audit_tag_format.py +0 -0
  420. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_catalog_constraints.py +0 -0
  421. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_ci_validation.py +0 -0
  422. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_clean_env_override_cleanup.py +0 -0
  423. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_clean_lifecycle.py +0 -0
  424. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_clean_paths.py +0 -0
  425. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_cli_entry_points.py +0 -0
  426. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_complete_cached_catalogs.py +0 -0
  427. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_complete_catalog_entries.py +0 -0
  428. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_complete_catalog_versions.py +0 -0
  429. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_complete_lockfile_names.py +0 -0
  430. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_complete_project_versions.py +0 -0
  431. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_complete_source_names.py +0 -0
  432. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_completion_bash.py +0 -0
  433. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_completion_subcommand.py +0 -0
  434. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_completion_zsh.py +0 -0
  435. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_concurrency.py +0 -0
  436. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_concurrency_serialization.py +0 -0
  437. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_copyfile_fs_effects.py +0 -0
  438. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_doc_validation.py +0 -0
  439. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_doctor_cache_flags.py +0 -0
  440. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_doctor_cache_flags_workspace_independent.py +0 -0
  441. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_doctor_consistency.py +0 -0
  442. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_doctor_default_subcheck_output.py +0 -0
  443. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_doctor_effective_source.py +0 -0
  444. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_doctor_prune_cache.py +0 -0
  445. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_doctor_remote_check.py +0 -0
  446. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_envsubst_command.py +0 -0
  447. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_fs_fault_extended.py +0 -0
  448. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_fs_fault_injection.py +0 -0
  449. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_full_lifecycle_synthetic.py +0 -0
  450. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_full_user_journey.py +0 -0
  451. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_git_fault_injection.py +0 -0
  452. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_git_retry_env.py +0 -0
  453. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_gitignore_idempotency.py +0 -0
  454. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_install_after_add.py +0 -0
  455. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_install_command.py +0 -0
  456. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_install_conflict_url_normalization.py +0 -0
  457. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_install_errors.py +0 -0
  458. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_install_include_cycle.py +0 -0
  459. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_install_include_diamond.py +0 -0
  460. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_install_lifecycle.py +0 -0
  461. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_install_lock_file_derivation.py +0 -0
  462. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_install_lockfile_replay.py +0 -0
  463. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_install_marketplace_registration.py +0 -0
  464. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_install_no_kanon_remediation.py +0 -0
  465. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_install_optional_vars.py +0 -0
  466. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_install_paths.py +0 -0
  467. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_install_reconcile.py +0 -0
  468. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_install_refresh_lock.py +0 -0
  469. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_install_refresh_lock_source.py +0 -0
  470. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_install_remote_url_policy.py +0 -0
  471. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_install_required_vars.py +0 -0
  472. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_install_strict.py +0 -0
  473. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_json_output_stream_discipline.py +0 -0
  474. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_kanon_add_placeholder_handling.py +0 -0
  475. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_kanon_clean_embedded.py +0 -0
  476. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_kanon_full_lifecycle.py +0 -0
  477. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_kanon_install_embedded.py +0 -0
  478. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_kanonenv_parsing.py +0 -0
  479. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_lifecycle_recovery.py +0 -0
  480. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_linkfile_fs_effects.py +0 -0
  481. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_list_all_versions.py +0 -0
  482. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_list_all_versions_canonical.py +0 -0
  483. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_list_all_versions_malformed_revision_resilience.py +0 -0
  484. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_list_default.py +0 -0
  485. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_list_detail.py +0 -0
  486. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_list_filter.py +0 -0
  487. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_list_format_json.py +0 -0
  488. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_list_synthetic_catalog_variants.py +0 -0
  489. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_list_tree.py +0 -0
  490. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_lockfile_roundtrip.py +0 -0
  491. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_marketplace_install.py +0 -0
  492. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_marketplace_lifecycle.py +0 -0
  493. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_marketplace_orphan_prune.py +0 -0
  494. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_midtoken_bash.py +0 -0
  495. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_midtoken_zsh.py +0 -0
  496. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_misc_features.py +0 -0
  497. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_multi_source_aggregation.py +0 -0
  498. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_no_bundled_catalog.py +0 -0
  499. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_no_default_catalog.py +0 -0
  500. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_no_hardcoded_org_values.py +0 -0
  501. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_observability.py +0 -0
  502. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_outdated.py +0 -0
  503. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_outdated_branch_drift.py +0 -0
  504. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_outdated_fail_on_upgrade.py +0 -0
  505. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_outdated_format_json.py +0 -0
  506. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_outdated_refs_tags_revision_parsing.py +0 -0
  507. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_platform_parity.py +0 -0
  508. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_preamble_bash.py +0 -0
  509. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_preamble_zsh.py +0 -0
  510. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_remove_core.py +0 -0
  511. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_remove_dry_run.py +0 -0
  512. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_remove_force_integration.py +0 -0
  513. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_signal_handling.py +0 -0
  514. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_synthetic_drift_fixture.py +0 -0
  515. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_synthetic_upgrade_versioned_fixture.py +0 -0
  516. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_unicode_encoding.py +0 -0
  517. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_validate_marketplace.py +0 -0
  518. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_validate_metadata.py +0 -0
  519. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_validate_xml.py +0 -0
  520. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_version_resolution.py +0 -0
  521. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_version_widened_bare_pep440.py +0 -0
  522. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_wheel_e2e.py +0 -0
  523. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_why_ambiguous.py +0 -0
  524. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_why_chain_walker.py +0 -0
  525. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_why_format_json.py +0 -0
  526. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_why_live_resolve.py +0 -0
  527. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_why_not_found_suggestion.py +0 -0
  528. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/integration/test_workspace_dir_env.py +0 -0
  529. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/regression/test_e0_f1_s2_t5_regression.py +0 -0
  530. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/regression/test_e0_f5_s2_t7_regression.py +0 -0
  531. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/regression/test_e0_f6_s1_t1_regression.py +0 -0
  532. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/regression/test_e0_f6_s1_t2_regression.py +0 -0
  533. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/regression/test_e0_f6_s1_t3_regression.py +0 -0
  534. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/regression/test_e0_f6_s1_t4_regression.py +0 -0
  535. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/regression/test_e0_f6_s2_t1_regression.py +0 -0
  536. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/regression/test_e0_f6_s2_t2_regression.py +0 -0
  537. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/regression/test_e0_f6_s2_t3_regression.py +0 -0
  538. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/regression/test_e0_f6_s2_t4_regression.py +0 -0
  539. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/regression/test_e0_f6_s2_t5_regression.py +0 -0
  540. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/regression/test_e0_f6_s2_t6_regression.py +0 -0
  541. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/regression/test_e0_f6_s3_t1_regression.py +0 -0
  542. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/regression/test_e0_f6_s3_t2_regression.py +0 -0
  543. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/regression/test_e0_install_relative_regression.py +0 -0
  544. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/__init__.py +0 -0
  545. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/_rp_helpers.py +0 -0
  546. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/conftest.py +0 -0
  547. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_ad.py +0 -0
  548. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_bs.py +0 -0
  549. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_cd.py +0 -0
  550. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_cs.py +0 -0
  551. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_doctor_cache.py +0 -0
  552. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_ec.py +0 -0
  553. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_ep.py +0 -0
  554. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_ev.py +0 -0
  555. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_hv.py +0 -0
  556. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_ic.py +0 -0
  557. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_id.py +0 -0
  558. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_ks.py +0 -0
  559. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_lf.py +0 -0
  560. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_lockfile_lifecycle.py +0 -0
  561. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_marketplace_direct_checkout.py +0 -0
  562. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_mk.py +0 -0
  563. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_ms.py +0 -0
  564. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_pk.py +0 -0
  565. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rc.py +0 -0
  566. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_refresh_lock_existing_checkout.py +0 -0
  567. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rls_exact_vs_range.py +0 -0
  568. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_abandon.py +0 -0
  569. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_branches.py +0 -0
  570. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_checkout.py +0 -0
  571. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_cherry_pick.py +0 -0
  572. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_diff.py +0 -0
  573. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_diffmanifests.py +0 -0
  574. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_download.py +0 -0
  575. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_envsubst.py +0 -0
  576. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_forall.py +0 -0
  577. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_gc.py +0 -0
  578. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_grep.py +0 -0
  579. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_help.py +0 -0
  580. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_info.py +0 -0
  581. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_init.py +0 -0
  582. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_list.py +0 -0
  583. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_manifest.py +0 -0
  584. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_overview.py +0 -0
  585. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_prune.py +0 -0
  586. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_rebase.py +0 -0
  587. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_smartsync.py +0 -0
  588. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_stage.py +0 -0
  589. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_start.py +0 -0
  590. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_status.py +0 -0
  591. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_sync.py +0 -0
  592. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_upload.py +0 -0
  593. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rp_wrap.py +0 -0
  594. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_rx.py +0 -0
  595. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_scenario_coverage_meta.py +0 -0
  596. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_tc_bootstrap.py +0 -0
  597. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_tc_clean.py +0 -0
  598. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_tc_install.py +0 -0
  599. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_tc_validate.py +0 -0
  600. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_uj.py +0 -0
  601. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_va.py +0 -0
  602. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_why_surface_query.py +0 -0
  603. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_why_url_path.py +0 -0
  604. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/scenarios/test_why_url_path_placeholder.py +0 -0
  605. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/security/__init__.py +0 -0
  606. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/security/test_security_hardening.py +0 -0
  607. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/test_wheel_layout.py +0 -0
  608. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/__init__.py +0 -0
  609. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/commands/test_repo_dir_resolution.py +0 -0
  610. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/conftest.py +0 -0
  611. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/__init__.py +0 -0
  612. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/conftest.py +0 -0
  613. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/fixtures/.gitignore +0 -0
  614. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/fixtures/README.md +0 -0
  615. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/fixtures/sample-manifest.xml +0 -0
  616. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/fixtures/sample-project-config.json +0 -0
  617. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/fixtures/test.gitconfig +0 -0
  618. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/fixtures/version_constraints_data.json +0 -0
  619. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/functional/__init__.py +0 -0
  620. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/functional/test_features.py +0 -0
  621. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/subcmds/__init__.py +0 -0
  622. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/subcmds/test_init_mirror.py +0 -0
  623. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/subcmds/test_manifest_revision_as_tag.py +0 -0
  624. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/subcmds/test_manifest_revision_as_tag_pep440.py +0 -0
  625. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/subcmds/test_selfupdate_stub.py +0 -0
  626. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_abandon_massive.py +0 -0
  627. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_branches_coverage.py +0 -0
  628. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_bug10_selfupdate_incompatible.py +0 -0
  629. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_bug11_race_condition.py +0 -0
  630. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_bug12_backup_preserved.py +0 -0
  631. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_bug13_init_reinit_warning.py +0 -0
  632. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_bug14_non_tty_log.py +0 -0
  633. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_bug15_prerelease_docs.py +0 -0
  634. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_bug16_nested_var_warning.py +0 -0
  635. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_bug18_envsubst_double_parse.py +0 -0
  636. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_bug19_glob_src_error.py +0 -0
  637. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_bug1_envsubst_malformed_xml.py +0 -0
  638. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_bug20_glob_dest_file.py +0 -0
  639. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_bug2_linkfile_errors.py +0 -0
  640. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_bug3_execv_replaces_process.py +0 -0
  641. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_bug4_symlink_overwrite.py +0 -0
  642. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_bug5_empty_envsubst_list.py +0 -0
  643. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_bug6_undefined_env_vars.py +0 -0
  644. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_bug7_git_ls_remote_retry.py +0 -0
  645. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_bug8_ls_remote_stderr.py +0 -0
  646. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_bug9_constraint_resolution_cache.py +0 -0
  647. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_checklocalpath_rules_1_5.py +0 -0
  648. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_checklocalpath_rules_6_11.py +0 -0
  649. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_checkout_massive.py +0 -0
  650. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_cherrypick_coverage.py +0 -0
  651. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_color.py +0 -0
  652. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_command.py +0 -0
  653. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_conftest_fixtures.py +0 -0
  654. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_diffmanifests_deep.py +0 -0
  655. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_doc_validate_git_preconditions.py +0 -0
  656. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_download_coverage.py +0 -0
  657. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_editor.py +0 -0
  658. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_embedded_mode.py +0 -0
  659. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_envsubst_basic.py +0 -0
  660. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_envsubst_edge.py +0 -0
  661. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_envsubst_massive.py +0 -0
  662. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_error.py +0 -0
  663. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_event_log.py +0 -0
  664. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_event_log_massive.py +0 -0
  665. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_fetch.py +0 -0
  666. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_fixture_files.py +0 -0
  667. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_forall_deep.py +0 -0
  668. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_git_command.py +0 -0
  669. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_git_config.py +0 -0
  670. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_git_refs.py +0 -0
  671. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_git_superproject.py +0 -0
  672. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_git_trace2_event_log.py +0 -0
  673. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_gitconfig_coverage.py +0 -0
  674. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_grep_deep.py +0 -0
  675. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_harness_smoke.py +0 -0
  676. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_hooks.py +0 -0
  677. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_import_verification.py +0 -0
  678. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_imports.py +0 -0
  679. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_include_path_resolution.py +0 -0
  680. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_info_deep.py +0 -0
  681. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_init_deep.py +0 -0
  682. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_list_massive.py +0 -0
  683. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_main.py +0 -0
  684. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_main_coverage.py +0 -0
  685. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_main_init_download_boost.py +0 -0
  686. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_makefile_lint_format.py +0 -0
  687. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_makefile_structure.py +0 -0
  688. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_makefile_test_targets.py +0 -0
  689. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_manifest_coverage_boost.py +0 -0
  690. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_manifest_deep.py +0 -0
  691. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_manifest_doc_rp_flags.py +0 -0
  692. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_manifest_massive.py +0 -0
  693. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_manifest_subcmd_massive.py +0 -0
  694. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_manifest_xml.py +0 -0
  695. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_manifest_xml_pep440.py +0 -0
  696. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_medium_files_boost.py +0 -0
  697. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_mkdtemp_cleanup.py +0 -0
  698. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_overview_massive.py +0 -0
  699. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_package_structure.py +0 -0
  700. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_pager.py +0 -0
  701. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_parselist.py +0 -0
  702. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_pep440_edge_1.py +0 -0
  703. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_pep440_edge_2.py +0 -0
  704. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_pep440_ops_ge.py +0 -0
  705. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_pep440_ops_rest.py +0 -0
  706. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_platform_utils.py +0 -0
  707. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_process_isolation.py +0 -0
  708. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_progress.py +0 -0
  709. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_project.py +0 -0
  710. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_project_coverage_boost.py +0 -0
  711. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_project_coverage_threshold.py +0 -0
  712. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_project_deep.py +0 -0
  713. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_project_deep_boost.py +0 -0
  714. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_project_final_boost.py +0 -0
  715. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_project_integration.py +0 -0
  716. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_project_massive.py +0 -0
  717. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_project_metaproject_boost.py +0 -0
  718. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_project_methods.py +0 -0
  719. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_project_sync.py +0 -0
  720. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_prune_massive.py +0 -0
  721. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_rebase_coverage.py +0 -0
  722. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_remaining_coverage_boost.py +0 -0
  723. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_repo_envsubst_api.py +0 -0
  724. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_repo_logging.py +0 -0
  725. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_repo_run_api.py +0 -0
  726. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_repo_sync_api.py +0 -0
  727. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_repo_trace.py +0 -0
  728. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_revision_inheritance.py +0 -0
  729. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_revision_tag_branch_sha.py +0 -0
  730. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_ruff_config.py +0 -0
  731. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_selfupdate_embedded.py +0 -0
  732. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_selfupdate_massive.py +0 -0
  733. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_small_files_boost.py +0 -0
  734. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_ssh.py +0 -0
  735. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_ssh_deep.py +0 -0
  736. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_stage_coverage.py +0 -0
  737. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_stage_massive.py +0 -0
  738. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_start_coverage.py +0 -0
  739. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_status_coverage.py +0 -0
  740. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_status_gaps.py +0 -0
  741. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_status_massive.py +0 -0
  742. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmd_imports.py +0 -0
  743. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds.py +0 -0
  744. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_abandon.py +0 -0
  745. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_branches.py +0 -0
  746. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_checkout.py +0 -0
  747. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_cherry_pick.py +0 -0
  748. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_diff.py +0 -0
  749. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_diffmanifests.py +0 -0
  750. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_download.py +0 -0
  751. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_envsubst.py +0 -0
  752. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_forall.py +0 -0
  753. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_gc.py +0 -0
  754. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_grep.py +0 -0
  755. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_help.py +0 -0
  756. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_info.py +0 -0
  757. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_init.py +0 -0
  758. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_list.py +0 -0
  759. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_manifest.py +0 -0
  760. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_overview.py +0 -0
  761. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_prune.py +0 -0
  762. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_rebase.py +0 -0
  763. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_selfupdate.py +0 -0
  764. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_smartsync.py +0 -0
  765. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_stage.py +0 -0
  766. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_start.py +0 -0
  767. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_status.py +0 -0
  768. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_sync.py +0 -0
  769. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_subcmds_upload.py +0 -0
  770. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_superproject_deep.py +0 -0
  771. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_sync_coverage_boost.py +0 -0
  772. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_sync_deep.py +0 -0
  773. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_sync_deep_boost.py +0 -0
  774. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_sync_massive.py +0 -0
  775. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_upload_deep.py +0 -0
  776. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_version_consolidation.py +0 -0
  777. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_version_constraints.py +0 -0
  778. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_wheel_contents.py +0 -0
  779. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_wrapper.py +0 -0
  780. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_annotation_attributes.py +0 -0
  781. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_annotation_crossref.py +0 -0
  782. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_annotation_happy.py +0 -0
  783. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_contactinfo_attributes.py +0 -0
  784. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_contactinfo_crossref.py +0 -0
  785. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_contactinfo_happy.py +0 -0
  786. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_copyfile_attributes.py +0 -0
  787. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_copyfile_crossref.py +0 -0
  788. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_copyfile_happy.py +0 -0
  789. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_default_attributes.py +0 -0
  790. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_default_crossref.py +0 -0
  791. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_default_happy.py +0 -0
  792. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_extend_project_attributes.py +0 -0
  793. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_extend_project_crossref.py +0 -0
  794. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_extend_project_happy.py +0 -0
  795. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_fault_malformed.py +0 -0
  796. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_fault_structural.py +0 -0
  797. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_include_attributes.py +0 -0
  798. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_include_crossref.py +0 -0
  799. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_include_cycles.py +0 -0
  800. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_include_happy.py +0 -0
  801. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_linkfile_attributes.py +0 -0
  802. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_linkfile_crossref.py +0 -0
  803. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_linkfile_happy.py +0 -0
  804. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_manifest_attributes.py +0 -0
  805. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_manifest_crossref.py +0 -0
  806. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_manifest_happy.py +0 -0
  807. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_manifest_server_attributes.py +0 -0
  808. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_manifest_server_crossref.py +0 -0
  809. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_manifest_server_flow.py +0 -0
  810. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_manifest_server_happy.py +0 -0
  811. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_notice_attributes.py +0 -0
  812. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_notice_crossref.py +0 -0
  813. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_notice_happy.py +0 -0
  814. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_project_attributes.py +0 -0
  815. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_project_crossref.py +0 -0
  816. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_project_happy.py +0 -0
  817. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_remote_attributes.py +0 -0
  818. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_remote_crossref.py +0 -0
  819. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_remote_happy.py +0 -0
  820. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_remove_project_attributes.py +0 -0
  821. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_remove_project_crossref.py +0 -0
  822. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_remove_project_happy.py +0 -0
  823. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_repo_hooks_attributes.py +0 -0
  824. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_repo_hooks_crossref.py +0 -0
  825. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_repo_hooks_happy.py +0 -0
  826. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_submanifest_attributes.py +0 -0
  827. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_submanifest_crossref.py +0 -0
  828. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_submanifest_happy.py +0 -0
  829. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_superproject_attributes.py +0 -0
  830. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_superproject_crossref.py +0 -0
  831. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_superproject_flow.py +0 -0
  832. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xml_superproject_happy.py +0 -0
  833. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xmlbool.py +0 -0
  834. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_xmlint.py +0 -0
  835. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/repo/test_yamllint_config.py +0 -0
  836. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_accessed_at_coalescing.py +0 -0
  837. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_add.py +0 -0
  838. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_add_collision.py +0 -0
  839. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_add_zero_tags.py +0 -0
  840. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_background_refresh.py +0 -0
  841. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_bare_semver_to_tag.py +0 -0
  842. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_bootstrap_deprecation.py +0 -0
  843. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_cache.py +0 -0
  844. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_cache_layout.py +0 -0
  845. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_cache_ttl.py +0 -0
  846. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_catalog.py +0 -0
  847. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_catalog_audit_check_parser.py +0 -0
  848. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_catalog_audit_entry_uniqueness.py +0 -0
  849. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_catalog_audit_framework.py +0 -0
  850. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_catalog_audit_legacy_dir.py +0 -0
  851. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_catalog_audit_metadata.py +0 -0
  852. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_catalog_audit_project_tag_format.py +0 -0
  853. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_catalog_audit_remote_url.py +0 -0
  854. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_catalog_audit_source_name.py +0 -0
  855. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_catalog_audit_strict.py +0 -0
  856. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_catalog_audit_tag_format.py +0 -0
  857. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_catalog_source_parsing.py +0 -0
  858. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_ci_workflows.py +0 -0
  859. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_clean.py +0 -0
  860. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_clean_command.py +0 -0
  861. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_cli.py +0 -0
  862. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_cli_args.py +0 -0
  863. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_cli_help_format.py +0 -0
  864. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_cli_json_stream_discipline.py +0 -0
  865. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_complete_cached_catalogs.py +0 -0
  866. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_complete_catalog_entries.py +0 -0
  867. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_complete_catalog_versions.py +0 -0
  868. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_complete_lockfile_names.py +0 -0
  869. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_complete_project_versions.py +0 -0
  870. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_complete_source_names.py +0 -0
  871. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_completion.py +0 -0
  872. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_completion_sanitization.py +0 -0
  873. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_completion_subcommand.py +0 -0
  874. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_concurrency.py +0 -0
  875. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_conftest_scrubber.py +0 -0
  876. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_constants.py +0 -0
  877. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_constants_doctor_subcheck.py +0 -0
  878. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_constants_install_after_add.py +0 -0
  879. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_constants_outdated_refs_tags.py +0 -0
  880. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_constants_why_lockfile.py +0 -0
  881. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_coverage_gaps.py +0 -0
  882. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_derive_source_name.py +0 -0
  883. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_discover.py +0 -0
  884. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_discover_source_names_missing_url.py +0 -0
  885. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_docs_embedded_architecture.py +0 -0
  886. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_docs_remaining_and_catalog.py +0 -0
  887. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_doctor.py +0 -0
  888. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_doctor_cache_flags.py +0 -0
  889. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_doctor_completion_errors.py +0 -0
  890. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_doctor_completion_staleness.py +0 -0
  891. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_doctor_consistency.py +0 -0
  892. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_doctor_coverage_gaps.py +0 -0
  893. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_doctor_effective_source.py +0 -0
  894. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_doctor_remote_reachability.py +0 -0
  895. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_env_isolation.py +0 -0
  896. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_envsubst_subcommand.py +0 -0
  897. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_include_walker.py +0 -0
  898. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_install.py +0 -0
  899. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_install_command.py +0 -0
  900. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_install_conflict_detection.py +0 -0
  901. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_install_https_enforcement.py +0 -0
  902. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_install_placeholder_validation.py +0 -0
  903. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_install_reconcile_decision.py +0 -0
  904. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_install_refresh_lock.py +0 -0
  905. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_install_refresh_lock_source.py +0 -0
  906. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_install_state_matrix.py +0 -0
  907. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_install_strict_flags.py +0 -0
  908. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_install_strict_lock_orphan_naming.py +0 -0
  909. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_integration_testing_doc_manifest_paths.py +0 -0
  910. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_integration_testing_doc_s2_t14.py +0 -0
  911. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_integration_testing_doc_s2_t4.py +0 -0
  912. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_integration_testing_doc_s2_t5.py +0 -0
  913. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_integration_testing_doc_s2_t6.py +0 -0
  914. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_integration_testing_doc_s2_t7.py +0 -0
  915. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_integration_testing_doc_s2_tier1.py +0 -0
  916. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_kanon_hash.py +0 -0
  917. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_kanonenv.py +0 -0
  918. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_kanonenv_advanced_edge_cases.py +0 -0
  919. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_kanonenv_edge_cases.py +0 -0
  920. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_levenshtein.py +0 -0
  921. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_list.py +0 -0
  922. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_list_all_versions.py +0 -0
  923. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_list_coverage_gaps.py +0 -0
  924. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_list_detail.py +0 -0
  925. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_list_filter.py +0 -0
  926. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_list_format_json.py +0 -0
  927. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_list_tree.py +0 -0
  928. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_lock_file_path.py +0 -0
  929. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_lockfile.py +0 -0
  930. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_lockfile_coverage_gaps.py +0 -0
  931. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_lockfile_schema_migration.py +0 -0
  932. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_manifest.py +0 -0
  933. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_marketplace.py +0 -0
  934. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_marketplace_install.py +0 -0
  935. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_marketplace_non_plugin_skip.py +0 -0
  936. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_marketplace_validator.py +0 -0
  937. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_metadata.py +0 -0
  938. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_midtoken_splitter.py +0 -0
  939. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_outdated.py +0 -0
  940. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_outdated_branch_pinned.py +0 -0
  941. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_outdated_fail_on_upgrade.py +0 -0
  942. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_outdated_format_json.py +0 -0
  943. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_pep440_filter.py +0 -0
  944. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_pre_push_hook.py +0 -0
  945. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_preamble.py +0 -0
  946. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_preamble_semver_tags.py +0 -0
  947. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_provider_agnosticism.py +0 -0
  948. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_pyproject_build_config.py +0 -0
  949. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_remote_url.py +0 -0
  950. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_remove.py +0 -0
  951. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_remove_dry_run.py +0 -0
  952. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_remove_force.py +0 -0
  953. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_remove_line_endings.py +0 -0
  954. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_repo.py +0 -0
  955. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_repo_abspath.py +0 -0
  956. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_repo_command.py +0 -0
  957. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_resolve_catalog_dir.py +0 -0
  958. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_revision_resolve.py +0 -0
  959. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_rx_catalog_sub_repo.py +0 -0
  960. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_sanitize.py +0 -0
  961. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_url.py +0 -0
  962. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_validate.py +0 -0
  963. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_validate_command.py +0 -0
  964. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_validate_metadata.py +0 -0
  965. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_version.py +0 -0
  966. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_version_constraint_errors.py +0 -0
  967. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_why.py +0 -0
  968. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_why_ambiguity.py +0 -0
  969. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_why_format_json.py +0 -0
  970. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_why_suggestions.py +0 -0
  971. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/tests/unit/test_xml_validator.py +0 -0
  972. {kanon_cli-2.0.0 → kanon_cli-2.0.1}/uv.lock +0 -0
@@ -2,6 +2,15 @@
2
2
 
3
3
 
4
4
 
5
+ ## v2.0.1 (2026-06-03)
6
+
7
+ ### Documentation
8
+
9
+ * docs: present kanon repo as a native subcommand in the CLI reference (#73)
10
+
11
+ * docs: align CLI documentation with the released 2.0.0 surface (#72)
12
+
13
+
5
14
  ## v2.0.0 (2026-06-03)
6
15
 
7
16
  ### Breaking
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kanon-cli
3
- Version: 2.0.0
3
+ Version: 2.0.1
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
@@ -49,11 +49,19 @@ via declarative manifests.
49
49
  - [Standalone Usage (No Task Runner Required)](#standalone-usage-no-task-runner-required)
50
50
  - [Integrating with Task Runners (Optional)](#integrating-with-task-runners-optional)
51
51
  - [CLI Reference](#cli-reference)
52
- - [kanon bootstrap](#kanon-bootstrap)
52
+ - [kanon list](#kanon-list)
53
+ - [kanon add](#kanon-add)
54
+ - [kanon remove](#kanon-remove)
53
55
  - [kanon install](#kanon-install)
54
56
  - [kanon clean](#kanon-clean)
55
- - [kanon validate xml](#kanon-validate-xml)
56
- - [kanon validate marketplace](#kanon-validate-marketplace)
57
+ - [kanon outdated](#kanon-outdated)
58
+ - [kanon why](#kanon-why)
59
+ - [kanon doctor](#kanon-doctor)
60
+ - [kanon validate](#kanon-validate)
61
+ - [kanon catalog audit](#kanon-catalog-audit)
62
+ - [kanon repo](#kanon-repo)
63
+ - [kanon completion](#kanon-completion)
64
+ - [kanon bootstrap (deprecated)](#kanon-bootstrap-deprecated)
57
65
  - [.kanon Variable Reference](#kanon-variable-reference)
58
66
  - [Core Variables](#core-variables)
59
67
  - [Source Variables](#source-variables)
@@ -66,9 +74,10 @@ via declarative manifests.
66
74
  - [Environment Variable Portability (envsubst)](#environment-variable-portability-envsubst)
67
75
  - [Creating a Manifest Repository](#creating-a-manifest-repository)
68
76
  - [Structure](#structure)
77
+ - [Catalog entry (-marketplace.xml)](#catalog-entry--marketplacexml)
69
78
  - [remote.xml -- Git Remote Definition](#remotexml----git-remote-definition)
70
79
  - [packages.xml -- Package Declarations](#packagesxml----package-declarations)
71
- - [meta.xml -- Entry Point](#metaxml----entry-point)
80
+ - [Entry-point manifest](#entry-point-manifest)
72
81
  - [Include Chains for Hierarchy](#include-chains-for-hierarchy)
73
82
  - [Updating Package Versions](#updating-package-versions)
74
83
  - [Creating Packages](#creating-packages)
@@ -187,11 +196,10 @@ system-wide setup, see [docs/shell-completion.md](docs/shell-completion.md).
187
196
  | `kanon validate xml` | Validate XML manifests under `repo-specs/` | [docs/repo/manifest-format.md](docs/repo/manifest-format.md) |
188
197
  | `kanon validate marketplace` | Validate marketplace XML manifests under `repo-specs/` | [docs/repo/manifest-format.md](docs/repo/manifest-format.md) |
189
198
  | `kanon validate metadata` | Validate catalog entry metadata | [docs/catalog-author-guide.md](docs/catalog-author-guide.md) |
190
- | `kanon clean` | Remove all synced packages and Kanon state directories | [docs/lifecycle.md](docs/lifecycle.md) |
199
+ | `kanon clean` | Remove synced packages and Kanon state (`--orphans` also prunes unreferenced marketplaces) | [docs/lifecycle.md](docs/lifecycle.md) |
191
200
  | `kanon repo` | Low-level manifest-driven repo sync subsystem | [docs/repo/README.md](docs/repo/README.md) |
192
201
  | `kanon completion` | Emit a shell completion script for bash or zsh | [docs/shell-completion.md](docs/shell-completion.md) |
193
- | `kanon bootstrap` | **deprecated; see `kanon add` / `kanon list`** -- scaffold a project from a catalog entry | [docs/migration-bootstrap-to-add.md](docs/migration-bootstrap-to-add.md) |
194
- | `kanon bootstrap list` | **deprecated; see `kanon list`** -- list available catalog entries | [docs/migration-bootstrap-to-add.md](docs/migration-bootstrap-to-add.md) |
202
+ | `kanon bootstrap` | **deprecated (removed in 2.0; exits 3)** -- use `kanon list` / `kanon add` instead | [docs/migration-bootstrap-to-add.md](docs/migration-bootstrap-to-add.md) |
195
203
 
196
204
  ---
197
205
 
@@ -295,77 +303,80 @@ reinstalling. CI uses `pip install kanon-cli` for ephemeral runners; see
295
303
 
296
304
  ### Standalone Usage (No Task Runner Required)
297
305
 
298
- Kanon works directly from the command line. No task runner is needed.
299
-
300
- **1. Bootstrap a project:**
306
+ Kanon works directly from the command line. No task runner is needed. The
307
+ workflow is declarative: you discover entries in a remote catalog, add the
308
+ ones you want to `.kanon`, install them, and (optionally) clean up. Every
309
+ command that resolves a catalog needs a catalog source -- either the
310
+ `--catalog-source <url>@<ref>` flag or the `KANON_CATALOG_SOURCE`
311
+ environment variable.
301
312
 
302
313
  ```bash
303
- kanon bootstrap kanon # Copy .kanon and readme (template)
304
- kanon bootstrap list # See all available catalog entry packages
314
+ # Set once in your shell rc file -- pin to the current major version
315
+ export KANON_CATALOG_SOURCE='https://github.com/your-org/your-catalog-repo.git@>=2.0.0,<3.0.0'
305
316
  ```
306
317
 
307
- **2. Edit `.kanon`** -- Set `GITBASE`, `KANON_MARKETPLACE_INSTALL`, and
308
- source variables for your organization.
309
-
310
- **3. Install (sync all packages):**
318
+ **1. Discover entries in the catalog:**
311
319
 
312
320
  ```bash
313
- kanon install
321
+ kanon list # all entry names, one per line
322
+ kanon list --detail # human-readable record per entry
323
+ kanon list my-tool --detail # narrow to entries matching a substring
314
324
  ```
315
325
 
316
- This syncs all packages to `.packages/`, creates source workspaces in
317
- `.kanon-data/sources/`, and adds `.packages/` and `.kanon-data/` to
318
- `.gitignore`.
326
+ `kanon list` reads the `*-marketplace.xml` files under `repo-specs/` in the
327
+ manifest repo and prints one catalog entry name per line.
319
328
 
320
- **4. Clean (full teardown):**
321
-
322
- > **Tip:** Use a remote catalog for pre-configured entries that require no
323
- > placeholder editing. See
324
- > [Usage with Remote Catalogs](#usage-with-remote-catalogs-optional) below.
329
+ **2. Add entries to `.kanon`:**
325
330
 
326
331
  ```bash
327
- kanon clean
332
+ kanon add my-tool # pin to the highest available version
333
+ kanon add 'my-tool@>=1.0.0,<2.0.0' # pin with a PEP 440 constraint
334
+ kanon add my-tool --marketplace-install # also enable the marketplace lifecycle
328
335
  ```
329
336
 
330
- This removes all synced packages, Kanon state directories, and optionally
331
- uninstalls marketplace plugins.
337
+ `kanon add` resolves each entry against the catalog and writes the
338
+ `KANON_SOURCE_<name>_{URL,REVISION,PATH}` triple into `.kanon`, creating the
339
+ file with a standard header when it does not yet exist.
332
340
 
333
- **Important:** All synced files in `.packages/` and `.kanon-data/` are
334
- ephemeral and should not be committed. Only commit the catalog entry files
335
- and `.kanon` to your repository.
341
+ **3. Install (sync all packages, write `.kanon.lock`):**
342
+
343
+ ```bash
344
+ kanon install
345
+ ```
336
346
 
337
- ### Usage with Remote Catalogs (Optional)
347
+ This reconciles `.kanon` against `.kanon.lock`, runs the repo
348
+ init/envsubst/sync lifecycle for every source, aggregates packages into
349
+ `.packages/` via symlinks, creates source workspaces under
350
+ `.kanon-data/sources/`, writes `.kanon.lock` with the exact resolved SHAs,
351
+ and adds `.packages/` and `.kanon-data/` to `.gitignore`.
338
352
 
339
- Remote catalogs provide pre-configured `.kanon` files that require no
340
- placeholder editing. Set `KANON_CATALOG_SOURCE` or pass `--catalog-source`
341
- to bootstrap from a remote repository:
353
+ **4. Clean (full teardown):**
342
354
 
343
355
  ```bash
344
- # Set once in your shell rc file -- pin to current major version
345
- export KANON_CATALOG_SOURCE='https://github.com/your-org/your-catalog-repo.git@>=2.0.0,<3.0.0'
356
+ kanon clean # remove .packages/, .kanon-data/, marketplace dir
357
+ kanon clean --orphans # also prune kanon-owned marketplaces no longer referenced
358
+ ```
346
359
 
347
- # Bootstrap a pre-configured entry
348
- kanon bootstrap <entry-name>
360
+ `kanon clean` removes all synced packages and Kanon state directories, and
361
+ (when `KANON_MARKETPLACE_INSTALL=true`) uninstalls marketplace plugins.
349
362
 
350
- # Or pass the catalog source inline
351
- kanon bootstrap <entry-name> \
352
- --catalog-source 'https://github.com/your-org/catalog.git@~=2.0.0'
353
- ```
363
+ **Important:** All synced files in `.packages/` and `.kanon-data/` are
364
+ ephemeral and should not be committed. Commit only `.kanon` and `.kanon.lock`
365
+ to your repository.
354
366
 
355
- The `@<ref>` portion accepts a branch name, a tag, the special value `latest`
356
- (which resolves to the highest semver tag), or a PEP 440 version constraint
357
- (e.g., `~=2.0.0`, `>=2.0.0,<3.0.0`). Version constraints are resolved
358
- against the repository's git tags via `git ls-remote`. The remote repo must
359
- have a `catalog/` directory at its root, with each subdirectory being a
360
- catalog entry.
367
+ The `@<ref>` portion of a catalog source accepts a branch name, a tag, the
368
+ special value `latest` (which resolves to the highest semver tag), or a PEP
369
+ 440 version constraint (e.g., `~=2.0.0`, `>=2.0.0,<3.0.0`). Version
370
+ constraints are resolved against the repository's git tags via
371
+ `git ls-remote`. The manifest repo IS the catalog: every `*-marketplace.xml`
372
+ file under `repo-specs/` carrying a `<catalog-metadata>` block is one catalog
373
+ entry. There is no separate `catalog/` directory.
361
374
 
362
375
  Manifest repositories should use [semantic versioning](https://semver.org/)
363
376
  for git tags. Pinning to a major version range (e.g., `>=2.0.0,<3.0.0`)
364
377
  allows automatic pickup of minor and patch releases while preventing
365
378
  unexpected breaking changes.
366
379
 
367
- Use `--output-dir DIR` to bootstrap into a different directory.
368
-
369
380
  ### Integrating with Task Runners (Optional)
370
381
 
371
382
  Kanon works standalone via `kanon install` and `kanon clean`. You can wrap
@@ -400,101 +411,248 @@ kanon --help # Top-level help
400
411
  kanon --version # Show version
401
412
  ```
402
413
 
403
- ### kanon bootstrap
414
+ Run `kanon <command> --help` for the full option list of any command. The
415
+ sections below summarise each 2.0 command. A catalog source (the
416
+ `--catalog-source <url>@<ref>` flag or the `KANON_CATALOG_SOURCE`
417
+ environment variable) is required by `list`, `add`, `outdated`, `why`, and
418
+ `catalog audit`; for `install` and `doctor` the `.kanon.lock` `[catalog]`
419
+ source is used as a fallback when present and consistent.
420
+
421
+ ### kanon list
404
422
 
405
- Scaffolds a new Kanon project from a catalog entry package, including a
406
- pre-configured `.kanon`.
423
+ Discovers catalog entries. Prints one entry name per line to stdout, sorted
424
+ lexicographically, by reading the `*-marketplace.xml` files under
425
+ `repo-specs/` in the catalog source.
407
426
 
408
427
  ```bash
409
- kanon bootstrap list # List available catalog entry packages
410
- kanon bootstrap kanon # Scaffold standalone (.kanon only)
411
- kanon bootstrap kanon --output-dir proj # Scaffold into proj/
412
- kanon bootstrap <entry> \
413
- --catalog-source 'https://github.com/org/repo.git@>=2.0.0,<3.0.0'
428
+ kanon list # all entry names
429
+ kanon list foo # substring filter (name/desc/keywords)
430
+ kanon list --regex '^foo' # regex filter
431
+ kanon list --detail # human-readable record per entry
432
+ kanon list --format json # structured JSON array
433
+ kanon list --tree # three-layer ASCII dependency tree
434
+ kanon list --all-versions # walk historical tagged versions
414
435
  ```
415
436
 
416
- **Options:**
437
+ Key options: `--format {names,json}`, `--detail`, `--tree` (with
438
+ `--max-depth N`, `--no-filter-required`), `--all-versions` (with `--limit N`,
439
+ `--no-limit`, `--since-version <spec>`), `--regex <pattern>`,
440
+ `--match-fields <csv>`. A positional `<substring>` and `--regex` are mutually
441
+ exclusive; `--format json` is incompatible with `--tree`.
417
442
 
418
- **`--output-dir DIR`**
419
- Target directory (default: current directory). The parent of `DIR` must
420
- already exist; bootstrap fails fast if it does not.
443
+ ### kanon add
421
444
 
422
- **`--catalog-source SOURCE`**
423
- Remote catalog as `<git_url>@<ref>` (branch, tag, `latest`, or PEP 440
424
- constraint). Overrides `KANON_CATALOG_SOURCE` env var. Default: bundled
425
- catalog.
445
+ Resolves catalog entries from the catalog source and appends the
446
+ `KANON_SOURCE_<name>_{URL,REVISION,PATH}` triple to `.kanon`, creating the
447
+ file with a standard header when absent.
426
448
 
427
- ### kanon install
449
+ ```bash
450
+ kanon add my-tool # pin to highest PEP 440 tag
451
+ kanon add 'my-tool@>=1.0.0,<2.0.0' # pin with a PEP 440 constraint
452
+ kanon add my-tool --marketplace-install # enable the marketplace lifecycle
453
+ kanon add my-tool --dry-run # print the diff without writing
454
+ ```
455
+
456
+ Each entry is `<name>` or `<name>@<spec>` (PEP 440 constraint). Key options:
457
+ `--kanon-file <path>` (default `./.kanon`, env `KANON_KANON_FILE`), `--force`
458
+ (overwrite an existing block), `--dry-run`, and the mutually-exclusive
459
+ `--marketplace-install` / `--no-marketplace-install` (applied only when the
460
+ file is created).
461
+
462
+ ### kanon remove
428
463
 
429
- Executes the full install lifecycle.
464
+ Removes the three `KANON_SOURCE_<name>_{URL,REVISION,PATH}` lines for one or
465
+ more entries from `.kanon`.
430
466
 
431
467
  ```bash
432
- kanon install # Auto-discover .kanon by walking up from cwd
433
- kanon install .kanon # Explicit path to .kanon file
468
+ kanon remove my-tool # canonical source OR entry name
469
+ kanon remove my-tool --dry-run # preview removed lines
470
+ kanon remove my-tool --force # skip not-fully-present sources
434
471
  ```
435
472
 
436
- **Steps performed:**
473
+ Each `<name>` may be the canonical source name (e.g. `foo_bar`) or the
474
+ original entry name (e.g. `Foo-Bar`); both normalise to the same keys.
475
+ Removal is atomic: if any requested name is not fully present (fewer than
476
+ three matching keys) and `--force` is not set, the command exits non-zero and
477
+ the file is unchanged.
437
478
 
438
- 1. For each source (alphabetical order): `kanon repo init`,
439
- `kanon repo envsubst`, `kanon repo sync`
440
- 2. Aggregates symlinks from `.kanon-data/sources/<name>/.packages/`
441
- into `.packages/`
442
- 3. Detects package name collisions across sources (fail-fast)
443
- 4. Updates `.gitignore`
444
- 5. If `KANON_MARKETPLACE_INSTALL=true`: runs the marketplace install lifecycle
479
+ ### kanon install
480
+
481
+ Executes the full install lifecycle and reconciles `.kanon` against
482
+ `.kanon.lock`.
483
+
484
+ ```bash
485
+ kanon install # auto-discover .kanon by walking up from cwd
486
+ kanon install .kanon # explicit path to .kanon file
487
+ kanon install --strict-lock # error when an orphaned lock entry is present
488
+ kanon install --strict-drift # error when a branch source has drifted
489
+ kanon install --refresh-lock # re-resolve every transitive version from scratch
490
+ kanon install --refresh-lock-source NAME # re-resolve one source's chain only
491
+ ```
492
+
493
+ **Behavior:**
494
+
495
+ - Parses `.kanon`, then runs the repo init/envsubst/sync lifecycle for each
496
+ source (alphabetical order).
497
+ - Aggregates packages into `.packages/` via symlinks; detects cross-source
498
+ name collisions (fail-fast); updates `.gitignore`.
499
+ - Reconciles against `.kanon.lock`: a plain `install` prunes orphaned lock
500
+ entries (a source removed from `.kanon`) with an info-line; `--strict-lock`
501
+ promotes that to an error. Branch drift (a locked SHA differing from the
502
+ branch's current tip) reuses the locked SHA with an info-line; `--strict-drift`
503
+ promotes that to an error.
504
+ - **Auto-prune:** when a source is removed from `.kanon`, its registered
505
+ marketplace is unregistered on the next install.
506
+ - If `KANON_MARKETPLACE_INSTALL=true`: runs the marketplace install lifecycle.
507
+
508
+ `--refresh-lock` and `--refresh-lock-source NAME` require a CLI-supplied or
509
+ `KANON_CATALOG_SOURCE` catalog source; the lockfile fallback is disabled on
510
+ those paths.
445
511
 
446
512
  ### kanon clean
447
513
 
448
514
  Executes the full teardown lifecycle.
449
515
 
450
516
  ```bash
451
- kanon clean # Auto-discover .kanon by walking up from cwd
452
- kanon clean .kanon # Explicit path to .kanon file
517
+ kanon clean # auto-discover .kanon by walking up from cwd
518
+ kanon clean .kanon # explicit path to .kanon file
519
+ kanon clean --orphans # also unregister orphaned marketplaces
453
520
  ```
454
521
 
455
- **Steps performed:**
522
+ **Behavior:**
456
523
 
457
- 1. Resolves `.kanon` symlinks so teardown targets the real project directory
458
- even when `.kanon` is a symlink
459
- 2. If `KANON_MARKETPLACE_INSTALL=true`: uninstalls plugins, removes
460
- marketplace directory
461
- 3. Removes `.packages/` directory
462
- 4. Removes `.kanon-data/` directory
524
+ 1. If `KANON_MARKETPLACE_INSTALL=true`: uninstalls plugins and removes the
525
+ marketplace directory.
526
+ 2. Removes the `.packages/` and `.kanon-data/` directories.
463
527
 
464
- The order is critical: plugins are uninstalled before files are removed to
465
- ensure the registry is cleaned while paths are still resolvable.
528
+ With `--orphans`, before the normal teardown kanon also unregisters any
529
+ kanon-owned marketplaces recorded in `.kanon.lock` that are no longer
530
+ referenced by `.kanon`, pruning them from `~/.claude`.
466
531
 
467
- ### kanon validate xml
532
+ ### kanon outdated
468
533
 
469
- Validates all XML manifest files under `repo-specs/`.
534
+ Compares each source in `.kanon` against the catalog and emits a table of
535
+ `name | current | latest-matching-spec | latest-available | upgrade-type`.
470
536
 
471
537
  ```bash
472
- kanon validate xml # Validate in current repo
473
- kanon validate xml --repo-root /path # Validate with explicit repo root
538
+ kanon outdated # table output, always exits 0
539
+ kanon outdated --format json # JSON array, one object per source
540
+ kanon outdated --fail-on-upgrade # exit 1 when any source has an upgrade (CI gate)
474
541
  ```
475
542
 
476
- **Checks performed:**
543
+ The `current` column comes from `.kanon.lock` when present, or is
544
+ live-resolved against the catalog when absent. Key options:
545
+ `--fail-on-upgrade`, `--format {table,json}`, `--kanon-file`, `--lock-file`.
546
+
547
+ ### kanon why
548
+
549
+ Explains why a transitive dependency is in the tree. Reads `.kanon`, resolves
550
+ the full dependency tree (from `.kanon.lock` when present, else live-resolves
551
+ against the catalog), and prints every chain reaching the requested node.
477
552
 
478
- - Well-formed XML
479
- - Required attributes on `<project>` (name, path, remote, revision)
480
- - Required attributes on `<remote>` (name, fetch)
481
- - `<include>` references point to existing files
553
+ ```bash
554
+ kanon why my-project # by source name, repo URL, or XML path
555
+ kanon why https://example.com/org/project.git
556
+ kanon why --format json my-project
557
+ ```
482
558
 
483
- ### kanon validate marketplace
559
+ The argument is matched three ways: a `<project>` repo URL (canonicalized), a
560
+ transitive XML manifest path (exact-string equality), or a top-level source
561
+ name (normalized via `derive_source_name`). A catalog source is required only
562
+ on the live-resolve path (when `.kanon.lock` is absent).
484
563
 
485
- Validates marketplace XML manifests under `repo-specs/`.
564
+ ### kanon doctor
565
+
566
+ Diagnoses `.kanon` / `.kanon.lock` health against the current project
567
+ directory.
486
568
 
487
569
  ```bash
488
- kanon validate marketplace # Validate in current repo
489
- kanon validate marketplace --repo-root /path
570
+ kanon doctor # run all health checks
571
+ kanon doctor --strict-drift # promote branch-drift findings to errors
572
+ kanon doctor --refresh-completion-cache # invalidate the shell completion cache
573
+ kanon doctor --prune-cache # prune stale cache files (age-based)
490
574
  ```
491
575
 
492
- **Checks performed:**
576
+ Reports findings including `.kanon`/`.kanon.lock` consistency (via
577
+ `kanon_hash`), hand-edit detection, orphaned lock entries, branch drift,
578
+ dangling-SHA detection, a `NO_SOURCES` finding for a zero-source `.kanon`, and
579
+ a remote-reachability sanity check (warning only). See
580
+ [docs/doctor.md](docs/doctor.md) for the full subcheck reference.
581
+
582
+ ### kanon validate
493
583
 
494
- - `<linkfile dest>` uses `${CLAUDE_MARKETPLACES_DIR}/` prefix
495
- - Include chains are unbroken
496
- - Project paths are unique across manifests
497
- - Revision attributes follow valid formats (refs/tags, constraints, branches)
584
+ Validates manifest XML files. Subcommands:
585
+
586
+ ```bash
587
+ kanon validate xml # well-formedness, attributes, include chains
588
+ kanon validate marketplace # linkfile dest, includes, uniqueness, tag format
589
+ kanon validate metadata # catalog-metadata soft-spots (no network access)
590
+ ```
591
+
592
+ - **`validate xml`** -- checks well-formed XML, required attributes on
593
+ `<project>` and `<remote>`, and that `<include>` names point to existing
594
+ files.
595
+ - **`validate marketplace`** -- checks `<linkfile dest>` attributes, include
596
+ chain integrity, project path uniqueness, and revision tag format.
597
+ - **`validate metadata`** -- checks the `<catalog-metadata>` blocks for
598
+ required/recommended fields, source-name derivation, and entry-name
599
+ uniqueness, without cloning or calling git. Supports `--format {text,json}`.
600
+
601
+ All three accept `--repo-root REPO_ROOT` (default: auto-detect via
602
+ `git rev-parse`).
603
+
604
+ ### kanon catalog audit
605
+
606
+ Audits a manifest repo against the catalog standards contract (the five
607
+ soft-spot rules).
608
+
609
+ ```bash
610
+ kanon catalog audit # audit the current directory
611
+ kanon catalog audit ./scratch --strict # promote warnings to errors
612
+ kanon catalog audit https://example.com/org/repo.git@main # audit a remote source
613
+ kanon catalog audit --check metadata,tag-format # run a subset of checks
614
+ ```
615
+
616
+ `<dir-or-source>` is a local directory (must contain `repo-specs/`) or a
617
+ remote `<git_url>@<ref>` source; defaults to `.`. Options: `--check <subset>`
618
+ (valid values: `all`, `entry-name-uniqueness`, `metadata`, `remote-url`,
619
+ `source-name-derivation`, `tag-format`), `--format {text,json}`, `--strict`.
620
+ See [docs/catalog-author-guide.md](docs/catalog-author-guide.md).
621
+
622
+ ### kanon repo
623
+
624
+ Catalog-author / low-level subcommand: runs kanon's `repo` dispatcher.
625
+ All trailing arguments after `kanon repo` are forwarded verbatim to it.
626
+
627
+ ```bash
628
+ kanon repo init -u <url> -b <branch> -m <manifest>
629
+ kanon repo sync --jobs=4
630
+ kanon repo help
631
+ ```
632
+
633
+ `--repo-dir REPO_DIR` sets the `.repo` directory (default: `${KANON_REPO_DIR}`
634
+ or `.repo`). See [docs/repo/README.md](docs/repo/README.md).
635
+
636
+ ### kanon completion
637
+
638
+ Emits the shell completion script for kanon to stdout.
639
+
640
+ ```bash
641
+ kanon completion bash > /etc/bash_completion.d/kanon
642
+ kanon completion zsh > "${fpath[1]}/_kanon"
643
+ ```
644
+
645
+ Target shell choices: `bash`, `zsh`. See
646
+ [docs/shell-completion.md](docs/shell-completion.md).
647
+
648
+ ### kanon bootstrap (deprecated)
649
+
650
+ `kanon bootstrap` was removed in 2.0 (a breaking change). It no longer
651
+ performs any work and exits with code `3`, directing you to `kanon add` /
652
+ `kanon list`. The catalog model changed: a manifest repo no longer has a
653
+ separate `catalog/<name>/` location and the kanon wheel no longer bundles a
654
+ catalog. Use `kanon list` to discover entries and `kanon add` to add them.
655
+ See [docs/migration-bootstrap-to-add.md](docs/migration-bootstrap-to-add.md).
498
656
 
499
657
  ---
500
658
 
@@ -539,9 +697,14 @@ Path to the entry-point manifest XML for the named source.
539
697
  ### Environment Variables
540
698
 
541
699
  **`KANON_CATALOG_SOURCE`**
542
- Remote catalog source for `kanon bootstrap` as `<git_url>@<ref>` where ref
543
- is a branch, tag, `latest`, or PEP 440 constraint (e.g., `>=2.0.0,<3.0.0`).
544
- Overridden by `--catalog-source` flag.
700
+ Remote catalog source as `<git_url>@<ref>` where ref is a branch, tag,
701
+ `latest`, or PEP 440 constraint (e.g., `>=2.0.0,<3.0.0`). One of this env var
702
+ or the `--catalog-source` flag is **required** by `kanon list`, `kanon add`,
703
+ `kanon outdated`, `kanon why`, and `kanon catalog audit`. For `kanon install`
704
+ and `kanon doctor`, the `.kanon.lock` `[catalog].source` is used as a fallback
705
+ when present and consistent. Resolution precedence is:
706
+ `--catalog-source` flag > `KANON_CATALOG_SOURCE` env var > lock `[catalog]`
707
+ source > the `[catalog]` block in `.kanon`.
545
708
 
546
709
  ### Example .kanon
547
710
 
@@ -571,8 +734,8 @@ KANON_SOURCE_marketplaces_PATH=repo-specs/marketplaces/meta.xml
571
734
  ```text
572
735
  ┌─────────────────────────┐
573
736
  │ Kanon CLI │
574
- │ (install / clean /
575
- bootstrap / validate)
737
+ │ (list / add / install /│
738
+ clean / validate)
576
739
  └───────────┬─────────────┘
577
740
 
578
741
  defines │ uses
@@ -687,9 +850,16 @@ For full documentation, see [docs/how-it-works.md](docs/how-it-works.md).
687
850
  ## Creating a Manifest Repository
688
851
 
689
852
  A manifest repository contains `repo-specs/` with XML manifests that define
690
- what packages to sync, from which repositories, and at which versions. See
691
- [docs/repo/manifest-format.md](docs/repo/manifest-format.md) for the full
692
- XML schema.
853
+ what packages to sync, from which repositories, and at which versions. **The
854
+ manifest repo IS the catalog** -- there is no separate `catalog/` directory.
855
+ Each catalog entry is a single `*-marketplace.xml` file under `repo-specs/`
856
+ that carries a nested `<catalog-metadata>` block; the
857
+ `<catalog-metadata><name>` child is the entry name consumers pass to
858
+ `kanon add <name>`. See
859
+ [docs/creating-manifest-repos.md](docs/creating-manifest-repos.md) for the
860
+ full catalog-author guide and
861
+ [docs/repo/manifest-format.md](docs/repo/manifest-format.md) for the
862
+ underlying XML schema.
693
863
 
694
864
  ### Structure
695
865
 
@@ -699,10 +869,37 @@ my-manifest-repo/
699
869
  git-connection/
700
870
  remote.xml # Git remotes with ${GITBASE} placeholders
701
871
  my-archetype/
702
- meta.xml # Entry-point: includes remote.xml + packages.xml
872
+ my-archetype-marketplace.xml # Catalog entry (carries <catalog-metadata>)
703
873
  packages.xml # Package repos with pinned versions
704
874
  ```
705
875
 
876
+ ### Catalog entry (-marketplace.xml)
877
+
878
+ Each catalog entry is a `*-marketplace.xml` file containing exactly one
879
+ nested `<catalog-metadata>` block. Required fields are `name`,
880
+ `display-name`, `description`, and `version`; recommended fields are `type`,
881
+ `owner-name`, `owner-email`, and `keywords` (comma-separated). The legacy
882
+ flat-attribute scheme (metadata as XML attributes) is rejected.
883
+
884
+ ```xml
885
+ <package>
886
+ <catalog-metadata>
887
+ <name>my-archetype</name>
888
+ <display-name>My Archetype</display-name>
889
+ <description>Build conventions and lint config for service repos.</description>
890
+ <version>1.0.0</version>
891
+ <type>library</type>
892
+ <owner-name>Platform Team</owner-name>
893
+ <owner-email>platform@example.com</owner-email>
894
+ <keywords>build,lint,conventions</keywords>
895
+ </catalog-metadata>
896
+ <include name="repo-specs/my-archetype/packages.xml" />
897
+ </package>
898
+ ```
899
+
900
+ `kanon validate metadata` and `kanon catalog audit` enforce the
901
+ `<catalog-metadata>` contract.
902
+
706
903
  ### remote.xml -- Git Remote Definition
707
904
 
708
905
  Defines where packages are hosted using `${GITBASE}` for portability:
@@ -734,14 +931,19 @@ Lists each package repository, its local path, and the pinned version:
734
931
  </manifest>
735
932
  ```
736
933
 
737
- ### meta.xml -- Entry Point
934
+ ### Entry-point manifest
738
935
 
739
- Combines all includes into a single entry point referenced by `.kanon`:
936
+ The `*-marketplace.xml` catalog entry is the entry point referenced by the
937
+ `KANON_SOURCE_<name>_PATH` value that `kanon add` writes into `.kanon`. It
938
+ pulls in the package declarations via `<include>`:
740
939
 
741
940
  ```xml
742
- <manifest>
941
+ <package>
942
+ <catalog-metadata>
943
+ <!-- ... required + recommended fields ... -->
944
+ </catalog-metadata>
743
945
  <include name="repo-specs/my-archetype/packages.xml" />
744
- </manifest>
946
+ </package>
745
947
  ```
746
948
 
747
949
  ### Include Chains for Hierarchy
@@ -751,16 +953,16 @@ hierarchy. This enables cascading configurations where common packages are
751
953
  defined once and specialized packages are layered on top:
752
954
 
753
955
  ```text
754
- meta.xml
956
+ my-archetype-marketplace.xml
755
957
  └── packages.xml (leaf -- e.g., specific project type)
756
958
  └── packages.xml (framework level)
757
959
  └── packages.xml (language level)
758
960
  └── packages.xml (common/base)
759
961
  ```
760
962
 
761
- Each level includes its parent and adds its own package entries. The `repo`
762
- tool recursively resolves all includes, accumulating a unified set of
763
- packages.
963
+ Each level includes its parent and adds its own package entries. The
964
+ `kanon repo` subsystem recursively resolves all includes, accumulating a
965
+ unified set of packages.
764
966
 
765
967
  ### Updating Package Versions
766
968
 
@@ -1081,8 +1283,9 @@ make publish # Clean, build, and check distribution
1081
1283
  src/kanon_cli/
1082
1284
  cli.py # Entry point
1083
1285
  commands/ # Subcommand implementations
1084
- core/ # Core logic (install, clean, kanon parsing)
1085
- catalog/ # Bundled catalog (fallback templates)
1286
+ core/ # Core logic (install, clean, kanon parsing, lockfile)
1287
+ completions/ # Shell-completion generators
1288
+ utils/ # Shared helpers
1086
1289
  repo/ # kanon repo subsystem (manifest sync, PEP 440)
1087
1290
  tests/ # Unit and functional tests
1088
1291
  docs/ # Configuration, lifecycle, version resolution docs