kanon-cli 3.4.0__tar.gz → 3.4.2__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 (1050) hide show
  1. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/.github/CODEOWNERS +2 -2
  2. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/.github/workflows/main-validation.yml +16 -0
  3. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/.github/workflows/pr-validation.yml +16 -0
  4. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/.pre-commit-config.yaml +1 -1
  5. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/CHANGELOG.md +300 -0
  6. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/CONTRIBUTING.md +21 -0
  7. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/Makefile +4 -0
  8. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/PKG-INFO +41 -13
  9. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/README.md +40 -12
  10. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/architecture.md +15 -2
  11. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/git-auth-setup.md +27 -11
  12. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/lifecycle.md +2 -2
  13. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/list-and-add.md +32 -16
  14. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/git-hooks/pre-push +16 -2
  15. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/pyproject.toml +1 -1
  16. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/__init__.py +1 -1
  17. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/commands/add.py +70 -19
  18. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/commands/clean.py +17 -2
  19. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/commands/doctor.py +1 -1
  20. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/completions/cache.py +2 -2
  21. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/constants.py +21 -0
  22. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/core/clean.py +102 -4
  23. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/core/install.py +101 -26
  24. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/core/kanonenv.py +5 -0
  25. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/core/marketplace.py +10 -18
  26. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/project.py +76 -5
  27. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/utils/concurrency.py +141 -17
  28. kanon_cli-3.4.2/src/kanon_cli/utils/spawn.py +215 -0
  29. kanon_cli-3.4.2/src/kanon_cli/utils/windows_permissions.py +78 -0
  30. kanon_cli-3.4.2/src/kanon_cli/utils/worker.py +70 -0
  31. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/conftest.py +32 -0
  32. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/completion/expected-zsh.sh +11 -8
  33. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/help/kanon-add.txt +13 -9
  34. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_add_alias_journey.py +89 -18
  35. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_error_snapshots.py +2 -2
  36. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_home_flag_store_relocation.py +3 -3
  37. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_install_lifecycle.py +14 -9
  38. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_linkfile_fs_effects.py +188 -0
  39. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_workspace_dir_env.py +28 -2
  40. kanon_cli-3.4.2/tests/native/windows_contracts.py +310 -0
  41. kanon_cli-3.4.2/tests/native/worker_callbacks.py +46 -0
  42. kanon_cli-3.4.2/tests/scenarios/test_add_content_upgrade.py +91 -0
  43. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_ns_marketplace_and_global_flags.py +6 -1
  44. kanon_cli-3.4.2/tests/scenarios/test_project_linkfile_isolation.py +60 -0
  45. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_manifest_xml.py +9 -1
  46. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_project.py +9 -2
  47. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_add_collision.py +165 -0
  48. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_background_refresh.py +8 -5
  49. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_ci_workflows.py +16 -33
  50. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_clean.py +63 -0
  51. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_clean_command.py +71 -0
  52. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_complete_project_versions.py +15 -13
  53. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_concurrency.py +34 -2
  54. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_install.py +126 -7
  55. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_spawn.py +17 -18
  56. kanon_cli-3.4.2/tests/unit/test_windows_lock_api.py +52 -0
  57. kanon_cli-3.4.2/tests/unit/test_worker.py +130 -0
  58. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/uv.lock +4 -4
  59. kanon_cli-3.4.0/src/kanon_cli/utils/spawn.py +0 -128
  60. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/.claude/settings.json +0 -0
  61. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/.devcontainer/.devcontainer.postcreate.sh +0 -0
  62. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/.devcontainer/VERSION +0 -0
  63. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/.devcontainer/catalog-entry.json +0 -0
  64. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/.devcontainer/devcontainer-functions.sh +0 -0
  65. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/.devcontainer/devcontainer.json +0 -0
  66. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/.devcontainer/fix-line-endings.py +0 -0
  67. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/.devcontainer/nix-family-os/README.md +0 -0
  68. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/.devcontainer/nix-family-os/tinyproxy-daemon.sh +0 -0
  69. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/.devcontainer/nix-family-os/tinyproxy.conf.template +0 -0
  70. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/.devcontainer/postcreate-wrapper.sh +0 -0
  71. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/.devcontainer/project-setup.sh +0 -0
  72. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/.devcontainer/wsl-family-os/README.md +0 -0
  73. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/.devcontainer/wsl-family-os/tinyproxy-daemon.sh +0 -0
  74. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/.devcontainer/wsl-family-os/tinyproxy.conf.template +0 -0
  75. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/.github/actions/setup-kanon/action.yml +0 -0
  76. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/.github/workflows/codeql-analysis.yml +0 -0
  77. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/.github/workflows/nightly-regression.yml +0 -0
  78. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/.github/workflows/publish.yml +0 -0
  79. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/.gitignore +0 -0
  80. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/.markdownlint.json +0 -0
  81. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/.tool-versions +0 -0
  82. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/.yamllint +0 -0
  83. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/CLAUDE.md +0 -0
  84. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/LICENSE +0 -0
  85. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/archive/README.md +0 -0
  86. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/archive/migrating-existing-kanon-files.md +0 -0
  87. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/archive/upgrading-from-2x.md +0 -0
  88. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/catalog-author-guide.md +0 -0
  89. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/catalog-format-versioning.md +0 -0
  90. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/catalogs-explained.md +0 -0
  91. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/claude-marketplaces-guide.md +0 -0
  92. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/cli/catalog-audit.md +0 -0
  93. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/cli/doctor.md +0 -0
  94. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/cli/validate.md +0 -0
  95. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/cli-reference.md +0 -0
  96. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/cli.md +0 -0
  97. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/coming-from-pip-npm-cargo.md +0 -0
  98. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/configuration.md +0 -0
  99. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/contributing.md +0 -0
  100. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/creating-manifest-repos.md +0 -0
  101. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/creating-packages.md +0 -0
  102. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/doctor.md +0 -0
  103. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/exit-codes.md +0 -0
  104. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/how-it-works.md +0 -0
  105. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/installation.md +0 -0
  106. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/integration-testing.md +0 -0
  107. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/lockfile.md +0 -0
  108. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/multi-source-guide.md +0 -0
  109. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/outdated-and-why.md +0 -0
  110. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/pipeline-integration.md +0 -0
  111. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/privacy.md +0 -0
  112. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/repo/README.md +0 -0
  113. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/repo/internal-fs-layout.md +0 -0
  114. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/repo/manifest-format.md +0 -0
  115. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/repo/python-support.md +0 -0
  116. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/repo/repo-hooks.md +0 -0
  117. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/repo/smart-sync.md +0 -0
  118. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/repo/windows.md +0 -0
  119. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/security-model.md +0 -0
  120. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/setup-guide.md +0 -0
  121. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/shell-completion.md +0 -0
  122. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/test-coverage.md +0 -0
  123. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/testing/matrix-traceability.md +0 -0
  124. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/troubleshooting.md +0 -0
  125. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/url-canonicalization.md +0 -0
  126. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/docs/version-resolution.md +0 -0
  127. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/git-hooks/pre-commit +0 -0
  128. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/link +0 -0
  129. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/scripts/check_archive_no_duplicates.py +0 -0
  130. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/__main__.py +0 -0
  131. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/cli.py +0 -0
  132. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/commands/__init__.py +0 -0
  133. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/commands/catalog.py +0 -0
  134. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/commands/completion.py +0 -0
  135. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/commands/install.py +0 -0
  136. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/commands/list.py +0 -0
  137. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/commands/marketplace.py +0 -0
  138. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/commands/outdated.py +0 -0
  139. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/commands/remove.py +0 -0
  140. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/commands/repo.py +0 -0
  141. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/commands/search.py +0 -0
  142. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/commands/validate.py +0 -0
  143. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/commands/why.py +0 -0
  144. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/completions/__init__.py +0 -0
  145. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/completions/cached_catalogs.py +0 -0
  146. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/completions/catalog_entries.py +0 -0
  147. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/completions/catalog_versions.py +0 -0
  148. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/completions/lockfile_names.py +0 -0
  149. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/completions/midtoken.py +0 -0
  150. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/completions/pep440_filter.py +0 -0
  151. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/completions/powershell.py +0 -0
  152. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/completions/preamble.py +0 -0
  153. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/completions/project_versions.py +0 -0
  154. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/completions/sanitize.py +0 -0
  155. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/completions/source_names.py +0 -0
  156. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/core/__init__.py +0 -0
  157. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/core/catalog.py +0 -0
  158. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/core/cli_args.py +0 -0
  159. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/core/discover.py +0 -0
  160. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/core/git_runner.py +0 -0
  161. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/core/include_walker.py +0 -0
  162. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/core/kanon_hash.py +0 -0
  163. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/core/kanonenv_writer.py +0 -0
  164. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/core/lockfile.py +0 -0
  165. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/core/manifest.py +0 -0
  166. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/core/manifest_vars.py +0 -0
  167. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/core/marketplace_validator.py +0 -0
  168. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/core/metadata.py +0 -0
  169. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/core/remote_url.py +0 -0
  170. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/core/telemetry.py +0 -0
  171. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/core/update_check.py +0 -0
  172. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/core/url.py +0 -0
  173. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/core/xml_validator.py +0 -0
  174. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/VENDOR.md +0 -0
  175. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/__init__.py +0 -0
  176. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/color.py +0 -0
  177. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/command.py +0 -0
  178. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/editor.py +0 -0
  179. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/error.py +0 -0
  180. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/event_log.py +0 -0
  181. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/fetch.py +0 -0
  182. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/git_command.py +0 -0
  183. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/git_config.py +0 -0
  184. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/git_refs.py +0 -0
  185. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/git_ssh +0 -0
  186. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/git_superproject.py +0 -0
  187. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/git_trace2_event_log.py +0 -0
  188. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/git_trace2_event_log_base.py +0 -0
  189. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/hooks/commit-msg +0 -0
  190. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/hooks/pre-auto-gc +0 -0
  191. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/hooks.py +0 -0
  192. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/main.py +0 -0
  193. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/manifest_xml.py +0 -0
  194. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/pager.py +0 -0
  195. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/platform_utils.py +0 -0
  196. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/platform_utils_win32.py +0 -0
  197. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/progress.py +0 -0
  198. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/repo +0 -0
  199. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/repo_logging.py +0 -0
  200. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/repo_trace.py +0 -0
  201. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/requirements.jsonc +0 -0
  202. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/ssh.py +0 -0
  203. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/__init__.py +0 -0
  204. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/abandon.py +0 -0
  205. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/branches.py +0 -0
  206. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/checkout.py +0 -0
  207. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/cherry_pick.py +0 -0
  208. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/diff.py +0 -0
  209. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/diffmanifests.py +0 -0
  210. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/download.py +0 -0
  211. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/envsubst.py +0 -0
  212. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/forall.py +0 -0
  213. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/gc.py +0 -0
  214. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/grep.py +0 -0
  215. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/help.py +0 -0
  216. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/info.py +0 -0
  217. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/init.py +0 -0
  218. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/list.py +0 -0
  219. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/manifest.py +0 -0
  220. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/overview.py +0 -0
  221. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/prune.py +0 -0
  222. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/rebase.py +0 -0
  223. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/selfupdate.py +0 -0
  224. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/smartsync.py +0 -0
  225. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/stage.py +0 -0
  226. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/start.py +0 -0
  227. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/status.py +0 -0
  228. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/sync.py +0 -0
  229. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/subcmds/upload.py +0 -0
  230. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/version_constraints.py +0 -0
  231. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/repo/wrapper.py +0 -0
  232. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/utils/__init__.py +0 -0
  233. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/utils/levenshtein.py +0 -0
  234. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/utils/lock_file_path.py +0 -0
  235. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/src/kanon_cli/version.py +0 -0
  236. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/__init__.py +0 -0
  237. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/catalog/broken-soft-spot-1/repo-specs/duplicate-child-marketplace.xml +0 -0
  238. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/catalog/broken-soft-spot-1/repo-specs/missing-recommended-marketplace.xml +0 -0
  239. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/catalog/broken-soft-spot-1/repo-specs/missing-required-marketplace.xml +0 -0
  240. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/catalog/broken-soft-spot-1/repo-specs/multiple-blocks-marketplace.xml +0 -0
  241. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/catalog/broken-soft-spot-2/repo-specs/dotted-name-marketplace.xml +0 -0
  242. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/catalog/broken-soft-spot-2/repo-specs/hyphenated-name-marketplace.xml +0 -0
  243. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/catalog/broken-soft-spot-2/repo-specs/uppercase-name-marketplace.xml +0 -0
  244. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/catalog/broken-soft-spot-3/repo-specs/group-a-1-marketplace.xml +0 -0
  245. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/catalog/broken-soft-spot-3/repo-specs/group-a-2-marketplace.xml +0 -0
  246. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/catalog/broken-soft-spot-3/repo-specs/group-b-1-marketplace.xml +0 -0
  247. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/catalog/broken-soft-spot-3/repo-specs/group-b-2-marketplace.xml +0 -0
  248. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/catalog/broken-soft-spot-4/repo-specs/file-url-marketplace.xml +0 -0
  249. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/catalog/broken-soft-spot-4/repo-specs/query-string-marketplace.xml +0 -0
  250. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/catalog/broken-soft-spot-4/repo-specs/unresolvable-marketplace.xml +0 -0
  251. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/catalog/legacy-catalog-dir/catalog/sample-entry/.kanon +0 -0
  252. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/catalog/legacy-catalog-dir/repo-specs/sample.xml +0 -0
  253. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/catalogs/zero-pep440-tags/README.md +0 -0
  254. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/catalogs/zero-pep440-tags/repo-specs/entry-a/entry-a-marketplace.xml +0 -0
  255. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/completion/__init__.py +0 -0
  256. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/completion/expected-bash.sh +0 -0
  257. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/completion/expected-powershell.ps1 +0 -0
  258. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/errors/README.md +0 -0
  259. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/errors/conflict-detected.txt +0 -0
  260. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/errors/entry-not-found.txt +0 -0
  261. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/errors/lockfile-hash-mismatch.txt +0 -0
  262. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/errors/lockfile-sha-unreachable.txt +0 -0
  263. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/errors/missing-catalog-source.txt +0 -0
  264. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/errors/missing-required-metadata-field.txt +0 -0
  265. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/errors/source-collision.txt +0 -0
  266. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/errors/zero-pep440-tags-under-prefix.txt +0 -0
  267. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/help/README.md +0 -0
  268. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/help/kanon-catalog-audit.txt +0 -0
  269. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/help/kanon-catalog.txt +0 -0
  270. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/help/kanon-clean.txt +0 -0
  271. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/help/kanon-completion.txt +0 -0
  272. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/help/kanon-doctor.txt +0 -0
  273. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/help/kanon-install.txt +0 -0
  274. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/help/kanon-list.txt +0 -0
  275. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/help/kanon-marketplace.txt +0 -0
  276. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/help/kanon-outdated.txt +0 -0
  277. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/help/kanon-remove.txt +0 -0
  278. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/help/kanon-search.txt +0 -0
  279. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/help/kanon-toplevel.txt +0 -0
  280. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/help/kanon-why.txt +0 -0
  281. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/repo/.gitignore +0 -0
  282. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/repo/README.md +0 -0
  283. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/repo/linter-test-bad.invalid-yaml +0 -0
  284. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/repo/linter-test-bad.md +0 -0
  285. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/repo/linter-test-bad.py +0 -0
  286. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/repo/sample-manifest.xml +0 -0
  287. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/repo/sample-project-config.json +0 -0
  288. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/repo/test.gitconfig +0 -0
  289. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/fixtures/repo/version_constraints_data.json +0 -0
  290. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/__init__.py +0 -0
  291. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/conftest.py +0 -0
  292. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_alias_consumer_journey.py +0 -0
  293. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_argparse_errors.py +0 -0
  294. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_argparse_help.py +0 -0
  295. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_ci_runs_operator_path_tests.py +0 -0
  296. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_clean_lifecycle.py +0 -0
  297. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_cli_entry_point.py +0 -0
  298. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_completion_snapshots.py +0 -0
  299. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_default_branch_journey.py +0 -0
  300. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_env_int_guard_journey.py +0 -0
  301. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_exit_code_matrix.py +0 -0
  302. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_groups_filter.py +0 -0
  303. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_help_snapshots.py +0 -0
  304. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_help_text_contract.py +0 -0
  305. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_home_flag_unwritable_journey.py +0 -0
  306. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_init_default_branch_prerequisite_journey.py +0 -0
  307. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_install_hermetic_journey.py +0 -0
  308. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_install_lifecycle.py +0 -0
  309. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_install_real_kanon.py +0 -0
  310. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_install_v3_lock_fail_fast_journey.py +0 -0
  311. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_kanon_home_store_journey.py +0 -0
  312. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_kanon_repo_cli.py +0 -0
  313. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_kanon_repo_e2e.py +0 -0
  314. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_kanon_repo_lifecycle_journey.py +0 -0
  315. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_lifecycle_journey.py +0 -0
  316. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_list.py +0 -0
  317. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_list_telemetry.py +0 -0
  318. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_make_operator_path_targets.py +0 -0
  319. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_marker_completeness.py +0 -0
  320. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_marketplace_journey.py +0 -0
  321. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_matrix_traceability_complete.py +0 -0
  322. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_provider_agnostic.py +0 -0
  323. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_abandon_errors.py +0 -0
  324. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_abandon_flags.py +0 -0
  325. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_abandon_happy.py +0 -0
  326. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_branches_errors.py +0 -0
  327. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_branches_flags.py +0 -0
  328. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_branches_happy.py +0 -0
  329. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_checkout_errors.py +0 -0
  330. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_checkout_flags.py +0 -0
  331. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_checkout_happy.py +0 -0
  332. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_cherry_pick_errors.py +0 -0
  333. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_cherry_pick_flags.py +0 -0
  334. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_cherry_pick_happy.py +0 -0
  335. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_diff_errors.py +0 -0
  336. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_diff_flags.py +0 -0
  337. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_diff_happy.py +0 -0
  338. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_diffmanifests_errors.py +0 -0
  339. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_diffmanifests_flags.py +0 -0
  340. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_diffmanifests_happy.py +0 -0
  341. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_dir_override.py +0 -0
  342. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_download_errors.py +0 -0
  343. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_download_flags.py +0 -0
  344. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_download_happy.py +0 -0
  345. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_envsubst_errors.py +0 -0
  346. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_envsubst_flags.py +0 -0
  347. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_envsubst_happy.py +0 -0
  348. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_exit_codes.py +0 -0
  349. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_forall_errors.py +0 -0
  350. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_forall_flags.py +0 -0
  351. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_forall_happy.py +0 -0
  352. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_gc_errors.py +0 -0
  353. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_gc_flags.py +0 -0
  354. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_gc_happy.py +0 -0
  355. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_grep_errors.py +0 -0
  356. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_grep_flags.py +0 -0
  357. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_grep_happy.py +0 -0
  358. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_help_errors.py +0 -0
  359. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_help_flags.py +0 -0
  360. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_help_happy.py +0 -0
  361. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_info_errors.py +0 -0
  362. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_info_flags.py +0 -0
  363. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_info_happy.py +0 -0
  364. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_init_errors.py +0 -0
  365. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_init_flags.py +0 -0
  366. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_init_happy.py +0 -0
  367. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_init_mirror.py +0 -0
  368. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_list_errors.py +0 -0
  369. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_list_flags.py +0 -0
  370. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_list_happy.py +0 -0
  371. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_manifest_errors.py +0 -0
  372. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_manifest_flags.py +0 -0
  373. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_manifest_happy.py +0 -0
  374. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_manifest_revision_as_tag.py +0 -0
  375. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_overview_errors.py +0 -0
  376. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_overview_flags.py +0 -0
  377. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_overview_happy.py +0 -0
  378. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_passthrough.py +0 -0
  379. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_prune_errors.py +0 -0
  380. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_prune_flags.py +0 -0
  381. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_prune_happy.py +0 -0
  382. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_rebase_errors.py +0 -0
  383. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_rebase_flags.py +0 -0
  384. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_rebase_happy.py +0 -0
  385. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_selfupdate_disabled.py +0 -0
  386. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_selfupdate_errors.py +0 -0
  387. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_selfupdate_flags.py +0 -0
  388. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_selfupdate_happy.py +0 -0
  389. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_smartsync_errors.py +0 -0
  390. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_smartsync_flags.py +0 -0
  391. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_smartsync_happy.py +0 -0
  392. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_stage_errors.py +0 -0
  393. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_stage_flags.py +0 -0
  394. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_stage_happy.py +0 -0
  395. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_start_errors.py +0 -0
  396. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_start_flags.py +0 -0
  397. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_start_happy.py +0 -0
  398. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_status_errors.py +0 -0
  399. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_status_flags.py +0 -0
  400. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_status_happy.py +0 -0
  401. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_sync_errors.py +0 -0
  402. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_sync_flags.py +0 -0
  403. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_sync_happy.py +0 -0
  404. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_upload_errors.py +0 -0
  405. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_upload_flags.py +0 -0
  406. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_repo_upload_happy.py +0 -0
  407. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_singular_catalog_source_inert.py +0 -0
  408. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_stdout_stderr_discipline.py +0 -0
  409. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_suite_containment.py +0 -0
  410. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_telemetry_journey.py +0 -0
  411. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_update_alert_journey.py +0 -0
  412. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_validate_journey.py +0 -0
  413. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_validate_lifecycle.py +0 -0
  414. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_validate_lockfile.py +0 -0
  415. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_validate_marketplace.py +0 -0
  416. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_validate_xml_errors.py +0 -0
  417. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_validate_xml_repo_root.py +0 -0
  418. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/functional/test_zero_source_clean_error.py +0 -0
  419. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/__init__.py +0 -0
  420. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/conftest.py +0 -0
  421. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/fixtures/__init__.py +0 -0
  422. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/fixtures/synthetic/__init__.py +0 -0
  423. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/fixtures/synthetic/conftest.py +0 -0
  424. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/fixtures/synthetic/drift.py +0 -0
  425. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/fixtures/synthetic/test_synthetic_pytest_fixtures.py +0 -0
  426. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/fixtures/synthetic/upgrade_versioned.py +0 -0
  427. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/provider_allowlist.txt +0 -0
  428. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/repo/__init__.py +0 -0
  429. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/repo/conftest.py +0 -0
  430. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/repo/test_bug_fixes.py +0 -0
  431. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/repo/test_consolidated_constraints_e2e.py +0 -0
  432. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/repo/test_envsubst_integration.py +0 -0
  433. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/repo/test_import_functional.py +0 -0
  434. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/repo/test_linkfile_copyfile.py +0 -0
  435. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/repo/test_linkfile_exclude_journey.py +0 -0
  436. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/repo/test_manifest_parsing.py +0 -0
  437. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/repo/test_process_isolation.py +0 -0
  438. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/repo/test_repo_module_smoke.py +0 -0
  439. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/repo/test_repo_pipeline.py +0 -0
  440. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/repo/test_repo_run_lifecycle.py +0 -0
  441. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/repo/test_repo_sync_lifecycle.py +0 -0
  442. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/repo/test_version_constraints_integration.py +0 -0
  443. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/repo/test_xml_annotation_roundtrip.py +0 -0
  444. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/repo/test_xml_contactinfo_roundtrip.py +0 -0
  445. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/repo/test_xml_copyfile_roundtrip.py +0 -0
  446. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/repo/test_xml_default_roundtrip.py +0 -0
  447. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/repo/test_xml_extend_project_roundtrip.py +0 -0
  448. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/repo/test_xml_include_roundtrip.py +0 -0
  449. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/repo/test_xml_linkfile_roundtrip.py +0 -0
  450. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/repo/test_xml_manifest_roundtrip.py +0 -0
  451. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/repo/test_xml_manifest_server_roundtrip.py +0 -0
  452. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/repo/test_xml_notice_roundtrip.py +0 -0
  453. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/repo/test_xml_project_roundtrip.py +0 -0
  454. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/repo/test_xml_remote_roundtrip.py +0 -0
  455. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/repo/test_xml_remove_project_roundtrip.py +0 -0
  456. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/repo/test_xml_repo_hooks_roundtrip.py +0 -0
  457. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/repo/test_xml_submanifest_roundtrip.py +0 -0
  458. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/repo/test_xml_superproject_roundtrip.py +0 -0
  459. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_add_core.py +0 -0
  460. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_add_dry_run.py +0 -0
  461. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_add_env_var_detection.py +0 -0
  462. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_add_zero_tags.py +0 -0
  463. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_auto_discovery.py +0 -0
  464. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_background_refresh.py +0 -0
  465. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_cache_clock_skew.py +0 -0
  466. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_cache_layout.py +0 -0
  467. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_catalog_audit_entry_uniqueness.py +0 -0
  468. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_catalog_audit_framework.py +0 -0
  469. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_catalog_audit_legacy_dir.py +0 -0
  470. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_catalog_audit_metadata.py +0 -0
  471. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_catalog_audit_remote_url.py +0 -0
  472. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_catalog_audit_source_name.py +0 -0
  473. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_catalog_audit_strict.py +0 -0
  474. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_catalog_audit_tag_format.py +0 -0
  475. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_catalog_constraints.py +0 -0
  476. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_ci_validation.py +0 -0
  477. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_clean_env_override_cleanup.py +0 -0
  478. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_clean_lifecycle.py +0 -0
  479. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_clean_paths.py +0 -0
  480. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_cli_entry_points.py +0 -0
  481. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_complete_cached_catalogs.py +0 -0
  482. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_complete_catalog_entries.py +0 -0
  483. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_complete_catalog_versions.py +0 -0
  484. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_complete_lockfile_names.py +0 -0
  485. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_complete_project_versions.py +0 -0
  486. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_complete_source_names.py +0 -0
  487. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_completion_bash.py +0 -0
  488. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_completion_powershell_subcommand.py +0 -0
  489. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_completion_subcommand.py +0 -0
  490. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_completion_zsh.py +0 -0
  491. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_concurrency.py +0 -0
  492. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_concurrency_serialization.py +0 -0
  493. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_copyfile_fs_effects.py +0 -0
  494. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_cross_platform_contract.py +0 -0
  495. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_doc_validation.py +0 -0
  496. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_doctor_cache_flags.py +0 -0
  497. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_doctor_cache_flags_workspace_independent.py +0 -0
  498. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_doctor_consistency.py +0 -0
  499. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_doctor_default_subcheck_output.py +0 -0
  500. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_doctor_effective_source.py +0 -0
  501. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_doctor_prune_cache.py +0 -0
  502. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_doctor_remote_check.py +0 -0
  503. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_envsubst_command.py +0 -0
  504. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_fs_fault_extended.py +0 -0
  505. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_fs_fault_injection.py +0 -0
  506. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_full_lifecycle_synthetic.py +0 -0
  507. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_full_user_journey.py +0 -0
  508. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_git_fault_injection.py +0 -0
  509. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_git_retry_env.py +0 -0
  510. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_gitignore_idempotency.py +0 -0
  511. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_install_after_add.py +0 -0
  512. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_install_command.py +0 -0
  513. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_install_env_var_resolution.py +0 -0
  514. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_install_errors.py +0 -0
  515. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_install_include_cycle.py +0 -0
  516. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_install_include_diamond.py +0 -0
  517. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_install_lock_file_derivation.py +0 -0
  518. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_install_lockfile_replay.py +0 -0
  519. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_install_marketplace_registration.py +0 -0
  520. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_install_no_kanon_remediation.py +0 -0
  521. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_install_optional_vars.py +0 -0
  522. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_install_path_conflict_integration.py +0 -0
  523. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_install_paths.py +0 -0
  524. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_install_per_alias_gitbase.py +0 -0
  525. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_install_reconcile.py +0 -0
  526. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_install_refresh_lock.py +0 -0
  527. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_install_refresh_lock_source.py +0 -0
  528. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_install_remote_url_policy.py +0 -0
  529. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_install_required_vars.py +0 -0
  530. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_install_strict.py +0 -0
  531. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_json_output_stream_discipline.py +0 -0
  532. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_kanon_add_placeholder_handling.py +0 -0
  533. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_kanon_clean_embedded.py +0 -0
  534. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_kanon_dir_collision.py +0 -0
  535. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_kanon_full_lifecycle.py +0 -0
  536. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_kanon_install_embedded.py +0 -0
  537. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_kanonenv_parsing.py +0 -0
  538. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_lifecycle_recovery.py +0 -0
  539. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_list_all_versions.py +0 -0
  540. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_list_all_versions_canonical.py +0 -0
  541. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_list_all_versions_malformed_revision_resilience.py +0 -0
  542. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_list_command_json.py +0 -0
  543. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_list_default.py +0 -0
  544. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_list_detail.py +0 -0
  545. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_list_filter.py +0 -0
  546. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_list_format_json.py +0 -0
  547. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_list_synthetic_catalog_variants.py +0 -0
  548. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_list_tree.py +0 -0
  549. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_lockfile_roundtrip.py +0 -0
  550. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_marketplace_install.py +0 -0
  551. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_marketplace_lifecycle.py +0 -0
  552. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_marketplace_orphan_prune.py +0 -0
  553. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_midtoken_bash.py +0 -0
  554. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_midtoken_zsh.py +0 -0
  555. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_misc_features.py +0 -0
  556. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_multi_source_aggregation.py +0 -0
  557. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_no_bundled_catalog.py +0 -0
  558. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_no_default_catalog.py +0 -0
  559. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_no_hardcoded_org_values.py +0 -0
  560. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_observability.py +0 -0
  561. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_outdated.py +0 -0
  562. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_outdated_branch_drift.py +0 -0
  563. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_outdated_fail_on_upgrade.py +0 -0
  564. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_outdated_format_json.py +0 -0
  565. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_outdated_refs_tags_revision_parsing.py +0 -0
  566. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_platform_parity.py +0 -0
  567. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_preamble_bash.py +0 -0
  568. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_preamble_zsh.py +0 -0
  569. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_remove_core.py +0 -0
  570. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_remove_dry_run.py +0 -0
  571. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_remove_force_integration.py +0 -0
  572. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_signal_handling.py +0 -0
  573. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_synthetic_drift_fixture.py +0 -0
  574. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_synthetic_upgrade_versioned_fixture.py +0 -0
  575. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_unicode_encoding.py +0 -0
  576. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_validate_marketplace.py +0 -0
  577. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_validate_marketplace_revision_existence.py +0 -0
  578. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_validate_metadata.py +0 -0
  579. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_validate_xml.py +0 -0
  580. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_version_resolution.py +0 -0
  581. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_version_widened_bare_pep440.py +0 -0
  582. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_wheel_e2e.py +0 -0
  583. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_why_ambiguous.py +0 -0
  584. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_why_chain_walker.py +0 -0
  585. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_why_format_json.py +0 -0
  586. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_why_live_resolve.py +0 -0
  587. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/integration/test_why_not_found_suggestion.py +0 -0
  588. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/regression/test_e0_f1_s2_t5_regression.py +0 -0
  589. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/regression/test_e0_f5_s2_t7_regression.py +0 -0
  590. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/regression/test_e0_f6_s1_t1_regression.py +0 -0
  591. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/regression/test_e0_f6_s1_t2_regression.py +0 -0
  592. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/regression/test_e0_f6_s1_t3_regression.py +0 -0
  593. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/regression/test_e0_f6_s1_t4_regression.py +0 -0
  594. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/regression/test_e0_f6_s2_t1_regression.py +0 -0
  595. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/regression/test_e0_f6_s2_t2_regression.py +0 -0
  596. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/regression/test_e0_f6_s2_t3_regression.py +0 -0
  597. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/regression/test_e0_f6_s2_t4_regression.py +0 -0
  598. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/regression/test_e0_f6_s2_t5_regression.py +0 -0
  599. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/regression/test_e0_f6_s2_t6_regression.py +0 -0
  600. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/regression/test_e0_f6_s3_t1_regression.py +0 -0
  601. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/regression/test_e0_f6_s3_t2_regression.py +0 -0
  602. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/regression/test_e0_install_relative_regression.py +0 -0
  603. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/regression/test_linkfile_samefile_regression.py +0 -0
  604. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/__init__.py +0 -0
  605. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/_rp_helpers.py +0 -0
  606. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/conftest.py +0 -0
  607. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_ad.py +0 -0
  608. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_bs.py +0 -0
  609. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_cd.py +0 -0
  610. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_content_pins.py +0 -0
  611. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_cs.py +0 -0
  612. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_doctor_cache.py +0 -0
  613. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_doctor_journey.py +0 -0
  614. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_ec.py +0 -0
  615. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_ep.py +0 -0
  616. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_et.py +0 -0
  617. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_ev.py +0 -0
  618. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_hv.py +0 -0
  619. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_ic.py +0 -0
  620. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_id.py +0 -0
  621. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_install_graph_capture.py +0 -0
  622. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_ks.py +0 -0
  623. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_lf.py +0 -0
  624. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_list_journey.py +0 -0
  625. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_lockfile_lifecycle.py +0 -0
  626. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_marketplace_direct_checkout.py +0 -0
  627. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_mk.py +0 -0
  628. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_mp.py +0 -0
  629. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_ms.py +0 -0
  630. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_outdated_two_source.py +0 -0
  631. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_pk.py +0 -0
  632. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_rc.py +0 -0
  633. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_refresh_lock_existing_checkout.py +0 -0
  634. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_rls_exact_vs_range.py +0 -0
  635. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_rp_abandon.py +0 -0
  636. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_rp_branches.py +0 -0
  637. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_rp_checkout.py +0 -0
  638. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_rp_cherry_pick.py +0 -0
  639. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_rp_diff.py +0 -0
  640. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_rp_diffmanifests.py +0 -0
  641. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_rp_download.py +0 -0
  642. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_rp_envsubst.py +0 -0
  643. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_rp_forall.py +0 -0
  644. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_rp_gc.py +0 -0
  645. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_rp_grep.py +0 -0
  646. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_rp_help.py +0 -0
  647. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_rp_info.py +0 -0
  648. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_rp_init.py +0 -0
  649. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_rp_list.py +0 -0
  650. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_rp_manifest.py +0 -0
  651. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_rp_overview.py +0 -0
  652. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_rp_prune.py +0 -0
  653. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_rp_rebase.py +0 -0
  654. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_rp_smartsync.py +0 -0
  655. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_rp_stage.py +0 -0
  656. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_rp_start.py +0 -0
  657. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_rp_status.py +0 -0
  658. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_rp_sync.py +0 -0
  659. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_rp_upload.py +0 -0
  660. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_rp_wrap.py +0 -0
  661. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_rx.py +0 -0
  662. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_scenario_coverage_meta.py +0 -0
  663. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_search_multi_source.py +0 -0
  664. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_tc_bootstrap.py +0 -0
  665. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_tc_clean.py +0 -0
  666. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_tc_install.py +0 -0
  667. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_tc_validate.py +0 -0
  668. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_uj.py +0 -0
  669. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_va.py +0 -0
  670. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_va_validate_lockfile.py +0 -0
  671. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_why_surface_query.py +0 -0
  672. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_why_url_path.py +0 -0
  673. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/scenarios/test_why_url_path_placeholder.py +0 -0
  674. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/security/__init__.py +0 -0
  675. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/security/test_security_hardening.py +0 -0
  676. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/test_wheel_layout.py +0 -0
  677. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/__init__.py +0 -0
  678. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/commands/test_repo_dir_resolution.py +0 -0
  679. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/conftest.py +0 -0
  680. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/__init__.py +0 -0
  681. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/conftest.py +0 -0
  682. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/fixtures/.gitignore +0 -0
  683. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/fixtures/README.md +0 -0
  684. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/fixtures/sample-manifest.xml +0 -0
  685. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/fixtures/sample-project-config.json +0 -0
  686. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/fixtures/test.gitconfig +0 -0
  687. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/fixtures/version_constraints_data.json +0 -0
  688. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/functional/__init__.py +0 -0
  689. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/functional/test_features.py +0 -0
  690. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/subcmds/__init__.py +0 -0
  691. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/subcmds/test_init_mirror.py +0 -0
  692. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/subcmds/test_manifest_revision_as_tag.py +0 -0
  693. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/subcmds/test_manifest_revision_as_tag_pep440.py +0 -0
  694. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/subcmds/test_selfupdate_stub.py +0 -0
  695. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_abandon_massive.py +0 -0
  696. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_branches_coverage.py +0 -0
  697. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_bug10_selfupdate_incompatible.py +0 -0
  698. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_bug11_race_condition.py +0 -0
  699. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_bug12_backup_preserved.py +0 -0
  700. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_bug13_init_reinit_warning.py +0 -0
  701. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_bug14_non_tty_log.py +0 -0
  702. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_bug15_prerelease_docs.py +0 -0
  703. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_bug16_nested_var_warning.py +0 -0
  704. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_bug18_envsubst_double_parse.py +0 -0
  705. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_bug19_glob_src_error.py +0 -0
  706. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_bug1_envsubst_malformed_xml.py +0 -0
  707. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_bug20_glob_dest_file.py +0 -0
  708. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_bug2_linkfile_errors.py +0 -0
  709. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_bug3_execv_replaces_process.py +0 -0
  710. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_bug4_symlink_overwrite.py +0 -0
  711. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_bug5_empty_envsubst_list.py +0 -0
  712. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_bug6_undefined_env_vars.py +0 -0
  713. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_bug7_git_ls_remote_retry.py +0 -0
  714. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_bug8_ls_remote_stderr.py +0 -0
  715. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_bug9_constraint_resolution_cache.py +0 -0
  716. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_checklocalpath_rules_1_5.py +0 -0
  717. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_checklocalpath_rules_6_11.py +0 -0
  718. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_checkout_massive.py +0 -0
  719. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_cherrypick_coverage.py +0 -0
  720. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_color.py +0 -0
  721. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_command.py +0 -0
  722. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_conftest_fixtures.py +0 -0
  723. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_diffmanifests_deep.py +0 -0
  724. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_doc_validate_git_preconditions.py +0 -0
  725. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_download_coverage.py +0 -0
  726. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_editor.py +0 -0
  727. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_embedded_mode.py +0 -0
  728. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_envsubst_basic.py +0 -0
  729. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_envsubst_edge.py +0 -0
  730. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_envsubst_massive.py +0 -0
  731. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_error.py +0 -0
  732. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_event_log.py +0 -0
  733. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_event_log_massive.py +0 -0
  734. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_fetch.py +0 -0
  735. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_fixture_files.py +0 -0
  736. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_forall_deep.py +0 -0
  737. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_git_command.py +0 -0
  738. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_git_config.py +0 -0
  739. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_git_refs.py +0 -0
  740. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_git_superproject.py +0 -0
  741. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_git_trace2_event_log.py +0 -0
  742. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_gitconfig_coverage.py +0 -0
  743. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_grep_deep.py +0 -0
  744. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_harness_smoke.py +0 -0
  745. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_hooks.py +0 -0
  746. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_import_verification.py +0 -0
  747. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_imports.py +0 -0
  748. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_include_path_resolution.py +0 -0
  749. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_info_deep.py +0 -0
  750. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_init_deep.py +0 -0
  751. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_list_massive.py +0 -0
  752. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_main.py +0 -0
  753. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_main_coverage.py +0 -0
  754. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_main_init_download_boost.py +0 -0
  755. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_makefile_lint_format.py +0 -0
  756. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_makefile_structure.py +0 -0
  757. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_makefile_test_targets.py +0 -0
  758. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_manifest_coverage_boost.py +0 -0
  759. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_manifest_deep.py +0 -0
  760. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_manifest_doc_rp_flags.py +0 -0
  761. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_manifest_massive.py +0 -0
  762. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_manifest_subcmd_massive.py +0 -0
  763. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_manifest_xml_pep440.py +0 -0
  764. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_medium_files_boost.py +0 -0
  765. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_mkdtemp_cleanup.py +0 -0
  766. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_overview_massive.py +0 -0
  767. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_package_structure.py +0 -0
  768. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_pager.py +0 -0
  769. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_parselist.py +0 -0
  770. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_pep440_edge_1.py +0 -0
  771. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_pep440_edge_2.py +0 -0
  772. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_pep440_ops_ge.py +0 -0
  773. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_pep440_ops_rest.py +0 -0
  774. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_platform_utils.py +0 -0
  775. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_process_isolation.py +0 -0
  776. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_progress.py +0 -0
  777. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_project_coverage_boost.py +0 -0
  778. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_project_coverage_threshold.py +0 -0
  779. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_project_deep.py +0 -0
  780. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_project_deep_boost.py +0 -0
  781. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_project_final_boost.py +0 -0
  782. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_project_integration.py +0 -0
  783. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_project_massive.py +0 -0
  784. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_project_metaproject_boost.py +0 -0
  785. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_project_methods.py +0 -0
  786. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_project_sync.py +0 -0
  787. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_prune_massive.py +0 -0
  788. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_rebase_coverage.py +0 -0
  789. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_remaining_coverage_boost.py +0 -0
  790. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_repo_envsubst_api.py +0 -0
  791. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_repo_logging.py +0 -0
  792. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_repo_run_api.py +0 -0
  793. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_repo_sync_api.py +0 -0
  794. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_repo_trace.py +0 -0
  795. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_revision_inheritance.py +0 -0
  796. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_revision_tag_branch_sha.py +0 -0
  797. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_ruff_config.py +0 -0
  798. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_selfupdate_embedded.py +0 -0
  799. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_selfupdate_massive.py +0 -0
  800. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_small_files_boost.py +0 -0
  801. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_ssh.py +0 -0
  802. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_ssh_deep.py +0 -0
  803. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_stage_coverage.py +0 -0
  804. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_stage_massive.py +0 -0
  805. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_start_coverage.py +0 -0
  806. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_status_coverage.py +0 -0
  807. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_status_gaps.py +0 -0
  808. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_status_massive.py +0 -0
  809. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmd_imports.py +0 -0
  810. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds.py +0 -0
  811. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_abandon.py +0 -0
  812. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_branches.py +0 -0
  813. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_checkout.py +0 -0
  814. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_cherry_pick.py +0 -0
  815. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_diff.py +0 -0
  816. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_diffmanifests.py +0 -0
  817. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_download.py +0 -0
  818. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_envsubst.py +0 -0
  819. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_forall.py +0 -0
  820. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_gc.py +0 -0
  821. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_grep.py +0 -0
  822. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_help.py +0 -0
  823. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_info.py +0 -0
  824. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_init.py +0 -0
  825. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_list.py +0 -0
  826. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_manifest.py +0 -0
  827. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_overview.py +0 -0
  828. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_prune.py +0 -0
  829. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_rebase.py +0 -0
  830. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_selfupdate.py +0 -0
  831. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_smartsync.py +0 -0
  832. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_stage.py +0 -0
  833. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_start.py +0 -0
  834. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_status.py +0 -0
  835. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_sync.py +0 -0
  836. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_subcmds_upload.py +0 -0
  837. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_superproject_deep.py +0 -0
  838. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_sync_coverage_boost.py +0 -0
  839. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_sync_deep.py +0 -0
  840. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_sync_deep_boost.py +0 -0
  841. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_sync_massive.py +0 -0
  842. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_upload_deep.py +0 -0
  843. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_version_consolidation.py +0 -0
  844. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_version_constraints.py +0 -0
  845. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_wheel_contents.py +0 -0
  846. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_wrapper.py +0 -0
  847. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_annotation_attributes.py +0 -0
  848. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_annotation_crossref.py +0 -0
  849. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_annotation_happy.py +0 -0
  850. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_contactinfo_attributes.py +0 -0
  851. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_contactinfo_crossref.py +0 -0
  852. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_contactinfo_happy.py +0 -0
  853. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_copyfile_attributes.py +0 -0
  854. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_copyfile_crossref.py +0 -0
  855. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_copyfile_happy.py +0 -0
  856. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_default_attributes.py +0 -0
  857. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_default_crossref.py +0 -0
  858. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_default_happy.py +0 -0
  859. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_extend_project_attributes.py +0 -0
  860. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_extend_project_crossref.py +0 -0
  861. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_extend_project_happy.py +0 -0
  862. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_fault_malformed.py +0 -0
  863. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_fault_structural.py +0 -0
  864. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_include_attributes.py +0 -0
  865. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_include_crossref.py +0 -0
  866. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_include_cycles.py +0 -0
  867. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_include_happy.py +0 -0
  868. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_linkfile_attributes.py +0 -0
  869. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_linkfile_crossref.py +0 -0
  870. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_linkfile_happy.py +0 -0
  871. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_manifest_attributes.py +0 -0
  872. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_manifest_crossref.py +0 -0
  873. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_manifest_happy.py +0 -0
  874. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_manifest_server_attributes.py +0 -0
  875. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_manifest_server_crossref.py +0 -0
  876. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_manifest_server_flow.py +0 -0
  877. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_manifest_server_happy.py +0 -0
  878. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_notice_attributes.py +0 -0
  879. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_notice_crossref.py +0 -0
  880. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_notice_happy.py +0 -0
  881. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_project_attributes.py +0 -0
  882. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_project_crossref.py +0 -0
  883. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_project_happy.py +0 -0
  884. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_remote_attributes.py +0 -0
  885. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_remote_crossref.py +0 -0
  886. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_remote_happy.py +0 -0
  887. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_remove_project_attributes.py +0 -0
  888. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_remove_project_crossref.py +0 -0
  889. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_remove_project_happy.py +0 -0
  890. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_repo_hooks_attributes.py +0 -0
  891. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_repo_hooks_crossref.py +0 -0
  892. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_repo_hooks_happy.py +0 -0
  893. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_submanifest_attributes.py +0 -0
  894. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_submanifest_crossref.py +0 -0
  895. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_submanifest_happy.py +0 -0
  896. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_superproject_attributes.py +0 -0
  897. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_superproject_crossref.py +0 -0
  898. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_superproject_flow.py +0 -0
  899. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xml_superproject_happy.py +0 -0
  900. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xmlbool.py +0 -0
  901. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_xmlint.py +0 -0
  902. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/repo/test_yamllint_config.py +0 -0
  903. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_accessed_at_coalescing.py +0 -0
  904. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_add.py +0 -0
  905. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_add_zero_tags.py +0 -0
  906. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_bare_semver_to_tag.py +0 -0
  907. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_build_project_entries.py +0 -0
  908. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_cache.py +0 -0
  909. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_cache_layout.py +0 -0
  910. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_cache_ttl.py +0 -0
  911. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_cached_catalogs.py +0 -0
  912. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_catalog.py +0 -0
  913. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_catalog_audit_check_parser.py +0 -0
  914. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_catalog_audit_entry_uniqueness.py +0 -0
  915. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_catalog_audit_framework.py +0 -0
  916. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_catalog_audit_legacy_dir.py +0 -0
  917. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_catalog_audit_metadata.py +0 -0
  918. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_catalog_audit_project_tag_format.py +0 -0
  919. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_catalog_audit_remote_url.py +0 -0
  920. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_catalog_audit_source_name.py +0 -0
  921. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_catalog_audit_strict.py +0 -0
  922. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_catalog_audit_tag_format.py +0 -0
  923. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_catalog_source_parsing.py +0 -0
  924. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_check_no_comments.py +0 -0
  925. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_cli.py +0 -0
  926. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_cli_args.py +0 -0
  927. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_cli_help_format.py +0 -0
  928. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_cli_json_stream_discipline.py +0 -0
  929. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_complete_cached_catalogs.py +0 -0
  930. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_complete_catalog_entries.py +0 -0
  931. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_complete_catalog_versions.py +0 -0
  932. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_complete_lockfile_names.py +0 -0
  933. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_complete_source_names.py +0 -0
  934. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_completion.py +0 -0
  935. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_completion_sanitization.py +0 -0
  936. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_completion_subcommand.py +0 -0
  937. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_conftest_scrubber.py +0 -0
  938. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_constants.py +0 -0
  939. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_constants_doctor_subcheck.py +0 -0
  940. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_constants_env_int.py +0 -0
  941. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_constants_install_after_add.py +0 -0
  942. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_constants_list.py +0 -0
  943. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_constants_outdated_refs_tags.py +0 -0
  944. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_constants_why_lockfile.py +0 -0
  945. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_coverage_gaps.py +0 -0
  946. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_derive_source_name.py +0 -0
  947. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_discover.py +0 -0
  948. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_discover_source_names_missing_url.py +0 -0
  949. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_docs_embedded_architecture.py +0 -0
  950. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_docs_remaining_and_catalog.py +0 -0
  951. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_doctor.py +0 -0
  952. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_doctor_cache_flags.py +0 -0
  953. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_doctor_completion_errors.py +0 -0
  954. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_doctor_completion_staleness.py +0 -0
  955. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_doctor_consistency.py +0 -0
  956. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_doctor_coverage_gaps.py +0 -0
  957. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_doctor_effective_source.py +0 -0
  958. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_doctor_remote_reachability.py +0 -0
  959. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_env_isolation.py +0 -0
  960. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_envsubst_subcommand.py +0 -0
  961. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_git_runner.py +0 -0
  962. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_home_flag.py +0 -0
  963. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_include_walker.py +0 -0
  964. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_install_color_default.py +0 -0
  965. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_install_command.py +0 -0
  966. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_install_conflict_detection.py +0 -0
  967. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_install_https_enforcement.py +0 -0
  968. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_install_placeholder_validation.py +0 -0
  969. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_install_reconcile_decision.py +0 -0
  970. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_install_refresh_lock.py +0 -0
  971. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_install_refresh_lock_source.py +0 -0
  972. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_install_state_matrix.py +0 -0
  973. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_install_strict_flags.py +0 -0
  974. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_install_strict_lock_orphan_naming.py +0 -0
  975. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_integration_testing_doc_manifest_paths.py +0 -0
  976. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_integration_testing_doc_s2_t14.py +0 -0
  977. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_integration_testing_doc_s2_t4.py +0 -0
  978. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_integration_testing_doc_s2_t5.py +0 -0
  979. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_integration_testing_doc_s2_t6.py +0 -0
  980. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_integration_testing_doc_s2_t7.py +0 -0
  981. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_integration_testing_doc_s2_tier1.py +0 -0
  982. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_isolation_fixtures.py +0 -0
  983. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_kanon_hash.py +0 -0
  984. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_kanonenv.py +0 -0
  985. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_kanonenv_advanced_edge_cases.py +0 -0
  986. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_kanonenv_edge_cases.py +0 -0
  987. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_kanonenv_writer.py +0 -0
  988. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_levenshtein.py +0 -0
  989. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_list.py +0 -0
  990. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_lock_file_path.py +0 -0
  991. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_lockfile.py +0 -0
  992. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_lockfile_coverage_gaps.py +0 -0
  993. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_lockfile_reconcile.py +0 -0
  994. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_lockfile_schema_migration.py +0 -0
  995. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_manifest.py +0 -0
  996. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_manifest_vars.py +0 -0
  997. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_marketplace.py +0 -0
  998. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_marketplace_cmd.py +0 -0
  999. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_marketplace_install.py +0 -0
  1000. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_marketplace_non_plugin_skip.py +0 -0
  1001. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_marketplace_validator.py +0 -0
  1002. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_metadata.py +0 -0
  1003. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_midtoken_splitter.py +0 -0
  1004. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_outdated.py +0 -0
  1005. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_outdated_branch_pinned.py +0 -0
  1006. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_outdated_fail_on_upgrade.py +0 -0
  1007. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_outdated_format_json.py +0 -0
  1008. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_pep440_filter.py +0 -0
  1009. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_powershell.py +0 -0
  1010. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_pre_push_hook.py +0 -0
  1011. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_preamble.py +0 -0
  1012. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_preamble_semver_tags.py +0 -0
  1013. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_provider_agnosticism.py +0 -0
  1014. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_pyproject_build_config.py +0 -0
  1015. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_remote_url.py +0 -0
  1016. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_remove.py +0 -0
  1017. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_remove_dry_run.py +0 -0
  1018. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_remove_force.py +0 -0
  1019. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_remove_line_endings.py +0 -0
  1020. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_repo.py +0 -0
  1021. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_repo_abspath.py +0 -0
  1022. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_repo_command.py +0 -0
  1023. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_resolve_catalog_dir.py +0 -0
  1024. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_revision_resolve.py +0 -0
  1025. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_rx_catalog_sub_repo.py +0 -0
  1026. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_sanitize.py +0 -0
  1027. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_search.py +0 -0
  1028. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_search_all_versions.py +0 -0
  1029. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_search_coverage_gaps.py +0 -0
  1030. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_search_detail.py +0 -0
  1031. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_search_filter.py +0 -0
  1032. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_search_format_json.py +0 -0
  1033. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_search_tree.py +0 -0
  1034. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_sync_jobs.py +0 -0
  1035. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_telemetry.py +0 -0
  1036. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_toolchain_isolation.py +0 -0
  1037. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_update_check.py +0 -0
  1038. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_url.py +0 -0
  1039. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_validate.py +0 -0
  1040. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_validate_command.py +0 -0
  1041. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_validate_metadata.py +0 -0
  1042. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_version.py +0 -0
  1043. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_version_constraint_errors.py +0 -0
  1044. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_why.py +0 -0
  1045. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_why_ambiguity.py +0 -0
  1046. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_why_format_json.py +0 -0
  1047. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_why_suggestions.py +0 -0
  1048. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tests/unit/test_xml_validator.py +0 -0
  1049. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tools/lint/check_no_comments.py +0 -0
  1050. {kanon_cli-3.4.0 → kanon_cli-3.4.2}/tools/test_tmp_monitor.py +0 -0
@@ -2,5 +2,5 @@
2
2
  #
3
3
  # Defines code ownership for pull request review requirements.
4
4
 
5
- # All files owned by the primary maintainer
6
- / @matt-dresden-caylent
5
+ # All files owned by the Kanon release-approver team
6
+ * @caylent-solutions/kanon-release-approvers
@@ -429,3 +429,19 @@ jobs:
429
429
  run: |
430
430
  NEW_VERSION=$(grep '^version = ' pyproject.toml | sed 's/.*version = "\([^"]*\)".*/\1/')
431
431
  gh workflow run publish.yml -f tag="$NEW_VERSION"
432
+
433
+ native-windows:
434
+ name: Native Windows contracts
435
+ runs-on: windows-latest
436
+ steps:
437
+ - name: Checkout reviewed commit
438
+ uses: actions/checkout@v6
439
+ with:
440
+ ref: ${{ github.event.pull_request.head.sha || github.sha }}
441
+ fetch-depth: 0
442
+ - uses: ./.github/actions/setup-kanon
443
+ - name: Run native Windows acceptance
444
+ env:
445
+ KANON_NATIVE_STORE_ROOT: ${{ runner.temp }}
446
+ shell: bash
447
+ run: make test-windows
@@ -378,3 +378,19 @@ jobs:
378
378
  fi
379
379
  echo "Final owners: $UNIQUE_OWNERS"
380
380
  echo "owners=$UNIQUE_OWNERS" >> $GITHUB_OUTPUT
381
+
382
+ native-windows:
383
+ name: Native Windows contracts
384
+ runs-on: windows-latest
385
+ steps:
386
+ - name: Checkout reviewed commit
387
+ uses: actions/checkout@v6
388
+ with:
389
+ ref: ${{ github.event.pull_request.head.sha || github.sha }}
390
+ fetch-depth: 0
391
+ - uses: ./.github/actions/setup-kanon
392
+ - name: Run native Windows acceptance
393
+ env:
394
+ KANON_NATIVE_STORE_ROOT: ${{ runner.temp }}
395
+ shell: bash
396
+ run: make test-windows
@@ -33,7 +33,7 @@ repos:
33
33
  hooks:
34
34
  - id: no-comments
35
35
  name: no-comments (kanon-owned Python)
36
- entry: python tools/lint/check_no_comments.py
36
+ entry: uv run python tools/lint/check_no_comments.py
37
37
  language: system
38
38
  types: [python]
39
39
  files: ^(src/kanon_cli|tests)/
@@ -2,8 +2,302 @@
2
2
 
3
3
 
4
4
 
5
+ ## v3.4.2 (2026-09-28)
6
+
7
+ ### Build
8
+
9
+ * build(deps): bump gitpython from 3.1.58 to 3.1.59
10
+
11
+ Bumps [gitpython](https://github.com/gitpython-developers/GitPython) from 3.1.58 to 3.1.59.
12
+ - [Release notes](https://github.com/gitpython-developers/GitPython/releases)
13
+ - [Changelog](https://github.com/gitpython-developers/GitPython/blob/main/CHANGES)
14
+ - [Commits](https://github.com/gitpython-developers/GitPython/compare/3.1.58...3.1.59)
15
+
16
+ ---
17
+ updated-dependencies:
18
+ - dependency-name: gitpython
19
+ dependency-version: 3.1.59
20
+ dependency-type: indirect
21
+ ...
22
+
23
+ Signed-off-by: dependabot[bot] <support@github.com> ([`aa305fd`](https://github.com/caylent-solutions/kanon/commit/aa305fda781cb18119f20117c60469ce340a3428))
24
+
25
+ ### Chore
26
+
27
+ * chore(pre-commit): run the no-comments gate through uv
28
+
29
+ The hook invoked a bare `python`, which does not exist on a machine whose
30
+ only interpreter is the uv-managed one. There it failed with "Executable
31
+ `python` not found" on every commit -- the gate reported Failed without ever
32
+ scanning a file, so a disallowed comment could reach a commit unnoticed.
33
+
34
+ Every other entry point to this check already goes through uv: the Makefile's
35
+ lint-no-comments target, and the sibling completion-snapshots hook by way of
36
+ make.
37
+
38
+ Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> ([`b8fa7f0`](https://github.com/caylent-solutions/kanon/commit/b8fa7f0fd7dec7698647b1e0a75e45d80e25ba4f))
39
+
40
+ ### Ci
41
+
42
+ * ci(windows): resolve runner temp in execution step context ([`45b6677`](https://github.com/caylent-solutions/kanon/commit/45b66775169af7906eea3e5640969d55a0db4987))
43
+
44
+ * ci(windows): align native store with vendored same-volume requirement ([`184023a`](https://github.com/caylent-solutions/kanon/commit/184023aad380ce0197898a15771a5870f17763e5))
45
+
46
+ ### Fix
47
+
48
+ * fix: preserve source-directory permission diagnostics ([`f88d9c0`](https://github.com/caylent-solutions/kanon/commit/f88d9c03c218cfd6663a5233d4a2bbf6f0d394f0))
49
+
50
+ * fix(windows): isolate worker imports and preserve concurrent logs ([`0e39afe`](https://github.com/caylent-solutions/kanon/commit/0e39afe8d606d6eda870853ceead99f9afb4be27))
51
+
52
+ * fix(add): refresh content and ownership after forced replacement ([`9208978`](https://github.com/caylent-solutions/kanon/commit/920897879c730f36fb183bef6adc466e5e08223d))
53
+
54
+ * fix: isolate consumer linkfiles across shared-store projects ([`418cae0`](https://github.com/caylent-solutions/kanon/commit/418cae0095ed6a4ff40fc5e5f3b6285f9f760ed4))
55
+
56
+ * fix(windows): enforce native locking and detached worker contracts ([`8bca79c`](https://github.com/caylent-solutions/kanon/commit/8bca79c1740a6809936cadaaefe13298aa51f90f))
57
+
58
+ * fix(codeowners): assign Kanon release approvers to all files ([`0dc908b`](https://github.com/caylent-solutions/kanon/commit/0dc908b515276f61efce622d637996820f906a96))
59
+
60
+ * fix(hooks): stop the pre-push gate corrupting the repository it gates
61
+
62
+ Git exports GIT_DIR and its siblings to hooks, and pre-push inherits
63
+ them into `make test-unit-cov`. GIT_DIR outranks cwd, so the fixture
64
+ helper in TestResetManifestsWorkingTree -- which passes only a working
65
+ directory to `git init` and `git config` -- wrote into the pushing
66
+ developer's own repository instead of its temp fixture: core.bare=true,
67
+ which breaks every worktree of that repo, and a fixture
68
+ user.name/user.email, which silently reattributed their next commit.
69
+ Both were observed on a real checkout.
70
+
71
+ Fixed at both ends. The helper scrubs GIT_* from the environment it
72
+ hands git, so cwd means what the helper assumes; a regression test
73
+ builds a fixture repo under a deliberately set GIT_DIR and asserts that
74
+ repository's config is untouched. pre-push unsets the same variables
75
+ after resolving the repo root, so no future test acquires the same
76
+ reach.
77
+
78
+ Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> ([`065caa2`](https://github.com/caylent-solutions/kanon/commit/065caa20fe5ee1c1d74bea71526fd925e3e544b3))
79
+
80
+ * fix: linkfile symlink target no longer records checkout depth
81
+
82
+ A <linkfile> delivering into the consuming project pointed at content in
83
+ the KANON_HOME store, which sits outside the project, so the target was
84
+ measured across the filesystem and its ".." chain recorded how deeply the
85
+ checkout happened to sit on disk. Installing from a git worktree -- three
86
+ directories deeper than the clone containing it -- wrote a
87
+ three-level-longer target: correct there, dangling in every ordinary
88
+ clone, with nothing to signal the difference. One such target was
89
+ committed and merged before anyone noticed.
90
+
91
+ kanon install now maintains <project-root>/.packages, a gitignored
92
+ symlink into the store's aggregated package directory, and measures the
93
+ target between two project-root-relative paths instead. The result is a
94
+ function of the manifest alone and is byte-identical at every checkout
95
+ depth. kanon clean removes the anchor it created.
96
+
97
+ Marketplace destinations and any source outside a .packages slot keep
98
+ their existing plain relative target; this narrows a target that would
99
+ otherwise escape the project root, and never widens one.
100
+
101
+ Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> ([`bbc4aa5`](https://github.com/caylent-solutions/kanon/commit/bbc4aa539e83d5c8c225f8a74408b19a351284c2))
102
+
103
+ * fix(add): resolve a re-add to the block already declaring that manifest name
104
+
105
+ kanon add resolved an entry's alias from the source URL and ref alone, so a
106
+ re-add whose coordinates differed at all -- a newer tag, a differently spelled
107
+ catalog URL -- missed the same-alias duplicate check and auto-suffixed into a
108
+ fresh alias. The .kanon file was left with two live source blocks declaring the
109
+ same KANON_SOURCE_<alias>_NAME, a state install has no rule for.
110
+
111
+ An entry whose manifest name is already declared now resolves to that block's
112
+ alias, whatever source it names and whatever alias the block carries. The
113
+ --force gate is unchanged: a hard error with a diff, or an in-place overwrite
114
+ plus lock re-pin. The auto-suffix candidate sequence still separates distinct
115
+ packages whose names sanitize to one alias.
116
+
117
+ Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> ([`3018b8f`](https://github.com/caylent-solutions/kanon/commit/3018b8f65a2a1798dbeb72ec2a844eaaccb5a9df))
118
+
119
+ * fix(lint,format): remove unused import and variable in test_spawn, fix ruff format ([`04ef906`](https://github.com/caylent-solutions/kanon/commit/04ef90619d20fb8363534534a1d0236fbaa2be41))
120
+
121
+ * fix(concurrency,spawn): add Windows backend for issue #75
122
+
123
+ - concurrency.py: dispatch _exclusive_kernel_lock to platform-specific
124
+ backend; add _exclusive_kernel_lock_windows using Win32 LockFileEx +
125
+ WaitForSingleObject — true kernel-level blocking with no poll loop and
126
+ no sleep, matching the POSIX SIGALRM approach
127
+ - spawn.py: dispatch spawn_detached to _spawn_detached_windows on win32;
128
+ Windows backend uses multiprocessing.Process(daemon=False) with the
129
+ spawn context; _windows_child_target redirects stdin/stdout/stderr
130
+ before calling refresh_fn
131
+ - doctor.py: remove 'fcntl.flock' reference from stale-lock diagnostic
132
+ - tests/test_spawn.py: add three Windows backend unit tests
133
+
134
+ Resolves #75 — AttributeError: module 'os' has no attribute 'fork'
135
+ Resolves ModuleNotFoundError: No module named 'fcntl' on Windows ([`7b28799`](https://github.com/caylent-solutions/kanon/commit/7b28799e476504596d6698fba493d494b0ba80cc))
136
+
137
+ * fix(concurrency,spawn): add Windows backend to resolve issue #75
138
+
139
+ concurrency.py: add _exclusive_kernel_lock_windows using Win32 LockFileEx
140
+ + WaitForSingleObject via ctypes. Dispatches from _exclusive_kernel_lock
141
+ via sys.platform check. True kernel-level blocking with no poll loop and
142
+ no sleep, matching the POSIX SIGALRM approach. import fcntl / import signal
143
+ remain inside _exclusive_kernel_lock_posix; no unconditional POSIX-only
144
+ import on any CLI startup path.
145
+
146
+ spawn.py: add _spawn_detached_windows + _windows_child_target using
147
+ multiprocessing.Process(daemon=False) with the spawn context. The callable
148
+ is already picklable (module-level functools.partial, noted in cache.py).
149
+ Dispatches from spawn_detached via sys.platform check. The POSIX path
150
+ (os.fork / os.setsid / os.dup2) is unchanged.
151
+
152
+ doctor.py: remove platform-specific 'fcntl.flock' reference from the
153
+ STALE_INSTALL_LOCK advisory message.
154
+
155
+ tests/unit/test_spawn.py: add three tests for the Windows backend covering
156
+ non-daemon process creation, correct args, and fail-fast on start() failure.
157
+ All tests use mocking and run on every platform without skipif.
158
+
159
+ Fixes #75. ([`f4bd55b`](https://github.com/caylent-solutions/kanon/commit/f4bd55b00c8bd8fb49e15b81ee6051eef5dcb419))
160
+
161
+ ### Refactor
162
+
163
+ * refactor: narrow duplicate-source fix to add and content refresh ([`b78b792`](https://github.com/caylent-solutions/kanon/commit/b78b7927d37acee40f56aff9bf5b6e1d52c9f39b))
164
+
165
+ * refactor: simplify the linkfile target computation
166
+
167
+ Four cleanups, no behaviour change. The depth-independence tests still
168
+ fail without the fix, and the full suite passes with it.
169
+
170
+ _AnchoredTarget returned either a target or None, leaving both call
171
+ sites to repeat the plain-relpath fallback behind an `or`. It is now
172
+ _LinkTarget, always returns a target, and owns that fallback as its own
173
+ named default, so each call site is a single unconditional expression.
174
+
175
+ Containment of the dest was decided by prefix arithmetic against the
176
+ project root and then re-derived, as a relative path, on the way out.
177
+ One os.path.relpath now does both: a first component of ".." is what
178
+ "outside the project" means, which is also how the src side already
179
+ reads.
180
+
181
+ The environment carried <project_root>/.packages, which the vendored
182
+ tool took apart with dirname and basename to recover two facts install
183
+ already had. It now carries KANON_PROJECT_ROOT, and ".packages" is a
184
+ module constant in project.py -- shared with _LINKFILE_EXCLUDE_ALWAYS,
185
+ which had the name as a third literal.
186
+
187
+ ensure_project_packages_anchor guarded against the store resolving to
188
+ the project root, which requires .kanon to live inside the store. The
189
+ full suite passes without it; it was validation for a case that cannot
190
+ arise, and it cost a nesting level.
191
+
192
+ Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> ([`4f9e77a`](https://github.com/caylent-solutions/kanon/commit/4f9e77a34120d99d1ee6867074910284d2bd3607))
193
+
194
+ ### Test
195
+
196
+ * test: resolve the stub temp root so absolute-dest tests pass on macOS
197
+
198
+ Twenty-one absolute-dest tests failed on every macOS checkout, including
199
+ a clean main, which left `make test-unit` -- and with it the pre-push
200
+ gate -- red regardless of the change under test.
201
+
202
+ An absolute <linkfile>/<copyfile> dest is refused when any component of
203
+ its path is a symlink, and the platform temp root is one on macOS:
204
+ tempfile puts these fixtures under /var/folders/..., and /var is a
205
+ symlink to /private/var. The resolver was right; the fixtures were not.
206
+ install() resolves the consumer project root before publishing it as a
207
+ permitted root, so a stub checkout standing in for one has to be
208
+ resolved too.
209
+
210
+ Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> ([`de103e7`](https://github.com/caylent-solutions/kanon/commit/de103e7cfd130b3291be3d972b9305f2734c152a))
211
+
212
+ ### Unknown
213
+
214
+ * Merge pull request #129 from caylent-solutions/fix/add-same-name-duplicate-source-block
215
+
216
+ fix(add): resolve a re-add to the block already declaring that manifest name ([`0ac1f1c`](https://github.com/caylent-solutions/kanon/commit/0ac1f1c3ab957529bd9eacbe15fcb11dc9518502))
217
+
218
+ * Merge remote-tracking branch 'refs/remotes/upstream/main' into review/fix-pr129 ([`5d5f562`](https://github.com/caylent-solutions/kanon/commit/5d5f562459556f3c042cf966fafcae2449dba667))
219
+
220
+ * Merge pull request #128 from caylent-solutions/chore/pre-commit-no-comments-uv
221
+
222
+ chore(pre-commit): run the no-comments gate through uv ([`7a0e81f`](https://github.com/caylent-solutions/kanon/commit/7a0e81f2d12616f677be2d94285e9fd5bbd8fd07))
223
+
224
+ * Merge pull request #122 from caylent-solutions/fix/windows-compat-issue-75
225
+
226
+ fix(windows): enforce native workspace locks and detached workers ([`a4b0df2`](https://github.com/caylent-solutions/kanon/commit/a4b0df24656e9d8d5ef8730cafa22ba3f68f0a0f))
227
+
228
+ * Merge pull request #127 from caylent-solutions/fix/linkfile-target-checkout-depth
229
+
230
+ fix: linkfile symlink target no longer records checkout depth ([`9e41cb2`](https://github.com/caylent-solutions/kanon/commit/9e41cb21cc6a70f91049c79dac1d5e3ea9f3724a))
231
+
232
+ * Merge pull request #125 from caylent-solutions/dependabot/uv/gitpython-3.1.59
233
+
234
+ build(deps): bump gitpython from 3.1.58 to 3.1.59 ([`388ba57`](https://github.com/caylent-solutions/kanon/commit/388ba57e075582abc2132c05552a24228d528f74))
235
+
236
+ * Merge pull request #130 from caylent-solutions/chore/builders-codeowners
237
+
238
+ chore(codeowners): assign Kanon release approvers to all files ([`b0787c2`](https://github.com/caylent-solutions/kanon/commit/b0787c297622573b03ab37ee64664edf6103026e))
239
+
240
+
241
+ ## v3.4.1 (2026-08-21)
242
+
243
+ ### Chore
244
+
245
+ * chore(release): 3.4.1 ([`8a9a35c`](https://github.com/caylent-solutions/kanon/commit/8a9a35cde4985d74f1515f7fa52065809dc21e34))
246
+
247
+ ### Fix
248
+
249
+ * fix: kanon clean --purge-all no longer orphans the marketplace it registered (#120)
250
+
251
+ Reported from a real machine, reproduced verbatim.
252
+
253
+ `kanon clean --purge-all` removed the shared store without first unregistering
254
+ what kanon had put into Claude. Claude was left holding a marketplace whose
255
+ content no longer existed and reported it as `failed to load: cache-miss`.
256
+
257
+ The state was unrecoverable through kanon. `kanon clean` locates the marketplace
258
+ by enumerating the marketplace directory, which the teardown had already deleted,
259
+ so a follow-up clean reports "Broken symlink detected and skipped" then "No
260
+ marketplace entries found. Nothing to uninstall." and gives up. Fixing it meant
261
+ `claude plugin uninstall` and `claude plugin marketplace remove` by hand.
262
+
263
+ `.kanon.lock` survives a deleted `.kanon` and records `registered_marketplaces`
264
+ per source. kanon always had the marketplace name, the directory, and the fact it
265
+ had registered it; the teardown simply never read them.
266
+
267
+ Both machine-wide paths now unregister from that ledger BEFORE removing anything.
268
+ The no-project-found path discovers the lockfile by the same upward walk
269
+ `find_kanonenv` uses; the sourceless-project path reads its sibling. Ordering is
270
+ asserted by test, since unregistering after the delete is precisely what produced
271
+ the orphan.
272
+
273
+ One of the two paths was mine. `_purge_sourceless_project` shipped in 3.4.0 and
274
+ delegated to the same incomplete teardown, so closing the "cannot purge" bug
275
+ extended this defect to a new path rather than merely inheriting it. It also
276
+ deleted `.kanon.lock`, destroying the only record of what to unregister.
277
+
278
+ Candidates come only from the lockfile ledger, never from enumerating the
279
+ directory, matching the safety invariant `_prune_orphaned_marketplaces` already
280
+ documents: a marketplace kanon did not register was never written to a ledger and
281
+ cannot be unregistered here. A missing lockfile or empty ledger is not an error
282
+ and does not require claude on PATH.
283
+
284
+ Verified end to end in a container against a 3.4.0 build: the reported sequence
285
+ now leaves zero marketplaces, zero plugins and no stale lockfile. Guards proven
286
+ falsifiable by reintroducing the defect in both paths. ([`6edc65a`](https://github.com/caylent-solutions/kanon/commit/6edc65a9c5cbe09fc057c370e867abaaf63136f7))
287
+
288
+ ### Unknown
289
+
290
+ * Merge pull request #121 from caylent-solutions/release-3.4.1
291
+
292
+ Release 3.4.1 ([`a7f5c31`](https://github.com/caylent-solutions/kanon/commit/a7f5c3113867f270c25e0a7e74a2c27bd68567fa))
293
+
294
+
5
295
  ## v3.4.0 (2026-08-21)
6
296
 
297
+ ### Chore
298
+
299
+ * chore(release): 3.4.0 ([`b361799`](https://github.com/caylent-solutions/kanon/commit/b36179978257a41a2a633de80393ac6a33735dd2))
300
+
7
301
  ### Feature
8
302
 
9
303
  * feat: multi project installs, safer file delivery, and faster validation (#117)
@@ -1241,6 +1535,12 @@ asserting what its name says. It now sets `purge_all = False` explicitly.
1241
1535
 
1242
1536
  Co-authored-by: Ryan Gross <ryan.gross@caylent.com> ([`f22fe03`](https://github.com/caylent-solutions/kanon/commit/f22fe03f77e3cabfe10822242ed689a8f11e7b73))
1243
1537
 
1538
+ ### Unknown
1539
+
1540
+ * Merge pull request #119 from caylent-solutions/release-3.4.0
1541
+
1542
+ Release 3.4.0 ([`cc2e38d`](https://github.com/caylent-solutions/kanon/commit/cc2e38d528fd779ba770b451a8efc114c6c003ef))
1543
+
1244
1544
 
1245
1545
  ## v3.3.3 (2026-08-06)
1246
1546
 
@@ -209,6 +209,27 @@ make test-scenarios
209
209
 
210
210
  A coverage meta test (`tests/scenarios/test_scenario_coverage_meta.py`) fails CI if any in-scope scenario in `docs/integration-testing.md` lacks a matching pytest test. To add a new scenario: add the `### XX-NN: <title>` heading + bash block to `docs/integration-testing.md`, then add a `@pytest.mark.scenario` test under `tests/scenarios/test_<category>.py` that references the scenario ID in its function name or docstring.
211
211
 
212
+ ### Native Windows acceptance
213
+
214
+ Run `make test-windows` on native Windows with Git for Windows and symlink
215
+ privileges. The target uses the locked toolchain and executes the native
216
+ contracts plus portable lock/worker unit tests. The dedicated test root avoids
217
+ the existing POSIX process-group harness; it does not skip failing tests in
218
+ that harness or claim that the full suite runs on Windows. Native tests are
219
+ explicitly selected from `tests/native/windows_contracts.py`, so POSIX test
220
+ collection never substitutes mocks for native acceptance.
221
+
222
+ Worker contracts use a disposable interpreter with the trusted test callbacks
223
+ installed through its site configuration. Workers start in Python isolated
224
+ mode, so neither the current workspace nor `PYTHONPATH` supplies their imports.
225
+ Native regressions cover hostile workspace modules and two workers writing to
226
+ the same append-only log before either worker exits.
227
+
228
+ The lifecycle fixture enables Git long paths for its child processes and uses
229
+ local disposable repositories. Windows 11 validation and the `windows-latest`
230
+ CI job complement the existing Linux tiers and macOS checks. Authentication and
231
+ the complete vendored repo command surface require separate acceptance.
232
+
212
233
  ### Test Requirements
213
234
 
214
235
  - **Unit Tests**: Must maintain at least `COVERAGE_MIN` (default 93%) coverage
@@ -132,3 +132,7 @@ check-completion-snapshots: ## Verify the completion fixtures match generated ou
132
132
  exit 1; \
133
133
  fi; \
134
134
  echo "completion fixtures match generated output"
135
+
136
+ .PHONY: test-windows
137
+ test-windows: ## Run native Windows contracts and portable utility regressions
138
+ uv run --locked pytest --confcutdir=tests/native tests/native/windows_contracts.py tests/unit/test_concurrency.py tests/unit/test_spawn.py tests/unit/test_worker.py tests/unit/test_windows_lock_api.py -q
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: kanon-cli
3
- Version: 3.4.0
3
+ Version: 3.4.2
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
@@ -113,16 +113,29 @@ via declarative manifests.
113
113
 
114
114
  ## Platform support
115
115
 
116
- Kanon runs on macOS and Linux. **Windows is not currently supported
117
- (planned).** Native Windows support is on the roadmap but not yet
118
- available; in the meantime, run kanon under WSL2 (Windows Subsystem for
119
- Linux), where the Linux instructions throughout this documentation apply
120
- unchanged.
121
-
122
- The shell-completion docs describe a cross-platform PowerShell Core
123
- (`pwsh`) completer that also runs on macOS and Linux; see
124
- [docs/shell-completion.md](docs/shell-completion.md). PowerShell Core
125
- support is not a claim of native Windows support.
116
+ Kanon runs on macOS and Linux. Native Windows support is experimental.
117
+ The native Windows acceptance job exercises workspace exclusion and timeout,
118
+ detached workers, error logs, directory symlinks, configuration ACL checks, and
119
+ an isolated local-catalog CLI lifecycle. It does not certify the entire vendored
120
+ repo command surface, enterprise VDI policies, or Git OAuth authentication.
121
+ WSL2 remains the established Windows option for the Linux workflows.
122
+
123
+ Native Windows requires Git for Windows with `core.longpaths=true`, and either
124
+ Windows Developer Mode or the Create symbolic links privilege. Symlinks are
125
+ required; Kanon does not replace them with copies. The `.kanon` file must allow
126
+ writes only to its owner, SYSTEM, or Administrators; inherited grants to other
127
+ users must be removed in Windows Security settings. Unsupported ACL forms are
128
+ rejected rather than treated as secure.
129
+
130
+ See [Windows setup](docs/git-auth-setup.md#windows-experimental) and
131
+ [PowerShell completion](docs/shell-completion.md). Long paths should also be
132
+ enabled in Windows policy; keep `KANON_HOME` short (for example `C:\kanon`). Git for Windows can still
133
+ reject long `GIT_DIR` paths even with `core.longpaths=true`. The store and Kanon installation must be on the same drive: the vendored repo
134
+ engine creates relative links to its installed hooks and cannot calculate those
135
+ links across drive letters.
136
+
137
+ Network-share workspaces and
138
+ non-NTFS filesystems have not been validated.
126
139
 
127
140
  ---
128
141
 
@@ -1392,6 +1405,22 @@ permitted root: the consumer project root, the resolved
1392
1405
  [docs/security-model.md](docs/security-model.md) and
1393
1406
  [docs/configuration.md](docs/configuration.md#absolute-manifest-destinations).
1394
1407
 
1408
+ A `<linkfile>` delivering into the consuming project reaches the store through
1409
+ `<project-root>/.packages` -- a gitignored symlink `kanon install` maintains
1410
+ beside `.kanon` -- so the symlink it writes names a target relative to the
1411
+ project root:
1412
+
1413
+ ```text
1414
+ .claude/rules -> ../.packages/my-standards/rules
1415
+ ```
1416
+
1417
+ That target is a function of the manifest alone. It is byte-identical whether
1418
+ you install from a plain clone or from a git worktree nested inside one, and it
1419
+ stays valid when the checkout moves. Do not commit the `.packages` anchor
1420
+ itself: it points into your project's private directory in `KANON_HOME`, and
1421
+ every developer's `kanon install` creates their own. Installing or cleaning
1422
+ another project leaves this project's delivered content unchanged.
1423
+
1395
1424
  ---
1396
1425
 
1397
1426
  ## SSH Authentication Setup
@@ -1536,8 +1565,7 @@ version bumps.
1536
1565
  - [Integration Testing](docs/integration-testing.md) -- End-to-end CLI test
1537
1566
  plan
1538
1567
  - [kanon repo reference](docs/repo/README.md) -- Manifest format, `.repo/`
1539
- layout, hooks, smart sync, Python support (Windows is not currently
1540
- supported; see [Platform support](#platform-support) and use WSL2)
1568
+ layout, hooks, smart sync, Python support (native Windows is experimental; see [Platform support](#platform-support))
1541
1569
  - [Contributing](CONTRIBUTING.md) -- How to create and maintain Kanon
1542
1570
  packages and marketplaces
1543
1571
  - [Privacy & Telemetry](docs/privacy.md) -- What usage telemetry kanon
@@ -91,16 +91,29 @@ via declarative manifests.
91
91
 
92
92
  ## Platform support
93
93
 
94
- Kanon runs on macOS and Linux. **Windows is not currently supported
95
- (planned).** Native Windows support is on the roadmap but not yet
96
- available; in the meantime, run kanon under WSL2 (Windows Subsystem for
97
- Linux), where the Linux instructions throughout this documentation apply
98
- unchanged.
99
-
100
- The shell-completion docs describe a cross-platform PowerShell Core
101
- (`pwsh`) completer that also runs on macOS and Linux; see
102
- [docs/shell-completion.md](docs/shell-completion.md). PowerShell Core
103
- support is not a claim of native Windows support.
94
+ Kanon runs on macOS and Linux. Native Windows support is experimental.
95
+ The native Windows acceptance job exercises workspace exclusion and timeout,
96
+ detached workers, error logs, directory symlinks, configuration ACL checks, and
97
+ an isolated local-catalog CLI lifecycle. It does not certify the entire vendored
98
+ repo command surface, enterprise VDI policies, or Git OAuth authentication.
99
+ WSL2 remains the established Windows option for the Linux workflows.
100
+
101
+ Native Windows requires Git for Windows with `core.longpaths=true`, and either
102
+ Windows Developer Mode or the Create symbolic links privilege. Symlinks are
103
+ required; Kanon does not replace them with copies. The `.kanon` file must allow
104
+ writes only to its owner, SYSTEM, or Administrators; inherited grants to other
105
+ users must be removed in Windows Security settings. Unsupported ACL forms are
106
+ rejected rather than treated as secure.
107
+
108
+ See [Windows setup](docs/git-auth-setup.md#windows-experimental) and
109
+ [PowerShell completion](docs/shell-completion.md). Long paths should also be
110
+ enabled in Windows policy; keep `KANON_HOME` short (for example `C:\kanon`). Git for Windows can still
111
+ reject long `GIT_DIR` paths even with `core.longpaths=true`. The store and Kanon installation must be on the same drive: the vendored repo
112
+ engine creates relative links to its installed hooks and cannot calculate those
113
+ links across drive letters.
114
+
115
+ Network-share workspaces and
116
+ non-NTFS filesystems have not been validated.
104
117
 
105
118
  ---
106
119
 
@@ -1370,6 +1383,22 @@ permitted root: the consumer project root, the resolved
1370
1383
  [docs/security-model.md](docs/security-model.md) and
1371
1384
  [docs/configuration.md](docs/configuration.md#absolute-manifest-destinations).
1372
1385
 
1386
+ A `<linkfile>` delivering into the consuming project reaches the store through
1387
+ `<project-root>/.packages` -- a gitignored symlink `kanon install` maintains
1388
+ beside `.kanon` -- so the symlink it writes names a target relative to the
1389
+ project root:
1390
+
1391
+ ```text
1392
+ .claude/rules -> ../.packages/my-standards/rules
1393
+ ```
1394
+
1395
+ That target is a function of the manifest alone. It is byte-identical whether
1396
+ you install from a plain clone or from a git worktree nested inside one, and it
1397
+ stays valid when the checkout moves. Do not commit the `.packages` anchor
1398
+ itself: it points into your project's private directory in `KANON_HOME`, and
1399
+ every developer's `kanon install` creates their own. Installing or cleaning
1400
+ another project leaves this project's delivered content unchanged.
1401
+
1373
1402
  ---
1374
1403
 
1375
1404
  ## SSH Authentication Setup
@@ -1514,8 +1543,7 @@ version bumps.
1514
1543
  - [Integration Testing](docs/integration-testing.md) -- End-to-end CLI test
1515
1544
  plan
1516
1545
  - [kanon repo reference](docs/repo/README.md) -- Manifest format, `.repo/`
1517
- layout, hooks, smart sync, Python support (Windows is not currently
1518
- supported; see [Platform support](#platform-support) and use WSL2)
1546
+ layout, hooks, smart sync, Python support (native Windows is experimental; see [Platform support](#platform-support))
1519
1547
  - [Contributing](CONTRIBUTING.md) -- How to create and maintain Kanon
1520
1548
  packages and marketplaces
1521
1549
  - [Privacy & Telemetry](docs/privacy.md) -- What usage telemetry kanon
@@ -104,8 +104,21 @@ Key paths:
104
104
  mutation. A stale lock left by a killed process is harmless; the next
105
105
  invocation reopens and re-acquires it.
106
106
  - **`.packages/`** -- aggregated symlinks pointing into the per-source
107
- `.packages/*` entries. This is the only directory operators need to
108
- reference in downstream tooling.
107
+ `.packages/*` entries. This legacy index uses last-install-wins semantics
108
+ across projects; use the consumer anchor for project-specific content.
109
+ - **`<project-root>/.packages`** -- the anchor: a symlink beside `.kanon`
110
+ pointing at `.kanon-data/sources/<project_address>/.packages/` in the store.
111
+ It holds no content of its own. Each project has a private aggregation directory, so another project's
112
+ install or clean cannot repoint its delivered content. The legacy shared
113
+ `<store>/.packages/` index remains available to existing downstream tooling.
114
+ `kanon install` adds the anchor to the project's `.gitignore`. A
115
+ `<linkfile>` delivering into the consuming project names a target relative to
116
+ the project root and reaches the store through this anchor, so the target it
117
+ writes is identical whatever the checkout's depth on disk. Computed against
118
+ the store directly, the target would instead record that depth: an install run
119
+ inside a git worktree sits three directories deeper than the clone containing
120
+ it and would write a three-level-longer target -- correct there, dangling in
121
+ every ordinary clone. `kanon clean` removes the anchor it created.
109
122
  - **`<KANON_HOME>/store/.gitignore`** -- `kanon install` writes this
110
123
  safety net (containing `*`) ONLY when the shared `KANON_HOME` store sits
111
124
  inside a git working tree, so the fetched-artifact cache is never committed.
@@ -235,17 +235,33 @@ To clear a stale credential on Linux:
235
235
  git ls-remote https://git.example.com/<repo>.git
236
236
  ```
237
237
 
238
- ## Windows (not currently supported -- use WSL2)
239
-
240
- Windows is **not currently supported (planned)**: native Windows support is
241
- on the roadmap but not yet available. In the meantime, run kanon under WSL2
242
- (Windows Subsystem for Linux) and follow the [Linux](#linux) git-auth
243
- instructions above -- inside a WSL2 distribution, kanon and git behave
244
- exactly as they do on Linux, including credential helpers, `ssh-agent`, and
245
- `url.insteadOf` rewrites.
246
-
247
- See the README [Platform support](../README.md#platform-support) note for
248
- the project-wide statement of supported platforms.
238
+ ## Windows (experimental)
239
+
240
+ Native Windows requires Git for Windows on `PATH`, `core.longpaths=true`, and
241
+ Windows Developer Mode or the Create symbolic links privilege. Enable long
242
+ paths in Windows policy as well. Keep `KANON_HOME` short (for example
243
+ `C:\kanon`): Git for Windows still rejects some long `GIT_DIR` paths even
244
+ with `core.longpaths=true`. Kanon creates directory symlinks and
245
+ fails with an actionable error when Windows denies that privilege.
246
+
247
+ The store and Kanon installation must be on the same drive: the vendored repo
248
+ engine creates relative links to its installed hooks and cannot calculate those
249
+ links across drive letters.
250
+
251
+ Kanon checks the `.kanon` file's Windows DACL. Write grants must be limited to
252
+ the file owner, SYSTEM and Administrators (Owner Rights grants are also
253
+ accepted). An inherited write grant to Everyone or Users is rejected. Use the
254
+ file's Security settings to remove those grants; POSIX `chmod` does not secure
255
+ a Windows ACL. Unknown access-control entry types are rejected conservatively.
256
+
257
+ Git authentication remains Git's responsibility. Configure Git Credential
258
+ Manager for your host, then verify access with `git ls-remote` before running
259
+ Kanon. The native acceptance fixtures use local repositories; they do not
260
+ validate OAuth, corporate credential policies, SSH agents, network shares, or
261
+ the full vendored repo command surface.
262
+
263
+ WSL2 continues to use the [Linux](#linux) instructions. See
264
+ [Platform support](../README.md#platform-support) for the tested scope.
249
265
 
250
266
  ## Per-host configuration patterns
251
267