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