kanon-cli 2.1.0__tar.gz → 3.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1790) hide show
  1. kanon_cli-3.0.0/.devcontainer/.devcontainer.postcreate.sh +464 -0
  2. kanon_cli-3.0.0/.devcontainer/fix-line-endings.py +109 -0
  3. kanon_cli-3.0.0/.github/actions/setup-kanon/action.yml +161 -0
  4. kanon_cli-3.0.0/.github/workflows/main-validation.yml +430 -0
  5. kanon_cli-3.0.0/.github/workflows/pr-validation.yml +271 -0
  6. kanon_cli-3.0.0/.markdownlint.json +7 -0
  7. kanon_cli-3.0.0/.pre-commit-config.yaml +41 -0
  8. kanon_cli-3.0.0/CHANGELOG.md +4130 -0
  9. kanon_cli-3.0.0/CONTRIBUTING.md +271 -0
  10. kanon_cli-3.0.0/Makefile +95 -0
  11. kanon_cli-3.0.0/PKG-INFO +1480 -0
  12. kanon_cli-3.0.0/README.md +1458 -0
  13. kanon_cli-3.0.0/docs/architecture.md +255 -0
  14. kanon_cli-3.0.0/docs/catalog-author-guide.md +443 -0
  15. kanon_cli-3.0.0/docs/catalogs-explained.md +132 -0
  16. kanon_cli-3.0.0/docs/claude-marketplaces-guide.md +178 -0
  17. kanon_cli-3.0.0/docs/cli/catalog-audit.md +634 -0
  18. kanon_cli-3.0.0/docs/cli/doctor.md +524 -0
  19. kanon_cli-3.0.0/docs/cli/validate.md +288 -0
  20. kanon_cli-3.0.0/docs/cli-reference.md +499 -0
  21. kanon_cli-3.0.0/docs/cli.md +520 -0
  22. kanon_cli-3.0.0/docs/coming-from-pip-npm-cargo.md +103 -0
  23. kanon_cli-3.0.0/docs/configuration.md +747 -0
  24. kanon_cli-3.0.0/docs/contributing.md +112 -0
  25. kanon_cli-3.0.0/docs/creating-manifest-repos.md +281 -0
  26. kanon_cli-3.0.0/docs/creating-packages.md +72 -0
  27. kanon_cli-3.0.0/docs/doctor.md +855 -0
  28. kanon_cli-3.0.0/docs/exit-codes.md +185 -0
  29. kanon_cli-3.0.0/docs/git-auth-setup.md +328 -0
  30. kanon_cli-3.0.0/docs/how-it-works.md +104 -0
  31. kanon_cli-3.0.0/docs/installation.md +168 -0
  32. kanon_cli-3.0.0/docs/integration-testing.md +6549 -0
  33. kanon_cli-3.0.0/docs/lifecycle.md +93 -0
  34. kanon_cli-3.0.0/docs/list-and-add.md +842 -0
  35. kanon_cli-3.0.0/docs/lockfile.md +925 -0
  36. kanon_cli-3.0.0/docs/migrating-existing-kanon-files.md +313 -0
  37. kanon_cli-3.0.0/docs/migration-to-add.md +192 -0
  38. kanon_cli-3.0.0/docs/multi-source-guide.md +336 -0
  39. kanon_cli-3.0.0/docs/outdated-and-why.md +612 -0
  40. kanon_cli-3.0.0/docs/pipeline-integration.md +90 -0
  41. kanon_cli-3.0.0/docs/security-model.md +177 -0
  42. kanon_cli-3.0.0/docs/setup-guide.md +101 -0
  43. kanon_cli-3.0.0/docs/shell-completion.md +495 -0
  44. kanon_cli-3.0.0/docs/test-coverage.md +496 -0
  45. kanon_cli-3.0.0/docs/testing/matrix-traceability.md +191 -0
  46. kanon_cli-3.0.0/docs/troubleshooting.md +1017 -0
  47. kanon_cli-3.0.0/docs/url-canonicalization.md +98 -0
  48. kanon_cli-3.0.0/docs/version-resolution.md +474 -0
  49. kanon_cli-3.0.0/pyproject.toml +153 -0
  50. kanon_cli-3.0.0/requirements-dev.txt +11 -0
  51. kanon_cli-3.0.0/src/kanon_cli/__init__.py +3 -0
  52. kanon_cli-3.0.0/src/kanon_cli/cli.py +298 -0
  53. kanon_cli-3.0.0/src/kanon_cli/commands/add.py +1565 -0
  54. kanon_cli-3.0.0/src/kanon_cli/commands/catalog.py +1048 -0
  55. kanon_cli-3.0.0/src/kanon_cli/commands/clean.py +80 -0
  56. kanon_cli-3.0.0/src/kanon_cli/commands/completion.py +96 -0
  57. kanon_cli-3.0.0/src/kanon_cli/commands/doctor.py +1474 -0
  58. kanon_cli-3.0.0/src/kanon_cli/commands/install.py +229 -0
  59. kanon_cli-3.0.0/src/kanon_cli/commands/marketplace.py +661 -0
  60. kanon_cli-3.0.0/src/kanon_cli/commands/outdated.py +882 -0
  61. kanon_cli-3.0.0/src/kanon_cli/commands/remove.py +462 -0
  62. kanon_cli-3.0.0/src/kanon_cli/commands/search.py +2227 -0
  63. kanon_cli-3.0.0/src/kanon_cli/commands/validate.py +412 -0
  64. kanon_cli-3.0.0/src/kanon_cli/commands/why.py +1597 -0
  65. kanon_cli-3.0.0/src/kanon_cli/completions/cache.py +561 -0
  66. kanon_cli-3.0.0/src/kanon_cli/completions/cached_catalogs.py +177 -0
  67. kanon_cli-3.0.0/src/kanon_cli/completions/catalog_entries.py +369 -0
  68. kanon_cli-3.0.0/src/kanon_cli/completions/catalog_versions.py +390 -0
  69. kanon_cli-3.0.0/src/kanon_cli/completions/lockfile_names.py +189 -0
  70. kanon_cli-3.0.0/src/kanon_cli/completions/midtoken.py +215 -0
  71. kanon_cli-3.0.0/src/kanon_cli/completions/powershell.py +104 -0
  72. kanon_cli-3.0.0/src/kanon_cli/completions/preamble.py +221 -0
  73. kanon_cli-3.0.0/src/kanon_cli/completions/project_versions.py +355 -0
  74. kanon_cli-3.0.0/src/kanon_cli/completions/source_names.py +176 -0
  75. kanon_cli-3.0.0/src/kanon_cli/constants.py +584 -0
  76. kanon_cli-3.0.0/src/kanon_cli/core/catalog.py +534 -0
  77. kanon_cli-3.0.0/src/kanon_cli/core/clean.py +267 -0
  78. kanon_cli-3.0.0/src/kanon_cli/core/cli_args.py +251 -0
  79. kanon_cli-3.0.0/src/kanon_cli/core/git_runner.py +84 -0
  80. kanon_cli-3.0.0/src/kanon_cli/core/include_walker.py +223 -0
  81. kanon_cli-3.0.0/src/kanon_cli/core/install.py +2904 -0
  82. kanon_cli-3.0.0/src/kanon_cli/core/kanon_hash.py +130 -0
  83. kanon_cli-3.0.0/src/kanon_cli/core/kanonenv.py +601 -0
  84. kanon_cli-3.0.0/src/kanon_cli/core/kanonenv_writer.py +253 -0
  85. kanon_cli-3.0.0/src/kanon_cli/core/lockfile.py +1083 -0
  86. kanon_cli-3.0.0/src/kanon_cli/core/manifest.py +338 -0
  87. kanon_cli-3.0.0/src/kanon_cli/core/manifest_vars.py +169 -0
  88. kanon_cli-3.0.0/src/kanon_cli/core/marketplace.py +596 -0
  89. kanon_cli-3.0.0/src/kanon_cli/core/marketplace_validator.py +641 -0
  90. kanon_cli-3.0.0/src/kanon_cli/core/metadata.py +504 -0
  91. kanon_cli-3.0.0/src/kanon_cli/core/remote_url.py +158 -0
  92. kanon_cli-3.0.0/src/kanon_cli/core/update_check.py +431 -0
  93. kanon_cli-3.0.0/src/kanon_cli/core/url.py +149 -0
  94. kanon_cli-3.0.0/src/kanon_cli/repo/platform_utils.py +246 -0
  95. kanon_cli-3.0.0/src/kanon_cli/utils/concurrency.py +253 -0
  96. kanon_cli-3.0.0/src/kanon_cli/utils/levenshtein.py +68 -0
  97. kanon_cli-3.0.0/src/kanon_cli/utils/lock_file_path.py +59 -0
  98. kanon_cli-3.0.0/src/kanon_cli/utils/spawn.py +128 -0
  99. kanon_cli-3.0.0/src/kanon_cli/version.py +566 -0
  100. kanon_cli-3.0.0/tests/conftest.py +732 -0
  101. kanon_cli-3.0.0/tests/fixtures/completion/__init__.py +1 -0
  102. kanon_cli-3.0.0/tests/fixtures/completion/expected-bash.sh +375 -0
  103. kanon_cli-3.0.0/tests/fixtures/completion/expected-powershell.ps1 +17 -0
  104. kanon_cli-3.0.0/tests/fixtures/completion/expected-zsh.sh +597 -0
  105. kanon_cli-3.0.0/tests/fixtures/errors/README.md +51 -0
  106. kanon_cli-3.0.0/tests/fixtures/errors/entry-not-found.txt +2 -0
  107. kanon_cli-3.0.0/tests/fixtures/errors/missing-catalog-source.txt +10 -0
  108. kanon_cli-3.0.0/tests/fixtures/errors/source-collision.txt +8 -0
  109. kanon_cli-3.0.0/tests/fixtures/help/README.md +71 -0
  110. kanon_cli-3.0.0/tests/fixtures/help/kanon-add.txt +87 -0
  111. kanon_cli-3.0.0/tests/fixtures/help/kanon-catalog-audit.txt +34 -0
  112. kanon_cli-3.0.0/tests/fixtures/help/kanon-clean.txt +26 -0
  113. kanon_cli-3.0.0/tests/fixtures/help/kanon-completion.txt +22 -0
  114. kanon_cli-3.0.0/tests/fixtures/help/kanon-doctor.txt +52 -0
  115. kanon_cli-3.0.0/tests/fixtures/help/kanon-install.txt +62 -0
  116. kanon_cli-3.0.0/tests/fixtures/help/kanon-marketplace.txt +30 -0
  117. kanon_cli-3.0.0/tests/fixtures/help/kanon-outdated.txt +50 -0
  118. kanon_cli-3.0.0/tests/fixtures/help/kanon-remove.txt +49 -0
  119. kanon_cli-3.0.0/tests/fixtures/help/kanon-search.txt +167 -0
  120. kanon_cli-3.0.0/tests/fixtures/help/kanon-toplevel.txt +37 -0
  121. kanon_cli-3.0.0/tests/fixtures/help/kanon-why.txt +54 -0
  122. kanon_cli-3.0.0/tests/fixtures/repo/linter-test-bad.md +13 -0
  123. kanon_cli-3.0.0/tests/fixtures/repo/linter-test-bad.py +11 -0
  124. kanon_cli-3.0.0/tests/functional/conftest.py +921 -0
  125. kanon_cli-3.0.0/tests/functional/test_add_alias_journey.py +330 -0
  126. kanon_cli-3.0.0/tests/functional/test_alias_consumer_journey.py +289 -0
  127. kanon_cli-3.0.0/tests/functional/test_argparse_errors.py +583 -0
  128. kanon_cli-3.0.0/tests/functional/test_argparse_help.py +481 -0
  129. kanon_cli-3.0.0/tests/functional/test_ci_runs_operator_path_tests.py +254 -0
  130. kanon_cli-3.0.0/tests/functional/test_clean_lifecycle.py +122 -0
  131. kanon_cli-3.0.0/tests/functional/test_cli_entry_point.py +90 -0
  132. kanon_cli-3.0.0/tests/functional/test_completion_snapshots.py +143 -0
  133. kanon_cli-3.0.0/tests/functional/test_default_branch_journey.py +355 -0
  134. kanon_cli-3.0.0/tests/functional/test_env_int_guard_journey.py +110 -0
  135. kanon_cli-3.0.0/tests/functional/test_error_snapshots.py +725 -0
  136. kanon_cli-3.0.0/tests/functional/test_exit_code_matrix.py +990 -0
  137. kanon_cli-3.0.0/tests/functional/test_groups_filter.py +923 -0
  138. kanon_cli-3.0.0/tests/functional/test_help_snapshots.py +121 -0
  139. kanon_cli-3.0.0/tests/functional/test_help_text_contract.py +486 -0
  140. kanon_cli-3.0.0/tests/functional/test_home_flag_unwritable_journey.py +113 -0
  141. kanon_cli-3.0.0/tests/functional/test_init_default_branch_prerequisite_journey.py +218 -0
  142. kanon_cli-3.0.0/tests/functional/test_install_hermetic_journey.py +200 -0
  143. kanon_cli-3.0.0/tests/functional/test_install_lifecycle.py +174 -0
  144. kanon_cli-3.0.0/tests/functional/test_install_real_kanon.py +157 -0
  145. kanon_cli-3.0.0/tests/functional/test_install_v3_lock_fail_fast_journey.py +227 -0
  146. kanon_cli-3.0.0/tests/functional/test_kanon_home_store_journey.py +218 -0
  147. kanon_cli-3.0.0/tests/functional/test_kanon_repo_cli.py +562 -0
  148. kanon_cli-3.0.0/tests/functional/test_kanon_repo_e2e.py +465 -0
  149. kanon_cli-3.0.0/tests/functional/test_kanon_repo_lifecycle_journey.py +941 -0
  150. kanon_cli-3.0.0/tests/functional/test_lifecycle_journey.py +342 -0
  151. kanon_cli-3.0.0/tests/functional/test_make_operator_path_targets.py +233 -0
  152. kanon_cli-3.0.0/tests/functional/test_marketplace_journey.py +187 -0
  153. kanon_cli-3.0.0/tests/functional/test_matrix_traceability_complete.py +429 -0
  154. kanon_cli-3.0.0/tests/functional/test_provider_agnostic.py +465 -0
  155. kanon_cli-3.0.0/tests/functional/test_repo_abandon_errors.py +821 -0
  156. kanon_cli-3.0.0/tests/functional/test_repo_abandon_flags.py +920 -0
  157. kanon_cli-3.0.0/tests/functional/test_repo_abandon_happy.py +457 -0
  158. kanon_cli-3.0.0/tests/functional/test_repo_branches_errors.py +722 -0
  159. kanon_cli-3.0.0/tests/functional/test_repo_branches_flags.py +793 -0
  160. kanon_cli-3.0.0/tests/functional/test_repo_branches_happy.py +346 -0
  161. kanon_cli-3.0.0/tests/functional/test_repo_checkout_errors.py +642 -0
  162. kanon_cli-3.0.0/tests/functional/test_repo_checkout_flags.py +798 -0
  163. kanon_cli-3.0.0/tests/functional/test_repo_checkout_happy.py +383 -0
  164. kanon_cli-3.0.0/tests/functional/test_repo_cherry_pick_errors.py +676 -0
  165. kanon_cli-3.0.0/tests/functional/test_repo_cherry_pick_flags.py +580 -0
  166. kanon_cli-3.0.0/tests/functional/test_repo_cherry_pick_happy.py +406 -0
  167. kanon_cli-3.0.0/tests/functional/test_repo_diff_errors.py +692 -0
  168. kanon_cli-3.0.0/tests/functional/test_repo_diff_flags.py +615 -0
  169. kanon_cli-3.0.0/tests/functional/test_repo_diff_happy.py +419 -0
  170. kanon_cli-3.0.0/tests/functional/test_repo_diffmanifests_errors.py +659 -0
  171. kanon_cli-3.0.0/tests/functional/test_repo_diffmanifests_flags.py +768 -0
  172. kanon_cli-3.0.0/tests/functional/test_repo_diffmanifests_happy.py +498 -0
  173. kanon_cli-3.0.0/tests/functional/test_repo_dir_override.py +336 -0
  174. kanon_cli-3.0.0/tests/functional/test_repo_download_errors.py +657 -0
  175. kanon_cli-3.0.0/tests/functional/test_repo_download_flags.py +1036 -0
  176. kanon_cli-3.0.0/tests/functional/test_repo_download_happy.py +454 -0
  177. kanon_cli-3.0.0/tests/functional/test_repo_envsubst_errors.py +767 -0
  178. kanon_cli-3.0.0/tests/functional/test_repo_envsubst_flags.py +822 -0
  179. kanon_cli-3.0.0/tests/functional/test_repo_envsubst_happy.py +375 -0
  180. kanon_cli-3.0.0/tests/functional/test_repo_exit_codes.py +621 -0
  181. kanon_cli-3.0.0/tests/functional/test_repo_forall_errors.py +867 -0
  182. kanon_cli-3.0.0/tests/functional/test_repo_forall_flags.py +967 -0
  183. kanon_cli-3.0.0/tests/functional/test_repo_forall_happy.py +373 -0
  184. kanon_cli-3.0.0/tests/functional/test_repo_gc_errors.py +812 -0
  185. kanon_cli-3.0.0/tests/functional/test_repo_gc_flags.py +657 -0
  186. kanon_cli-3.0.0/tests/functional/test_repo_gc_happy.py +411 -0
  187. kanon_cli-3.0.0/tests/functional/test_repo_grep_errors.py +786 -0
  188. kanon_cli-3.0.0/tests/functional/test_repo_grep_flags.py +1043 -0
  189. kanon_cli-3.0.0/tests/functional/test_repo_grep_happy.py +455 -0
  190. kanon_cli-3.0.0/tests/functional/test_repo_help_errors.py +553 -0
  191. kanon_cli-3.0.0/tests/functional/test_repo_help_flags.py +468 -0
  192. kanon_cli-3.0.0/tests/functional/test_repo_help_happy.py +229 -0
  193. kanon_cli-3.0.0/tests/functional/test_repo_info_errors.py +811 -0
  194. kanon_cli-3.0.0/tests/functional/test_repo_info_flags.py +875 -0
  195. kanon_cli-3.0.0/tests/functional/test_repo_info_happy.py +371 -0
  196. kanon_cli-3.0.0/tests/functional/test_repo_init_errors.py +825 -0
  197. kanon_cli-3.0.0/tests/functional/test_repo_init_flags.py +1199 -0
  198. kanon_cli-3.0.0/tests/functional/test_repo_init_happy.py +414 -0
  199. kanon_cli-3.0.0/tests/functional/test_repo_init_mirror.py +212 -0
  200. kanon_cli-3.0.0/tests/functional/test_repo_list_errors.py +819 -0
  201. kanon_cli-3.0.0/tests/functional/test_repo_list_flags.py +1048 -0
  202. kanon_cli-3.0.0/tests/functional/test_repo_list_happy.py +429 -0
  203. kanon_cli-3.0.0/tests/functional/test_repo_manifest_errors.py +825 -0
  204. kanon_cli-3.0.0/tests/functional/test_repo_manifest_flags.py +985 -0
  205. kanon_cli-3.0.0/tests/functional/test_repo_manifest_happy.py +433 -0
  206. kanon_cli-3.0.0/tests/functional/test_repo_manifest_revision_as_tag.py +266 -0
  207. kanon_cli-3.0.0/tests/functional/test_repo_overview_errors.py +812 -0
  208. kanon_cli-3.0.0/tests/functional/test_repo_overview_flags.py +726 -0
  209. kanon_cli-3.0.0/tests/functional/test_repo_overview_happy.py +433 -0
  210. kanon_cli-3.0.0/tests/functional/test_repo_passthrough.py +664 -0
  211. kanon_cli-3.0.0/tests/functional/test_repo_prune_errors.py +508 -0
  212. kanon_cli-3.0.0/tests/functional/test_repo_prune_flags.py +594 -0
  213. kanon_cli-3.0.0/tests/functional/test_repo_prune_happy.py +398 -0
  214. kanon_cli-3.0.0/tests/functional/test_repo_rebase_errors.py +596 -0
  215. kanon_cli-3.0.0/tests/functional/test_repo_rebase_flags.py +1033 -0
  216. kanon_cli-3.0.0/tests/functional/test_repo_rebase_happy.py +299 -0
  217. kanon_cli-3.0.0/tests/functional/test_repo_selfupdate_disabled.py +142 -0
  218. kanon_cli-3.0.0/tests/functional/test_repo_selfupdate_errors.py +709 -0
  219. kanon_cli-3.0.0/tests/functional/test_repo_selfupdate_flags.py +488 -0
  220. kanon_cli-3.0.0/tests/functional/test_repo_selfupdate_happy.py +244 -0
  221. kanon_cli-3.0.0/tests/functional/test_repo_smartsync_errors.py +714 -0
  222. kanon_cli-3.0.0/tests/functional/test_repo_smartsync_flags.py +959 -0
  223. kanon_cli-3.0.0/tests/functional/test_repo_smartsync_happy.py +388 -0
  224. kanon_cli-3.0.0/tests/functional/test_repo_stage_errors.py +855 -0
  225. kanon_cli-3.0.0/tests/functional/test_repo_stage_flags.py +625 -0
  226. kanon_cli-3.0.0/tests/functional/test_repo_stage_happy.py +343 -0
  227. kanon_cli-3.0.0/tests/functional/test_repo_start_errors.py +605 -0
  228. kanon_cli-3.0.0/tests/functional/test_repo_start_flags.py +995 -0
  229. kanon_cli-3.0.0/tests/functional/test_repo_start_happy.py +436 -0
  230. kanon_cli-3.0.0/tests/functional/test_repo_status_errors.py +693 -0
  231. kanon_cli-3.0.0/tests/functional/test_repo_status_flags.py +645 -0
  232. kanon_cli-3.0.0/tests/functional/test_repo_status_happy.py +372 -0
  233. kanon_cli-3.0.0/tests/functional/test_repo_sync_errors.py +874 -0
  234. kanon_cli-3.0.0/tests/functional/test_repo_sync_flags.py +990 -0
  235. kanon_cli-3.0.0/tests/functional/test_repo_sync_happy.py +350 -0
  236. kanon_cli-3.0.0/tests/functional/test_repo_upload_errors.py +869 -0
  237. kanon_cli-3.0.0/tests/functional/test_repo_upload_flags.py +755 -0
  238. kanon_cli-3.0.0/tests/functional/test_repo_upload_happy.py +395 -0
  239. kanon_cli-3.0.0/tests/functional/test_singular_catalog_source_inert.py +105 -0
  240. kanon_cli-3.0.0/tests/functional/test_stdout_stderr_discipline.py +553 -0
  241. kanon_cli-3.0.0/tests/functional/test_update_alert_journey.py +256 -0
  242. kanon_cli-3.0.0/tests/functional/test_validate_journey.py +284 -0
  243. kanon_cli-3.0.0/tests/functional/test_validate_lifecycle.py +198 -0
  244. kanon_cli-3.0.0/tests/functional/test_validate_lockfile.py +177 -0
  245. kanon_cli-3.0.0/tests/functional/test_validate_marketplace.py +597 -0
  246. kanon_cli-3.0.0/tests/functional/test_validate_xml_errors.py +228 -0
  247. kanon_cli-3.0.0/tests/functional/test_validate_xml_repo_root.py +164 -0
  248. kanon_cli-3.0.0/tests/functional/test_zero_source_clean_error.py +112 -0
  249. kanon_cli-3.0.0/tests/integration/conftest.py +99 -0
  250. kanon_cli-3.0.0/tests/integration/fixtures/synthetic/test_synthetic_pytest_fixtures.py +195 -0
  251. kanon_cli-3.0.0/tests/integration/fixtures/synthetic/upgrade_versioned.py +123 -0
  252. kanon_cli-3.0.0/tests/integration/repo/conftest.py +11 -0
  253. kanon_cli-3.0.0/tests/integration/repo/test_bug_fixes.py +1017 -0
  254. kanon_cli-3.0.0/tests/integration/repo/test_consolidated_constraints_e2e.py +283 -0
  255. kanon_cli-3.0.0/tests/integration/repo/test_envsubst_integration.py +765 -0
  256. kanon_cli-3.0.0/tests/integration/repo/test_import_functional.py +98 -0
  257. kanon_cli-3.0.0/tests/integration/repo/test_linkfile_copyfile.py +457 -0
  258. kanon_cli-3.0.0/tests/integration/repo/test_linkfile_exclude_journey.py +663 -0
  259. kanon_cli-3.0.0/tests/integration/repo/test_manifest_parsing.py +521 -0
  260. kanon_cli-3.0.0/tests/integration/repo/test_process_isolation.py +588 -0
  261. kanon_cli-3.0.0/tests/integration/repo/test_repo_module_smoke.py +91 -0
  262. kanon_cli-3.0.0/tests/integration/repo/test_repo_pipeline.py +606 -0
  263. kanon_cli-3.0.0/tests/integration/repo/test_repo_run_lifecycle.py +155 -0
  264. kanon_cli-3.0.0/tests/integration/repo/test_repo_sync_lifecycle.py +312 -0
  265. kanon_cli-3.0.0/tests/integration/repo/test_version_constraints_integration.py +513 -0
  266. kanon_cli-3.0.0/tests/integration/repo/test_xml_annotation_roundtrip.py +438 -0
  267. kanon_cli-3.0.0/tests/integration/repo/test_xml_contactinfo_roundtrip.py +328 -0
  268. kanon_cli-3.0.0/tests/integration/repo/test_xml_copyfile_roundtrip.py +390 -0
  269. kanon_cli-3.0.0/tests/integration/repo/test_xml_default_roundtrip.py +465 -0
  270. kanon_cli-3.0.0/tests/integration/repo/test_xml_extend_project_roundtrip.py +344 -0
  271. kanon_cli-3.0.0/tests/integration/repo/test_xml_include_roundtrip.py +367 -0
  272. kanon_cli-3.0.0/tests/integration/repo/test_xml_linkfile_roundtrip.py +477 -0
  273. kanon_cli-3.0.0/tests/integration/repo/test_xml_manifest_roundtrip.py +392 -0
  274. kanon_cli-3.0.0/tests/integration/repo/test_xml_manifest_server_roundtrip.py +327 -0
  275. kanon_cli-3.0.0/tests/integration/repo/test_xml_notice_roundtrip.py +331 -0
  276. kanon_cli-3.0.0/tests/integration/repo/test_xml_project_roundtrip.py +410 -0
  277. kanon_cli-3.0.0/tests/integration/repo/test_xml_remote_roundtrip.py +442 -0
  278. kanon_cli-3.0.0/tests/integration/repo/test_xml_remove_project_roundtrip.py +345 -0
  279. kanon_cli-3.0.0/tests/integration/repo/test_xml_repo_hooks_roundtrip.py +361 -0
  280. kanon_cli-3.0.0/tests/integration/repo/test_xml_submanifest_roundtrip.py +385 -0
  281. kanon_cli-3.0.0/tests/integration/repo/test_xml_superproject_roundtrip.py +359 -0
  282. kanon_cli-3.0.0/tests/integration/test_add_core.py +1003 -0
  283. kanon_cli-3.0.0/tests/integration/test_add_dry_run.py +837 -0
  284. kanon_cli-3.0.0/tests/integration/test_add_env_var_detection.py +236 -0
  285. kanon_cli-3.0.0/tests/integration/test_add_zero_tags.py +296 -0
  286. kanon_cli-3.0.0/tests/integration/test_auto_discovery.py +110 -0
  287. kanon_cli-3.0.0/tests/integration/test_background_refresh.py +175 -0
  288. kanon_cli-3.0.0/tests/integration/test_cache_clock_skew.py +117 -0
  289. kanon_cli-3.0.0/tests/integration/test_cache_layout.py +135 -0
  290. kanon_cli-3.0.0/tests/integration/test_catalog_audit_entry_uniqueness.py +147 -0
  291. kanon_cli-3.0.0/tests/integration/test_catalog_audit_legacy_dir.py +255 -0
  292. kanon_cli-3.0.0/tests/integration/test_catalog_audit_metadata.py +165 -0
  293. kanon_cli-3.0.0/tests/integration/test_catalog_audit_remote_url.py +217 -0
  294. kanon_cli-3.0.0/tests/integration/test_catalog_audit_source_name.py +150 -0
  295. kanon_cli-3.0.0/tests/integration/test_catalog_audit_strict.py +148 -0
  296. kanon_cli-3.0.0/tests/integration/test_catalog_audit_tag_format.py +452 -0
  297. kanon_cli-3.0.0/tests/integration/test_catalog_constraints.py +117 -0
  298. kanon_cli-3.0.0/tests/integration/test_clean_env_override_cleanup.py +275 -0
  299. kanon_cli-3.0.0/tests/integration/test_clean_lifecycle.py +511 -0
  300. kanon_cli-3.0.0/tests/integration/test_cli_entry_points.py +154 -0
  301. kanon_cli-3.0.0/tests/integration/test_complete_cached_catalogs.py +194 -0
  302. kanon_cli-3.0.0/tests/integration/test_complete_catalog_entries.py +211 -0
  303. kanon_cli-3.0.0/tests/integration/test_complete_catalog_versions.py +229 -0
  304. kanon_cli-3.0.0/tests/integration/test_complete_lockfile_names.py +266 -0
  305. kanon_cli-3.0.0/tests/integration/test_complete_project_versions.py +284 -0
  306. kanon_cli-3.0.0/tests/integration/test_complete_source_names.py +152 -0
  307. kanon_cli-3.0.0/tests/integration/test_completion_bash.py +1029 -0
  308. kanon_cli-3.0.0/tests/integration/test_completion_powershell_subcommand.py +162 -0
  309. kanon_cli-3.0.0/tests/integration/test_completion_zsh.py +1192 -0
  310. kanon_cli-3.0.0/tests/integration/test_concurrency.py +926 -0
  311. kanon_cli-3.0.0/tests/integration/test_concurrency_serialization.py +704 -0
  312. kanon_cli-3.0.0/tests/integration/test_copyfile_fs_effects.py +491 -0
  313. kanon_cli-3.0.0/tests/integration/test_cross_platform_contract.py +377 -0
  314. kanon_cli-3.0.0/tests/integration/test_doc_validation.py +259 -0
  315. kanon_cli-3.0.0/tests/integration/test_doctor_cache_flags.py +292 -0
  316. kanon_cli-3.0.0/tests/integration/test_doctor_cache_flags_workspace_independent.py +227 -0
  317. kanon_cli-3.0.0/tests/integration/test_doctor_consistency.py +691 -0
  318. kanon_cli-3.0.0/tests/integration/test_doctor_default_subcheck_output.py +123 -0
  319. kanon_cli-3.0.0/tests/integration/test_doctor_effective_source.py +269 -0
  320. kanon_cli-3.0.0/tests/integration/test_doctor_prune_cache.py +266 -0
  321. kanon_cli-3.0.0/tests/integration/test_doctor_remote_check.py +397 -0
  322. kanon_cli-3.0.0/tests/integration/test_envsubst_command.py +206 -0
  323. kanon_cli-3.0.0/tests/integration/test_fs_fault_extended.py +614 -0
  324. kanon_cli-3.0.0/tests/integration/test_fs_fault_injection.py +488 -0
  325. kanon_cli-3.0.0/tests/integration/test_full_lifecycle_synthetic.py +391 -0
  326. kanon_cli-3.0.0/tests/integration/test_full_user_journey.py +1043 -0
  327. kanon_cli-3.0.0/tests/integration/test_git_fault_injection.py +400 -0
  328. kanon_cli-3.0.0/tests/integration/test_git_retry_env.py +534 -0
  329. kanon_cli-3.0.0/tests/integration/test_gitignore_idempotency.py +147 -0
  330. kanon_cli-3.0.0/tests/integration/test_home_flag_store_relocation.py +132 -0
  331. kanon_cli-3.0.0/tests/integration/test_install_after_add.py +285 -0
  332. kanon_cli-3.0.0/tests/integration/test_install_command.py +179 -0
  333. kanon_cli-3.0.0/tests/integration/test_install_conflict_url_normalization.py +426 -0
  334. kanon_cli-3.0.0/tests/integration/test_install_env_var_resolution.py +269 -0
  335. kanon_cli-3.0.0/tests/integration/test_install_errors.py +560 -0
  336. kanon_cli-3.0.0/tests/integration/test_install_include_cycle.py +192 -0
  337. kanon_cli-3.0.0/tests/integration/test_install_include_diamond.py +220 -0
  338. kanon_cli-3.0.0/tests/integration/test_install_lifecycle.py +919 -0
  339. kanon_cli-3.0.0/tests/integration/test_install_lock_file_derivation.py +224 -0
  340. kanon_cli-3.0.0/tests/integration/test_install_lockfile_replay.py +391 -0
  341. kanon_cli-3.0.0/tests/integration/test_install_marketplace_registration.py +488 -0
  342. kanon_cli-3.0.0/tests/integration/test_install_optional_vars.py +570 -0
  343. kanon_cli-3.0.0/tests/integration/test_install_per_alias_gitbase.py +220 -0
  344. kanon_cli-3.0.0/tests/integration/test_install_reconcile.py +462 -0
  345. kanon_cli-3.0.0/tests/integration/test_install_refresh_lock.py +339 -0
  346. kanon_cli-3.0.0/tests/integration/test_install_refresh_lock_source.py +707 -0
  347. kanon_cli-3.0.0/tests/integration/test_install_remote_url_policy.py +578 -0
  348. kanon_cli-3.0.0/tests/integration/test_install_required_vars.py +142 -0
  349. kanon_cli-3.0.0/tests/integration/test_install_strict.py +1135 -0
  350. kanon_cli-3.0.0/tests/integration/test_json_output_stream_discipline.py +243 -0
  351. kanon_cli-3.0.0/tests/integration/test_kanon_add_placeholder_handling.py +197 -0
  352. kanon_cli-3.0.0/tests/integration/test_kanon_clean_embedded.py +236 -0
  353. kanon_cli-3.0.0/tests/integration/test_kanon_full_lifecycle.py +451 -0
  354. kanon_cli-3.0.0/tests/integration/test_kanon_install_embedded.py +374 -0
  355. kanon_cli-3.0.0/tests/integration/test_kanonenv_parsing.py +276 -0
  356. kanon_cli-3.0.0/tests/integration/test_lifecycle_recovery.py +371 -0
  357. kanon_cli-3.0.0/tests/integration/test_linkfile_fs_effects.py +565 -0
  358. kanon_cli-3.0.0/tests/integration/test_list_all_versions.py +509 -0
  359. kanon_cli-3.0.0/tests/integration/test_list_all_versions_canonical.py +514 -0
  360. kanon_cli-3.0.0/tests/integration/test_list_all_versions_malformed_revision_resilience.py +486 -0
  361. kanon_cli-3.0.0/tests/integration/test_list_default.py +414 -0
  362. kanon_cli-3.0.0/tests/integration/test_list_detail.py +491 -0
  363. kanon_cli-3.0.0/tests/integration/test_list_filter.py +391 -0
  364. kanon_cli-3.0.0/tests/integration/test_list_format_json.py +545 -0
  365. kanon_cli-3.0.0/tests/integration/test_list_synthetic_catalog_variants.py +392 -0
  366. kanon_cli-3.0.0/tests/integration/test_list_tree.py +356 -0
  367. kanon_cli-3.0.0/tests/integration/test_lockfile_roundtrip.py +237 -0
  368. kanon_cli-3.0.0/tests/integration/test_marketplace_install.py +425 -0
  369. kanon_cli-3.0.0/tests/integration/test_marketplace_lifecycle.py +305 -0
  370. kanon_cli-3.0.0/tests/integration/test_marketplace_orphan_prune.py +380 -0
  371. kanon_cli-3.0.0/tests/integration/test_midtoken_bash.py +353 -0
  372. kanon_cli-3.0.0/tests/integration/test_midtoken_zsh.py +396 -0
  373. kanon_cli-3.0.0/tests/integration/test_misc_features.py +265 -0
  374. kanon_cli-3.0.0/tests/integration/test_multi_source_aggregation.py +385 -0
  375. kanon_cli-3.0.0/tests/integration/test_no_bundled_catalog.py +217 -0
  376. kanon_cli-3.0.0/tests/integration/test_no_default_catalog.py +160 -0
  377. kanon_cli-3.0.0/tests/integration/test_no_hardcoded_org_values.py +139 -0
  378. kanon_cli-3.0.0/tests/integration/test_observability.py +473 -0
  379. kanon_cli-3.0.0/tests/integration/test_outdated.py +436 -0
  380. kanon_cli-3.0.0/tests/integration/test_outdated_branch_drift.py +443 -0
  381. kanon_cli-3.0.0/tests/integration/test_outdated_fail_on_upgrade.py +745 -0
  382. kanon_cli-3.0.0/tests/integration/test_outdated_format_json.py +599 -0
  383. kanon_cli-3.0.0/tests/integration/test_outdated_refs_tags_revision_parsing.py +170 -0
  384. kanon_cli-3.0.0/tests/integration/test_platform_parity.py +744 -0
  385. kanon_cli-3.0.0/tests/integration/test_preamble_bash.py +178 -0
  386. kanon_cli-3.0.0/tests/integration/test_preamble_zsh.py +207 -0
  387. kanon_cli-3.0.0/tests/integration/test_remove_core.py +386 -0
  388. kanon_cli-3.0.0/tests/integration/test_remove_dry_run.py +307 -0
  389. kanon_cli-3.0.0/tests/integration/test_remove_force_integration.py +111 -0
  390. kanon_cli-3.0.0/tests/integration/test_signal_handling.py +438 -0
  391. kanon_cli-3.0.0/tests/integration/test_synthetic_drift_fixture.py +108 -0
  392. kanon_cli-3.0.0/tests/integration/test_synthetic_upgrade_versioned_fixture.py +149 -0
  393. kanon_cli-3.0.0/tests/integration/test_unicode_encoding.py +534 -0
  394. kanon_cli-3.0.0/tests/integration/test_validate_marketplace.py +266 -0
  395. kanon_cli-3.0.0/tests/integration/test_validate_marketplace_revision_existence.py +243 -0
  396. kanon_cli-3.0.0/tests/integration/test_validate_metadata.py +308 -0
  397. kanon_cli-3.0.0/tests/integration/test_validate_xml.py +151 -0
  398. kanon_cli-3.0.0/tests/integration/test_version_resolution.py +211 -0
  399. kanon_cli-3.0.0/tests/integration/test_version_widened_bare_pep440.py +156 -0
  400. kanon_cli-3.0.0/tests/integration/test_wheel_e2e.py +453 -0
  401. kanon_cli-3.0.0/tests/integration/test_why_ambiguous.py +445 -0
  402. kanon_cli-3.0.0/tests/integration/test_why_chain_walker.py +309 -0
  403. kanon_cli-3.0.0/tests/integration/test_why_format_json.py +516 -0
  404. kanon_cli-3.0.0/tests/integration/test_why_live_resolve.py +1435 -0
  405. kanon_cli-3.0.0/tests/integration/test_why_not_found_suggestion.py +230 -0
  406. kanon_cli-3.0.0/tests/integration/test_workspace_dir_env.py +306 -0
  407. kanon_cli-3.0.0/tests/regression/test_e0_f1_s2_t5_regression.py +554 -0
  408. kanon_cli-3.0.0/tests/regression/test_e0_f5_s2_t7_regression.py +438 -0
  409. kanon_cli-3.0.0/tests/regression/test_e0_f6_s1_t1_regression.py +205 -0
  410. kanon_cli-3.0.0/tests/regression/test_e0_f6_s1_t2_regression.py +403 -0
  411. kanon_cli-3.0.0/tests/regression/test_e0_f6_s1_t3_regression.py +445 -0
  412. kanon_cli-3.0.0/tests/regression/test_e0_f6_s1_t4_regression.py +457 -0
  413. kanon_cli-3.0.0/tests/regression/test_e0_f6_s2_t1_regression.py +253 -0
  414. kanon_cli-3.0.0/tests/regression/test_e0_f6_s2_t2_regression.py +423 -0
  415. kanon_cli-3.0.0/tests/regression/test_e0_f6_s2_t3_regression.py +399 -0
  416. kanon_cli-3.0.0/tests/regression/test_e0_f6_s2_t4_regression.py +415 -0
  417. kanon_cli-3.0.0/tests/regression/test_e0_f6_s2_t5_regression.py +418 -0
  418. kanon_cli-3.0.0/tests/regression/test_e0_f6_s2_t6_regression.py +315 -0
  419. kanon_cli-3.0.0/tests/regression/test_e0_f6_s3_t1_regression.py +586 -0
  420. kanon_cli-3.0.0/tests/regression/test_e0_f6_s3_t2_regression.py +480 -0
  421. kanon_cli-3.0.0/tests/regression/test_e0_install_relative_regression.py +473 -0
  422. kanon_cli-3.0.0/tests/scenarios/conftest.py +416 -0
  423. kanon_cli-3.0.0/tests/scenarios/test_ad.py +306 -0
  424. kanon_cli-3.0.0/tests/scenarios/test_bs.py +87 -0
  425. kanon_cli-3.0.0/tests/scenarios/test_cd.py +179 -0
  426. kanon_cli-3.0.0/tests/scenarios/test_content_pins.py +211 -0
  427. kanon_cli-3.0.0/tests/scenarios/test_cs.py +217 -0
  428. kanon_cli-3.0.0/tests/scenarios/test_doctor_cache.py +137 -0
  429. kanon_cli-3.0.0/tests/scenarios/test_doctor_journey.py +368 -0
  430. kanon_cli-3.0.0/tests/scenarios/test_ec.py +124 -0
  431. kanon_cli-3.0.0/tests/scenarios/test_ep.py +40 -0
  432. kanon_cli-3.0.0/tests/scenarios/test_ev.py +213 -0
  433. kanon_cli-3.0.0/tests/scenarios/test_hv.py +78 -0
  434. kanon_cli-3.0.0/tests/scenarios/test_ic.py +278 -0
  435. kanon_cli-3.0.0/tests/scenarios/test_id.py +184 -0
  436. kanon_cli-3.0.0/tests/scenarios/test_ks.py +443 -0
  437. kanon_cli-3.0.0/tests/scenarios/test_lf.py +132 -0
  438. kanon_cli-3.0.0/tests/scenarios/test_lockfile_lifecycle.py +738 -0
  439. kanon_cli-3.0.0/tests/scenarios/test_marketplace_direct_checkout.py +412 -0
  440. kanon_cli-3.0.0/tests/scenarios/test_mk.py +888 -0
  441. kanon_cli-3.0.0/tests/scenarios/test_ms.py +139 -0
  442. kanon_cli-3.0.0/tests/scenarios/test_ns_marketplace_and_global_flags.py +372 -0
  443. kanon_cli-3.0.0/tests/scenarios/test_outdated_two_source.py +408 -0
  444. kanon_cli-3.0.0/tests/scenarios/test_pk.py +614 -0
  445. kanon_cli-3.0.0/tests/scenarios/test_rc.py +203 -0
  446. kanon_cli-3.0.0/tests/scenarios/test_refresh_lock_existing_checkout.py +383 -0
  447. kanon_cli-3.0.0/tests/scenarios/test_rls_exact_vs_range.py +461 -0
  448. kanon_cli-3.0.0/tests/scenarios/test_rp_branches.py +109 -0
  449. kanon_cli-3.0.0/tests/scenarios/test_rp_cherry_pick.py +104 -0
  450. kanon_cli-3.0.0/tests/scenarios/test_rp_diff.py +102 -0
  451. kanon_cli-3.0.0/tests/scenarios/test_rp_diffmanifests.py +151 -0
  452. kanon_cli-3.0.0/tests/scenarios/test_rp_forall.py +137 -0
  453. kanon_cli-3.0.0/tests/scenarios/test_rp_info.py +135 -0
  454. kanon_cli-3.0.0/tests/scenarios/test_rp_init.py +419 -0
  455. kanon_cli-3.0.0/tests/scenarios/test_rp_list.py +163 -0
  456. kanon_cli-3.0.0/tests/scenarios/test_rp_manifest.py +205 -0
  457. kanon_cli-3.0.0/tests/scenarios/test_rp_overview.py +96 -0
  458. kanon_cli-3.0.0/tests/scenarios/test_rp_rebase.py +155 -0
  459. kanon_cli-3.0.0/tests/scenarios/test_rp_status.py +124 -0
  460. kanon_cli-3.0.0/tests/scenarios/test_rp_sync.py +387 -0
  461. kanon_cli-3.0.0/tests/scenarios/test_rx.py +254 -0
  462. kanon_cli-3.0.0/tests/scenarios/test_scenario_coverage_meta.py +89 -0
  463. kanon_cli-3.0.0/tests/scenarios/test_search_multi_source.py +340 -0
  464. kanon_cli-3.0.0/tests/scenarios/test_tc_bootstrap.py +103 -0
  465. kanon_cli-3.0.0/tests/scenarios/test_tc_clean.py +328 -0
  466. kanon_cli-3.0.0/tests/scenarios/test_tc_install.py +222 -0
  467. kanon_cli-3.0.0/tests/scenarios/test_tc_validate.py +148 -0
  468. kanon_cli-3.0.0/tests/scenarios/test_uj.py +703 -0
  469. kanon_cli-3.0.0/tests/scenarios/test_va.py +157 -0
  470. kanon_cli-3.0.0/tests/scenarios/test_va_validate_lockfile.py +156 -0
  471. kanon_cli-3.0.0/tests/scenarios/test_why_surface_query.py +380 -0
  472. kanon_cli-3.0.0/tests/scenarios/test_why_url_path.py +279 -0
  473. kanon_cli-3.0.0/tests/scenarios/test_why_url_path_placeholder.py +446 -0
  474. kanon_cli-3.0.0/tests/security/test_security_hardening.py +284 -0
  475. kanon_cli-3.0.0/tests/test_wheel_layout.py +210 -0
  476. kanon_cli-3.0.0/tests/unit/conftest.py +72 -0
  477. kanon_cli-3.0.0/tests/unit/repo/conftest.py +229 -0
  478. kanon_cli-3.0.0/tests/unit/repo/functional/test_features.py +248 -0
  479. kanon_cli-3.0.0/tests/unit/repo/subcmds/test_init_mirror.py +174 -0
  480. kanon_cli-3.0.0/tests/unit/repo/subcmds/test_manifest_revision_as_tag.py +270 -0
  481. kanon_cli-3.0.0/tests/unit/repo/subcmds/test_manifest_revision_as_tag_pep440.py +151 -0
  482. kanon_cli-3.0.0/tests/unit/repo/subcmds/test_selfupdate_stub.py +211 -0
  483. kanon_cli-3.0.0/tests/unit/repo/test_abandon_massive.py +335 -0
  484. kanon_cli-3.0.0/tests/unit/repo/test_branches_coverage.py +390 -0
  485. kanon_cli-3.0.0/tests/unit/repo/test_bug10_selfupdate_incompatible.py +249 -0
  486. kanon_cli-3.0.0/tests/unit/repo/test_bug11_race_condition.py +147 -0
  487. kanon_cli-3.0.0/tests/unit/repo/test_bug12_backup_preserved.py +67 -0
  488. kanon_cli-3.0.0/tests/unit/repo/test_bug13_init_reinit_warning.py +169 -0
  489. kanon_cli-3.0.0/tests/unit/repo/test_bug14_non_tty_log.py +145 -0
  490. kanon_cli-3.0.0/tests/unit/repo/test_bug15_prerelease_docs.py +65 -0
  491. kanon_cli-3.0.0/tests/unit/repo/test_bug16_nested_var_warning.py +173 -0
  492. kanon_cli-3.0.0/tests/unit/repo/test_bug18_envsubst_double_parse.py +123 -0
  493. kanon_cli-3.0.0/tests/unit/repo/test_bug19_glob_src_error.py +98 -0
  494. kanon_cli-3.0.0/tests/unit/repo/test_bug1_envsubst_malformed_xml.py +167 -0
  495. kanon_cli-3.0.0/tests/unit/repo/test_bug20_glob_dest_file.py +141 -0
  496. kanon_cli-3.0.0/tests/unit/repo/test_bug2_linkfile_errors.py +208 -0
  497. kanon_cli-3.0.0/tests/unit/repo/test_bug3_execv_replaces_process.py +312 -0
  498. kanon_cli-3.0.0/tests/unit/repo/test_bug4_symlink_overwrite.py +250 -0
  499. kanon_cli-3.0.0/tests/unit/repo/test_bug5_empty_envsubst_list.py +71 -0
  500. kanon_cli-3.0.0/tests/unit/repo/test_bug6_undefined_env_vars.py +328 -0
  501. kanon_cli-3.0.0/tests/unit/repo/test_bug7_git_ls_remote_retry.py +365 -0
  502. kanon_cli-3.0.0/tests/unit/repo/test_bug8_ls_remote_stderr.py +154 -0
  503. kanon_cli-3.0.0/tests/unit/repo/test_bug9_constraint_resolution_cache.py +184 -0
  504. kanon_cli-3.0.0/tests/unit/repo/test_checklocalpath_rules_1_5.py +193 -0
  505. kanon_cli-3.0.0/tests/unit/repo/test_checklocalpath_rules_6_11.py +308 -0
  506. kanon_cli-3.0.0/tests/unit/repo/test_checkout_massive.py +330 -0
  507. kanon_cli-3.0.0/tests/unit/repo/test_cherrypick_coverage.py +295 -0
  508. kanon_cli-3.0.0/tests/unit/repo/test_color.py +446 -0
  509. kanon_cli-3.0.0/tests/unit/repo/test_command.py +1096 -0
  510. kanon_cli-3.0.0/tests/unit/repo/test_diffmanifests_deep.py +493 -0
  511. kanon_cli-3.0.0/tests/unit/repo/test_doc_validate_git_preconditions.py +299 -0
  512. kanon_cli-3.0.0/tests/unit/repo/test_download_coverage.py +48 -0
  513. kanon_cli-3.0.0/tests/unit/repo/test_editor.py +283 -0
  514. kanon_cli-3.0.0/tests/unit/repo/test_embedded_mode.py +266 -0
  515. kanon_cli-3.0.0/tests/unit/repo/test_envsubst_basic.py +278 -0
  516. kanon_cli-3.0.0/tests/unit/repo/test_envsubst_edge.py +633 -0
  517. kanon_cli-3.0.0/tests/unit/repo/test_envsubst_massive.py +214 -0
  518. kanon_cli-3.0.0/tests/unit/repo/test_error.py +341 -0
  519. kanon_cli-3.0.0/tests/unit/repo/test_event_log.py +265 -0
  520. kanon_cli-3.0.0/tests/unit/repo/test_event_log_massive.py +246 -0
  521. kanon_cli-3.0.0/tests/unit/repo/test_fetch.py +106 -0
  522. kanon_cli-3.0.0/tests/unit/repo/test_forall_deep.py +609 -0
  523. kanon_cli-3.0.0/tests/unit/repo/test_git_command.py +577 -0
  524. kanon_cli-3.0.0/tests/unit/repo/test_git_config.py +563 -0
  525. kanon_cli-3.0.0/tests/unit/repo/test_git_refs.py +514 -0
  526. kanon_cli-3.0.0/tests/unit/repo/test_git_superproject.py +629 -0
  527. kanon_cli-3.0.0/tests/unit/repo/test_git_trace2_event_log.py +734 -0
  528. kanon_cli-3.0.0/tests/unit/repo/test_gitconfig_coverage.py +405 -0
  529. kanon_cli-3.0.0/tests/unit/repo/test_grep_deep.py +404 -0
  530. kanon_cli-3.0.0/tests/unit/repo/test_harness_smoke.py +102 -0
  531. kanon_cli-3.0.0/tests/unit/repo/test_hooks.py +486 -0
  532. kanon_cli-3.0.0/tests/unit/repo/test_import_verification.py +138 -0
  533. kanon_cli-3.0.0/tests/unit/repo/test_include_path_resolution.py +629 -0
  534. kanon_cli-3.0.0/tests/unit/repo/test_info_deep.py +456 -0
  535. kanon_cli-3.0.0/tests/unit/repo/test_init_deep.py +327 -0
  536. kanon_cli-3.0.0/tests/unit/repo/test_list_massive.py +361 -0
  537. kanon_cli-3.0.0/tests/unit/repo/test_main.py +772 -0
  538. kanon_cli-3.0.0/tests/unit/repo/test_main_coverage.py +340 -0
  539. kanon_cli-3.0.0/tests/unit/repo/test_main_init_download_boost.py +1841 -0
  540. kanon_cli-3.0.0/tests/unit/repo/test_makefile_lint_format.py +90 -0
  541. kanon_cli-3.0.0/tests/unit/repo/test_makefile_structure.py +198 -0
  542. kanon_cli-3.0.0/tests/unit/repo/test_makefile_test_targets.py +146 -0
  543. kanon_cli-3.0.0/tests/unit/repo/test_manifest_coverage_boost.py +2133 -0
  544. kanon_cli-3.0.0/tests/unit/repo/test_manifest_deep.py +1588 -0
  545. kanon_cli-3.0.0/tests/unit/repo/test_manifest_doc_rp_flags.py +148 -0
  546. kanon_cli-3.0.0/tests/unit/repo/test_manifest_massive.py +848 -0
  547. kanon_cli-3.0.0/tests/unit/repo/test_manifest_subcmd_massive.py +366 -0
  548. kanon_cli-3.0.0/tests/unit/repo/test_manifest_xml.py +2686 -0
  549. kanon_cli-3.0.0/tests/unit/repo/test_manifest_xml_pep440.py +196 -0
  550. kanon_cli-3.0.0/tests/unit/repo/test_medium_files_boost.py +1540 -0
  551. kanon_cli-3.0.0/tests/unit/repo/test_mkdtemp_cleanup.py +126 -0
  552. kanon_cli-3.0.0/tests/unit/repo/test_overview_massive.py +317 -0
  553. kanon_cli-3.0.0/tests/unit/repo/test_pager.py +381 -0
  554. kanon_cli-3.0.0/tests/unit/repo/test_parselist.py +197 -0
  555. kanon_cli-3.0.0/tests/unit/repo/test_pep440_edge_1.py +364 -0
  556. kanon_cli-3.0.0/tests/unit/repo/test_pep440_edge_2.py +349 -0
  557. kanon_cli-3.0.0/tests/unit/repo/test_pep440_ops_ge.py +201 -0
  558. kanon_cli-3.0.0/tests/unit/repo/test_pep440_ops_rest.py +469 -0
  559. kanon_cli-3.0.0/tests/unit/repo/test_platform_utils.py +413 -0
  560. kanon_cli-3.0.0/tests/unit/repo/test_process_isolation.py +206 -0
  561. kanon_cli-3.0.0/tests/unit/repo/test_progress.py +533 -0
  562. kanon_cli-3.0.0/tests/unit/repo/test_project.py +2394 -0
  563. kanon_cli-3.0.0/tests/unit/repo/test_project_coverage_boost.py +1722 -0
  564. kanon_cli-3.0.0/tests/unit/repo/test_project_coverage_threshold.py +3085 -0
  565. kanon_cli-3.0.0/tests/unit/repo/test_project_deep.py +1042 -0
  566. kanon_cli-3.0.0/tests/unit/repo/test_project_deep_boost.py +1068 -0
  567. kanon_cli-3.0.0/tests/unit/repo/test_project_integration.py +833 -0
  568. kanon_cli-3.0.0/tests/unit/repo/test_project_massive.py +1174 -0
  569. kanon_cli-3.0.0/tests/unit/repo/test_project_metaproject_boost.py +1338 -0
  570. kanon_cli-3.0.0/tests/unit/repo/test_project_methods.py +604 -0
  571. kanon_cli-3.0.0/tests/unit/repo/test_project_sync.py +186 -0
  572. kanon_cli-3.0.0/tests/unit/repo/test_prune_massive.py +335 -0
  573. kanon_cli-3.0.0/tests/unit/repo/test_rebase_coverage.py +441 -0
  574. kanon_cli-3.0.0/tests/unit/repo/test_remaining_coverage_boost.py +1328 -0
  575. kanon_cli-3.0.0/tests/unit/repo/test_repo_envsubst_api.py +357 -0
  576. kanon_cli-3.0.0/tests/unit/repo/test_repo_logging.py +265 -0
  577. kanon_cli-3.0.0/tests/unit/repo/test_repo_run_api.py +290 -0
  578. kanon_cli-3.0.0/tests/unit/repo/test_repo_sync_api.py +440 -0
  579. kanon_cli-3.0.0/tests/unit/repo/test_repo_trace.py +341 -0
  580. kanon_cli-3.0.0/tests/unit/repo/test_revision_inheritance.py +355 -0
  581. kanon_cli-3.0.0/tests/unit/repo/test_revision_tag_branch_sha.py +251 -0
  582. kanon_cli-3.0.0/tests/unit/repo/test_selfupdate_embedded.py +223 -0
  583. kanon_cli-3.0.0/tests/unit/repo/test_selfupdate_massive.py +221 -0
  584. kanon_cli-3.0.0/tests/unit/repo/test_small_files_boost.py +1664 -0
  585. kanon_cli-3.0.0/tests/unit/repo/test_ssh.py +386 -0
  586. kanon_cli-3.0.0/tests/unit/repo/test_ssh_deep.py +405 -0
  587. kanon_cli-3.0.0/tests/unit/repo/test_stage_coverage.py +294 -0
  588. kanon_cli-3.0.0/tests/unit/repo/test_stage_massive.py +324 -0
  589. kanon_cli-3.0.0/tests/unit/repo/test_start_coverage.py +267 -0
  590. kanon_cli-3.0.0/tests/unit/repo/test_status_coverage.py +249 -0
  591. kanon_cli-3.0.0/tests/unit/repo/test_status_massive.py +248 -0
  592. kanon_cli-3.0.0/tests/unit/repo/test_subcmd_imports.py +128 -0
  593. kanon_cli-3.0.0/tests/unit/repo/test_subcmds.py +114 -0
  594. kanon_cli-3.0.0/tests/unit/repo/test_subcmds_abandon.py +118 -0
  595. kanon_cli-3.0.0/tests/unit/repo/test_subcmds_branches.py +86 -0
  596. kanon_cli-3.0.0/tests/unit/repo/test_subcmds_checkout.py +97 -0
  597. kanon_cli-3.0.0/tests/unit/repo/test_subcmds_cherry_pick.py +30 -0
  598. kanon_cli-3.0.0/tests/unit/repo/test_subcmds_diff.py +50 -0
  599. kanon_cli-3.0.0/tests/unit/repo/test_subcmds_diffmanifests.py +63 -0
  600. kanon_cli-3.0.0/tests/unit/repo/test_subcmds_download.py +70 -0
  601. kanon_cli-3.0.0/tests/unit/repo/test_subcmds_envsubst.py +285 -0
  602. kanon_cli-3.0.0/tests/unit/repo/test_subcmds_forall.py +315 -0
  603. kanon_cli-3.0.0/tests/unit/repo/test_subcmds_gc.py +317 -0
  604. kanon_cli-3.0.0/tests/unit/repo/test_subcmds_grep.py +309 -0
  605. kanon_cli-3.0.0/tests/unit/repo/test_subcmds_help.py +114 -0
  606. kanon_cli-3.0.0/tests/unit/repo/test_subcmds_info.py +201 -0
  607. kanon_cli-3.0.0/tests/unit/repo/test_subcmds_init.py +356 -0
  608. kanon_cli-3.0.0/tests/unit/repo/test_subcmds_list.py +30 -0
  609. kanon_cli-3.0.0/tests/unit/repo/test_subcmds_manifest.py +195 -0
  610. kanon_cli-3.0.0/tests/unit/repo/test_subcmds_overview.py +30 -0
  611. kanon_cli-3.0.0/tests/unit/repo/test_subcmds_prune.py +30 -0
  612. kanon_cli-3.0.0/tests/unit/repo/test_subcmds_rebase.py +40 -0
  613. kanon_cli-3.0.0/tests/unit/repo/test_subcmds_selfupdate.py +30 -0
  614. kanon_cli-3.0.0/tests/unit/repo/test_subcmds_smartsync.py +30 -0
  615. kanon_cli-3.0.0/tests/unit/repo/test_subcmds_stage.py +26 -0
  616. kanon_cli-3.0.0/tests/unit/repo/test_subcmds_start.py +30 -0
  617. kanon_cli-3.0.0/tests/unit/repo/test_subcmds_status.py +30 -0
  618. kanon_cli-3.0.0/tests/unit/repo/test_subcmds_sync.py +1797 -0
  619. kanon_cli-3.0.0/tests/unit/repo/test_subcmds_upload.py +332 -0
  620. kanon_cli-3.0.0/tests/unit/repo/test_superproject_deep.py +914 -0
  621. kanon_cli-3.0.0/tests/unit/repo/test_sync_coverage_boost.py +1350 -0
  622. kanon_cli-3.0.0/tests/unit/repo/test_sync_deep.py +2488 -0
  623. kanon_cli-3.0.0/tests/unit/repo/test_sync_deep_boost.py +1141 -0
  624. kanon_cli-3.0.0/tests/unit/repo/test_sync_massive.py +707 -0
  625. kanon_cli-3.0.0/tests/unit/repo/test_upload_deep.py +911 -0
  626. kanon_cli-3.0.0/tests/unit/repo/test_version_consolidation.py +419 -0
  627. kanon_cli-3.0.0/tests/unit/repo/test_version_constraints.py +232 -0
  628. kanon_cli-3.0.0/tests/unit/repo/test_wheel_contents.py +335 -0
  629. kanon_cli-3.0.0/tests/unit/repo/test_wrapper.py +544 -0
  630. kanon_cli-3.0.0/tests/unit/repo/test_xml_annotation_attributes.py +686 -0
  631. kanon_cli-3.0.0/tests/unit/repo/test_xml_annotation_crossref.py +1122 -0
  632. kanon_cli-3.0.0/tests/unit/repo/test_xml_annotation_happy.py +679 -0
  633. kanon_cli-3.0.0/tests/unit/repo/test_xml_contactinfo_attributes.py +419 -0
  634. kanon_cli-3.0.0/tests/unit/repo/test_xml_contactinfo_crossref.py +957 -0
  635. kanon_cli-3.0.0/tests/unit/repo/test_xml_contactinfo_happy.py +542 -0
  636. kanon_cli-3.0.0/tests/unit/repo/test_xml_copyfile_attributes.py +618 -0
  637. kanon_cli-3.0.0/tests/unit/repo/test_xml_copyfile_crossref.py +970 -0
  638. kanon_cli-3.0.0/tests/unit/repo/test_xml_copyfile_happy.py +656 -0
  639. kanon_cli-3.0.0/tests/unit/repo/test_xml_default_attributes.py +1089 -0
  640. kanon_cli-3.0.0/tests/unit/repo/test_xml_default_crossref.py +1011 -0
  641. kanon_cli-3.0.0/tests/unit/repo/test_xml_default_happy.py +751 -0
  642. kanon_cli-3.0.0/tests/unit/repo/test_xml_extend_project_attributes.py +737 -0
  643. kanon_cli-3.0.0/tests/unit/repo/test_xml_extend_project_crossref.py +962 -0
  644. kanon_cli-3.0.0/tests/unit/repo/test_xml_extend_project_happy.py +732 -0
  645. kanon_cli-3.0.0/tests/unit/repo/test_xml_fault_malformed.py +503 -0
  646. kanon_cli-3.0.0/tests/unit/repo/test_xml_fault_structural.py +579 -0
  647. kanon_cli-3.0.0/tests/unit/repo/test_xml_include_attributes.py +717 -0
  648. kanon_cli-3.0.0/tests/unit/repo/test_xml_include_crossref.py +1157 -0
  649. kanon_cli-3.0.0/tests/unit/repo/test_xml_include_cycles.py +957 -0
  650. kanon_cli-3.0.0/tests/unit/repo/test_xml_include_happy.py +742 -0
  651. kanon_cli-3.0.0/tests/unit/repo/test_xml_linkfile_attributes.py +733 -0
  652. kanon_cli-3.0.0/tests/unit/repo/test_xml_linkfile_crossref.py +974 -0
  653. kanon_cli-3.0.0/tests/unit/repo/test_xml_linkfile_happy.py +758 -0
  654. kanon_cli-3.0.0/tests/unit/repo/test_xml_manifest_attributes.py +1091 -0
  655. kanon_cli-3.0.0/tests/unit/repo/test_xml_manifest_crossref.py +823 -0
  656. kanon_cli-3.0.0/tests/unit/repo/test_xml_manifest_happy.py +783 -0
  657. kanon_cli-3.0.0/tests/unit/repo/test_xml_manifest_server_attributes.py +814 -0
  658. kanon_cli-3.0.0/tests/unit/repo/test_xml_manifest_server_crossref.py +1002 -0
  659. kanon_cli-3.0.0/tests/unit/repo/test_xml_manifest_server_flow.py +680 -0
  660. kanon_cli-3.0.0/tests/unit/repo/test_xml_manifest_server_happy.py +615 -0
  661. kanon_cli-3.0.0/tests/unit/repo/test_xml_notice_attributes.py +636 -0
  662. kanon_cli-3.0.0/tests/unit/repo/test_xml_notice_crossref.py +895 -0
  663. kanon_cli-3.0.0/tests/unit/repo/test_xml_notice_happy.py +557 -0
  664. kanon_cli-3.0.0/tests/unit/repo/test_xml_project_attributes.py +1187 -0
  665. kanon_cli-3.0.0/tests/unit/repo/test_xml_project_crossref.py +956 -0
  666. kanon_cli-3.0.0/tests/unit/repo/test_xml_project_happy.py +956 -0
  667. kanon_cli-3.0.0/tests/unit/repo/test_xml_remote_attributes.py +941 -0
  668. kanon_cli-3.0.0/tests/unit/repo/test_xml_remote_crossref.py +998 -0
  669. kanon_cli-3.0.0/tests/unit/repo/test_xml_remote_happy.py +803 -0
  670. kanon_cli-3.0.0/tests/unit/repo/test_xml_remove_project_attributes.py +843 -0
  671. kanon_cli-3.0.0/tests/unit/repo/test_xml_remove_project_crossref.py +1151 -0
  672. kanon_cli-3.0.0/tests/unit/repo/test_xml_remove_project_happy.py +674 -0
  673. kanon_cli-3.0.0/tests/unit/repo/test_xml_repo_hooks_attributes.py +496 -0
  674. kanon_cli-3.0.0/tests/unit/repo/test_xml_repo_hooks_crossref.py +821 -0
  675. kanon_cli-3.0.0/tests/unit/repo/test_xml_repo_hooks_happy.py +635 -0
  676. kanon_cli-3.0.0/tests/unit/repo/test_xml_submanifest_attributes.py +894 -0
  677. kanon_cli-3.0.0/tests/unit/repo/test_xml_submanifest_crossref.py +1041 -0
  678. kanon_cli-3.0.0/tests/unit/repo/test_xml_submanifest_happy.py +676 -0
  679. kanon_cli-3.0.0/tests/unit/repo/test_xml_superproject_attributes.py +592 -0
  680. kanon_cli-3.0.0/tests/unit/repo/test_xml_superproject_crossref.py +838 -0
  681. kanon_cli-3.0.0/tests/unit/repo/test_xml_superproject_flow.py +845 -0
  682. kanon_cli-3.0.0/tests/unit/repo/test_xml_superproject_happy.py +651 -0
  683. kanon_cli-3.0.0/tests/unit/repo/test_xmlbool.py +158 -0
  684. kanon_cli-3.0.0/tests/unit/repo/test_xmlint.py +507 -0
  685. kanon_cli-3.0.0/tests/unit/test_accessed_at_coalescing.py +138 -0
  686. kanon_cli-3.0.0/tests/unit/test_add.py +2494 -0
  687. kanon_cli-3.0.0/tests/unit/test_add_collision.py +882 -0
  688. kanon_cli-3.0.0/tests/unit/test_add_zero_tags.py +132 -0
  689. kanon_cli-3.0.0/tests/unit/test_background_refresh.py +219 -0
  690. kanon_cli-3.0.0/tests/unit/test_bare_semver_to_tag.py +78 -0
  691. kanon_cli-3.0.0/tests/unit/test_cache.py +432 -0
  692. kanon_cli-3.0.0/tests/unit/test_cache_layout.py +350 -0
  693. kanon_cli-3.0.0/tests/unit/test_cache_ttl.py +264 -0
  694. kanon_cli-3.0.0/tests/unit/test_cached_catalogs.py +99 -0
  695. kanon_cli-3.0.0/tests/unit/test_catalog.py +550 -0
  696. kanon_cli-3.0.0/tests/unit/test_catalog_audit_entry_uniqueness.py +400 -0
  697. kanon_cli-3.0.0/tests/unit/test_catalog_audit_framework.py +654 -0
  698. kanon_cli-3.0.0/tests/unit/test_catalog_audit_legacy_dir.py +309 -0
  699. kanon_cli-3.0.0/tests/unit/test_catalog_audit_metadata.py +597 -0
  700. kanon_cli-3.0.0/tests/unit/test_catalog_audit_project_tag_format.py +344 -0
  701. kanon_cli-3.0.0/tests/unit/test_catalog_audit_remote_url.py +518 -0
  702. kanon_cli-3.0.0/tests/unit/test_catalog_audit_source_name.py +443 -0
  703. kanon_cli-3.0.0/tests/unit/test_catalog_audit_strict.py +296 -0
  704. kanon_cli-3.0.0/tests/unit/test_catalog_audit_tag_format.py +630 -0
  705. kanon_cli-3.0.0/tests/unit/test_catalog_source_parsing.py +483 -0
  706. kanon_cli-3.0.0/tests/unit/test_check_no_comments.py +379 -0
  707. kanon_cli-3.0.0/tests/unit/test_ci_workflows.py +389 -0
  708. kanon_cli-3.0.0/tests/unit/test_clean.py +563 -0
  709. kanon_cli-3.0.0/tests/unit/test_clean_command.py +219 -0
  710. kanon_cli-3.0.0/tests/unit/test_cli.py +1774 -0
  711. kanon_cli-3.0.0/tests/unit/test_cli_args.py +564 -0
  712. kanon_cli-3.0.0/tests/unit/test_cli_help_format.py +136 -0
  713. kanon_cli-3.0.0/tests/unit/test_cli_json_stream_discipline.py +249 -0
  714. kanon_cli-3.0.0/tests/unit/test_complete_cached_catalogs.py +502 -0
  715. kanon_cli-3.0.0/tests/unit/test_complete_catalog_entries.py +695 -0
  716. kanon_cli-3.0.0/tests/unit/test_complete_catalog_versions.py +621 -0
  717. kanon_cli-3.0.0/tests/unit/test_complete_lockfile_names.py +619 -0
  718. kanon_cli-3.0.0/tests/unit/test_complete_project_versions.py +812 -0
  719. kanon_cli-3.0.0/tests/unit/test_complete_source_names.py +359 -0
  720. kanon_cli-3.0.0/tests/unit/test_completion.py +170 -0
  721. kanon_cli-3.0.0/tests/unit/test_completion_sanitization.py +147 -0
  722. kanon_cli-3.0.0/tests/unit/test_completion_subcommand.py +139 -0
  723. kanon_cli-3.0.0/tests/unit/test_concurrency.py +492 -0
  724. kanon_cli-3.0.0/tests/unit/test_conftest_scrubber.py +46 -0
  725. kanon_cli-3.0.0/tests/unit/test_constants.py +2634 -0
  726. kanon_cli-3.0.0/tests/unit/test_constants_doctor_subcheck.py +149 -0
  727. kanon_cli-3.0.0/tests/unit/test_constants_env_int.py +152 -0
  728. kanon_cli-3.0.0/tests/unit/test_constants_install_after_add.py +131 -0
  729. kanon_cli-3.0.0/tests/unit/test_constants_outdated_refs_tags.py +206 -0
  730. kanon_cli-3.0.0/tests/unit/test_constants_why_lockfile.py +121 -0
  731. kanon_cli-3.0.0/tests/unit/test_derive_source_name.py +285 -0
  732. kanon_cli-3.0.0/tests/unit/test_discover_source_names_missing_url.py +106 -0
  733. kanon_cli-3.0.0/tests/unit/test_doctor.py +446 -0
  734. kanon_cli-3.0.0/tests/unit/test_doctor_cache_flags.py +975 -0
  735. kanon_cli-3.0.0/tests/unit/test_doctor_completion_errors.py +444 -0
  736. kanon_cli-3.0.0/tests/unit/test_doctor_completion_staleness.py +456 -0
  737. kanon_cli-3.0.0/tests/unit/test_doctor_consistency.py +568 -0
  738. kanon_cli-3.0.0/tests/unit/test_doctor_coverage_gaps.py +836 -0
  739. kanon_cli-3.0.0/tests/unit/test_doctor_effective_source.py +275 -0
  740. kanon_cli-3.0.0/tests/unit/test_doctor_remote_reachability.py +1045 -0
  741. kanon_cli-3.0.0/tests/unit/test_envsubst_subcommand.py +220 -0
  742. kanon_cli-3.0.0/tests/unit/test_git_runner.py +381 -0
  743. kanon_cli-3.0.0/tests/unit/test_home_flag.py +154 -0
  744. kanon_cli-3.0.0/tests/unit/test_include_walker.py +335 -0
  745. kanon_cli-3.0.0/tests/unit/test_install.py +1390 -0
  746. kanon_cli-3.0.0/tests/unit/test_install_color_default.py +54 -0
  747. kanon_cli-3.0.0/tests/unit/test_install_command.py +403 -0
  748. kanon_cli-3.0.0/tests/unit/test_install_conflict_detection.py +356 -0
  749. kanon_cli-3.0.0/tests/unit/test_install_https_enforcement.py +262 -0
  750. kanon_cli-3.0.0/tests/unit/test_install_reconcile_decision.py +118 -0
  751. kanon_cli-3.0.0/tests/unit/test_install_refresh_lock.py +364 -0
  752. kanon_cli-3.0.0/tests/unit/test_install_refresh_lock_source.py +744 -0
  753. kanon_cli-3.0.0/tests/unit/test_install_state_matrix.py +677 -0
  754. kanon_cli-3.0.0/tests/unit/test_install_strict_flags.py +829 -0
  755. kanon_cli-3.0.0/tests/unit/test_install_strict_lock_orphan_naming.py +149 -0
  756. kanon_cli-3.0.0/tests/unit/test_integration_testing_doc_manifest_paths.py +251 -0
  757. kanon_cli-3.0.0/tests/unit/test_integration_testing_doc_s2_t14.py +61 -0
  758. kanon_cli-3.0.0/tests/unit/test_integration_testing_doc_s2_t4.py +74 -0
  759. kanon_cli-3.0.0/tests/unit/test_integration_testing_doc_s2_t5.py +90 -0
  760. kanon_cli-3.0.0/tests/unit/test_integration_testing_doc_s2_t6.py +56 -0
  761. kanon_cli-3.0.0/tests/unit/test_integration_testing_doc_s2_t7.py +59 -0
  762. kanon_cli-3.0.0/tests/unit/test_integration_testing_doc_s2_tier1.py +197 -0
  763. kanon_cli-3.0.0/tests/unit/test_isolation_fixtures.py +40 -0
  764. kanon_cli-3.0.0/tests/unit/test_kanon_hash.py +660 -0
  765. kanon_cli-3.0.0/tests/unit/test_kanonenv.py +344 -0
  766. kanon_cli-3.0.0/tests/unit/test_kanonenv_advanced_edge_cases.py +161 -0
  767. kanon_cli-3.0.0/tests/unit/test_kanonenv_edge_cases.py +209 -0
  768. kanon_cli-3.0.0/tests/unit/test_kanonenv_writer.py +372 -0
  769. kanon_cli-3.0.0/tests/unit/test_levenshtein.py +91 -0
  770. kanon_cli-3.0.0/tests/unit/test_lock_file_path.py +114 -0
  771. kanon_cli-3.0.0/tests/unit/test_lockfile.py +1090 -0
  772. kanon_cli-3.0.0/tests/unit/test_lockfile_coverage_gaps.py +414 -0
  773. kanon_cli-3.0.0/tests/unit/test_lockfile_schema_migration.py +229 -0
  774. kanon_cli-3.0.0/tests/unit/test_manifest.py +463 -0
  775. kanon_cli-3.0.0/tests/unit/test_marketplace.py +752 -0
  776. kanon_cli-3.0.0/tests/unit/test_marketplace_cmd.py +332 -0
  777. kanon_cli-3.0.0/tests/unit/test_marketplace_non_plugin_skip.py +119 -0
  778. kanon_cli-3.0.0/tests/unit/test_marketplace_validator.py +491 -0
  779. kanon_cli-3.0.0/tests/unit/test_metadata.py +669 -0
  780. kanon_cli-3.0.0/tests/unit/test_midtoken_splitter.py +325 -0
  781. kanon_cli-3.0.0/tests/unit/test_outdated.py +657 -0
  782. kanon_cli-3.0.0/tests/unit/test_outdated_branch_pinned.py +742 -0
  783. kanon_cli-3.0.0/tests/unit/test_outdated_fail_on_upgrade.py +373 -0
  784. kanon_cli-3.0.0/tests/unit/test_outdated_format_json.py +514 -0
  785. kanon_cli-3.0.0/tests/unit/test_pep440_filter.py +119 -0
  786. kanon_cli-3.0.0/tests/unit/test_powershell.py +115 -0
  787. kanon_cli-3.0.0/tests/unit/test_pre_push_hook.py +388 -0
  788. kanon_cli-3.0.0/tests/unit/test_preamble.py +119 -0
  789. kanon_cli-3.0.0/tests/unit/test_preamble_semver_tags.py +138 -0
  790. kanon_cli-3.0.0/tests/unit/test_provider_agnosticism.py +342 -0
  791. kanon_cli-3.0.0/tests/unit/test_remote_url.py +267 -0
  792. kanon_cli-3.0.0/tests/unit/test_remove.py +898 -0
  793. kanon_cli-3.0.0/tests/unit/test_remove_dry_run.py +332 -0
  794. kanon_cli-3.0.0/tests/unit/test_remove_force.py +299 -0
  795. kanon_cli-3.0.0/tests/unit/test_remove_line_endings.py +448 -0
  796. kanon_cli-3.0.0/tests/unit/test_resolve_catalog_dir.py +68 -0
  797. kanon_cli-3.0.0/tests/unit/test_revision_resolve.py +142 -0
  798. kanon_cli-3.0.0/tests/unit/test_rx_catalog_sub_repo.py +248 -0
  799. kanon_cli-3.0.0/tests/unit/test_sanitize.py +95 -0
  800. kanon_cli-3.0.0/tests/unit/test_search.py +1021 -0
  801. kanon_cli-3.0.0/tests/unit/test_search_all_versions.py +464 -0
  802. kanon_cli-3.0.0/tests/unit/test_search_coverage_gaps.py +559 -0
  803. kanon_cli-3.0.0/tests/unit/test_search_detail.py +428 -0
  804. kanon_cli-3.0.0/tests/unit/test_search_filter.py +868 -0
  805. kanon_cli-3.0.0/tests/unit/test_search_format_json.py +778 -0
  806. kanon_cli-3.0.0/tests/unit/test_search_tree.py +1244 -0
  807. kanon_cli-3.0.0/tests/unit/test_spawn.py +180 -0
  808. kanon_cli-3.0.0/tests/unit/test_update_check.py +563 -0
  809. kanon_cli-3.0.0/tests/unit/test_url.py +186 -0
  810. kanon_cli-3.0.0/tests/unit/test_validate.py +104 -0
  811. kanon_cli-3.0.0/tests/unit/test_validate_command.py +309 -0
  812. kanon_cli-3.0.0/tests/unit/test_validate_metadata.py +514 -0
  813. kanon_cli-3.0.0/tests/unit/test_version.py +750 -0
  814. kanon_cli-3.0.0/tests/unit/test_why.py +1340 -0
  815. kanon_cli-3.0.0/tests/unit/test_why_ambiguity.py +814 -0
  816. kanon_cli-3.0.0/tests/unit/test_why_format_json.py +955 -0
  817. kanon_cli-3.0.0/tests/unit/test_why_suggestions.py +340 -0
  818. kanon_cli-3.0.0/tools/lint/check_no_comments.py +239 -0
  819. kanon_cli-3.0.0/tools/test_tmp_monitor.py +152 -0
  820. kanon_cli-3.0.0/uv.lock +860 -0
  821. kanon_cli-2.1.0/.devcontainer/.devcontainer.postcreate.sh +0 -459
  822. kanon_cli-2.1.0/.devcontainer/fix-line-endings.py +0 -117
  823. kanon_cli-2.1.0/.github/actions/setup-kanon/action.yml +0 -143
  824. kanon_cli-2.1.0/.github/workflows/main-validation.yml +0 -420
  825. kanon_cli-2.1.0/.github/workflows/pr-validation.yml +0 -262
  826. kanon_cli-2.1.0/.markdownlint.json +0 -6
  827. kanon_cli-2.1.0/.pre-commit-config.yaml +0 -30
  828. kanon_cli-2.1.0/CHANGELOG.md +0 -3301
  829. kanon_cli-2.1.0/CONTRIBUTING.md +0 -232
  830. kanon_cli-2.1.0/Makefile +0 -89
  831. kanon_cli-2.1.0/PKG-INFO +0 -1352
  832. kanon_cli-2.1.0/README.md +0 -1330
  833. kanon_cli-2.1.0/docs/architecture.md +0 -255
  834. kanon_cli-2.1.0/docs/catalog-author-guide.md +0 -443
  835. kanon_cli-2.1.0/docs/catalogs-explained.md +0 -131
  836. kanon_cli-2.1.0/docs/claude-marketplaces-guide.md +0 -165
  837. kanon_cli-2.1.0/docs/cli/catalog-audit.md +0 -640
  838. kanon_cli-2.1.0/docs/cli/doctor.md +0 -470
  839. kanon_cli-2.1.0/docs/cli/validate.md +0 -224
  840. kanon_cli-2.1.0/docs/cli-reference.md +0 -468
  841. kanon_cli-2.1.0/docs/cli.md +0 -485
  842. kanon_cli-2.1.0/docs/coming-from-pip-npm-cargo.md +0 -103
  843. kanon_cli-2.1.0/docs/configuration.md +0 -632
  844. kanon_cli-2.1.0/docs/contributing.md +0 -112
  845. kanon_cli-2.1.0/docs/creating-manifest-repos.md +0 -281
  846. kanon_cli-2.1.0/docs/creating-packages.md +0 -72
  847. kanon_cli-2.1.0/docs/doctor.md +0 -837
  848. kanon_cli-2.1.0/docs/exit-codes.md +0 -198
  849. kanon_cli-2.1.0/docs/git-auth-setup.md +0 -404
  850. kanon_cli-2.1.0/docs/how-it-works.md +0 -104
  851. kanon_cli-2.1.0/docs/installation.md +0 -204
  852. kanon_cli-2.1.0/docs/integration-testing.md +0 -6198
  853. kanon_cli-2.1.0/docs/lifecycle.md +0 -93
  854. kanon_cli-2.1.0/docs/list-and-add.md +0 -801
  855. kanon_cli-2.1.0/docs/lockfile.md +0 -875
  856. kanon_cli-2.1.0/docs/migrating-existing-kanon-files.md +0 -289
  857. kanon_cli-2.1.0/docs/migration-bootstrap-to-add.md +0 -243
  858. kanon_cli-2.1.0/docs/multi-source-guide.md +0 -317
  859. kanon_cli-2.1.0/docs/outdated-and-why.md +0 -575
  860. kanon_cli-2.1.0/docs/pipeline-integration.md +0 -79
  861. kanon_cli-2.1.0/docs/security-model.md +0 -177
  862. kanon_cli-2.1.0/docs/setup-guide.md +0 -96
  863. kanon_cli-2.1.0/docs/shell-completion.md +0 -434
  864. kanon_cli-2.1.0/docs/test-coverage.md +0 -494
  865. kanon_cli-2.1.0/docs/testing/matrix-traceability.md +0 -182
  866. kanon_cli-2.1.0/docs/troubleshooting.md +0 -1006
  867. kanon_cli-2.1.0/docs/url-canonicalization.md +0 -98
  868. kanon_cli-2.1.0/docs/version-resolution.md +0 -474
  869. kanon_cli-2.1.0/pyproject.toml +0 -132
  870. kanon_cli-2.1.0/requirements-dev.txt +0 -10
  871. kanon_cli-2.1.0/src/kanon_cli/__init__.py +0 -3
  872. kanon_cli-2.1.0/src/kanon_cli/cli.py +0 -340
  873. kanon_cli-2.1.0/src/kanon_cli/commands/add.py +0 -953
  874. kanon_cli-2.1.0/src/kanon_cli/commands/bootstrap.py +0 -146
  875. kanon_cli-2.1.0/src/kanon_cli/commands/catalog.py +0 -1086
  876. kanon_cli-2.1.0/src/kanon_cli/commands/clean.py +0 -84
  877. kanon_cli-2.1.0/src/kanon_cli/commands/completion.py +0 -78
  878. kanon_cli-2.1.0/src/kanon_cli/commands/doctor.py +0 -1707
  879. kanon_cli-2.1.0/src/kanon_cli/commands/install.py +0 -235
  880. kanon_cli-2.1.0/src/kanon_cli/commands/list.py +0 -1649
  881. kanon_cli-2.1.0/src/kanon_cli/commands/outdated.py +0 -941
  882. kanon_cli-2.1.0/src/kanon_cli/commands/remove.py +0 -421
  883. kanon_cli-2.1.0/src/kanon_cli/commands/validate.py +0 -259
  884. kanon_cli-2.1.0/src/kanon_cli/commands/why.py +0 -1480
  885. kanon_cli-2.1.0/src/kanon_cli/completions/cache.py +0 -495
  886. kanon_cli-2.1.0/src/kanon_cli/completions/cached_catalogs.py +0 -193
  887. kanon_cli-2.1.0/src/kanon_cli/completions/catalog_entries.py +0 -392
  888. kanon_cli-2.1.0/src/kanon_cli/completions/catalog_versions.py +0 -413
  889. kanon_cli-2.1.0/src/kanon_cli/completions/lockfile_names.py +0 -204
  890. kanon_cli-2.1.0/src/kanon_cli/completions/midtoken.py +0 -235
  891. kanon_cli-2.1.0/src/kanon_cli/completions/preamble.py +0 -240
  892. kanon_cli-2.1.0/src/kanon_cli/completions/project_versions.py +0 -381
  893. kanon_cli-2.1.0/src/kanon_cli/completions/source_names.py +0 -191
  894. kanon_cli-2.1.0/src/kanon_cli/constants.py +0 -639
  895. kanon_cli-2.1.0/src/kanon_cli/core/catalog.py +0 -160
  896. kanon_cli-2.1.0/src/kanon_cli/core/clean.py +0 -256
  897. kanon_cli-2.1.0/src/kanon_cli/core/cli_args.py +0 -138
  898. kanon_cli-2.1.0/src/kanon_cli/core/include_walker.py +0 -263
  899. kanon_cli-2.1.0/src/kanon_cli/core/install.py +0 -2868
  900. kanon_cli-2.1.0/src/kanon_cli/core/kanon_hash.py +0 -124
  901. kanon_cli-2.1.0/src/kanon_cli/core/kanonenv.py +0 -467
  902. kanon_cli-2.1.0/src/kanon_cli/core/lockfile.py +0 -1001
  903. kanon_cli-2.1.0/src/kanon_cli/core/manifest.py +0 -347
  904. kanon_cli-2.1.0/src/kanon_cli/core/marketplace.py +0 -583
  905. kanon_cli-2.1.0/src/kanon_cli/core/marketplace_validator.py +0 -247
  906. kanon_cli-2.1.0/src/kanon_cli/core/metadata.py +0 -532
  907. kanon_cli-2.1.0/src/kanon_cli/core/remote_url.py +0 -161
  908. kanon_cli-2.1.0/src/kanon_cli/core/url.py +0 -152
  909. kanon_cli-2.1.0/src/kanon_cli/repo/platform_utils.py +0 -246
  910. kanon_cli-2.1.0/src/kanon_cli/utils/concurrency.py +0 -94
  911. kanon_cli-2.1.0/src/kanon_cli/utils/levenshtein.py +0 -71
  912. kanon_cli-2.1.0/src/kanon_cli/utils/lock_file_path.py +0 -63
  913. kanon_cli-2.1.0/src/kanon_cli/version.py +0 -503
  914. kanon_cli-2.1.0/tests/conftest.py +0 -574
  915. kanon_cli-2.1.0/tests/fixtures/completion/__init__.py +0 -1
  916. kanon_cli-2.1.0/tests/fixtures/completion/expected-bash.sh +0 -355
  917. kanon_cli-2.1.0/tests/fixtures/completion/expected-zsh.sh +0 -511
  918. kanon_cli-2.1.0/tests/fixtures/errors/README.md +0 -51
  919. kanon_cli-2.1.0/tests/fixtures/errors/entry-not-found.txt +0 -2
  920. kanon_cli-2.1.0/tests/fixtures/errors/missing-catalog-source.txt +0 -10
  921. kanon_cli-2.1.0/tests/fixtures/errors/source-collision.txt +0 -2
  922. kanon_cli-2.1.0/tests/fixtures/help/README.md +0 -80
  923. kanon_cli-2.1.0/tests/fixtures/help/kanon-add.txt +0 -63
  924. kanon_cli-2.1.0/tests/fixtures/help/kanon-catalog-audit.txt +0 -34
  925. kanon_cli-2.1.0/tests/fixtures/help/kanon-clean.txt +0 -25
  926. kanon_cli-2.1.0/tests/fixtures/help/kanon-completion.txt +0 -18
  927. kanon_cli-2.1.0/tests/fixtures/help/kanon-doctor.txt +0 -52
  928. kanon_cli-2.1.0/tests/fixtures/help/kanon-install.txt +0 -64
  929. kanon_cli-2.1.0/tests/fixtures/help/kanon-list.txt +0 -151
  930. kanon_cli-2.1.0/tests/fixtures/help/kanon-outdated.txt +0 -50
  931. kanon_cli-2.1.0/tests/fixtures/help/kanon-remove.txt +0 -47
  932. kanon_cli-2.1.0/tests/fixtures/help/kanon-toplevel.txt +0 -39
  933. kanon_cli-2.1.0/tests/fixtures/help/kanon-why.txt +0 -50
  934. kanon_cli-2.1.0/tests/fixtures/repo/linter-test-bad.md +0 -13
  935. kanon_cli-2.1.0/tests/fixtures/repo/linter-test-bad.py +0 -11
  936. kanon_cli-2.1.0/tests/functional/conftest.py +0 -953
  937. kanon_cli-2.1.0/tests/functional/test_argparse_errors.py +0 -636
  938. kanon_cli-2.1.0/tests/functional/test_argparse_help.py +0 -556
  939. kanon_cli-2.1.0/tests/functional/test_bootstrap_errors.py +0 -125
  940. kanon_cli-2.1.0/tests/functional/test_bootstrap_list_and_default_target.py +0 -103
  941. kanon_cli-2.1.0/tests/functional/test_ci_runs_operator_path_tests.py +0 -279
  942. kanon_cli-2.1.0/tests/functional/test_clean_lifecycle.py +0 -90
  943. kanon_cli-2.1.0/tests/functional/test_cli_entry_point.py +0 -166
  944. kanon_cli-2.1.0/tests/functional/test_completion_snapshots.py +0 -151
  945. kanon_cli-2.1.0/tests/functional/test_error_snapshots.py +0 -772
  946. kanon_cli-2.1.0/tests/functional/test_exit_code_matrix.py +0 -1098
  947. kanon_cli-2.1.0/tests/functional/test_groups_filter.py +0 -962
  948. kanon_cli-2.1.0/tests/functional/test_help_snapshots.py +0 -148
  949. kanon_cli-2.1.0/tests/functional/test_help_text_contract.py +0 -616
  950. kanon_cli-2.1.0/tests/functional/test_install_lifecycle.py +0 -136
  951. kanon_cli-2.1.0/tests/functional/test_install_real_kanon.py +0 -161
  952. kanon_cli-2.1.0/tests/functional/test_kanon_repo_cli.py +0 -604
  953. kanon_cli-2.1.0/tests/functional/test_kanon_repo_e2e.py +0 -488
  954. kanon_cli-2.1.0/tests/functional/test_kanon_repo_lifecycle_journey.py +0 -1023
  955. kanon_cli-2.1.0/tests/functional/test_make_operator_path_targets.py +0 -237
  956. kanon_cli-2.1.0/tests/functional/test_matrix_traceability_complete.py +0 -457
  957. kanon_cli-2.1.0/tests/functional/test_provider_agnostic.py +0 -529
  958. kanon_cli-2.1.0/tests/functional/test_repo_abandon_errors.py +0 -858
  959. kanon_cli-2.1.0/tests/functional/test_repo_abandon_flags.py +0 -962
  960. kanon_cli-2.1.0/tests/functional/test_repo_abandon_happy.py +0 -486
  961. kanon_cli-2.1.0/tests/functional/test_repo_branches_errors.py +0 -770
  962. kanon_cli-2.1.0/tests/functional/test_repo_branches_flags.py +0 -835
  963. kanon_cli-2.1.0/tests/functional/test_repo_branches_happy.py +0 -370
  964. kanon_cli-2.1.0/tests/functional/test_repo_checkout_errors.py +0 -686
  965. kanon_cli-2.1.0/tests/functional/test_repo_checkout_flags.py +0 -838
  966. kanon_cli-2.1.0/tests/functional/test_repo_checkout_happy.py +0 -407
  967. kanon_cli-2.1.0/tests/functional/test_repo_cherry_pick_errors.py +0 -725
  968. kanon_cli-2.1.0/tests/functional/test_repo_cherry_pick_flags.py +0 -625
  969. kanon_cli-2.1.0/tests/functional/test_repo_cherry_pick_happy.py +0 -430
  970. kanon_cli-2.1.0/tests/functional/test_repo_diff_errors.py +0 -732
  971. kanon_cli-2.1.0/tests/functional/test_repo_diff_flags.py +0 -655
  972. kanon_cli-2.1.0/tests/functional/test_repo_diff_happy.py +0 -445
  973. kanon_cli-2.1.0/tests/functional/test_repo_diffmanifests_errors.py +0 -698
  974. kanon_cli-2.1.0/tests/functional/test_repo_diffmanifests_flags.py +0 -808
  975. kanon_cli-2.1.0/tests/functional/test_repo_diffmanifests_happy.py +0 -516
  976. kanon_cli-2.1.0/tests/functional/test_repo_dir_override.py +0 -359
  977. kanon_cli-2.1.0/tests/functional/test_repo_download_errors.py +0 -699
  978. kanon_cli-2.1.0/tests/functional/test_repo_download_flags.py +0 -1083
  979. kanon_cli-2.1.0/tests/functional/test_repo_download_happy.py +0 -486
  980. kanon_cli-2.1.0/tests/functional/test_repo_envsubst_errors.py +0 -816
  981. kanon_cli-2.1.0/tests/functional/test_repo_envsubst_flags.py +0 -879
  982. kanon_cli-2.1.0/tests/functional/test_repo_envsubst_happy.py +0 -403
  983. kanon_cli-2.1.0/tests/functional/test_repo_exit_codes.py +0 -656
  984. kanon_cli-2.1.0/tests/functional/test_repo_forall_errors.py +0 -917
  985. kanon_cli-2.1.0/tests/functional/test_repo_forall_flags.py +0 -1017
  986. kanon_cli-2.1.0/tests/functional/test_repo_forall_happy.py +0 -391
  987. kanon_cli-2.1.0/tests/functional/test_repo_gc_errors.py +0 -857
  988. kanon_cli-2.1.0/tests/functional/test_repo_gc_flags.py +0 -707
  989. kanon_cli-2.1.0/tests/functional/test_repo_gc_happy.py +0 -433
  990. kanon_cli-2.1.0/tests/functional/test_repo_grep_errors.py +0 -830
  991. kanon_cli-2.1.0/tests/functional/test_repo_grep_flags.py +0 -1097
  992. kanon_cli-2.1.0/tests/functional/test_repo_grep_happy.py +0 -483
  993. kanon_cli-2.1.0/tests/functional/test_repo_help_errors.py +0 -598
  994. kanon_cli-2.1.0/tests/functional/test_repo_help_flags.py +0 -520
  995. kanon_cli-2.1.0/tests/functional/test_repo_help_happy.py +0 -250
  996. kanon_cli-2.1.0/tests/functional/test_repo_info_errors.py +0 -856
  997. kanon_cli-2.1.0/tests/functional/test_repo_info_flags.py +0 -924
  998. kanon_cli-2.1.0/tests/functional/test_repo_info_happy.py +0 -396
  999. kanon_cli-2.1.0/tests/functional/test_repo_init_errors.py +0 -865
  1000. kanon_cli-2.1.0/tests/functional/test_repo_init_flags.py +0 -1241
  1001. kanon_cli-2.1.0/tests/functional/test_repo_init_happy.py +0 -444
  1002. kanon_cli-2.1.0/tests/functional/test_repo_init_mirror.py +0 -225
  1003. kanon_cli-2.1.0/tests/functional/test_repo_list_errors.py +0 -858
  1004. kanon_cli-2.1.0/tests/functional/test_repo_list_flags.py +0 -1085
  1005. kanon_cli-2.1.0/tests/functional/test_repo_list_happy.py +0 -447
  1006. kanon_cli-2.1.0/tests/functional/test_repo_manifest_errors.py +0 -860
  1007. kanon_cli-2.1.0/tests/functional/test_repo_manifest_flags.py +0 -1015
  1008. kanon_cli-2.1.0/tests/functional/test_repo_manifest_happy.py +0 -459
  1009. kanon_cli-2.1.0/tests/functional/test_repo_manifest_revision_as_tag.py +0 -283
  1010. kanon_cli-2.1.0/tests/functional/test_repo_overview_errors.py +0 -858
  1011. kanon_cli-2.1.0/tests/functional/test_repo_overview_flags.py +0 -785
  1012. kanon_cli-2.1.0/tests/functional/test_repo_overview_happy.py +0 -458
  1013. kanon_cli-2.1.0/tests/functional/test_repo_passthrough.py +0 -705
  1014. kanon_cli-2.1.0/tests/functional/test_repo_prune_errors.py +0 -559
  1015. kanon_cli-2.1.0/tests/functional/test_repo_prune_flags.py +0 -639
  1016. kanon_cli-2.1.0/tests/functional/test_repo_prune_happy.py +0 -430
  1017. kanon_cli-2.1.0/tests/functional/test_repo_rebase_errors.py +0 -638
  1018. kanon_cli-2.1.0/tests/functional/test_repo_rebase_flags.py +0 -1076
  1019. kanon_cli-2.1.0/tests/functional/test_repo_rebase_happy.py +0 -323
  1020. kanon_cli-2.1.0/tests/functional/test_repo_selfupdate_disabled.py +0 -155
  1021. kanon_cli-2.1.0/tests/functional/test_repo_selfupdate_errors.py +0 -746
  1022. kanon_cli-2.1.0/tests/functional/test_repo_selfupdate_flags.py +0 -532
  1023. kanon_cli-2.1.0/tests/functional/test_repo_selfupdate_happy.py +0 -257
  1024. kanon_cli-2.1.0/tests/functional/test_repo_smartsync_errors.py +0 -751
  1025. kanon_cli-2.1.0/tests/functional/test_repo_smartsync_flags.py +0 -1010
  1026. kanon_cli-2.1.0/tests/functional/test_repo_smartsync_happy.py +0 -416
  1027. kanon_cli-2.1.0/tests/functional/test_repo_stage_errors.py +0 -900
  1028. kanon_cli-2.1.0/tests/functional/test_repo_stage_flags.py +0 -666
  1029. kanon_cli-2.1.0/tests/functional/test_repo_stage_happy.py +0 -366
  1030. kanon_cli-2.1.0/tests/functional/test_repo_start_errors.py +0 -645
  1031. kanon_cli-2.1.0/tests/functional/test_repo_start_flags.py +0 -1033
  1032. kanon_cli-2.1.0/tests/functional/test_repo_start_happy.py +0 -469
  1033. kanon_cli-2.1.0/tests/functional/test_repo_status_errors.py +0 -739
  1034. kanon_cli-2.1.0/tests/functional/test_repo_status_flags.py +0 -685
  1035. kanon_cli-2.1.0/tests/functional/test_repo_status_happy.py +0 -390
  1036. kanon_cli-2.1.0/tests/functional/test_repo_sync_errors.py +0 -911
  1037. kanon_cli-2.1.0/tests/functional/test_repo_sync_flags.py +0 -1035
  1038. kanon_cli-2.1.0/tests/functional/test_repo_sync_happy.py +0 -367
  1039. kanon_cli-2.1.0/tests/functional/test_repo_upload_errors.py +0 -906
  1040. kanon_cli-2.1.0/tests/functional/test_repo_upload_flags.py +0 -794
  1041. kanon_cli-2.1.0/tests/functional/test_repo_upload_happy.py +0 -413
  1042. kanon_cli-2.1.0/tests/functional/test_stdout_stderr_discipline.py +0 -587
  1043. kanon_cli-2.1.0/tests/functional/test_validate_lifecycle.py +0 -198
  1044. kanon_cli-2.1.0/tests/functional/test_validate_marketplace.py +0 -623
  1045. kanon_cli-2.1.0/tests/functional/test_validate_xml_errors.py +0 -237
  1046. kanon_cli-2.1.0/tests/functional/test_validate_xml_repo_root.py +0 -187
  1047. kanon_cli-2.1.0/tests/functional/test_zero_source_clean_error.py +0 -118
  1048. kanon_cli-2.1.0/tests/integration/conftest.py +0 -99
  1049. kanon_cli-2.1.0/tests/integration/fixtures/synthetic/test_synthetic_pytest_fixtures.py +0 -201
  1050. kanon_cli-2.1.0/tests/integration/fixtures/synthetic/upgrade_versioned.py +0 -127
  1051. kanon_cli-2.1.0/tests/integration/repo/test_bug_fixes.py +0 -1078
  1052. kanon_cli-2.1.0/tests/integration/repo/test_consolidated_constraints_e2e.py +0 -328
  1053. kanon_cli-2.1.0/tests/integration/repo/test_envsubst_integration.py +0 -780
  1054. kanon_cli-2.1.0/tests/integration/repo/test_import_functional.py +0 -102
  1055. kanon_cli-2.1.0/tests/integration/repo/test_linkfile_copyfile.py +0 -478
  1056. kanon_cli-2.1.0/tests/integration/repo/test_linkfile_exclude_journey.py +0 -685
  1057. kanon_cli-2.1.0/tests/integration/repo/test_manifest_parsing.py +0 -550
  1058. kanon_cli-2.1.0/tests/integration/repo/test_process_isolation.py +0 -650
  1059. kanon_cli-2.1.0/tests/integration/repo/test_repo_module_smoke.py +0 -93
  1060. kanon_cli-2.1.0/tests/integration/repo/test_repo_pipeline.py +0 -636
  1061. kanon_cli-2.1.0/tests/integration/repo/test_repo_run_lifecycle.py +0 -171
  1062. kanon_cli-2.1.0/tests/integration/repo/test_repo_sync_lifecycle.py +0 -335
  1063. kanon_cli-2.1.0/tests/integration/repo/test_version_constraints_integration.py +0 -552
  1064. kanon_cli-2.1.0/tests/integration/repo/test_xml_annotation_roundtrip.py +0 -447
  1065. kanon_cli-2.1.0/tests/integration/repo/test_xml_contactinfo_roundtrip.py +0 -337
  1066. kanon_cli-2.1.0/tests/integration/repo/test_xml_copyfile_roundtrip.py +0 -408
  1067. kanon_cli-2.1.0/tests/integration/repo/test_xml_default_roundtrip.py +0 -474
  1068. kanon_cli-2.1.0/tests/integration/repo/test_xml_extend_project_roundtrip.py +0 -362
  1069. kanon_cli-2.1.0/tests/integration/repo/test_xml_include_roundtrip.py +0 -385
  1070. kanon_cli-2.1.0/tests/integration/repo/test_xml_linkfile_roundtrip.py +0 -495
  1071. kanon_cli-2.1.0/tests/integration/repo/test_xml_manifest_roundtrip.py +0 -404
  1072. kanon_cli-2.1.0/tests/integration/repo/test_xml_manifest_server_roundtrip.py +0 -336
  1073. kanon_cli-2.1.0/tests/integration/repo/test_xml_notice_roundtrip.py +0 -340
  1074. kanon_cli-2.1.0/tests/integration/repo/test_xml_project_roundtrip.py +0 -419
  1075. kanon_cli-2.1.0/tests/integration/repo/test_xml_remote_roundtrip.py +0 -451
  1076. kanon_cli-2.1.0/tests/integration/repo/test_xml_remove_project_roundtrip.py +0 -363
  1077. kanon_cli-2.1.0/tests/integration/repo/test_xml_repo_hooks_roundtrip.py +0 -370
  1078. kanon_cli-2.1.0/tests/integration/repo/test_xml_submanifest_roundtrip.py +0 -394
  1079. kanon_cli-2.1.0/tests/integration/repo/test_xml_superproject_roundtrip.py +0 -368
  1080. kanon_cli-2.1.0/tests/integration/test_add_core.py +0 -615
  1081. kanon_cli-2.1.0/tests/integration/test_add_dry_run.py +0 -763
  1082. kanon_cli-2.1.0/tests/integration/test_add_marketplace_flag.py +0 -370
  1083. kanon_cli-2.1.0/tests/integration/test_add_zero_tags.py +0 -334
  1084. kanon_cli-2.1.0/tests/integration/test_auto_discovery.py +0 -115
  1085. kanon_cli-2.1.0/tests/integration/test_background_refresh.py +0 -190
  1086. kanon_cli-2.1.0/tests/integration/test_bootstrap_shim.py +0 -221
  1087. kanon_cli-2.1.0/tests/integration/test_cache_clock_skew.py +0 -131
  1088. kanon_cli-2.1.0/tests/integration/test_cache_layout.py +0 -155
  1089. kanon_cli-2.1.0/tests/integration/test_catalog_audit_entry_uniqueness.py +0 -147
  1090. kanon_cli-2.1.0/tests/integration/test_catalog_audit_legacy_dir.py +0 -257
  1091. kanon_cli-2.1.0/tests/integration/test_catalog_audit_metadata.py +0 -165
  1092. kanon_cli-2.1.0/tests/integration/test_catalog_audit_remote_url.py +0 -218
  1093. kanon_cli-2.1.0/tests/integration/test_catalog_audit_source_name.py +0 -152
  1094. kanon_cli-2.1.0/tests/integration/test_catalog_audit_strict.py +0 -150
  1095. kanon_cli-2.1.0/tests/integration/test_catalog_audit_tag_format.py +0 -481
  1096. kanon_cli-2.1.0/tests/integration/test_catalog_constraints.py +0 -122
  1097. kanon_cli-2.1.0/tests/integration/test_clean_env_override_cleanup.py +0 -299
  1098. kanon_cli-2.1.0/tests/integration/test_clean_lifecycle.py +0 -512
  1099. kanon_cli-2.1.0/tests/integration/test_cli_entry_points.py +0 -138
  1100. kanon_cli-2.1.0/tests/integration/test_complete_cached_catalogs.py +0 -191
  1101. kanon_cli-2.1.0/tests/integration/test_complete_catalog_entries.py +0 -213
  1102. kanon_cli-2.1.0/tests/integration/test_complete_catalog_versions.py +0 -242
  1103. kanon_cli-2.1.0/tests/integration/test_complete_lockfile_names.py +0 -280
  1104. kanon_cli-2.1.0/tests/integration/test_complete_project_versions.py +0 -297
  1105. kanon_cli-2.1.0/tests/integration/test_complete_source_names.py +0 -163
  1106. kanon_cli-2.1.0/tests/integration/test_completion_bash.py +0 -1120
  1107. kanon_cli-2.1.0/tests/integration/test_completion_zsh.py +0 -1288
  1108. kanon_cli-2.1.0/tests/integration/test_concurrency.py +0 -863
  1109. kanon_cli-2.1.0/tests/integration/test_concurrency_serialization.py +0 -734
  1110. kanon_cli-2.1.0/tests/integration/test_copyfile_fs_effects.py +0 -525
  1111. kanon_cli-2.1.0/tests/integration/test_doc_validation.py +0 -225
  1112. kanon_cli-2.1.0/tests/integration/test_doctor_cache_flags.py +0 -311
  1113. kanon_cli-2.1.0/tests/integration/test_doctor_cache_flags_workspace_independent.py +0 -244
  1114. kanon_cli-2.1.0/tests/integration/test_doctor_consistency.py +0 -608
  1115. kanon_cli-2.1.0/tests/integration/test_doctor_default_subcheck_output.py +0 -135
  1116. kanon_cli-2.1.0/tests/integration/test_doctor_effective_source.py +0 -304
  1117. kanon_cli-2.1.0/tests/integration/test_doctor_prune_cache.py +0 -272
  1118. kanon_cli-2.1.0/tests/integration/test_doctor_remote_check.py +0 -421
  1119. kanon_cli-2.1.0/tests/integration/test_envsubst_command.py +0 -237
  1120. kanon_cli-2.1.0/tests/integration/test_fs_fault_extended.py +0 -638
  1121. kanon_cli-2.1.0/tests/integration/test_fs_fault_injection.py +0 -499
  1122. kanon_cli-2.1.0/tests/integration/test_full_lifecycle_synthetic.py +0 -449
  1123. kanon_cli-2.1.0/tests/integration/test_full_user_journey.py +0 -1113
  1124. kanon_cli-2.1.0/tests/integration/test_git_fault_injection.py +0 -428
  1125. kanon_cli-2.1.0/tests/integration/test_git_retry_env.py +0 -573
  1126. kanon_cli-2.1.0/tests/integration/test_gitignore_idempotency.py +0 -150
  1127. kanon_cli-2.1.0/tests/integration/test_install_after_add.py +0 -193
  1128. kanon_cli-2.1.0/tests/integration/test_install_command.py +0 -187
  1129. kanon_cli-2.1.0/tests/integration/test_install_conflict_url_normalization.py +0 -461
  1130. kanon_cli-2.1.0/tests/integration/test_install_errors.py +0 -562
  1131. kanon_cli-2.1.0/tests/integration/test_install_include_cycle.py +0 -184
  1132. kanon_cli-2.1.0/tests/integration/test_install_include_diamond.py +0 -217
  1133. kanon_cli-2.1.0/tests/integration/test_install_lifecycle.py +0 -926
  1134. kanon_cli-2.1.0/tests/integration/test_install_lock_file_derivation.py +0 -227
  1135. kanon_cli-2.1.0/tests/integration/test_install_lockfile_replay.py +0 -402
  1136. kanon_cli-2.1.0/tests/integration/test_install_marketplace_registration.py +0 -395
  1137. kanon_cli-2.1.0/tests/integration/test_install_optional_vars.py +0 -504
  1138. kanon_cli-2.1.0/tests/integration/test_install_reconcile.py +0 -471
  1139. kanon_cli-2.1.0/tests/integration/test_install_refresh_lock.py +0 -363
  1140. kanon_cli-2.1.0/tests/integration/test_install_refresh_lock_source.py +0 -797
  1141. kanon_cli-2.1.0/tests/integration/test_install_remote_url_policy.py +0 -610
  1142. kanon_cli-2.1.0/tests/integration/test_install_required_vars.py +0 -143
  1143. kanon_cli-2.1.0/tests/integration/test_install_strict.py +0 -1212
  1144. kanon_cli-2.1.0/tests/integration/test_json_output_stream_discipline.py +0 -255
  1145. kanon_cli-2.1.0/tests/integration/test_kanon_add_placeholder_handling.py +0 -250
  1146. kanon_cli-2.1.0/tests/integration/test_kanon_clean_embedded.py +0 -212
  1147. kanon_cli-2.1.0/tests/integration/test_kanon_full_lifecycle.py +0 -466
  1148. kanon_cli-2.1.0/tests/integration/test_kanon_install_embedded.py +0 -373
  1149. kanon_cli-2.1.0/tests/integration/test_kanonenv_parsing.py +0 -240
  1150. kanon_cli-2.1.0/tests/integration/test_lifecycle_recovery.py +0 -385
  1151. kanon_cli-2.1.0/tests/integration/test_linkfile_fs_effects.py +0 -605
  1152. kanon_cli-2.1.0/tests/integration/test_list_all_versions.py +0 -564
  1153. kanon_cli-2.1.0/tests/integration/test_list_all_versions_canonical.py +0 -559
  1154. kanon_cli-2.1.0/tests/integration/test_list_all_versions_malformed_revision_resilience.py +0 -513
  1155. kanon_cli-2.1.0/tests/integration/test_list_default.py +0 -457
  1156. kanon_cli-2.1.0/tests/integration/test_list_detail.py +0 -525
  1157. kanon_cli-2.1.0/tests/integration/test_list_filter.py +0 -445
  1158. kanon_cli-2.1.0/tests/integration/test_list_format_json.py +0 -587
  1159. kanon_cli-2.1.0/tests/integration/test_list_synthetic_catalog_variants.py +0 -422
  1160. kanon_cli-2.1.0/tests/integration/test_list_tree.py +0 -380
  1161. kanon_cli-2.1.0/tests/integration/test_lockfile_roundtrip.py +0 -252
  1162. kanon_cli-2.1.0/tests/integration/test_marketplace_install.py +0 -441
  1163. kanon_cli-2.1.0/tests/integration/test_marketplace_lifecycle.py +0 -311
  1164. kanon_cli-2.1.0/tests/integration/test_marketplace_orphan_prune.py +0 -385
  1165. kanon_cli-2.1.0/tests/integration/test_midtoken_bash.py +0 -392
  1166. kanon_cli-2.1.0/tests/integration/test_midtoken_zsh.py +0 -424
  1167. kanon_cli-2.1.0/tests/integration/test_misc_features.py +0 -283
  1168. kanon_cli-2.1.0/tests/integration/test_multi_source_aggregation.py +0 -414
  1169. kanon_cli-2.1.0/tests/integration/test_no_bundled_catalog.py +0 -235
  1170. kanon_cli-2.1.0/tests/integration/test_no_default_catalog.py +0 -162
  1171. kanon_cli-2.1.0/tests/integration/test_no_hardcoded_org_values.py +0 -142
  1172. kanon_cli-2.1.0/tests/integration/test_observability.py +0 -515
  1173. kanon_cli-2.1.0/tests/integration/test_outdated.py +0 -480
  1174. kanon_cli-2.1.0/tests/integration/test_outdated_branch_drift.py +0 -493
  1175. kanon_cli-2.1.0/tests/integration/test_outdated_fail_on_upgrade.py +0 -808
  1176. kanon_cli-2.1.0/tests/integration/test_outdated_format_json.py +0 -615
  1177. kanon_cli-2.1.0/tests/integration/test_outdated_refs_tags_revision_parsing.py +0 -200
  1178. kanon_cli-2.1.0/tests/integration/test_platform_parity.py +0 -745
  1179. kanon_cli-2.1.0/tests/integration/test_preamble_bash.py +0 -180
  1180. kanon_cli-2.1.0/tests/integration/test_preamble_zsh.py +0 -202
  1181. kanon_cli-2.1.0/tests/integration/test_remove_core.py +0 -318
  1182. kanon_cli-2.1.0/tests/integration/test_remove_dry_run.py +0 -322
  1183. kanon_cli-2.1.0/tests/integration/test_remove_force_integration.py +0 -121
  1184. kanon_cli-2.1.0/tests/integration/test_signal_handling.py +0 -472
  1185. kanon_cli-2.1.0/tests/integration/test_synthetic_drift_fixture.py +0 -113
  1186. kanon_cli-2.1.0/tests/integration/test_synthetic_upgrade_versioned_fixture.py +0 -155
  1187. kanon_cli-2.1.0/tests/integration/test_unicode_encoding.py +0 -542
  1188. kanon_cli-2.1.0/tests/integration/test_validate_marketplace.py +0 -244
  1189. kanon_cli-2.1.0/tests/integration/test_validate_metadata.py +0 -311
  1190. kanon_cli-2.1.0/tests/integration/test_validate_xml.py +0 -156
  1191. kanon_cli-2.1.0/tests/integration/test_version_resolution.py +0 -216
  1192. kanon_cli-2.1.0/tests/integration/test_version_widened_bare_pep440.py +0 -159
  1193. kanon_cli-2.1.0/tests/integration/test_wheel_e2e.py +0 -483
  1194. kanon_cli-2.1.0/tests/integration/test_why_ambiguous.py +0 -394
  1195. kanon_cli-2.1.0/tests/integration/test_why_chain_walker.py +0 -331
  1196. kanon_cli-2.1.0/tests/integration/test_why_format_json.py +0 -555
  1197. kanon_cli-2.1.0/tests/integration/test_why_live_resolve.py +0 -1537
  1198. kanon_cli-2.1.0/tests/integration/test_why_not_found_suggestion.py +0 -248
  1199. kanon_cli-2.1.0/tests/integration/test_workspace_dir_env.py +0 -327
  1200. kanon_cli-2.1.0/tests/regression/test_e0_f1_s2_t5_regression.py +0 -622
  1201. kanon_cli-2.1.0/tests/regression/test_e0_f5_s2_t7_regression.py +0 -508
  1202. kanon_cli-2.1.0/tests/regression/test_e0_f6_s1_t1_regression.py +0 -251
  1203. kanon_cli-2.1.0/tests/regression/test_e0_f6_s1_t2_regression.py +0 -454
  1204. kanon_cli-2.1.0/tests/regression/test_e0_f6_s1_t3_regression.py +0 -484
  1205. kanon_cli-2.1.0/tests/regression/test_e0_f6_s1_t4_regression.py +0 -505
  1206. kanon_cli-2.1.0/tests/regression/test_e0_f6_s2_t1_regression.py +0 -297
  1207. kanon_cli-2.1.0/tests/regression/test_e0_f6_s2_t2_regression.py +0 -471
  1208. kanon_cli-2.1.0/tests/regression/test_e0_f6_s2_t3_regression.py +0 -443
  1209. kanon_cli-2.1.0/tests/regression/test_e0_f6_s2_t4_regression.py +0 -459
  1210. kanon_cli-2.1.0/tests/regression/test_e0_f6_s2_t5_regression.py +0 -465
  1211. kanon_cli-2.1.0/tests/regression/test_e0_f6_s2_t6_regression.py +0 -359
  1212. kanon_cli-2.1.0/tests/regression/test_e0_f6_s3_t1_regression.py +0 -640
  1213. kanon_cli-2.1.0/tests/regression/test_e0_f6_s3_t2_regression.py +0 -518
  1214. kanon_cli-2.1.0/tests/regression/test_e0_install_relative_regression.py +0 -517
  1215. kanon_cli-2.1.0/tests/scenarios/conftest.py +0 -421
  1216. kanon_cli-2.1.0/tests/scenarios/test_ad.py +0 -306
  1217. kanon_cli-2.1.0/tests/scenarios/test_bs.py +0 -89
  1218. kanon_cli-2.1.0/tests/scenarios/test_cd.py +0 -191
  1219. kanon_cli-2.1.0/tests/scenarios/test_cs.py +0 -219
  1220. kanon_cli-2.1.0/tests/scenarios/test_doctor_cache.py +0 -151
  1221. kanon_cli-2.1.0/tests/scenarios/test_ec.py +0 -124
  1222. kanon_cli-2.1.0/tests/scenarios/test_ep.py +0 -39
  1223. kanon_cli-2.1.0/tests/scenarios/test_ev.py +0 -204
  1224. kanon_cli-2.1.0/tests/scenarios/test_hv.py +0 -78
  1225. kanon_cli-2.1.0/tests/scenarios/test_ic.py +0 -279
  1226. kanon_cli-2.1.0/tests/scenarios/test_id.py +0 -189
  1227. kanon_cli-2.1.0/tests/scenarios/test_ks.py +0 -467
  1228. kanon_cli-2.1.0/tests/scenarios/test_lf.py +0 -145
  1229. kanon_cli-2.1.0/tests/scenarios/test_lockfile_lifecycle.py +0 -831
  1230. kanon_cli-2.1.0/tests/scenarios/test_marketplace_direct_checkout.py +0 -420
  1231. kanon_cli-2.1.0/tests/scenarios/test_mk.py +0 -966
  1232. kanon_cli-2.1.0/tests/scenarios/test_ms.py +0 -145
  1233. kanon_cli-2.1.0/tests/scenarios/test_pk.py +0 -632
  1234. kanon_cli-2.1.0/tests/scenarios/test_rc.py +0 -161
  1235. kanon_cli-2.1.0/tests/scenarios/test_refresh_lock_existing_checkout.py +0 -413
  1236. kanon_cli-2.1.0/tests/scenarios/test_rls_exact_vs_range.py +0 -498
  1237. kanon_cli-2.1.0/tests/scenarios/test_rp_branches.py +0 -119
  1238. kanon_cli-2.1.0/tests/scenarios/test_rp_cherry_pick.py +0 -109
  1239. kanon_cli-2.1.0/tests/scenarios/test_rp_diff.py +0 -112
  1240. kanon_cli-2.1.0/tests/scenarios/test_rp_diffmanifests.py +0 -161
  1241. kanon_cli-2.1.0/tests/scenarios/test_rp_forall.py +0 -137
  1242. kanon_cli-2.1.0/tests/scenarios/test_rp_info.py +0 -145
  1243. kanon_cli-2.1.0/tests/scenarios/test_rp_init.py +0 -435
  1244. kanon_cli-2.1.0/tests/scenarios/test_rp_list.py +0 -173
  1245. kanon_cli-2.1.0/tests/scenarios/test_rp_manifest.py +0 -215
  1246. kanon_cli-2.1.0/tests/scenarios/test_rp_overview.py +0 -106
  1247. kanon_cli-2.1.0/tests/scenarios/test_rp_rebase.py +0 -162
  1248. kanon_cli-2.1.0/tests/scenarios/test_rp_status.py +0 -134
  1249. kanon_cli-2.1.0/tests/scenarios/test_rp_sync.py +0 -401
  1250. kanon_cli-2.1.0/tests/scenarios/test_rx.py +0 -277
  1251. kanon_cli-2.1.0/tests/scenarios/test_scenario_coverage_meta.py +0 -89
  1252. kanon_cli-2.1.0/tests/scenarios/test_tc_bootstrap.py +0 -122
  1253. kanon_cli-2.1.0/tests/scenarios/test_tc_clean.py +0 -347
  1254. kanon_cli-2.1.0/tests/scenarios/test_tc_install.py +0 -249
  1255. kanon_cli-2.1.0/tests/scenarios/test_tc_validate.py +0 -180
  1256. kanon_cli-2.1.0/tests/scenarios/test_uj.py +0 -734
  1257. kanon_cli-2.1.0/tests/scenarios/test_va.py +0 -167
  1258. kanon_cli-2.1.0/tests/scenarios/test_why_surface_query.py +0 -395
  1259. kanon_cli-2.1.0/tests/scenarios/test_why_url_path.py +0 -294
  1260. kanon_cli-2.1.0/tests/scenarios/test_why_url_path_placeholder.py +0 -481
  1261. kanon_cli-2.1.0/tests/security/test_security_hardening.py +0 -301
  1262. kanon_cli-2.1.0/tests/test_wheel_layout.py +0 -228
  1263. kanon_cli-2.1.0/tests/unit/conftest.py +0 -72
  1264. kanon_cli-2.1.0/tests/unit/repo/conftest.py +0 -231
  1265. kanon_cli-2.1.0/tests/unit/repo/functional/test_features.py +0 -265
  1266. kanon_cli-2.1.0/tests/unit/repo/subcmds/test_init_mirror.py +0 -195
  1267. kanon_cli-2.1.0/tests/unit/repo/subcmds/test_manifest_revision_as_tag.py +0 -294
  1268. kanon_cli-2.1.0/tests/unit/repo/subcmds/test_manifest_revision_as_tag_pep440.py +0 -154
  1269. kanon_cli-2.1.0/tests/unit/repo/subcmds/test_selfupdate_stub.py +0 -230
  1270. kanon_cli-2.1.0/tests/unit/repo/test_abandon_massive.py +0 -352
  1271. kanon_cli-2.1.0/tests/unit/repo/test_branches_coverage.py +0 -408
  1272. kanon_cli-2.1.0/tests/unit/repo/test_bug10_selfupdate_incompatible.py +0 -283
  1273. kanon_cli-2.1.0/tests/unit/repo/test_bug11_race_condition.py +0 -176
  1274. kanon_cli-2.1.0/tests/unit/repo/test_bug12_backup_preserved.py +0 -91
  1275. kanon_cli-2.1.0/tests/unit/repo/test_bug13_init_reinit_warning.py +0 -201
  1276. kanon_cli-2.1.0/tests/unit/repo/test_bug14_non_tty_log.py +0 -176
  1277. kanon_cli-2.1.0/tests/unit/repo/test_bug15_prerelease_docs.py +0 -89
  1278. kanon_cli-2.1.0/tests/unit/repo/test_bug16_nested_var_warning.py +0 -219
  1279. kanon_cli-2.1.0/tests/unit/repo/test_bug18_envsubst_double_parse.py +0 -151
  1280. kanon_cli-2.1.0/tests/unit/repo/test_bug19_glob_src_error.py +0 -125
  1281. kanon_cli-2.1.0/tests/unit/repo/test_bug1_envsubst_malformed_xml.py +0 -219
  1282. kanon_cli-2.1.0/tests/unit/repo/test_bug20_glob_dest_file.py +0 -185
  1283. kanon_cli-2.1.0/tests/unit/repo/test_bug2_linkfile_errors.py +0 -255
  1284. kanon_cli-2.1.0/tests/unit/repo/test_bug3_execv_replaces_process.py +0 -341
  1285. kanon_cli-2.1.0/tests/unit/repo/test_bug4_symlink_overwrite.py +0 -303
  1286. kanon_cli-2.1.0/tests/unit/repo/test_bug5_empty_envsubst_list.py +0 -101
  1287. kanon_cli-2.1.0/tests/unit/repo/test_bug6_undefined_env_vars.py +0 -382
  1288. kanon_cli-2.1.0/tests/unit/repo/test_bug7_git_ls_remote_retry.py +0 -420
  1289. kanon_cli-2.1.0/tests/unit/repo/test_bug8_ls_remote_stderr.py +0 -188
  1290. kanon_cli-2.1.0/tests/unit/repo/test_bug9_constraint_resolution_cache.py +0 -225
  1291. kanon_cli-2.1.0/tests/unit/repo/test_checklocalpath_rules_1_5.py +0 -220
  1292. kanon_cli-2.1.0/tests/unit/repo/test_checklocalpath_rules_6_11.py +0 -341
  1293. kanon_cli-2.1.0/tests/unit/repo/test_checkout_massive.py +0 -345
  1294. kanon_cli-2.1.0/tests/unit/repo/test_cherrypick_coverage.py +0 -309
  1295. kanon_cli-2.1.0/tests/unit/repo/test_color.py +0 -460
  1296. kanon_cli-2.1.0/tests/unit/repo/test_command.py +0 -1115
  1297. kanon_cli-2.1.0/tests/unit/repo/test_diffmanifests_deep.py +0 -509
  1298. kanon_cli-2.1.0/tests/unit/repo/test_doc_validate_git_preconditions.py +0 -336
  1299. kanon_cli-2.1.0/tests/unit/repo/test_download_coverage.py +0 -62
  1300. kanon_cli-2.1.0/tests/unit/repo/test_editor.py +0 -297
  1301. kanon_cli-2.1.0/tests/unit/repo/test_embedded_mode.py +0 -292
  1302. kanon_cli-2.1.0/tests/unit/repo/test_envsubst_basic.py +0 -324
  1303. kanon_cli-2.1.0/tests/unit/repo/test_envsubst_edge.py +0 -678
  1304. kanon_cli-2.1.0/tests/unit/repo/test_envsubst_massive.py +0 -228
  1305. kanon_cli-2.1.0/tests/unit/repo/test_error.py +0 -355
  1306. kanon_cli-2.1.0/tests/unit/repo/test_event_log.py +0 -280
  1307. kanon_cli-2.1.0/tests/unit/repo/test_event_log_massive.py +0 -263
  1308. kanon_cli-2.1.0/tests/unit/repo/test_fetch.py +0 -120
  1309. kanon_cli-2.1.0/tests/unit/repo/test_forall_deep.py +0 -628
  1310. kanon_cli-2.1.0/tests/unit/repo/test_git_command.py +0 -603
  1311. kanon_cli-2.1.0/tests/unit/repo/test_git_config.py +0 -588
  1312. kanon_cli-2.1.0/tests/unit/repo/test_git_refs.py +0 -542
  1313. kanon_cli-2.1.0/tests/unit/repo/test_git_superproject.py +0 -661
  1314. kanon_cli-2.1.0/tests/unit/repo/test_git_trace2_event_log.py +0 -762
  1315. kanon_cli-2.1.0/tests/unit/repo/test_gitconfig_coverage.py +0 -419
  1316. kanon_cli-2.1.0/tests/unit/repo/test_grep_deep.py +0 -421
  1317. kanon_cli-2.1.0/tests/unit/repo/test_harness_smoke.py +0 -105
  1318. kanon_cli-2.1.0/tests/unit/repo/test_hooks.py +0 -500
  1319. kanon_cli-2.1.0/tests/unit/repo/test_import_verification.py +0 -140
  1320. kanon_cli-2.1.0/tests/unit/repo/test_include_path_resolution.py +0 -653
  1321. kanon_cli-2.1.0/tests/unit/repo/test_info_deep.py +0 -476
  1322. kanon_cli-2.1.0/tests/unit/repo/test_init_deep.py +0 -342
  1323. kanon_cli-2.1.0/tests/unit/repo/test_list_massive.py +0 -379
  1324. kanon_cli-2.1.0/tests/unit/repo/test_main.py +0 -792
  1325. kanon_cli-2.1.0/tests/unit/repo/test_main_coverage.py +0 -354
  1326. kanon_cli-2.1.0/tests/unit/repo/test_main_init_download_boost.py +0 -1902
  1327. kanon_cli-2.1.0/tests/unit/repo/test_makefile_lint_format.py +0 -90
  1328. kanon_cli-2.1.0/tests/unit/repo/test_makefile_structure.py +0 -196
  1329. kanon_cli-2.1.0/tests/unit/repo/test_makefile_test_targets.py +0 -148
  1330. kanon_cli-2.1.0/tests/unit/repo/test_manifest_coverage_boost.py +0 -2391
  1331. kanon_cli-2.1.0/tests/unit/repo/test_manifest_deep.py +0 -1611
  1332. kanon_cli-2.1.0/tests/unit/repo/test_manifest_doc_rp_flags.py +0 -193
  1333. kanon_cli-2.1.0/tests/unit/repo/test_manifest_massive.py +0 -869
  1334. kanon_cli-2.1.0/tests/unit/repo/test_manifest_subcmd_massive.py +0 -385
  1335. kanon_cli-2.1.0/tests/unit/repo/test_manifest_xml.py +0 -2743
  1336. kanon_cli-2.1.0/tests/unit/repo/test_manifest_xml_pep440.py +0 -222
  1337. kanon_cli-2.1.0/tests/unit/repo/test_medium_files_boost.py +0 -1590
  1338. kanon_cli-2.1.0/tests/unit/repo/test_mkdtemp_cleanup.py +0 -137
  1339. kanon_cli-2.1.0/tests/unit/repo/test_overview_massive.py +0 -340
  1340. kanon_cli-2.1.0/tests/unit/repo/test_pager.py +0 -396
  1341. kanon_cli-2.1.0/tests/unit/repo/test_parselist.py +0 -238
  1342. kanon_cli-2.1.0/tests/unit/repo/test_pep440_edge_1.py +0 -396
  1343. kanon_cli-2.1.0/tests/unit/repo/test_pep440_edge_2.py +0 -386
  1344. kanon_cli-2.1.0/tests/unit/repo/test_pep440_ops_ge.py +0 -215
  1345. kanon_cli-2.1.0/tests/unit/repo/test_pep440_ops_rest.py +0 -483
  1346. kanon_cli-2.1.0/tests/unit/repo/test_platform_utils.py +0 -431
  1347. kanon_cli-2.1.0/tests/unit/repo/test_process_isolation.py +0 -209
  1348. kanon_cli-2.1.0/tests/unit/repo/test_progress.py +0 -548
  1349. kanon_cli-2.1.0/tests/unit/repo/test_project.py +0 -2459
  1350. kanon_cli-2.1.0/tests/unit/repo/test_project_coverage_boost.py +0 -1747
  1351. kanon_cli-2.1.0/tests/unit/repo/test_project_coverage_threshold.py +0 -3087
  1352. kanon_cli-2.1.0/tests/unit/repo/test_project_deep.py +0 -1119
  1353. kanon_cli-2.1.0/tests/unit/repo/test_project_deep_boost.py +0 -1074
  1354. kanon_cli-2.1.0/tests/unit/repo/test_project_integration.py +0 -932
  1355. kanon_cli-2.1.0/tests/unit/repo/test_project_massive.py +0 -1190
  1356. kanon_cli-2.1.0/tests/unit/repo/test_project_metaproject_boost.py +0 -1360
  1357. kanon_cli-2.1.0/tests/unit/repo/test_project_methods.py +0 -667
  1358. kanon_cli-2.1.0/tests/unit/repo/test_project_sync.py +0 -206
  1359. kanon_cli-2.1.0/tests/unit/repo/test_prune_massive.py +0 -352
  1360. kanon_cli-2.1.0/tests/unit/repo/test_rebase_coverage.py +0 -459
  1361. kanon_cli-2.1.0/tests/unit/repo/test_remaining_coverage_boost.py +0 -1426
  1362. kanon_cli-2.1.0/tests/unit/repo/test_repo_envsubst_api.py +0 -418
  1363. kanon_cli-2.1.0/tests/unit/repo/test_repo_logging.py +0 -288
  1364. kanon_cli-2.1.0/tests/unit/repo/test_repo_run_api.py +0 -332
  1365. kanon_cli-2.1.0/tests/unit/repo/test_repo_sync_api.py +0 -510
  1366. kanon_cli-2.1.0/tests/unit/repo/test_repo_trace.py +0 -360
  1367. kanon_cli-2.1.0/tests/unit/repo/test_revision_inheritance.py +0 -386
  1368. kanon_cli-2.1.0/tests/unit/repo/test_revision_tag_branch_sha.py +0 -285
  1369. kanon_cli-2.1.0/tests/unit/repo/test_selfupdate_embedded.py +0 -243
  1370. kanon_cli-2.1.0/tests/unit/repo/test_selfupdate_massive.py +0 -239
  1371. kanon_cli-2.1.0/tests/unit/repo/test_small_files_boost.py +0 -1733
  1372. kanon_cli-2.1.0/tests/unit/repo/test_ssh.py +0 -401
  1373. kanon_cli-2.1.0/tests/unit/repo/test_ssh_deep.py +0 -421
  1374. kanon_cli-2.1.0/tests/unit/repo/test_stage_coverage.py +0 -308
  1375. kanon_cli-2.1.0/tests/unit/repo/test_stage_massive.py +0 -338
  1376. kanon_cli-2.1.0/tests/unit/repo/test_start_coverage.py +0 -282
  1377. kanon_cli-2.1.0/tests/unit/repo/test_status_coverage.py +0 -263
  1378. kanon_cli-2.1.0/tests/unit/repo/test_status_massive.py +0 -264
  1379. kanon_cli-2.1.0/tests/unit/repo/test_subcmd_imports.py +0 -128
  1380. kanon_cli-2.1.0/tests/unit/repo/test_subcmds.py +0 -137
  1381. kanon_cli-2.1.0/tests/unit/repo/test_subcmds_abandon.py +0 -134
  1382. kanon_cli-2.1.0/tests/unit/repo/test_subcmds_branches.py +0 -101
  1383. kanon_cli-2.1.0/tests/unit/repo/test_subcmds_checkout.py +0 -113
  1384. kanon_cli-2.1.0/tests/unit/repo/test_subcmds_cherry_pick.py +0 -45
  1385. kanon_cli-2.1.0/tests/unit/repo/test_subcmds_diff.py +0 -65
  1386. kanon_cli-2.1.0/tests/unit/repo/test_subcmds_diffmanifests.py +0 -80
  1387. kanon_cli-2.1.0/tests/unit/repo/test_subcmds_download.py +0 -87
  1388. kanon_cli-2.1.0/tests/unit/repo/test_subcmds_envsubst.py +0 -299
  1389. kanon_cli-2.1.0/tests/unit/repo/test_subcmds_forall.py +0 -341
  1390. kanon_cli-2.1.0/tests/unit/repo/test_subcmds_gc.py +0 -336
  1391. kanon_cli-2.1.0/tests/unit/repo/test_subcmds_grep.py +0 -328
  1392. kanon_cli-2.1.0/tests/unit/repo/test_subcmds_help.py +0 -131
  1393. kanon_cli-2.1.0/tests/unit/repo/test_subcmds_info.py +0 -217
  1394. kanon_cli-2.1.0/tests/unit/repo/test_subcmds_init.py +0 -373
  1395. kanon_cli-2.1.0/tests/unit/repo/test_subcmds_list.py +0 -45
  1396. kanon_cli-2.1.0/tests/unit/repo/test_subcmds_manifest.py +0 -210
  1397. kanon_cli-2.1.0/tests/unit/repo/test_subcmds_overview.py +0 -45
  1398. kanon_cli-2.1.0/tests/unit/repo/test_subcmds_prune.py +0 -45
  1399. kanon_cli-2.1.0/tests/unit/repo/test_subcmds_rebase.py +0 -54
  1400. kanon_cli-2.1.0/tests/unit/repo/test_subcmds_selfupdate.py +0 -45
  1401. kanon_cli-2.1.0/tests/unit/repo/test_subcmds_smartsync.py +0 -45
  1402. kanon_cli-2.1.0/tests/unit/repo/test_subcmds_stage.py +0 -41
  1403. kanon_cli-2.1.0/tests/unit/repo/test_subcmds_start.py +0 -45
  1404. kanon_cli-2.1.0/tests/unit/repo/test_subcmds_status.py +0 -45
  1405. kanon_cli-2.1.0/tests/unit/repo/test_subcmds_sync.py +0 -1799
  1406. kanon_cli-2.1.0/tests/unit/repo/test_subcmds_upload.py +0 -347
  1407. kanon_cli-2.1.0/tests/unit/repo/test_superproject_deep.py +0 -930
  1408. kanon_cli-2.1.0/tests/unit/repo/test_sync_coverage_boost.py +0 -1412
  1409. kanon_cli-2.1.0/tests/unit/repo/test_sync_deep.py +0 -2509
  1410. kanon_cli-2.1.0/tests/unit/repo/test_sync_deep_boost.py +0 -1193
  1411. kanon_cli-2.1.0/tests/unit/repo/test_sync_massive.py +0 -734
  1412. kanon_cli-2.1.0/tests/unit/repo/test_upload_deep.py +0 -927
  1413. kanon_cli-2.1.0/tests/unit/repo/test_version_consolidation.py +0 -464
  1414. kanon_cli-2.1.0/tests/unit/repo/test_version_constraints.py +0 -246
  1415. kanon_cli-2.1.0/tests/unit/repo/test_wheel_contents.py +0 -376
  1416. kanon_cli-2.1.0/tests/unit/repo/test_wrapper.py +0 -565
  1417. kanon_cli-2.1.0/tests/unit/repo/test_xml_annotation_attributes.py +0 -715
  1418. kanon_cli-2.1.0/tests/unit/repo/test_xml_annotation_crossref.py +0 -1151
  1419. kanon_cli-2.1.0/tests/unit/repo/test_xml_annotation_happy.py +0 -703
  1420. kanon_cli-2.1.0/tests/unit/repo/test_xml_contactinfo_attributes.py +0 -443
  1421. kanon_cli-2.1.0/tests/unit/repo/test_xml_contactinfo_crossref.py +0 -986
  1422. kanon_cli-2.1.0/tests/unit/repo/test_xml_contactinfo_happy.py +0 -566
  1423. kanon_cli-2.1.0/tests/unit/repo/test_xml_copyfile_attributes.py +0 -647
  1424. kanon_cli-2.1.0/tests/unit/repo/test_xml_copyfile_crossref.py +0 -999
  1425. kanon_cli-2.1.0/tests/unit/repo/test_xml_copyfile_happy.py +0 -680
  1426. kanon_cli-2.1.0/tests/unit/repo/test_xml_default_attributes.py +0 -1118
  1427. kanon_cli-2.1.0/tests/unit/repo/test_xml_default_crossref.py +0 -1040
  1428. kanon_cli-2.1.0/tests/unit/repo/test_xml_default_happy.py +0 -770
  1429. kanon_cli-2.1.0/tests/unit/repo/test_xml_extend_project_attributes.py +0 -766
  1430. kanon_cli-2.1.0/tests/unit/repo/test_xml_extend_project_crossref.py +0 -991
  1431. kanon_cli-2.1.0/tests/unit/repo/test_xml_extend_project_happy.py +0 -758
  1432. kanon_cli-2.1.0/tests/unit/repo/test_xml_fault_malformed.py +0 -551
  1433. kanon_cli-2.1.0/tests/unit/repo/test_xml_fault_structural.py +0 -626
  1434. kanon_cli-2.1.0/tests/unit/repo/test_xml_include_attributes.py +0 -749
  1435. kanon_cli-2.1.0/tests/unit/repo/test_xml_include_crossref.py +0 -1192
  1436. kanon_cli-2.1.0/tests/unit/repo/test_xml_include_cycles.py +0 -1007
  1437. kanon_cli-2.1.0/tests/unit/repo/test_xml_include_happy.py +0 -770
  1438. kanon_cli-2.1.0/tests/unit/repo/test_xml_linkfile_attributes.py +0 -762
  1439. kanon_cli-2.1.0/tests/unit/repo/test_xml_linkfile_crossref.py +0 -1003
  1440. kanon_cli-2.1.0/tests/unit/repo/test_xml_linkfile_happy.py +0 -782
  1441. kanon_cli-2.1.0/tests/unit/repo/test_xml_manifest_attributes.py +0 -1116
  1442. kanon_cli-2.1.0/tests/unit/repo/test_xml_manifest_crossref.py +0 -847
  1443. kanon_cli-2.1.0/tests/unit/repo/test_xml_manifest_happy.py +0 -807
  1444. kanon_cli-2.1.0/tests/unit/repo/test_xml_manifest_server_attributes.py +0 -843
  1445. kanon_cli-2.1.0/tests/unit/repo/test_xml_manifest_server_crossref.py +0 -1031
  1446. kanon_cli-2.1.0/tests/unit/repo/test_xml_manifest_server_flow.py +0 -709
  1447. kanon_cli-2.1.0/tests/unit/repo/test_xml_manifest_server_happy.py +0 -639
  1448. kanon_cli-2.1.0/tests/unit/repo/test_xml_notice_attributes.py +0 -660
  1449. kanon_cli-2.1.0/tests/unit/repo/test_xml_notice_crossref.py +0 -924
  1450. kanon_cli-2.1.0/tests/unit/repo/test_xml_notice_happy.py +0 -581
  1451. kanon_cli-2.1.0/tests/unit/repo/test_xml_project_attributes.py +0 -1221
  1452. kanon_cli-2.1.0/tests/unit/repo/test_xml_project_crossref.py +0 -985
  1453. kanon_cli-2.1.0/tests/unit/repo/test_xml_project_happy.py +0 -980
  1454. kanon_cli-2.1.0/tests/unit/repo/test_xml_remote_attributes.py +0 -973
  1455. kanon_cli-2.1.0/tests/unit/repo/test_xml_remote_crossref.py +0 -1027
  1456. kanon_cli-2.1.0/tests/unit/repo/test_xml_remote_happy.py +0 -827
  1457. kanon_cli-2.1.0/tests/unit/repo/test_xml_remove_project_attributes.py +0 -873
  1458. kanon_cli-2.1.0/tests/unit/repo/test_xml_remove_project_crossref.py +0 -1180
  1459. kanon_cli-2.1.0/tests/unit/repo/test_xml_remove_project_happy.py +0 -700
  1460. kanon_cli-2.1.0/tests/unit/repo/test_xml_repo_hooks_attributes.py +0 -520
  1461. kanon_cli-2.1.0/tests/unit/repo/test_xml_repo_hooks_crossref.py +0 -850
  1462. kanon_cli-2.1.0/tests/unit/repo/test_xml_repo_hooks_happy.py +0 -659
  1463. kanon_cli-2.1.0/tests/unit/repo/test_xml_submanifest_attributes.py +0 -923
  1464. kanon_cli-2.1.0/tests/unit/repo/test_xml_submanifest_crossref.py +0 -1070
  1465. kanon_cli-2.1.0/tests/unit/repo/test_xml_submanifest_happy.py +0 -700
  1466. kanon_cli-2.1.0/tests/unit/repo/test_xml_superproject_attributes.py +0 -616
  1467. kanon_cli-2.1.0/tests/unit/repo/test_xml_superproject_crossref.py +0 -867
  1468. kanon_cli-2.1.0/tests/unit/repo/test_xml_superproject_flow.py +0 -874
  1469. kanon_cli-2.1.0/tests/unit/repo/test_xml_superproject_happy.py +0 -675
  1470. kanon_cli-2.1.0/tests/unit/repo/test_xmlbool.py +0 -194
  1471. kanon_cli-2.1.0/tests/unit/repo/test_xmlint.py +0 -541
  1472. kanon_cli-2.1.0/tests/unit/test_accessed_at_coalescing.py +0 -167
  1473. kanon_cli-2.1.0/tests/unit/test_add.py +0 -1861
  1474. kanon_cli-2.1.0/tests/unit/test_add_collision.py +0 -973
  1475. kanon_cli-2.1.0/tests/unit/test_add_zero_tags.py +0 -146
  1476. kanon_cli-2.1.0/tests/unit/test_background_refresh.py +0 -354
  1477. kanon_cli-2.1.0/tests/unit/test_bare_semver_to_tag.py +0 -87
  1478. kanon_cli-2.1.0/tests/unit/test_bootstrap_deprecation.py +0 -110
  1479. kanon_cli-2.1.0/tests/unit/test_cache.py +0 -297
  1480. kanon_cli-2.1.0/tests/unit/test_cache_layout.py +0 -409
  1481. kanon_cli-2.1.0/tests/unit/test_cache_ttl.py +0 -188
  1482. kanon_cli-2.1.0/tests/unit/test_catalog.py +0 -389
  1483. kanon_cli-2.1.0/tests/unit/test_catalog_audit_entry_uniqueness.py +0 -445
  1484. kanon_cli-2.1.0/tests/unit/test_catalog_audit_framework.py +0 -650
  1485. kanon_cli-2.1.0/tests/unit/test_catalog_audit_legacy_dir.py +0 -311
  1486. kanon_cli-2.1.0/tests/unit/test_catalog_audit_metadata.py +0 -661
  1487. kanon_cli-2.1.0/tests/unit/test_catalog_audit_project_tag_format.py +0 -523
  1488. kanon_cli-2.1.0/tests/unit/test_catalog_audit_remote_url.py +0 -582
  1489. kanon_cli-2.1.0/tests/unit/test_catalog_audit_source_name.py +0 -493
  1490. kanon_cli-2.1.0/tests/unit/test_catalog_audit_strict.py +0 -304
  1491. kanon_cli-2.1.0/tests/unit/test_catalog_audit_tag_format.py +0 -708
  1492. kanon_cli-2.1.0/tests/unit/test_catalog_source_parsing.py +0 -265
  1493. kanon_cli-2.1.0/tests/unit/test_ci_workflows.py +0 -268
  1494. kanon_cli-2.1.0/tests/unit/test_clean.py +0 -513
  1495. kanon_cli-2.1.0/tests/unit/test_clean_command.py +0 -204
  1496. kanon_cli-2.1.0/tests/unit/test_cli.py +0 -1767
  1497. kanon_cli-2.1.0/tests/unit/test_cli_args.py +0 -426
  1498. kanon_cli-2.1.0/tests/unit/test_cli_help_format.py +0 -137
  1499. kanon_cli-2.1.0/tests/unit/test_cli_json_stream_discipline.py +0 -269
  1500. kanon_cli-2.1.0/tests/unit/test_complete_cached_catalogs.py +0 -548
  1501. kanon_cli-2.1.0/tests/unit/test_complete_catalog_entries.py +0 -767
  1502. kanon_cli-2.1.0/tests/unit/test_complete_catalog_versions.py +0 -683
  1503. kanon_cli-2.1.0/tests/unit/test_complete_lockfile_names.py +0 -676
  1504. kanon_cli-2.1.0/tests/unit/test_complete_project_versions.py +0 -823
  1505. kanon_cli-2.1.0/tests/unit/test_complete_source_names.py +0 -399
  1506. kanon_cli-2.1.0/tests/unit/test_completion.py +0 -52
  1507. kanon_cli-2.1.0/tests/unit/test_completion_sanitization.py +0 -192
  1508. kanon_cli-2.1.0/tests/unit/test_completion_subcommand.py +0 -155
  1509. kanon_cli-2.1.0/tests/unit/test_concurrency.py +0 -367
  1510. kanon_cli-2.1.0/tests/unit/test_conftest_scrubber.py +0 -47
  1511. kanon_cli-2.1.0/tests/unit/test_constants.py +0 -2266
  1512. kanon_cli-2.1.0/tests/unit/test_constants_doctor_subcheck.py +0 -164
  1513. kanon_cli-2.1.0/tests/unit/test_constants_install_after_add.py +0 -179
  1514. kanon_cli-2.1.0/tests/unit/test_constants_outdated_refs_tags.py +0 -228
  1515. kanon_cli-2.1.0/tests/unit/test_constants_why_lockfile.py +0 -121
  1516. kanon_cli-2.1.0/tests/unit/test_derive_source_name.py +0 -363
  1517. kanon_cli-2.1.0/tests/unit/test_discover_source_names_missing_url.py +0 -83
  1518. kanon_cli-2.1.0/tests/unit/test_doctor.py +0 -452
  1519. kanon_cli-2.1.0/tests/unit/test_doctor_cache_flags.py +0 -1035
  1520. kanon_cli-2.1.0/tests/unit/test_doctor_completion_errors.py +0 -471
  1521. kanon_cli-2.1.0/tests/unit/test_doctor_completion_staleness.py +0 -476
  1522. kanon_cli-2.1.0/tests/unit/test_doctor_consistency.py +0 -596
  1523. kanon_cli-2.1.0/tests/unit/test_doctor_coverage_gaps.py +0 -881
  1524. kanon_cli-2.1.0/tests/unit/test_doctor_effective_source.py +0 -312
  1525. kanon_cli-2.1.0/tests/unit/test_doctor_remote_reachability.py +0 -1127
  1526. kanon_cli-2.1.0/tests/unit/test_envsubst_subcommand.py +0 -281
  1527. kanon_cli-2.1.0/tests/unit/test_include_walker.py +0 -394
  1528. kanon_cli-2.1.0/tests/unit/test_install.py +0 -937
  1529. kanon_cli-2.1.0/tests/unit/test_install_command.py +0 -369
  1530. kanon_cli-2.1.0/tests/unit/test_install_conflict_detection.py +0 -396
  1531. kanon_cli-2.1.0/tests/unit/test_install_https_enforcement.py +0 -275
  1532. kanon_cli-2.1.0/tests/unit/test_install_reconcile_decision.py +0 -124
  1533. kanon_cli-2.1.0/tests/unit/test_install_refresh_lock.py +0 -426
  1534. kanon_cli-2.1.0/tests/unit/test_install_refresh_lock_source.py +0 -764
  1535. kanon_cli-2.1.0/tests/unit/test_install_state_matrix.py +0 -868
  1536. kanon_cli-2.1.0/tests/unit/test_install_strict_flags.py +0 -937
  1537. kanon_cli-2.1.0/tests/unit/test_install_strict_lock_orphan_naming.py +0 -169
  1538. kanon_cli-2.1.0/tests/unit/test_integration_testing_doc_manifest_paths.py +0 -306
  1539. kanon_cli-2.1.0/tests/unit/test_integration_testing_doc_s2_t14.py +0 -74
  1540. kanon_cli-2.1.0/tests/unit/test_integration_testing_doc_s2_t4.py +0 -78
  1541. kanon_cli-2.1.0/tests/unit/test_integration_testing_doc_s2_t5.py +0 -97
  1542. kanon_cli-2.1.0/tests/unit/test_integration_testing_doc_s2_t6.py +0 -57
  1543. kanon_cli-2.1.0/tests/unit/test_integration_testing_doc_s2_t7.py +0 -60
  1544. kanon_cli-2.1.0/tests/unit/test_integration_testing_doc_s2_tier1.py +0 -229
  1545. kanon_cli-2.1.0/tests/unit/test_kanon_hash.py +0 -733
  1546. kanon_cli-2.1.0/tests/unit/test_kanonenv.py +0 -226
  1547. kanon_cli-2.1.0/tests/unit/test_kanonenv_advanced_edge_cases.py +0 -160
  1548. kanon_cli-2.1.0/tests/unit/test_kanonenv_edge_cases.py +0 -204
  1549. kanon_cli-2.1.0/tests/unit/test_levenshtein.py +0 -102
  1550. kanon_cli-2.1.0/tests/unit/test_list.py +0 -463
  1551. kanon_cli-2.1.0/tests/unit/test_list_all_versions.py +0 -503
  1552. kanon_cli-2.1.0/tests/unit/test_list_coverage_gaps.py +0 -583
  1553. kanon_cli-2.1.0/tests/unit/test_list_detail.py +0 -453
  1554. kanon_cli-2.1.0/tests/unit/test_list_filter.py +0 -961
  1555. kanon_cli-2.1.0/tests/unit/test_list_format_json.py +0 -845
  1556. kanon_cli-2.1.0/tests/unit/test_list_tree.py +0 -1314
  1557. kanon_cli-2.1.0/tests/unit/test_lock_file_path.py +0 -120
  1558. kanon_cli-2.1.0/tests/unit/test_lockfile.py +0 -975
  1559. kanon_cli-2.1.0/tests/unit/test_lockfile_coverage_gaps.py +0 -324
  1560. kanon_cli-2.1.0/tests/unit/test_lockfile_schema_migration.py +0 -353
  1561. kanon_cli-2.1.0/tests/unit/test_manifest.py +0 -489
  1562. kanon_cli-2.1.0/tests/unit/test_marketplace.py +0 -678
  1563. kanon_cli-2.1.0/tests/unit/test_marketplace_non_plugin_skip.py +0 -123
  1564. kanon_cli-2.1.0/tests/unit/test_marketplace_validator.py +0 -212
  1565. kanon_cli-2.1.0/tests/unit/test_metadata.py +0 -676
  1566. kanon_cli-2.1.0/tests/unit/test_midtoken_splitter.py +0 -360
  1567. kanon_cli-2.1.0/tests/unit/test_outdated.py +0 -736
  1568. kanon_cli-2.1.0/tests/unit/test_outdated_branch_pinned.py +0 -803
  1569. kanon_cli-2.1.0/tests/unit/test_outdated_fail_on_upgrade.py +0 -441
  1570. kanon_cli-2.1.0/tests/unit/test_outdated_format_json.py +0 -537
  1571. kanon_cli-2.1.0/tests/unit/test_pep440_filter.py +0 -135
  1572. kanon_cli-2.1.0/tests/unit/test_pre_push_hook.py +0 -296
  1573. kanon_cli-2.1.0/tests/unit/test_preamble.py +0 -125
  1574. kanon_cli-2.1.0/tests/unit/test_preamble_semver_tags.py +0 -138
  1575. kanon_cli-2.1.0/tests/unit/test_provider_agnosticism.py +0 -412
  1576. kanon_cli-2.1.0/tests/unit/test_remote_url.py +0 -271
  1577. kanon_cli-2.1.0/tests/unit/test_remove.py +0 -861
  1578. kanon_cli-2.1.0/tests/unit/test_remove_dry_run.py +0 -320
  1579. kanon_cli-2.1.0/tests/unit/test_remove_force.py +0 -314
  1580. kanon_cli-2.1.0/tests/unit/test_remove_line_endings.py +0 -464
  1581. kanon_cli-2.1.0/tests/unit/test_resolve_catalog_dir.py +0 -68
  1582. kanon_cli-2.1.0/tests/unit/test_revision_resolve.py +0 -190
  1583. kanon_cli-2.1.0/tests/unit/test_rx_catalog_sub_repo.py +0 -250
  1584. kanon_cli-2.1.0/tests/unit/test_sanitize.py +0 -120
  1585. kanon_cli-2.1.0/tests/unit/test_url.py +0 -234
  1586. kanon_cli-2.1.0/tests/unit/test_validate.py +0 -68
  1587. kanon_cli-2.1.0/tests/unit/test_validate_command.py +0 -110
  1588. kanon_cli-2.1.0/tests/unit/test_validate_metadata.py +0 -530
  1589. kanon_cli-2.1.0/tests/unit/test_version.py +0 -667
  1590. kanon_cli-2.1.0/tests/unit/test_why.py +0 -1421
  1591. kanon_cli-2.1.0/tests/unit/test_why_ambiguity.py +0 -769
  1592. kanon_cli-2.1.0/tests/unit/test_why_format_json.py +0 -972
  1593. kanon_cli-2.1.0/tests/unit/test_why_suggestions.py +0 -375
  1594. kanon_cli-2.1.0/uv.lock +0 -610
  1595. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/.claude/settings.json +0 -0
  1596. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/.devcontainer/VERSION +0 -0
  1597. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/.devcontainer/catalog-entry.json +0 -0
  1598. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/.devcontainer/devcontainer-functions.sh +0 -0
  1599. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/.devcontainer/devcontainer.json +0 -0
  1600. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/.devcontainer/nix-family-os/README.md +0 -0
  1601. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/.devcontainer/nix-family-os/tinyproxy-daemon.sh +0 -0
  1602. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/.devcontainer/nix-family-os/tinyproxy.conf.template +0 -0
  1603. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/.devcontainer/postcreate-wrapper.sh +0 -0
  1604. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/.devcontainer/project-setup.sh +0 -0
  1605. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/.devcontainer/wsl-family-os/README.md +0 -0
  1606. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/.devcontainer/wsl-family-os/tinyproxy-daemon.sh +0 -0
  1607. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/.devcontainer/wsl-family-os/tinyproxy.conf.template +0 -0
  1608. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/.github/CODEOWNERS +0 -0
  1609. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/.github/workflows/codeql-analysis.yml +0 -0
  1610. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/.github/workflows/publish.yml +0 -0
  1611. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/.gitignore +0 -0
  1612. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/.tool-versions +0 -0
  1613. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/.yamllint +0 -0
  1614. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/CLAUDE.md +0 -0
  1615. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/LICENSE +0 -0
  1616. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/docs/catalog-format-versioning.md +0 -0
  1617. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/docs/repo/README.md +0 -0
  1618. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/docs/repo/internal-fs-layout.md +0 -0
  1619. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/docs/repo/manifest-format.md +0 -0
  1620. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/docs/repo/python-support.md +0 -0
  1621. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/docs/repo/repo-hooks.md +0 -0
  1622. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/docs/repo/smart-sync.md +0 -0
  1623. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/docs/repo/windows.md +0 -0
  1624. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/git-hooks/pre-commit +0 -0
  1625. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/git-hooks/pre-push +0 -0
  1626. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/link +0 -0
  1627. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/requirements.txt +0 -0
  1628. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/scripts/check_archive_no_duplicates.py +0 -0
  1629. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/__main__.py +0 -0
  1630. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/commands/__init__.py +0 -0
  1631. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/commands/repo.py +0 -0
  1632. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/completions/__init__.py +0 -0
  1633. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/completions/pep440_filter.py +0 -0
  1634. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/completions/sanitize.py +0 -0
  1635. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/core/__init__.py +0 -0
  1636. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/core/discover.py +0 -0
  1637. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/core/xml_validator.py +0 -0
  1638. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/__init__.py +0 -0
  1639. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/color.py +0 -0
  1640. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/command.py +0 -0
  1641. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/editor.py +0 -0
  1642. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/error.py +0 -0
  1643. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/event_log.py +0 -0
  1644. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/fetch.py +0 -0
  1645. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/git_command.py +0 -0
  1646. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/git_config.py +0 -0
  1647. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/git_refs.py +0 -0
  1648. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/git_ssh +0 -0
  1649. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/git_superproject.py +0 -0
  1650. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/git_trace2_event_log.py +0 -0
  1651. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/git_trace2_event_log_base.py +0 -0
  1652. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/hooks/commit-msg +0 -0
  1653. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/hooks/pre-auto-gc +0 -0
  1654. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/hooks.py +0 -0
  1655. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/main.py +0 -0
  1656. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/manifest_xml.py +0 -0
  1657. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/pager.py +0 -0
  1658. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/platform_utils_win32.py +0 -0
  1659. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/progress.py +0 -0
  1660. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/project.py +0 -0
  1661. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/repo +0 -0
  1662. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/repo_logging.py +0 -0
  1663. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/repo_trace.py +0 -0
  1664. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/requirements.jsonc +0 -0
  1665. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/ssh.py +0 -0
  1666. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/subcmds/__init__.py +0 -0
  1667. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/subcmds/abandon.py +0 -0
  1668. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/subcmds/branches.py +0 -0
  1669. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/subcmds/checkout.py +0 -0
  1670. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/subcmds/cherry_pick.py +0 -0
  1671. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/subcmds/diff.py +0 -0
  1672. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/subcmds/diffmanifests.py +0 -0
  1673. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/subcmds/download.py +0 -0
  1674. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/subcmds/envsubst.py +0 -0
  1675. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/subcmds/forall.py +0 -0
  1676. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/subcmds/gc.py +0 -0
  1677. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/subcmds/grep.py +0 -0
  1678. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/subcmds/help.py +0 -0
  1679. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/subcmds/info.py +0 -0
  1680. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/subcmds/init.py +0 -0
  1681. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/subcmds/list.py +0 -0
  1682. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/subcmds/manifest.py +0 -0
  1683. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/subcmds/overview.py +0 -0
  1684. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/subcmds/prune.py +0 -0
  1685. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/subcmds/rebase.py +0 -0
  1686. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/subcmds/selfupdate.py +0 -0
  1687. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/subcmds/smartsync.py +0 -0
  1688. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/subcmds/stage.py +0 -0
  1689. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/subcmds/start.py +0 -0
  1690. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/subcmds/status.py +0 -0
  1691. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/subcmds/sync.py +0 -0
  1692. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/subcmds/upload.py +0 -0
  1693. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/version_constraints.py +0 -0
  1694. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/repo/wrapper.py +0 -0
  1695. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/src/kanon_cli/utils/__init__.py +0 -0
  1696. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/__init__.py +0 -0
  1697. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/fixtures/catalog/broken-soft-spot-1/repo-specs/duplicate-child-marketplace.xml +0 -0
  1698. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/fixtures/catalog/broken-soft-spot-1/repo-specs/missing-recommended-marketplace.xml +0 -0
  1699. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/fixtures/catalog/broken-soft-spot-1/repo-specs/missing-required-marketplace.xml +0 -0
  1700. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/fixtures/catalog/broken-soft-spot-1/repo-specs/multiple-blocks-marketplace.xml +0 -0
  1701. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/fixtures/catalog/broken-soft-spot-2/repo-specs/dotted-name-marketplace.xml +0 -0
  1702. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/fixtures/catalog/broken-soft-spot-2/repo-specs/hyphenated-name-marketplace.xml +0 -0
  1703. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/fixtures/catalog/broken-soft-spot-2/repo-specs/uppercase-name-marketplace.xml +0 -0
  1704. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/fixtures/catalog/broken-soft-spot-3/repo-specs/group-a-1-marketplace.xml +0 -0
  1705. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/fixtures/catalog/broken-soft-spot-3/repo-specs/group-a-2-marketplace.xml +0 -0
  1706. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/fixtures/catalog/broken-soft-spot-3/repo-specs/group-b-1-marketplace.xml +0 -0
  1707. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/fixtures/catalog/broken-soft-spot-3/repo-specs/group-b-2-marketplace.xml +0 -0
  1708. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/fixtures/catalog/broken-soft-spot-4/repo-specs/file-url-marketplace.xml +0 -0
  1709. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/fixtures/catalog/broken-soft-spot-4/repo-specs/query-string-marketplace.xml +0 -0
  1710. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/fixtures/catalog/broken-soft-spot-4/repo-specs/unresolvable-marketplace.xml +0 -0
  1711. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/fixtures/catalog/legacy-catalog-dir/catalog/sample-entry/.kanon +0 -0
  1712. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/fixtures/catalog/legacy-catalog-dir/repo-specs/sample.xml +0 -0
  1713. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/fixtures/catalogs/zero-pep440-tags/README.md +0 -0
  1714. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/fixtures/catalogs/zero-pep440-tags/repo-specs/entry-a/entry-a-marketplace.xml +0 -0
  1715. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/fixtures/errors/conflict-detected.txt +0 -0
  1716. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/fixtures/errors/lockfile-hash-mismatch.txt +0 -0
  1717. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/fixtures/errors/lockfile-sha-unreachable.txt +0 -0
  1718. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/fixtures/errors/missing-required-metadata-field.txt +0 -0
  1719. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/fixtures/errors/zero-pep440-tags-under-prefix.txt +0 -0
  1720. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/fixtures/help/kanon-catalog.txt +0 -0
  1721. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/fixtures/repo/.gitignore +0 -0
  1722. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/fixtures/repo/README.md +0 -0
  1723. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/fixtures/repo/linter-test-bad.invalid-yaml +0 -0
  1724. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/fixtures/repo/sample-manifest.xml +0 -0
  1725. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/fixtures/repo/sample-project-config.json +0 -0
  1726. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/fixtures/repo/test.gitconfig +0 -0
  1727. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/fixtures/repo/version_constraints_data.json +0 -0
  1728. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/functional/__init__.py +0 -0
  1729. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/integration/__init__.py +0 -0
  1730. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/integration/fixtures/__init__.py +0 -0
  1731. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/integration/fixtures/synthetic/__init__.py +0 -0
  1732. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/integration/fixtures/synthetic/conftest.py +0 -0
  1733. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/integration/fixtures/synthetic/drift.py +0 -0
  1734. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/integration/provider_allowlist.txt +0 -0
  1735. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/integration/repo/__init__.py +0 -0
  1736. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/integration/test_catalog_audit_framework.py +0 -0
  1737. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/integration/test_ci_validation.py +0 -0
  1738. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/integration/test_clean_paths.py +0 -0
  1739. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/integration/test_completion_subcommand.py +0 -0
  1740. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/integration/test_install_no_kanon_remediation.py +0 -0
  1741. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/integration/test_install_paths.py +0 -0
  1742. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/scenarios/__init__.py +0 -0
  1743. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/scenarios/_rp_helpers.py +0 -0
  1744. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/scenarios/test_rp_abandon.py +0 -0
  1745. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/scenarios/test_rp_checkout.py +0 -0
  1746. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/scenarios/test_rp_download.py +0 -0
  1747. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/scenarios/test_rp_envsubst.py +0 -0
  1748. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/scenarios/test_rp_gc.py +0 -0
  1749. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/scenarios/test_rp_grep.py +0 -0
  1750. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/scenarios/test_rp_help.py +0 -0
  1751. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/scenarios/test_rp_prune.py +0 -0
  1752. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/scenarios/test_rp_smartsync.py +0 -0
  1753. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/scenarios/test_rp_stage.py +0 -0
  1754. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/scenarios/test_rp_start.py +0 -0
  1755. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/scenarios/test_rp_upload.py +0 -0
  1756. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/scenarios/test_rp_wrap.py +0 -0
  1757. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/security/__init__.py +0 -0
  1758. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/unit/__init__.py +0 -0
  1759. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/unit/commands/test_repo_dir_resolution.py +0 -0
  1760. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/unit/repo/__init__.py +0 -0
  1761. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/unit/repo/fixtures/.gitignore +0 -0
  1762. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/unit/repo/fixtures/README.md +0 -0
  1763. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/unit/repo/fixtures/sample-manifest.xml +0 -0
  1764. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/unit/repo/fixtures/sample-project-config.json +0 -0
  1765. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/unit/repo/fixtures/test.gitconfig +0 -0
  1766. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/unit/repo/fixtures/version_constraints_data.json +0 -0
  1767. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/unit/repo/functional/__init__.py +0 -0
  1768. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/unit/repo/subcmds/__init__.py +0 -0
  1769. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/unit/repo/test_conftest_fixtures.py +0 -0
  1770. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/unit/repo/test_fixture_files.py +0 -0
  1771. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/unit/repo/test_imports.py +0 -0
  1772. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/unit/repo/test_package_structure.py +0 -0
  1773. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/unit/repo/test_project_final_boost.py +0 -0
  1774. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/unit/repo/test_ruff_config.py +0 -0
  1775. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/unit/repo/test_status_gaps.py +0 -0
  1776. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/unit/repo/test_yamllint_config.py +0 -0
  1777. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/unit/test_catalog_audit_check_parser.py +0 -0
  1778. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/unit/test_coverage_gaps.py +0 -0
  1779. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/unit/test_discover.py +0 -0
  1780. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/unit/test_docs_embedded_architecture.py +0 -0
  1781. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/unit/test_docs_remaining_and_catalog.py +0 -0
  1782. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/unit/test_env_isolation.py +0 -0
  1783. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/unit/test_install_placeholder_validation.py +0 -0
  1784. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/unit/test_marketplace_install.py +0 -0
  1785. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/unit/test_pyproject_build_config.py +0 -0
  1786. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/unit/test_repo.py +0 -0
  1787. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/unit/test_repo_abspath.py +0 -0
  1788. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/unit/test_repo_command.py +0 -0
  1789. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/unit/test_version_constraint_errors.py +0 -0
  1790. {kanon_cli-2.1.0 → kanon_cli-3.0.0}/tests/unit/test_xml_validator.py +0 -0
@@ -0,0 +1,464 @@
1
+ #!/usr/bin/env bash
2
+
3
+ set -euo pipefail
4
+
5
+ WORK_DIR=$(pwd)
6
+ CONTAINER_USER=$1
7
+ BASH_RC="/home/${CONTAINER_USER}/.bashrc"
8
+ ZSH_RC="/home/${CONTAINER_USER}/.zshrc"
9
+ WARNINGS=()
10
+
11
+ # Source shared functions
12
+ source "${WORK_DIR}/.devcontainer/devcontainer-functions.sh"
13
+
14
+ # Configure and log CICD environment
15
+ CICD_VALUE="${CICD:-false}"
16
+ if [ "$CICD_VALUE" = "true" ]; then
17
+ log_info "CICD environment variable: $CICD_VALUE"
18
+ log_info "Devcontainer configured to run in CICD mode (not a local dev environment)"
19
+ else
20
+ log_info "CICD environment variable: ${CICD:-not set}"
21
+ log_info "Devcontainer configured to run as a local developer environment"
22
+ fi
23
+
24
+ log_info "Starting post-create setup..."
25
+
26
+ ############################
27
+ # Create Python Symlink #
28
+ ############################
29
+ if ! command -v python &> /dev/null; then
30
+ log_info "Creating python symlink to python3"
31
+ sudo ln -sf /usr/bin/python3 /usr/bin/python
32
+ fi
33
+
34
+ # Add Python tools to PATH for script execution
35
+ export PATH="/usr/local/py-utils/bin:/usr/local/python/current/bin:$HOME/.local/bin:$PATH"
36
+
37
+ #########################
38
+ # Require Critical Envs #
39
+ #########################
40
+ if [ -z "${DEFAULT_GIT_BRANCH:-}" ]; then
41
+ exit_with_error "❌ DEFAULT_GIT_BRANCH is not set in the environment"
42
+ fi
43
+
44
+ if [ "$CICD_VALUE" != "true" ]; then
45
+ AWS_CONFIG_ENABLED="${AWS_CONFIG_ENABLED:-true}"
46
+ AWS_PROFILE_MAP_FILE="${WORK_DIR}/.devcontainer/aws-profile-map.json"
47
+
48
+ if [ "${AWS_CONFIG_ENABLED,,}" = "true" ]; then
49
+ if [ ! -f "$AWS_PROFILE_MAP_FILE" ]; then
50
+ exit_with_error "❌ Missing AWS profile config: $AWS_PROFILE_MAP_FILE (required when AWS_CONFIG_ENABLED=true)"
51
+ fi
52
+
53
+ AWS_PROFILE_MAP_JSON=$(<"$AWS_PROFILE_MAP_FILE")
54
+
55
+ if ! jq empty <<< "$AWS_PROFILE_MAP_JSON" >/dev/null 2>&1; then
56
+ log_error "$AWS_PROFILE_MAP_JSON"
57
+ exit_with_error "❌ AWS_PROFILE_MAP_JSON is not valid JSON"
58
+ fi
59
+ else
60
+ log_info "AWS configuration disabled (AWS_CONFIG_ENABLED=${AWS_CONFIG_ENABLED})"
61
+ fi
62
+ else
63
+ log_info "CICD mode enabled - skipping AWS configuration validation"
64
+ fi
65
+
66
+ #################
67
+ # Configure ENV #
68
+ #################
69
+ log_info "Configuring ENV vars..."
70
+
71
+ # Configure shell.env sourcing for all shells (interactive and non-interactive)
72
+ log_info "Configuring shell.env sourcing for all shells"
73
+
74
+ # Verify shell.env exists before configuring shells
75
+ if [ ! -f "${WORK_DIR}/shell.env" ]; then
76
+ exit_with_error "❌ shell.env not found at ${WORK_DIR}/shell.env"
77
+ fi
78
+
79
+ # For bash: source in .bashrc (interactive) and via BASH_ENV (non-interactive)
80
+ echo "# Source project shell.env" >> "${BASH_RC}"
81
+ echo "source \"${WORK_DIR}/shell.env\"" >> "${BASH_RC}"
82
+ echo "export BASH_ENV=\"${WORK_DIR}/shell.env\"" >> "${BASH_RC}"
83
+ echo "export PATH=\"\$HOME/.local/bin:\$PATH\"" >> "${BASH_RC}"
84
+ echo "alias python=python3" >> "${BASH_RC}"
85
+ echo "alias pip=pip3" >> "${BASH_RC}"
86
+
87
+ # For zsh: source in .zshenv (covers all zsh shells - interactive and non-interactive)
88
+ echo "source \"${WORK_DIR}/shell.env\"" > /home/${CONTAINER_USER}/.zshenv
89
+ echo "export PATH=\"\$HOME/.local/bin:\$PATH\"" >> /home/${CONTAINER_USER}/.zshenv
90
+ echo "alias python=python3" >> /home/${CONTAINER_USER}/.zshenv
91
+ echo "alias pip=pip3" >> /home/${CONTAINER_USER}/.zshenv
92
+
93
+ ##############################
94
+ # Install asdf & Tool Versions
95
+ ##############################
96
+ log_info "Installing asdf..."
97
+ mkdir -p /home/${CONTAINER_USER}/.asdf
98
+ if ! git clone https://github.com/asdf-vm/asdf.git /home/${CONTAINER_USER}/.asdf --branch v0.15.0; then
99
+ exit_with_error "Failed to clone asdf repository -- check network connectivity and proxy settings"
100
+ fi
101
+
102
+ # Source asdf for the current script
103
+ export ASDF_DIR="/home/${CONTAINER_USER}/.asdf"
104
+ export ASDF_DATA_DIR="/home/${CONTAINER_USER}/.asdf"
105
+ . "/home/${CONTAINER_USER}/.asdf/asdf.sh"
106
+
107
+ # Make asdf available system-wide for AI agents
108
+ log_info "Configuring system-wide asdf access for AI agents..."
109
+
110
+ # Create plugins directory if it doesn't exist
111
+ mkdir -p /home/${CONTAINER_USER}/.asdf/plugins
112
+
113
+ # Create wrapper scripts for asdf tools in /usr/local/bin for direct access
114
+ log_info "Creating asdf wrapper scripts for direct access..."
115
+
116
+ # Create asdf wrapper script
117
+ if uname -r | grep -i microsoft > /dev/null; then
118
+ # WSL compatibility: Use sudo for /usr/local/bin access
119
+ sudo tee /usr/local/bin/asdf > /dev/null << ASDF_WRAPPER
120
+ #!/bin/bash
121
+ # Wrapper script for asdf that ensures proper environment
122
+ export ASDF_DIR="/home/${CONTAINER_USER}/.asdf"
123
+ export ASDF_DATA_DIR="/home/${CONTAINER_USER}/.asdf"
124
+ if [ -f "/home/${CONTAINER_USER}/.asdf/asdf.sh" ]; then
125
+ . "/home/${CONTAINER_USER}/.asdf/asdf.sh"
126
+ fi
127
+ exec /home/${CONTAINER_USER}/.asdf/bin/asdf "\$@"
128
+ ASDF_WRAPPER
129
+ sudo chmod +x /usr/local/bin/asdf
130
+ else
131
+ # Non-WSL: Direct write to /usr/local/bin
132
+ cat > /usr/local/bin/asdf << ASDF_WRAPPER
133
+ #!/bin/bash
134
+ # Wrapper script for asdf that ensures proper environment
135
+ export ASDF_DIR="/home/${CONTAINER_USER}/.asdf"
136
+ export ASDF_DATA_DIR="/home/${CONTAINER_USER}/.asdf"
137
+ if [ -f "/home/${CONTAINER_USER}/.asdf/asdf.sh" ]; then
138
+ . "/home/${CONTAINER_USER}/.asdf/asdf.sh"
139
+ fi
140
+ exec /home/${CONTAINER_USER}/.asdf/bin/asdf "\$@"
141
+ ASDF_WRAPPER
142
+ chmod +x /usr/local/bin/asdf
143
+ fi
144
+
145
+ # Create pip wrapper script that sources asdf environment
146
+ if uname -r | grep -i microsoft > /dev/null; then
147
+ # WSL compatibility: Use sudo for /usr/local/bin access
148
+ sudo tee /usr/local/bin/pip-asdf > /dev/null << PIP_WRAPPER
149
+ #!/bin/bash
150
+ # Wrapper script for pip that ensures asdf environment is loaded
151
+ export ASDF_DIR="/home/${CONTAINER_USER}/.asdf"
152
+ export ASDF_DATA_DIR="/home/${CONTAINER_USER}/.asdf"
153
+ if [ -f "/home/${CONTAINER_USER}/.asdf/asdf.sh" ]; then
154
+ . "/home/${CONTAINER_USER}/.asdf/asdf.sh"
155
+ fi
156
+ exec /home/${CONTAINER_USER}/.asdf/shims/pip "\$@"
157
+ PIP_WRAPPER
158
+ sudo chmod +x /usr/local/bin/pip-asdf
159
+ else
160
+ # Non-WSL: Direct write to /usr/local/bin
161
+ cat > /usr/local/bin/pip-asdf << PIP_WRAPPER
162
+ #!/bin/bash
163
+ # Wrapper script for pip that ensures asdf environment is loaded
164
+ export ASDF_DIR="/home/${CONTAINER_USER}/.asdf"
165
+ export ASDF_DATA_DIR="/home/${CONTAINER_USER}/.asdf"
166
+ if [ -f "/home/${CONTAINER_USER}/.asdf/asdf.sh" ]; then
167
+ . "/home/${CONTAINER_USER}/.asdf/asdf.sh"
168
+ fi
169
+ exec /home/${CONTAINER_USER}/.asdf/shims/pip "\$@"
170
+ PIP_WRAPPER
171
+ chmod +x /usr/local/bin/pip-asdf
172
+ fi
173
+
174
+ #################
175
+ # Oh My Zsh #
176
+ #################
177
+ if [ ! -d "/home/${CONTAINER_USER}/.oh-my-zsh" ]; then
178
+ log_info "Installing Oh My Zsh..."
179
+ OMZ_INSTALL_SCRIPT="/tmp/ohmyzsh-install-${RANDOM}.sh"
180
+ if ! curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh -o "${OMZ_INSTALL_SCRIPT}"; then
181
+ exit_with_error "Failed to download Oh My Zsh install script -- check network connectivity and proxy settings"
182
+ fi
183
+ if [ ! -s "${OMZ_INSTALL_SCRIPT}" ]; then
184
+ exit_with_error "Oh My Zsh install script is empty or missing at ${OMZ_INSTALL_SCRIPT}"
185
+ fi
186
+ if ! sh "${OMZ_INSTALL_SCRIPT}" --unattended; then
187
+ rm -f "${OMZ_INSTALL_SCRIPT}"
188
+ exit_with_error "Oh My Zsh installation failed"
189
+ fi
190
+ rm -f "${OMZ_INSTALL_SCRIPT}"
191
+ else
192
+ log_info "Oh My Zsh already installed -- skipping"
193
+ fi
194
+
195
+ cat <<'EOF' >> ${ZSH_RC}
196
+ export ZSH="$HOME/.oh-my-zsh"
197
+ ZSH_THEME="obraun"
198
+ ENABLE_CORRECTION="false"
199
+ HIST_STAMPS="%m/%d/%Y - %H:%M:%S"
200
+ source $ZSH/oh-my-zsh.sh
201
+ EOF
202
+
203
+ #################
204
+ # Configure AWS #
205
+ #################
206
+ if [ "$CICD_VALUE" != "true" ]; then
207
+ if [ "${AWS_CONFIG_ENABLED,,}" = "true" ]; then
208
+ log_info "Configuring AWS profiles..."
209
+ mkdir -p /home/${CONTAINER_USER}/.aws
210
+ mkdir -p /home/${CONTAINER_USER}/.aws/amazonq/cache
211
+ chown -R ${CONTAINER_USER}:${CONTAINER_USER} /home/${CONTAINER_USER}/.aws/amazonq
212
+
213
+ AWS_OUTPUT_FORMAT="${AWS_DEFAULT_OUTPUT:-json}"
214
+ jq -r 'to_entries[] |
215
+ "[profile \(.key)]\n" +
216
+ "sso_start_url = \(.value.sso_start_url)\n" +
217
+ "sso_region = \(.value.sso_region)\n" +
218
+ "sso_account_name = \(.value.account_name)\n" +
219
+ "sso_account_id = \(.value.account_id)\n" +
220
+ "sso_role_name = \(.value.role_name)\n" +
221
+ "region = \(.value.region)\n" +
222
+ "output = '"$AWS_OUTPUT_FORMAT"'\n" +
223
+ "sso_auto_populated = true\n"' <<< "$AWS_PROFILE_MAP_JSON" \
224
+ > /home/${CONTAINER_USER}/.aws/config
225
+ else
226
+ log_info "Skipping AWS profile configuration (AWS_CONFIG_ENABLED=${AWS_CONFIG_ENABLED})"
227
+ fi
228
+ else
229
+ log_info "CICD mode enabled - skipping AWS profile configuration"
230
+ fi
231
+
232
+ #####################
233
+ # Install Base Tools
234
+ #####################
235
+ log_info "Installing core packages..."
236
+ log_info "Proxy environment: HTTP_PROXY=${HTTP_PROXY:-unset} http_proxy=${http_proxy:-unset}"
237
+ if ! sudo apt-get update -qq; then
238
+ exit_with_error "apt-get update failed. Check proxy settings and network connectivity. HTTP_PROXY=${HTTP_PROXY:-unset}"
239
+ fi
240
+ if ! sudo apt-get install -y -qq curl vim-tiny git gh nmap sipcalc wget unzip zip netcat-openbsd bc; then
241
+ exit_with_error "apt-get install failed for core packages"
242
+ fi
243
+
244
+ ##############################
245
+ # Install Optional Extra Tools
246
+ ##############################
247
+ if [ -n "${EXTRA_APT_PACKAGES:-}" ]; then
248
+ log_info "Installing extra packages: ${EXTRA_APT_PACKAGES}"
249
+ if ! sudo apt-get install -y ${EXTRA_APT_PACKAGES}; then
250
+ exit_with_error "apt-get install failed for extra packages: ${EXTRA_APT_PACKAGES}"
251
+ fi
252
+ fi
253
+
254
+ if [ -f "${WORK_DIR}/.tool-versions" ] && grep -qE '^[a-zA-Z]' "${WORK_DIR}/.tool-versions"; then
255
+ log_info "Installing asdf plugins from .tool-versions..."
256
+ grep -E '^[a-zA-Z]' "${WORK_DIR}/.tool-versions" | cut -d' ' -f1 | while read -r plugin; do
257
+ install_asdf_plugin "$plugin"
258
+ done
259
+
260
+ log_info "Installing tools from .tool-versions..."
261
+ if ! asdf install; then
262
+ log_warn "❌ asdf install failed -- tool versions may not be fully installed"
263
+ fi
264
+
265
+ log_info "Running asdf reshim..."
266
+ if ! asdf reshim; then
267
+ exit_with_error "❌ asdf reshim failed"
268
+ fi
269
+ else
270
+ log_info "No .tool-versions file found (or file is empty) -- skipping asdf install"
271
+ fi
272
+
273
+ # Create symlinks in /usr/local/bin for direct access by AI agents
274
+ log_info "Creating symlinks for AI agent direct access..."
275
+ if [ -d "/home/${CONTAINER_USER}/.asdf/shims" ]; then
276
+ for shim in /home/${CONTAINER_USER}/.asdf/shims/*; do
277
+ if [ -f "$shim" ] && [ -x "$shim" ]; then
278
+ shim_name=$(basename "$shim")
279
+ if [ ! -e "/usr/local/bin/$shim_name" ]; then
280
+ if uname -r | grep -i microsoft > /dev/null; then
281
+ # WSL compatibility: Use sudo for /usr/local/bin access
282
+ sudo ln -s "$shim" "/usr/local/bin/$shim_name"
283
+ else
284
+ # Non-WSL: Direct symlink creation
285
+ ln -s "$shim" "/usr/local/bin/$shim_name"
286
+ fi
287
+ log_info "Created symlink: /usr/local/bin/$shim_name -> $shim"
288
+ fi
289
+ fi
290
+ done
291
+ fi
292
+
293
+ # Install Caylent Devcontainer CLI
294
+ log_info "Installing Caylent Devcontainer CLI..."
295
+ if [ -n "${CLI_VERSION:-}" ]; then
296
+ if [[ "${CLI_VERSION}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
297
+ log_info "Installing specific CLI version: ${CLI_VERSION}"
298
+ CLI_INSTALL_CMD="caylent-devcontainer-cli==${CLI_VERSION}"
299
+ else
300
+ exit_with_error "Invalid CLI_VERSION format: ${CLI_VERSION}. Expected format: X.Y.Z (e.g., 1.2.3)"
301
+ fi
302
+ else
303
+ log_info "Installing latest CLI version"
304
+ CLI_INSTALL_CMD="caylent-devcontainer-cli"
305
+ fi
306
+
307
+ install_with_pipx "${CLI_INSTALL_CMD}"
308
+
309
+ # Verify asdf is working properly (only if tools were configured)
310
+ if [ -f "${WORK_DIR}/.tool-versions" ] && grep -qE '^[a-zA-Z]' "${WORK_DIR}/.tool-versions"; then
311
+ log_info "Verifying asdf installation..."
312
+ if ! asdf current; then
313
+ exit_with_error "❌ asdf current failed - installation may be incomplete"
314
+ fi
315
+ else
316
+ log_info "No asdf tools configured -- skipping verification"
317
+ fi
318
+
319
+ ##############
320
+ # Host Proxy #
321
+ ##############
322
+ # Proxy environment variables are sourced from shell.env (generated by write_shell_env).
323
+ # This section validates that host proxy is accessible when HOST_PROXY=true.
324
+
325
+ if [ "${HOST_PROXY:-false}" = "true" ]; then
326
+ if [ -z "${HOST_PROXY_URL:-}" ]; then
327
+ exit_with_error "❌ HOST_PROXY=true but HOST_PROXY_URL is not set. Set HOST_PROXY_URL in shell.env (e.g., http://host.docker.internal:3128)"
328
+ fi
329
+
330
+ parse_proxy_host_port "${HOST_PROXY_URL}"
331
+
332
+ if is_wsl; then
333
+ validate_host_proxy "${PROXY_PARSED_HOST}" "${PROXY_PARSED_PORT}" "${HOST_PROXY_TIMEOUT:-10}" "wsl-family-os/README.md"
334
+ else
335
+ validate_host_proxy "${PROXY_PARSED_HOST}" "${PROXY_PARSED_PORT}" "${HOST_PROXY_TIMEOUT:-10}" "nix-family-os/README.md"
336
+ fi
337
+ else
338
+ log_info "Host proxy not enabled (HOST_PROXY=${HOST_PROXY:-false}) - skipping validation"
339
+ fi
340
+
341
+ #############
342
+ # AWS Tools #
343
+ #############
344
+ log_info "Installing AWS SSO utilities..."
345
+ install_with_pipx "aws-sso-util"
346
+
347
+ ###################
348
+ # Claude Code CLI #
349
+ ###################
350
+ log_info "Installing Claude Code CLI..."
351
+
352
+ # Download install script first to ensure it succeeds before piping to bash
353
+ CLAUDE_INSTALL_SCRIPT="/tmp/claude-install-${RANDOM}.sh"
354
+
355
+ if ! sudo -u "${CONTAINER_USER}" curl -fsSL https://claude.ai/install.sh -o "${CLAUDE_INSTALL_SCRIPT}"; then
356
+ exit_with_error "❌ Failed to download Claude Code install script from https://claude.ai/install.sh - check network connectivity and proxy settings"
357
+ fi
358
+
359
+ # Verify script was downloaded and is not empty
360
+ if [ ! -s "${CLAUDE_INSTALL_SCRIPT}" ]; then
361
+ exit_with_error "❌ Claude Code install script is empty or missing at ${CLAUDE_INSTALL_SCRIPT}"
362
+ fi
363
+
364
+ # Execute install script
365
+ log_info "Executing Claude Code install script..."
366
+ if uname -r | grep -i microsoft > /dev/null; then
367
+ # WSL compatibility: Run directly without sudo -u
368
+ if ! PATH="/home/${CONTAINER_USER}/.local/bin:$PATH" bash "${CLAUDE_INSTALL_SCRIPT}"; then
369
+ rm -f "${CLAUDE_INSTALL_SCRIPT}"
370
+ exit_with_error "❌ Failed to execute Claude Code install script"
371
+ fi
372
+ else
373
+ # Non-WSL: Install as container user
374
+ if ! sudo -u "${CONTAINER_USER}" PATH="/home/${CONTAINER_USER}/.local/bin:$PATH" bash "${CLAUDE_INSTALL_SCRIPT}"; then
375
+ rm -f "${CLAUDE_INSTALL_SCRIPT}"
376
+ exit_with_error "❌ Failed to execute Claude Code install script"
377
+ fi
378
+ fi
379
+
380
+ # Clean up install script
381
+ rm -f "${CLAUDE_INSTALL_SCRIPT}"
382
+
383
+ log_info "Verifying Claude Code CLI installation..."
384
+ CLAUDE_BIN="/home/${CONTAINER_USER}/.local/bin/claude"
385
+ if [ ! -f "$CLAUDE_BIN" ]; then
386
+ exit_with_error "❌ Claude Code binary not found at expected location: $CLAUDE_BIN"
387
+ fi
388
+
389
+ if [ ! -x "$CLAUDE_BIN" ]; then
390
+ exit_with_error "❌ Claude Code binary exists but is not executable: $CLAUDE_BIN"
391
+ fi
392
+
393
+ CLAUDE_VERSION=$(sudo -u "${CONTAINER_USER}" "${CLAUDE_BIN}" --version 2>&1 || echo "unknown")
394
+ log_success "Claude Code CLI installed successfully: ${CLAUDE_VERSION}"
395
+
396
+ #################
397
+ # Configure Git #
398
+ #################
399
+ if [ "$CICD_VALUE" != "true" ]; then
400
+ log_info "Setting up Git credentials..."
401
+
402
+ if [ -z "${GIT_AUTH_METHOD:-}" ]; then
403
+ exit_with_error "❌ GIT_AUTH_METHOD is required. Please regenerate project files."
404
+ fi
405
+
406
+ # Shared git config (both methods)
407
+ configure_git_shared "${CONTAINER_USER}" "${GIT_USER}" "${GIT_USER_EMAIL}"
408
+
409
+ # Match CI (.github/actions/setup-kanon): integration fixtures git-init fresh
410
+ # repos and reference them as @main, so the default initial branch must be main.
411
+ # See docs/integration-testing.md "Test prerequisites".
412
+ sudo -u "${CONTAINER_USER}" git config --global init.defaultBranch main
413
+
414
+ case "${GIT_AUTH_METHOD}" in
415
+ token)
416
+ configure_git_token "${CONTAINER_USER}" "${GIT_PROVIDER_URL}" "${GIT_USER}" "${GIT_TOKEN}"
417
+ ;;
418
+ ssh)
419
+ configure_git_ssh "${CONTAINER_USER}" "${GIT_PROVIDER_URL}" "${WORK_DIR}"
420
+ ;;
421
+ *)
422
+ exit_with_error "❌ Invalid GIT_AUTH_METHOD: '${GIT_AUTH_METHOD}'. Must be 'token' or 'ssh'."
423
+ ;;
424
+ esac
425
+ else
426
+ log_info "CICD mode enabled - skipping Git configuration"
427
+ fi
428
+
429
+ ###########
430
+ # Cleanup #
431
+ ###########
432
+ log_info "Fixing ownership for ${CONTAINER_USER}"
433
+ chown -R ${CONTAINER_USER}:${CONTAINER_USER} /home/${CONTAINER_USER}
434
+
435
+ ####################
436
+ # Warning Summary #
437
+ ####################
438
+ if [ ${#WARNINGS[@]} -ne 0 ]; then
439
+ echo -e "\n⚠️ Completed with warnings:"
440
+ for warning in "${WARNINGS[@]}"; do
441
+ echo " - $warning"
442
+ done
443
+ else
444
+ log_success "Dev container setup completed with no warnings"
445
+ fi
446
+
447
+ #########################
448
+ # Project-Specific Setup #
449
+ #########################
450
+ log_info "Running project-specific setup script..."
451
+ if [ -f "${WORK_DIR}/.devcontainer/project-setup.sh" ]; then
452
+ if uname -r | grep -i microsoft > /dev/null; then
453
+ # WSL compatibility: Run directly without sudo -u
454
+ bash -c "source '${WORK_DIR}/shell.env' && source /home/${CONTAINER_USER}/.asdf/asdf.sh && cd '${WORK_DIR}' && BASH_ENV='${WORK_DIR}/.devcontainer/devcontainer-functions.sh' bash '${WORK_DIR}/.devcontainer/project-setup.sh'"
455
+ else
456
+ # Non-WSL: Use sudo -u to run as container user
457
+ sudo -u "${CONTAINER_USER}" bash -c "source '${WORK_DIR}/shell.env' && source /home/${CONTAINER_USER}/.asdf/asdf.sh && cd '${WORK_DIR}' && BASH_ENV='${WORK_DIR}/.devcontainer/devcontainer-functions.sh' bash '${WORK_DIR}/.devcontainer/project-setup.sh'"
458
+ fi
459
+ else
460
+ log_warn "No project-specific setup script found at ${WORK_DIR}/.devcontainer/project-setup.sh"
461
+ WARNINGS+=("No project-specific setup script found at ${WORK_DIR}/.devcontainer/project-setup.sh")
462
+ fi
463
+
464
+ exit 0
@@ -0,0 +1,109 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Convert Windows line endings (CRLF) to Unix line endings (LF) for all text files.
4
+ Excludes binary files and processes files in parallel for performance.
5
+ """
6
+
7
+ import os
8
+ import sys
9
+ from concurrent.futures import ThreadPoolExecutor, as_completed
10
+ from pathlib import Path
11
+ from threading import Lock
12
+
13
+ stats_lock = Lock()
14
+ converted_count = 0
15
+ skipped_count = 0
16
+ error_count = 0
17
+
18
+
19
+ def convert_file(file_path):
20
+ """Convert a single file from CRLF to LF if it's a text file."""
21
+ global converted_count, skipped_count, error_count
22
+
23
+ try:
24
+ with open(file_path, "rb") as f:
25
+ content = f.read()
26
+
27
+ if not content:
28
+ with stats_lock:
29
+ skipped_count += 1
30
+ return False
31
+
32
+ if b"\x00" in content:
33
+ with stats_lock:
34
+ skipped_count += 1
35
+ return False
36
+
37
+ if b"\r\n" not in content:
38
+ with stats_lock:
39
+ skipped_count += 1
40
+ return False
41
+
42
+ converted_content = content.replace(b"\r\n", b"\n")
43
+
44
+ with open(file_path, "wb") as f:
45
+ f.write(converted_content)
46
+
47
+ with stats_lock:
48
+ converted_count += 1
49
+ return True
50
+
51
+ except (OSError, IOError) as e:
52
+ with stats_lock:
53
+ error_count += 1
54
+ print(f"Error processing {file_path}: {e}", file=sys.stderr)
55
+ return False
56
+
57
+
58
+ def main():
59
+ """Main function to process all files in the workspace."""
60
+ global converted_count, skipped_count, error_count
61
+ workspace_path = Path(os.getcwd())
62
+
63
+ if not workspace_path.exists():
64
+ print(f"Error: Workspace path {workspace_path} does not exist", file=sys.stderr)
65
+ sys.exit(1)
66
+
67
+ print(f"Converting line endings in: {workspace_path}")
68
+
69
+ files_to_process = []
70
+ for root, dirs, files in os.walk(workspace_path):
71
+ if ".git" in dirs:
72
+ dirs.remove(".git")
73
+
74
+ for file in files:
75
+ file_path = Path(root) / file
76
+ files_to_process.append(file_path)
77
+
78
+ if not files_to_process:
79
+ print("No files found to process")
80
+ return
81
+
82
+ print(f"Processing {len(files_to_process)} files...")
83
+
84
+ max_workers = os.cpu_count() or 1
85
+ with ThreadPoolExecutor(max_workers=max_workers) as executor:
86
+ futures = {
87
+ executor.submit(convert_file, file_path): file_path
88
+ for file_path in files_to_process
89
+ }
90
+
91
+ for future in as_completed(futures):
92
+ try:
93
+ future.result()
94
+ except Exception as e:
95
+ file_path = futures[future]
96
+ print(f"Unexpected error processing {file_path}: {e}", file=sys.stderr)
97
+ with stats_lock:
98
+ error_count += 1
99
+
100
+ print(f"Line ending conversion complete:")
101
+ print(f" Converted: {converted_count} files")
102
+ print(f" Skipped: {skipped_count} files")
103
+ if error_count > 0:
104
+ print(f" Errors: {error_count} files")
105
+ sys.exit(1)
106
+
107
+
108
+ if __name__ == "__main__":
109
+ main()